From 1be04037cdba95396eef7728134043ba3ee6fbf4 Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 19:20:53 +0200 Subject: [PATCH] remove it --- Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp | 225 - Src/Plugins/DSP/sc_serv3/ADTSHeader.h | 62 - Src/Plugins/DSP/sc_serv3/FLV.cpp | 322 - Src/Plugins/DSP/sc_serv3/FLV.h | 23 - Src/Plugins/DSP/sc_serv3/GNUmakefile | 237 - Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS | 1 - Src/Plugins/DSP/sc_serv3/GeoIP/COPYING | 509 - Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog | 628 - Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in | 80 - .../DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch | 183 - Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL | 365 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am | 11 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in | 707 - .../DSP/sc_serv3/GeoIP/Makefile.netware | 301 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc | 84 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 | 232 - Src/Plugins/DSP/sc_serv3/GeoIP/NEWS | 0 Src/Plugins/DSP/sc_serv3/GeoIP/README | 208 - Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW | 13 - Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX | 35 - .../DSP/sc_serv3/GeoIP/READMEwin32.txt | 44 - .../DSP/sc_serv3/GeoIP/READMEwin32static.txt | 17 - Src/Plugins/DSP/sc_serv3/GeoIP/TODO | 54 - Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 | 8917 -------- .../DSP/sc_serv3/GeoIP/apps/Makefile.am | 26 - .../DSP/sc_serv3/GeoIP/apps/Makefile.in | 544 - .../DSP/sc_serv3/GeoIP/apps/Makefile.vc | 25 - .../DSP/sc_serv3/GeoIP/apps/geoiplookup.c | 401 - .../DSP/sc_serv3/GeoIP/apps/geoiplookup6.c | 255 - .../GeoIP/apps/geoipupdate-pureperl.pl | 260 - .../DSP/sc_serv3/GeoIP/apps/geoipupdate.c | 283 - Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap | 8 - .../sc_serv3/GeoIP/conf/GeoIP.conf.default | 19 - .../DSP/sc_serv3/GeoIP/conf/Makefile.am | 16 - .../DSP/sc_serv3/GeoIP/conf/Makefile.in | 414 - Src/Plugins/DSP/sc_serv3/GeoIP/config.guess | 1533 -- Src/Plugins/DSP/sc_serv3/GeoIP/config.sub | 1693 -- Src/Plugins/DSP/sc_serv3/GeoIP/configure | 13633 ----------- Src/Plugins/DSP/sc_serv3/GeoIP/configure.in | 50 - Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat | Bin 1348660 -> 0 bytes .../DSP/sc_serv3/GeoIP/data/Makefile.am | 19 - .../DSP/sc_serv3/GeoIP/data/Makefile.in | 437 - Src/Plugins/DSP/sc_serv3/GeoIP/depcomp | 630 - Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico | Bin 3062 -> 0 bytes Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk | 14 - Src/Plugins/DSP/sc_serv3/GeoIP/install-sh | 520 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c | 1965 -- .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h | 315 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c | 393 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h | 78 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c | 975 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h | 69 - .../sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h | 18 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am | 27 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in | 567 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc | 34 - .../DSP/sc_serv3/GeoIP/libGeoIP/global.h | 32 - Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c | 326 - Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h | 40 - .../DSP/sc_serv3/GeoIP/libGeoIP/regionName.c | 12780 ----------- .../DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c | 2077 -- .../DSP/sc_serv3/GeoIP/libGeoIP/types.h | 140 - Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh | 8413 ------- .../DSP/sc_serv3/GeoIP/man/Makefile.am | 29 - .../DSP/sc_serv3/GeoIP/man/Makefile.in | 455 - .../DSP/sc_serv3/GeoIP/man/geoiplookup.1.in | 37 - .../DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in | 42 - .../DSP/sc_serv3/GeoIP/man/geoipupdate.1.in | 68 - Src/Plugins/DSP/sc_serv3/GeoIP/missing | 376 - .../DSP/sc_serv3/GeoIP/test/Makefile.am | 37 - .../DSP/sc_serv3/GeoIP/test/Makefile.in | 657 - .../DSP/sc_serv3/GeoIP/test/Makefile.vc | 29 - .../DSP/sc_serv3/GeoIP/test/benchmark.c | 135 - .../DSP/sc_serv3/GeoIP/test/city_test.txt | 2 - .../DSP/sc_serv3/GeoIP/test/country_test.txt | 69 - .../DSP/sc_serv3/GeoIP/test/country_test2.txt | 29 - .../sc_serv3/GeoIP/test/country_test_name.txt | 1 - .../DSP/sc_serv3/GeoIP/test/region_test.txt | 24 - .../sc_serv3/GeoIP/test/test-geoip-asnum.c | 63 - .../DSP/sc_serv3/GeoIP/test/test-geoip-city.c | 83 - .../DSP/sc_serv3/GeoIP/test/test-geoip-isp.c | 65 - .../sc_serv3/GeoIP/test/test-geoip-netspeed.c | 59 - .../DSP/sc_serv3/GeoIP/test/test-geoip-org.c | 71 - .../sc_serv3/GeoIP/test/test-geoip-region.c | 114 - .../DSP/sc_serv3/GeoIP/test/test-geoip.c | 113 - Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp | 827 - Src/Plugins/DSP/sc_serv3/ID3miniParsers.h | 184 - Src/Plugins/DSP/sc_serv3/MP3Header.cpp | 216 - Src/Plugins/DSP/sc_serv3/MP3Header.h | 34 - Src/Plugins/DSP/sc_serv3/MSG00001.bin | Bin 32 -> 0 bytes Src/Plugins/DSP/sc_serv3/adminList.cpp | 303 - Src/Plugins/DSP/sc_serv3/adminList.h | 41 - Src/Plugins/DSP/sc_serv3/agentList.cpp | 294 - Src/Plugins/DSP/sc_serv3/agentList.h | 44 - Src/Plugins/DSP/sc_serv3/amf.cpp | 759 - Src/Plugins/DSP/sc_serv3/amf.h | 156 - Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile | 2 - .../DSP/sc_serv3/aolxml/_expat/CMake.README | 42 - .../DSP/sc_serv3/aolxml/_expat/CMakeLists.txt | 111 - .../DSP/sc_serv3/aolxml/_expat/COPYING | 22 - .../DSP/sc_serv3/aolxml/_expat/Changes | 205 - .../aolxml/_expat/ConfigureChecks.cmake | 44 - .../DSP/sc_serv3/aolxml/_expat/MANIFEST | 141 - .../DSP/sc_serv3/aolxml/_expat/Makefile.in | 201 - Src/Plugins/DSP/sc_serv3/aolxml/_expat/README | 139 - .../DSP/sc_serv3/aolxml/_expat/aclocal.m4 | 8460 ------- .../DSP/sc_serv3/aolxml/_expat/configure | 18632 ---------------- .../DSP/sc_serv3/aolxml/_expat/configure.in | 155 - .../aolxml/_expat/conftools/PrintPath | 116 - .../_expat/conftools/ac_c_bigendian_cross.m4 | 81 - .../aolxml/_expat/conftools/config.guess | 1517 -- .../aolxml/_expat/conftools/config.sub | 1760 -- .../sc_serv3/aolxml/_expat/conftools/expat.m4 | 43 - .../aolxml/_expat/conftools/get-version.sh | 46 - .../aolxml/_expat/conftools/install-sh | 520 - .../aolxml/_expat/conftools/ltmain.sh | 9642 -------- .../aolxml/_expat/conftools/mkinstalldirs | 40 - .../DSP/sc_serv3/aolxml/_expat/doc/expat.png | Bin 1027 -> 0 bytes .../sc_serv3/aolxml/_expat/doc/reference.html | 2390 -- .../DSP/sc_serv3/aolxml/_expat/doc/style.css | 101 - .../aolxml/_expat/doc/valid-xhtml10.png | Bin 2368 -> 0 bytes .../DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 | 251 - .../DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml | 468 - .../DSP/sc_serv3/aolxml/_expat/expat.dsw | 110 - .../DSP/sc_serv3/aolxml/_expat/expat.pc.in | 11 - .../aolxml/_expat/expat_config.h.cmake | 91 - .../sc_serv3/aolxml/_expat/expat_config.h.in | 102 - .../sc_serv3/aolxml/_expat/lib/Makefile.MPW | 206 - .../sc_serv3/aolxml/_expat/lib/amigaconfig.h | 32 - .../DSP/sc_serv3/aolxml/_expat/lib/ascii.h | 92 - .../DSP/sc_serv3/aolxml/_expat/lib/asciitab.h | 36 - .../DSP/sc_serv3/aolxml/_expat/lib/expat.dsp | 185 - .../DSP/sc_serv3/aolxml/_expat/lib/expat.h | 1047 - .../aolxml/_expat/lib/expat_external.h | 115 - .../aolxml/_expat/lib/expat_static.dsp | 162 - .../aolxml/_expat/lib/expat_static.sln | 26 - .../aolxml/_expat/lib/expat_static.vcproj | 549 - .../DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp | 185 - .../aolxml/_expat/lib/expatw_static.dsp | 162 - .../sc_serv3/aolxml/_expat/lib/iasciitab.h | 37 - .../DSP/sc_serv3/aolxml/_expat/lib/internal.h | 73 - .../sc_serv3/aolxml/_expat/lib/latin1tab.h | 36 - .../sc_serv3/aolxml/_expat/lib/libexpat.def | 73 - .../sc_serv3/aolxml/_expat/lib/libexpatw.def | 73 - .../sc_serv3/aolxml/_expat/lib/macconfig.h | 53 - .../DSP/sc_serv3/aolxml/_expat/lib/nametab.h | 150 - .../DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h | 37 - .../sc_serv3/aolxml/_expat/lib/winconfig.h | 30 - .../DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c | 6403 ------ .../DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c | 1336 -- .../DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h | 114 - .../DSP/sc_serv3/aolxml/_expat/lib/xmltok.c | 1651 -- .../DSP/sc_serv3/aolxml/_expat/lib/xmltok.h | 316 - .../sc_serv3/aolxml/_expat/lib/xmltok_impl.c | 1783 -- .../sc_serv3/aolxml/_expat/lib/xmltok_impl.h | 46 - .../sc_serv3/aolxml/_expat/lib/xmltok_ns.c | 115 - .../sc_serv3/aolxml/_expat/xmlwf/codepage.c | 68 - .../sc_serv3/aolxml/_expat/xmlwf/codepage.h | 6 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c | 147 - .../sc_serv3/aolxml/_expat/xmlwf/filemap.h | 17 - .../aolxml/_expat/xmlwf/readfilemap.c | 100 - .../aolxml/_expat/xmlwf/unixfilemap.c | 65 - .../aolxml/_expat/xmlwf/win32filemap.c | 96 - .../sc_serv3/aolxml/_expat/xmlwf/xmlfile.c | 244 - .../sc_serv3/aolxml/_expat/xmlwf/xmlfile.h | 20 - .../sc_serv3/aolxml/_expat/xmlwf/xmlmime.c | 163 - .../sc_serv3/aolxml/_expat/xmlwf/xmlmime.h | 19 - .../sc_serv3/aolxml/_expat/xmlwf/xmltchar.h | 36 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h | 13 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c | 861 - .../sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp | 139 - .../aolxml/_expat/xmlwf/xmlwin32url.cxx | 395 - Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp | 428 - Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h | 372 - .../DSP/sc_serv3/aolxml/aolxmlutils.cpp | 61 - .../DSP/sc_serv3/aolxml/unix_build_expat | 5 - Src/Plugins/DSP/sc_serv3/auth.cpp | 434 - Src/Plugins/DSP/sc_serv3/auth.h | 69 - Src/Plugins/DSP/sc_serv3/banList.cpp | 431 - Src/Plugins/DSP/sc_serv3/banList.h | 51 - Src/Plugins/DSP/sc_serv3/bandwidth.cpp | 117 - Src/Plugins/DSP/sc_serv3/bandwidth.h | 54 - Src/Plugins/DSP/sc_serv3/base64.cpp | 70 - Src/Plugins/DSP/sc_serv3/base64.h | 54 - Src/Plugins/DSP/sc_serv3/cache.cpp | 104 - Src/Plugins/DSP/sc_serv3/cache.h | 52 - Src/Plugins/DSP/sc_serv3/config.cpp | 2867 --- Src/Plugins/DSP/sc_serv3/config.h | 710 - Src/Plugins/DSP/sc_serv3/cpucount.cpp | 70 - Src/Plugins/DSP/sc_serv3/cpucount.h | 8 - .../DSP/sc_serv3/deps/win32/include/sched.h | 286 - Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp | 681 - Src/Plugins/DSP/sc_serv3/filenameMetadata.h | 25 - Src/Plugins/DSP/sc_serv3/global.cpp | 1177 - Src/Plugins/DSP/sc_serv3/global.h | 218 - Src/Plugins/DSP/sc_serv3/icy.ico | Bin 40585 -> 0 bytes Src/Plugins/DSP/sc_serv3/libcurl_building.txt | 43 - .../sc_serv3/libs/Aol_XML/ARMv6/libexpat.a | Bin 476516 -> 0 bytes .../sc_serv3/libs/Aol_XML/ARMv7/libexpat.a | Bin 512028 -> 0 bytes .../DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a | Bin 396228 -> 0 bytes .../sc_serv3/libs/Aol_XML/Darwin/libexpat.a | Bin 513008 -> 0 bytes .../libs/Aol_XML/Linux_i686/libexpat.a | Bin 512592 -> 0 bytes .../libs/Aol_XML/Linux_x86_64/libexpat.a | Bin 861176 -> 0 bytes Src/Plugins/DSP/sc_serv3/main.cpp | 1213 - Src/Plugins/DSP/sc_serv3/manifest.xml | 19 - Src/Plugins/DSP/sc_serv3/manifest64.xml | 19 - Src/Plugins/DSP/sc_serv3/messagefile.h | 45 - Src/Plugins/DSP/sc_serv3/messagefile.mc | 6 - Src/Plugins/DSP/sc_serv3/metadata.cpp | 459 - Src/Plugins/DSP/sc_serv3/metadata.h | 151 - Src/Plugins/DSP/sc_serv3/metrics.cpp | 1249 -- Src/Plugins/DSP/sc_serv3/metrics.h | 101 - .../DSP/sc_serv3/nmrCommon/file/fileUtils.cpp | 232 - .../DSP/sc_serv3/nmrCommon/file/fileUtils.h | 117 - Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h | 117 - Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h | 61 - .../DSP/sc_serv3/nmrCommon/memory/refPtr.h | 181 - .../nmrCommon/services/baseOptions.cpp | 76 - .../sc_serv3/nmrCommon/services/baseOptions.h | 32 - .../sc_serv3/nmrCommon/services/logger.cpp | 966 - .../DSP/sc_serv3/nmrCommon/services/logger.h | 461 - .../nmrCommon/services/messagefile.mc | 7 - .../nmrCommon/services/serviceMain.cpp | 876 - .../sc_serv3/nmrCommon/services/serviceMain.h | 72 - .../nmrCommon/services/stdServiceImpl.cpp | 164 - .../nmrCommon/services/stdServiceImpl.h | 322 - .../nmrCommon/services/test/GNUmakefile | 78 - .../sc_serv3/nmrCommon/services/test/main.cpp | 169 - .../nmrCommon/services/test/messagefile.mc | 7 - .../nmrCommon/services/test/resource.h | 14 - .../sc_serv3/nmrCommon/services/test/test.rc | 101 - .../sc_serv3/nmrCommon/services/test/test.sln | 21 - .../nmrCommon/services/test/test.vcproj | 202 - .../nmrCommon/stacktrace/StackTrace.cpp | 868 - .../nmrCommon/stacktrace/StackTrace.h | 135 - .../DSP/sc_serv3/nmrCommon/stl/functors.h | 24 - Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h | 324 - .../DSP/sc_serv3/nmrCommon/stl/stringUtils.h | 383 - .../DSP/sc_serv3/nmrCommon/threading/MT_stl.h | 110 - .../nmrCommon/threading/messageThread.h | 184 - .../sc_serv3/nmrCommon/threading/thread.cpp | 375 - .../DSP/sc_serv3/nmrCommon/threading/thread.h | 575 - .../sc_serv3/nmrCommon/unicode/uniFile.cpp | 88 - .../DSP/sc_serv3/nmrCommon/unicode/uniFile.h | 29 - .../sc_serv3/nmrCommon/unicode/uniString.cpp | 786 - .../sc_serv3/nmrCommon/unicode/uniString.h | 354 - .../DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp | 37 - .../DSP/sc_serv3/nmrCommon/win32/rezFuncs.h | 9 - .../sc_serv3/protocol_FlashPolicyServer.cpp | 44 - .../DSP/sc_serv3/protocol_FlashPolicyServer.h | 33 - .../DSP/sc_serv3/protocol_HTTPClient.cpp | 305 - .../DSP/sc_serv3/protocol_HTTPClient.h | 38 - .../DSP/sc_serv3/protocol_HTTPSource.cpp | 462 - .../DSP/sc_serv3/protocol_HTTPSource.h | 55 - .../DSP/sc_serv3/protocol_HTTPStyle.cpp | 4808 ---- Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h | 152 - .../DSP/sc_serv3/protocol_RTMPClient.cpp | 1681 -- .../DSP/sc_serv3/protocol_RTMPClient.h | 170 - .../DSP/sc_serv3/protocol_admincgi.cpp | 6390 ------ Src/Plugins/DSP/sc_serv3/protocol_admincgi.h | 115 - Src/Plugins/DSP/sc_serv3/protocol_backup.cpp | 538 - Src/Plugins/DSP/sc_serv3/protocol_backup.h | 73 - .../DSP/sc_serv3/protocol_flvClient.cpp | 275 - Src/Plugins/DSP/sc_serv3/protocol_flvClient.h | 46 - .../DSP/sc_serv3/protocol_m4aClient.cpp | 674 - Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h | 42 - Src/Plugins/DSP/sc_serv3/protocol_relay.cpp | 544 - Src/Plugins/DSP/sc_serv3/protocol_relay.h | 73 - .../DSP/sc_serv3/protocol_relay_shoutcast.cpp | 455 - .../DSP/sc_serv3/protocol_relay_shoutcast.h | 57 - .../DSP/sc_serv3/protocol_relay_uvox.cpp | 693 - .../DSP/sc_serv3/protocol_relay_uvox.h | 108 - .../sc_serv3/protocol_shoutcast1Client.cpp | 417 - .../DSP/sc_serv3/protocol_shoutcast1Client.h | 42 - .../sc_serv3/protocol_shoutcast2Client.cpp | 568 - .../DSP/sc_serv3/protocol_shoutcast2Client.h | 53 - .../DSP/sc_serv3/protocol_shoutcastClient.cpp | 1917 -- .../DSP/sc_serv3/protocol_shoutcastClient.h | 209 - .../DSP/sc_serv3/protocol_shoutcastSource.cpp | 439 - .../DSP/sc_serv3/protocol_shoutcastSource.h | 58 - .../DSP/sc_serv3/protocol_uvox2Source.cpp | 1010 - .../DSP/sc_serv3/protocol_uvox2Source.h | 129 - Src/Plugins/DSP/sc_serv3/readme.txt | 89 - Src/Plugins/DSP/sc_serv3/resource.h | 16 - Src/Plugins/DSP/sc_serv3/ripList.cpp | 391 - Src/Plugins/DSP/sc_serv3/ripList.h | 46 - Src/Plugins/DSP/sc_serv3/sc_serv.rc | 112 - Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj | 393 - .../DSP/sc_serv3/sc_serv.vcxproj.filters | 478 - Src/Plugins/DSP/sc_serv3/stats.cpp | 862 - Src/Plugins/DSP/sc_serv3/stats.h | 173 - Src/Plugins/DSP/sc_serv3/streamData.cpp | 5666 ----- Src/Plugins/DSP/sc_serv3/streamData.h | 906 - Src/Plugins/DSP/sc_serv3/threadedRunner.cpp | 1135 - Src/Plugins/DSP/sc_serv3/threadedRunner.h | 428 - Src/Plugins/DSP/sc_serv3/updater.cpp | 354 - Src/Plugins/DSP/sc_serv3/updater.h | 58 - Src/Plugins/DSP/sc_serv3/uvox2Common.cpp | 201 - Src/Plugins/DSP/sc_serv3/uvox2Common.h | 116 - Src/Plugins/DSP/sc_serv3/versions.h | 52 - Src/Plugins/DSP/sc_serv3/w3cLog.cpp | 319 - Src/Plugins/DSP/sc_serv3/w3cLog.h | 20 - Src/Plugins/DSP/sc_serv3/webClient.cpp | 619 - Src/Plugins/DSP/sc_serv3/webClient.h | 153 - Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp | 716 - Src/Plugins/DSP/sc_serv3/webNet/socketOps.h | 182 - Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp | 240 - Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h | 196 - Src/Plugins/DSP/sc_serv3/yp2.cpp | 1233 - Src/Plugins/DSP/sc_serv3/yp2.h | 270 - 310 files changed, 188961 deletions(-) delete mode 100644 Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ADTSHeader.h delete mode 100644 Src/Plugins/DSP/sc_serv3/FLV.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/FLV.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/COPYING delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/NEWS delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/TODO delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/config.guess delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/config.sub delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/configure delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/configure.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/depcomp delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/install-sh delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/missing delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c delete mode 100644 Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ID3miniParsers.h delete mode 100644 Src/Plugins/DSP/sc_serv3/MP3Header.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/MP3Header.h delete mode 100644 Src/Plugins/DSP/sc_serv3/MSG00001.bin delete mode 100644 Src/Plugins/DSP/sc_serv3/adminList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/adminList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/agentList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/agentList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/amf.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/amf.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/README delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/reference.html delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat delete mode 100644 Src/Plugins/DSP/sc_serv3/auth.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/auth.h delete mode 100644 Src/Plugins/DSP/sc_serv3/banList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/banList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/bandwidth.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/bandwidth.h delete mode 100644 Src/Plugins/DSP/sc_serv3/base64.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/base64.h delete mode 100644 Src/Plugins/DSP/sc_serv3/cache.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/cache.h delete mode 100644 Src/Plugins/DSP/sc_serv3/config.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/config.h delete mode 100644 Src/Plugins/DSP/sc_serv3/cpucount.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/cpucount.h delete mode 100644 Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h delete mode 100644 Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/filenameMetadata.h delete mode 100644 Src/Plugins/DSP/sc_serv3/global.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/global.h delete mode 100644 Src/Plugins/DSP/sc_serv3/icy.ico delete mode 100644 Src/Plugins/DSP/sc_serv3/libcurl_building.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_i686/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_x86_64/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/main.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/manifest.xml delete mode 100644 Src/Plugins/DSP/sc_serv3/manifest64.xml delete mode 100644 Src/Plugins/DSP/sc_serv3/messagefile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/metadata.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/metadata.h delete mode 100644 Src/Plugins/DSP/sc_serv3/metrics.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/metrics.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_admincgi.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_backup.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_backup.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_flvClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h delete mode 100644 Src/Plugins/DSP/sc_serv3/readme.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/resource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/ripList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ripList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.rc delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters delete mode 100644 Src/Plugins/DSP/sc_serv3/stats.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/stats.h delete mode 100644 Src/Plugins/DSP/sc_serv3/streamData.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/streamData.h delete mode 100644 Src/Plugins/DSP/sc_serv3/threadedRunner.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/threadedRunner.h delete mode 100644 Src/Plugins/DSP/sc_serv3/updater.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/updater.h delete mode 100644 Src/Plugins/DSP/sc_serv3/uvox2Common.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/uvox2Common.h delete mode 100644 Src/Plugins/DSP/sc_serv3/versions.h delete mode 100644 Src/Plugins/DSP/sc_serv3/w3cLog.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/w3cLog.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/socketOps.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/yp2.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/yp2.h diff --git a/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp b/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp deleted file mode 100644 index 36242e07..00000000 --- a/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "ADTSHeader.h" -#include "nmrCommon/services/stdServiceImpl.h" - - -enum -{ - ADTS_NOT_PROTECTED = 1, - ADTS_PROTECTED = 0, - ADTS_SYNC = 0xFFF, - ADTS_MAIN = 0x00, - ADTS_LC = 0x01, - ADTS_SSR = 0x10, - ADTS_LTP = 0x11 -}; - -const int aac_adts_parse(const aac_adts_header_t header, const __uint8 *buffer) -{ - header->syncword = ((buffer[0] << 4) | (buffer[1] >> 4)); - - if (header->syncword != ADTS_SYNC) - { - return NErr_LostSynchronization; - } - - header->id = ((buffer[1] >> 3) & 1); - header->layer = ((buffer[1] >> 1) & 3); - if (header->layer != 0) - { - return NErr_WrongFormat; - } - - header->protection = ((buffer[1]) & 1); - header->profile = ((buffer[2] >> 6) & 3); - header->sample_rate_index = ((buffer[2] >> 2) & 0xF); - if (header->sample_rate_index == 15) - { - return NErr_UnsupportedFormat; // might actually be OK if we can separately signal the sample rate - } - - if (header->sample_rate_index > 13) - { - return NErr_Reserved; - } - - header->private_bit = ((buffer[2] >> 1) & 1); - header->channel_configuration = ((buffer[2] & 1) << 2) | ((buffer[3] >> 6) & 3); - header->original = ((buffer[3] >> 5) & 1); - header->home = ((buffer[3] >> 4) & 1); - - header->frame_length = ((buffer[3] & 3) << 11) | (buffer[4]<<3) | ((buffer[5] >> 5) & 7); - header->buffer_fullness = ((buffer[5] & 0x1F) << 6) | (buffer[6] >> 2); - header->num_data_blocks = (buffer[6] & 3); - return NErr_Success; -} - -static const unsigned int aac_sratetab[] = -{ - 96000, - 88200, - 64000, - 48000, - 44100, - 32000, - 24000, - 22050, - 16000, - 12000, - 11025, - 8000, - 7350, -}; -#if 0 -const int aac_adts_match(const aac_adts_header_t header1, const aac_adts_header_t header2) -{ - if (header1->id != header2->id) - { - return NErr_False; - } - - if (header1->profile != header2->profile) - { - return NErr_False; - } - - if (header1->sample_rate_index != header2->sample_rate_index) - { - return NErr_False; - } - - if (header1->channel_configuration != header2->channel_configuration) - { - return NErr_False; - } - - return NErr_True; -} -#endif -const int aac_adts_get_channel_count(const aac_adts_header_t header) -{ - switch (header->channel_configuration) - { - case 7: - { - return 8; - } - default: - { - return header->channel_configuration; - } - } -} - -const __uint16 getADTSFrameInfo(const char *hdr, unsigned int *samplerate, __uint8 *asc_header) -{ - ADTSHeader header = {0}; - if (aac_adts_parse(&header, (const __uint8 *)hdr) == NErr_Success) - { - *samplerate = aac_sratetab[header.sample_rate_index]; - - // we need this when generating flv frames - // as it creates the AudioSpecificConfig - // from the existing ADTS header details - // (is like a mini-ADTS header to create) - if (asc_header) - { - asc_header[0] |= (((header.profile + 1) & 31) << 3) + (header.sample_rate_index >> 1); - asc_header[1] |= ((header.sample_rate_index & 0x1) << 7) + (header.channel_configuration << 3); - } - - //*bitrate = (int)(((header.frame_length / 1/*frames*/) * (aac_sratetab[header.sample_rate_index] / 1024.0)) + 0.5) * 8; - return (__uint16)header.frame_length; - } - return 0; -} - -const char *AAC_FrameInfo::getVersionName() const -{ - if (m_version) - return "v2"; - return "v4"; -} - -const char *AAC_FrameInfo::getAOT() const -{ - switch (m_aot) - { - case 2: return "LC"; - case 5: return "SBR"; - case 29: return "PS"; - default: return "unknown profile"; - } -} - - -int getAACFrameLength (const unsigned char *p, unsigned int len) -{ - if (len < 6) - return -1; - return ((p[3] & 0x3) << 11) + (p[4] << 3) + ((p[5] & 0xE0) >> 5); -} - -int getAACFrameInfo (const unsigned char *p, unsigned int len, AAC_FrameInfo &info) -{ - if (len < 6) - return -1; - if ((((long)p[0])<<4 | (p[1]>>4)) != 0xfff) - return -1; - - int layer = ((p[1] >> 1) & 3); - if (layer != 0) - return -1; - int sample_rate_index = ((p[2] >> 2) & 0xF); - - if (sample_rate_index > 13) - return -1; - int samplerate = aac_sratetab [sample_rate_index]; - if (info.m_samplerate) - { - if (info.m_samplerate != samplerate) - return -1; - } - else - info.m_samplerate = samplerate; - info.m_blocks = (p[6] & 0x3) + 1; - info.m_pattern = (((unsigned long)(p[0])<<24) | (p[1]<<16) | (p[2]<<8) | p[0]) & info.m_mask; - - return getAACFrameLength (p, len); -} - - -int AAC_FrameInfo::verifyFrame (const unsigned char *buf, unsigned int len) -{ - if (len > 6) - { - unsigned long v = (unsigned long)(buf[0])<<24 | (buf[1]<<16) | (buf[2]<<8) | buf[0]; - - if ((v & m_mask) == m_pattern) - { - m_blocks = (buf[6] & 0x3) + 1; - m_version = (buf[1] >> 3) & 1; // 1 mpeg2, 0 mpeg4 - m_aot = ((buf[2] >> 6) & 3) + 1; - return getAACFrameLength (buf, len); - } - // DLOG ("AAC failed sync, retry.."); - return -1; - } - return 0; -} - - -AAC_FrameInfo::AAC_FrameInfo (unsigned long value) : parserInfo (0xFFFEFDC0, value) -{ - m_description = "AAC"; - m_blocks = 0; - m_aot = 0; -} - -AAC_FrameInfo::AAC_FrameInfo(const unsigned char *p, unsigned int len) : parserInfo() -{ - m_mask = 0xFFFEFDC0; - m_description = "AAC"; - m_blocks = 0; - getAACFrameInfo (p, len, *this); -} - diff --git a/Src/Plugins/DSP/sc_serv3/ADTSHeader.h b/Src/Plugins/DSP/sc_serv3/ADTSHeader.h deleted file mode 100644 index ef849f87..00000000 --- a/Src/Plugins/DSP/sc_serv3/ADTSHeader.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once -#ifndef _ADTS_HEADER_H -#define _ADTS_HEADER_H - -#include "nmrCommon/intTypes.h" -#include "global.h" -#include "uvox2Common.h" - - -typedef struct ADTSHeader -{ - unsigned int syncword; - unsigned int layer; - unsigned int id; - unsigned int protection; - unsigned int profile; - unsigned int sample_rate_index; - unsigned int private_bit; - unsigned int channel_configuration; - unsigned int original; - unsigned int home; - int frame_length; - unsigned int buffer_fullness; - unsigned int num_data_blocks; -} ADTSHeader, *aac_adts_header_t; - -enum -{ - NErr_Success = 0, - NErr_True = 0, - NErr_False = 8, // returned from a bool-like function to indicate "false" as opposed to "i had an error while figuring it out" - NErr_UnsupportedFormat = 13, - NErr_LostSynchronization = 17, - NErr_WrongFormat = 24, // data was understood but is indicating a different format than expected. e.g. an layer 2 header being encountered by a layer 3 parser - NErr_Reserved = 25 // typically returned when a parser encounters data with a reserved flag set to true -}; - -struct AAC_FrameInfo : public parserInfo -{ - int m_blocks; - int m_aot; - - int verifyFrame (const unsigned char *buf, unsigned int len); - int getUvoxType() { return AAC_LC_DATA; } - const char *getVersionName() const; - const char *getAOT() const; - - AAC_FrameInfo (unsigned long value = 0); - AAC_FrameInfo (const unsigned char *p, unsigned int len); -}; - -int getAACFrameInfo (const unsigned char *hdr, unsigned int len, AAC_FrameInfo &info); - -/* must be 7 bytes */ -const int aac_adts_parse(const aac_adts_header_t header, const __uint8 *buffer); -const int aac_adts_get_channel_count(const aac_adts_header_t header); -#if 0 -const int aac_adts_match(const aac_adts_header_t header1, const aac_adts_header_t header2); -#endif -const __uint16 getADTSFrameInfo(const char *hdr, unsigned int *samplerate, __uint8 *asc_header = 0); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/FLV.cpp b/Src/Plugins/DSP/sc_serv3/FLV.cpp deleted file mode 100644 index b42063b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/FLV.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include "FLV.h" -#ifdef _WIN32 -#include -#endif -#include "streamData.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -/* -** This is a bit messy but it'll generate -** FLV tags for the purpose of streaming. -** -** Where possible values are hard-coded -** so we just re-insert into the output. -*/ - -#define FLV_SIGNATURE {'F', 'L', 'V'} -#define FLV_VERSION ((__uint8)0x1) - -#define FLV_FLAG_VIDEO ((__uint8)0x1) -#define FLV_FLAG_AUDIO ((__uint8)0x4) - -#define FLV_HDR_SIZE ((__uint32)0x9000000) // pre-converted to big-endian - -// ensure we've got the structures correctly packed -#pragma pack(push, 1) -typedef struct { - __uint8 signature[3]; // FLV_SIGNATURE - __uint8 version; // FLV_VERSION - __uint8 flags; // FLV_FLAG_* - __uint32 header_size; // FLV_HDR_SIZE - __uint32 prev_size; // 0 (this is the size of the previous tag including - // its header in bytes i.e. 11 + the 'data_size' - // of the previous tag). we include this in the - // header so that we're always outputting a valid - // start point before the tag structure is added. -} flv_header; -#pragma pack(pop) - -#pragma pack(push, 1) -typedef struct { - __uint8 type; // for first packet set to AMF Metadata ??? - __uint8 data_size[3]; // size of packet data only (24) - __uint8 ts_lower[3]; // for first packet set to NULL (24) - __uint8 ts_upper; // extension to create a __uint32 value - __uint8 stream_id[3]; // for first stream of same type set to NULL (24) - /* data comes after this*/ -} flv_tag; -#pragma pack(pop) - -/* -__uint32 prev_size; // for first packet set to NULL otherwise this is the - // size of the previous tag including its header in B - // and is 11 plus the 'data_size' of the previous tag. -*/ - -// these are pre-encoded for the correct endianess -// though for metadata usage, we convert them back -#define FLV_MP3_AUDIO ((__uint8)0x20) // (((__uint8)0x2) << 4) -#define FLV_AAC_AUDIO ((__uint8)0xA0) // (((__uint8)0xA) << 4) - -#define FLV_SAMPLE_RATE_5 ((__uint8)0x0) // (((__uint8)0x0) << 2) -#define FLV_SAMPLE_RATE_11 ((__uint8)0x4) // (((__uint8)0x1) << 2) -#define FLV_SAMPLE_RATE_22 ((__uint8)0x8) // (((__uint8)0x2) << 2) -#define FLV_SAMPLE_RATE_44 ((__uint8)0xC) // (((__uint8)0x3) << 2) - -#define FLV_SAMPLE_SIZE_8 ((__uint8)0x0) // (((__uint8)0x0) << 1) -#define FLV_SAMPLE_SIZE_16 ((__uint8)0x2) // (((__uint8)0x1) << 1) - -#define FLV_MONO_AUDIO ((__uint8)0x0) -#define FLV_STEREO_AUDIO ((__uint8)0x1) - - -// reads 24 bits from data, converts from big endian, and returns as a 32bit int -inline __uint32 Read24(__uint8* data) -{ - __uint32 returnVal = 0; - __uint8* swap = (__uint8*)&returnVal; - - swap[0] = data[2]; - swap[1] = data[1]; - swap[2] = data[0]; - - return returnVal; -} - -int dataString(vector<__uint8> &out_data, const char *buf) -{ - int amt = (int)strlen(buf); - __uint8 bytes[2] = {(__uint8)((amt >> 8) & 0xff), (__uint8)((amt >> 0) & 0xff)}; - // length of the data string - out_data.insert(out_data.end(), (const __uint8*)&bytes, (const __uint8*)&bytes + sizeof(bytes)); - // body of the data string - out_data.insert(out_data.end(), (const __uint8*)buf, (const __uint8*)buf + amt); - return amt + 2; -} - -int scriptDataType(vector<__uint8> &out_data, const __uint8 type) -{ - out_data.insert(out_data.end(), (const __uint8*)&type, ((const __uint8*)&type) + sizeof(type)); - return 1; -} - -int scriptDataString(vector<__uint8> &out_data, const char *name, const char *value) -{ - return dataString(out_data, name) + scriptDataType(out_data, 0x2) + dataString(out_data, value); -} - -int scriptDataBool(vector<__uint8> &out_data, const char *name, const bool value) -{ - return dataString(out_data, name) + scriptDataType(out_data, 0x1) + scriptDataType(out_data, !!value); -} - -int scriptDataDouble(vector<__uint8> &out_data, const char *name, const double value) -{ - int amt = dataString(out_data, name) + scriptDataType(out_data, 0x0); - - union - { - __uint8 dc[8]; - double dd; - } d; - d.dd = value; - - unsigned char b[8]; - b[0] = d.dc[7]; - b[1] = d.dc[6]; - b[2] = d.dc[5]; - b[3] = d.dc[4]; - b[4] = d.dc[3]; - b[5] = d.dc[2]; - b[6] = d.dc[1]; - b[7] = d.dc[0]; - - out_data.insert(out_data.end(), (const __uint8*)b, (const __uint8*)b + sizeof(b)); - - return amt + 8; -} - -void createMetadataTag(vector<__uint8> &out_data, const bool mp3, - const bool mono, const int bitrate, - const __uint8 flv_sr, const streamData::streamID_t sid) -{ - __uint8 m[] = {'\x12', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; - out_data.insert(out_data.end(), (const __uint8*)m, (const __uint8*)m + sizeof(m)); - - __uint32 s = scriptDataType(out_data, 0x2) + - dataString(out_data, "onMetadata") + - // start of the script array data blocks - scriptDataType(out_data, 0x8); - - __uint8 data_size[4] = {'\x00', '\x00', '\x00', '\x0C'/* number of items in the array */}; - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); - s += 4; - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - s += scriptDataString(out_data, "name", (!info.m_streamName.empty() ? info.m_streamName.hideAsString().c_str() : "")); - // TODO - as we're not updating as we go at the moment, this will be set to the station name so there's something set - s += scriptDataString(out_data, "title", (!info.m_streamName.empty() ? info.m_streamName.hideAsString().c_str() : "")); - //s += scriptDataString(out_data, "title", (!info.m_currentSong.empty() ? info.m_currentSong.hideAsString().c_str() : "")); - s += scriptDataString(out_data, "genre", (!info.m_streamGenre[0].empty() ? info.m_streamGenre[0].hideAsString().c_str() : "")); - - //s += scriptDataBool(out_data, "hasMetadata", false/* TODO */); - s += scriptDataBool(out_data, "hasAudio", true); - s += scriptDataBool(out_data, "hasVideo", false); - s += scriptDataBool(out_data, "hasKeyframes", false); - - s += scriptDataBool(out_data, "canSeekToEnd", false); - - s += scriptDataBool(out_data, "stereo", !mono); - - s += scriptDataDouble(out_data, "audiodatarate", (double)bitrate); - s += scriptDataDouble(out_data, "audiocodecid", (double)((mp3 ? FLV_MP3_AUDIO : FLV_AAC_AUDIO) >> 4)); - s += scriptDataDouble(out_data, "audiosamplerate", (double)(flv_sr >> 2)); - s += scriptDataDouble(out_data, "audiosamplesize", (double)(FLV_SAMPLE_SIZE_16 >> 1)); - - unsigned char end[] = {'\x00', '\x00', '\x09'}; - out_data.insert(out_data.end(), (const __uint8*)end, (const __uint8*)end + sizeof(end)); - s += 3; - - // now we know how much we've got - // we can update the tags' length - __uint32 s2 = s + 11; - out_data[16] = (s & 0xFF); - s >>= 8; - out_data[15] = (s & 0xFF); - s >>= 8; - out_data[14] = (s & 0xFF); - - // we set this at the end so if we terminate the stream - // then there's more chance of it validating correctly. - data_size[3] = (s2 & 0xFF); - s2 >>= 8; - data_size[2] = (s2 & 0xFF); - s2 >>= 8; - data_size[1] = (s2 & 0xFF); - s2 >>= 8; - data_size[0] = (s2 & 0xFF); - - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); -} - -void createFLVTag(vector<__uint8> &out_data, const char *buf, - const int amt, int ×tamp, const bool mp3, - const bool mono, const unsigned int samplerate, - const int bitrate, const __uint8 *asc_header, - const streamData::streamID_t sid) -{ - if (amt > 0) - { - // we need to generate this early so we've got - // it for being provided in createMetadataTag - __uint8 flv_sr = FLV_SAMPLE_RATE_44; - if (mp3) - { - // how do we handle the formats not allowed...? - switch (samplerate) - { - case 22050: - { - flv_sr = FLV_SAMPLE_RATE_22; - break; - } - case 11025: - { - flv_sr = FLV_SAMPLE_RATE_11; - break; - } - } - } - - const bool first = (timestamp == 0); - if (first) - { - const flv_header hdr = {FLV_SIGNATURE, FLV_VERSION, FLV_FLAG_AUDIO, FLV_HDR_SIZE, 0}; - out_data.insert(out_data.end(), (const __uint8*)&hdr, ((const __uint8*)&hdr) + sizeof(flv_header)); - - createMetadataTag(out_data, mp3, mono, bitrate, flv_sr, sid); - - if (!mp3) - { - // we send a simple frame at this point just so for AAC the decoder - // is able to be setup correctly as needed else it'll fail to play. - __uint8 p[] = {'\x08', '\x00', '\x00', '\x04', '\x00', '\x00', '\x00', '\x00', - '\x00', '\x00', '\x00', (__uint8)'\xAF', '\x00', asc_header[0], - asc_header[1], '\x00', '\x00', '\x00', '\x0F'}; - out_data.insert(out_data.end(), (const __uint8*)p, (const __uint8*)p + sizeof(p)); - } - } - - // if we were to do something else, then we'd need to - // change the initial value as needed for it's format - flv_tag tag = {((__uint8)0x8), {0}, {0}, 0, {0}}; - // we need to know the size of things before we output - // the actual frame, so we calculate now and adjust it - // based on the format of the frame needing to be sent - __uint32 v = (first ? (!mp3 ? 2 : 1) : 1 + !mp3) + amt; - - tag.data_size[2] = (v & 0xFF); - v >>= 8; - tag.data_size[1] = (v & 0xFF); - v >>= 8; - tag.data_size[0] = (v & 0xFF); - - // this sets the 24-bit time - v = timestamp; - tag.ts_lower[2] = (v & 0xFF); - v >>= 8; - tag.ts_lower[1] = (v & 0xFF); - v >>= 8; - tag.ts_lower[0] = (v & 0xFF); - // this sets the extended time - // so we provide a 32-bit time - v >>= 8; - tag.ts_upper = (v & 0xFF); - - // depending on the format, we adjust timestamp - // for MP3, we're looking at 26ms / frame - // for AAC, we're looking at 1024 samples / frame - timestamp += (mp3 ? 26 : (1024000 / samplerate)); - - out_data.insert(out_data.end(), (const __uint8*)&tag, ((const __uint8*)&tag) + sizeof(flv_tag)); - - // for AAC data, the default has to be set as 16-bit 44kHZ stereo - // though the decoder will actuall figure things out as required. - // for MP3 data, we fill in things based on the frame data found - __uint8 flv_audio_data_tag = ((mp3 ? FLV_MP3_AUDIO : FLV_AAC_AUDIO) | flv_sr | FLV_SAMPLE_SIZE_16 | (!mono ? FLV_STEREO_AUDIO : FLV_MONO_AUDIO)); - out_data.insert(out_data.end(), (const __uint8*)&flv_audio_data_tag, ((const __uint8*)&flv_audio_data_tag) + sizeof(flv_audio_data_tag)); - - if (!mp3) - { - // this is done so we now distinguish the actual - // raw AAC data sans ADTS header vs the required - // AAC sequence header which is sent before the - // first AAC data frame is sent - __uint8 packet_type = 0x1; - out_data.insert(out_data.end(), (const __uint8*)&packet_type, ((const __uint8*)&packet_type) + sizeof(packet_type)); - } - - // body of the data - out_data.insert(out_data.end(), (const __uint8*)buf, ((const __uint8*)buf) + amt); - - // we set this at the end so if we terminate the stream - // then there's more chance of it validating correctly. - v = (11 + Read24(tag.data_size)); - __uint8 data_size[4] = {0}; - data_size[3] = (v & 0xFF); - v >>= 8; - data_size[2] = (v & 0xFF); - v >>= 8; - data_size[1] = (v & 0xFF); - v >>= 8; - data_size[0] = (v & 0xFF); - - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/FLV.h b/Src/Plugins/DSP/sc_serv3/FLV.h deleted file mode 100644 index 182e65ef..00000000 --- a/Src/Plugins/DSP/sc_serv3/FLV.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#ifndef _FLV_HEADER_H -#define _FLV_HEADER_H - -#include -#include -#include "nmrCommon/intTypes.h" -#ifdef _WIN32 -#include -#endif -#include "streamData.h" - -void createFLVTag(std::vector<__uint8> &out_data, const char *buf, - const int amt, int ×tamp, const bool mp3, - const bool mono, const unsigned int samplerate, - const int bitrate, const __uint8 *asc_header, - const streamData::streamID_t sid); - -void createMetadataTag(std::vector<__uint8> &out_data, const bool mp3, - const bool mono, const int bitrate, - const __uint8 flv_sr, const streamData::streamID_t sid); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/GNUmakefile b/Src/Plugins/DSP/sc_serv3/GNUmakefile deleted file mode 100644 index eebf3052..00000000 --- a/Src/Plugins/DSP/sc_serv3/GNUmakefile +++ /dev/null @@ -1,237 +0,0 @@ -SHELL = /bin/sh - -.SUFFIXES: -.SUFFIXES: .cpp .o .d .h - -OS := $(shell uname | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/') -x64 := $(shell uname -m) -ENDIAN := $(shell uname -m) -ENDIAN := $(patsubst i%86,LITTLE_ENDIAN,$(ENDIAN)) -ENDIAN := $(patsubst x86_64,LITTLE_ENDIAN,$(ENDIAN)) -ENDIAN := $(patsubst Power Macintosh,BIG_ENDIAN,$(ENDIAN)) -CXX=g++ -std=c++11 -Wno-deprecated - -########################################################## -########### Platform specific stuff ##################### -########################################################## - -ifeq ($(OS),LINUX) - - ### Raspbian is reported as a Linux OS - ### and reports 'armv6l' via uname -m - ### so we check -m to detect it properly - ifeq ($(x64),armv6l) - - #PLATFORM_DEFINES=-DPLATFORM_ARMv6 - # this is for GCC 4.6.x to make a legacy compatible compile ?? - PLATFORM_DEFINES=-DPLATFORM_ARMv6 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -ffunction-sections -fdata-sections -Wl,--gc-sections - - PLATFORM_LIBS=\ - libs/Aol_XML/ARMv6/libexpat.a\ - libs/libcurl/ARMv6/libcurl.a\ - libs/libcurl/ARMv6/libssl.a\ - libs/libcurl/ARMv6/libcrypto.a\ - libs/zlib/ARMv6/libz.a\ - -lrt\ - -lpthread\ - -ldl - ### the RPi2 is reported as a Linux OS - ### and reports 'armv7l' via uname -m - ### so we check -m to detect it properly - else ifeq ($(x64),armv7l) - # https://www.raspberrypi.org/forums/viewtopic.php?p=684549#p684549 - # this is for GCC 4.6.x - #PLATFORM_DEFINES=-DPLATFORM_ARMv7 -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard - # this is for GCC 4.8.x (default is 4.6.x on Raspbian) - PLATFORM_DEFINES=-DPLATFORM_ARMv7 -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -Wno-unused-result -Wno-ignored-qualifiers -Wno-long-long -Wno-missing-field-initializers -ffunction-sections -fdata-sections -Wl,--gc-sections - # this is for GCC 4.6.x to make a legacy compatible compile ?? - #PLATFORM_DEFINES=-DPLATFORM_ARMv6 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard - - PLATFORM_LIBS=\ - libs/Aol_XML/ARMv7/libexpat.a\ - libs/libcurl/ARMv7/libcurl.a\ - libs/libcurl/ARMv7/libssl.a\ - libs/libcurl/ARMv7/libcrypto.a\ - libs/zlib/ARMv7/libz.a\ - -lrt\ - -lpthread\ - -ldl - else - PLATFORM_DEFINES=-DPLATFORM_LINUX -Wno-unused-result -Wno-ignored-qualifiers -Wno-long-long -Wno-missing-field-initializers -ffunction-sections -fdata-sections -Wl,--gc-sections - - ### Linux platform specific includes - ### with 32-bit and 64-bit handling - ifeq ($(x64),x86_64) - INCLUDES=-Ideps/x86_64/include - PLATFORM_LIBS=\ - -Ldeps/x86_64/lib -lexpat -lcurl -lssl -lcrypto -lpthread -lz -lrt -ldl - else - CXX += -m32 - INCLUDES=-Ideps/i686/include - PLATFORM_LIBS=\ - -Ldeps/i686/lib -lexpat -lcurl -lssl -lcrypto -lpthread -lz -lrt -ldl - endif - endif - -################################### - -else - ifeq ($(OS),FREEBSD) -# CXX=g++44 - PLATFORM_DEFINES=-DPLATFORM_BSD -Wno-long-long -Wno-missing-field-initializers - - PLATFORM_LIBS=\ - libs/Aol_XML/BSD/libexpat.a\ - libs/libcurl/BSD/libcurl.a\ - libs/libcurl/BSD/libssl.a\ - libs/libcurl/BSD/libcrypto.a\ - libs/zlib/BSD/libz.a\ - -lpthread\ -# -R /usr/local/lib/gcc44 - - else - ifeq ($(OS),DARWIN) - PLATFORM_DEFINES=-DPLATFORM_MAC -Wno-long-long -Wno-missing-field-initializers - - PLATFORM_LIBS=\ - libs/Aol_XML/Darwin/libexpat.a\ - libs/libcurl/Darwin/libcurl.a\ - libs/libcurl/Darwin/libssl.a\ - libs/libcurl/Darwin/libcrypto.a\ - libs/zlib/Darwin/libz.a\ - -lpthread - else - ERR = $(error Unknown operating system $(OS)) - endif - endif -endif - -ifneq ($(ENDIAN),LITTLE_ENDIAN) - ifneq ($(ENDIAN),BIG_ENDIAN) - ERR = $(error Unknown endian $(ENDIAN)) - endif -endif - -########################################################## -########################################################## -########################################################## -########################################################## -########################################################## - -INCLUDES += -I. -InmrCommon -#INCLUDES=-I. -InmrCommon -Izlib -Ilibcurl/include -IGeoIP/libGeoIP - -LIBS=$(PLATFORM_LIBS) - -CPPFLAGS=$(PLATFORM_DEFINES) -MMD -MP -D_REENTRANT -DCURL_STATICLIB -Wno-unused-function -Wno-sign-compare -Wno-unknown-pragmas -Wall -Wextra -pedantic - -CFLAGS_RELEASE=-O2 -static-libgcc -static-libstdc++ -rdynamic -CPPFLAGS_RELEASE=$(CPPFLAGS) -O2 -DNDEBUG -g - -CFLAGS_DEBUG=-static-libgcc -static-libstdc++ -rdynamic -CPPFLAGS_DEBUG=$(CPPFLAGS) -ggdb -DDEBUG - -VPATH=nmrCommon/threading nmrCommon/stacktrace nmrCommon/services nmrCommon/file nmrCommon/unicode webNet aolxml -#VPATH=nmrCommon/threading nmrCommon/stacktrace nmrCommon/services nmrCommon/file nmrCommon/unicode webNet aolxml GeoIP/libGeoIP - -C_SOURCES=\ - $(wildcard *.c) - -#C_SOURCES=\ -# $(wildcard *.c)\ -# $(wildcard GeoIP/libGeoIP/*.c) - -CXX_SOURCES=\ - $(wildcard *.cpp)\ - $(wildcard nmrCommon/threading/thread.cpp)\ - $(wildcard nmrCommon/stacktrace/StackTrace.cpp)\ - $(wildcard nmrCommon/services/logger.cpp)\ - $(wildcard nmrCommon/services/serviceMain.cpp)\ - $(wildcard nmrCommon/services/stdServiceImpl.cpp)\ - $(wildcard nmrCommon/file/fileUtils.cpp)\ - $(wildcard nmrCommon/unicode/*.cpp)\ - $(wildcard webNet/*.cpp)\ - $(wildcard aolxml/*.cpp) - -SOURCE_FILES=$(C_SOURCES) $(CXX_SOURCES) - -OBJECT_FILES=$(addsuffix .o,$(basename $(notdir $(SOURCE_FILES)))) -DEBUG_OBJECTS=$(addprefix debug/,$(OBJECT_FILES)) -RELEASE_OBJECTS=$(addprefix release/,$(OBJECT_FILES)) - -.PHONY: default -default: release - -release/config.o debug/config.o: unixversion.h -release/serviceMain.o debug/serviceMain.o: unixversion.h - -############################################################## -### Create unix version header from Win32 resource file -unixversion.h: sc_serv.rc - @grep --text 'PRODUCTVERSION' sc_serv.rc | sed 's/PRODUCTVERSION/static int & \[VENT\]=\{/' | sed 's/[0-9]*,[0-9]*,[0-9]*,[0-9]*/&\};/' > unixversion_tmp.h - @echo '#define VENT 4' | cat - unixversion_tmp.h > unixversion.h - @rm -f unixversion_tmp.h - -################# File rules #########################3 - -debug/%.o: %.cpp - $(CXX) $(CPPFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -debug/%.o: %.c - $(CXX) $(CPPFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: %.cpp - $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -release/%.o: %.c - $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -#release/%.o: GeoIP/libGeoIP/%.c -# $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -############################################################ - -sc_serv_debug: $(DEBUG_OBJECTS) - $(CXX) -o sc_serv_debug $(CFLAGS_DEBUG) $(DEBUG_OBJECTS) $(LIBS) - @./sc_serv_debug -v - @echo - -sc_serv: sc_serv_notstripped - strip -o sc_serv sc_serv_notstripped - @echo - -sc_serv_notstripped: $(RELEASE_OBJECTS) - $(CXX) -o sc_serv_notstripped $(CFLAGS_RELEASE) $(RELEASE_OBJECTS) $(LIBS) - @./sc_serv_notstripped -v - -releasedir: - @mkdir -p release - -debugdir: - @mkdir -p debug - -.PHONY: clean -.PHONY: release -.PHONY: debug - -release: releasedir sc_serv -release_nostrip: releasedir sc_serv_notstripped -debug: debugdir sc_serv_debug - -clean: - @rm -rf debug - @rm -rf release - @rm -f unixversion.h - -.PHONY: err -err: ; $(ERR) - -##################################################3 - -ifeq ($(MAKECMDGOALS),release) --include $(RELEASE_OBJECTS:.o=.d) -else -ifneq ($(MAKECMDGOALS),clean) --include $(DEBUG_OBJECTS:.o=.d) -endif -endif diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS b/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS deleted file mode 100644 index b1295b9b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -T.J. Mather diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING b/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING deleted file mode 100644 index 45574c3c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING +++ /dev/null @@ -1,509 +0,0 @@ -[ Note that while the core GeoIP library is licensed under the -LGPL, the libGeoIPUpdate library depends on md5.c and types.h -which are licensed under the GPL. ] - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 - -That's all there is to it! - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog b/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog deleted file mode 100644 index 572960f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog +++ /dev/null @@ -1,628 +0,0 @@ -1.4.8 - * Fix GEOIP_DOMAIN_EDITION_V6 ( Boris Zentner ) - * Add new Datatypes GEOIP_NETSPEED_EDITION_REV1_V6 and - GEOIP_NETSPEED_EDITION_REV1 ( Boris Zentner ) - * Fix possible directory traversal weakness in geoipupdate-pureperl.pl with - malicious update server ( Boris Zentner ) - * Fix GEOIP_ORG_EDITION_V6 and GEOIP_ISP_EDITION_V6 ( Boris Zentner ) -1.4.7 - * Upd timezone.c Add SX, BQ and CW remove AN and FX ( Boris Zentner ) - * Add support for the new types in geoiplookup6 ( Boris Zentner ) - * Add new database types GEOIP_CITY_EDITION_REV0_V6, - GEOIP_CITY_EDITION_REV1_V6, GEOIP_DOMAIN_EDITION_V6, - GEOIP_ORG_EDITION_V6 and GEOIP_ISP_EDITION_V6 ( Boris Zentner ) - * Remove AN and FX. Add SX, BQ and CW ( Boris Zentner ) - * Fix possible segfault in geoipupdate if the connection disappear - unexpected. ( Boris Zentner ) - * Add sanity check for geoipupdate-pureperl.pl ( Boris Zentner ) - * Add GEOIP_USERTYPE_EDITION and GEOIP_USERTYPE_EDITION_V6 - datatypes ( Boris Zentner ) - * Add new functions GeoIP_is_private_ipnum_v4 and GeoIP_is_private_v4 - ( Boris Zentner ) - * Add new functions GeoIP_teredo and GeoIP_enable_teredo. - teredo is enabled by default ( Boris Zentner ) - * Fix output of geoiplookup for unknown or private regions. - ( Boris Zentner ) - * Fix geoipupdate-pureperl.pl to accept more product codes. - ( Boris Zentner ) - * Fix minor output issue in geoipupdate -v ( Boris Zentner ) - * Add support for various databases. ( Boris Zentner ) - * Add experimental teredo support ( Boris Zentner ) - * Fix possible buffer overflow in conjunction with - http_proxies ( Elso Andras ) - * Remove memcpy/bcopy macro for BSD ( Boris Zentner ) - * Add GeoIP_lib_version and GeoIP_cleanup ( Ladar Levison ) - * Upd Makefile.vc ( Thomas Winzig ) - * Fix typo in DK,18,Midtjylland ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100810 ( Boris Zentner ) - * Fix continent codes ( Boris Zentner ) - * Fix 3letter country codes for ATA, BVT, IOT, CXR, CCK, ATF, HMD, - MYT, SGS and UMI ( Boris Zentner ) - * Fix typo/segfault in GeoIP_id_by_name_v6 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100529 ( Boris Zentner ) - * Remove buffered IO functions, to fix issues with dup'ed file - descriptors ( Boris Zentner ) - * Fix very minor memleak in geoipupdate ( Boris Zentner ) - * Add GEOIP_CITYCONFIDENCEDIST_EDITION, GEOIP_LARGE_COUNTRY_EDITION - and GEOIP_LARGE_COUNTRY_EDITION_V6 database types ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100422 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100420 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100221 ( Boris Zentner ) - * Add missing timezones ( Boris Zentner ) - * Add missing include for Windows 2000 ( Jaap Keute ) - * 'GeoIP Database up to date' and 'Updated database' prints to stdout - instead of stderr ( Boris Zentner ) - * Add missing GeoIPRecord_delete to geoiplookup.c ( Piotr Kaczuba ) - * Add some IPv4 helper functions - unsigned long GeoIP_addr_to_num(const char *addr); - char * GeoIP_num_to_addr(unsigned long ipnum); ( Boris Zentner ) - * Fix default name for the accuracy radius database to GeoIPDistance.dat ( Boris Zentner ) - * Add GEOIP_CITYCONFIDENCE_EDITION database type. ( Boris Zentner ) - * geoiplookup use GeoIPDistance.dat files if avail ( Boris Zentner ) - * Fix geoiplookup/geoiplookup6 output, when the databaseinfo string is - not avail. ( Boris Zentner ) - * Change continent code for RU from AS to EU ( Boris Zentner ) - * Add GEOIP_ACCURACYRADIUS_EDITION database type. ( Boris Zentner ) - * Add GEOIP_LOCATIONA_EDITION the database to map back from binary to - the csv database ( Boris Zentner ) - * Change Turkey's continent code from Asia to Europe ( Boris Zentner ) - * Rename _iso_8859_1__utf8 to _GeoIP_iso_8859_1__utf8 ( Boris Zentner ) - * GEOIP_ORG_EDITION, GEOIP_ISP_EDITION, GEOIP_DOMAIN_EDITION and - GEOIP_ASNUM_EDITION databases return UTF8 results, if gi->charset is set - to GEOIP_CHARSET_UTF8 ( Boris Zentner ) - * Avoid unnecesary call to gettimeofday when GEOIP_CHECK_CACHE is not set ( John Douglass ) - * Delayed loading of changed database files for 60 seconds. To avoid - reading halve written databases ( Boris Zentner ) - * Update README.OSX for Leopard and Snow Leopard ( Boris Zentner ) - * Add more IPv6 functions ( Boris Zentner ) - const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *host); - const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *host); - const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *host); - * Make sure that GeoIP_*_v6 functions refuse GEOIP_PROXY_EDITION and - GEOIP_NETSPEED_EDITION databases ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes from 20090723 ( Boris Zentner ) - * Fix geoipupdate's -v option to not change the license filename ( Thom May ) - * Fix geoipupdate's exit code ( Thom May ) - * Add support for ASNUM_EDITION ( Boris Zentner ) - * Fix -i output for larger values, sign issue ( Boris Zentner ) - * Add -i flag for more information on netmask, range_by_ip and the current network range ( Boris Zentner ) - * Add support for DOMAIN_EDITION database type ( Boris Zentner ) - * Fix apps/geoipupdate-pureperl.pl output layer on W32 ( Boris Zentner ) -1.4.6 2009-02-25 - * Fix geoipupdate's my_printf function ( Boris Zentner ) - * Fix typo in apps/geoipupdate-pureperl.pl replace PerlIO::Gzip with PerlIO::gzip ( Boris Zentner ) - * Update region codes in libGeoIP/regionName.c ( Boris Zentner ) - * Fix regioncode/generate_regionName.pl to handle regioncodes with ',' correct ( Boris Zentner ) - * Update fips codes 20090201 ( Boris Zentner ) - * Fix unicode builds on WIN32 and eliminate some warnings ( Stu Redman ) - * Fix sign error in _iso_8859_1__utf8 for PPC64 ( Boris Zentner ) - * Change WIN32 to _WIN32, since _WIN32 is defined by default. _WIN32 is also defined for WIN64 machines ( Boris Zentner ) - ! Remove the WSAStartup call from GeoIP_open. All Applications need to call WSAStartup and WSACleanup to initialize the Windows Socket library. Before they use any of the GeoIP_*_by_name functions. ( Boris Zentner ) - * geoiplookup and test-geoip-* output N/A instead of (null) ( Boris Zentner ) - * Silence various warnings. ( Boris Zentner ) - * Add more timezone region's for Australia - * Fix possible segfault in apps/geoiplookup with null pointers in non gnu printf implementations for example solaris ( Boris Zentner ) - * Add README.OSX to build fat binaries easy ( Boris Zentner ) - * Silence vasprintf warning via AC_GNU_SOURCE ( Boris Zentner ) - * Add several Makefiles to build a static GeoIP.lib for w32 ( Stanislaw Pusep and Randy Kobes ) - * Silence signedness warnings ( Peter Volkov ) - * Remove --with-city configure option. ( Boris Zentner ) - * Remove configure's --with-dbdir option. Use the similar --datadir instead ( Peter Volkov ) - * Various autotools improvements and cleanups. Including parallel - build fix ( Peter Volkov ) - * Fix libGeoIP/timeZone.c ( Martin Haller ) - * Fix timezone/generate_timeZone.pl ( Boris Zenter ) - * Sync FIPS codes again Jan 14th, 2009 ( Boris Zentner ) - * Fix CA,NL regioncode. ( Boris Zentner ) - * Change logic in generate_regionName.pl and GeoIP_region_name_by_code to handle any mixture of two letter fips codes matching [A-Z0-9]{2} the change allow GZ and WE region codes ( Boris Zentner ) - * Sync regionName.c with http://www.maxmind.com/app/fips10_4 from Dec 17th, 2008 ( Boris Zentner ) - * Fix _GeoIP_lookupaddress for 64bit big endian systems like ppc64 ( Peter Volkov ) - * Add proper WIN32/64 support ( Gerald Combs ) - * Escape - in all manpages ( Patrick Matthaei ) - * Add manpage for geoiplookup6 ( Boris Zentner ) - * Fix -d command line option ( Klaus Heinz ) - * GeoIPUpdate.c use vasprintf if avail, otherwise try vsnprintf and sprintf ( Boris Zentner ) - * avoid pre/postincrement and assignment on the same variable ( Boris Zentner ) -1.4.5 2008-09-16 - * metro_code replace the depreciated dma_code field ( Boris Zentner ) - * Add new function GeoIP_range_by_ip_delete - r = GeoIP_range_by_ip(gi, '24.24.24.24'); - ... - GeoIP_range_by_ip_delete(r); ( Boris Zentner ) - * Fix small memoryleak and wrap around in GeoIP_range_by_ip ( Boris Zentner ) - * CHECK_CACHE stat the database file not faster than once a second anymore ( Patrick McManus ) - * Fixed a typo in the geoipupdate(1) manpage and also an non-existent path on Debian (Patrick Matthäi) - * Fixes two little format errors (hyphen used as minus sign) in both manpages (Patrick Matthäi) - * Sync regionName.c with a recent fips code list ( Boris Zentner ) - * Fix segfault when open failed for a custom file (-f) ( Boris Zentner ) - * Fix sync geoiplookup's man page with the code ( Klaus Heinz ) - * remove unused code from GeoIP_country_name_by_addr and GeoIP_country_code3_by_addr ( Boris Zentner ) - * Fix geoiplookup and geoiplookup6 to distinguish between failed namelookups and unknown ips ( Boris Zentner ) - * add geoiplookup6 that can handle the new database type GEOIP_COUNTRY_EDITION_V6 ( Boris Zentner ) - * add new functions to handle ipv6 - - GEOIP_API const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name); - GEOIP_API int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API int GeoIP_id_by_name_v6 (GeoIP* gi, const char *host); - GEOIP_API int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *host); - GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP *gi, geoipv6_t ipnum); - GEOIP_API void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *gir); - GEOIP_API char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name); - - # allowed input for addr - 2001:4860:0:1001::68 - ::85.8.93.71 - ::1 - ::5508::5d47 - ::ffff:5508::5d47 - - # allowed input for host - ipv6.google.com - 2001:4860:0:1001::68 - ::85.8.93.71 - ::1 - ::5508::5d47 - ::ffff:5508::5d47 - ( Boris Zentner ) - * Fix geoiplookup usage string ( add -d -f ) ( Boris Zentner ) - * Added GeoIP_range_by_ip, returns the start and end IP address for the range containing the IP address. - This range has a constant value in the GeoIP database. - * Add geoipupdate-pureperl.pl a alternative geoipupdate version. with Proxy Server support via via the "http_proxy" environment variable. Easy to customize. ( Boris Zentner ) - * Add WIN64 since WIN32 is not defined on WIN64 Systems ( Boris Zentner ) - * Fix WIN32 compilation by encircle all MMAP functions with #ifdef WIN32 #endif pairs. MMAP is not avail in W32 ( Boris Zentner ) - * Update timezone/generate_timeZone.pl ( Boris Zentner ) - * Update libGeoIP/timeZone.c ( Boris Zentner ) - * Added GeoIP_printf and GeoIP_fprintf as a experimental feature to - libGeoIPUpdate. ( Boris Zentner, Andrew Droffner ) - * Added cast in _iso_8859_1__utf8 function to fix NetWare/Win32 compilation issue (Guenter Knauf) - * Add HTTP Proxy Server support for geoipupdate via the "http_proxy" - environment variable. - ie: export http_proxy="http://proxy-hostname:port" - ( Andrew Droffner, Derek Nicol ) - * Notice, that __YOU__ need to free the results of - - GeoIP_database_info - GeoIP_name_by_ipnum - GeoIP_name_by_addr - GeoIP_name_by_name - GeoIP_org_by_ipnum - GeoIP_org_by_addr - GeoIP_org_by_name - - not libgeoip - ( Boris Zentner, Andrew Cheung ) - * Fixed segfault with geoiplookup, if used with a custom_file database, that - could not be opened. ( Boris Zentner ) - * Add Usage info for options -f and -d in geoipupdate ( Boris Zentner ) - * Fixed segfault with geoipupdate when called with a illformed license file - ( Boris Zentner ) - * Update add more timezones to GeoIP_time_zone_by_country_and_region - ( Boris Zentner ) - * Add array access functions so programs can avoid accessing the - arrays directly which whould break binary compatability (Ludwig Nussel at SUSE) - * Updated README to state API is only thread-safe if GEOIP_CHECK_CACHE is not used - -1.4.4 2008-1-21 - * Updated original geoipupdate to return "Invalid product ID or subscription expired" - * Added BL/Saint Barthelemy, MF/Saint Martin (ISO-3166-1 additions) - * Check for illegal IP strings, return 0 if IP is not well formed IPv4 e.g. 1.2.3.4.5 and 1.2.3 - * Clarified that while core GeoIP library is LGPL, libGeoIPUpdate depends on md5.c and types.h which are GPL. - * speedup the conversion from ipstring to ipnum in _GeoIP_addr_to_num. Doubles the speed of GEOIP_MEMORY_CACHE and GEOIP_MMAP_CACHE - * Added new mmap shared memory caching option, GEOIP_MMAP_CACHE (Peter Shipley, LookSmart) - - mmaps: our maps are shared, but we need only private readonly pages - -1.4.3 2007-8-30 - ! CHANGE with geoiplookup facility: -v flag now returns database info for all databases, not just GeoIP Country - * Added ability to get netmask of network block from last lookup using GeoIP_last_netmask - * Fixed GeoIP_database_info bug with GeoLite City - * Replaced 4 with sizeof(char*) to fix issues with geoipupdate on 64 Bit machines - * Added GeoIP_set_charset function - enables UTF8 output of city name if GEOIP_CHARSET_UTF8 flag is passed - to GeoIP_set_charset - * Fixed segfault issue if calling GeoIP_db_avail before opening a database - * Added continent_code to GeoIP City's record struct (Frank Mather) - -1.4.2 2007-2-8 - * Added -d flag to enable custom path for geoipupdate utility program (Frank Mather) - * Replaced _WIN32 with WIN32 since WIN32 is already set by compilers - * Moved var definitions to top of code, defined size_t (Guenter Knauf) - * Added Makefile.win32, Makefile.netware, get_ver.awk, geoip.ico to EXTRA_DIST in Makefile.am (Guenter Knauf) - -1.4.1 2007-1-2 - * Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro - * Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes) - * Added GeoIP_time_zone_by_country_and_region, to lookup zoneinfo timezone by country and region (Frank Mather) - * Added GeoIP_region_name_by_code, to lookup region name from region code (Frank Mather) - * added -f and -d flags to enable custom paths for geoiplookup utility program (Frank Mather) - * Added benchmarks for GeoIP Region and City in test/benchmark.c (Frank Mather) - * Fixed build issue when using --as-needed flag (Diego 'Flameeyes' Pettenò) - * Add sanity checking for filename returned by MaxMind.com server for geoipupdate filename - (Dean Gaudet, arctic.org) - * Fixed memory leaks under error conditions, buffer overflow using sprintf, - and issue where a corrupted cache file could core dump the file - (Nick Galbreath, Right Media Inc) - -1.4.0 2006-8-7 - * Changed license from GPL to LGPL, so that PHP Extension can be included in PECL (Olivier Hill) - * Rewrote GEOIP_CHECK_CACHE code, fixed numerous bugs - - CheckCache now works if GeoIP file is overwriten by mv command - - Fixed bug where CheckCache kept reloading in GEOIP_STANDARD_MODE - - Fixed segfault issue in GEOIP_MEMORY_CACHE mode - - Fixed garbage data appearing in GEOIP_INDEX_CACHE mode - - Fixed realloc in case realloc returns new memory block (Andre Morozov of Stone Steps) - * Updated geoipupdate to print status messages for each database instead of just last database - * Check that gi is not null before running code in GeoIP_delete - * Fixed alpha-3 codes ordering, replaced TLS,TKM,TUN,TON with TKM,TUN,TON,TLS - * TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166 - * Added Netware and Windows makefiles (Guenter Knauf) - * Fixed NetWare compiler issue with char block[block_size] declaration (Guenter Knauf) - * Updated geoipupdate example to run weekly - -1.3.17 2006-5-14 - * Fixed headers for Windows/Netware compilation (Guenter Knauf) - * Fixed Received Error -21 (Sanity check database_info string failed) - when running geoipupdate with GeoIP Country when UserId and - productIds were not specified. Bug was introduced in 1.3.15. - -1.3.16 2006-4-17 - * Fixed compliation error in GeoIPUpdate.c - -1.3.15 2006-4-14 - * Updated README documentation - * Updated geoipupdate so that it writes file as it is uncompressed instead - of storing entire GeoIP.dat file in memory (Frank Mather) - * Updated geoiplookup so that it returns GeoIP Domain Name if available - (Frank Mather) - * Updated geoipupdate so that it reports whether databases are updated - in non-verbose mode (Frank Mather) - -1.3.14 2005-9-7 - * Check if byte, ushort, ulong, u16, u32 are defined in configure - script. Fixes compilation issue on FreeBSD systems. - * Check for Big Endian byte order (needed for MD5 code in geoipupdate - to work properly on Mac OS X and other Big Endian processors) - * Fixed GEOIP_CHECK_CACHE mode when used with GEOIP_STANDARD to - only refresh upon file change - * Fixed memory leak when refreshing file in GEOIP_CHECK_CACHE mode - * Updated ltmain.sh to support Debian GNU/k*BSD bug #315425 (Marek Habersack) - * Added lookup functions using IP numeric representation as input (Frank Mather) - * Removed geoipexport - * Replaced Yugoslavia with Serbia and Montenegro - * Updated geoiplookup to only perform country lookup once instead of twice by using GeoIP_id_by_name - -1.3.13 2005-8-1 - * Fixed autoconf weirdness that resulted in libraries being - installed without .so suffix - -1.3.12 2005-7-19 - * Removed -lGeoIP from libGeoIPUpdate_la_LIBADD - fixes compilation error - if GeoIP isn't already installed (Thomas Steudten) - -1.3.11 2005-7-7 - * Fixed gcc warnings and bug. Use int - instead of char for checking the return value of getopt in geoipupdate.c. - Moved the internal functions to GeoIP_internal.h to get rid - of those 'implicit declaration' warnings. (Ludwig Nussel/SUSE) - * Cleaned up name space by prefixing internal functions with - _GeoIP* (Ludwig Nussel/SUSE) - * Memory Leak fix for GeoIP City if fread error - * Added more verbose error messages for geoipupdate (Frank Mather) - * Added check for zlib.h to configure.in - -1.3.10 2005-4-17 - * Added types.h to Makefile.am - fixes compilation error - -1.3.9 2005-4-14 - * fixed bug with GEOIP_INDEX_CACHE (Frank Mather) - * fixed segfault issue if GeoIP.dat not found (Frank Mather) - * Updated MD5 checksum code to use GnuPG code which works - on 64bit machines (Frank Mather) - * Fixed memory leak in test-geoip-isp.c and test-geoip-org.c - * Added support for GeoIP Domain Names in geoipupdate - -1.3.8 2004-11-7 - * Updated geoipupdate to report invalid userID and productID errors - * Check if gethostbyname_r is version that returns int or is other version - - should fix compile errors on Solaris and FreeBSD - * Updated URL to get license key, userId, and product Ids in conf/GeoIP.conf.default - * Updated test case, removed www.asahi.com - * Added support for GEOIP_INDEX_CACHE - which just caches - the most frequently access index portion of the database, resulting - in faster lookups than GEOIP_STANDARD, but less memory usage than - GEOIP_MEMORY_CACHE (Frank Mather) - -1.3.7 2004-10-5 - * Updated test case, removed www.bundesregierung.de added www.asahi.com - -1.3.6 2004-8-8 - * Check for gethostbyname_r support in configure (Mac OS X doesn't support gethostbyname_r) - * Made GeoIP City code thread safe - * Fixed bug with geoipupdate reading in product ids - * Added support for GeoIP Netspeed geoipupdate - * Fix memleak in lookupaddress (Ludwig Nussel/SUSE) - * Add prototype for _full_path_to to make 64bit clean - (Ludwig Nussel/SUSE) - * Add return values to test programs (Ludwig Nussel/SUSE) - -1.3.5 2004-7-5 - * Added more documentation to README file - * Made GEOIP_CHECK_CACHE work with GEOIP_STANDARD mode - reloads filehandle - in case file changes. - * Added GeoIP_country_code_by_ipnum and GeoIP_id_by_ipnum to use - existing ulong IP Address in numeric form instead of having to - convert it to string (Boris Hajduk) - * Made code thread safe by replacing gethostbyname with gethostbyname_r - -1.3.4 2004-6-4 - * Fixed bug where *.gz file(s) didn't get removed after geoipupdate - -1.3.3 2004-6-2 - * Added support for NetSpeed lookup to geoiplookup - * inet_addr patch for 64 bit systems (Thomas Steudten) - * Added Support for automated downloads of GeoIP Region, City, ISP and Organization databases (Frank Mather) - * INADDR_NONE Patch for Solaris 9 (John Young) - -1.3.2 2004-4-20 - * Added support for Maxmind NetSpeed - -MinGW patch from Stanislaw Pusep - -I was re-compiling Geolizer (http://sysd.org/log.php#glzr) on Win32 so I firstly needed to put up-to-date Win32 compatibility of libGeoIP itself. Fortunately MinGW plataform evolved a lot since last time I used it to compile libGeoIP. I'm sending you the patch with changes required for libGeoIP to work on both Win32 and UN*X. UN*X behavior is unaffected. Now, detailed explanation of what I did at all: -1) Made correct header imports for both Win32 and UN*X. UN*X imports netdb.h & netinet/in.h and Win32 imports windows.h & winsock.h -2) Win32 gethostbyname() is only able to resolve hostnames, it can't convert "127.0.0.1" string to 32-bit IP address. Thus I added lookupaddress() function that safely resolves any string to IP address and replaced all gethostbyname() calls by it. -3) Database files were referenced by pre-compiled static strings. I malloc()ed buffers for file names so they can be changed "on fly". Thus, on Win32 version GeoIP.dat & other files are being seeked in the same directory as executable file or library. -4) Added README.MinGW file with brief explanation on how to get GeoIP working under MinGW system. - -1.3.1 2003-11-11 - * Check for stdint.h in autoconf (Sean Chittenden) - * prevent the geoipupdate man page from trying to install itself directly in the system directory (Gyepi Sam) - -1.3.0 2003-09-29 - * Fixed includes to compile on Windows (Fabrice Colin) - * Removed the _addr_to_num() calls from GeoIP_*_by_name() - * _seek_record() optimizations (Maurice Cinquini) -  1) Use a single buf ptr inside the loops. -     Set to the stack buffer or the cached memory the start of the function. -  2) Unroll the i=0,1 loop to allow constant folding. -  3) Unroll the j loop for the common case of j = STANDARD_RECORD_LENGTH -     (I've already done the above changes see attached function.) -     With gcc -O2 calculating x[0] and x[1] for STANDARD_RECORD_LENGTH now -     only takes 15 (was > 100) i80x86 instructions with 6 byte accesses of RAM. 4) only calculate x[0], x[1] when needed, may be a bigger win - than the above since all the other optimizations above only reduced - CPU instructions operating on CPU cached RAM. - ! IMPORTANT API Change: Changed GeoIPRegion to have region in structure. Saves space and a malloc. - Since GeoIPRegion.region is no longer a pointer but an in-structure - array so test the first byte of region == 0 rather testing if the region - pointer is NULL. (Maurice Cinquini) - * Added GeoIP_assign_region_by_inetaddr which doesn't do any mallocs and made all other region APIs go thru it (Maurice Cinquini) - * Replaced _h_addr_to_num() with ntohl() and removed _h_addr_to_num() (Maurice Cinquini) - * Fixed bug when IP address not found in region rev1 database (Jason Linhart) - * Added added extern "C" to GeoIPCity.h fixes problems when included in C++ library - -1.2.2 2003-08-10 - * Added support for GeoIP ISP Edition identifier - * Fixed bug in GeoIP_database_info (Jason Linhart) - * Added support for GeoIP AS Number Edition - ! renamed GeoIP_org_by_* functions to GeoIP_name_by_* to reduce confusion - since these functions are used by GeoIP ISP and GeoIP ASNum as well - as GeoIP Organization - * Added support for GeoIP Proxy Edition - ! renamed GeoIP_country_id_by_* functions to GeoIP_id_by_* - -1.2.1 2003-07-12 - * Added GeoIP_record_id_by_addr and GeoIP_next_record functions - * Added support for new GeoIP Region format, including Canadian Provinces - -1.2.0 2003-04-26 - * Added support for GeoIP City format revision 1, including dma code and area code - * geoiplookup returns results from GeoIP Region, City, ISP and Organization databases - * Standardized location for GeoIP Region, City, ISP and Organization databases - * Added GeoIP_open_type to open database from default location for other dbs besides country - * Added check to make sure that the appropriate database is loaded for each lookup method - * Updated update code to check for first 12 characters of license key - * Added GeoIP_country_continent array to lookup continent by country ID - -1.1.9 2003-03-10 - * merged windows patch into main code base (Kenneth R. Robinette) - * Changed const int to #define for windows compatibility - -1.1.8 2003-03-04 - * Fixed bug with city database introduced in 1.1.6 - -1.1.7 2003-03-04 - * Fixed bug introduced in 1.1.6 when run in GEOIP_STANDARD mode - * Added test to test GEOIP_STANDARD - -1.1.6 2003-03-03 - * Added spec for building RPMs (Ryan Weaver) - * Added support for 4byte records for Organization database - * Changed Taiwan, Province of China to Taiwan - -1.1.5 2003-02-10 - * Added support for GeoIP Organization database - -1.1.4 2002-12-30 - * Cast number to int in _num_to_addr in geoipexport (Ralf S. Engelschall) - * Removed printf debug statements from geoipexport - * correct library build ordering (Ralf S. Engelschall) - * ulong -> unsigned long (Sean Chittenden) - -1.1.3 2002-12-24 - * Added GeoIPUpdate.h to EXTRA_DISTS - * Compile fixes for Solaris, FreeBSD (Michael McClennen, Corris Randall) - * Handle NULL in printf in test-geoip-region - -1.1.2 2002-12-16 - * Added support for postal codes - * Added geoipexport, program to export bit binary file to - binary tree format and csv format - * Split update code into separate library, GeoIPUpdate.la - * Allow passing NULL callback to GeoIP_update_database function - (Sean Chittenden) - * Added geoipexport program, exports to CSV file - * Added GeoIP_database_edition method - * Changed DATADIR to GEOIPDATADIR - -1.1.1 2002-11-07 - * Fixed segfault issue with GeoIPRegion_delete - * Handle test failures where lookup returns NULL more gracefully - -1.1.0 2002-11-06 - * Perform sanity checking before installing datebase using geoipupdate - * Removed file locking, since we install file by renaming instead of writing to it. - * Fixed geoipupdate to check for NULL return value - * Added constants for different editions - * Added O1 code for "Other country", used in per-country city editions - * fixed multi-line string literals warning in test-geoip.c - * Use enum constants for GeoIP_update_database values - * Added GEOIP_CHECK_CACHE option (not working yet) - -1.0.10 2002-10-28 - * IMPORTANT API Change - Return NULL instead of '--' and 'N/A' - Be sure to check the return value for NULL to avoid segmentation faults!!!! - * Added callback to print messages from GeoIP_update_database - * Moved GeoIPConfFile to geoipupdate.c - * Changed databaseSegments to unsigned int (Chris Gibbs) - * Fixed compiler warnings (Chris Gibbs) - * API Change - GeoIPRegion region member set to NULL when no region available - * Change short int to int (Chris Gibbs) - * Added write/read file locking for GeoIPUpdate.c/GeoIP.c - -1.0.9 2002-10-16 - * removed -ansi from Makefile.am to avoid compile error on Solaris 8 - * Compile fix for FreeBSD Stable (Kimura Fuyuki) - -1.0.8 2002-10-05 - * Included header required for *BSD (Akinori Musha) - -1.0.7 2002-10-05 - * Fixed compilation error with GeoIPUpdate.c - -1.0.6 2002-10-04 - * Moved update code into separate file - * Added md5 checksums to update code - * Fixed memory leak when running geoiplookup -v - * Moved const RECORD_LENGTH to #define RECORD_LENGTH for Windows compatibility - (Randy Kobes) - * Cleaned up GeoIP_new code - -1.0.5 2002-09-23 - * Supports GeoIP Regional Edition - * Macau is now "Macao" per ISO 3166-1 change - * Romania "ROM" is now "ROU" per ISO 3166-1 change - * Added #define for memcpy -> BSD's bcopy (Chris Gibbs) - * Removed "private" functions from GeoIP.h - -1.0.4 2002-08-27 - * rewrote _seek_country to use loop instead of recursion for faster performance - * Removed "orphan" nodes from demo database resulting in smaller size (Jason Linhart) - * Moved changes for building windows DLL into separate patch - * Fixed segfaults when passed malformed IP addresses - -1.0.3 2002-08-26 - * Added more changes for windows compatibility - (Stanislaw Pusep) - * Added benchmark program - -1.0.2 2002-08-21 - * Open database using "rb" for windows compatibility - (Stanislaw Pusep) - * Removed superfluous inet_ntop command (Stanislaw Pusep) - -1.0.1 2002-08-20 - * Fixed bug with resolving hostnames - * More fixes for compiler warnings (Chris Gibbs) - * Changed int to unsigned int in _is_ipaddr (Chris Gibbs) - -1.0.0 2002-08-12 - * Changed license to GPL - * Don't perform Reverse DNS lookups on IP addresses - * Only include getopt.h on Linux (OpenPKG patch) - * Avoid the_license_key_str warning (OpenPKG patch) - * Added license for March 2002 database - -0.3.0 2002-08-04 - * Added support for 'A2', Satellite Providers - -0.2.8 2002-07-30 - * Handle malformed input gracefully - * Added section to README on Solaris workarounds - * Added geoipupdate man page - -0.2.7 2002-07-27 - * Added section to README on automatic updates - * link to socket library on solaris - -0.2.6 2002-07-25 - * optimized GeoIP_open (Chris Gibbs) - * check for partial file read in GeoIP_open (Chris Gibbs) - * optimized _addr_to_num() (Chris Gibbs) - * changed write and read to send and recv for sockets - * Only install GeoIP.conf and GeoIP.dat if not already installed - -0.2.5 2002-07-22 - * Added verbose option to GeoIP_update_database - -0.2.4 2002-07-22 - * Fix for GeoIP_update_database - -0.2.3 2002-07-22 - * Fixes for FreeBSD - * All calls to malloc are checked for NULL pointer (Chris Gibbs) - * Fixed spelling of "Kazakhstan" (Chris Gibbs) - * Initialize cache_buf to NULL (Chris Gibbs) - * More memory leak fixes (Chris Gibbs) - -0.2.2 2002-07-18 - * Added update database function - * Fixed memory leak in GeoIP_new (Chris Gibbs) - -0.2.1 2002-07-03 - * Added support for anonymous proxies - -0.2.0 2002-06-23 - * Added new memory caching option for improved performance - -0.1.7 2002-05-29 - * Only add -lnsl for systems that support libnsl - * Added decl for 3 letter country code array to GeoIP.h - -0.1.6 2002-05-25 - * Added 3 letter country code - -0.1.5 2002-05-23 - * Added -lnsl fixed compile errors - -0.1.4 2002-05-11 - * Fixed bugs in demo March 2002 database - -0.1.3 2002-04-21 - * Fixed bug related to signed int (Brian Grossman) - * Better error handling when hostname not found - * Fixed bug when netmask=32 for netblock - -0.1.2 2002-04-20 - * Added two new functions, GeoIP_country_id_by_addr - and GeoIP_country_id_by_name. - * Made GeoIP_country_code and GeoIP_country_name - viewable outside of library, to be with with - GeoIP_country_id_by_* functions. - -0.1.1 2002-04-07 - * GeoIP.h is now installed to includedir - * constructor and destructor are now provided by - GeoIP_new, GeoIP_open, and GeoIP_delete - -0.1.0 2002-04-07 - * Initial release diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in b/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in deleted file mode 100644 index 072cd1f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in +++ /dev/null @@ -1,80 +0,0 @@ -Name: @PACKAGE@ -Version: @VERSION@ -Summary: GeoIP is a C library finds the location of an IP address. -Release: 1 -Group: System Environment/Libraries -URL: http://www.maxmind.com/app/c -Vendor: MaxMind LLC -Source0: http://www.maxmind.com/download/geoip/api/c/GeoIP-%{version}.tar.gz -License: GPL -BuildRoot: %{_tmppath}/%{name}-%{version}-root - -%description -GeoIP is a C library that enables the user to find geographical and -network information of an IP address. -Included is a free GeoLite Country database -that is updated at the beginning of every month. -To download the latest free GeoLite Country database, go to: -http://www.maxmind.com/app/geoip_country - -There is also a free city-level geolocation database, GeoLite City, -available from: -http://www.maxmind.com/app/geolitecity - -%package devel -Summary: GeoIP headers, libraries -Group: Development/Libraries -Requires: %name = %{version} - -%description devel -This package contain the devel files for GeoIP. - -%prep -%setup -q - -%build -%configure -make -make check - -%install -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT -%makeinstall -# Fixup permissions on shared libraries so that findreqs will work right. -chmod 755 $RPM_BUILD_ROOT/%{_libdir}/* - -%clean -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT - -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig - -%files -%defattr(-,root,root) -%doc AUTHORS COPYING ChangeLog README TODO -%attr(0755,root,root) %{_libdir}/*.so.*.* -%{_bindir}/* -%{_sysconfdir}/* -%dir %{_datadir}/GeoIP -%{_datadir}/GeoIP/* -%{_libdir}/*.so -%{_mandir}/*/* - -%files devel -%{_includedir}/* -%{_libdir}/*.a -%{_libdir}/*.la - -%changelog -* Fri Apr 14 2006 Thomas Mather -- Updated description to reference free GeoLite City database - -* Thu Jul 7 2005 Thomas Mather -- Updated description to reflect monthly updates for free country database. - -* Mon Sep 8 2003 Dr. Peter Bieringer -- Fix for RHL 9, created a new devel package definition. - -* Thu Feb 27 2003 Ryan Weaver -- Initial RPM Build diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch b/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch deleted file mode 100644 index 98119fc2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch +++ /dev/null @@ -1,183 +0,0 @@ -Index: GeoIP.c -=================================================================== -RCS file: /home/maxmind/geoip/c/libGeoIP/GeoIP.c,v -retrieving revision 1.32 -retrieving revision 1.33 -diff -u -r1.32 -r1.33 ---- GeoIP.c 25 Aug 2002 22:42:48 -0000 1.32 -+++ GeoIP.c 27 Aug 2002 06:50:02 -0000 1.33 -@@ -23,16 +23,24 @@ - #include - #include - #include -+#ifndef _WIN32 - #include -+#endif /* _WIN32 */ - #include - #include /* for fstat */ - #include /* for fstat */ - #include "zlib.h" - #include "time.h" - -+#ifndef _WIN32 -+#include - #include - #include - #include -+#else -+#include -+#include -+#endif /* _WIN32 */ - - #define COUNTRY_BEGIN 16776960; - const int RECORD_LENGTH = 3; -@@ -57,9 +65,66 @@ - const char *GeoIPUpdateHost = "updates.maxmind.com"; - const char *GeoIPHTTPRequest = "GET /app/update?license_key=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; - -+#ifdef _WIN32 -+char * _dat_in_module_path () { -+ HMODULE GeoIPdll; -+ struct _stat st; -+ int i; -+ char * buf; -+ -+ buf = (char *) malloc(MAX_PATH); -+ -+ GeoIPdll = GetModuleHandle("GeoIP.dll"); -+ if (!GeoIPdll) -+ { -+ GeoIPdll = GetModuleHandle(NULL); -+ if (!GeoIPdll) -+ return NULL; -+ } -+ GetModuleFileName(GeoIPdll, buf, MAX_PATH); -+ for (i = strlen(buf); (i >= 0) && (buf[i] != '\\'); i--); -+ if (i) -+ { -+ buf[i] = '\0'; -+ strcat(buf, "\\"); -+ strcat(buf, GeoIPDBFileName); -+ if (_stat(buf, &st) == 0) -+ return buf; -+ } -+ -+ free(buf); -+ return NULL; -+} -+ -+char * _dat_path_in_regkey () { -+ DWORD lpdwDisposition, type, size = MAX_PATH; -+ HKEY hkGeoIP; -+ char * buf, * filename; -+ -+ buf = (char *) malloc(MAX_PATH); -+ filename = (char *) malloc(MAX_PATH); -+ -+ if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MaxMind\\GeoIP", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkGeoIP, &lpdwDisposition) != ERROR_SUCCESS) -+ return NULL; -+ if (RegQueryValueEx(hkGeoIP, "DATADIR", 0, &type, buf, &size) != ERROR_SUCCESS) -+ strcpy(buf, "%SystemRoot%\\SYSTEM32"); -+ if (RegSetValueEx(hkGeoIP, "DATADIR", 0, REG_EXPAND_SZ, buf, strlen(buf)) != ERROR_SUCCESS) -+ return NULL; -+ ExpandEnvironmentStrings(buf, filename, MAX_PATH); -+ -+ free(buf); -+ strcat(filename, "\\"); -+ strcat(filename, GeoIPDBFileName); -+ -+ return filename; -+} -+#endif /* _WIN32 */ -+ - GeoIP* GeoIP_new (int flags) { - char * filename; - GeoIP * gi; -+ -+#ifndef _WIN32 - filename = malloc(sizeof(char) * (strlen(DATADIR)+strlen(GeoIPDBFileName)+2)); - if (filename == NULL) - return NULL; -@@ -67,6 +132,17 @@ - strcat(filename, DATADIR); - strcat(filename, "/"); - strcat(filename, GeoIPDBFileName); -+#else -+ filename = _dat_in_module_path(); -+ if (filename == NULL) -+ filename = _dat_path_in_regkey(); -+ if (filename == NULL) -+ { -+ fprintf(stderr,"Unable to query registry for database location\n"); -+ return NULL; -+ } -+#endif /* _WIN32 */ -+ - gi = GeoIP_open (filename, flags); - free(filename); - return gi; -@@ -96,7 +172,7 @@ - } - gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); - if (gi->cache != NULL) { -- if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != buf.st_size) { -+ if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (unsigned) buf.st_size) { - fprintf(stderr,"Error reading file %s\n",filename); - free(gi->cache); - free(gi); -Index: GeoIP.h -=================================================================== -RCS file: /home/maxmind/geoip/c/libGeoIP/GeoIP.h,v -retrieving revision 1.19 -retrieving revision 1.20 -diff -u -r1.19 -r1.20 ---- GeoIP.h 20 Aug 2002 00:52:00 -0000 1.19 -+++ GeoIP.h 27 Aug 2002 06:50:02 -0000 1.20 -@@ -45,25 +45,31 @@ - extern const char * GeoIP_country_name[246]; - extern const char * GeoIPConfFile; - --GeoIP* GeoIP_new(int flags); --GeoIP* GeoIP_open(char * filename, int flags); --void GeoIP_delete(GeoIP* gi); --const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); --const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); --const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); --short int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); --short int GeoIP_country_id_by_name (GeoIP* gi, const char *host); -+#ifdef _WIN32 -+#define GEOIP_API __declspec(dllexport) -+#else -+#define GEOIP_API -+#endif /* _WIN32 */ - --char *GeoIP_database_info (GeoIP* gi); --short int GeoIP_update_database (GeoIP* gi, char * license_key, int verbose); -+GEOIP_API GeoIP* GeoIP_new(int flags); -+GEOIP_API GeoIP* GeoIP_open(char * filename, int flags); -+GEOIP_API void GeoIP_delete(GeoIP* gi); -+GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); -+GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); -+GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); -+GEOIP_API short int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API short int GeoIP_country_id_by_name (GeoIP* gi, const char *host); - --int _seek_country (GeoIP* gi, const int offset, unsigned long ipnum, int depth); --unsigned long _addr_to_num (const char *addr); --unsigned long _h_addr_to_num (unsigned char *addr); --short int _is_ipaddr (const char *name); -+GEOIP_API char *GeoIP_database_info (GeoIP* gi); -+GEOIP_API short int GeoIP_update_database (GeoIP* gi, char * license_key, int verbose); -+ -+GEOIP_API int _seek_country (GeoIP* gi, const int offset, unsigned long ipnum, int depth); -+GEOIP_API unsigned long _addr_to_num (const char *addr); -+GEOIP_API unsigned long _h_addr_to_num (unsigned char *addr); - - #ifdef __cplusplus - } diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL b/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL deleted file mode 100644 index 7d1c323b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am deleted file mode 100644 index bd4da3a3..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -INCLUDES = -Wall -ansi - -SUBDIRS = \ - libGeoIP \ - apps \ - conf \ - data \ - test \ - man - -EXTRA_DIST = README.OSX READMEwin32static.txt README.MinGW READMEwin32.txt GeoIPWinDLL.patch TODO bootstrap GeoIP.spec GeoIP.spec.in Makefile.netware Makefile.vc Makefile.win32 get_ver.awk geoip.ico diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in deleted file mode 100644 index c2a5d3f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in +++ /dev/null @@ -1,707 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/GeoIP.spec.in \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - TODO config.guess config.sub depcomp install-sh ltmain.sh \ - missing -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = GeoIP.spec -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = -Wall -ansi -SUBDIRS = \ - libGeoIP \ - apps \ - conf \ - data \ - test \ - man - -EXTRA_DIST = README.OSX READMEwin32static.txt README.MinGW READMEwin32.txt GeoIPWinDLL.patch TODO bootstrap GeoIP.spec GeoIP.spec.in Makefile.netware Makefile.vc Makefile.win32 get_ver.awk geoip.ico -all: all-recursive - -.SUFFIXES: -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): -GeoIP.spec: $(top_builddir)/config.status $(srcdir)/GeoIP.spec.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool config.lt - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-libtool \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware deleted file mode 100644 index 44a569de..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware +++ /dev/null @@ -1,301 +0,0 @@ -################################################################### -# -## Makefile for building GeoIP stuff (NetWare version - gnu make) -## To build the binaries you need awk, GNU make and gcc / nlmconv -## or Metrowerks CodeWarrior CommandlineTools. -## Usage: make -f Makefile.netware [all|dist|clean|distclean] -## -## hacked by: Guenter Knauf -# -################################################################### - -# Edit the path below to point to the base of your Novell NDK. -ifndef NDKBASE -NDKBASE = c:/novell -endif - -# Edit the path below to point to your zlib sources and libs. -ifndef ZLIBSDK -ZLIBSDK = d:/projects/cw/zlib-1.2.3 -endif - -ifndef DISTDIR -DISTDIR = GeoIP-$(GEOIP_VERSION_STR)-bin-nw -endif -ARCHIVE = $(DISTDIR).zip - -# Edit the vars below to change NLM target settings. -TARGETS := $(patsubst apps/%.c,%.nlm,$(wildcard apps/*.c)) -DESCR = $(subst .def,,$(notdir $@)) $(GEOIP_VERSION_STR) -COMPANY = MaxMind LLC -COPYR = Copyright (C) 2003-2006 MaxMind LLC All Rights Reserved. -WWWURL = http://www.maxmind.com/app/c -MTSAFE = YES -STACK = 64000 -#SCREEN = none -DATADIR = sys:/etc/GeoIP -CONFDIR = sys:/etc - -# Comment the line below if you dont want to link with the static libz.lib. -LSTATIC = 1 - -# Edit the var below to point to your lib architecture. -ifndef LIBARCH -LIBARCH = LIBC -endif - -# must be equal to DEBUG or NDEBUG -DB = NDEBUG -# DB = DEBUG -# Optimization: -O or debugging: -g -ifeq ($(DB),NDEBUG) - OPT = -O2 - OBJDIR = release -else - OPT = -g - OBJDIR = debug -endif -OBJLIB = lib-$(OBJDIR) - -# Include the version info retrieved from header. --include $(OBJDIR)/version.inc - -# Global tools and toolflags used with all compilers. -ZIP = zip -qzR9 -CP = cp -afv -MV = mv -fv -# RM = rm -f -# if you want to mark the target as MTSAFE you will need a tool for -# generating the xdc data for the linker; here's a minimal tool: -# http://www.gknw.com/development/prgtools/mkxdc.zip -MPKXDC = mkxdc - -# The following line defines your compiler. -ifdef METROWERKS - CC = mwccnlm -else - CC = gcc -endif - -# Global flags for all compilers -CFLAGS = $(OPT) -D$(DB) -DNETWARE -nostdinc -CFLAGS += -DGEOIPDATADIR=\"$(DATADIR)\" -CFLAGS += -DSYSCONFDIR=\"$(CONFDIR)\" - -ifeq ($(CC),mwccnlm) -LD = mwldnlm -LDFLAGS = -nostdlib $(PRELUDE) $(LDLIBS) $(LIBOBJS) $(OBJDIR)/$(basename $@).o -o $@ -commandfile -AR = mwldnlm -ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o -LIBEXT = lib -CFLAGS += -msgstyle gcc -gccinc -opt nointrinsics -proc 586 -CFLAGS += -relax_pointers -#CFLAGS += -w on -ifeq ($(LIBARCH),LIBC) - PRELUDE = $(SDK_LIBC)/imports/libcpre.o - CFLAGS += -align 4 -else - PRELUDE = "$(METROWERKS)/Novell Support/Libraries/runtime/prelude.obj" -# CFLAGS += -include "$(METROWERKS)/Novell Support/Headers/nlm_prefix.h" - CFLAGS += -align 1 -endif -else -LD = nlmconv -LDFLAGS = -T -AR = ar -ARFLAGS = -cq -LIBEXT = lib -CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing -CFLAGS += -Wall -Wno-unused #-Wno-format # -pedantic -ifeq ($(LIBARCH),LIBC) - PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o -else - PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o - CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h -endif -endif -DESCR += ($(LIBARCH)) - $(CC) build - -NDK_ROOT = $(NDKBASE)/ndk -SDK_CLIB = $(NDK_ROOT)/nwsdk -SDK_LIBC = $(NDK_ROOT)/libc - -ifeq ($(LIBARCH),LIBC) - INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks - # INCLUDES += -I$(SDK_LIBC)/include/winsock - CFLAGS += -D_POSIX_SOURCE - # CFLAGS += -D__ANSIC__ -else - INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include - # INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete - CFLAGS += -DNETDB_USE_INTERNET -endif - -INCLUDES += -I./libGeoIP -INCLUDES += -I$(ZLIBSDK) -CFLAGS += $(INCLUDES) - -ifeq ($(MTSAFE),YES) - XDCOPT = -n -endif -ifeq ($(MTSAFE),NO) - XDCOPT = -u -endif - -LIBPATH += -L$(ZLIBSDK)/nw/release -ifdef LSTATIC - LDLIBS += $(ZLIBSDK)/nw/release/libz.$(LIBEXT) -else - IMPORTS += @$(ZLIBSDK)/nw/release/libz.imp - MODULES += libz -endif - -ifeq ($(findstring linux,$(OSTYPE)),linux) -DL = ' -#-include $(NDKBASE)/nlmconv/ncpfs.inc -endif - -vpath %.c ./apps ./libGeoIP - -LIBOBJS = $(OBJLIB)/GeoIP.o $(OBJLIB)/GeoIPCity.o -UPDOBJS = $(OBJLIB)/GeoIPUpdate.o $(OBJLIB)/md5.o -LIBOBJS += $(UPDOBJS) - -.PRECIOUS: $(OBJLIB)/%.o $(OBJDIR)/%.o $(OBJDIR)/%.def - - -all: prebuild $(TARGETS) - -prebuild: $(OBJLIB) $(OBJDIR) $(OBJDIR)/version.inc - -dist: $(DISTDIR) all $(DISTDIR)/readme_bin.txt - @$(CP) *.nlm $(DISTDIR) - @$(CP) Changelog $(DISTDIR) - @$(CP) README $(DISTDIR) - @$(CP) conf/GeoIP.conf.default $(DISTDIR) - @$(CP) data/GeoIP.dat $(DISTDIR) - @echo Creating $(ARCHIVE) - @$(ZIP) $(ARCHIVE) $(DISTDIR)/* < $(DISTDIR)/readme_bin.txt - -clean: - -$(RM) -r $(OBJDIR) $(OBJLIB) - -$(RM) $(TARGETS) - -distclean: - -$(RM) -r $(DISTDIR) - -$(RM) $(ARCHIVE) - -%.nlm: $(OBJDIR)/%.def $(LIBOBJS) $(OBJDIR)/%.o $(OBJDIR)/%.xdc - @echo Linking $@ - @-$(RM) $@ - @$(LD) $(LDFLAGS) $< - -$(DISTDIR): - @mkdir $@ - -$(OBJDIR): - @mkdir $@ - -$(OBJLIB): - @mkdir $@ - -$(OBJDIR)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJLIB)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)/version.inc: configure.in $(OBJDIR) - @echo Creating $@ - @awk -f get_ver.awk $< > $@ - -$(OBJDIR)/%.xdc: Makefile.netware - @echo Creating $@ - @$(MPKXDC) $(XDCOPT) $@ - -$(OBJDIR)/%.def: Makefile.netware - @echo Creating $@ - @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@ - @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@ - @echo $(DL)# All your changes will be lost!!$(DL) >> $@ - @echo $(DL)#$(DL) >> $@ - @echo $(DL)copyright "$(COPYR)"$(DL) >> $@ - @echo $(DL)description "$(DESCR)"$(DL) >> $@ - @echo $(DL)version $(GEOIP_VERSION)$(DL) >> $@ -ifdef NLMTYPE - @echo $(DL)type $(NLMTYPE)$(DL) >> $@ -endif -ifdef STACK - @echo $(DL)stack $(STACK)$(DL) >> $@ -endif -ifdef SCREEN - @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@ -else - @echo $(DL)screenname "DEFAULT"$(DL) >> $@ -endif -ifeq ($(DB),DEBUG) - @echo $(DL)debug$(DL) >> $@ -endif - @echo $(DL)threadname "$(subst .def,,$(notdir $@))"$(DL) >> $@ -ifdef XDCOPT - @echo $(DL)xdcdata $(@:.def=.xdc)$(DL) >> $@ -endif -ifeq ($(LDRING),0) - @echo $(DL)flag_on 16$(DL) >> $@ -endif -ifeq ($(LDRING),3) - @echo $(DL)flag_on 512$(DL) >> $@ -endif -ifeq ($(LIBARCH),CLIB) - @echo $(DL)start _Prelude$(DL) >> $@ - @echo $(DL)exit _Stop$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@ - @echo $(DL)module clib$(DL) >> $@ -else - @echo $(DL)flag_on 64$(DL) >> $@ - @echo $(DL)pseudopreemption$(DL) >> $@ - @echo $(DL)start _LibCPrelude$(DL) >> $@ - @echo $(DL)exit _LibCPostlude$(DL) >> $@ - @echo $(DL)check _LibCCheckUnload$(DL) >> $@ - @echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@ - @echo $(DL)module libc$(DL) >> $@ -endif -ifdef MODULES - @echo $(DL)module $(MODULES)$(DL) >> $@ -endif -ifdef EXPORTS - @echo $(DL)export $(EXPORTS)$(DL) >> $@ -endif -ifdef IMPORTS - @echo $(DL)import $(IMPORTS)$(DL) >> $@ -endif -ifeq ($(LD),nlmconv) -ifdef LDLIBS - @echo $(DL)input $(LDLIBS)$(DL) >> $@ -endif - @echo $(DL)input $(PRELUDE)$(DL) >> $@ - @echo $(DL)input $(LIBOBJS)$(DL) >> $@ - @echo $(DL)input $(@:.def=.o)$(DL) >> $@ - @echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@ -endif - -$(DISTDIR)/readme_bin.txt: Makefile.netware - @echo Creating $@ - @echo $(DL)This is a binary distribution for NetWare platform.$(DL) > $@ - @echo $(DL)GeoIP version $(GEOIP_VERSION_STR)$(DL) >> $@ -ifndef LSTATIC - @echo $(DL)These binaries depend on libz.nlm in the search path!$(DL) >> $@ -endif - @echo $(DL)Please download the complete GeoIP package for$(DL) >> $@ - @echo $(DL)any further documentation:$(DL) >> $@ - @echo $(DL)$(WWWURL)$(DL) >> $@ - -info: - @echo Targets to build: $(TARGETS) - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc deleted file mode 100644 index bd575955..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc +++ /dev/null @@ -1,84 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -################################################################# -# configuration section -################################################################ - -# place to put the GeoIP.dat database file -# !!! Please keep the 2 \\ as directory separators !!! -# -GEOIPDATADIR="C:\\Windows\\SYSTEM32" -# -# System inc, lib, and bin directories -!ifndef INSTDIR -INSTDIR="C:\GeoIP-1.4.5" -!endif - -# Location where GeoIP.lib should be installed my "make install" -INSTALL_LIB=$(INSTDIR)\Lib - -#Location where .h files should be installed by "make install". -INSTALL_INC=$(INSTDIR)\Include - -#Location where programs should be installed by "make install". -INSTALL_BIN=$(INSTDIR)\Bin - -################################################################ -# end configuration section -################################################################ - -DATA_DIR=data - -DATA_FILE=GeoIP.dat - -LIB_DIR = libGeoIP - -TEST_DIR=test - -APP_DIR=apps - -GEOIP_LIB = GeoIP.lib - -APP_PROGRAMS = geoiplookup.exe - -TEST_PROGRAMS = benchmark.exe test-geoip.exe - -all: GeoIP.lib test_progs app_progs - -$(GEOIP_LIB): - cd $(LIB_DIR) - $(MAKE) -nologo -f Makefile.vc GEOIPDATADIR=$(GEOIPDATADIR) - cd .. - -test_progs: - cd $(TEST_DIR) - $(MAKE) -nologo -f Makefile.vc - cd .. - -app_progs: - cd $(APP_DIR) - $(MAKE) -nologo -f Makefile.vc - cd .. - -test: $(GEOIP_LIB) test_progs - cd $(TEST_DIR) - benchmark.exe - test-geoip.exe - cd .. - -install: $(GEOIP_LIB) app_progs - cd $(LIB_DIR) - copy $(GEOIP_LIB) $(INSTALL_LIB) - copy *.h $(INSTALL_INC) - cd ..\$(APP_DIR) - copy $(APP_PROGRAMS) $(INSTALL_BIN) - cd ..\$(DATA_DIR) - copy $(DATA_FILE) $(GEOIPDATADIR) - cd .. - -clean: - del $(LIB_DIR)\*.obj $(LIB_DIR)\*.lib \ - $(APP_DIR)\*.obj $(APP_DIR)\*.exe \ - $(TEST_DIR)\*.obj $(TEST_DIR)\*.exe - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 deleted file mode 100644 index a8902d67..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 +++ /dev/null @@ -1,232 +0,0 @@ -################################################################### -# -## Makefile for building GeoIP stuff (Win32 version - gnu make) -## To build the binaries you need awk, GNU make and MingW32 gcc -## or Metrowerks CodeWarrior CommandlineTools. -## Usage: make -f Makefile.win32 [all|dist|clean|distclean] -## -## hacked by: Guenter Knauf -# -################################################################### - -# Edit the path below to point to your zlib sources and libs. -ifndef ZLIBSDK -ZLIBSDK = d:/projects/mingw32/zlib-1.2.3 -endif - -ifndef DISTDIR -DISTDIR = GeoIP-$(GEOIP_VERSION_STR)-bin-w32 -endif -ARCHIVE = $(DISTDIR).zip - -# Edit the vars below to change EXE target settings. -TARGETS := $(patsubst apps/%.c,%.exe,$(wildcard apps/*.c)) -DESCR = $(subst .rc,,$(notdir $@)) $(GEOIP_VERSION_STR) -COMPANY = MaxMind LLC -COPYR = © 2003-2006 MaxMind LLC All Rights Reserved. -WWWURL = http://www.maxmind.com/app/c -LICENSE = Licensed under LGPL -ICON = geoip.ico -DATADIR = c:/GeoIP -CONFDIR = c:/GeoIP - -# Comment the line below if you dont want to link with the static libz.lib. -LSTATIC = 1 - -# must be equal to DEBUG or NDEBUG -DB = NDEBUG -# DB = DEBUG -# Optimization: -O or debugging: -g -ifeq ($(DB),NDEBUG) - OPT = -O2 - OBJDIR = release -else - OPT = -g - OBJDIR = debug -endif -OBJLIB = lib-$(OBJDIR) - -# Include the version info retrieved from header. --include $(OBJDIR)/version.inc - -# Global tools and toolflags used with all compilers. -ZIP = zip -qzR9 -CP = cp -afv -MV = mv -fv -# RM = rm -f -RE = reimp -d -DLLTOOL = dlltool -DTFLAGS = -k - -# The following line defines your compiler. -ifdef METROWERKS - CC = mwcc -else - CC = gcc -endif - -# Global flags for all compilers -CFLAGS = $(OPT) -D$(DB) -D_WIN32 -# -nostdinc -CFLAGS += -DHAVE_STDINT_H -CFLAGS += -DGEOIPDATADIR=\"$(DATADIR)\" -CFLAGS += -DSYSCONFDIR=\"$(CONFDIR)\" - -ifeq ($(CC),mwcc) -LD = mwld -LDFLAGS = -nostdlib -LIBPATH = -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support/Libraries" -CWLIBS = -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib -LDLIBS = -lkernel32.lib -luser32.lib $(CWLIBS) -AR = mwld -ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o -LIBEXT = lib -RC = mwwinrc -CFLAGS += -nostdinc -CFLAGS += -msgstyle gcc -gccinc -opt nointrinsics -proc 586 -CFLAGS += -relax_pointers -#CFLAGS += -w on -CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support/Headers" -else -LD = gcc -LDFLAGS = -s -AR = ar -ARFLAGS = -cq -LIBEXT = a -RC = windres -RCFLAGS = -I rc -O coff -i -CFLAGS += -Wall -Wno-unused # -Wno-format #-pedantic -endif - -INCLUDES += -I./libGeoIP -INCLUDES += -I$(ZLIBSDK) -CFLAGS += $(INCLUDES) - -LDLIBS += -lwsock32 -LIBPATH += -L$(ZLIBSDK) -ifdef LSTATIC - LDLIBS += -lz -else - LDLIBS += -lzdll -endif - -ifeq ($(findstring linux,$(OSTYPE)),linux) -DL = ' -#-include $(NDKBASE)/nlmconv/ncpfs.inc -endif - -vpath %.c ./apps ./libGeoIP - -LIBOBJS = $(OBJLIB)/GeoIP.o $(OBJLIB)/GeoIPCity.o -UPDOBJS = $(OBJLIB)/GeoIPUpdate.o $(OBJLIB)/md5.o -LIBOBJS += $(UPDOBJS) - -.PRECIOUS: $(OBJLIB)/%.o $(OBJDIR)/%.o $(OBJDIR)/%.rc - -all: prebuild $(TARGETS) - -prebuild: $(OBJLIB) $(OBJDIR) $(OBJDIR)/version.inc - -dist: $(DISTDIR) all $(DISTDIR)/readme_bin.txt - @$(CP) *.exe $(DISTDIR) - @$(CP) Changelog $(DISTDIR) - @$(CP) README $(DISTDIR) - @$(CP) conf/GeoIP.conf.default $(DISTDIR) - @$(CP) data/GeoIP.dat $(DISTDIR) - @echo Creating $(ARCHIVE) - @$(ZIP) $(ARCHIVE) $(DISTDIR)/* < $(DISTDIR)/readme_bin.txt - -clean: - -$(RM) -r $(OBJDIR) $(OBJLIB) - -$(RM) $(TARGETS) - -distclean: - -$(RM) -r $(DISTDIR) - -$(RM) $(ARCHIVE) - -%.exe: $(OBJDIR)/%.res $(LIBOBJS) $(OBJDIR)/%.o - @echo Linking $@ - @-$(RM) $@ - $(LD) $(LDFLAGS) -o $@ $^ $(LIBPATH) $(LDLIBS) -# $(LD) $(LDFLAGS) $(LIBPATH) $(LIBFILES) -o $@ $^ - -$(DISTDIR): - @mkdir $@ - -$(OBJDIR): - @mkdir $@ - -$(OBJLIB): - @mkdir $@ - -$(OBJDIR)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJLIB)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)/version.inc: configure.in $(OBJDIR) - @echo Creating $@ - @awk -f get_ver.awk $< > $@ - -$(OBJDIR)/%.res: $(OBJDIR)/%.rc - @echo Creating $@ - @$(RC) $(RCFLAGS) $< -o $@ - -$(OBJDIR)/%.rc: Makefile.win32 - @echo 1 VERSIONINFO > $@ - @echo FILEVERSION $(GEOIP_VERSION),0 >> $@ - @echo PRODUCTVERSION $(GEOIP_VERSION),0 >> $@ - @echo FILEFLAGSMASK 0x3fL >> $@ - @echo FILEOS 0x40004L >> $@ - @echo FILEFLAGS 0x0L >> $@ - @echo FILETYPE 0x1L >> $@ - @echo FILESUBTYPE 0x0L >> $@ - @echo BEGIN >> $@ - @echo BLOCK "StringFileInfo" >> $@ - @echo BEGIN >> $@ - @echo BLOCK "040904E4" >> $@ - @echo BEGIN >> $@ - @echo VALUE "LegalCopyright","$(COPYR)\0" >> $@ -ifdef COMPANY - @echo VALUE "CompanyName","$(COMPANY)\0" >> $@ -endif -ifdef LICENSE - @echo VALUE "License","$(LICENSE)\0" >> $@ -endif - @echo VALUE "ProductName","$(basename $(notdir $@))\0" >> $@ - @echo VALUE "ProductVersion","$(GEOIP_VERSION_STR)\0" >> $@ - @echo VALUE "FileDescription","$(DESCR)\0" >> $@ - @echo VALUE "FileVersion","$(GEOIP_VERSION_STR)\0" >> $@ - @echo VALUE "InternalName","$(basename $(notdir $@))\0" >> $@ - @echo VALUE "OriginalFilename","$(basename $(notdir $@)).exe\0" >> $@ - @echo VALUE "WWW","$(WWWURL)\0" >> $@ - @echo END >> $@ - @echo END >> $@ - @echo BLOCK "VarFileInfo" >> $@ - @echo BEGIN >> $@ - @echo VALUE "Translation", 0x409, 1252 >> $@ - @echo END >> $@ - @echo END >> $@ -ifdef ICON - @echo 10 ICON DISCARDABLE "$(ICON)" >> $@ -endif - -$(DISTDIR)/readme_bin.txt: Makefile.win32 - @echo Creating $@ - @echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@ - @echo $(DL)GeoIP version $(GEOIP_VERSION_STR)$(DL) >> $@ -ifndef LSTATIC - @echo $(DL)These binaries depend on zlib1.dll in the search path!$(DL) >> $@ -endif - @echo $(DL)Please download the complete GeoIP package for$(DL) >> $@ - @echo $(DL)any further documentation:$(DL) >> $@ - @echo $(DL)$(WWWURL)$(DL) >> $@ - -info: - @echo Targets to build: $(TARGETS) - - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/NEWS b/Src/Plugins/DSP/sc_serv3/GeoIP/NEWS deleted file mode 100644 index e69de29b..00000000 diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README b/Src/Plugins/DSP/sc_serv3/GeoIP/README deleted file mode 100644 index a1b67256..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README +++ /dev/null @@ -1,208 +0,0 @@ - GeoIP 1.4.8 - ----------- - -*** Experimental IPv6 notice *** - -- the experimental IPv6 part of libGeoIP may change in the future. -- It is possible, that geoiplookup and geoiplookup6 will merged. - -*** - -The new perl script geoipupdate-pureperl.pl is a drop in replacement for -geoipupdate. Useful, if you like to customize, pre or postprocess new or -old databases. To archive the databases or signal apache whatever. -Another advantage is, that geoipupdate-pureperl.pl is able to handle proxy -requests even with authentication. - -IMPORTANT API Change for 1.3.x and above users for GeoIP Region database -GeoIPRegion.region is no longer a pointer but an in-structure -array so test the first byte of region == 0 rather testing if the region -pointer is NULL. - -IMPORTANT API Change for 1.1.x and above users - as of GeoIP 1.1.0 the -GeoIP_country_xxx_by_xxx functions return NULL if a country can not -be found (it used to return '--' or 'N/A'. Be sure to check the -return value for NULL, to avoid segmentation faults! - -GeoIP is a C library that enables the user to find geographical and -network information of an IP address. -Included is a free GeoLite Country database -that is updated at the beginning of every month. -To download the latest free GeoLite Country database, go to: -http://www.maxmind.com/app/geoip_country - -There is also a free city-level geolocation database, GeoLite City, -available from: -http://www.maxmind.com/app/geolitecity - -We also offer commercial GeoIP databases with greater accuracy and -additional network information, for more details, see: -http://www.maxmind.com/app/products - -As of version 1.4.5 geoipupdate can handle updates via HTTP Proxy Server. -If the environ variable http_proxy="http://proxy-host:port" is set. -The username:password (as in FTP URLs) is not supported! -Thanks to Andrew Droffner for the patch! - -As of version 1.3.6, the GeoIP C library is thread safe, as long as -GEOIP_CHECK_CACHE is not used. - -This module can be used to automatically select the geographically closest -mirror, to analyze your web server logs to determine the countries of your -visitors, for credit card fraud detection, and for software export controls. - -If you use GeoIP to block access from high risk countries in order -to reduce fraud or abuse, you should also block access from known -proxy servers. For more details, see: -http://www.maxmind.com/app/proxy - -To install, run: - -./configure -make -make check -make install - -The GeoIP C library relies on GNU make, not on BSD make - -MEMORY CACHING AND OTHER OPTIONS - -There are four options available: - -GEOIP_STANDARD - read database from filesystem, uses least memory. - -GEOIP_MEMORY_CACHE - load database into memory, faster performance - but uses more memory - -GEOIP_CHECK_CACHE - check for updated database. If database has been updated, - reload filehandle and/or memory cache. - -GEOIP_INDEX_CACHE - just cache - the most frequently accessed index portion of the database, resulting - in faster lookups than GEOIP_STANDARD, but less memory usage than - GEOIP_MEMORY_CACHE - useful for larger databases such as - GeoIP Organization and GeoIP City. Note, for GeoIP Country, Region - and Netspeed databases, GEOIP_INDEX_CACHE is equivalent to GEOIP_MEMORY_CACHE - -GEOIP_MMAP_CACHE - load database into mmap shared memory ( MMAP is not avail for WIN32 ) - -The options can be combined using bit operators. For example you can -use both GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE by calling: - - GeoIP_open("/path/to/GeoIP.dat", GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE); - -By default, the city name is returned in iso-8859-1 charset. To obtain the -city name in utf8 instead, run: - - GeoIP_set_charset(gi, GEOIP_CHARSET_UTF8); - -To get the netmask of the netblock of the last lookup, use GeoIP_last_netblock(gi). - -EXAMPLES - -See -test/ - test-geoip.c - test-geoip-region.c - test-geoip-city.c - test-geoip-isp.c - test-geoip-org.c - test-geoip-netspeed.c - -for examples of how to use the API. The test-geoip.c program works with both the GeoLite and -GeoIP Country databases. The test-geoip-city.c program works with both the GeoLite and -GeoIP City databases. The other example programs require the paid databases available -from http://www.maxmind.com/app/products - -AUTOMATIC UPDATES - -MaxMind offers a service where you can have your database updated -automically each week. For more details see: - -http://www.maxmind.com/app/license_key - -RESOURCES Mailinglists - -Please join the very low traffic mailinglists you are interested in. - -http://sourceforge.net/mail/?group_id=66844 - -Preformance Patches. - -Patrick McManus provide a patch to enhance the lookupspeed in MEMORY_CACHE mode. If you feel, that the current MEMORY_CACHE mode is to slow try the patch: - -http://sourceforge.net/mailarchive/forum.php?forum_name=geoip-c-discuss&max_rows=25&style=nested&viewmonth=200803 - -TROUBLESHOOTING - -If you run into trouble building your application with GeoIP support, try adding -fms-extensions to your CFLAGS. If you use Solaris and there C-Compiler use -features=extensions instead. These options enable unnamed union support and fix problems like: 'improper member use: dma_code' or 'GeoIPRecord' has no member named 'dma_code'. - -Note that it is recommended that you use GNU make. Also, if you are using -OpenBSD, GeoIP requires OpenBSD 3.1 or greater. - -if you get "cannot load shared object file: No such file or directory" -error, add the directory libGeoIP.so was installed to to /etc/ld.so.conf -and run ldconfig - -On Solaris, if you get a -ld: fatal: relocations remain against allocatable but non-writable sections -error, try running - -# make clean -# ./configure --disable-shared -# make - -If you get a "ar : command not found" error, make sure that ar is -in your path. On Solaris, ar is typically found in /usr/ccs/bin - -If you get a "geoipupdate.c:24: getopt.h: No such file or directory" -error, run - -# export CPPFLAGS="-I/usr/local/include" - -(assuming that getopt.h is in /usr/local/include) - -If you get a "zlib.h: No such file or directory" error, make sure -that the zlib development libraries are installed on your server. -These are typically included in a "zlib-devel" package. - -If you get a "bad interpreter: No such file or directory" error -when running ./configure, make sure that there are no DOS -returns in the configure script. To remove DOS returns, -run perl -pi -e 's!\r!!g' configure. - -If gcc fails while consuming a large amount of memory, try -compiling with CFLAGS=-O1 (or -O0) instead of the default -O2. -It seems that some -versions of gcc have a bug and consume 1 GB of memory when optimizing -certain source files (the other source file where this was reported is -from XORG X-Server). It happens at least with gcc 3.3.1 and with gcc -4.2(.0). Thanks to Kai Schätzl for the report. - -If GEOIP_MMAP_CACHE doesn't work on a 64bit machine, try adding -the flag "MAP_32BIT" to the mmap call. - -If you get a "passing argument 3 of 'gethostbyname_r' from incompatible pointer type" -error on AIX, download and/or untar a fresh copy of GeoIP. ( To avoid cached -results from a previous ./configure run ) - -cd ./GeoIP-1.4.6 -then edit the file ./configure - -and delete these two lines: - -#define HAVE_GETHOSTBYNAME_R 1 - -#define GETHOSTBYNAME_R_RETURNS_INT 1 - -then save the configure script - -and build it as usual - -./configure -make -sudo make install - - - -To submit a patch, please contact support@maxmind.com diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW b/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW deleted file mode 100644 index 8a192f95..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW +++ /dev/null @@ -1,13 +0,0 @@ -# how to build under MinGW/MSYS: -# (first you need to build & "install" zlib) - -export "CFLAGS=-O3 -I/usr/local/include" -export "LDFLAGS=-L/usr/local/lib -lwsock32" -./configure -make -cp data/GeoIP.dat test/ -make check - -# note that GeoIP.dat file should be placed in the -# same place as GeoIP-enabled executable modules! -# there's NO DEFAULT PATH concept on Win32 :) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX b/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX deleted file mode 100644 index 4dddf08c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# -# Building OSX fat binaries is easy. -# -# - start in a clean directory. -# - copy the shell script below to a file and edit the file to your needs. -# -# 1.) modify export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc -arch ppc64' -# to include all architectures you need. -# 2.) add whatever you want to the ./configure line. -# 3.) execute the script. -# 4.) do a 'make install' -# -# -# make clean or make distclean before building this -# -# tell systems before leopard that we like to build for 10.5 or higher -# with MACOSX_DEPLOYMENT_TARGET=10.5 -# starting with leopard we have to add -mmacosx-version-min=10.5 -# to the CFLAGS and export MACOSX_DEPLOYMENT_TARGET!? - -## for tiger, leopard and snow leopard you might use this -## export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc -arch ppc64' -## export MACOSX_DEPLOYMENT_TARGET=10.4 -## export LDFLAGS=$GEOIP_ARCH -## export CFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk $GEOIP_ARCH" - -# here we go for leopard and snow leopard -export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc' -export MACOSX_DEPLOYMENT_TARGET=10.5 -export LDFLAGS=$GEOIP_ARCH -export CFLAGS="-g -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk $GEOIP_ARCH" -./configure --disable-dependency-tracking -perl -i.bak -pe'/^archive_cmds=/ and !/\bGEOIP_ARCH\b/ and s/-dynamiclib\b/-dynamiclib \\\$(GEOIP_ARCH)/' ./libtool -make diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt deleted file mode 100644 index a81795cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt +++ /dev/null @@ -1,44 +0,0 @@ -======================================================= - -Environmental variables: - -1. GeoIPDBFileName is hardcoded to "\\windows\\system32\\GeoIP.dat" on -windows in GeoIP.c -2. #ifdef DLL is used to determine whether you want to have a DLL built -in GeoIP.h - -You may want to change these depending on your system configuration -and compiler. - -======================================================= -Thanks to Chris Gibbs for supplying these instructions. - -The GeoIP C library should work under windows. Note that it requires the zlib -DLL. - -To install zlib with GeoIP: - -i) Downloda the zlib prebuilt DLL and static library from -http://www.winimage.com/zLibDll/ look for "pre-built zlib DLL". - -Unzip it to some location on your hard drive, and in Project-->Settings , -go to the Link tab, and add the following 3 libraries: - -ws2_32.lib -zlib.lib -zlibstat.lib - -iii) Go to Tools-->Options, then the Directories tab, and add library paths to -the locations of the zlib static libraries. You will also need to add the -include path to zlib.h to the include paths. - -iv) NOTE: These instructions are for MS VC++ 6.0, but should be similar for -previous versions, and for VC .NET. - -======================================================= -Building GeoIP as a DLL - -Stanislaw Pusep has contributed a patch for building GeoIP as a DLL. -You can find the patch in GeoIPWinDLL.patch - -Note a modified version of this patch is now merged into the main code. diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt deleted file mode 100644 index ba403836..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt +++ /dev/null @@ -1,17 +0,0 @@ -To make a static GeoIP.lib, edit the top level -Makefile.vc to reflect where the GeoIP.dat database -file should be placed, as well as the locations -of the lib, include, and bin directories for installation. -Then give the command - nmake /f Makefile.vc -This will build the GeoIP.lib library, as well as available -application and test programs. The command - nmake /f Makefile.vc test -will run available tests in the test/ subdirectory. - nmake /f Makefile.vc install -will then copy the lib and header files to the locations -specified in the top-level Makefile.vc, as well as -available application programs in the apps/ subdirectory. - nmake /f Makefile.vc clean -will remove intermediate object and executable files. - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/TODO b/Src/Plugins/DSP/sc_serv3/GeoIP/TODO deleted file mode 100644 index 32a6c805..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/TODO +++ /dev/null @@ -1,54 +0,0 @@ -Rutger Okhuizen 7/31/2006 - -Implement waiting algorithm for GEOIP_CHECK_CACHE, -so stat is called on every lookup. - ------------------------ - -Maurice Cinquini - -*** ifndef WIN32 on netdb.h ? *** -In GeoIPCity.c you don't "#ifndef WIN32" the netdb.h include, -but in GeoIP.c you do.  Which one is right? - -*** Warnings in GeoIP-1.2.1 before I made changes *** -GeoIPUpdate.c:73: warning: implicit declaration of function `_setup_dbfilename' -    I suggest a GeoIP_private.h file to include prototypes for -    _setup_dbfilename and other private functions also used by GeoIPCity.c - -*** Drop the GeoIP_*_by_addr API calls *** -And now that I think of it, why do you need a seperate -GeoIP_region_by_addr and GeoIP_region_by_name since -the later does the work of the former just as efficently. -For backward compatibility you could #define GeoIP_region_by_addr -to GeoIP_region_by_name - - - - -Performance improvements suggested by Jason Linhart -1. cluster nodes to improve disk performance when using GEOIP_STANDARD -2. evaluate preformance of replacing binary tree with nodes containing 4 children - -Write function to list countries, sorted by name. Chris Gibbs contributed this which could be -used: - - int GeoIP_country_sorted_index[246] = { - 0, 5, 8, 61, 14, 3, 11, 7, 12, 6, 13, 9, 17, 1, 16, 15, 18, 32, 25, 21, - 20,36, 22, 37, 27, 28, 33, 30, 19, 35, 34, 31, 104, 29, 24, 23, 26, -114, 47, 38, 52,121, 41, 207, 46, 48, 53, 39, 49, 116, 42, 40, 45, - 50, 44, 97, 51, 54, 55, 58, 57, 59, 60, 216, 62, 64, 203, 87, 66, - 63, 68, 2, 71, 73, 70, 69, 74, 75, 80, 170,208, 76, 84, 79, 56, 81, -82, 88, 83, 78, 86, 91, 90, 85, 92, 93, 98, 95, 228, 96,94, 99, 107, - 103, 100, 106, 105, 101, 102, 108, 109, 111, 110, 122, 112, 115, - 118,119, 120, 113, 123, 132, 124, 129, 128, 133, 126, 130, 131, - 143, 139, 137,151,153, 150, 140, 148, 138, 145, 146, 149, 238, - 152, 72, 136, 135, 142, 147, 134,154, 141, 155, 164, 163, 161, -10, 156, 166, 160, 157, 159, 165, 158, 144, 162, 167,173, 180, -178, 168, 171, 181, 169, 172, 176, 174, 179, 177, 182, 183, 184, -185,186, 193, 117, 125, 175, 229, 236, 198, 202, 187, 199, 189, -197, 192, 196,194,188, 200, 240, 89, 67, 127, 190, 201, 195, 205, -191, 43, 204, 220, 211, 221,210,209, 212, 215, 218, 214, 217, -213,206, 219, 223, 222, 4, 77, 225, 224, 226,227,234, 230, 233, - 231,232, 235, 65, 237, 239, 242, 241, 243, 244, 245}; - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 b/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 deleted file mode 100644 index 91c7b241..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 +++ /dev/null @@ -1,8917 +0,0 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, -[m4_warning([this file was generated for autoconf 2.65. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 56 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl -_LT_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. -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 delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# 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 - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\[$]0 --fallback-echo"')dnl " - lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` - ;; -esac - -_LT_OUTPUT_LIBTOOL_INIT -]) - - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -cat >"$CONFIG_LT" <<_LTEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate a libtool stub with the current configuration. - -lt_cl_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AS_SHELL_SANITIZE -_AS_PREPARE - -exec AS_MESSAGE_FD>&1 -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -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 - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2008 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -if test "$no_create" != yes; then - lt_cl_success=: - test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" - exec AS_MESSAGE_LOG_FD>/dev/null - $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false - exec AS_MESSAGE_LOG_FD>>config.log - $lt_cl_success || AS_EXIT(1) -fi -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # 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 - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_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 -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_XSI_SHELLFNS - - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_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${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed '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${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_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. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# 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 "$lt_aix_libpath_sed"` -fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_SHELL_INIT - - -# _LT_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. -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[_LT_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -ECHO=${lt_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 <<_LT_EOF -[$]* -_LT_EOF - exit 0 -fi - -# 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 - -if test -z "$lt_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 && - { 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. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi - -AC_SUBST(lt_ECHO) -]) -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], - [An echo program that does not interpret backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - 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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[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 - ;; -sparc*-*solaris*) - # 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 - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[AC_CHECK_TOOL(AR, ar, false) -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1]) - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$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}\{0,1\} :&$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 other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# 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* | cegcc*) - # 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* | dragonfly*) - # 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 all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # 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. - while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - 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` - fi - ;; - 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 -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_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 <<_LT_EOF -[#line __oline__ "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -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); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_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* | cegcc*) - 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="-ldld"], - [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="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - 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" - wl=$lt_prog_compiler_wl 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_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 - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_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 -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$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 - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $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 .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_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 -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_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 -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_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_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -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" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_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. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -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" -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' - ;; - -aix[[4-9]]*) - 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*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - 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' - ;; - esac - ;; - -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* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) - 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~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - 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* | cegcc*) - # 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}${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`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - 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 - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - 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 - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - 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' - ;; - -interix[[3-9]]*) - 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' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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* | k*bsd*-gnu | kopensolaris*-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' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - - # 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=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | 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' - ;; - -netbsdelf*-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='NetBSD ld.elf_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=qnx - 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='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - 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" - ;; - -rdos*) - dynamic_linker=no - ;; - -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.3*) - 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 - 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 - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/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}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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 - -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 - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[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]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_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="m4_if([$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 <<_LT_EOF 1>&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 - -_LT_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 -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_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 - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl - -AC_ARG_WITH([gnu-ld], - [AS_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])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 variants of GNU ld 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 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - 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|DragonFly)/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 - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -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* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - 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=pass_all - ;; - -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 - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - 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 - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - 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 - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method == "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_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" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[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_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# 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]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -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 - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# 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 - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $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 <<_LT_EOF > conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_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_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 -rf 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 - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_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 - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC*) - # IBM XL 8.0 on PPC - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_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_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac -AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix[[4-9]]*) - # 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_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_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_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - ;; - linux* | k*bsd*-gnu) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # 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. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # 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 - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - esac - - _LT_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}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[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 - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&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. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag= - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_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~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&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. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - 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_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_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]].*|aix[[5-9]]*) - 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_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - 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 - : - else - # We have old collect2 - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - _LT_TAGVAR(link_all_deplibs, $1)=no - 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 - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # 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_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_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_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_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*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE(int foo(void) {}, - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - ) - LDFLAGS="$save_LDFLAGS" - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_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_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_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}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_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' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_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} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_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_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_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* - echo "$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_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [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]]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [fix_srcfile_path], [1], - [Fix the shell variable $srcfile for the compiler]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -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_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will 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 - ;; - - aix[[4-9]]*) - 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]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_PROG_CXX -# ------------ -# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ -# compiler, we have our own version here. -m4_defun([_LT_PROG_CXX], -[ -pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) -AC_PROG_CXX -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_CXX - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_CXX], []) - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[AC_REQUIRE([_LT_PROG_CXX])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # 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 - $as_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 - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_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_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_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_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_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - 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]].*|aix[[5-9]]*) - 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_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - 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 - : - else - # We have old collect2 - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - 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 - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd[[12]]*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_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_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_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) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes; then - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_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 "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_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_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_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - 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_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_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 "X$list" | $Xsed' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # 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_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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 - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 will use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' - ;; - xl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_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 -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='echo' - - # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_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::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_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_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_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=echo - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | 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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_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 "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_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 "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_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" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='echo' - - # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_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_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_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_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_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... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - 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 -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_SYS_HIDDEN_LIBDEPS([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. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -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... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -]) -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); 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 - - 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 "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${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 "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${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 "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_PROG_F77 -# ------------ -# Since AC_PROG_F77 is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_F77], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) -AC_PROG_F77 -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_F77 - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_F77], []) - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_REQUIRE([_LT_PROG_F77])dnl -AC_LANG_PUSH(Fortran 77) - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - CC=${F77-"f77"} - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - 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 - ;; - aix[[4-9]]*) - 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]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_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... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_PROG_FC -# ----------- -# Since AC_PROG_FC is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_FC], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) -AC_PROG_FC -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_FC - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_FC], []) - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_REQUIRE([_LT_PROG_FC])dnl -AC_LANG_PUSH(Fortran) - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - CC=${FC-"f95"} - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - 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 - ;; - aix[[4-9]]*) - 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]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_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... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC="$lt_save_CC" -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# 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. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC="$lt_save_CC" -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# 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. # - -m4_defun([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 -IFS=$as_save_IFS -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 && continue - 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_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_XSI_SHELLFNS -# --------------------- -# Bourne and XSI compatible variants of some useful shell functions. -m4_defun([_LT_PROG_XSI_SHELLFNS], -[case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $[*] )) -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} - -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - -dnl func_dirname_and_basename -dnl A portable version of this function is already defined in general.m4sh -dnl so there is no need for it here. - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} - -# sed scripts: -my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[[^=]]*=//' - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$[@]"` -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` -} - -_LT_EOF -esac - -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]+=\$[2]" -} -_LT_EOF - ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]=\$$[1]\$[2]" -} - -_LT_EOF - ;; - esac -]) - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [0], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_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=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# Generated from ltversion.in. - -# serial 3017 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.2.6b]) -m4_define([LT_PACKAGE_REVISION], [1.3017]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.2.6b' -macro_revision='1.3017' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 4 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) - -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.1], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.1])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 9 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 10 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 5 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 16 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am deleted file mode 100644 index 46cf501f..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -Wall - -DEPS = $(top_builddir)/libGeoIP/libGeoIP.la -LDADDS = $(top_builddir)/libGeoIP/libGeoIP.la - -bin_PROGRAMS = geoiplookup geoiplookup6 geoipupdate - -geoiplookup_SOURCES = geoiplookup.c -geoiplookup_LDFLAGS = -geoiplookup_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la - -geoiplookup6_SOURCES = geoiplookup6.c -geoiplookup6_LDFLAGS = -geoiplookup6_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la - -geoipupdate_SOURCES = geoipupdate.c -geoipupdate_LDFLAGS = -geoipupdate_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la $(top_builddir)/libGeoIP/libGeoIPUpdate.la -geoipupdate_LDADD = $(top_builddir)/libGeoIP/libGeoIPUpdate.la $(top_builddir)/libGeoIP/libGeoIP.la -EXTRA_DIST = geoipupdate-pureperl.pl Makefile.vc diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in deleted file mode 100644 index 934f6b6a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in +++ /dev/null @@ -1,544 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -bin_PROGRAMS = geoiplookup$(EXEEXT) geoiplookup6$(EXEEXT) \ - geoipupdate$(EXEEXT) -subdir = apps -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -PROGRAMS = $(bin_PROGRAMS) -am_geoiplookup_OBJECTS = geoiplookup.$(OBJEXT) -geoiplookup_OBJECTS = $(am_geoiplookup_OBJECTS) -geoiplookup_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoiplookup_LDFLAGS) $(LDFLAGS) -o $@ -am_geoiplookup6_OBJECTS = geoiplookup6.$(OBJEXT) -geoiplookup6_OBJECTS = $(am_geoiplookup6_OBJECTS) -geoiplookup6_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoiplookup6_LDFLAGS) $(LDFLAGS) -o $@ -am_geoipupdate_OBJECTS = geoipupdate.$(OBJEXT) -geoipupdate_OBJECTS = $(am_geoipupdate_OBJECTS) -geoipupdate_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoipupdate_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(geoiplookup_SOURCES) $(geoiplookup6_SOURCES) \ - $(geoipupdate_SOURCES) -DIST_SOURCES = $(geoiplookup_SOURCES) $(geoiplookup6_SOURCES) \ - $(geoipupdate_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -Wall -DEPS = $(top_builddir)/libGeoIP/libGeoIP.la -LDADDS = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_SOURCES = geoiplookup.c -geoiplookup_LDFLAGS = -geoiplookup_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_SOURCES = geoiplookup6.c -geoiplookup6_LDFLAGS = -geoiplookup6_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -geoipupdate_SOURCES = geoipupdate.c -geoipupdate_LDFLAGS = -geoipupdate_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la $(top_builddir)/libGeoIP/libGeoIPUpdate.la -geoipupdate_LDADD = $(top_builddir)/libGeoIP/libGeoIPUpdate.la $(top_builddir)/libGeoIP/libGeoIP.la -EXTRA_DIST = geoipupdate-pureperl.pl Makefile.vc -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu apps/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu apps/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -geoiplookup$(EXEEXT): $(geoiplookup_OBJECTS) $(geoiplookup_DEPENDENCIES) - @rm -f geoiplookup$(EXEEXT) - $(geoiplookup_LINK) $(geoiplookup_OBJECTS) $(geoiplookup_LDADD) $(LIBS) -geoiplookup6$(EXEEXT): $(geoiplookup6_OBJECTS) $(geoiplookup6_DEPENDENCIES) - @rm -f geoiplookup6$(EXEEXT) - $(geoiplookup6_LINK) $(geoiplookup6_OBJECTS) $(geoiplookup6_LDADD) $(LIBS) -geoipupdate$(EXEEXT): $(geoipupdate_OBJECTS) $(geoipupdate_DEPENDENCIES) - @rm -f geoipupdate$(EXEEXT) - $(geoipupdate_LINK) $(geoipupdate_OBJECTS) $(geoipupdate_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoiplookup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoiplookup6.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoipupdate.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc deleted file mode 100644 index 266a9319..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc +++ /dev/null @@ -1,25 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -LINK = link -nologo - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) - -GEOIPLIB = ..\libGeoIP\GeoIP.lib - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -APPS: geoiplookup.exe - -geoiplookup.exe: geoiplookup.c - $(CC1) -c geoiplookup.c - $(LINK) geoiplookup.obj $(GEOIPLIB) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c deleted file mode 100644 index bd3c6fca..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c +++ /dev/null @@ -1,401 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* geoiplookup.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPCity.h" -#include "GeoIP_internal.h" - -#if defined(_WIN32) -# ifndef uint32_t -typedef unsigned int uint32_t; -# endif -#endif - -void geoiplookup(GeoIP* gi,char *hostname,int i); - -void usage() { - fprintf(stderr,"Usage: geoiplookup [-d custom_dir] [-f custom_file] [-v] [-i] \n"); -} - -/* extra info used in _say_range_ip */ -int info_flag = 0; - -int main (int argc, char *argv[]) { - char * hostname = NULL; - char * db_info; - GeoIP * gi; - int i; - char *custom_directory = NULL; - char *custom_file = NULL; - int version_flag = 0; - - if (argc < 2) { - usage(); - exit(1); - } - i = 1; - while (i < argc) { - if (strcmp(argv[i],"-v") == 0) { - version_flag = 1; - } else if (strcmp(argv[i],"-i") == 0) { - info_flag = 1; - } else if (strcmp(argv[i],"-f") == 0) { - if ((i+1) < argc){ - i++; - custom_file = argv[i]; - } - } else if (strcmp(argv[i],"-d") == 0) { - if ((i+1) < argc){ - i++; - custom_directory = argv[i]; - } - } else { - hostname = argv[i]; - } - i++; - } - if (hostname == NULL) { - usage(); - exit(1); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - _GeoIP_setup_dbfilename(); - - if (custom_file != NULL) { - gi = GeoIP_open(custom_file, GEOIP_STANDARD); - - if (NULL == gi) { - printf("%s not available, skipping...\n", custom_file); - } else { - i = GeoIP_database_edition(gi); - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info == NULL ? "": db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } else { - /* iterate through different database types */ - for (i = 0; i < NUM_DB_TYPES; ++i) { - if (GeoIP_db_avail(i)) { - gi = GeoIP_open_type(i, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", GeoIPDBDescription[i]); - } else { - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i], db_info == NULL ? "" : db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } - } - } - return 0; -} - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -static void _mk_conf_str( unsigned char val , char * to, int size){ - if ( ( val & 0x7f ) == 0x7f ){ - snprintf(to, 5, "N/A"); - return; - } - snprintf(to, 5, "%d", val); - return; -} - -static unsigned long -__addr_to_num(const char *addr) -{ - unsigned int c, octet, t; - unsigned long ipnum; - int i = 3; - - octet = ipnum = 0; - while ((c = *addr++)) { - if (c == '.') { - if (octet > 255) - return 0; - ipnum <<= 8; - ipnum += octet; - i--; - octet = 0; - } else { - t = octet; - octet <<= 3; - octet += t; - octet += t; - c -= '0'; - if (c > 9) - return 0; - octet += c; - } - } - if ((octet > 255) || (i != 0)) - return 0; - ipnum <<= 8; - return ipnum + octet; -} - - - -/* ptr must be a memory area with at least 16 bytes */ -static char *__num_to_addr_r (unsigned long ipnum, char * ptr) { - char *cur_str; - int octet[4]; - int num_chars_written, i; - - cur_str = ptr; - - for (i = 0; i<4; i++) { - octet[3 - i] = ipnum % 256; - ipnum >>= 8; - } - - for (i = 0; i<4; i++) { - num_chars_written = sprintf(cur_str, "%d", octet[i]); - cur_str += num_chars_written; - - if (i < 3) { - cur_str[0] = '.'; - cur_str++; - } - } - - return ptr; -} - -void _say_range_by_ip(GeoIP * gi, uint32_t ipnum ) { - unsigned long last_nm, mask, low, hi; - char ipaddr[16]; - char tmp[16]; - char ** range; - - if ( info_flag == 0 ) - return; /* noop unless extra information is requested */ - - range = GeoIP_range_by_ip( gi, __num_to_addr_r( ipnum, ipaddr ) ); - if ( range == NULL ) - return; - - printf ( " ipaddr: %s\n", ipaddr ); - - printf( " range_by_ip: %s - %s\n", range[0], range[1] ); - last_nm = GeoIP_last_netmask(gi); - mask = 0xffffffff << ( 32 - last_nm ); - low = ipnum & mask; - hi = low + ( 0xffffffff & ~mask ); - printf( " network: %s - %s ::%ld\n", - __num_to_addr_r( low, ipaddr ), - __num_to_addr_r( hi, tmp ), - last_nm - ); - printf( " ipnum: %u\n", ipnum ); - printf( " range_by_num: %lu - %lu\n", __addr_to_num(range[0]), __addr_to_num(range[1]) ); - printf( " network num: %lu - %lu ::%lu\n", low, hi, last_nm ); - - GeoIP_range_by_ip_delete(range); -} - -void -geoiplookup(GeoIP * gi, char *hostname, int i) -{ - const char *country_code; - const char *country_name; - const char *domain_name; - const char *asnum_name; - int netspeed; - int country_id; - GeoIPRegion *region; - GeoIPRecord *gir; - const char *org; - uint32_t ipnum; - - ipnum = _GeoIP_lookupaddress(hostname); - if (ipnum == 0) { - printf("%s: can't resolve hostname ( %s )\n", GeoIPDBDescription[i], hostname); - - } - else { - - if (GEOIP_DOMAIN_EDITION == i) { - domain_name = GeoIP_name_by_ipnum(gi, ipnum); - if (domain_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], domain_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_LOCATIONA_EDITION == i || GEOIP_ACCURACYRADIUS_EDITION == i || GEOIP_ASNUM_EDITION == i || GEOIP_USERTYPE_EDITION == i || GEOIP_REGISTRAR_EDITION == i || GEOIP_NETSPEED_EDITION_REV1 == i ) { - asnum_name = GeoIP_name_by_ipnum(gi, ipnum); - if (asnum_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], asnum_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_COUNTRY_EDITION == i) { - country_id = GeoIP_id_by_ipnum(gi, ipnum); - country_code = GeoIP_country_code[country_id]; - country_name = GeoIP_country_name[country_id]; - if (country_id == 0) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], country_code, country_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_REGION_EDITION_REV0 == i || GEOIP_REGION_EDITION_REV1 == i) { - region = GeoIP_region_by_ipnum(gi, ipnum); - if (NULL == region || region->country_code[0] == '\0' ) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], region->country_code, region->region); - _say_range_by_ip(gi, ipnum); - GeoIPRegion_delete(region); - } - } - else if (GEOIP_CITY_EDITION_REV0 == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), - _mk_NA(gir->city), _mk_NA(gir->postal_code), gir->latitude, gir->longitude); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITY_EDITION_REV1 == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITYCONFIDENCE_EDITION == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - char country_str[5], region_str[5], city_str[5], postal_str[5]; - _mk_conf_str(gir->country_conf, country_str, 5); - _mk_conf_str(gir->region_conf, region_str, 5); - _mk_conf_str(gir->city_conf, city_str, 5); - _mk_conf_str(gir->postal_conf, postal_str, 5); - - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d, %s, %s, %s, %s\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code, - country_str, region_str, city_str, postal_str - ); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITYCONFIDENCEDIST_EDITION == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - char country_str[5], region_str[5], city_str[5], postal_str[5], accuracy_radius_str[5]; - _mk_conf_str(gir->country_conf, country_str, 5); - _mk_conf_str(gir->region_conf, region_str, 5); - _mk_conf_str(gir->city_conf, city_str, 5); - _mk_conf_str(gir->postal_conf, postal_str, 5); - if (gir->accuracy_radius != 1023){ - sprintf(accuracy_radius_str, "%d", gir->accuracy_radius ); -} else { - strcpy(accuracy_radius_str,"N/A");} - - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d, %s, %s, %s, %s, %s\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code, - country_str, region_str, city_str, postal_str, accuracy_radius_str - ); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_ORG_EDITION == i || GEOIP_ISP_EDITION == i) { - org = GeoIP_org_by_ipnum(gi, ipnum); - if (org == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], org); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_NETSPEED_EDITION == i) { - netspeed = GeoIP_id_by_ipnum(gi, ipnum); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s: Unknown\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s: Dialup\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s: Cable/DSL\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s: Corporate\n", GeoIPDBDescription[i]); - } - _say_range_by_ip(gi, ipnum); - } - else { - - /* - * Silent ignore IPv6 databases. Otherwise we get annoying - * messages whenever we have a mixed environment IPv4 and - * IPv6 - */ - - /* - * printf("Can not handle database type -- try geoiplookup6\n"); - */ - ; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c deleted file mode 100644 index dc0ff9ba..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c +++ /dev/null @@ -1,255 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* geoiplookup.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -void geoiplookup(GeoIP* gi,char *hostname,int i); - -void usage() { - fprintf(stderr,"Usage: geoiplookup [-d custom_dir] [-f custom_file] [-v] \n"); -} - -int main (int argc, char *argv[]) { - char * hostname = NULL; - char * db_info; - GeoIP * gi; - int i; - char *custom_directory = NULL; - char *custom_file = NULL; - int version_flag = 0; - - if (argc < 2) { - usage(); - exit(1); - } - i = 1; - while (i < argc) { - if (strcmp(argv[i],"-v") == 0) { - version_flag = 1; - } else if (strcmp(argv[i],"-f") == 0) { - if ((i+1) < argc){ - i++; - custom_file = argv[i]; - } - } else if (strcmp(argv[i],"-d") == 0) { - if ((i+1) < argc){ - i++; - custom_directory = argv[i]; - } - } else { - hostname = argv[i]; - } - i++; - } - if (hostname == NULL) { - usage(); - exit(1); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - _GeoIP_setup_dbfilename(); - - if (custom_file != NULL) { - gi = GeoIP_open(custom_file, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", custom_file); - } else { - i = GeoIP_database_edition(gi); - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info == NULL ? "": db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } else { - /* iterate through different database types */ - for (i = 0; i < NUM_DB_TYPES; ++i) { - if (GeoIP_db_avail(i)) { - gi = GeoIP_open_type(i, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", GeoIPDBDescription[i]); - } else { - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } - } - } - return 0; -} - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -void -geoiplookup(GeoIP * gi, char *hostname, int i) -{ - const char *country_code; - const char *country_name; - const char *domain_name; - const char *asnum_name; - int netspeed; - int country_id; - GeoIPRegion *region; - GeoIPRecord *gir; - const char *org; - - geoipv6_t ipnum; - ipnum = _GeoIP_lookupaddress_v6(hostname); - if (__GEOIP_V6_IS_NULL(ipnum)) { - printf("%s: can't resolve hostname ( %s )\n", GeoIPDBDescription[i], hostname); - - } - else { - - -#if 0 - if (GEOIP_DOMAIN_EDITION_V6 == i) { - domain_name = GeoIP_name_by_name_v6(gi, hostname); - if (domain_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], domain_name); - } - } -#endif - - - - if (GEOIP_LOCATIONA_EDITION_V6 == i || GEOIP_ASNUM_EDITION_V6 == i || GEOIP_USERTYPE_EDITION_V6 == i || GEOIP_REGISTRAR_EDITION_V6 == i || GEOIP_DOMAIN_EDITION_V6 == i || GEOIP_ORG_EDITION_V6 == i || GEOIP_ISP_EDITION_V6 == i || GEOIP_NETSPEED_EDITION_REV1_V6 == i ) { - asnum_name = GeoIP_name_by_ipnum_v6(gi, ipnum); - if (asnum_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], asnum_name); - // _say_range_by_ip(gi, ipnum); - } - } - - else if (GEOIP_CITY_EDITION_REV0_V6 == i) { - gir = GeoIP_record_by_name_v6(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), - _mk_NA(gir->city), _mk_NA(gir->postal_code), gir->latitude, gir->longitude); - } - } - else if (GEOIP_CITY_EDITION_REV1_V6 == i) { - gir = GeoIP_record_by_name_v6(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - } - } - - else if (GEOIP_COUNTRY_EDITION_V6 == i) { - - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - country_code = GeoIP_country_code[country_id]; - country_name = GeoIP_country_name[country_id]; - if (country_id == 0) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], country_code, country_name); - } - } - } - -#if 0 - - else - if (GEOIP_REGION_EDITION_REV0 == i || GEOIP_REGION_EDITION_REV1 == i) { - region = GeoIP_region_by_name_v6(gi, hostname); - if (NULL == region) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], region->country_code, region->region); - } - } - else if (GEOIP_CITY_EDITION_REV0 == i) { - gir = GeoIP_record_by_name(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, gir->region, - gir->city, gir->postal_code, gir->latitude, gir->longitude); - } - } - else if (GEOIP_CITY_EDITION_REV1 == i) { - gir = GeoIP_record_by_name(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, gir->region, gir->city, gir->postal_code, - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - } - } - else if (GEOIP_ORG_EDITION == i || GEOIP_ISP_EDITION == i) { - org = GeoIP_org_by_name_v6(gi, hostname); - if (org == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], org); - } - } - else if (GEOIP_NETSPEED_EDITION == i) { - netspeed = GeoIP_id_by_name_v6(gi, hostname); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s: Unknown\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s: Dialup\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s: Cable/DSL\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s: Corporate\n", GeoIPDBDescription[i]); - } - - } -#endif - -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl deleted file mode 100644 index a8f04bee..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/perl - -=pod - -/* - * - * Copyright (C) 2008 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -=cut - -=pod - -pure perl version of geoipupdate. can handle anything, that - - GeoIP_update_database - GeoIP_update_database_general - -handle. It is a drop in replacement for geoipupdate, as opposide to geoipupdate is the -pp version able to handle proxy requests even with authentication and can be used with -https - -=cut - -use strict; -use warnings; - -our $VERSION = '0.07'; - -use 5.008; -use Data::Dumper; -use Digest::MD5; -use File::Spec; -use File::Basename; -use Getopt::Std; -use HTTP::Request::Common; -use LWP::UserAgent; -use PerlIO::gzip; -use URI; - -my $ua = LWP::UserAgent->new( agent => "pp_geoipupdate/$VERSION" ); -$ua->env_proxy; - -## --- for auth proxies use -## $ua->proxy(['http', 'ftp'] => 'http://username:password@proxy.myorg.com'); - -my $license_file = 'GeoIP.conf'; -my $update_host = 'updates.maxmind.com'; -my $proto = 'http'; -my %opts; - -if ( !getopts( 'hvf:d:', \%opts ) or $opts{h} ) { - print STDERR - "Usage: geoipupdate [-hv] [-f license_file] [-d custom directory]\n"; - exit @ARGV ? 1 : 0; -} - -my $rootdir = File::Spec->rootdir; -$opts{d} ||= File::Spec->catfile( $rootdir, qw/ usr local share GeoIP / ); -$opts{f} ||= - File::Spec->catfile( $rootdir, qw/ usr local etc /, $license_file ); - -die "dir $opts{d} does not exist or is not readable or is not a directory\n" - unless -d $opts{d}; -die "license_file $opts{f} does not exist, is not readable or is not a file\n" - unless -f $opts{f}; - -# -# --- parse license file -# -open my $fh, '<', $opts{f} - or die "Error opening GeoIP Configuration file $opts{f}\n"; -print "Opened License file $opts{f}\n" if $opts{v}; - -my ( $user_id, $license_key, @product_ids ); -{ - local $_; - - while (<$fh>) { - next if /^\s*#/; # skip comments - /^\s*UserId\s+(\d+)/ and $user_id = $1, next; - /^\s*LicenseKey\s+(\S{12})/ and $license_key = $1, next; - /^\s*ProductIds\s+(\d+(?:[a-zA-Z]{2,3})?(?:\s+\d+(?:[a-zA-Z]{2,3})?)*)/ - and @product_ids = split( /\s+/, $1 ), next; - - } -} - -if ( $opts{v} ) { - print "User id $user_id\n" if $user_id; - print "Read in license key $license_key\n"; - print "Product ids @product_ids\n"; -} - -if ($user_id) { - for my $product_id (@product_ids) { - - # update the databases using the user id string, - # the license key string and the product id for each database - eval { - GeoIP_update_database_general( $user_id, $license_key, - $product_id, $opts{v} ); - }; - my $err = $@; - die $err if $err and $err !~ /^No new updates available/i; - print $err; - } -} else { - - # Old format with just license key for MaxMind GeoIP Country database updates - # here for backwards compatibility - eval { GeoIP_update_database( $license_key, $opts{v} ); }; - my $err = $@; - die $err if $err and $err !~ /^No new updates available/i; - print $err; -} - -exit 0; - -sub GeoIP_update_database_general { - my ( $user_id, $license_key, $product_id, $verbose, $client_ipaddr ) = @_; - my $u = URI->new("$proto://$update_host/app/update_getfilename"); - $u->query_form( product_id => $product_id ); - - print 'Send request ' . $u->as_string, "\n" if ($verbose); - my $res = $ua->request( GET $u->as_string, Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - # make sure to use only the filename for security reason - my $geoip_filename = File::Spec->catfile( $opts{d}, basename($res->content) ); - - # /* get MD5 of current GeoIP database file */ - my $old_md5 = _get_hexdigest($geoip_filename); - - print "MD5 sum of database $geoip_filename is $old_md5\n" if $verbose; - - unless ($client_ipaddr) { - print 'Send request ' . $u->as_string, "\n" if ($verbose); - - # /* get client ip address from MaxMind web page */ - $res = $ua->request( GET "$proto://$update_host/app/update_getipaddr", - Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - $client_ipaddr = $res->content; - } - - print "client ip address: $client_ipaddr\n" if $verbose; - my $hex_digest2 = - Digest::MD5->new->add( $license_key, $client_ipaddr )->hexdigest; - print "md5sum of ip address and license key is $hex_digest2\n" if $verbose; - - my $mk_db_req_cref = sub { - - $u->path('/app/update_secure'); - $u->query_form( - db_md5 => shift, - challenge_md5 => $hex_digest2, - user_id => $user_id, - edition_id => $product_id - ); - print 'Send request ' . $u->as_string, "\n" if ($verbose); - return $ua->request( GET $u->as_string, Host => $update_host ); - }; - $res = $mk_db_req_cref->($old_md5); - die $res->status_line unless ( $res->is_success ); - - # print Dumper($res); - print "Downloading gzipped GeoIP Database...\n" if $verbose; - - _gunzip_and_replace( - $res->content, - $geoip_filename, - sub { - - # as sanity check request a update for the new downloaded file - # md5 of the new unpacked file - my $new_md5 = _get_hexdigest(shift); - return $mk_db_req_cref->($new_md5); - } - ); - print "Done\n" if $verbose; -} - -sub GeoIP_update_database { - my ( $license_key, $verbose ) = @_; - my $geoip_filename = File::Spec->catfile( $opts{d}, 'GeoIP.dat' ); - - # /* get MD5 of current GeoIP database file */ - my $hexdigest = _get_hexdigest($geoip_filename); - - print "MD5 sum of database $geoip_filename is $hexdigest\n" if $verbose; - - my $u = URI->new("$proto://$update_host/app/update"); - $u->query_form( license_key => $license_key, md5 => $hexdigest ); - - print 'Send request ' . $u->as_string, "\n" if ($verbose); - my $res = $ua->request( GET $u->as_string, Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - print "Downloading gzipped GeoIP Database...\n" if $verbose; - _gunzip_and_replace( $res->content, $geoip_filename ); - print "Done\n" if $verbose; - -} - -# --- hexdigest of the file or 00000000000000000000000000000000 -sub _get_hexdigest { - my $md5 = '0' x 32; - if ( open my $fh, '<:raw', shift ) { - $md5 = Digest::MD5->new->addfile($fh)->hexdigest; - } - return $md5; -} - -sub _gunzip_and_replace { - my ( $content, $geoip_filename, $sanity_check_c ) = @_; - my $max_retry = 1; - - my $tmp_fname = $geoip_filename . '.test'; - - { - - # --- error if our content does not start with the gzip header - die $content || 'Not a gzip file' if substr( $content, 0, 2 ) ne "\x1f\x8b"; - - # --- uncompress the gzip data - { - local $_; - open my $gin, '<:gzip', \$content or die $!; - open my $gout, '>:raw', $tmp_fname or die $!; - print {$gout} $_ while (<$gin>); - } - - # --- sanity check - if ( defined $sanity_check_c ) { - die "Download failed" if $max_retry-- <= 0; - my $res = $sanity_check_c->($tmp_fname); - die $res->status_line unless ( $res->is_success ); - $content = $res->content; - - redo if ( $content !~ /^No new updates available/ ); - } - } - - # --- install GeoIP.dat.test -> GeoIP.dat - rename( $tmp_fname, $geoip_filename ) or die $!; -} - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c deleted file mode 100644 index b3a553b2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c +++ /dev/null @@ -1,283 +0,0 @@ -/* geoipupdate.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPUpdate.h" - -#include -#include -#include -#ifdef __linux__ -#include -#endif -#include - -#define PRODUCT_ID_TOKEN "ProductIds" -#define USER_ID_TOKEN "UserId" -#define LICENSE_KEY_TOKEN "LicenseKey" -#define LICENSE_KEY_LENGTH 12 - -const char *GeoIPConfFile = "GeoIP.conf"; - -void usage() { - fprintf(stderr,"Usage: geoipupdate [-hv] [-f license_file] [-d custom directory]\n"); -} - -void my_printf(char * str) { - printf("%s", str); -} - -void print_status (int err, char * license_file) { - if (err == GEOIP_NO_NEW_UPDATES) { - fprintf(stdout,"GeoIP Database up to date\n"); - } else if (err == GEOIP_LICENSE_KEY_INVALID_ERR) { - fprintf(stderr,"Invalid License Key in %s - Please visit http://www.maxmind.com/app/products for a subscription\n",license_file); - } else if (err == GEOIP_USER_ID_INVALID_ERR){ - fprintf(stderr,"Invalid UserID\n"); - } else if (err == GEOIP_PRODUCT_ID_INVALID_ERR){ - fprintf(stderr,"Invalid product ID or subscription expired\n"); - } else if (err < 0) { - fprintf(stderr,"Received Error %d (%s) when attempting to update GeoIP Database\n",err, GeoIP_get_error_message(err)); - } else { - fprintf(stdout,"Updated database\n"); - } -} - -int main (int argc, char *argv[]) { - int verbose = 0; - char * license_file = NULL; - FILE * license_fh; - int n = 40; - int line_index = 0; - unsigned char *lineptr = malloc(sizeof(char) * n); - char *a_license_key_str, *a_ptr; - char *the_license_key_str = ""; - char * the_reference_empty_license_key_str = the_license_key_str; - char *a_user_id_str = NULL; - /* the string that holds the user id */ - char *the_user_id_str = NULL; - /* the integer that holds the length of the string the_user_id_str */ - int the_user_id_strl = 0; - /* the integer that holds the alloc length of the string the_user_id_str */ - int the_user_id_stral = 0; - char *a_product_id_str = NULL; - char **the_product_id_str = NULL; - int *the_product_id_strl = NULL; - int *the_product_id_stral = NULL; - int num_product_ids = 0; - char * client_ipaddr = NULL; - char * custom_directory = NULL; - int c; - int err = 0; - int i; - - opterr = 0; - - while ((c = getopt (argc, argv, "hvf:d:")) != -1) - switch (c) { - case 'h': - usage(); - exit(0); - case 'v': - verbose = 1; - break; - case 'f': - license_file = optarg; - break; - case 'd': - custom_directory = optarg; - break; - case '?': - if (isprint (optopt)) - fprintf (stderr, "Unknown option `-%c'.\n", optopt); - else - fprintf (stderr, - "Unknown option character `\\x%x'.\n", - optopt); - usage(); - exit(1); - default: - abort(); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - if (license_file == NULL) { - license_file = malloc(sizeof(char) * (strlen(SYSCONFDIR)+strlen(GeoIPConfFile)+2)); - license_file[0] = '\0'; - strcat(license_file, SYSCONFDIR); - strcat(license_file, "/"); - strcat(license_file, GeoIPConfFile); - } - - license_fh = fopen(license_file,"r"); - if (license_fh == NULL) { - fprintf(stderr,"Error opening GeoIP Configuration file %s\n",license_file); - exit(1); - } - - if (verbose == 1) - printf("Opened License file %s\n", license_file); - - do { - c = fgetc(license_fh); - if (line_index >= n) { - n += 20; - lineptr = realloc(lineptr, n); - } - if (c == 10 || c == EOF) { - lineptr[line_index++] = '\0'; - line_index = 0; - if (lineptr[0] == '#') - continue; - /* get the product ids from the config file */ - a_product_id_str = strstr((char *)lineptr, PRODUCT_ID_TOKEN);//search for a product id token in the line - if (a_product_id_str != NULL) { - a_ptr = a_product_id_str; - /* set pos at the end of product id token */ - a_ptr += strlen(PRODUCT_ID_TOKEN) + 1; - while (a_ptr[0] == ' ') { - /* skip spaces */ - a_ptr++; - } - /* alloc the array of product ids */ - the_product_id_str = (char **) malloc((num_product_ids+1) * sizeof(char*)); /* array of strings */ - the_product_id_strl = (int *) malloc((num_product_ids+1) * sizeof(char*)); /* array of string lengths */ - the_product_id_stral = (int *) malloc((num_product_ids+1) * sizeof(char*)); /* array of string alloc lengths */ - while (a_ptr[0] != '\0') { - /* add new product id to the array of product ids */ - the_product_id_str[num_product_ids] = (char *) malloc(20); /* the string */ - the_product_id_strl[num_product_ids] = 0; /* the length of the string */ - the_product_id_stral[num_product_ids] = 20; /* the alloc length of the string */ - while ((a_ptr[0] != ' ') & (a_ptr[0] != '\0')) { - if (the_product_id_strl[num_product_ids] >= the_product_id_stral[num_product_ids]) { - /* if the length of the string is equal or more than - * alloc length of the string then realloc the string and - * increase the alloc length by 20 */ - the_product_id_stral[num_product_ids] = the_product_id_stral[num_product_ids] + 20; - the_product_id_str[num_product_ids] = (char *) realloc(the_product_id_str[num_product_ids],the_product_id_stral[num_product_ids]+4); - } - /* read the product id from the line in the config file */ - the_product_id_str[num_product_ids][the_product_id_strl[num_product_ids]] = a_ptr[0]; - the_product_id_strl[num_product_ids]++; - a_ptr++; - } - the_product_id_str[num_product_ids][the_product_id_strl[num_product_ids]] = 0; - while ((a_ptr[0] == ' ') & (a_ptr[0] != '\0')) { - a_ptr++;//skip spaces - } - /* new product id add, realloc the arrays */ - num_product_ids = num_product_ids + 1; - /* array of string */ - the_product_id_str = (char **) realloc(the_product_id_str,(num_product_ids+1) * sizeof(char*)); - /* array of string lengths */ - the_product_id_strl = (int *) realloc(the_product_id_strl,(num_product_ids+1) * sizeof(char*)); - /* array of string alloc lengths */ - the_product_id_stral = (int *) realloc(the_product_id_stral,(num_product_ids+1) * sizeof(char*)); - } - } - - /* get the user id from the config file */ - a_user_id_str = strstr((char *)lineptr, USER_ID_TOKEN); /* search for a user id token in the line */ - if (a_user_id_str != NULL) { - a_ptr = a_user_id_str; - /* set the position at the end of user id token */ - a_ptr += strlen(USER_ID_TOKEN) + 1; - while (a_ptr[0] == ' ') { - /* skip spaces */ - a_ptr++; - } - /* get the string that has the user id */ - the_user_id_stral = 20; - the_user_id_str = (char *)malloc(the_user_id_stral); - /* loop while the chars are numbers */ - while ((a_ptr[0] >= '0') & (a_ptr[0] <= '9')) { - the_user_id_str[the_user_id_strl++] = a_ptr[0]; - a_ptr++; - if (the_user_id_strl >= the_user_id_stral) { - /* if the length of user id string is greater or equal to - * the alloc length of user id string then - * add 20 to the alloc length and realloc the user id string */ - the_user_id_stral += 20; - the_user_id_str = realloc(the_user_id_str,the_user_id_stral); - } - } - the_user_id_str[the_user_id_strl] = 0; /* add NUL char */ - } - a_license_key_str = strstr((char *)lineptr, LICENSE_KEY_TOKEN); - if (a_license_key_str != NULL) { - a_ptr = a_license_key_str; - a_ptr += strlen(LICENSE_KEY_TOKEN) + 1; - while (a_ptr[0] == ' ') { - a_ptr++; - } - the_license_key_str = malloc(sizeof(char) * (LICENSE_KEY_LENGTH + 1)); - strncpy(the_license_key_str, a_ptr, LICENSE_KEY_LENGTH); - the_license_key_str[LICENSE_KEY_LENGTH] = '\0'; - } - } else { - lineptr[line_index++] = c; - } - } while (c != EOF); - - free(lineptr); - - fclose(license_fh); - - if (verbose == 1) { - printf("Read in license key %s\n", the_license_key_str); - printf("number of product ids %d \n",num_product_ids); - } - - if (the_user_id_str != NULL) { - /* update the databases using the user id string, the license key string and the product id for each database */ - client_ipaddr = NULL; - for (i = 0; i < num_product_ids; i++) { - err = GeoIP_update_database_general(the_user_id_str, the_license_key_str, the_product_id_str[i], verbose,&client_ipaddr, &my_printf); - print_status(err, license_file); - } - } else { - /* Old format with just license key for MaxMind GeoIP Country database updates - * here for backwards compatibility */ - err = GeoIP_update_database(the_license_key_str, verbose, &my_printf); - print_status(err, license_file); - } - - if (the_product_id_str != NULL) { - /* free the product ids */ - for (i = 0; i < num_product_ids; i++ ) { - free(the_product_id_str[i]); - } - free(the_product_id_str); - free(the_product_id_strl); - free(the_product_id_stral); - } - - if ( the_reference_empty_license_key_str != the_license_key_str ) - free(the_license_key_str); - - if (the_user_id_str) - free(the_user_id_str); - - if (client_ipaddr) { - free(client_ipaddr); - } - exit(err); -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap b/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap deleted file mode 100644 index d3a651db..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh - -# disable dependency trackeing for OS X with multiply arch option's -# automake -i --gnu --add-missing - -aclocal \ -&& automake -i --gnu --add-missing \ -&& autoconf diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default deleted file mode 100644 index 33f55265..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default +++ /dev/null @@ -1,19 +0,0 @@ -# If you purchase a subscription to the GeoIP database, -# then you will obtain a license key which you can -# use to automatically obtain updates. -# for more details, please go to -# http://www.maxmind.com/app/products - -# see https://www.maxmind.com/app/license_key_login to obtain License Key, -# UserId, and available ProductIds - -# Enter your license key here -LicenseKey YOUR_LICENSE_KEY_HERE - -# Enter your User ID here -UserId YOUR_USER_ID_HERE - -# Enter the Product ID(s) of the database(s) you would like to update -# By default 106 (MaxMind GeoIP Country) is listed below -ProductIds 106 - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am deleted file mode 100644 index c55ec18b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -dist_sysconf_DATA = GeoIP.conf.default - -DEFAULT_CONFIG_FILE = $(sysconfdir)/GeoIP.conf - -install-exec-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.conf.default $(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.conf.default" "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ -fi diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in deleted file mode 100644 index 2a4ad929..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in +++ /dev/null @@ -1,414 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = conf -DIST_COMMON = $(dist_sysconf_DATA) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(sysconfdir)" -DATA = $(dist_sysconf_DATA) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -dist_sysconf_DATA = GeoIP.conf.default -DEFAULT_CONFIG_FILE = $(sysconfdir)/GeoIP.conf -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu conf/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu conf/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-dist_sysconfDATA: $(dist_sysconf_DATA) - @$(NORMAL_INSTALL) - test -z "$(sysconfdir)" || $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" - @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ - done - -uninstall-dist_sysconfDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sysconfdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sysconfdir)" && rm -f $$files -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(sysconfdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-dist_sysconfDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-dist_sysconfDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: install-am install-exec-am install-strip uninstall-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_sysconfDATA \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-dist_sysconfDATA uninstall-hook - - -install-exec-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.conf.default $(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.conf.default" "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ -fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess b/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess deleted file mode 100644 index e3a2116a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess +++ /dev/null @@ -1,1533 +0,0 @@ -#! /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, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-10' - -# 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, 2006, 2007, 2008 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 "$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 ;; - sh5el) machine=sh5le-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 -q __ELF__ - 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 ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-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 ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - 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.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-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:*:[456]) - 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 -q __LP64__ - 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:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *: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 ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T | authenticamd | genuineintel) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-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:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - fi - exit ;; - avr32*: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:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #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 -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - 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 ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-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" - ;; - 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) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - 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.[02]*:*) - 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 i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-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; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - 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; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) - 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 ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - 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 ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-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 ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - 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/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub b/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub deleted file mode 100644 index eb0389a6..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub +++ /dev/null @@ -1,1693 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-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, 2006, 2007, 2008 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* | \ - kopensolaris*-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 - ;; - -bluegene*) - os=-cnk - ;; - -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 | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k | z80) - 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-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | 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-* \ - | nios-* | nios2-* \ - | 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[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # 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 - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - 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 - ;; - cr16) - basic_machine=cr16-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 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - 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 - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - 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 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - 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 - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - 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 - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - 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 - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - 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 - ;; - z80-*-coff) - basic_machine=z80-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[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - 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* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -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* | -cegcc* \ - | -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* | -toppers* | -drops*) - # 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 - ;; - -dicos*) - os=-dicos - ;; - -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 - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-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 - ;; - mep-*) - os=-elf - ;; - 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 - ;; - -cnk*|-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/Src/Plugins/DSP/sc_serv3/GeoIP/configure b/Src/Plugins/DSP/sc_serv3/GeoIP/configure deleted file mode 100644 index 246e7563..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/configure +++ /dev/null @@ -1,13633 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for GeoIP 1.4.8. -# -# Report bugs to . -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: support@maxmind.com about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. -as_fn_error () -{ - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 - fi - $as_echo "$as_me: error: $1" >&2 - as_fn_exit $as_status -} # as_fn_error - -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 - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_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 -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` - ;; -esac - -ECHO=${lt_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 <<_LT_EOF -$* -_LT_EOF - exit 0 -fi - -# 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 - -if test -z "$lt_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 && - { 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. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" -fi - - - - -test -n "$DJDIR" || 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= - -# Identity of this package. -PACKAGE_NAME='GeoIP' -PACKAGE_TARNAME='GeoIP' -PACKAGE_VERSION='1.4.8' -PACKAGE_STRING='GeoIP 1.4.8' -PACKAGE_BUGREPORT='support@maxmind.com' -PACKAGE_URL='' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_unique_file="libGeoIP/GeoIP.c" -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -lt_ECHO -RANLIB -AR -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -GEOIP_VERSION_INFO -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -EGREP -GREP -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -enable_libtool_lock -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_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_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" - 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 GeoIP 1.4.8 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/GeoIP] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -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 GeoIP 1.4.8:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-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) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -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" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -GeoIP configure 1.4.8 -generated by GNU Autoconf 2.65 - -Copyright (C) 2009 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 - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to support@maxmind.com ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* 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 $2 (); -/* 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_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_func - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -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 -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_type -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 GeoIP $as_me 1.4.8, which was -generated by GNU Autoconf 2.65. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append 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 - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_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 - -$as_echo "/* confdefs.h */" > 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 - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -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_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "C compiler cannot create executables -See \`config.log' for more details." "$LINENO" 5; }; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of object files: cannot compile -See \`config.log' for more details." "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -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_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = x""yes; then : - MINIX=yes -else - MINIX= -fi - - - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h - - -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h - - -$as_echo "#define _MINIX 1" >>confdefs.h - - fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_safe_to_define___extensions__=yes -else - ac_cv_safe_to_define___extensions__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h - - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h - - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h - - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h - - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h - - - -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done -done -if test -z "$ac_aux_dir"; then - as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='GeoIP' - VERSION='1.4.8' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - - -GEOIP_VERSION_INFO=`echo $VERSION | awk -F. '{ printf "%d:%d:%d", $1+$2, $3, $2 }'` - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -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 - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.2.6b' -macro_revision='1.3017' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then : - $as_echo_n "(cached) " >&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 && - as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; -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 - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then : - $as_echo_n "(cached) " >&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` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; -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 - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_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 -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_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_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_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 fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_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_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if test "${lt_cv_path_LD+set}" = set; then : - $as_echo_n "(cached) " >&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 variants of GNU ld 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 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test "${lt_cv_path_NM+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_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" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$ac_tool_prefix"; then - for ac_prog in "dumpbin -symbols" "link -dump -symbols" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in "dumpbin -symbols" "link -dump -symbols" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if test "${lt_cv_nm_interface+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5395: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:5398: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:5401: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if test "${lt_cv_sys_max_cmd_len+set}" = set; then : - $as_echo_n "(cached) " >&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* | cegcc*) - # 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* | dragonfly*) - # 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 all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # 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. - while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - 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` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$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='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then : - $as_echo_n "(cached) " >&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 -aix[4-9]*) - 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', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - 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|DragonFly)/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 - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -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* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - 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=pass_all - ;; - -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 - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - 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 - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$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 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -else - AR="$ac_cv_prog_AR" -fi - -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : - $as_echo_n "(cached) " >&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]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -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 - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# 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 - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$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=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && 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 <<_LT_EOF > conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_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\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && 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 -rf 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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - - - - - - - - - - - - - - - - - - - - - - -# 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\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; 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 6606 "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; 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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - 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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - 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" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then : - $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$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 - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if test "${lt_cv_apple_cc_single_mod+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # 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 --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 - - - - - - - - # 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 - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if test "${lt_cv_objdir+set}" = set; then : - $as_echo_n "(cached) " >&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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - - - - - - - - - - - - - - -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. -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 delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 - -_LT_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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 - -_LT_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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -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;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7864: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:7868: \$? = $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 other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$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= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&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*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # 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' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - 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' - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - 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 - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - 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 - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - 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 - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 -$as_echo "$lt_prog_compiler_pic" >&6; } - - - - - - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8203: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:8207: \$? = $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 other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_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 - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test "${lt_cv_prog_compiler_static_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8308: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:8312: \$? = $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 - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8363: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:8367: \$? = $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 - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_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 - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # 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_|_GLOBAL__F[ID]_.*' - # 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. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # 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 - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu) - link_all_deplibs=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}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - 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 - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [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 - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&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. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - 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 - ;; - esac - ;; - - 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* | cegcc*) - # _LT_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 '\''/^[BCDGRS][ ]/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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag= - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; 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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; 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~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - 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*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&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. - -_LT_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 - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - 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 - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - 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" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - 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 "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - 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].*|aix[5-9]*) - 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_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - 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 - : - 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' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - 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 - - export_dynamic_flag_spec='${wl}-bexpall' - # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# 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 "$lt_aix_libpath_sed"` -fi -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 '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${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 '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# 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 "$lt_aix_libpath_sed"` -fi -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' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - 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 - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # 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 "X$deplibs" | $Xsed -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*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='' - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "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 $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - 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* | dragonfly*) - 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*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=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 - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -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*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=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 "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo(void) {} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - 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 - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - 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 - else - ld_shlibs=no - 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 "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - 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 "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared ${wl}-z ${wl}text ${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}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - 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' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $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 -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - 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*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - 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 - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - 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\":${as_lineno-$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=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - 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* - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 -$as_echo "$archive_cmds_need_lc" >&6; } - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_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. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -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" -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' - ;; - -aix[4-9]*) - 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*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - 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' - ;; - esac - ;; - -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* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) - 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~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - 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* | cegcc*) - # 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}${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`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - 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 - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - 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 - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - 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' - ;; - -interix[3-9]*) - 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' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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* | k*bsd*-gnu | kopensolaris*-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' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - - # 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=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | 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' - ;; - -netbsdelf*-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='NetBSD ld.elf_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=qnx - 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='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - 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" - ;; - -rdos*) - dynamic_linker=no - ;; - -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.3*) - 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 - 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 - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/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}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = 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 - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent 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_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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; 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 - - - - - - - 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* | cegcc*) - 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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""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 - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = x""yes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -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" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF -#line 10747 "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -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); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF -#line 10843 "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -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); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$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 - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&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" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "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" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&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 - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -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" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -ac_fn_c_check_type "$LINENO" "byte" "ac_cv_type_byte" "$ac_includes_default" -if test "x$ac_cv_type_byte" = x""yes; then : - $as_echo "#define HAVE_BYTE_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "ushort" "ac_cv_type_ushort" "$ac_includes_default" -if test "x$ac_cv_type_ushort" = x""yes; then : - $as_echo "#define HAVE_USHORT_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "ulong" "ac_cv_type_ulong" "$ac_includes_default" -if test "x$ac_cv_type_ulong" = x""yes; then : - $as_echo "#define HAVE_ULONG_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "u16" "ac_cv_type_u16" "$ac_includes_default" -if test "x$ac_cv_type_u16" = x""yes; then : - $as_echo "#define HAVE_U16_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "u32" "ac_cv_type_u32" "$ac_includes_default" -if test "x$ac_cv_type_u32" = x""yes; then : - $as_echo "#define HAVE_U32_TYPEDEF 1" >>confdefs.h - -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if test "${ac_cv_c_bigendian+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=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 - if test $ac_cv_c_bigendian = unknown; then - # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=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 - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; - -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; 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 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define BIG_ENDIAN_HOST 1" >>confdefs.h -;; #( - no) - $as_echo "#define LITTLE_ENDIAN_HOST 1" >>confdefs.h - ;; #( - universal) - -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - - ;; #( - *) - as_fn_error "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac - - -for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 -_ACEOF - -fi - -done - -for ac_header in zlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF - -else - as_fn_error "Zlib header (zlib.h) not found. Tor requires zlib to build. You may need to install a zlib development package." "$LINENO" 5 -fi - -done - - -ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = x""yes; then : - $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" -if test "x$ac_cv_func_vasprintf" = x""yes; then : - $as_echo "#define HAVE_VASPRINTF 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" -if test "x$ac_cv_func_vsnprintf" = x""yes; then : - $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vsprintf" "ac_cv_func_vsprintf" -if test "x$ac_cv_func_vsprintf" = x""yes; then : - $as_echo "#define HAVE_VSPRINTF 1" >>confdefs.h - -fi - - -ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : - $as_echo "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nsl_gethostbyname=yes -else - ac_cv_lib_nsl_gethostbyname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : - $as_echo "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h - - LIBS="${LIBS} -lsocket -lnsl" -fi - -fi - - -ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" -if test "x$ac_cv_func_gethostbyname_r" = x""yes; then : - - $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h - - # We look for the one that returns `int'. - # Hopefully this check is robust enough. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "int.*gethostbyname_r" >/dev/null 2>&1; then : - - $as_echo "#define GETHOSTBYNAME_R_RETURNS_INT 1" >>confdefs.h - -fi -rm -f conftest* - - -fi - - -ac_config_files="$ac_config_files Makefile GeoIP.spec libGeoIP/Makefile apps/Makefile conf/Makefile data/Makefile man/Makefile test/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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - - - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. -as_fn_error () -{ - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 - fi - $as_echo "$as_me: error: $1" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -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 - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# 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 - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 GeoIP $as_me 1.4.8, which was -generated by GNU Autoconf 2.65. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -GeoIP config.status 1.4.8 -configured by $0, generated by GNU Autoconf 2.65, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2009 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# 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 - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' -macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' -enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' -pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' -host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' -host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' -host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' -build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' -build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' -build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' -SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' -Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' -GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' -EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' -FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' -LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' -NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' -LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' -ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' -exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' -lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' -reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' -AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' -STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' -RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' -compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' -GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' -SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' -ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' -need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' -LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' -libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' -fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' -version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' -runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' -libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' -soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' -old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' -striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# Quote evaled strings. -for var in SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -AR \ -AR_FLAGS \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -SHELL \ -ECHO \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_wl \ -lt_prog_compiler_pic \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ -hardcode_libdir_separator \ -fix_srcfile_path \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -finish_eval \ -old_striplib \ -striplib; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` - ;; -esac - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "GeoIP.spec") CONFIG_FILES="$CONFIG_FILES GeoIP.spec" ;; - "libGeoIP/Makefile") CONFIG_FILES="$CONFIG_FILES libGeoIP/Makefile" ;; - "apps/Makefile") CONFIG_FILES="$CONFIG_FILES apps/Makefile" ;; - "conf/Makefile") CONFIG_FILES="$CONFIG_FILES conf/Makefile" ;; - "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; - "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; - - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - 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_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 - ;; - - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # 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 - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="" - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# 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 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# 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 - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# 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 - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that does not interpret backslashes. -ECHO=$lt_ECHO - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# 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 - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# 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 - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# 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 - -# 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 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# 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 - -# 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 - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# 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 a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# 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 DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# 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 - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path=$lt_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 - -# 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 - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_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 -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $* )) -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} - -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} - -# sed scripts: -my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[^=]*=//' - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$@"` -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` -} - -_LT_EOF -esac - -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1+=\$2" -} -_LT_EOF - ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1=\$$1\$2" -} - -_LT_EOF - ;; - esac - - - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# 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 || as_fn_exit $? -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in b/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in deleted file mode 100644 index 77309b18..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in +++ /dev/null @@ -1,50 +0,0 @@ -dnl AM_CONFIG_HEADER(config.h) - -AC_INIT([GeoIP], [1.4.8],[support@maxmind.com],[GeoIP]) -AC_GNU_SOURCE -AM_INIT_AUTOMAKE -AC_CONFIG_SRCDIR([libGeoIP/GeoIP.c]) -GEOIP_VERSION_INFO=`echo $VERSION | awk -F. '{ printf "%d:%d:%d", $1+$2, $3, $2 }'` -AC_SUBST(GEOIP_VERSION_INFO) - -AC_PROG_CC -AC_PROG_LIBTOOL - -AC_CHECK_TYPE(byte,[AC_DEFINE(HAVE_BYTE_TYPEDEF)],[]) -AC_CHECK_TYPE(ushort,[AC_DEFINE(HAVE_USHORT_TYPEDEF)],[]) -AC_CHECK_TYPE(ulong,[AC_DEFINE(HAVE_ULONG_TYPEDEF)],[]) -AC_CHECK_TYPE(u16,[AC_DEFINE(HAVE_U16_TYPEDEF)],[]) -AC_CHECK_TYPE(u32,[AC_DEFINE(HAVE_U32_TYPEDEF)],[]) - -AC_C_BIGENDIAN([AC_DEFINE(BIG_ENDIAN_HOST,1)],[AC_DEFINE(LITTLE_ENDIAN_HOST,1)]) - -AC_CHECK_HEADERS(stdint.h) -AC_CHECK_HEADERS(zlib.h, , AC_MSG_ERROR(Zlib header (zlib.h) not found. Tor requires zlib to build. You may need to install a zlib development package.)) - -AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY)) -AC_CHECK_FUNC(vasprintf, AC_DEFINE(HAVE_VASPRINTF)) -AC_CHECK_FUNC(vsnprintf, AC_DEFINE(HAVE_VSNPRINTF)) -AC_CHECK_FUNC(vsprintf, AC_DEFINE(HAVE_VSPRINTF)) - -AC_CHECK_FUNC(gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME), - AC_CHECK_LIB(nsl, gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME) - LIBS="${LIBS} -lsocket -lnsl")) - -AC_CHECK_FUNC(gethostbyname_r, [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R) - # We look for the one that returns `int'. - # Hopefully this check is robust enough. - AC_EGREP_HEADER(int.*gethostbyname_r, netdb.h, [ - AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)]) - ]) - -AC_OUTPUT([ -Makefile -GeoIP.spec -libGeoIP/Makefile -apps/Makefile -conf/Makefile -data/Makefile -man/Makefile -test/Makefile -]) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat b/Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat deleted file mode 100644 index f92f58115ec131d70d8e06cb00ada1b0c78087e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1348660 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

tdP%4Jf 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�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 V$uP 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

qA>85yGg{3U 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

N@Kd(c!>Ykc*$(S3KsJrPev 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 r1m;XiWtQ(!w?BA?lD^PdJIJ?RAgQPjW6ZHKTW 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
- -

Expat is a library, written in C, for parsing XML documents. It's -the underlying XML parser for the open source Mozilla project, Perl's -XML::Parser, Python's xml.parsers.expat, and -other open-source XML parsers.

- -

This library is the creation of James Clark, who's also given us -groff (an nroff look-alike), Jade (an implemention of ISO's DSSSL -stylesheet language for SGML), XP (a Java XML parser package), XT (a -Java XSL engine). James was also the technical lead on the XML -Working Group at W3C that produced the XML specification.

- -

This is free software, licensed under the MIT/X Consortium license. You may download it -from the Expat home page. -

- -

The bulk of this document was originally commissioned as an article -by XML.com. They graciously allowed -Clark Cooper to retain copyright and to distribute it with Expat. -This version has been substantially extended to include documentation -on features which have been added since the original article was -published, and additional information on using the original -interface.

- -
-

Table of Contents

- - -
-

Overview

- -

Expat is a stream-oriented parser. You register callback (or -handler) functions with the parser and then start feeding it the -document. As the parser recognizes parts of the document, it will -call the appropriate handler for that part (if you've registered one.) -The document is fed to the parser in pieces, so you can start parsing -before you have all the document. This also allows you to parse really -huge documents that won't fit into memory.

- -

Expat can be intimidating due to the many kinds of handlers and -options you can set. But you only need to learn four functions in -order to do 90% of what you'll want to do with it:

- -
- -
XML_ParserCreate
-
Create a new parser object.
- -
XML_SetElementHandler
-
Set handlers for start and end tags.
- -
XML_SetCharacterDataHandler
-
Set handler for text.
- -
XML_Parse
-
Pass a buffer full of document to the parser
-
- -

These functions and others are described in the reference part of this document. The reference -section also describes in detail the parameters passed to the -different types of handlers.

- -

Let's look at a very simple example program that only uses 3 of the -above functions (it doesn't need to set a character handler.) The -program outline.c prints an -element outline, indenting child elements to distinguish them from the -parent element that contains them. The start handler does all the -work. It prints two indenting spaces for every level of ancestor -elements, then it prints the element and attribute -information. Finally it increments the global Depth -variable.

- -
-int Depth;
-
-void XMLCALL
-start(void *data, const char *el, const char **attr) {
-  int i;
-
-  for (i = 0; i < Depth; i++)
-    printf("  ");
-
-  printf("%s", el);
-
-  for (i = 0; attr[i]; i += 2) {
-    printf(" %s='%s'", attr[i], attr[i + 1]);
-  }
-
-  printf("\n");
-  Depth++;
-}  /* End of start handler */
-
- -

The end tag simply does the bookkeeping work of decrementing -Depth.

-
-void XMLCALL
-end(void *data, const char *el) {
-  Depth--;
-}  /* End of end handler */
-
- -

Note the XMLCALL annotation used for the callbacks. -This is used to ensure that the Expat and the callbacks are using the -same calling convention in case the compiler options used for Expat -itself and the client code are different. Expat tries not to care -what the default calling convention is, though it may require that it -be compiled with a default convention of "cdecl" on some platforms. -For code which uses Expat, however, the calling convention is -specified by the XMLCALL annotation on most platforms; -callbacks should be defined using this annotation.

- -

The XMLCALL annotation was added in Expat 1.95.7, but -existing working Expat applications don't need to add it (since they -are already using the "cdecl" calling convention, or they wouldn't be -working). The annotation is only needed if the default calling -convention may be something other than "cdecl". To use the annotation -safely with older versions of Expat, you can conditionally define it -after including Expat's header file:

- -
-#include <expat.h>
-
-#ifndef XMLCALL
-#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
-#define XMLCALL __cdecl
-#elif defined(__GNUC__)
-#define XMLCALL __attribute__((cdecl))
-#else
-#define XMLCALL
-#endif
-#endif
-
- -

After creating the parser, the main program just has the job of -shoveling the document to the parser so that it can do its work.

- -
-

Building and Installing Expat

- -

The Expat distribution comes as a compressed (with GNU gzip) tar -file. You may download the latest version from Source Forge. After -unpacking this, cd into the directory. Then follow either the Win32 -directions or Unix directions below.

- -

Building under Win32

- -

If you're using the GNU compiler under cygwin, follow the Unix -directions in the next section. Otherwise if you have Microsoft's -Developer Studio installed, then from Windows Explorer double-click on -"expat.dsp" in the lib directory and build and install in the usual -manner.

- -

Alternatively, you may download the Win32 binary package that -contains the "expat.h" include file and a pre-built DLL.

- -

Building under Unix (or GNU)

- -

First you'll need to run the configure shell script in order to -configure the Makefiles and headers for your system.

- -

If you're happy with all the defaults that configure picks for you, -and you have permission on your system to install into /usr/local, you -can install Expat with this sequence of commands:

- -
-./configure
-make
-make install
-
- -

There are some options that you can provide to this script, but the -only one we'll mention here is the --prefix option. You -can find out all the options available by running configure with just -the --help option.

- -

By default, the configure script sets things up so that the library -gets installed in /usr/local/lib and the associated -header file in /usr/local/include. But if you were to -give the option, --prefix=/home/me/mystuff, then the -library and header would get installed in -/home/me/mystuff/lib and -/home/me/mystuff/include respectively.

- -

Configuring Expat Using the Pre-Processor

- -

Expat's feature set can be configured using a small number of -pre-processor definitions. The definition of this symbols does not -affect the set of entry points for Expat, only the behavior of the API -and the definition of character types in the case of -XML_UNICODE_WCHAR_T. The symbols are:

- -
-
XML_DTD
-
Include support for using and reporting DTD-based content. If -this is defined, default attribute values from an external DTD subset -are reported and attribute value normalization occurs based on the -type of attributes defined in the external subset. Without -this, Expat has a smaller memory footprint and can be faster, but will -not load external entities or process conditional sections. This does -not affect the set of functions available in the API.
- -
XML_NS
-
When defined, support for the Namespaces in XML -specification is included.
- -
XML_UNICODE
-
When defined, character data reported to the application is -encoded in UTF-16 using wide characters of the type -XML_Char. This is implied if -XML_UNICODE_WCHAR_T is defined.
- -
XML_UNICODE_WCHAR_T
-
If defined, causes the XML_Char character type to be -defined using the wchar_t type; otherwise, unsigned -short is used. Defining this implies -XML_UNICODE.
- -
XML_LARGE_SIZE
-
If defined, causes the XML_Size and XML_Index -integer types to be at least 64 bits in size. This is intended to support -processing of very large input streams, where the return values of -XML_GetCurrentByteIndex, -XML_GetCurrentLineNumber and -XML_GetCurrentColumnNumber -could overflow. It may not be supported by all compilers, and is turned -off by default.
- -
XML_CONTEXT_BYTES
-
The number of input bytes of markup context which the parser will -ensure are available for reporting via XML_GetInputContext. This is -normally set to 1024, and must be set to a positive interger. If this -is not defined, the input context will not be available and XML_GetInputContext will -always report NULL. Without this, Expat has a smaller memory -footprint and can be faster.
- -
XML_STATIC
-
On Windows, this should be set if Expat is going to be linked -statically with the code that calls it; this is required to get all -the right MSVC magic annotations correct. This is ignored on other -platforms.
- -
XML_ATTR_INFO
-
If defined, makes the the additional function XML_GetAttributeInfo available -for reporting attribute byte offsets.
-
- -
-

Using Expat

- -

Compiling and Linking Against Expat

- -

Unless you installed Expat in a location not expected by your -compiler and linker, all you have to do to use Expat in your programs -is to include the Expat header (#include <expat.h>) -in your files that make calls to it and to tell the linker that it -needs to link against the Expat library. On Unix systems, this would -usually be done with the -lexpat argument. Otherwise, -you'll need to tell the compiler where to look for the Expat header -and the linker where to find the Expat library. You may also need to -take steps to tell the operating system where to find this library at -run time.

- -

On a Unix-based system, here's what a Makefile might look like when -Expat is installed in a standard location:

- -
-CC=cc
-LDFLAGS=
-LIBS= -lexpat
-xmlapp: xmlapp.o
-        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
-
- -

If you installed Expat in, say, /home/me/mystuff, then -the Makefile would look like this:

- -
-CC=cc
-CFLAGS= -I/home/me/mystuff/include
-LDFLAGS=
-LIBS= -L/home/me/mystuff/lib -lexpat
-xmlapp: xmlapp.o
-        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
-
- -

You'd also have to set the environment variable -LD_LIBRARY_PATH to /home/me/mystuff/lib (or -to ${LD_LIBRARY_PATH}:/home/me/mystuff/lib if -LD_LIBRARY_PATH already has some directories in it) in order to run -your application.

- -

Expat Basics

- -

As we saw in the example in the overview, the first step in parsing -an XML document with Expat is to create a parser object. There are three functions in the Expat API for creating a -parser object. However, only two of these (XML_ParserCreate and XML_ParserCreateNS) can be used for -constructing a parser for a top-level document. The object returned -by these functions is an opaque pointer (i.e. "expat.h" declares it as -void *) to data with further internal structure. In order to free the -memory associated with this object you must call XML_ParserFree. Note that if you have -provided any user data that gets stored in the -parser, then your application is responsible for freeing it prior to -calling XML_ParserFree.

- -

The objects returned by the parser creation functions are good for -parsing only one XML document or external parsed entity. If your -application needs to parse many XML documents, then it needs to create -a parser object for each one. The best way to deal with this is to -create a higher level object that contains all the default -initialization you want for your parser objects.

- -

Walking through a document hierarchy with a stream oriented parser -will require a good stack mechanism in order to keep track of current -context. For instance, to answer the simple question, "What element -does this text belong to?" requires a stack, since the parser may have -descended into other elements that are children of the current one and -has encountered this text on the way out.

- -

The things you're likely to want to keep on a stack are the -currently opened element and it's attributes. You push this -information onto the stack in the start handler and you pop it off in -the end handler.

- -

For some tasks, it is sufficient to just keep information on what -the depth of the stack is (or would be if you had one.) The outline -program shown above presents one example. Another such task would be -skipping over a complete element. When you see the start tag for the -element you want to skip, you set a skip flag and record the depth at -which the element started. When the end tag handler encounters the -same depth, the skipped element has ended and the flag may be -cleared. If you follow the convention that the root element starts at -1, then you can use the same variable for skip flag and skip -depth.

- -
-void
-init_info(Parseinfo *info) {
-  info->skip = 0;
-  info->depth = 1;
-  /* Other initializations here */
-}  /* End of init_info */
-
-void XMLCALL
-rawstart(void *data, const char *el, const char **attr) {
-  Parseinfo *inf = (Parseinfo *) data;
-
-  if (! inf->skip) {
-    if (should_skip(inf, el, attr)) {
-      inf->skip = inf->depth;
-    }
-    else
-      start(inf, el, attr);     /* This does rest of start handling */
-  }
-
-  inf->depth++;
-}  /* End of rawstart */
-
-void XMLCALL
-rawend(void *data, const char *el) {
-  Parseinfo *inf = (Parseinfo *) data;
-
-  inf->depth--;
-
-  if (! inf->skip)
-    end(inf, el);              /* This does rest of end handling */
-
-  if (inf->skip == inf->depth)
-    inf->skip = 0;
-}  /* End rawend */
-
- -

Notice in the above example the difference in how depth is -manipulated in the start and end handlers. The end tag handler should -be the mirror image of the start tag handler. This is necessary to -properly model containment. Since, in the start tag handler, we -incremented depth after the main body of start tag code, then -in the end handler, we need to manipulate it before the main -body. If we'd decided to increment it first thing in the start -handler, then we'd have had to decrement it last thing in the end -handler.

- -

Communicating between handlers

- -

In order to be able to pass information between different handlers -without using globals, you'll need to define a data structure to hold -the shared variables. You can then tell Expat (with the XML_SetUserData function) to pass a -pointer to this structure to the handlers. This is the first -argument received by most handlers. In the reference section, an argument to a callback function is named -userData and have type void * if the user -data is passed; it will have the type XML_Parser if the -parser itself is passed. When the parser is passed, the user data may -be retrieved using XML_GetUserData.

- -

One common case where multiple calls to a single handler may need -to communicate using an application data structure is the case when -content passed to the character data handler (set by XML_SetCharacterDataHandler) needs to be accumulated. A -common first-time mistake with any of the event-oriented interfaces to -an XML parser is to expect all the text contained in an element to be -reported by a single call to the character data handler. Expat, like -many other XML parsers, reports such data as a sequence of calls; -there's no way to know when the end of the sequence is reached until a -different callback is made. A buffer referenced by the user data -structure proves both an effective and convenient place to accumulate -character data.

- - - - -

XML Version

- -

Expat is an XML 1.0 parser, and as such never complains based on -the value of the version pseudo-attribute in the XML -declaration, if present.

- -

If an application needs to check the version number (to support -alternate processing), it should use the XML_SetXmlDeclHandler function to -set a handler that uses the information in the XML declaration to -determine what to do. This example shows how to check that only a -version number of "1.0" is accepted:

- -
-static int wrong_version;
-static XML_Parser parser;
-
-static void XMLCALL
-xmldecl_handler(void            *userData,
-                const XML_Char  *version,
-                const XML_Char  *encoding,
-                int              standalone)
-{
-  static const XML_Char Version_1_0[] = {'1', '.', '0', 0};
-
-  int i;
-
-  for (i = 0; i < (sizeof(Version_1_0) / sizeof(Version_1_0[0])); ++i) {
-    if (version[i] != Version_1_0[i]) {
-      wrong_version = 1;
-      /* also clear all other handlers: */
-      XML_SetCharacterDataHandler(parser, NULL);
-      ...
-      return;
-    }
-  }
-  ...
-}
-
- -

Namespace Processing

- -

When the parser is created using the XML_ParserCreateNS, function, Expat -performs namespace processing. Under namespace processing, Expat -consumes xmlns and xmlns:... attributes, -which declare namespaces for the scope of the element in which they -occur. This means that your start handler will not see these -attributes. Your application can still be informed of these -declarations by setting namespace declaration handlers with XML_SetNamespaceDeclHandler.

- -

Element type and attribute names that belong to a given namespace -are passed to the appropriate handler in expanded form. By default -this expanded form is a concatenation of the namespace URI, the -separator character (which is the 2nd argument to XML_ParserCreateNS), and the local -name (i.e. the part after the colon). Names with undeclared prefixes -are not well-formed when namespace processing is enabled, and will -trigger an error. Unprefixed attribute names are never expanded, -and unprefixed element names are only expanded when they are in the -scope of a default namespace.

- -

However if XML_SetReturnNSTriplet has been called with a non-zero -do_nst parameter, then the expanded form for names with -an explicit prefix is a concatenation of: URI, separator, local name, -separator, prefix.

- -

You can set handlers for the start of a namespace declaration and -for the end of a scope of a declaration with the XML_SetNamespaceDeclHandler -function. The StartNamespaceDeclHandler is called prior to the start -tag handler and the EndNamespaceDeclHandler is called after the -corresponding end tag that ends the namespace's scope. The namespace -start handler gets passed the prefix and URI for the namespace. For a -default namespace declaration (xmlns='...'), the prefix will be null. -The URI will be null for the case where the default namespace is being -unset. The namespace end handler just gets the prefix for the closing -scope.

- -

These handlers are called for each declaration. So if, for -instance, a start tag had three namespace declarations, then the -StartNamespaceDeclHandler would be called three times before the start -tag handler is called, once for each declaration.

- -

Character Encodings

- -

While XML is based on Unicode, and every XML processor is required -to recognized UTF-8 and UTF-16 (1 and 2 byte encodings of Unicode), -other encodings may be declared in XML documents or entities. For the -main document, an XML declaration may contain an encoding -declaration:

-
-<?xml version="1.0" encoding="ISO-8859-2"?>
-
- -

External parsed entities may begin with a text declaration, which -looks like an XML declaration with just an encoding declaration:

-
-<?xml encoding="Big5"?>
-
- -

With Expat, you may also specify an encoding at the time of -creating a parser. This is useful when the encoding information may -come from a source outside the document itself (like a higher level -protocol.)

- -

There are four built-in encodings -in Expat:

-
    -
  • UTF-8
  • -
  • UTF-16
  • -
  • ISO-8859-1
  • -
  • US-ASCII
  • -
- -

Anything else discovered in an encoding declaration or in the -protocol encoding specified in the parser constructor, triggers a call -to the UnknownEncodingHandler. This handler gets passed -the encoding name and a pointer to an XML_Encoding data -structure. Your handler must fill in this structure and return -XML_STATUS_OK if it knows how to deal with the -encoding. Otherwise the handler should return -XML_STATUS_ERROR. The handler also gets passed a pointer -to an optional application data structure that you may indicate when -you set the handler.

- -

Expat places restrictions on character encodings that it can -support by filling in the XML_Encoding structure. -include file:

-
    -
  1. Every ASCII character that can appear in a well-formed XML document -must be represented by a single byte, and that byte must correspond to -it's ASCII encoding (except for the characters $@\^'{}~)
  2. -
  3. Characters must be encoded in 4 bytes or less.
  4. -
  5. All characters encoded must have Unicode scalar values less than or -equal to 65535 (0xFFFF)This does not apply to the built-in support -for UTF-16 and UTF-8
  6. -
  7. No character may be encoded by more that one distinct sequence of -bytes
  8. -
- -

XML_Encoding contains an array of integers that -correspond to the 1st byte of an encoding sequence. If the value in -the array for a byte is zero or positive, then the byte is a single -byte encoding that encodes the Unicode scalar value contained in the -array. A -1 in this array indicates a malformed byte. If the value is --2, -3, or -4, then the byte is the beginning of a 2, 3, or 4 byte -sequence respectively. Multi-byte sequences are sent to the convert -function pointed at in the XML_Encoding structure. This -function should return the Unicode scalar value for the sequence or -1 -if the sequence is malformed.

- -

One pitfall that novice Expat users are likely to fall into is that -although Expat may accept input in various encodings, the strings that -it passes to the handlers are always encoded in UTF-8 or UTF-16 -(depending on how Expat was compiled). Your application is responsible -for any translation of these strings into other encodings.

- -

Handling External Entity References

- -

Expat does not read or parse external entities directly. Note that -any external DTD is a special case of an external entity. If you've -set no ExternalEntityRefHandler, then external entity -references are silently ignored. Otherwise, it calls your handler with -the information needed to read and parse the external entity.

- -

Your handler isn't actually responsible for parsing the entity, but -it is responsible for creating a subsidiary parser with XML_ExternalEntityParserCreate that will do the job. This -returns an instance of XML_Parser that has handlers and -other data structures initialized from the parent parser. You may then -use XML_Parse or XML_ParseBuffer calls against this -parser. Since external entities my refer to other external entities, -your handler should be prepared to be called recursively.

- -

Parsing DTDs

- -

In order to parse parameter entities, before starting the parse, -you must call XML_SetParamEntityParsing with one of the following -arguments:

-
-
XML_PARAM_ENTITY_PARSING_NEVER
-
Don't parse parameter entities or the external subset
-
XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
-
Parse parameter entites and the external subset unless -standalone was set to "yes" in the XML declaration.
-
XML_PARAM_ENTITY_PARSING_ALWAYS
-
Always parse parameter entities and the external subset
-
- -

In order to read an external DTD, you also have to set an external -entity reference handler as described above.

- -

Temporarily Stopping Parsing

- -

Expat 1.95.8 introduces a new feature: its now possible to stop -parsing temporarily from within a handler function, even if more data -has already been passed into the parser. Applications for this -include

- -
    -
  • Supporting the XInclude specification.
  • - -
  • Delaying further processing until additional information is - available from some other source.
  • - -
  • Adjusting processor load as task priorities shift within an - application.
  • - -
  • Stopping parsing completely (simply free or reset the parser - instead of resuming in the outer parsing loop). This can be useful - if a application-domain error is found in the XML being parsed or if - the result of the parse is determined not to be useful after - all.
  • -
- -

To take advantage of this feature, the main parsing loop of an -application needs to support this specifically. It cannot be -supported with a parsing loop compatible with Expat 1.95.7 or -earlier (though existing loops will continue to work without -supporting the stop/resume feature).

- -

An application that uses this feature for a single parser will have -the rough structure (in pseudo-code):

- -
-fd = open_input()
-p = create_parser()
-
-if parse_xml(p, fd) {
-  /* suspended */
-
-  int suspended = 1;
-
-  while (suspended) {
-    do_something_else()
-    if ready_to_resume() {
-      suspended = continue_parsing(p, fd);
-    }
-  }
-}
-
- -

An application that may resume any of several parsers based on -input (either from the XML being parsed or some other source) will -certainly have more interesting control structures.

- -

This C function could be used for the parse_xml -function mentioned in the pseudo-code above:

- -
-#define BUFF_SIZE 10240
-
-/* Parse a document from the open file descriptor 'fd' until the parse
-   is complete (the document has been completely parsed, or there's
-   been an error), or the parse is stopped.  Return non-zero when
-   the parse is merely suspended.
-*/
-int
-parse_xml(XML_Parser p, int fd)
-{
-  for (;;) {
-    int last_chunk;
-    int bytes_read;
-    enum XML_Status status;
-
-    void *buff = XML_GetBuffer(p, BUFF_SIZE);
-    if (buff == NULL) {
-      /* handle error... */
-      return 0;
-    }
-    bytes_read = read(fd, buff, BUFF_SIZE);
-    if (bytes_read < 0) {
-      /* handle error... */
-      return 0;
-    }
-    status = XML_ParseBuffer(p, bytes_read, bytes_read == 0);
-    switch (status) {
-      case XML_STATUS_ERROR:
-        /* handle error... */
-        return 0;
-      case XML_STATUS_SUSPENDED:
-        return 1;
-    }
-    if (bytes_read == 0)
-      return 0;
-  }
-}
-
- -

The corresponding continue_parsing function is -somewhat simpler, since it only need deal with the return code from -XML_ResumeParser; it can -delegate the input handling to the parse_xml -function:

- -
-/* Continue parsing a document which had been suspended.  The 'p' and
-   'fd' arguments are the same as passed to parse_xml().  Return
-   non-zero when the parse is suspended.
-*/
-int
-continue_parsing(XML_Parser p, int fd)
-{
-  enum XML_Status status = XML_ResumeParser(p);
-  switch (status) {
-    case XML_STATUS_ERROR:
-      /* handle error... */
-      return 0;
-    case XML_ERROR_NOT_SUSPENDED:
-      /* handle error... */
-      return 0;.
-    case XML_STATUS_SUSPENDED:
-      return 1;
-  }
-  return parse_xml(p, fd);
-}
-
- -

Now that we've seen what a mess the top-level parsing loop can -become, what have we gained? Very simply, we can now use the XML_StopParser function to stop -parsing, without having to go to great lengths to avoid additional -processing that we're expecting to ignore. As a bonus, we get to stop -parsing temporarily, and come back to it when we're -ready.

- -

To stop parsing from a handler function, use the XML_StopParser function. This function -takes two arguments; the parser being stopped and a flag indicating -whether the parse can be resumed in the future.

- - - - -
- - -

Expat Reference

- -

Parser Creation

- -
-XML_Parser XMLCALL
-XML_ParserCreate(const XML_Char *encoding);
-
-
-Construct a new parser. If encoding is non-null, it specifies a -character encoding to use for the document. This overrides the document -encoding declaration. There are four built-in encodings: -
    -
  • US-ASCII
  • -
  • UTF-8
  • -
  • UTF-16
  • -
  • ISO-8859-1
  • -
-Any other value will invoke a call to the UnknownEncodingHandler. -
- -
-XML_Parser XMLCALL
-XML_ParserCreateNS(const XML_Char *encoding,
-                   XML_Char sep);
-
-
-Constructs a new parser that has namespace processing in effect. Namespace -expanded element names and attribute names are returned as a concatenation -of the namespace URI, sep, and the local part of the name. This -means that you should pick a character for sep that can't be part -of an URI. Since Expat does not check namespace URIs for conformance, the -only safe choice for a namespace separator is a character that is illegal -in XML. For instance, '\xFF' is not legal in UTF-8, and -'\xFFFF' is not legal in UTF-16. There is a special case when -sep is the null character '\0': the namespace URI and -the local part will be concatenated without any separator - this is intended -to support RDF processors. It is a programming error to use the null separator -with namespace triplets.
- -
-XML_Parser XMLCALL
-XML_ParserCreate_MM(const XML_Char *encoding,
-                    const XML_Memory_Handling_Suite *ms,
-		    const XML_Char *sep);
-
-
-typedef struct {
-  void *(XMLCALL *malloc_fcn)(size_t size);
-  void *(XMLCALL *realloc_fcn)(void *ptr, size_t size);
-  void (XMLCALL *free_fcn)(void *ptr);
-} XML_Memory_Handling_Suite;
-
-
-

Construct a new parser using the suite of memory handling functions -specified in ms. If ms is NULL, then use the -standard set of memory management functions. If sep is -non NULL, then namespace processing is enabled in the created parser -and the character pointed at by sep is used as the separator between -the namespace URI and the local part of the name.

-
- -
-XML_Parser XMLCALL
-XML_ExternalEntityParserCreate(XML_Parser p,
-                               const XML_Char *context,
-                               const XML_Char *encoding);
-
-
-Construct a new XML_Parser object for parsing an external -general entity. Context is the context argument passed in a call to a -ExternalEntityRefHandler. Other state information such as handlers, -user data, namespace processing is inherited from the parser passed as -the 1st argument. So you shouldn't need to call any of the behavior -changing functions on this parser (unless you want it to act -differently than the parent parser). -
- -
-void XMLCALL
-XML_ParserFree(XML_Parser p);
-
-
-Free memory used by the parser. Your application is responsible for -freeing any memory associated with user data. -
- -
-XML_Bool XMLCALL
-XML_ParserReset(XML_Parser p,
-                const XML_Char *encoding);
-
-
-Clean up the memory structures maintained by the parser so that it may -be used again. After this has been called, parser is -ready to start parsing a new document. All handlers are cleared from -the parser, except for the unknownEncodingHandler. The parser's external -state is re-initialized except for the values of ns and ns_triplets. -This function may not be used on a parser created using XML_ExternalEntityParserCreate; it will return XML_FALSE in that case. Returns -XML_TRUE on success. Your application is responsible for -dealing with any memory associated with user data. -
- -

Parsing

- -

To state the obvious: the three parsing functions XML_Parse, -XML_ParseBuffer and -XML_GetBuffer must not be called from within a handler -unless they operate on a separate parser instance, that is, one that -did not call the handler. For example, it is OK to call the parsing -functions from within an XML_ExternalEntityRefHandler, -if they apply to the parser created by -XML_ExternalEntityParserCreate.

- -

Note: the len argument passed to these functions -should be considerably less than the maximum value for an integer, -as it could create an integer overflow situation if the added -lengths of a buffer and the unprocessed portion of the previous buffer -exceed the maximum integer value. Input data at the end of a buffer -will remain unprocessed if it is part of an XML token for which the -end is not part of that buffer.

- -
-enum XML_Status XMLCALL
-XML_Parse(XML_Parser p,
-          const char *s,
-          int len,
-          int isFinal);
-
-
-enum XML_Status {
-  XML_STATUS_ERROR = 0,
-  XML_STATUS_OK = 1
-};
-
-
-Parse some more of the document. The string s is a buffer -containing part (or perhaps all) of the document. The number of bytes of s -that are part of the document is indicated by len. This means -that s doesn't have to be null terminated. It also means that -if len is larger than the number of bytes in the block of -memory that s points at, then a memory fault is likely. The -isFinal parameter informs the parser that this is the last -piece of the document. Frequently, the last piece is empty (i.e. -len is zero.) -If a parse error occurred, it returns XML_STATUS_ERROR. -Otherwise it returns XML_STATUS_OK value. -
- -
-enum XML_Status XMLCALL
-XML_ParseBuffer(XML_Parser p,
-                int len,
-                int isFinal);
-
-
-This is just like XML_Parse, -except in this case Expat provides the buffer. By obtaining the -buffer from Expat with the XML_GetBuffer function, the application can avoid double -copying of the input. -
- -
-void * XMLCALL
-XML_GetBuffer(XML_Parser p,
-              int len);
-
-
-Obtain a buffer of size len to read a piece of the document -into. A NULL value is returned if Expat can't allocate enough memory for -this buffer. This has to be called prior to every call to -XML_ParseBuffer. A -typical use would look like this: - -
-for (;;) {
-  int bytes_read;
-  void *buff = XML_GetBuffer(p, BUFF_SIZE);
-  if (buff == NULL) {
-    /* handle error */
-  }
-
-  bytes_read = read(docfd, buff, BUFF_SIZE);
-  if (bytes_read < 0) {
-    /* handle error */
-  }
-
-  if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) {
-    /* handle parse error */
-  }
-
-  if (bytes_read == 0)
-    break;
-}
-
-
- -
-enum XML_Status XMLCALL
-XML_StopParser(XML_Parser p,
-               XML_Bool resumable);
-
-
- -

Stops parsing, causing XML_Parse or XML_ParseBuffer to return. Must be called from within a -call-back handler, except when aborting (when resumable -is XML_FALSE) an already suspended parser. Some -call-backs may still follow because they would otherwise get -lost, including -

    -
  • the end element handler for empty elements when stopped in the - start element handler,
  • -
  • the end namespace declaration handler when stopped in the end - element handler,
  • -
  • the character data handler when stopped in the character data handler - while making multiple call-backs on a contiguous chunk of characters,
  • -
-and possibly others.

- -

This can be called from most handlers, including DTD related -call-backs, except when parsing an external parameter entity and -resumable is XML_TRUE. Returns -XML_STATUS_OK when successful, -XML_STATUS_ERROR otherwise. The possible error codes -are:

-
-
XML_ERROR_SUSPENDED
-
when suspending an already suspended parser.
-
XML_ERROR_FINISHED
-
when the parser has already finished.
-
XML_ERROR_SUSPEND_PE
-
when suspending while parsing an external PE.
-
- -

Since the stop/resume feature requires application support in the -outer parsing loop, it is an error to call this function for a parser -not being handled appropriately; see Temporarily Stopping Parsing for more information.

- -

When resumable is XML_TRUE then parsing -is suspended, that is, XML_Parse and XML_ParseBuffer return XML_STATUS_SUSPENDED. -Otherwise, parsing is aborted, that is, XML_Parse and XML_ParseBuffer return -XML_STATUS_ERROR with error code -XML_ERROR_ABORTED.

- -

Note: -This will be applied to the current parser instance only, that is, if -there is a parent parser then it will continue parsing when the -external entity reference handler returns. It is up to the -implementation of that handler to call XML_StopParser on the parent parser -(recursively), if one wants to stop parsing altogether.

- -

When suspended, parsing can be resumed by calling XML_ResumeParser.

- -

New in Expat 1.95.8.

-
- -
-enum XML_Status XMLCALL
-XML_ResumeParser(XML_Parser p);
-
-
-

Resumes parsing after it has been suspended with XML_StopParser. Must not be called from -within a handler call-back. Returns same status codes as XML_Parse or XML_ParseBuffer. An additional error -code, XML_ERROR_NOT_SUSPENDED, will be returned if the -parser was not currently suspended.

- -

Note: -This must be called on the most deeply nested child parser instance -first, and on its parent parser only after the child parser has -finished, to be applied recursively until the document entity's parser -is restarted. That is, the parent parser will not resume by itself -and it is up to the application to call XML_ResumeParser on it at the -appropriate moment.

- -

New in Expat 1.95.8.

-
- -
-void XMLCALL
-XML_GetParsingStatus(XML_Parser p,
-                     XML_ParsingStatus *status);
-
-
-enum XML_Parsing {
-  XML_INITIALIZED,
-  XML_PARSING,
-  XML_FINISHED,
-  XML_SUSPENDED
-};
-
-typedef struct {
-  enum XML_Parsing parsing;
-  XML_Bool finalBuffer;
-} XML_ParsingStatus;
-
-
-

Returns status of parser with respect to being initialized, -parsing, finished, or suspended, and whether the final buffer is being -processed. The status parameter must not be -NULL.

- -

New in Expat 1.95.8.

-
- - -

Handler Setting

- -

Although handlers are typically set prior to parsing and left alone, an -application may choose to set or change the handler for a parsing event -while the parse is in progress. For instance, your application may choose -to ignore all text not descended from a para element. One -way it could do this is to set the character handler when a para start tag -is seen, and unset it for the corresponding end tag.

- -

A handler may be unset by providing a NULL pointer to the -appropriate handler setter. None of the handler setting functions have -a return value.

- -

Your handlers will be receiving strings in arrays of type -XML_Char. This type is conditionally defined in expat.h as -either char, wchar_t or unsigned short. -The former implies UTF-8 encoding, the latter two imply UTF-16 encoding. -Note that you'll receive them in this form independent of the original -encoding of the document.

- -
-
-void XMLCALL
-XML_SetStartElementHandler(XML_Parser p,
-                           XML_StartElementHandler start);
-
-
-typedef void
-(XMLCALL *XML_StartElementHandler)(void *userData,
-                                   const XML_Char *name,
-                                   const XML_Char **atts);
-
-

Set handler for start (and empty) tags. Attributes are passed to the start -handler as a pointer to a vector of char pointers. Each attribute seen in -a start (or empty) tag occupies 2 consecutive places in this vector: the -attribute name followed by the attribute value. These pairs are terminated -by a null pointer.

-

Note that an empty tag generates a call to both start and end handlers -(in that order).

-
- -
-
-void XMLCALL
-XML_SetEndElementHandler(XML_Parser p,
-                         XML_EndElementHandler);
-
-
-typedef void
-(XMLCALL *XML_EndElementHandler)(void *userData,
-                                 const XML_Char *name);
-
-

Set handler for end (and empty) tags. As noted above, an empty tag -generates a call to both start and end handlers.

-
- -
-
-void XMLCALL
-XML_SetElementHandler(XML_Parser p,
-                      XML_StartElementHandler start,
-                      XML_EndElementHandler end);
-
-

Set handlers for start and end tags with one call.

-
- -
-
-void XMLCALL
-XML_SetCharacterDataHandler(XML_Parser p,
-                            XML_CharacterDataHandler charhndl)
-
-
-typedef void
-(XMLCALL *XML_CharacterDataHandler)(void *userData,
-                                    const XML_Char *s,
-                                    int len);
-
-

Set a text handler. The string your handler receives -is NOT nul-terminated. You have to use the length argument -to deal with the end of the string. A single block of contiguous text -free of markup may still result in a sequence of calls to this handler. -In other words, if you're searching for a pattern in the text, it may -be split across calls to this handler. Note: Setting this handler to NULL -may NOT immediately terminate call-backs if the parser is currently -processing such a single block of contiguous markup-free text, as the parser -will continue calling back until the end of the block is reached.

-
- -
-
-void XMLCALL
-XML_SetProcessingInstructionHandler(XML_Parser p,
-                                    XML_ProcessingInstructionHandler proc)
-
-
-typedef void
-(XMLCALL *XML_ProcessingInstructionHandler)(void *userData,
-                                            const XML_Char *target,
-                                            const XML_Char *data);
-
-
-

Set a handler for processing instructions. The target is the first word -in the processing instruction. The data is the rest of the characters in -it after skipping all whitespace after the initial word.

-
- -
-
-void XMLCALL
-XML_SetCommentHandler(XML_Parser p,
-                      XML_CommentHandler cmnt)
-
-
-typedef void
-(XMLCALL *XML_CommentHandler)(void *userData,
-                              const XML_Char *data);
-
-

Set a handler for comments. The data is all text inside the comment -delimiters.

-
- -
-
-void XMLCALL
-XML_SetStartCdataSectionHandler(XML_Parser p,
-                                XML_StartCdataSectionHandler start);
-
-
-typedef void
-(XMLCALL *XML_StartCdataSectionHandler)(void *userData);
-
-

Set a handler that gets called at the beginning of a CDATA section.

-
- -
-
-void XMLCALL
-XML_SetEndCdataSectionHandler(XML_Parser p,
-                              XML_EndCdataSectionHandler end);
-
-
-typedef void
-(XMLCALL *XML_EndCdataSectionHandler)(void *userData);
-
-

Set a handler that gets called at the end of a CDATA section.

-
- -
-
-void XMLCALL
-XML_SetCdataSectionHandler(XML_Parser p,
-                           XML_StartCdataSectionHandler start,
-                           XML_EndCdataSectionHandler end)
-
-

Sets both CDATA section handlers with one call.

-
- -
-
-void XMLCALL
-XML_SetDefaultHandler(XML_Parser p,
-                      XML_DefaultHandler hndl)
-
-
-typedef void
-(XMLCALL *XML_DefaultHandler)(void *userData,
-                              const XML_Char *s,
-                              int len);
-
- -

Sets a handler for any characters in the document which wouldn't -otherwise be handled. This includes both data for which no handlers -can be set (like some kinds of DTD declarations) and data which could -be reported but which currently has no handler set. The characters -are passed exactly as they were present in the XML document except -that they will be encoded in UTF-8 or UTF-16. Line boundaries are not -normalized. Note that a byte order mark character is not passed to the -default handler. There are no guarantees about how characters are -divided between calls to the default handler: for example, a comment -might be split between multiple calls. Setting the handler with -this call has the side effect of turning off expansion of references -to internally defined general entities. Instead these references are -passed to the default handler.

- -

See also XML_DefaultCurrent.

-
- -
-
-void XMLCALL
-XML_SetDefaultHandlerExpand(XML_Parser p,
-                            XML_DefaultHandler hndl)
-
-
-typedef void
-(XMLCALL *XML_DefaultHandler)(void *userData,
-                              const XML_Char *s,
-                              int len);
-
-

This sets a default handler, but doesn't inhibit the expansion of -internal entity references. The entity reference will not be passed -to the default handler.

- -

See also XML_DefaultCurrent.

-
- -
-
-void XMLCALL
-XML_SetExternalEntityRefHandler(XML_Parser p,
-                                XML_ExternalEntityRefHandler hndl)
-
-
-typedef int
-(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser p,
-                                        const XML_Char *context,
-                                        const XML_Char *base,
-                                        const XML_Char *systemId,
-                                        const XML_Char *publicId);
-
-

Set an external entity reference handler. This handler is also -called for processing an external DTD subset if parameter entity parsing -is in effect. (See -XML_SetParamEntityParsing.)

- -

The context parameter specifies the parsing context in -the format expected by the context argument to XML_ExternalEntityParserCreate. code is -valid only until the handler returns, so if the referenced entity is -to be parsed later, it must be copied. context is NULL -only when the entity is a parameter entity, which is how one can -differentiate between general and parameter entities.

- -

The base parameter is the base to use for relative -system identifiers. It is set by XML_SetBase and may be NULL. The -publicId parameter is the public id given in the entity -declaration and may be NULL. systemId is the system -identifier specified in the entity declaration and is never NULL.

- -

There are a couple of ways in which this handler differs from -others. First, this handler returns a status indicator (an -integer). XML_STATUS_OK should be returned for successful -handling of the external entity reference. Returning -XML_STATUS_ERROR indicates failure, and causes the -calling parser to return an -XML_ERROR_EXTERNAL_ENTITY_HANDLING error.

- -

Second, instead of having the user data as its first argument, it -receives the parser that encountered the entity reference. This, along -with the context parameter, may be used as arguments to a call to -XML_ExternalEntityParserCreate. Using the returned -parser, the body of the external entity can be recursively parsed.

- -

Since this handler may be called recursively, it should not be saving -information into global or static variables.

-
- -
-void XMLCALL
-XML_SetExternalEntityRefHandlerArg(XML_Parser p,
-                                   void *arg)
-
-
-

Set the argument passed to the ExternalEntityRefHandler. If -arg is not NULL, it is the new value passed to the -handler set using XML_SetExternalEntityRefHandler; if arg is -NULL, the argument passed to the handler function will be the parser -object itself.

- -

Note: -The type of arg and the type of the first argument to the -ExternalEntityRefHandler do not match. This function takes a -void * to be passed to the handler, while the handler -accepts an XML_Parser. This is a historical accident, -but will not be corrected before Expat 2.0 (at the earliest) to avoid -causing compiler warnings for code that's known to work with this -API. It is the responsibility of the application code to know the -actual type of the argument passed to the handler and to manage it -properly.

-
- -
-
-void XMLCALL
-XML_SetSkippedEntityHandler(XML_Parser p,
-                            XML_SkippedEntityHandler handler)
-
-
-typedef void
-(XMLCALL *XML_SkippedEntityHandler)(void *userData,
-                                    const XML_Char *entityName,
-                                    int is_parameter_entity);
-
-

Set a skipped entity handler. This is called in two situations:

-
    -
  1. An entity reference is encountered for which no declaration - has been read and this is not an error.
  2. -
  3. An internal entity reference is read, but not expanded, because - XML_SetDefaultHandler - has been called.
  4. -
-

The is_parameter_entity argument will be non-zero for -a parameter entity and zero for a general entity.

Note: skipped -parameter entities in declarations and skipped general entities in -attribute values cannot be reported, because the event would be out of -sync with the reporting of the declarations or attribute values

-
- -
-
-void XMLCALL
-XML_SetUnknownEncodingHandler(XML_Parser p,
-                              XML_UnknownEncodingHandler enchandler,
-			      void *encodingHandlerData)
-
-
-typedef int
-(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData,
-                                      const XML_Char *name,
-                                      XML_Encoding *info);
-
-typedef struct {
-  int map[256];
-  void *data;
-  int (XMLCALL *convert)(void *data, const char *s);
-  void (XMLCALL *release)(void *data);
-} XML_Encoding;
-
-

Set a handler to deal with encodings other than the built in set. This should be done before -XML_Parse or XML_ParseBuffer have been called on the -given parser.

If the handler knows how to deal with an encoding -with the given name, it should fill in the info data -structure and return XML_STATUS_OK. Otherwise it -should return XML_STATUS_ERROR. The handler will be called -at most once per parsed (external) entity. The optional application -data pointer encodingHandlerData will be passed back to -the handler.

- -

The map array contains information for every possible possible leading -byte in a byte sequence. If the corresponding value is >= 0, then it's -a single byte sequence and the byte encodes that Unicode value. If the -value is -1, then that byte is invalid as the initial byte in a sequence. -If the value is -n, where n is an integer > 1, then n is the number of -bytes in the sequence and the actual conversion is accomplished by a -call to the function pointed at by convert. This function may return -1 -if the sequence itself is invalid. The convert pointer may be null if -there are only single byte codes. The data parameter passed to the convert -function is the data pointer from XML_Encoding. The -string s is NOT nul-terminated and points at the sequence of -bytes to be converted.

- -

The function pointed at by release is called by the -parser when it is finished with the encoding. It may be NULL.

-
- -
-
-void XMLCALL
-XML_SetStartNamespaceDeclHandler(XML_Parser p,
-			         XML_StartNamespaceDeclHandler start);
-
-
-typedef void
-(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData,
-                                         const XML_Char *prefix,
-                                         const XML_Char *uri);
-
-

Set a handler to be called when a namespace is declared. Namespace -declarations occur inside start tags. But the namespace declaration start -handler is called before the start tag handler for each namespace declared -in that start tag.

-
- -
-
-void XMLCALL
-XML_SetEndNamespaceDeclHandler(XML_Parser p,
-			       XML_EndNamespaceDeclHandler end);
-
-
-typedef void
-(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData,
-                                       const XML_Char *prefix);
-
-

Set a handler to be called when leaving the scope of a namespace -declaration. This will be called, for each namespace declaration, -after the handler for the end tag of the element in which the -namespace was declared.

-
- -
-
-void XMLCALL
-XML_SetNamespaceDeclHandler(XML_Parser p,
-                            XML_StartNamespaceDeclHandler start,
-                            XML_EndNamespaceDeclHandler end)
-
-

Sets both namespace declaration handlers with a single call.

-
- -
-
-void XMLCALL
-XML_SetXmlDeclHandler(XML_Parser p,
-		      XML_XmlDeclHandler xmldecl);
-
-
-typedef void
-(XMLCALL *XML_XmlDeclHandler)(void            *userData,
-                              const XML_Char  *version,
-                              const XML_Char  *encoding,
-                              int             standalone);
-
-

Sets a handler that is called for XML declarations and also for -text declarations discovered in external entities. The way to -distinguish is that the version parameter will be NULL -for text declarations. The encoding parameter may be NULL -for an XML declaration. The standalone argument will -contain -1, 0, or 1 indicating respectively that there was no -standalone parameter in the declaration, that it was given as no, or -that it was given as yes.

-
- -
-
-void XMLCALL
-XML_SetStartDoctypeDeclHandler(XML_Parser p,
-			       XML_StartDoctypeDeclHandler start);
-
-
-typedef void
-(XMLCALL *XML_StartDoctypeDeclHandler)(void           *userData,
-                                       const XML_Char *doctypeName,
-                                       const XML_Char *sysid,
-                                       const XML_Char *pubid,
-                                       int            has_internal_subset);
-
-

Set a handler that is called at the start of a DOCTYPE declaration, -before any external or internal subset is parsed. Both sysid -and pubid may be NULL. The has_internal_subset -will be non-zero if the DOCTYPE declaration has an internal subset.

-
- -
-
-void XMLCALL
-XML_SetEndDoctypeDeclHandler(XML_Parser p,
-			     XML_EndDoctypeDeclHandler end);
-
-
-typedef void
-(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);
-
-

Set a handler that is called at the end of a DOCTYPE declaration, -after parsing any external subset.

-
- -
-
-void XMLCALL
-XML_SetDoctypeDeclHandler(XML_Parser p,
-			  XML_StartDoctypeDeclHandler start,
-			  XML_EndDoctypeDeclHandler end);
-
-

Set both doctype handlers with one call.

-
- -
-
-void XMLCALL
-XML_SetElementDeclHandler(XML_Parser p,
-			  XML_ElementDeclHandler eldecl);
-
-
-typedef void
-(XMLCALL *XML_ElementDeclHandler)(void *userData,
-                                  const XML_Char *name,
-                                  XML_Content *model);
-
-
-enum XML_Content_Type {
-  XML_CTYPE_EMPTY = 1,
-  XML_CTYPE_ANY,
-  XML_CTYPE_MIXED,
-  XML_CTYPE_NAME,
-  XML_CTYPE_CHOICE,
-  XML_CTYPE_SEQ
-};
-
-enum XML_Content_Quant {
-  XML_CQUANT_NONE,
-  XML_CQUANT_OPT,
-  XML_CQUANT_REP,
-  XML_CQUANT_PLUS
-};
-
-typedef struct XML_cp XML_Content;
-
-struct XML_cp {
-  enum XML_Content_Type		type;
-  enum XML_Content_Quant	quant;
-  const XML_Char *		name;
-  unsigned int			numchildren;
-  XML_Content *			children;
-};
-
-

Sets a handler for element declarations in a DTD. The handler gets -called with the name of the element in the declaration and a pointer -to a structure that contains the element model. It is the -application's responsibility to free this data structure using -XML_FreeContentModel.

- -

The model argument is the root of a tree of -XML_Content nodes. If type equals -XML_CTYPE_EMPTY or XML_CTYPE_ANY, then -quant will be XML_CQUANT_NONE, and the other -fields will be zero or NULL. If type is -XML_CTYPE_MIXED, then quant will be -XML_CQUANT_NONE or XML_CQUANT_REP and -numchildren will contain the number of elements that are -allowed to be mixed in and children points to an array of -XML_Content structures that will all have type -XML_CTYPE_NAME with no quantification. Only the root node can be type -XML_CTYPE_EMPTY, XML_CTYPE_ANY, or -XML_CTYPE_MIXED.

- -

For type XML_CTYPE_NAME, the name field -points to the name and the numchildren and -children fields will be zero and NULL. The -quant field will indicate any quantifiers placed on the -name.

- -

Types XML_CTYPE_CHOICE and XML_CTYPE_SEQ -indicate a choice or sequence respectively. The -numchildren field indicates how many nodes in the choice -or sequence and children points to the nodes.

-
- -
-
-void XMLCALL
-XML_SetAttlistDeclHandler(XML_Parser p,
-                          XML_AttlistDeclHandler attdecl);
-
-
-typedef void
-(XMLCALL *XML_AttlistDeclHandler)(void           *userData,
-                                  const XML_Char *elname,
-                                  const XML_Char *attname,
-                                  const XML_Char *att_type,
-                                  const XML_Char *dflt,
-                                  int            isrequired);
-
-

Set a handler for attlist declarations in the DTD. This handler is -called for each attribute. So a single attlist declaration -with multiple attributes declared will generate multiple calls to this -handler. The elname parameter returns the name of the -element for which the attribute is being declared. The attribute name -is in the attname parameter. The attribute type is in the -att_type parameter. It is the string representing the -type in the declaration with whitespace removed.

- -

The dflt parameter holds the default value. It will be -NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can -distinguish these two cases by checking the isrequired -parameter, which will be true in the case of "#REQUIRED" attributes. -Attributes which are "#FIXED" will have also have a true -isrequired, but they will have the non-NULL fixed value -in the dflt parameter.

-
- -
-
-void XMLCALL
-XML_SetEntityDeclHandler(XML_Parser p,
-			 XML_EntityDeclHandler handler);
-
-
-typedef void
-(XMLCALL *XML_EntityDeclHandler)(void           *userData,
-                                 const XML_Char *entityName,
-                                 int            is_parameter_entity,
-                                 const XML_Char *value,
-                                 int            value_length, 
-                                 const XML_Char *base,
-                                 const XML_Char *systemId,
-                                 const XML_Char *publicId,
-                                 const XML_Char *notationName);
-
-

Sets a handler that will be called for all entity declarations. -The is_parameter_entity argument will be non-zero in the -case of parameter entities and zero otherwise.

- -

For internal entities (<!ENTITY foo "bar">), -value will be non-NULL and systemId, -publicId, and notationName will all be NULL. -The value string is not NULL terminated; the length is -provided in the value_length parameter. Do not use -value_length to test for internal entities, since it is -legal to have zero-length values. Instead check for whether or not -value is NULL.

The notationName -argument will have a non-NULL value only for unparsed entity -declarations.

-
- -
-
-void XMLCALL
-XML_SetUnparsedEntityDeclHandler(XML_Parser p,
-                                 XML_UnparsedEntityDeclHandler h)
-
-
-typedef void
-(XMLCALL *XML_UnparsedEntityDeclHandler)(void *userData,
-                                         const XML_Char *entityName, 
-                                         const XML_Char *base,
-                                         const XML_Char *systemId,
-                                         const XML_Char *publicId,
-                                         const XML_Char *notationName);
-
-

Set a handler that receives declarations of unparsed entities. These -are entity declarations that have a notation (NDATA) field:

- -
-<!ENTITY logo SYSTEM "images/logo.gif" NDATA gif>
-
-

This handler is obsolete and is provided for backwards -compatibility. Use instead XML_SetEntityDeclHandler.

-
- -
-
-void XMLCALL
-XML_SetNotationDeclHandler(XML_Parser p,
-                           XML_NotationDeclHandler h)
-
-
-typedef void
-(XMLCALL *XML_NotationDeclHandler)(void *userData, 
-                                   const XML_Char *notationName,
-                                   const XML_Char *base,
-                                   const XML_Char *systemId,
-                                   const XML_Char *publicId);
-
-

Set a handler that receives notation declarations.

-
- -
-
-void XMLCALL
-XML_SetNotStandaloneHandler(XML_Parser p,
-                            XML_NotStandaloneHandler h)
-
-
-typedef int 
-(XMLCALL *XML_NotStandaloneHandler)(void *userData);
-
-

Set a handler that is called if the document is not "standalone". -This happens when there is an external subset or a reference to a -parameter entity, but does not have standalone set to "yes" in an XML -declaration. If this handler returns XML_STATUS_ERROR, -then the parser will throw an XML_ERROR_NOT_STANDALONE -error.

-
- -

Parse position and error reporting functions

- -

These are the functions you'll want to call when the parse -functions return XML_STATUS_ERROR (a parse error has -occurred), although the position reporting functions are useful outside -of errors. The position reported is the byte position (in the original -document or entity encoding) of the first of the sequence of -characters that generated the current event (or the error that caused -the parse functions to return XML_STATUS_ERROR.) The -exceptions are callbacks trigged by declarations in the document -prologue, in which case they exact position reported is somewhere in the -relevant markup, but not necessarily as meaningful as for other -events.

- -

The position reporting functions are accurate only outside of the -DTD. In other words, they usually return bogus information when -called from within a DTD declaration handler.

- -
-enum XML_Error XMLCALL
-XML_GetErrorCode(XML_Parser p);
-
-
-Return what type of error has occurred. -
- -
-const XML_LChar * XMLCALL
-XML_ErrorString(enum XML_Error code);
-
-
-Return a string describing the error corresponding to code. -The code should be one of the enums that can be returned from -XML_GetErrorCode. -
- -
-XML_Index XMLCALL
-XML_GetCurrentByteIndex(XML_Parser p);
-
-
-Return the byte offset of the position. This always corresponds to -the values returned by XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber. -
- -
-XML_Size XMLCALL
-XML_GetCurrentLineNumber(XML_Parser p);
-
-
-Return the line number of the position. The first line is reported as -1. -
- -
-XML_Size XMLCALL
-XML_GetCurrentColumnNumber(XML_Parser p);
-
-
-Return the offset, from the beginning of the current line, of -the position. -
- -
-int XMLCALL
-XML_GetCurrentByteCount(XML_Parser p);
-
-
-Return the number of bytes in the current event. Returns -0 if the event is inside a reference to an internal -entity and for the end-tag event for empty element tags (the later can -be used to distinguish empty-element tags from empty elements using -separate start and end tags). -
- -
-const char * XMLCALL
-XML_GetInputContext(XML_Parser p,
-                    int *offset,
-                    int *size);
-
-
- -

Returns the parser's input buffer, sets the integer pointed at by -offset to the offset within this buffer of the current -parse position, and set the integer pointed at by size to -the size of the returned buffer.

- -

This should only be called from within a handler during an active -parse and the returned buffer should only be referred to from within -the handler that made the call. This input buffer contains the -untranslated bytes of the input.

- -

Only a limited amount of context is kept, so if the event -triggering a call spans over a very large amount of input, the actual -parse position may be before the beginning of the buffer.

- -

If XML_CONTEXT_BYTES is not defined, this will always -return NULL.

-
- -

Miscellaneous functions

- -

The functions in this section either obtain state information from -the parser or can be used to dynamicly set parser options.

- -
-void XMLCALL
-XML_SetUserData(XML_Parser p,
-                void *userData);
-
-
-This sets the user data pointer that gets passed to handlers. It -overwrites any previous value for this pointer. Note that the -application is responsible for freeing the memory associated with -userData when it is finished with the parser. So if you -call this when there's already a pointer there, and you haven't freed -the memory associated with it, then you've probably just leaked -memory. -
- -
-void * XMLCALL
-XML_GetUserData(XML_Parser p);
-
-
-This returns the user data pointer that gets passed to handlers. -It is actually implemented as a macro. -
- -
-void XMLCALL
-XML_UseParserAsHandlerArg(XML_Parser p);
-
-
-After this is called, handlers receive the parser in their -userData arguments. The user data can still be obtained -using the XML_GetUserData function. -
- -
-enum XML_Status XMLCALL
-XML_SetBase(XML_Parser p,
-            const XML_Char *base);
-
-
-Set the base to be used for resolving relative URIs in system -identifiers. The return value is XML_STATUS_ERROR if -there's no memory to store base, otherwise it's -XML_STATUS_OK. -
- -
-const XML_Char * XMLCALL
-XML_GetBase(XML_Parser p);
-
-
-Return the base for resolving relative URIs. -
- -
-int XMLCALL
-XML_GetSpecifiedAttributeCount(XML_Parser p);
-
-
-When attributes are reported to the start handler in the atts vector, -attributes that were explicitly set in the element occur before any -attributes that receive their value from default information in an -ATTLIST declaration. This function returns the number of attributes -that were explicitly set times two, thus giving the offset in the -atts array passed to the start tag handler of the first -attribute set due to defaults. It supplies information for the last -call to a start handler. If called inside a start handler, then that -means the current call. -
- -
-int XMLCALL
-XML_GetIdAttributeIndex(XML_Parser p);
-
-
-Returns the index of the ID attribute passed in the atts array in the -last call to XML_StartElementHandler, or -1 if there is no ID -attribute. If called inside a start handler, then that means the -current call. -
- -
-const XML_AttrInfo * XMLCALL
-XML_GetAttributeInfo(XML_Parser parser);
-
-
-typedef struct {
-  XML_Index  nameStart;  /* Offset to beginning of the attribute name. */
-  XML_Index  nameEnd;    /* Offset after the attribute name's last byte. */
-  XML_Index  valueStart; /* Offset to beginning of the attribute value. */
-  XML_Index  valueEnd;   /* Offset after the attribute value's last byte. */
-} XML_AttrInfo;
-
-
-Returns an array of XML_AttrInfo structures for the -attribute/value pairs passed in the last call to the -XML_StartElementHandler that were specified -in the start-tag rather than defaulted. Each attribute/value pair counts -as 1; thus the number of entries in the array is -XML_GetSpecifiedAttributeCount(parser) / 2. -
- -
-enum XML_Status XMLCALL
-XML_SetEncoding(XML_Parser p,
-                const XML_Char *encoding);
-
-
-Set the encoding to be used by the parser. It is equivalent to -passing a non-null encoding argument to the parser creation functions. -It must not be called after XML_Parse or XML_ParseBuffer have been called on the given parser. -Returns XML_STATUS_OK on success or -XML_STATUS_ERROR on error. -
- -
-int XMLCALL
-XML_SetParamEntityParsing(XML_Parser p,
-                          enum XML_ParamEntityParsing code);
-
-
-This enables parsing of parameter entities, including the external -parameter entity that is the external DTD subset, according to -code. -The choices for code are: -
    -
  • XML_PARAM_ENTITY_PARSING_NEVER
  • -
  • XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
  • -
  • XML_PARAM_ENTITY_PARSING_ALWAYS
  • -
-Note: If XML_SetParamEntityParsing is called after -XML_Parse or XML_ParseBuffer, then it has -no effect and will always return 0. -
- -
-int XMLCALL
-XML_SetHashSalt(XML_Parser p,
-                unsigned long hash_salt);
-
-
-Sets the hash salt to use for internal hash calculations. -Helps in preventing DoS attacks based on predicting hash -function behavior. In order to have an effect this must be called -before parsing has started. Returns 1 if successful, 0 when called -after XML_Parse or XML_ParseBuffer. -

Note: This call is optional, as the parser will auto-generate a new -random salt value if no value has been set at the start of parsing.

-
- -
-enum XML_Error XMLCALL
-XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
-
-
-

This function allows an application to provide an external subset -for the document type declaration for documents which do not specify -an external subset of their own. For documents which specify an -external subset in their DOCTYPE declaration, the application-provided -subset will be ignored. If the document does not contain a DOCTYPE -declaration at all and useDTD is true, the -application-provided subset will be parsed, but the -startDoctypeDeclHandler and -endDoctypeDeclHandler functions, if set, will not be -called. The setting of parameter entity parsing, controlled using -XML_SetParamEntityParsing, will be honored.

- -

The application-provided external subset is read by calling the -external entity reference handler set via XML_SetExternalEntityRefHandler with both -publicId and systemId set to NULL.

- -

If this function is called after parsing has begun, it returns -XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING and ignores -useDTD. If called when Expat has been compiled without -DTD support, it returns -XML_ERROR_FEATURE_REQUIRES_XML_DTD. Otherwise, it -returns XML_ERROR_NONE.

- -

Note: For the purpose of checking WFC: Entity Declared, passing -useDTD == XML_TRUE will make the parser behave as if -the document had a DTD with an external subset. This holds true even if -the external entity reference handler returns without action.

-
- -
-void XMLCALL
-XML_SetReturnNSTriplet(XML_Parser parser,
-                       int        do_nst);
-
-
-

-This function only has an effect when using a parser created with -XML_ParserCreateNS, -i.e. when namespace processing is in effect. The do_nst -sets whether or not prefixes are returned with names qualified with a -namespace prefix. If this function is called with do_nst -non-zero, then afterwards namespace qualified names (that is qualified -with a prefix as opposed to belonging to a default namespace) are -returned as a triplet with the three parts separated by the namespace -separator specified when the parser was created. The order of -returned parts is URI, local name, and prefix.

If -do_nst is zero, then namespaces are reported in the -default manner, URI then local_name separated by the namespace -separator.

-
- -
-void XMLCALL
-XML_DefaultCurrent(XML_Parser parser);
-
-
-This can be called within a handler for a start element, end element, -processing instruction or character data. It causes the corresponding -markup to be passed to the default handler set by XML_SetDefaultHandler or -XML_SetDefaultHandlerExpand. It does nothing if there is -not a default handler. -
- -
-XML_LChar * XMLCALL
-XML_ExpatVersion();
-
-
-Return the library version as a string (e.g. "expat_1.95.1"). -
- -
-struct XML_Expat_Version XMLCALL
-XML_ExpatVersionInfo();
-
-
-typedef struct {
-  int major;
-  int minor;
-  int micro;
-} XML_Expat_Version;
-
-
-Return the library version information as a structure. -Some macros are also defined that support compile-time tests of the -library version: -
    -
  • XML_MAJOR_VERSION
  • -
  • XML_MINOR_VERSION
  • -
  • XML_MICRO_VERSION
  • -
-Testing these constants is currently the best way to determine if -particular parts of the Expat API are available. -
- -
-const XML_Feature * XMLCALL
-XML_GetFeatureList();
-
-
-enum XML_FeatureEnum {
-  XML_FEATURE_END = 0,
-  XML_FEATURE_UNICODE,
-  XML_FEATURE_UNICODE_WCHAR_T,
-  XML_FEATURE_DTD,
-  XML_FEATURE_CONTEXT_BYTES,
-  XML_FEATURE_MIN_SIZE,
-  XML_FEATURE_SIZEOF_XML_CHAR,
-  XML_FEATURE_SIZEOF_XML_LCHAR,
-  XML_FEATURE_NS,
-  XML_FEATURE_LARGE_SIZE
-};
-
-typedef struct {
-  enum XML_FeatureEnum  feature;
-  XML_LChar            *name;
-  long int              value;
-} XML_Feature;
-
-
-

Returns a list of "feature" records, providing details on how -Expat was configured at compile time. Most applications should not -need to worry about this, but this information is otherwise not -available from Expat. This function allows code that does need to -check these features to do so at runtime.

- -

The return value is an array of XML_Feature, -terminated by a record with a feature of -XML_FEATURE_END and name of NULL, -identifying the feature-test macros Expat was compiled with. Since an -application that requires this kind of information needs to determine -the type of character the name points to, records for the -XML_FEATURE_SIZEOF_XML_CHAR and -XML_FEATURE_SIZEOF_XML_LCHAR will be located at the -beginning of the list, followed by XML_FEATURE_UNICODE -and XML_FEATURE_UNICODE_WCHAR_T, if they are present at -all.

- -

Some features have an associated value. If there isn't an -associated value, the value field is set to 0. At this -time, the following features have been defined to have values:

- -
-
XML_FEATURE_SIZEOF_XML_CHAR
-
The number of bytes occupied by one XML_Char - character.
-
XML_FEATURE_SIZEOF_XML_LCHAR
-
The number of bytes occupied by one XML_LChar - character.
-
XML_FEATURE_CONTEXT_BYTES
-
The maximum number of characters of context which can be - reported by XML_GetInputContext.
-
-
- -
-void XMLCALL
-XML_FreeContentModel(XML_Parser parser, XML_Content *model);
-
-
-Function to deallocate the model argument passed to the -XML_ElementDeclHandler callback set using XML_ElementDeclHandler. -This function should not be used for any other purpose. -
- -

The following functions allow external code to share the memory -allocator an XML_Parser has been configured to use. This -is especially useful for third-party libraries that interact with a -parser object created by application code, or heavily layered -applications. This can be essential when using dynamically loaded -libraries which use different C standard libraries (this can happen on -Windows, at least).

- -
-void * XMLCALL
-XML_MemMalloc(XML_Parser parser, size_t size);
-
-
-Allocate size bytes of memory using the allocator the -parser object has been configured to use. Returns a -pointer to the memory or NULL on failure. Memory allocated in this -way must be freed using XML_MemFree. -
- -
-void * XMLCALL
-XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
-
-
-Allocate size bytes of memory using the allocator the -parser object has been configured to use. -ptr must point to a block of memory allocated by XML_MemMalloc or -XML_MemRealloc, or be NULL. This function tries to -expand the block pointed to by ptr if possible. Returns -a pointer to the memory or NULL on failure. On success, the original -block has either been expanded or freed. On failure, the original -block has not been freed; the caller is responsible for freeing the -original block. Memory allocated in this way must be freed using -XML_MemFree. -
- -
-void XMLCALL
-XML_MemFree(XML_Parser parser, void *ptr);
-
-
-Free a block of memory pointed to by ptr. The block must -have been allocated by XML_MemMalloc or XML_MemRealloc, or be NULL. -
- -
-

Valid XHTML 1.0!

-
- - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css deleted file mode 100644 index 69df30bc..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css +++ /dev/null @@ -1,101 +0,0 @@ -body { - background-color: white; - border: 0px; - margin: 0px; - padding: 0px; -} - -.corner { - width: 200px; - height: 80px; - text-align: center; -} - -.banner { - background-color: rgb(110,139,61); - color: rgb(255,236,176); - padding-left: 2em; -} - -.banner h1 { - font-size: 200%; -} - -.content { - padding: 0em 2em 1em 2em; -} - -.releaseno { - background-color: rgb(110,139,61); - color: rgb(255,236,176); - padding-bottom: 0.3em; - padding-top: 0.5em; - text-align: center; - font-weight: bold; -} - -.noborder { - border-width: 0px; -} - -.eg { - padding-left: 1em; - padding-top: .5em; - padding-bottom: .5em; - border: solid thin; - margin: 1em 0; - background-color: tan; - margin-left: 2em; - margin-right: 10%; -} - -.pseudocode { - padding-left: 1em; - padding-top: .5em; - padding-bottom: .5em; - border: solid thin; - margin: 1em 0; - background-color: rgb(250,220,180); - margin-left: 2em; - margin-right: 10%; -} - -.handler { - width: 100%; - border-top-width: thin; - margin-bottom: 1em; -} - -.handler p { - margin-left: 2em; -} - -.setter { - font-weight: bold; -} - -.signature { - color: navy; -} - -.fcndec { - width: 100%; - border-top-width: thin; - font-weight: bold; -} - -.fcndef { - margin-left: 2em; - margin-bottom: 2em; -} - -dd { - margin-bottom: 2em; -} - -.cpp-symbols dt { - font-family: monospace; -} -.cpp-symbols dd { - margin-bottom: 1em; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png deleted file mode 100644 index 4c23f48fe02a58fbb3d1088e6a7d372568830b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368 zcmbVNX;2f{7H-8QAWIODU~n{oVqipj2Gj;zXrn-jfGsLCqYzsnPDF&p1zT|;Y|_rS zG$U$6T%rydH;kg#qJRP9(E@6_VH9x;sL%+GanDQ5do}fb&5w6(-TKbG-???Zuj*9Y zyvXoiJDXuP007v9hR9G0MqBm>ffWGsad*5W1AxA{kzr9YEtdwPktHFmR%@VOjSA)& zoWU@I3T8>tpwXyl(x5~21YyvkYJtGSU^GS0B#P4v2q8Gd&;Y=2MoP=_T2#YuoPk$q z^sK?iaz>G*Rw`f+2}zO|h6sfMihzU&g`o&R5IPzW2mqB5l!z<{sBloJRB9=hBOtvR zG4ni*7aZszoQI$?fGZ2KRb(~rN=#@$}0O&Ostz&hN2!bFDDiw(YGzpP7C=v>2 z0s=vhQ6pN3&|okCAj!~(PykR$5Rj5msZ>K@9LMP>m}OZbZ_?}aj0RIdQYo$`)C{9j zV=5i1!OSMk(%j5*I4Z>vDFCT>Jq~~>H3_Lz7)^j$8Y2mdY>cL9t=?cVn@uJ&Oln~S zVf1=Jt>=t9OlT>Jf?=WC}BuMC{d|INMN9uQ^KH#u(V^9Mg~J+ z39CUZq)~^NSX@P*COwW}m_-@{BYI4#qcH(OqbRCl4H8TZAe8y90F@eADFt8(A+-pC zkQNO(++gH!3^n}~oEC>+*r3%K8Jy>N2oxDD1v-ln6qE{SnnWNGsYF4Ekfulsk#Jgz zLIHtEdCO$L5;KQ$8k8a}I&rfeSE3S?mKBLaW}dLP6=Jm6NHA(lh|)SlA`}W4*1#|f zL}&yEg`x4lr}-7+3wMlqyF={n!T4V9EeMwS$Ii;hQ-5s#b|B-& z^0k*l@0<7rwu{X$l~;V6qOf-+-Z)Obd4U}D_8z_2@7au-G3OHKvyQVoL<7(6Uzppk z&GDM}&q#-oZcXiiH?z__HO>^+cSHCYkr=Oj&KaDoWCQW3U`x!sK~)9g$gdf2c4&Ni z?6=WkP3)S+*n-#grETtop`{*2LPpDF8)Qz_c*KyCEn~xuQKh&4dZx!4%?5Owj^wrHZNb`-KoZWZr0n-NbZyfPpZP1Pz?!j)p zA#oS|y0+~LvYk?~u6l_hboP3aXoT0Hw7?UOS4@4m` zla;1?MUFD#{O8zftHeEci3}{h+c~lNmhggf`n3v&y@|`E=jTjwLd9e9YqP9EV)CU) zn@SJ+9>=t`+i@5$X& zOBeezmLz^$vA#foB1=_E@Ao0R%F|+I8Gov(yZ3Q&SW#lM(4RXnpD#9yYOsxaJxM$y z!78@1s^M0))$*){Wwl6sfVzb#J$3rbsg#S$j!*Irnj5h`wOj1E^@G#F_+K+86-CPL z%Uc~9oW5ksb3cT&ZZGOL?COAJw|(2MPM^B7%KG!lfXg}Od>zV$*0=3@{poe$n^>oZ zH7nwKpNQl2p5eCpI?G<#NJPyiteboLKe@fVcwt0+AknetuD;JtT+6%#w>HfU{m$*$7tbeM1BWUc?BhDKavT?o_Xm$VDzO{fhUl-g4+v}5J?CesCp7o}6bHRC@XBLld<~&;{ zY{J|{xm6nB^Wdszc1HftOZyrR(@Pf>h7I=V*!!$-#`B8rd*^lCZw{ypv>cHaiN!w>szMg{>z%h_f_Id>mx^<^GRN#Xz zCqC>xeER9jv|qL-R{9b4JLfIx#IJOt(M<|J`QG|Uz9BR{&|p2tcDuvG#-?KT)_rZa zgRl!rLYIhNJ)ip0)hqc{Q&z$L;7##mN4{QF@IUf40qL1fh9Zpi|Xcd6q+U5hJ@_A^g(aNKfk|iGsv=R1`YZs oi4;OEvV%bfcgjD_ar)+RxUQtjXTTPP<@*6bXNJp8!|_}H4I+HVz5oCK diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 deleted file mode 100644 index 174719a7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 +++ /dev/null @@ -1,251 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng . -.TH "XMLWF" "1" "24 January 2003" "" "" -.SH NAME -xmlwf \- Determines if an XML document is well-formed -.SH SYNOPSIS - -\fBxmlwf\fR [ \fB-s\fR] [ \fB-n\fR] [ \fB-p\fR] [ \fB-x\fR] [ \fB-e \fIencoding\fB\fR] [ \fB-w\fR] [ \fB-d \fIoutput-dir\fB\fR] [ \fB-c\fR] [ \fB-m\fR] [ \fB-r\fR] [ \fB-t\fR] [ \fB-v\fR] [ \fBfile ...\fR] - -.SH "DESCRIPTION" -.PP -\fBxmlwf\fR uses the Expat library to -determine if an XML document is well-formed. It is -non-validating. -.PP -If you do not specify any files on the command-line, and you -have a recent version of \fBxmlwf\fR, the -input file will be read from standard input. -.SH "WELL-FORMED DOCUMENTS" -.PP -A well-formed document must adhere to the -following rules: -.TP 0.2i -\(bu -The file begins with an XML declaration. For instance, -. -\fBNOTE:\fR -\fBxmlwf\fR does not currently -check for a valid XML declaration. -.TP 0.2i -\(bu -Every start tag is either empty () -or has a corresponding end tag. -.TP 0.2i -\(bu -There is exactly one root element. This element must contain -all other elements in the document. Only comments, white -space, and processing instructions may come after the close -of the root element. -.TP 0.2i -\(bu -All elements nest properly. -.TP 0.2i -\(bu -All attribute values are enclosed in quotes (either single -or double). -.PP -If the document has a DTD, and it strictly complies with that -DTD, then the document is also considered \fBvalid\fR. -\fBxmlwf\fR is a non-validating parser -- -it does not check the DTD. However, it does support -external entities (see the \fB-x\fR option). -.SH "OPTIONS" -.PP -When an option includes an argument, you may specify the argument either -separately ("\fB-d\fR output") or concatenated with the -option ("\fB-d\fRoutput"). \fBxmlwf\fR -supports both. -.TP -\fB-c\fR -If the input file is well-formed and \fBxmlwf\fR -doesn't encounter any errors, the input file is simply copied to -the output directory unchanged. -This implies no namespaces (turns off \fB-n\fR) and -requires \fB-d\fR to specify an output file. -.TP -\fB-d output-dir\fR -Specifies a directory to contain transformed -representations of the input files. -By default, \fB-d\fR outputs a canonical representation -(described below). -You can select different output formats using \fB-c\fR -and \fB-m\fR. - -The output filenames will -be exactly the same as the input filenames or "STDIN" if the input is -coming from standard input. Therefore, you must be careful that the -output file does not go into the same directory as the input -file. Otherwise, \fBxmlwf\fR will delete the -input file before it generates the output file (just like running -cat < file > file in most shells). - -Two structurally equivalent XML documents have a byte-for-byte -identical canonical XML representation. -Note that ignorable white space is considered significant and -is treated equivalently to data. -More on canonical XML can be found at -http://www.jclark.com/xml/canonxml.html . -.TP -\fB-e encoding\fR -Specifies the character encoding for the document, overriding -any document encoding declaration. \fBxmlwf\fR -supports four built-in encodings: -US-ASCII, -UTF-8, -UTF-16, and -ISO-8859-1. -Also see the \fB-w\fR option. -.TP -\fB-m\fR -Outputs some strange sort of XML file that completely -describes the input file, including character positions. -Requires \fB-d\fR to specify an output file. -.TP -\fB-n\fR -Turns on namespace processing. (describe namespaces) -\fB-c\fR disables namespaces. -.TP -\fB-p\fR -Tells xmlwf to process external DTDs and parameter -entities. - -Normally \fBxmlwf\fR never parses parameter -entities. \fB-p\fR tells it to always parse them. -\fB-p\fR implies \fB-x\fR. -.TP -\fB-r\fR -Normally \fBxmlwf\fR memory-maps the XML file -before parsing; this can result in faster parsing on many -platforms. -\fB-r\fR turns off memory-mapping and uses normal file -IO calls instead. -Of course, memory-mapping is automatically turned off -when reading from standard input. - -Use of memory-mapping can cause some platforms to report -substantially higher memory usage for -\fBxmlwf\fR, but this appears to be a matter of -the operating system reporting memory in a strange way; there is -not a leak in \fBxmlwf\fR. -.TP -\fB-s\fR -Prints an error if the document is not standalone. -A document is standalone if it has no external subset and no -references to parameter entities. -.TP -\fB-t\fR -Turns on timings. This tells Expat to parse the entire file, -but not perform any processing. -This gives a fairly accurate idea of the raw speed of Expat itself -without client overhead. -\fB-t\fR turns off most of the output options -(\fB-d\fR, \fB-m\fR, \fB-c\fR, -\&...). -.TP -\fB-v\fR -Prints the version of the Expat library being used, including some -information on the compile-time configuration of the library, and -then exits. -.TP -\fB-w\fR -Enables support for Windows code pages. -Normally, \fBxmlwf\fR will throw an error if it -runs across an encoding that it is not equipped to handle itself. With -\fB-w\fR, xmlwf will try to use a Windows code -page. See also \fB-e\fR. -.TP -\fB-x\fR -Turns on parsing external entities. - -Non-validating parsers are not required to resolve external -entities, or even expand entities at all. -Expat always expands internal entities (?), -but external entity parsing must be enabled explicitly. - -External entities are simply entities that obtain their -data from outside the XML file currently being parsed. - -This is an example of an internal entity: - -.nf - -.fi - -And here are some examples of external entities: - -.nf - (parsed) - (unparsed) -.fi -.TP -\fB--\fR -(Two hyphens.) -Terminates the list of options. This is only needed if a filename -starts with a hyphen. For example: - -.nf -xmlwf -- -myfile.xml -.fi - -will run \fBxmlwf\fR on the file -\fI-myfile.xml\fR. -.PP -Older versions of \fBxmlwf\fR do not support -reading from standard input. -.SH "OUTPUT" -.PP -If an input file is not well-formed, -\fBxmlwf\fR prints a single line describing -the problem to standard output. If a file is well formed, -\fBxmlwf\fR outputs nothing. -Note that the result code is \fBnot\fR set. -.SH "BUGS" -.PP -According to the W3C standard, an XML file without a -declaration at the beginning is not considered well-formed. -However, \fBxmlwf\fR allows this to pass. -.PP -\fBxmlwf\fR returns a 0 - noerr result, -even if the file is not well-formed. There is no good way for -a program to use \fBxmlwf\fR to quickly -check a file -- it must parse \fBxmlwf\fR's -standard output. -.PP -The errors should go to standard error, not standard output. -.PP -There should be a way to get \fB-d\fR to send its -output to standard output rather than forcing the user to send -it to a file. -.PP -I have no idea why anyone would want to use the -\fB-d\fR, \fB-c\fR, and -\fB-m\fR options. If someone could explain it to -me, I'd like to add this information to this manpage. -.SH "ALTERNATIVES" -.PP -Here are some XML validators on the web: - -.nf -http://www.hcrc.ed.ac.uk/~richard/xml-check.html -http://www.stg.brown.edu/service/xmlvalid/ -http://www.scripting.com/frontier5/xml/code/xmlValidator.html -http://www.xml.com/pub/a/tools/ruwf/check.html -.fi -.SH "SEE ALSO" -.PP - -.nf -The Expat home page: http://www.libexpat.org/ -The W3 XML specification: http://www.w3.org/TR/REC-xml -.fi -.SH "AUTHOR" -.PP -This manual page was written by Scott Bronson for -the Debian GNU/Linux system (but may be used by others). Permission is -granted to copy, distribute and/or modify this document under -the terms of the GNU Free Documentation -License, Version 1.1. diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml deleted file mode 100644 index 313cfbcb..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml +++ /dev/null @@ -1,468 +0,0 @@ - manpage.1'. You may view - the manual page with: `docbook-to-man manpage.sgml | nroff -man | - less'. A typical entry in a Makefile or Makefile.am is: - -manpage.1: manpage.sgml - docbook-to-man $< > $@ - --> - - - Scott"> - Bronson"> - - December 5, 2001"> - - 1"> - bronson@rinspin.com"> - - XMLWF"> - - - Debian GNU/Linux"> - GNU"> -]> - - - -
- &dhemail; -
- - &dhfirstname; - &dhsurname; - - - 2001 - &dhusername; - - &dhdate; -
- - &dhucpackage; - - &dhsection; - - - &dhpackage; - - Determines if an XML document is well-formed - - - - &dhpackage; - - - - - - - - - - - - - - - - - - file ... - - - - - DESCRIPTION - - - &dhpackage; uses the Expat library to - determine if an XML document is well-formed. It is - non-validating. - - - - If you do not specify any files on the command-line, and you - have a recent version of &dhpackage;, the - input file will be read from standard input. - - - - - - WELL-FORMED DOCUMENTS - - - A well-formed document must adhere to the - following rules: - - - - - The file begins with an XML declaration. For instance, - <?xml version="1.0" standalone="yes"?>. - NOTE: - &dhpackage; does not currently - check for a valid XML declaration. - - - Every start tag is either empty (<tag/>) - or has a corresponding end tag. - - - There is exactly one root element. This element must contain - all other elements in the document. Only comments, white - space, and processing instructions may come after the close - of the root element. - - - All elements nest properly. - - - All attribute values are enclosed in quotes (either single - or double). - - - - - If the document has a DTD, and it strictly complies with that - DTD, then the document is also considered valid. - &dhpackage; is a non-validating parser -- - it does not check the DTD. However, it does support - external entities (see the option). - - - - - OPTIONS - - -When an option includes an argument, you may specify the argument either -separately (" output") or concatenated with the -option ("output"). &dhpackage; -supports both. - - - - - - - - - If the input file is well-formed and &dhpackage; - doesn't encounter any errors, the input file is simply copied to - the output directory unchanged. - This implies no namespaces (turns off ) and - requires to specify an output file. - - - - - - - - - Specifies a directory to contain transformed - representations of the input files. - By default, outputs a canonical representation - (described below). - You can select different output formats using - and . - - - The output filenames will - be exactly the same as the input filenames or "STDIN" if the input is - coming from standard input. Therefore, you must be careful that the - output file does not go into the same directory as the input - file. Otherwise, &dhpackage; will delete the - input file before it generates the output file (just like running - cat < file > file in most shells). - - - Two structurally equivalent XML documents have a byte-for-byte - identical canonical XML representation. - Note that ignorable white space is considered significant and - is treated equivalently to data. - More on canonical XML can be found at - http://www.jclark.com/xml/canonxml.html . - - - - - - - - - Specifies the character encoding for the document, overriding - any document encoding declaration. &dhpackage; - supports four built-in encodings: - US-ASCII, - UTF-8, - UTF-16, and - ISO-8859-1. - Also see the option. - - - - - - - - - Outputs some strange sort of XML file that completely - describes the the input file, including character postitions. - Requires to specify an output file. - - - - - - - - - Turns on namespace processing. (describe namespaces) - disables namespaces. - - - - - - - - - Tells xmlwf to process external DTDs and parameter - entities. - - - Normally &dhpackage; never parses parameter - entities. tells it to always parse them. - implies . - - - - - - - - - Normally &dhpackage; memory-maps the XML file - before parsing; this can result in faster parsing on many - platforms. - turns off memory-mapping and uses normal file - IO calls instead. - Of course, memory-mapping is automatically turned off - when reading from standard input. - - - Use of memory-mapping can cause some platforms to report - substantially higher memory usage for - &dhpackage;, but this appears to be a matter of - the operating system reporting memory in a strange way; there is - not a leak in &dhpackage;. - - - - - - - - - Prints an error if the document is not standalone. - A document is standalone if it has no external subset and no - references to parameter entities. - - - - - - - - - Turns on timings. This tells Expat to parse the entire file, - but not perform any processing. - This gives a fairly accurate idea of the raw speed of Expat itself - without client overhead. - turns off most of the output options - (, , , - ...). - - - - - - - - - Prints the version of the Expat library being used, including some - information on the compile-time configuration of the library, and - then exits. - - - - - - - - - Enables support for Windows code pages. - Normally, &dhpackage; will throw an error if it - runs across an encoding that it is not equipped to handle itself. With - , &dhpackage; will try to use a Windows code - page. See also . - - - - - - - - - Turns on parsing external entities. - - - Non-validating parsers are not required to resolve external - entities, or even expand entities at all. - Expat always expands internal entities (?), - but external entity parsing must be enabled explicitly. - - - External entities are simply entities that obtain their - data from outside the XML file currently being parsed. - - - This is an example of an internal entity: - -<!ENTITY vers '1.0.2'> - - - - And here are some examples of external entities: - - -<!ENTITY header SYSTEM "header-&vers;.xml"> (parsed) -<!ENTITY logo SYSTEM "logo.png" PNG> (unparsed) - - - - - - - - - - - (Two hyphens.) - Terminates the list of options. This is only needed if a filename - starts with a hyphen. For example: - - -&dhpackage; -- -myfile.xml - - - will run &dhpackage; on the file - -myfile.xml. - - - - - - - Older versions of &dhpackage; do not support - reading from standard input. - - - - - OUTPUT - - If an input file is not well-formed, - &dhpackage; prints a single line describing - the problem to standard output. If a file is well formed, - &dhpackage; outputs nothing. - Note that the result code is not set. - - - - - BUGS - - &dhpackage; returns a 0 - noerr result, - even if the file is not well-formed. There is no good way for - a program to use &dhpackage; to quickly - check a file -- it must parse &dhpackage;'s - standard output. - - - The errors should go to standard error, not standard output. - - - There should be a way to get to send its - output to standard output rather than forcing the user to send - it to a file. - - - I have no idea why anyone would want to use the - , , and - options. If someone could explain it to - me, I'd like to add this information to this manpage. - - - - - ALTERNATIVES - - Here are some XML validators on the web: - - -http://www.hcrc.ed.ac.uk/~richard/xml-check.html -http://www.stg.brown.edu/service/xmlvalid/ -http://www.scripting.com/frontier5/xml/code/xmlValidator.html -http://www.xml.com/pub/a/tools/ruwf/check.html - - - - - - - SEE ALSO - - - -The Expat home page: http://www.libexpat.org/ -The W3 XML specification: http://www.w3.org/TR/REC-xml - - - - - - - AUTHOR - - This manual page was written by &dhusername; &dhemail; for - the &debian; system (but may be used by others). Permission is - granted to copy, distribute and/or modify this document under - the terms of the GNU Free Documentation - License, Version 1.1. - - -
- - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw deleted file mode 100644 index 2d62eec5..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw +++ /dev/null @@ -1,110 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "elements"=.\examples\elements.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat_static - End Project Dependency -}}} - -############################################################################### - -Project: "expat"=.\lib\expat.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expat_static"=.\lib\expat_static.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expatw"=.\lib\expatw.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expatw_static"=.\lib\expatw_static.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "outline"=.\examples\outline.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat - End Project Dependency -}}} - -############################################################################### - -Project: "xmlwf"=.\xmlwf\xmlwf.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in deleted file mode 100644 index 5207e3e1..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: expat -Version: @PACKAGE_VERSION@ -Description: expat XML parser -URL: http://www.libexpat.org -Libs: -L${libdir} -lexpat -Cflags: -I${includedir} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake deleted file mode 100644 index 25d79a6d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake +++ /dev/null @@ -1,91 +0,0 @@ -/* expat_config.h.in. Generated from configure.in by autoheader. */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#cmakedefine BYTEORDER @BYTEORDER@ - -/* Define to 1 if you have the `bcopy' function. */ -#cmakedefine HAVE_BCOPY - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_FCNTL_H - -/* Define to 1 if you have the `getpagesize' function. */ -#cmakedefine HAVE_GETPAGESIZE - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#cmakedefine HAVE_MEMMOVE - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MEMORY_H - -/* Define to 1 if you have a working `mmap' system call. */ -#cmakedefine HAVE_MMAP - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H - -/* Define to the address where bug reports for this package should be sent. */ -#cmakedefine PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#cmakedefine PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#cmakedefine PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#cmakedefine PACKAGE_TARNAME - -/* Define to the version of this package. */ -#cmakedefine PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS - -/* whether byteorder is bigendian */ -#cmakedefine WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#cmakedefine XML_CONTEXT_BYTES @XML_CONTEXT_BYTES@ - -/* Define to make parameter entity parsing functionality available. */ -#cmakedefine XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#cmakedefine XML_NS - -/* Define to __FUNCTION__ or "" if `__func__' does not conform to ANSI C. */ -#ifdef _MSC_VER -# define __func__ __FUNCTION__ -#endif - -/* Define to `long' if does not define. */ -#cmakedefine off_t @OFF_T@ - -/* Define to `unsigned' if does not define. */ -#cmakedefine size_t @SIZE_T@ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in deleted file mode 100644 index 8c6e5140..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in +++ /dev/null @@ -1,102 +0,0 @@ -/* expat_config.h.in. Generated from configure.in by autoheader. */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#undef BYTEORDER - -/* Define to 1 if you have the `bcopy' function. */ -#undef HAVE_BCOPY - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have the `getpagesize' function. */ -#undef HAVE_GETPAGESIZE - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* whether byteorder is bigendian */ -#undef WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#undef XML_CONTEXT_BYTES - -/* Define to make parameter entity parsing functionality available. */ -#undef XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#undef XML_NS - -/* Define to __FUNCTION__ or "" if `__func__' does not conform to ANSI C. */ -#undef __func__ - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `long int' if does not define. */ -#undef off_t - -/* Define to `unsigned int' if does not define. */ -#undef size_t diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW deleted file mode 100644 index 046af005..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW +++ /dev/null @@ -1,206 +0,0 @@ -# File: Makefile.MPW -# Targets: All, Dynamic, Static (and Clean, Clean-All) -# Created: Tuesday, July 02, 2002 -# -# MPW Makefile for building expat under the "classic" (i.e. pre-X) Mac OS -# Copyright © 2002 Daryle Walker -# Portions Copyright © 2002 Thomas Wegner -# See the COPYING file for distribution information -# -# Description: -# This Makefile lets you build static, dynamic (i.e. shared) and stub -# versions of the expat library as well as the elements.c and outline.c -# examples (built as tools for MPW). This is for PPC only; it should be -# no problem to build a 68K version of the expat library, though. -# -# Usage: -# Buildprogram All -# or Buildprogram Dynamic -# or Buildprogram Static -# -# Note: You first have to rename this file to "Makefile", or the Buildprogram -# commando will not recognize it. -# - -MAKEFILE = Makefile -¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = : -SrcDir = : -HdrDir = : - -ToolDir = ::examples: - -Includes = -i {HdrDir} - -Sym-PPC = -sym off - -Defines = -d MACOS_CLASSIC - -PPCCOptions = {Includes} {Sym-PPC} -w 35 {Defines} - -FragName = libexpat - - -### Source Files ### - -SrcFiles = ¶ - "{SrcDir}xmlparse.c" ¶ - "{SrcDir}xmlrole.c" ¶ - "{SrcDir}xmltok.c" - -ToolSrcFiles = ¶ - "{ToolDir}elements.c" ¶ - "{ToolDir}outline.c" - - -### Object Files ### - -ObjFiles-PPC = ¶ - "{ObjDir}xmlparse.c.o" ¶ - "{ObjDir}xmlrole.c.o" ¶ - "{ObjDir}xmltok.c.o" - -ElementToolObjFile = "{ObjDir}elements.c.o" - -OutlineToolObjFile = "{ObjDir}outline.c.o" - - -### Libraries ### - -StLibFiles-PPC = ¶ - "{PPCLibraries}StdCRuntime.o" ¶ - "{PPCLibraries}PPCCRuntime.o" ¶ - "{PPCLibraries}PPCToolLibs.o" - -ShLibFiles-PPC = ¶ - "{SharedLibraries}InterfaceLib" ¶ - "{SharedLibraries}StdCLib" ¶ - "{SharedLibraries}MathLib" - -LibFiles-PPC = ¶ - {StLibFiles-PPC} ¶ - {ShLibFiles-PPC} - - -### Special Files ### - -ExportFile = "{ObjDir}{FragName}.exp" - -StLibFile = "{ObjDir}{FragName}.MrC.o" - -ShLibFile = "{ObjDir}{FragName}" - -StubFile = "{ObjDir}{FragName}.stub" - -ElementsTool = "{ToolDir}elements" - -OutlineTool = "{ToolDir}outline" - - -### Default Rules ### - -.c.o Ä .c {¥MondoBuild¥} - {PPCC} {depDir}{default}.c -o {targDir}{default}.c.o {PPCCOptions} - - -### Build Rules ### - -All Ä Dynamic {ElementsTool} {OutlineTool} - -Static Ä {StLibFile} - -Dynamic Ä Static {ShLibFile} {StubFile} - -{StLibFile} ÄÄ {ObjFiles-PPC} {StLibFiles-PPC} {¥MondoBuild¥} - PPCLink ¶ - -o {Targ} ¶ - {ObjFiles-PPC} ¶ - {StLibFiles-PPC} ¶ - {Sym-PPC} ¶ - -mf -d ¶ - -t 'XCOF' ¶ - -c 'MPS ' ¶ - -xm l - -{ShLibFile} ÄÄ {StLibFile} {ShLibFiles-PPC} {ExportFile} {¥MondoBuild¥} - PPCLink ¶ - -o {Targ} ¶ - {StLibFile} ¶ - {ShLibFiles-PPC} ¶ - {Sym-PPC} ¶ - -@export {ExportFile} ¶ - -fragname {FragName} ¶ - -mf -d ¶ - -t 'shlb' ¶ - -c '????' ¶ - -xm s - -{StubFile} ÄÄ {ShLibFile} {¥MondoBuild¥} - shlb2stub -o {Targ} {ShLibFile} - -{ElementsTool} ÄÄ {ElementToolObjFile} {StubFile} {LibFiles-PPC} {¥MondoBuild¥} - PPCLink ¶ - -o {Targ} ¶ - {ElementToolObjFile} ¶ - {StLibFile} ¶ - {LibFiles-PPC} ¶ - {Sym-PPC} ¶ - -mf -d ¶ - -t 'MPST' ¶ - -c 'MPS ' - -{OutlineTool} ÄÄ {OutlineToolObjFile} {StubFile} {LibFiles-PPC} {¥MondoBuild¥} - PPCLink ¶ - -o {Targ} ¶ - {OutlineToolObjFile} ¶ - {StLibFile} ¶ - {LibFiles-PPC} ¶ - {Sym-PPC} ¶ - -mf -d ¶ - -t 'MPST' ¶ - -c 'MPS ' - - -### Special Rules ### - -{ExportFile} ÄÄ "{HdrDir}expat.h" {¥MondoBuild¥} - StreamEdit -d ¶ - -e "/¥('XMLPARSEAPI('Å') ')Ç0,1È'XML_'([A-Za-z0-9_]+)¨1'('/ Print 'XML_' ¨1" ¶ - "{HdrDir}expat.h" > {Targ} - - -### Required Dependencies ### - -"{ObjDir}xmlparse.c.o" Ä "{SrcDir}xmlparse.c" -"{ObjDir}xmlrole.c.o" Ä "{SrcDir}xmlrole.c" -"{ObjDir}xmltok.c.o" Ä "{SrcDir}xmltok.c" - -"{ObjDir}elements.c.o" Ä "{ToolDir}elements.c" -"{ObjDir}outline.c.o" Ä "{ToolDir}outline.c" - - -### Optional Dependencies ### -### Build this target to clean out generated intermediate files. ### - -Clean Ä - Delete {ObjFiles-PPC} {ExportFile} {ElementToolObjFile} {OutlineToolObjFile} - -### Build this target to clean out all generated files. ### - -Clean-All Ä Clean - Delete {StLibFile} {ShLibFile} {StubFile} {ElementsTool} {OutlineTool} - -### Build this target to generate "include file" dependencies. ### - -Dependencies Ä $OutOfDate - MakeDepend ¶ - -append {MAKEFILE} ¶ - -ignore "{CIncludes}" ¶ - -objdir "{ObjDir}" ¶ - -objext .o ¶ - {Defines} ¶ - {Includes} ¶ - {SrcFiles} - - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h deleted file mode 100644 index 86c61150..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef AMIGACONFIG_H -#define AMIGACONFIG_H - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 4321 - -/* Define to 1 if you have the `bcopy' function. */ -#define HAVE_BCOPY 1 - -/* Define to 1 if you have the header file. */ -#undef HAVE_CHECK_H - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* whether byteorder is bigendian */ -#define WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#define XML_CONTEXT_BYTES 1024 - -/* Define to make parameter entity parsing functionality available. */ -#define XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#define XML_NS - -#endif /* AMIGACONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h deleted file mode 100644 index d10530b0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define ASCII_A 0x41 -#define ASCII_B 0x42 -#define ASCII_C 0x43 -#define ASCII_D 0x44 -#define ASCII_E 0x45 -#define ASCII_F 0x46 -#define ASCII_G 0x47 -#define ASCII_H 0x48 -#define ASCII_I 0x49 -#define ASCII_J 0x4A -#define ASCII_K 0x4B -#define ASCII_L 0x4C -#define ASCII_M 0x4D -#define ASCII_N 0x4E -#define ASCII_O 0x4F -#define ASCII_P 0x50 -#define ASCII_Q 0x51 -#define ASCII_R 0x52 -#define ASCII_S 0x53 -#define ASCII_T 0x54 -#define ASCII_U 0x55 -#define ASCII_V 0x56 -#define ASCII_W 0x57 -#define ASCII_X 0x58 -#define ASCII_Y 0x59 -#define ASCII_Z 0x5A - -#define ASCII_a 0x61 -#define ASCII_b 0x62 -#define ASCII_c 0x63 -#define ASCII_d 0x64 -#define ASCII_e 0x65 -#define ASCII_f 0x66 -#define ASCII_g 0x67 -#define ASCII_h 0x68 -#define ASCII_i 0x69 -#define ASCII_j 0x6A -#define ASCII_k 0x6B -#define ASCII_l 0x6C -#define ASCII_m 0x6D -#define ASCII_n 0x6E -#define ASCII_o 0x6F -#define ASCII_p 0x70 -#define ASCII_q 0x71 -#define ASCII_r 0x72 -#define ASCII_s 0x73 -#define ASCII_t 0x74 -#define ASCII_u 0x75 -#define ASCII_v 0x76 -#define ASCII_w 0x77 -#define ASCII_x 0x78 -#define ASCII_y 0x79 -#define ASCII_z 0x7A - -#define ASCII_0 0x30 -#define ASCII_1 0x31 -#define ASCII_2 0x32 -#define ASCII_3 0x33 -#define ASCII_4 0x34 -#define ASCII_5 0x35 -#define ASCII_6 0x36 -#define ASCII_7 0x37 -#define ASCII_8 0x38 -#define ASCII_9 0x39 - -#define ASCII_TAB 0x09 -#define ASCII_SPACE 0x20 -#define ASCII_EXCL 0x21 -#define ASCII_QUOT 0x22 -#define ASCII_AMP 0x26 -#define ASCII_APOS 0x27 -#define ASCII_MINUS 0x2D -#define ASCII_PERIOD 0x2E -#define ASCII_COLON 0x3A -#define ASCII_SEMI 0x3B -#define ASCII_LT 0x3C -#define ASCII_EQUALS 0x3D -#define ASCII_GT 0x3E -#define ASCII_LSQB 0x5B -#define ASCII_RSQB 0x5D -#define ASCII_UNDERSCORE 0x5F -#define ASCII_LPAREN 0x28 -#define ASCII_RPAREN 0x29 -#define ASCII_FF 0x0C -#define ASCII_SLASH 0x2F -#define ASCII_HASH 0x23 -#define ASCII_PIPE 0x7C -#define ASCII_COMMA 0x2C diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h deleted file mode 100644 index 79a15c28..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp deleted file mode 100644 index bf728da0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp +++ /dev/null @@ -1,185 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expat" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=expat - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expat.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expat.mak" CFG="expat - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expat - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "expat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expat - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /machine:I386 -# ADD LINK32 /nologo /dll /pdb:none /machine:I386 /out:"..\win32\bin\Release\libexpat.dll" - -!ELSEIF "$(CFG)" == "expat - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /dll /pdb:none /debug /machine:I386 /out:"..\win32\bin\Debug\libexpat.dll" - -!ENDIF - -# Begin Target - -# Name "expat - Win32 Release" -# Name "expat - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\libexpat.def -# End Source File -# Begin Source File - -SOURCE=.\xmlparse.c - -!IF "$(CFG)" == "expat - Win32 Release" - -!ELSEIF "$(CFG)" == "expat - Win32 Debug" - -# ADD CPP /GX- /Od - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h deleted file mode 100644 index 9a21680b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h +++ /dev/null @@ -1,1047 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_INCLUDED -#define Expat_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler -#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler -#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler -#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg -#endif - -#include -#include "expat_external.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct XML_ParserStruct; -typedef struct XML_ParserStruct *XML_Parser; - -/* Should this be defined using stdbool.h when C99 is available? */ -typedef unsigned char XML_Bool; -#define XML_TRUE ((XML_Bool) 1) -#define XML_FALSE ((XML_Bool) 0) - -/* The XML_Status enum gives the possible return values for several - API functions. The preprocessor #defines are included so this - stanza can be added to code that still needs to support older - versions of Expat 1.95.x: - - #ifndef XML_STATUS_OK - #define XML_STATUS_OK 1 - #define XML_STATUS_ERROR 0 - #endif - - Otherwise, the #define hackery is quite ugly and would have been - dropped. -*/ -enum XML_Status { - XML_STATUS_ERROR = 0, -#define XML_STATUS_ERROR XML_STATUS_ERROR - XML_STATUS_OK = 1, -#define XML_STATUS_OK XML_STATUS_OK - XML_STATUS_SUSPENDED = 2 -#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED -}; - -enum XML_Error { - XML_ERROR_NONE, - XML_ERROR_NO_MEMORY, - XML_ERROR_SYNTAX, - XML_ERROR_NO_ELEMENTS, - XML_ERROR_INVALID_TOKEN, - XML_ERROR_UNCLOSED_TOKEN, - XML_ERROR_PARTIAL_CHAR, - XML_ERROR_TAG_MISMATCH, - XML_ERROR_DUPLICATE_ATTRIBUTE, - XML_ERROR_JUNK_AFTER_DOC_ELEMENT, - XML_ERROR_PARAM_ENTITY_REF, - XML_ERROR_UNDEFINED_ENTITY, - XML_ERROR_RECURSIVE_ENTITY_REF, - XML_ERROR_ASYNC_ENTITY, - XML_ERROR_BAD_CHAR_REF, - XML_ERROR_BINARY_ENTITY_REF, - XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, - XML_ERROR_MISPLACED_XML_PI, - XML_ERROR_UNKNOWN_ENCODING, - XML_ERROR_INCORRECT_ENCODING, - XML_ERROR_UNCLOSED_CDATA_SECTION, - XML_ERROR_EXTERNAL_ENTITY_HANDLING, - XML_ERROR_NOT_STANDALONE, - XML_ERROR_UNEXPECTED_STATE, - XML_ERROR_ENTITY_DECLARED_IN_PE, - XML_ERROR_FEATURE_REQUIRES_XML_DTD, - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, - /* Added in 1.95.7. */ - XML_ERROR_UNBOUND_PREFIX, - /* Added in 1.95.8. */ - XML_ERROR_UNDECLARING_PREFIX, - XML_ERROR_INCOMPLETE_PE, - XML_ERROR_XML_DECL, - XML_ERROR_TEXT_DECL, - XML_ERROR_PUBLICID, - XML_ERROR_SUSPENDED, - XML_ERROR_NOT_SUSPENDED, - XML_ERROR_ABORTED, - XML_ERROR_FINISHED, - XML_ERROR_SUSPEND_PE, - /* Added in 2.0. */ - XML_ERROR_RESERVED_PREFIX_XML, - XML_ERROR_RESERVED_PREFIX_XMLNS, - XML_ERROR_RESERVED_NAMESPACE_URI -}; - -enum XML_Content_Type { - XML_CTYPE_EMPTY = 1, - XML_CTYPE_ANY, - XML_CTYPE_MIXED, - XML_CTYPE_NAME, - XML_CTYPE_CHOICE, - XML_CTYPE_SEQ -}; - -enum XML_Content_Quant { - XML_CQUANT_NONE, - XML_CQUANT_OPT, - XML_CQUANT_REP, - XML_CQUANT_PLUS -}; - -/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be - XML_CQUANT_NONE, and the other fields will be zero or NULL. - If type == XML_CTYPE_MIXED, then quant will be NONE or REP and - numchildren will contain number of elements that may be mixed in - and children point to an array of XML_Content cells that will be - all of XML_CTYPE_NAME type with no quantification. - - If type == XML_CTYPE_NAME, then the name points to the name, and - the numchildren field will be zero and children will be NULL. The - quant fields indicates any quantifiers placed on the name. - - CHOICE and SEQ will have name NULL, the number of children in - numchildren and children will point, recursively, to an array - of XML_Content cells. - - The EMPTY, ANY, and MIXED types will only occur at top level. -*/ - -typedef struct XML_cp XML_Content; - -struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - XML_Char * name; - unsigned int numchildren; - XML_Content * children; -}; - - -/* This is called for an element declaration. See above for - description of the model argument. It's the caller's responsibility - to free model when finished with it. -*/ -typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, - const XML_Char *name, - XML_Content *model); - -XMLPARSEAPI(void) -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl); - -/* The Attlist declaration handler is called for *each* attribute. So - a single Attlist declaration with multiple attributes declared will - generate multiple calls to this handler. The "default" parameter - may be NULL in the case of the "#IMPLIED" or "#REQUIRED" - keyword. The "isrequired" parameter will be true and the default - value will be NULL in the case of "#REQUIRED". If "isrequired" is - true and default is non-NULL, then this is a "#FIXED" default. -*/ -typedef void (XMLCALL *XML_AttlistDeclHandler) ( - void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); - -XMLPARSEAPI(void) -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl); - -/* The XML declaration handler is called for *both* XML declarations - and text declarations. The way to distinguish is that the version - parameter will be NULL for text declarations. The encoding - parameter may be NULL for XML declarations. The standalone - parameter will be -1, 0, or 1 indicating respectively that there - was no standalone parameter in the declaration, that it was given - as no, or that it was given as yes. -*/ -typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); - -XMLPARSEAPI(void) -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler xmldecl); - - -typedef struct { - void *(*malloc_fcn)(size_t size); - void *(*realloc_fcn)(void *ptr, size_t size); - void (*free_fcn)(void *ptr); -} XML_Memory_Handling_Suite; - -/* Constructs a new parser; encoding is the encoding specified by the - external protocol or NULL if there is none specified. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate(const XML_Char *encoding); - -/* Constructs a new parser and namespace processor. Element type - names and attribute names that belong to a namespace will be - expanded; unprefixed attribute names are never expanded; unprefixed - element type names are expanded only if there is a default - namespace. The expanded name is the concatenation of the namespace - URI, the namespace separator character, and the local part of the - name. If the namespace separator is '\0' then the namespace URI - and the local part will be concatenated without any separator. - It is a programming error to use the separator '\0' with namespace - triplets (see XML_SetReturnNSTriplet). -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); - - -/* Constructs a new parser using the memory management suite referred to - by memsuite. If memsuite is NULL, then use the standard library memory - suite. If namespaceSeparator is non-NULL it creates a parser with - namespace processing as described above. The character pointed at - will serve as the namespace separator. - - All further memory operations used for the created parser will come from - the given suite. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate_MM(const XML_Char *encoding, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *namespaceSeparator); - -/* Prepare a parser object to be re-used. This is particularly - valuable when memory allocation overhead is disproportionatly high, - such as when a large number of small documnents need to be parsed. - All handlers are cleared from the parser, except for the - unknownEncodingHandler. The parser's external state is re-initialized - except for the values of ns and ns_triplets. - - Added in Expat 1.95.3. -*/ -XMLPARSEAPI(XML_Bool) -XML_ParserReset(XML_Parser parser, const XML_Char *encoding); - -/* atts is array of name/value pairs, terminated by 0; - names and values are 0 terminated. -*/ -typedef void (XMLCALL *XML_StartElementHandler) (void *userData, - const XML_Char *name, - const XML_Char **atts); - -typedef void (XMLCALL *XML_EndElementHandler) (void *userData, - const XML_Char *name); - - -/* s is not 0 terminated. */ -typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, - const XML_Char *s, - int len); - -/* target and data are 0 terminated */ -typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( - void *userData, - const XML_Char *target, - const XML_Char *data); - -/* data is 0 terminated */ -typedef void (XMLCALL *XML_CommentHandler) (void *userData, - const XML_Char *data); - -typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); -typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); - -/* This is called for any characters in the XML document for which - there is no applicable handler. This includes both characters that - are part of markup which is of a kind that is not reported - (comments, markup declarations), or characters that are part of a - construct which could be reported but for which no handler has been - supplied. The characters are passed exactly as they were in the XML - document except that they will be encoded in UTF-8 or UTF-16. - Line boundaries are not normalized. Note that a byte order mark - character is not passed to the default handler. There are no - guarantees about how characters are divided between calls to the - default handler: for example, a comment might be split between - multiple calls. -*/ -typedef void (XMLCALL *XML_DefaultHandler) (void *userData, - const XML_Char *s, - int len); - -/* This is called for the start of the DOCTYPE declaration, before - any DTD or internal subset is parsed. -*/ -typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( - void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); - -/* This is called for the start of the DOCTYPE declaration when the - closing > is encountered, but after processing any external - subset. -*/ -typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); - -/* This is called for entity declarations. The is_parameter_entity - argument will be non-zero if the entity is a parameter entity, zero - otherwise. - - For internal entities (), value will - be non-NULL and systemId, publicID, and notationName will be NULL. - The value string is NOT nul-terminated; the length is provided in - the value_length argument. Since it is legal to have zero-length - values, do not use this argument to test for internal entities. - - For external entities, value will be NULL and systemId will be - non-NULL. The publicId argument will be NULL unless a public - identifier was provided. The notationName argument will have a - non-NULL value only for unparsed entity declarations. - - Note that is_parameter_entity can't be changed to XML_Bool, since - that would break binary compatibility. -*/ -typedef void (XMLCALL *XML_EntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -XMLPARSEAPI(void) -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler); - -/* OBSOLETE -- OBSOLETE -- OBSOLETE - This handler has been superceded by the EntityDeclHandler above. - It is provided here for backward compatibility. - - This is called for a declaration of an unparsed (NDATA) entity. - The base argument is whatever was set by XML_SetBase. The - entityName, systemId and notationName arguments will never be - NULL. The other arguments may be. -*/ -typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -/* This is called for a declaration of notation. The base argument is - whatever was set by XML_SetBase. The notationName will never be - NULL. The other arguments can be. -*/ -typedef void (XMLCALL *XML_NotationDeclHandler) ( - void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* When namespace processing is enabled, these are called once for - each namespace declaration. The call to the start and end element - handlers occur between the calls to the start and end namespace - declaration handlers. For an xmlns attribute, prefix will be - NULL. For an xmlns="" attribute, uri will be NULL. -*/ -typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix, - const XML_Char *uri); - -typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix); - -/* This is called if the document is not standalone, that is, it has an - external subset or a reference to a parameter entity, but does not - have standalone="yes". If this handler returns XML_STATUS_ERROR, - then processing will not continue, and the parser will return a - XML_ERROR_NOT_STANDALONE error. - If parameter entity parsing is enabled, then in addition to the - conditions above this handler will only be called if the referenced - entity was actually read. -*/ -typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); - -/* This is called for a reference to an external parsed general - entity. The referenced entity is not automatically parsed. The - application can parse it immediately or later using - XML_ExternalEntityParserCreate. - - The parser argument is the parser parsing the entity containing the - reference; it can be passed as the parser argument to - XML_ExternalEntityParserCreate. The systemId argument is the - system identifier as specified in the entity declaration; it will - not be NULL. - - The base argument is the system identifier that should be used as - the base for resolving systemId if systemId was relative; this is - set by XML_SetBase; it may be NULL. - - The publicId argument is the public identifier as specified in the - entity declaration, or NULL if none was specified; the whitespace - in the public identifier will have been normalized as required by - the XML spec. - - The context argument specifies the parsing context in the format - expected by the context argument to XML_ExternalEntityParserCreate; - context is valid only until the handler returns, so if the - referenced entity is to be parsed later, it must be copied. - context is NULL only when the entity is a parameter entity. - - The handler should return XML_STATUS_ERROR if processing should not - continue because of a fatal error in the handling of the external - entity. In this case the calling parser will return an - XML_ERROR_EXTERNAL_ENTITY_HANDLING error. - - Note that unlike other handlers the first argument is the parser, - not userData. -*/ -typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( - XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* This is called in two situations: - 1) An entity reference is encountered for which no declaration - has been read *and* this is not an error. - 2) An internal entity reference is read, but not expanded, because - XML_SetDefaultHandler has been called. - Note: skipped parameter entities in declarations and skipped general - entities in attribute values cannot be reported, because - the event would be out of sync with the reporting of the - declarations or attribute values -*/ -typedef void (XMLCALL *XML_SkippedEntityHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity); - -/* This structure is filled in by the XML_UnknownEncodingHandler to - provide information to the parser about encodings that are unknown - to the parser. - - The map[b] member gives information about byte sequences whose - first byte is b. - - If map[b] is c where c is >= 0, then b by itself encodes the - Unicode scalar value c. - - If map[b] is -1, then the byte sequence is malformed. - - If map[b] is -n, where n >= 2, then b is the first byte of an - n-byte sequence that encodes a single Unicode scalar value. - - The data member will be passed as the first argument to the convert - function. - - The convert function is used to convert multibyte sequences; s will - point to a n-byte sequence where map[(unsigned char)*s] == -n. The - convert function must return the Unicode scalar value represented - by this byte sequence or -1 if the byte sequence is malformed. - - The convert function may be NULL if the encoding is a single-byte - encoding, that is if map[b] >= -1 for all bytes b. - - When the parser is finished with the encoding, then if release is - not NULL, it will call release passing it the data member; once - release has been called, the convert function will not be called - again. - - Expat places certain restrictions on the encodings that are supported - using this mechanism. - - 1. Every ASCII character that can appear in a well-formed XML document, - other than the characters - - $@\^`{}~ - - must be represented by a single byte, and that byte must be the - same byte that represents that character in ASCII. - - 2. No character may require more than 4 bytes to encode. - - 3. All characters encoded must have Unicode scalar values <= - 0xFFFF, (i.e., characters that would be encoded by surrogates in - UTF-16 are not allowed). Note that this restriction doesn't - apply to the built-in support for UTF-8 and UTF-16. - - 4. No Unicode character may be encoded by more than one distinct - sequence of bytes. -*/ -typedef struct { - int map[256]; - void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); -} XML_Encoding; - -/* This is called for an encoding that is unknown to the parser. - - The encodingHandlerData argument is that which was passed as the - second argument to XML_SetUnknownEncodingHandler. - - The name argument gives the name of the encoding as specified in - the encoding declaration. - - If the callback can provide information about the encoding, it must - fill in the XML_Encoding structure, and return XML_STATUS_OK. - Otherwise it must return XML_STATUS_ERROR. - - If info does not describe a suitable encoding, then the parser will - return an XML_UNKNOWN_ENCODING error. -*/ -typedef int (XMLCALL *XML_UnknownEncodingHandler) ( - void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); - -XMLPARSEAPI(void) -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end); - -XMLPARSEAPI(void) -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler handler); - -XMLPARSEAPI(void) -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler handler); - -XMLPARSEAPI(void) -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler); - -XMLPARSEAPI(void) -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler); -XMLPARSEAPI(void) -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler); - -XMLPARSEAPI(void) -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end); - -XMLPARSEAPI(void) -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start); - -XMLPARSEAPI(void) -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end); - -/* This sets the default handler and also inhibits expansion of - internal entities. These entity references will be passed to the - default handler, or to the skipped entity handler, if one is set. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler); - -/* This sets the default handler but does not inhibit expansion of - internal entities. The entity reference will not be passed to the - default handler. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler); - -XMLPARSEAPI(void) -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler); - -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler); - -/* If a non-NULL value for arg is specified here, then it will be - passed as the first argument to the external entity ref handler - instead of the parser object. -*/ -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, - void *arg); - -XMLPARSEAPI(void) -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler); - -XMLPARSEAPI(void) -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *encodingHandlerData); - -/* This can be called within a handler for a start element, end - element, processing instruction or character data. It causes the - corresponding markup to be passed to the default handler. -*/ -XMLPARSEAPI(void) -XML_DefaultCurrent(XML_Parser parser); - -/* If do_nst is non-zero, and namespace processing is in effect, and - a name has a prefix (i.e. an explicit namespace qualifier) then - that name is returned as a triplet in a single string separated by - the separator character specified when the parser was created: URI - + sep + local_name + sep + prefix. - - If do_nst is zero, then namespace information is returned in the - default manner (URI + sep + local_name) whether or not the name - has a prefix. - - Note: Calling XML_SetReturnNSTriplet after XML_Parse or - XML_ParseBuffer has no effect. -*/ - -XMLPARSEAPI(void) -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); - -/* This value is passed as the userData argument to callbacks. */ -XMLPARSEAPI(void) -XML_SetUserData(XML_Parser parser, void *userData); - -/* Returns the last value set by XML_SetUserData or NULL. */ -#define XML_GetUserData(parser) (*(void **)(parser)) - -/* This is equivalent to supplying an encoding argument to - XML_ParserCreate. On success XML_SetEncoding returns non-zero, - zero otherwise. - Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer - has no effect and returns XML_STATUS_ERROR. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); - -/* If this function is called, then the parser will be passed as the - first argument to callbacks instead of userData. The userData will - still be accessible using XML_GetUserData. -*/ -XMLPARSEAPI(void) -XML_UseParserAsHandlerArg(XML_Parser parser); - -/* If useDTD == XML_TRUE is passed to this function, then the parser - will assume that there is an external subset, even if none is - specified in the document. In such a case the parser will call the - externalEntityRefHandler with a value of NULL for the systemId - argument (the publicId and context arguments will be NULL as well). - Note: For the purpose of checking WFC: Entity Declared, passing - useDTD == XML_TRUE will make the parser behave as if the document - had a DTD with an external subset. - Note: If this function is called, then this must be done before - the first call to XML_Parse or XML_ParseBuffer, since it will - have no effect after that. Returns - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. - Note: If the document does not have a DOCTYPE declaration at all, - then startDoctypeDeclHandler and endDoctypeDeclHandler will not - be called, despite an external subset being parsed. - Note: If XML_DTD is not defined when Expat is compiled, returns - XML_ERROR_FEATURE_REQUIRES_XML_DTD. -*/ -XMLPARSEAPI(enum XML_Error) -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); - - -/* Sets the base to be used for resolving relative URIs in system - identifiers in declarations. Resolving relative identifiers is - left to the application: this value will be passed through as the - base argument to the XML_ExternalEntityRefHandler, - XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base - argument will be copied. Returns XML_STATUS_ERROR if out of memory, - XML_STATUS_OK otherwise. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetBase(XML_Parser parser, const XML_Char *base); - -XMLPARSEAPI(const XML_Char *) -XML_GetBase(XML_Parser parser); - -/* Returns the number of the attribute/value pairs passed in last call - to the XML_StartElementHandler that were specified in the start-tag - rather than defaulted. Each attribute/value pair counts as 2; thus - this correspondds to an index into the atts array passed to the - XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetSpecifiedAttributeCount(XML_Parser parser); - -/* Returns the index of the ID attribute passed in the last call to - XML_StartElementHandler, or -1 if there is no ID attribute. Each - attribute/value pair counts as 2; thus this correspondds to an - index into the atts array passed to the XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetIdAttributeIndex(XML_Parser parser); - -#ifdef XML_ATTR_INFO -/* Source file byte offsets for the start and end of attribute names and values. - The value indices are exclusive of surrounding quotes; thus in a UTF-8 source - file an attribute value of "blah" will yield: - info->valueEnd - info->valueStart = 4 bytes. -*/ -typedef struct { - XML_Index nameStart; /* Offset to beginning of the attribute name. */ - XML_Index nameEnd; /* Offset after the attribute name's last byte. */ - XML_Index valueStart; /* Offset to beginning of the attribute value. */ - XML_Index valueEnd; /* Offset after the attribute value's last byte. */ -} XML_AttrInfo; - -/* Returns an array of XML_AttrInfo structures for the attribute/value pairs - passed in last call to the XML_StartElementHandler that were specified - in the start-tag rather than defaulted. Each attribute/value pair counts - as 1; thus the number of entries in the array is - XML_GetSpecifiedAttributeCount(parser) / 2. -*/ -XMLPARSEAPI(const XML_AttrInfo *) -XML_GetAttributeInfo(XML_Parser parser); -#endif - -/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is - detected. The last call to XML_Parse must have isFinal true; len - may be zero for this call (or any other). - - Though the return values for these functions has always been - described as a Boolean value, the implementation, at least for the - 1.95.x series, has always returned exactly one of the XML_Status - values. -*/ -XMLPARSEAPI(enum XML_Status) -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); - -XMLPARSEAPI(void *) -XML_GetBuffer(XML_Parser parser, int len); - -XMLPARSEAPI(enum XML_Status) -XML_ParseBuffer(XML_Parser parser, int len, int isFinal); - -/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. - Must be called from within a call-back handler, except when aborting - (resumable = 0) an already suspended parser. Some call-backs may - still follow because they would otherwise get lost. Examples: - - endElementHandler() for empty elements when stopped in - startElementHandler(), - - endNameSpaceDeclHandler() when stopped in endElementHandler(), - and possibly others. - - Can be called from most handlers, including DTD related call-backs, - except when parsing an external parameter entity and resumable != 0. - Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. - Possible error codes: - - XML_ERROR_SUSPENDED: when suspending an already suspended parser. - - XML_ERROR_FINISHED: when the parser has already finished. - - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. - - When resumable != 0 (true) then parsing is suspended, that is, - XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. - Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() - return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. - - *Note*: - This will be applied to the current parser instance only, that is, if - there is a parent parser then it will continue parsing when the - externalEntityRefHandler() returns. It is up to the implementation of - the externalEntityRefHandler() to call XML_StopParser() on the parent - parser (recursively), if one wants to stop parsing altogether. - - When suspended, parsing can be resumed by calling XML_ResumeParser(). -*/ -XMLPARSEAPI(enum XML_Status) -XML_StopParser(XML_Parser parser, XML_Bool resumable); - -/* Resumes parsing after it has been suspended with XML_StopParser(). - Must not be called from within a handler call-back. Returns same - status codes as XML_Parse() or XML_ParseBuffer(). - Additional error code XML_ERROR_NOT_SUSPENDED possible. - - *Note*: - This must be called on the most deeply nested child parser instance - first, and on its parent parser only after the child parser has finished, - to be applied recursively until the document entity's parser is restarted. - That is, the parent parser will not resume by itself and it is up to the - application to call XML_ResumeParser() on it at the appropriate moment. -*/ -XMLPARSEAPI(enum XML_Status) -XML_ResumeParser(XML_Parser parser); - -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; - -typedef struct { - enum XML_Parsing parsing; - XML_Bool finalBuffer; -} XML_ParsingStatus; - -/* Returns status of parser with respect to being initialized, parsing, - finished, or suspended and processing the final buffer. - XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, - XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED -*/ -XMLPARSEAPI(void) -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); - -/* Creates an XML_Parser object that can parse an external general - entity; context is a '\0'-terminated string specifying the parse - context; encoding is a '\0'-terminated string giving the name of - the externally specified encoding, or NULL if there is no - externally specified encoding. The context string consists of a - sequence of tokens separated by formfeeds (\f); a token consisting - of a name specifies that the general entity of the name is open; a - token of the form prefix=uri specifies the namespace for a - particular prefix; a token of the form =uri specifies the default - namespace. This can be called at any point after the first call to - an ExternalEntityRefHandler so longer as the parser has not yet - been freed. The new parser is completely independent and may - safely be used in a separate thread. The handlers and userData are - initialized from the parser argument. Returns NULL if out of memory. - Otherwise returns a new XML_Parser object. -*/ -XMLPARSEAPI(XML_Parser) -XML_ExternalEntityParserCreate(XML_Parser parser, - const XML_Char *context, - const XML_Char *encoding); - -enum XML_ParamEntityParsing { - XML_PARAM_ENTITY_PARSING_NEVER, - XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, - XML_PARAM_ENTITY_PARSING_ALWAYS -}; - -/* Controls parsing of parameter entities (including the external DTD - subset). If parsing of parameter entities is enabled, then - references to external parameter entities (including the external - DTD subset) will be passed to the handler set with - XML_SetExternalEntityRefHandler. The context passed will be 0. - - Unlike external general entities, external parameter entities can - only be parsed synchronously. If the external parameter entity is - to be parsed, it must be parsed during the call to the external - entity ref handler: the complete sequence of - XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and - XML_ParserFree calls must be made during this call. After - XML_ExternalEntityParserCreate has been called to create the parser - for the external parameter entity (context must be 0 for this - call), it is illegal to make any calls on the old parser until - XML_ParserFree has been called on the newly created parser. - If the library has been compiled without support for parameter - entity parsing (ie without XML_DTD being defined), then - XML_SetParamEntityParsing will return 0 if parsing of parameter - entities is requested; otherwise it will return non-zero. - Note: If XML_SetParamEntityParsing is called after XML_Parse or - XML_ParseBuffer, then it has no effect and will always return 0. -*/ -XMLPARSEAPI(int) -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing parsing); - -/* Sets the hash salt to use for internal hash calculations. - Helps in preventing DoS attacks based on predicting hash - function behavior. This must be called before parsing is started. - Returns 1 if successful, 0 when called after parsing has started. -*/ -XMLPARSEAPI(int) -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt); - -/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then - XML_GetErrorCode returns information about the error. -*/ -XMLPARSEAPI(enum XML_Error) -XML_GetErrorCode(XML_Parser parser); - -/* These functions return information about the current parse - location. They may be called from any callback called to report - some parse event; in this case the location is the location of the - first of the sequence of characters that generated the event. When - called from callbacks generated by declarations in the document - prologue, the location identified isn't as neatly defined, but will - be within the relevant markup. When called outside of the callback - functions, the position indicated will be just past the last parse - event (regardless of whether there was an associated callback). - - They may also be called after returning from a call to XML_Parse - or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then - the location is the location of the character at which the error - was detected; otherwise the location is the location of the last - parse event, as described above. -*/ -XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); -XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); -XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); - -/* Return the number of bytes in the current event. - Returns 0 if the event is in an internal entity. -*/ -XMLPARSEAPI(int) -XML_GetCurrentByteCount(XML_Parser parser); - -/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets - the integer pointed to by offset to the offset within this buffer - of the current parse position, and sets the integer pointed to by size - to the size of this buffer (the number of input bytes). Otherwise - returns a NULL pointer. Also returns a NULL pointer if a parse isn't - active. - - NOTE: The character pointer returned should not be used outside - the handler that makes the call. -*/ -XMLPARSEAPI(const char *) -XML_GetInputContext(XML_Parser parser, - int *offset, - int *size); - -/* For backwards compatibility with previous versions. */ -#define XML_GetErrorLineNumber XML_GetCurrentLineNumber -#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber -#define XML_GetErrorByteIndex XML_GetCurrentByteIndex - -/* Frees the content model passed to the element declaration handler */ -XMLPARSEAPI(void) -XML_FreeContentModel(XML_Parser parser, XML_Content *model); - -/* Exposing the memory handling functions used in Expat */ -XMLPARSEAPI(void *) -XML_MemMalloc(XML_Parser parser, size_t size); - -XMLPARSEAPI(void *) -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); - -XMLPARSEAPI(void) -XML_MemFree(XML_Parser parser, void *ptr); - -/* Frees memory used by the parser. */ -XMLPARSEAPI(void) -XML_ParserFree(XML_Parser parser); - -/* Returns a string describing the error. */ -XMLPARSEAPI(const XML_LChar *) -XML_ErrorString(enum XML_Error code); - -/* Return a string containing the version number of this expat */ -XMLPARSEAPI(const XML_LChar *) -XML_ExpatVersion(void); - -typedef struct { - int major; - int minor; - int micro; -} XML_Expat_Version; - -/* Return an XML_Expat_Version structure containing numeric version - number information for this version of expat. -*/ -XMLPARSEAPI(XML_Expat_Version) -XML_ExpatVersionInfo(void); - -/* Added in Expat 1.95.5. */ -enum XML_FeatureEnum { - XML_FEATURE_END = 0, - XML_FEATURE_UNICODE, - XML_FEATURE_UNICODE_WCHAR_T, - XML_FEATURE_DTD, - XML_FEATURE_CONTEXT_BYTES, - XML_FEATURE_MIN_SIZE, - XML_FEATURE_SIZEOF_XML_CHAR, - XML_FEATURE_SIZEOF_XML_LCHAR, - XML_FEATURE_NS, - XML_FEATURE_LARGE_SIZE, - XML_FEATURE_ATTR_INFO - /* Additional features must be added to the end of this enum. */ -}; - -typedef struct { - enum XML_FeatureEnum feature; - const XML_LChar *name; - long int value; -} XML_Feature; - -XMLPARSEAPI(const XML_Feature *) -XML_GetFeatureList(void); - - -/* Expat follows the GNU/Linux convention of odd number minor version for - beta/development releases and even number minor version for stable - releases. Micro is bumped with each release, and set to 0 with each - change to major or minor version. -*/ -#define XML_MAJOR_VERSION 2 -#define XML_MINOR_VERSION 1 -#define XML_MICRO_VERSION 0 - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h deleted file mode 100644 index 2c03284e..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_External_INCLUDED -#define Expat_External_INCLUDED 1 - -/* External API definitions */ - -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -#define XML_USE_MSC_EXTENSIONS 1 -#endif - -/* Expat tries very hard to make the API boundary very specifically - defined. There are two macros defined to control this boundary; - each of these can be defined before including this header to - achieve some different behavior, but doing so it not recommended or - tested frequently. - - XMLCALL - The calling convention to use for all calls across the - "library boundary." This will default to cdecl, and - try really hard to tell the compiler that's what we - want. - - XMLIMPORT - Whatever magic is needed to note that a function is - to be imported from a dynamically loaded library - (.dll, .so, or .sl, depending on your platform). - - The XMLCALL macro was added in Expat 1.95.7. The only one which is - expected to be directly useful in client code is XMLCALL. - - Note that on at least some Unix versions, the Expat library must be - compiled with the cdecl calling convention as the default since - system headers may assume the cdecl convention. -*/ -#ifndef XMLCALL -#if defined(_MSC_VER) -#define XMLCALL __cdecl -#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) -#define XMLCALL __attribute__((cdecl)) -#else -/* For any platform which uses this definition and supports more than - one calling convention, we need to extend this definition to - declare the convention used on that platform, if it's possible to - do so. - - If this is the case for your platform, please file a bug report - with information on how to identify your platform via the C - pre-processor and how to specify the same calling convention as the - platform's malloc() implementation. -*/ -#define XMLCALL -#endif -#endif /* not defined XMLCALL */ - - -#if !defined(XML_STATIC) && !defined(XMLIMPORT) -#ifndef XML_BUILDING_EXPAT -/* using Expat from an application */ - -#ifdef XML_USE_MSC_EXTENSIONS -#define XMLIMPORT __declspec(dllimport) -#endif - -#endif -#endif /* not defined XML_STATIC */ - - -/* If we didn't define it above, define it away: */ -#ifndef XMLIMPORT -#define XMLIMPORT -#endif - - -#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef XML_UNICODE_WCHAR_T -#define XML_UNICODE -#endif - -#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ -#ifdef XML_UNICODE_WCHAR_T -typedef wchar_t XML_Char; -typedef wchar_t XML_LChar; -#else -typedef unsigned short XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE_WCHAR_T */ -#else /* Information is UTF-8 encoded. */ -typedef char XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE */ - -#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -typedef __int64 XML_Index; -typedef unsigned __int64 XML_Size; -#else -typedef long long XML_Index; -typedef unsigned long long XML_Size; -#endif -#else -typedef long XML_Index; -typedef unsigned long XML_Size; -#endif /* XML_LARGE_SIZE */ - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_External_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp deleted file mode 100644 index 180f0dc6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expat_static" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=expat_static - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expat_static.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expat_static.mak" CFG="expat_static - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expat_static - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "expat_static - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expat_static - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "expat_static___Win32_Release" -# PROP BASE Intermediate_Dir "expat_static___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Release\libexpatMT.lib" - -!ELSEIF "$(CFG)" == "expat_static - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "expat_static___Win32_Debug" -# PROP BASE Intermediate_Dir "expat_static___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "COMPILED_FROM_DSP" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Debug\libexpatMT.lib" - -!ENDIF - -# Begin Target - -# Name "expat_static - Win32 Release" -# Name "expat_static - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\xmlparse.c -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln deleted file mode 100644 index 6325342a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "expat", "expat_static.vcproj", "{60AF91BC-74EB-47E7-9C71-646D525591C5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|Win32.ActiveCfg = Debug|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|Win32.Build.0 = Debug|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|x64.ActiveCfg = Debug|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|x64.Build.0 = Debug|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|Win32.ActiveCfg = Release|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|Win32.Build.0 = Release|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|x64.ActiveCfg = Release|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj deleted file mode 100644 index 73b3a757..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp deleted file mode 100644 index b91a117c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp +++ /dev/null @@ -1,185 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expatw" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=expatw - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expatw.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expatw.mak" CFG="expatw - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expatw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "expatw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expatw - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-w" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /machine:I386 -# ADD LINK32 /nologo /dll /pdb:none /machine:I386 /out:"..\win32\bin\Release\libexpatw.dll" - -!ELSEIF "$(CFG)" == "expatw - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-w" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FR /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /dll /pdb:none /debug /machine:I386 /out:"..\win32\bin\Debug\libexpatw.dll" - -!ENDIF - -# Begin Target - -# Name "expatw - Win32 Release" -# Name "expatw - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\libexpatw.def -# End Source File -# Begin Source File - -SOURCE=.\xmlparse.c - -!IF "$(CFG)" == "expatw - Win32 Release" - -!ELSEIF "$(CFG)" == "expatw - Win32 Debug" - -# ADD CPP /GX- /Od - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp deleted file mode 100644 index d28632cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expatw_static" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=expatw_static - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expatw_static.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expatw_static.mak" CFG="expatw_static - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expatw_static - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "expatw_static - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expatw_static - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "expatw_static___Win32_Release" -# PROP BASE Intermediate_Dir "expatw_static___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-w_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /D "XML_UNICODE_WCHAR_T" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Release\libexpatwMT.lib" - -!ELSEIF "$(CFG)" == "expatw_static - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "expatw_static___Win32_Debug" -# PROP BASE Intermediate_Dir "expatw_static___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-w_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /D "XML_UNICODE_WCHAR_T" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Debug\libexpatwMT.lib" - -!ENDIF - -# Begin Target - -# Name "expatw_static - Win32 Release" -# Name "expatw_static - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\xmlparse.c -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h deleted file mode 100644 index 24a1d5cc..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h deleted file mode 100644 index dd545483..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h +++ /dev/null @@ -1,73 +0,0 @@ -/* internal.h - - Internal definitions used by Expat. This is not needed to compile - client code. - - The following calling convention macros are defined for frequently - called functions: - - FASTCALL - Used for those internal functions that have a simple - body and a low number of arguments and local variables. - - PTRCALL - Used for functions called though function pointers. - - PTRFASTCALL - Like PTRCALL, but for low number of arguments. - - inline - Used for selected internal functions for which inlining - may improve performance on some platforms. - - Note: Use of these macros is based on judgement, not hard rules, - and therefore subject to change. -*/ - -#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) -/* We'll use this version by default only where we know it helps. - - regparm() generates warnings on Solaris boxes. See SF bug #692878. - - Instability reported with egcs on a RedHat Linux 7.3. - Let's comment out: - #define FASTCALL __attribute__((stdcall, regparm(3))) - and let's try this: -*/ -#define FASTCALL __attribute__((regparm(3))) -#define PTRFASTCALL __attribute__((regparm(3))) -#endif - -/* Using __fastcall seems to have an unexpected negative effect under - MS VC++, especially for function pointers, so we won't use it for - now on that platform. It may be reconsidered for a future release - if it can be made more effective. - Likely reason: __fastcall on Windows is like stdcall, therefore - the compiler cannot perform stack optimizations for call clusters. -*/ - -/* Make sure all of these are defined if they aren't already. */ - -#ifndef FASTCALL -#define FASTCALL -#endif - -#ifndef PTRCALL -#define PTRCALL -#endif - -#ifndef PTRFASTCALL -#define PTRFASTCALL -#endif - -#ifndef XML_MIN_SIZE -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif /* __GNUC__ */ -#endif -#endif /* XML_MIN_SIZE */ - -#ifdef __cplusplus -#define inline inline -#else -#ifndef inline -#define inline -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h deleted file mode 100644 index 53c25d76..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, -/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def deleted file mode 100644 index 3920bbcf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def +++ /dev/null @@ -1,73 +0,0 @@ -; DEF file for MS VC++ - -LIBRARY -EXPORTS - XML_DefaultCurrent @1 - XML_ErrorString @2 - XML_ExpatVersion @3 - XML_ExpatVersionInfo @4 - XML_ExternalEntityParserCreate @5 - XML_GetBase @6 - XML_GetBuffer @7 - XML_GetCurrentByteCount @8 - XML_GetCurrentByteIndex @9 - XML_GetCurrentColumnNumber @10 - XML_GetCurrentLineNumber @11 - XML_GetErrorCode @12 - XML_GetIdAttributeIndex @13 - XML_GetInputContext @14 - XML_GetSpecifiedAttributeCount @15 - XML_Parse @16 - XML_ParseBuffer @17 - XML_ParserCreate @18 - XML_ParserCreateNS @19 - XML_ParserCreate_MM @20 - XML_ParserFree @21 - XML_SetAttlistDeclHandler @22 - XML_SetBase @23 - XML_SetCdataSectionHandler @24 - XML_SetCharacterDataHandler @25 - XML_SetCommentHandler @26 - XML_SetDefaultHandler @27 - XML_SetDefaultHandlerExpand @28 - XML_SetDoctypeDeclHandler @29 - XML_SetElementDeclHandler @30 - XML_SetElementHandler @31 - XML_SetEncoding @32 - XML_SetEndCdataSectionHandler @33 - XML_SetEndDoctypeDeclHandler @34 - XML_SetEndElementHandler @35 - XML_SetEndNamespaceDeclHandler @36 - XML_SetEntityDeclHandler @37 - XML_SetExternalEntityRefHandler @38 - XML_SetExternalEntityRefHandlerArg @39 - XML_SetNamespaceDeclHandler @40 - XML_SetNotStandaloneHandler @41 - XML_SetNotationDeclHandler @42 - XML_SetParamEntityParsing @43 - XML_SetProcessingInstructionHandler @44 - XML_SetReturnNSTriplet @45 - XML_SetStartCdataSectionHandler @46 - XML_SetStartDoctypeDeclHandler @47 - XML_SetStartElementHandler @48 - XML_SetStartNamespaceDeclHandler @49 - XML_SetUnknownEncodingHandler @50 - XML_SetUnparsedEntityDeclHandler @51 - XML_SetUserData @52 - XML_SetXmlDeclHandler @53 - XML_UseParserAsHandlerArg @54 -; added with version 1.95.3 - XML_ParserReset @55 - XML_SetSkippedEntityHandler @56 -; added with version 1.95.5 - XML_GetFeatureList @57 - XML_UseForeignDTD @58 -; added with version 1.95.6 - XML_FreeContentModel @59 - XML_MemMalloc @60 - XML_MemRealloc @61 - XML_MemFree @62 -; added with version 1.95.8 - XML_StopParser @63 - XML_ResumeParser @64 - XML_GetParsingStatus @65 diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def deleted file mode 100644 index 3920bbcf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def +++ /dev/null @@ -1,73 +0,0 @@ -; DEF file for MS VC++ - -LIBRARY -EXPORTS - XML_DefaultCurrent @1 - XML_ErrorString @2 - XML_ExpatVersion @3 - XML_ExpatVersionInfo @4 - XML_ExternalEntityParserCreate @5 - XML_GetBase @6 - XML_GetBuffer @7 - XML_GetCurrentByteCount @8 - XML_GetCurrentByteIndex @9 - XML_GetCurrentColumnNumber @10 - XML_GetCurrentLineNumber @11 - XML_GetErrorCode @12 - XML_GetIdAttributeIndex @13 - XML_GetInputContext @14 - XML_GetSpecifiedAttributeCount @15 - XML_Parse @16 - XML_ParseBuffer @17 - XML_ParserCreate @18 - XML_ParserCreateNS @19 - XML_ParserCreate_MM @20 - XML_ParserFree @21 - XML_SetAttlistDeclHandler @22 - XML_SetBase @23 - XML_SetCdataSectionHandler @24 - XML_SetCharacterDataHandler @25 - XML_SetCommentHandler @26 - XML_SetDefaultHandler @27 - XML_SetDefaultHandlerExpand @28 - XML_SetDoctypeDeclHandler @29 - XML_SetElementDeclHandler @30 - XML_SetElementHandler @31 - XML_SetEncoding @32 - XML_SetEndCdataSectionHandler @33 - XML_SetEndDoctypeDeclHandler @34 - XML_SetEndElementHandler @35 - XML_SetEndNamespaceDeclHandler @36 - XML_SetEntityDeclHandler @37 - XML_SetExternalEntityRefHandler @38 - XML_SetExternalEntityRefHandlerArg @39 - XML_SetNamespaceDeclHandler @40 - XML_SetNotStandaloneHandler @41 - XML_SetNotationDeclHandler @42 - XML_SetParamEntityParsing @43 - XML_SetProcessingInstructionHandler @44 - XML_SetReturnNSTriplet @45 - XML_SetStartCdataSectionHandler @46 - XML_SetStartDoctypeDeclHandler @47 - XML_SetStartElementHandler @48 - XML_SetStartNamespaceDeclHandler @49 - XML_SetUnknownEncodingHandler @50 - XML_SetUnparsedEntityDeclHandler @51 - XML_SetUserData @52 - XML_SetXmlDeclHandler @53 - XML_UseParserAsHandlerArg @54 -; added with version 1.95.3 - XML_ParserReset @55 - XML_SetSkippedEntityHandler @56 -; added with version 1.95.5 - XML_GetFeatureList @57 - XML_UseForeignDTD @58 -; added with version 1.95.6 - XML_FreeContentModel @59 - XML_MemMalloc @60 - XML_MemRealloc @61 - XML_MemFree @62 -; added with version 1.95.8 - XML_StopParser @63 - XML_ResumeParser @64 - XML_GetParsingStatus @65 diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h deleted file mode 100644 index 2725caaf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h +++ /dev/null @@ -1,53 +0,0 @@ -/*================================================================ -** Copyright 2000, Clark Cooper -** All rights reserved. -** -** This is free software. You are permitted to copy, distribute, or modify -** it under the terms of the MIT/X license (contained in the COPYING file -** with this distribution.) -** -*/ - -#ifndef MACCONFIG_H -#define MACCONFIG_H - - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 4321 - -/* Define to 1 if you have the `bcopy' function. */ -#undef HAVE_BCOPY - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE - -/* Define to 1 if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* whether byteorder is bigendian */ -#define WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#undef XML_CONTEXT_BYTES - -/* Define to make parameter entity parsing functionality available. */ -#define XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#define XML_NS - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `long' if does not define. */ -#define off_t long - -/* Define to `unsigned' if does not define. */ -#undef size_t - - -#endif /* ifndef MACCONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h deleted file mode 100644 index b05e62c7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h +++ /dev/null @@ -1,150 +0,0 @@ -static const unsigned namingBitmap[] = { -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, -0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, -0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, -0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, -0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, -0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, -0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, -0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, -0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, -0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, -0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, -0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, -0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, -0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, -0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, -0x40000000, 0xF580C900, 0x00000007, 0x02010800, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, -0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, -0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, -0x00000000, 0x00004C40, 0x00000000, 0x00000000, -0x00000007, 0x00000000, 0x00000000, 0x00000000, -0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, -0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, -0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, -0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, -0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, -0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, -0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, -0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, -0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, -0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, -0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, -0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, -0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, -0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, -0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, -0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, -0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, -0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, -}; -static const unsigned char nmstrtPages[] = { -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, -0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -static const unsigned char namePages[] = { -0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, -0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h deleted file mode 100644 index 7bb3e776..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - - -/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, -/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h deleted file mode 100644 index c1b791d6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h +++ /dev/null @@ -1,30 +0,0 @@ -/*================================================================ -** Copyright 2000, Clark Cooper -** All rights reserved. -** -** This is free software. You are permitted to copy, distribute, or modify -** it under the terms of the MIT/X license (contained in the COPYING file -** with this distribution.) -*/ - -#ifndef WINCONFIG_H -#define WINCONFIG_H - -#define WIN32_LEAN_AND_MEAN -#include -#undef WIN32_LEAN_AND_MEAN - -#include -#include - -#define XML_NS 1 -#define XML_DTD 1 -#define XML_CONTEXT_BYTES 1024 - -/* we will assume all Windows platforms are little endian */ -#define BYTEORDER 1234 - -/* Windows has memmove() available. */ -#define HAVE_MEMMOVE - -#endif /* ndef WINCONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c deleted file mode 100644 index f35aa36b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c +++ /dev/null @@ -1,6403 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include /* memset(), memcpy() */ -#include -#include /* UINT_MAX */ -#include /* time() */ - -#define XML_BUILDING_EXPAT 1 - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -#include -#endif /* ndef COMPILED_FROM_DSP */ - -#include "ascii.h" -#include "expat.h" - -#ifdef XML_UNICODE -#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -#define XmlConvert XmlUtf16Convert -#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -#define XmlEncode XmlUtf16Encode -/* Using pointer subtraction to convert to integer type. */ -#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) -typedef unsigned short ICHAR; -#else -#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -#define XmlConvert XmlUtf8Convert -#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -#define XmlEncode XmlUtf8Encode -#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) -typedef char ICHAR; -#endif - - -#ifndef XML_NS - -#define XmlInitEncodingNS XmlInitEncoding -#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -#undef XmlGetInternalEncodingNS -#define XmlGetInternalEncodingNS XmlGetInternalEncoding -#define XmlParseXmlDeclNS XmlParseXmlDecl - -#endif - -#ifdef XML_UNICODE - -#ifdef XML_UNICODE_WCHAR_T -#define XML_T(x) (const wchar_t)x -#define XML_L(x) L ## x -#else -#define XML_T(x) (const unsigned short)x -#define XML_L(x) x -#endif - -#else - -#define XML_T(x) x -#define XML_L(x) x - -#endif - -/* Round up n to be a multiple of sz, where sz is a power of 2. */ -#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) - -/* Handle the case where memmove() doesn't exist. */ -#ifndef HAVE_MEMMOVE -#ifdef HAVE_BCOPY -#define memmove(d,s,l) bcopy((s),(d),(l)) -#else -#error memmove does not exist on this platform, nor is a substitute available -#endif /* HAVE_BCOPY */ -#endif /* HAVE_MEMMOVE */ - -#include "internal.h" -#include "xmltok.h" -#include "xmlrole.h" - -typedef const XML_Char *KEY; - -typedef struct { - KEY name; -} NAMED; - -typedef struct { - NAMED **v; - unsigned char power; - size_t size; - size_t used; - const XML_Memory_Handling_Suite *mem; -} HASH_TABLE; - -/* Basic character hash algorithm, taken from Python's string hash: - h = h * 1000003 ^ character, the constant being a prime number. - -*/ -#ifdef XML_UNICODE -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned short)(c)) -#else -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned char)(c)) -#endif - -/* For probing (after a collision) we need a step size relative prime - to the hash table size, which is a power of 2. We use double-hashing, - since we can calculate a second hash value cheaply by taking those bits - of the first hash value that were discarded (masked out) when the table - index was calculated: index = hash & mask, where mask = table->size - 1. - We limit the maximum step size to table->size / 4 (mask >> 2) and make - it odd, since odd numbers are always relative prime to a power of 2. -*/ -#define SECOND_HASH(hash, mask, power) \ - ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ - ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) - -typedef struct { - NAMED **p; - NAMED **end; -} HASH_TABLE_ITER; - -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ -#define INIT_DATA_BUF_SIZE 1024 -#define INIT_ATTS_SIZE 16 -#define INIT_ATTS_VERSION 0xFFFFFFFF -#define INIT_BLOCK_SIZE 1024 -#define INIT_BUFFER_SIZE 1024 - -#define EXPAND_SPARE 24 - -typedef struct binding { - struct prefix *prefix; - struct binding *nextTagBinding; - struct binding *prevPrefixBinding; - const struct attribute_id *attId; - XML_Char *uri; - int uriLen; - int uriAlloc; -} BINDING; - -typedef struct prefix { - const XML_Char *name; - BINDING *binding; -} PREFIX; - -typedef struct { - const XML_Char *str; - const XML_Char *localPart; - const XML_Char *prefix; - int strLen; - int uriLen; - int prefixLen; -} TAG_NAME; - -/* TAG represents an open element. - The name of the element is stored in both the document and API - encodings. The memory buffer 'buf' is a separately-allocated - memory area which stores the name. During the XML_Parse()/ - XMLParseBuffer() when the element is open, the memory for the 'raw' - version of the name (in the document encoding) is shared with the - document buffer. If the element is open across calls to - XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to - contain the 'raw' name as well. - - A parser re-uses these structures, maintaining a list of allocated - TAG objects in a free list. -*/ -typedef struct tag { - struct tag *parent; /* parent of this element */ - const char *rawName; /* tagName in the original encoding */ - int rawNameLength; - TAG_NAME name; /* tagName in the API encoding */ - char *buf; /* buffer for name components */ - char *bufEnd; /* end of the buffer */ - BINDING *bindings; -} TAG; - -typedef struct { - const XML_Char *name; - const XML_Char *textPtr; - int textLen; /* length in XML_Chars */ - int processed; /* # of processed bytes - when suspended */ - const XML_Char *systemId; - const XML_Char *base; - const XML_Char *publicId; - const XML_Char *notation; - XML_Bool open; - XML_Bool is_param; - XML_Bool is_internal; /* true if declared in internal subset outside PE */ -} ENTITY; - -typedef struct { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - int firstchild; - int lastchild; - int childcnt; - int nextsib; -} CONTENT_SCAFFOLD; - -#define INIT_SCAFFOLD_ELEMENTS 32 - -typedef struct block { - struct block *next; - int size; - XML_Char s[1]; -} BLOCK; - -typedef struct { - BLOCK *blocks; - BLOCK *freeBlocks; - const XML_Char *end; - XML_Char *ptr; - XML_Char *start; - const XML_Memory_Handling_Suite *mem; -} STRING_POOL; - -/* The XML_Char before the name is used to determine whether - an attribute has been specified. */ -typedef struct attribute_id { - XML_Char *name; - PREFIX *prefix; - XML_Bool maybeTokenized; - XML_Bool xmlns; -} ATTRIBUTE_ID; - -typedef struct { - const ATTRIBUTE_ID *id; - XML_Bool isCdata; - const XML_Char *value; -} DEFAULT_ATTRIBUTE; - -typedef struct { - unsigned long version; - unsigned long hash; - const XML_Char *uriName; -} NS_ATT; - -typedef struct { - const XML_Char *name; - PREFIX *prefix; - const ATTRIBUTE_ID *idAtt; - int nDefaultAtts; - int allocDefaultAtts; - DEFAULT_ATTRIBUTE *defaultAtts; -} ELEMENT_TYPE; - -typedef struct { - HASH_TABLE generalEntities; - HASH_TABLE elementTypes; - HASH_TABLE attributeIds; - HASH_TABLE prefixes; - STRING_POOL pool; - STRING_POOL entityValuePool; - /* false once a parameter entity reference has been skipped */ - XML_Bool keepProcessing; - /* true once an internal or external PE reference has been encountered; - this includes the reference to an external subset */ - XML_Bool hasParamEntityRefs; - XML_Bool standalone; -#ifdef XML_DTD - /* indicates if external PE has been read */ - XML_Bool paramEntityRead; - HASH_TABLE paramEntities; -#endif /* XML_DTD */ - PREFIX defaultPrefix; - /* === scaffolding for building content model === */ - XML_Bool in_eldecl; - CONTENT_SCAFFOLD *scaffold; - unsigned contentStringLen; - unsigned scaffSize; - unsigned scaffCount; - int scaffLevel; - int *scaffIndex; -} DTD; - -typedef struct open_internal_entity { - const char *internalEventPtr; - const char *internalEventEndPtr; - struct open_internal_entity *next; - ENTITY *entity; - int startTagLevel; - XML_Bool betweenDecl; /* WFC: PE Between Declarations */ -} OPEN_INTERNAL_ENTITY; - -typedef enum XML_Error PTRCALL Processor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr); - -static Processor prologProcessor; -static Processor prologInitProcessor; -static Processor contentProcessor; -static Processor cdataSectionProcessor; -#ifdef XML_DTD -static Processor ignoreSectionProcessor; -static Processor externalParEntProcessor; -static Processor externalParEntInitProcessor; -static Processor entityValueProcessor; -static Processor entityValueInitProcessor; -#endif /* XML_DTD */ -static Processor epilogProcessor; -static Processor errorProcessor; -static Processor externalEntityInitProcessor; -static Processor externalEntityInitProcessor2; -static Processor externalEntityInitProcessor3; -static Processor externalEntityContentProcessor; -static Processor internalEntityProcessor; - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next); -static enum XML_Error -initializeEncoding(XML_Parser parser); -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end, int tok, const char *next, const char **nextPtr, - XML_Bool haveMore); -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl); -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *start, const char *end, const char **endPtr, - XML_Bool haveMore); -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#ifdef XML_DTD -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#endif /* XML_DTD */ - -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *, const char *s, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr); -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr); -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, - XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end); -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); - -static const XML_Char * getContext(XML_Parser parser); -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context); - -static void FASTCALL normalizePublicId(XML_Char *s); - -static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); -/* do not call if parentParser != NULL */ -static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); -static int -dtdCopy(XML_Parser oldParser, - DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); -static void FASTCALL -hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL hashTableClear(HASH_TABLE *); -static void FASTCALL hashTableDestroy(HASH_TABLE *); -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); -static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); - -static void FASTCALL -poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL poolClear(STRING_POOL *); -static void FASTCALL poolDestroy(STRING_POOL *); -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s); -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s); - -static int FASTCALL nextScaffoldPart(XML_Parser parser); -static XML_Content * build_model(XML_Parser parser); -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, - const char *ptr, const char *end); - -static unsigned long generate_hash_secret_salt(void); -static XML_Bool startParsing(XML_Parser parser); - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd); - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName); - -#define poolStart(pool) ((pool)->start) -#define poolEnd(pool) ((pool)->ptr) -#define poolLength(pool) ((pool)->ptr - (pool)->start) -#define poolChop(pool) ((void)--(pool->ptr)) -#define poolLastChar(pool) (((pool)->ptr)[-1]) -#define poolDiscard(pool) ((pool)->ptr = (pool)->start) -#define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ - ? 0 \ - : ((*((pool)->ptr)++ = c), 1)) - -struct XML_ParserStruct { - /* The first member must be userData so that the XML_GetUserData - macro works. */ - void *m_userData; - void *m_handlerArg; - char *m_buffer; - const XML_Memory_Handling_Suite m_mem; - /* first character to be parsed */ - const char *m_bufferPtr; - /* past last character to be parsed */ - char *m_bufferEnd; - /* allocated end of buffer */ - const char *m_bufferLim; - XML_Index m_parseEndByteIndex; - const char *m_parseEndPtr; - XML_Char *m_dataBuf; - XML_Char *m_dataBufEnd; - XML_StartElementHandler m_startElementHandler; - XML_EndElementHandler m_endElementHandler; - XML_CharacterDataHandler m_characterDataHandler; - XML_ProcessingInstructionHandler m_processingInstructionHandler; - XML_CommentHandler m_commentHandler; - XML_StartCdataSectionHandler m_startCdataSectionHandler; - XML_EndCdataSectionHandler m_endCdataSectionHandler; - XML_DefaultHandler m_defaultHandler; - XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; - XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; - XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; - XML_NotationDeclHandler m_notationDeclHandler; - XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; - XML_NotStandaloneHandler m_notStandaloneHandler; - XML_ExternalEntityRefHandler m_externalEntityRefHandler; - XML_Parser m_externalEntityRefHandlerArg; - XML_SkippedEntityHandler m_skippedEntityHandler; - XML_UnknownEncodingHandler m_unknownEncodingHandler; - XML_ElementDeclHandler m_elementDeclHandler; - XML_AttlistDeclHandler m_attlistDeclHandler; - XML_EntityDeclHandler m_entityDeclHandler; - XML_XmlDeclHandler m_xmlDeclHandler; - const ENCODING *m_encoding; - INIT_ENCODING m_initEncoding; - const ENCODING *m_internalEncoding; - const XML_Char *m_protocolEncodingName; - XML_Bool m_ns; - XML_Bool m_ns_triplets; - void *m_unknownEncodingMem; - void *m_unknownEncodingData; - void *m_unknownEncodingHandlerData; - void (XMLCALL *m_unknownEncodingRelease)(void *); - PROLOG_STATE m_prologState; - Processor *m_processor; - enum XML_Error m_errorCode; - const char *m_eventPtr; - const char *m_eventEndPtr; - const char *m_positionPtr; - OPEN_INTERNAL_ENTITY *m_openInternalEntities; - OPEN_INTERNAL_ENTITY *m_freeInternalEntities; - XML_Bool m_defaultExpandInternalEntities; - int m_tagLevel; - ENTITY *m_declEntity; - const XML_Char *m_doctypeName; - const XML_Char *m_doctypeSysid; - const XML_Char *m_doctypePubid; - const XML_Char *m_declAttributeType; - const XML_Char *m_declNotationName; - const XML_Char *m_declNotationPublicId; - ELEMENT_TYPE *m_declElementType; - ATTRIBUTE_ID *m_declAttributeId; - XML_Bool m_declAttributeIsCdata; - XML_Bool m_declAttributeIsId; - DTD *m_dtd; - const XML_Char *m_curBase; - TAG *m_tagStack; - TAG *m_freeTagList; - BINDING *m_inheritedBindings; - BINDING *m_freeBindingList; - int m_attsSize; - int m_nSpecifiedAtts; - int m_idAttIndex; - ATTRIBUTE *m_atts; - NS_ATT *m_nsAtts; - unsigned long m_nsAttsVersion; - unsigned char m_nsAttsPower; -#ifdef XML_ATTR_INFO - XML_AttrInfo *m_attInfo; -#endif - POSITION m_position; - STRING_POOL m_tempPool; - STRING_POOL m_temp2Pool; - char *m_groupConnector; - unsigned int m_groupSize; - XML_Char m_namespaceSeparator; - XML_Parser m_parentParser; - XML_ParsingStatus m_parsingStatus; -#ifdef XML_DTD - XML_Bool m_isParamEntity; - XML_Bool m_useForeignDTD; - enum XML_ParamEntityParsing m_paramEntityParsing; -#endif - unsigned long m_hash_secret_salt; -}; - -#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) -#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) -#define FREE(p) (parser->m_mem.free_fcn((p))) - -#define userData (parser->m_userData) -#define handlerArg (parser->m_handlerArg) -#define startElementHandler (parser->m_startElementHandler) -#define endElementHandler (parser->m_endElementHandler) -#define characterDataHandler (parser->m_characterDataHandler) -#define processingInstructionHandler \ - (parser->m_processingInstructionHandler) -#define commentHandler (parser->m_commentHandler) -#define startCdataSectionHandler \ - (parser->m_startCdataSectionHandler) -#define endCdataSectionHandler (parser->m_endCdataSectionHandler) -#define defaultHandler (parser->m_defaultHandler) -#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) -#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) -#define unparsedEntityDeclHandler \ - (parser->m_unparsedEntityDeclHandler) -#define notationDeclHandler (parser->m_notationDeclHandler) -#define startNamespaceDeclHandler \ - (parser->m_startNamespaceDeclHandler) -#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) -#define notStandaloneHandler (parser->m_notStandaloneHandler) -#define externalEntityRefHandler \ - (parser->m_externalEntityRefHandler) -#define externalEntityRefHandlerArg \ - (parser->m_externalEntityRefHandlerArg) -#define internalEntityRefHandler \ - (parser->m_internalEntityRefHandler) -#define skippedEntityHandler (parser->m_skippedEntityHandler) -#define unknownEncodingHandler (parser->m_unknownEncodingHandler) -#define elementDeclHandler (parser->m_elementDeclHandler) -#define attlistDeclHandler (parser->m_attlistDeclHandler) -#define entityDeclHandler (parser->m_entityDeclHandler) -#define xmlDeclHandler (parser->m_xmlDeclHandler) -#define encoding (parser->m_encoding) -#define initEncoding (parser->m_initEncoding) -#define internalEncoding (parser->m_internalEncoding) -#define unknownEncodingMem (parser->m_unknownEncodingMem) -#define unknownEncodingData (parser->m_unknownEncodingData) -#define unknownEncodingHandlerData \ - (parser->m_unknownEncodingHandlerData) -#define unknownEncodingRelease (parser->m_unknownEncodingRelease) -#define protocolEncodingName (parser->m_protocolEncodingName) -#define ns (parser->m_ns) -#define ns_triplets (parser->m_ns_triplets) -#define prologState (parser->m_prologState) -#define processor (parser->m_processor) -#define errorCode (parser->m_errorCode) -#define eventPtr (parser->m_eventPtr) -#define eventEndPtr (parser->m_eventEndPtr) -#define positionPtr (parser->m_positionPtr) -#define position (parser->m_position) -#define openInternalEntities (parser->m_openInternalEntities) -#define freeInternalEntities (parser->m_freeInternalEntities) -#define defaultExpandInternalEntities \ - (parser->m_defaultExpandInternalEntities) -#define tagLevel (parser->m_tagLevel) -#define buffer (parser->m_buffer) -#define bufferPtr (parser->m_bufferPtr) -#define bufferEnd (parser->m_bufferEnd) -#define parseEndByteIndex (parser->m_parseEndByteIndex) -#define parseEndPtr (parser->m_parseEndPtr) -#define bufferLim (parser->m_bufferLim) -#define dataBuf (parser->m_dataBuf) -#define dataBufEnd (parser->m_dataBufEnd) -#define _dtd (parser->m_dtd) -#define curBase (parser->m_curBase) -#define declEntity (parser->m_declEntity) -#define doctypeName (parser->m_doctypeName) -#define doctypeSysid (parser->m_doctypeSysid) -#define doctypePubid (parser->m_doctypePubid) -#define declAttributeType (parser->m_declAttributeType) -#define declNotationName (parser->m_declNotationName) -#define declNotationPublicId (parser->m_declNotationPublicId) -#define declElementType (parser->m_declElementType) -#define declAttributeId (parser->m_declAttributeId) -#define declAttributeIsCdata (parser->m_declAttributeIsCdata) -#define declAttributeIsId (parser->m_declAttributeIsId) -#define freeTagList (parser->m_freeTagList) -#define freeBindingList (parser->m_freeBindingList) -#define inheritedBindings (parser->m_inheritedBindings) -#define tagStack (parser->m_tagStack) -#define atts (parser->m_atts) -#define attsSize (parser->m_attsSize) -#define nSpecifiedAtts (parser->m_nSpecifiedAtts) -#define idAttIndex (parser->m_idAttIndex) -#define nsAtts (parser->m_nsAtts) -#define nsAttsVersion (parser->m_nsAttsVersion) -#define nsAttsPower (parser->m_nsAttsPower) -#define attInfo (parser->m_attInfo) -#define tempPool (parser->m_tempPool) -#define temp2Pool (parser->m_temp2Pool) -#define groupConnector (parser->m_groupConnector) -#define groupSize (parser->m_groupSize) -#define namespaceSeparator (parser->m_namespaceSeparator) -#define parentParser (parser->m_parentParser) -#define ps_parsing (parser->m_parsingStatus.parsing) -#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) -#ifdef XML_DTD -#define isParamEntity (parser->m_isParamEntity) -#define useForeignDTD (parser->m_useForeignDTD) -#define paramEntityParsing (parser->m_paramEntityParsing) -#endif /* XML_DTD */ -#define hash_secret_salt (parser->m_hash_secret_salt) - -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) -{ - return XML_ParserCreate_MM(encodingName, NULL, NULL); -} - -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ - XML_Char tmp[2]; - *tmp = nsSep; - return XML_ParserCreate_MM(encodingName, NULL, tmp); -} - -static const XML_Char implicitContext[] = { - ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, - ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, - ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, - ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' -}; - -static unsigned long -generate_hash_secret_salt(void) -{ - unsigned int seed = time(NULL) % UINT_MAX; - srand(seed); - return rand(); -} - -static XML_Bool /* only valid for root parser */ -startParsing(XML_Parser parser) -{ - /* hash functions must be initialized before setContext() is called */ - if (hash_secret_salt == 0) - hash_secret_salt = generate_hash_secret_salt(); - if (ns) { - /* implicit context only set for root parser, since child - parsers (i.e. external entity parsers) will inherit it - */ - return setContext(parser, implicitContext); - } - return XML_TRUE; -} - -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) -{ - return parserCreate(encodingName, memsuite, nameSep, NULL); -} - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd) -{ - XML_Parser parser; - - if (memsuite) { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser) - memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = memsuite->malloc_fcn; - mtemp->realloc_fcn = memsuite->realloc_fcn; - mtemp->free_fcn = memsuite->free_fcn; - } - } - else { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = malloc; - mtemp->realloc_fcn = realloc; - mtemp->free_fcn = free; - } - } - - if (!parser) - return parser; - - buffer = NULL; - bufferLim = NULL; - - attsSize = INIT_ATTS_SIZE; - atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); - if (atts == NULL) { - FREE(parser); - return NULL; - } -#ifdef XML_ATTR_INFO - attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); - if (attInfo == NULL) { - FREE(atts); - FREE(parser); - return NULL; - } -#endif - dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); - if (dataBuf == NULL) { - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; - - if (dtd) - _dtd = dtd; - else { - _dtd = dtdCreate(&parser->m_mem); - if (_dtd == NULL) { - FREE(dataBuf); - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - } - - freeBindingList = NULL; - freeTagList = NULL; - freeInternalEntities = NULL; - - groupSize = 0; - groupConnector = NULL; - - unknownEncodingHandler = NULL; - unknownEncodingHandlerData = NULL; - - namespaceSeparator = ASCII_EXCL; - ns = XML_FALSE; - ns_triplets = XML_FALSE; - - nsAtts = NULL; - nsAttsVersion = 0; - nsAttsPower = 0; - - poolInit(&tempPool, &(parser->m_mem)); - poolInit(&temp2Pool, &(parser->m_mem)); - parserInit(parser, encodingName); - - if (encodingName && !protocolEncodingName) { - XML_ParserFree(parser); - return NULL; - } - - if (nameSep) { - ns = XML_TRUE; - internalEncoding = XmlGetInternalEncodingNS(); - namespaceSeparator = *nameSep; - } - else { - internalEncoding = XmlGetInternalEncoding(); - } - - return parser; -} - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName) -{ - processor = prologInitProcessor; - XmlPrologStateInit(&prologState); - protocolEncodingName = (encodingName != NULL - ? poolCopyString(&tempPool, encodingName) - : NULL); - curBase = NULL; - XmlInitEncoding(&initEncoding, &encoding, 0); - userData = NULL; - handlerArg = NULL; - startElementHandler = NULL; - endElementHandler = NULL; - characterDataHandler = NULL; - processingInstructionHandler = NULL; - commentHandler = NULL; - startCdataSectionHandler = NULL; - endCdataSectionHandler = NULL; - defaultHandler = NULL; - startDoctypeDeclHandler = NULL; - endDoctypeDeclHandler = NULL; - unparsedEntityDeclHandler = NULL; - notationDeclHandler = NULL; - startNamespaceDeclHandler = NULL; - endNamespaceDeclHandler = NULL; - notStandaloneHandler = NULL; - externalEntityRefHandler = NULL; - externalEntityRefHandlerArg = parser; - skippedEntityHandler = NULL; - elementDeclHandler = NULL; - attlistDeclHandler = NULL; - entityDeclHandler = NULL; - xmlDeclHandler = NULL; - bufferPtr = buffer; - bufferEnd = buffer; - parseEndByteIndex = 0; - parseEndPtr = NULL; - declElementType = NULL; - declAttributeId = NULL; - declEntity = NULL; - doctypeName = NULL; - doctypeSysid = NULL; - doctypePubid = NULL; - declAttributeType = NULL; - declNotationName = NULL; - declNotationPublicId = NULL; - declAttributeIsCdata = XML_FALSE; - declAttributeIsId = XML_FALSE; - memset(&position, 0, sizeof(POSITION)); - errorCode = XML_ERROR_NONE; - eventPtr = NULL; - eventEndPtr = NULL; - positionPtr = NULL; - openInternalEntities = NULL; - defaultExpandInternalEntities = XML_TRUE; - tagLevel = 0; - tagStack = NULL; - inheritedBindings = NULL; - nSpecifiedAtts = 0; - unknownEncodingMem = NULL; - unknownEncodingRelease = NULL; - unknownEncodingData = NULL; - parentParser = NULL; - ps_parsing = XML_INITIALIZED; -#ifdef XML_DTD - isParamEntity = XML_FALSE; - useForeignDTD = XML_FALSE; - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif - hash_secret_salt = 0; -} - -/* moves list of bindings to freeBindingList */ -static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) -{ - while (bindings) { - BINDING *b = bindings; - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - } -} - -XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) -{ - TAG *tStk; - OPEN_INTERNAL_ENTITY *openEntityList; - if (parentParser) - return XML_FALSE; - /* move tagStack to freeTagList */ - tStk = tagStack; - while (tStk) { - TAG *tag = tStk; - tStk = tStk->parent; - tag->parent = freeTagList; - moveToFreeBindingList(parser, tag->bindings); - tag->bindings = NULL; - freeTagList = tag; - } - /* move openInternalEntities to freeInternalEntities */ - openEntityList = openInternalEntities; - while (openEntityList) { - OPEN_INTERNAL_ENTITY *openEntity = openEntityList; - openEntityList = openEntity->next; - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - moveToFreeBindingList(parser, inheritedBindings); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - poolClear(&tempPool); - poolClear(&temp2Pool); - parserInit(parser, encodingName); - dtdReset(_dtd, &parser->m_mem); - return XML_TRUE; -} - -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - /* Block after XML_Parse()/XML_ParseBuffer() has been called. - XXX There's no way for the caller to determine which of the - XXX possible error cases caused the XML_STATUS_ERROR return. - */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_STATUS_ERROR; - if (encodingName == NULL) - protocolEncodingName = NULL; - else { - protocolEncodingName = poolCopyString(&tempPool, encodingName); - if (!protocolEncodingName) - return XML_STATUS_ERROR; - } - return XML_STATUS_OK; -} - -XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser oldParser, - const XML_Char *context, - const XML_Char *encodingName) -{ - XML_Parser parser = oldParser; - DTD *newDtd = NULL; - DTD *oldDtd = _dtd; - XML_StartElementHandler oldStartElementHandler = startElementHandler; - XML_EndElementHandler oldEndElementHandler = endElementHandler; - XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; - XML_ProcessingInstructionHandler oldProcessingInstructionHandler - = processingInstructionHandler; - XML_CommentHandler oldCommentHandler = commentHandler; - XML_StartCdataSectionHandler oldStartCdataSectionHandler - = startCdataSectionHandler; - XML_EndCdataSectionHandler oldEndCdataSectionHandler - = endCdataSectionHandler; - XML_DefaultHandler oldDefaultHandler = defaultHandler; - XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler - = unparsedEntityDeclHandler; - XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; - XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler - = startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler - = endNamespaceDeclHandler; - XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; - XML_ExternalEntityRefHandler oldExternalEntityRefHandler - = externalEntityRefHandler; - XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; - XML_UnknownEncodingHandler oldUnknownEncodingHandler - = unknownEncodingHandler; - XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; - XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; - XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; - XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; - ELEMENT_TYPE * oldDeclElementType = declElementType; - - void *oldUserData = userData; - void *oldHandlerArg = handlerArg; - XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; - XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; -#ifdef XML_DTD - enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; - int oldInEntityValue = prologState.inEntityValue; -#endif - XML_Bool oldns_triplets = ns_triplets; - /* Note that the new parser shares the same hash secret as the old - parser, so that dtdCopy and copyEntityTable can lookup values - from hash tables associated with either parser without us having - to worry which hash secrets each table has. - */ - unsigned long oldhash_secret_salt = hash_secret_salt; - -#ifdef XML_DTD - if (!context) - newDtd = oldDtd; -#endif /* XML_DTD */ - - /* Note that the magical uses of the pre-processor to make field - access look more like C++ require that `parser' be overwritten - here. This makes this function more painful to follow than it - would be otherwise. - */ - if (ns) { - XML_Char tmp[2]; - *tmp = namespaceSeparator; - parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); - } - else { - parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); - } - - if (!parser) - return NULL; - - startElementHandler = oldStartElementHandler; - endElementHandler = oldEndElementHandler; - characterDataHandler = oldCharacterDataHandler; - processingInstructionHandler = oldProcessingInstructionHandler; - commentHandler = oldCommentHandler; - startCdataSectionHandler = oldStartCdataSectionHandler; - endCdataSectionHandler = oldEndCdataSectionHandler; - defaultHandler = oldDefaultHandler; - unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; - notationDeclHandler = oldNotationDeclHandler; - startNamespaceDeclHandler = oldStartNamespaceDeclHandler; - endNamespaceDeclHandler = oldEndNamespaceDeclHandler; - notStandaloneHandler = oldNotStandaloneHandler; - externalEntityRefHandler = oldExternalEntityRefHandler; - skippedEntityHandler = oldSkippedEntityHandler; - unknownEncodingHandler = oldUnknownEncodingHandler; - elementDeclHandler = oldElementDeclHandler; - attlistDeclHandler = oldAttlistDeclHandler; - entityDeclHandler = oldEntityDeclHandler; - xmlDeclHandler = oldXmlDeclHandler; - declElementType = oldDeclElementType; - userData = oldUserData; - if (oldUserData == oldHandlerArg) - handlerArg = userData; - else - handlerArg = parser; - if (oldExternalEntityRefHandlerArg != oldParser) - externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; - defaultExpandInternalEntities = oldDefaultExpandInternalEntities; - ns_triplets = oldns_triplets; - hash_secret_salt = oldhash_secret_salt; - parentParser = oldParser; -#ifdef XML_DTD - paramEntityParsing = oldParamEntityParsing; - prologState.inEntityValue = oldInEntityValue; - if (context) { -#endif /* XML_DTD */ - if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) - || !setContext(parser, context)) { - XML_ParserFree(parser); - return NULL; - } - processor = externalEntityInitProcessor; -#ifdef XML_DTD - } - else { - /* The DTD instance referenced by _dtd is shared between the document's - root parser and external PE parsers, therefore one does not need to - call setContext. In addition, one also *must* not call setContext, - because this would overwrite existing prefix->binding pointers in - _dtd with ones that get destroyed with the external PE parser. - This would leave those prefixes with dangling pointers. - */ - isParamEntity = XML_TRUE; - XmlPrologStateInitExternalEntity(&prologState); - processor = externalParEntInitProcessor; - } -#endif /* XML_DTD */ - return parser; -} - -static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) -{ - for (;;) { - BINDING *b = bindings; - if (!b) - break; - bindings = b->nextTagBinding; - FREE(b->uri); - FREE(b); - } -} - -void XMLCALL -XML_ParserFree(XML_Parser parser) -{ - TAG *tagList; - OPEN_INTERNAL_ENTITY *entityList; - if (parser == NULL) - return; - /* free tagStack and freeTagList */ - tagList = tagStack; - for (;;) { - TAG *p; - if (tagList == NULL) { - if (freeTagList == NULL) - break; - tagList = freeTagList; - freeTagList = NULL; - } - p = tagList; - tagList = tagList->parent; - FREE(p->buf); - destroyBindings(p->bindings, parser); - FREE(p); - } - /* free openInternalEntities and freeInternalEntities */ - entityList = openInternalEntities; - for (;;) { - OPEN_INTERNAL_ENTITY *openEntity; - if (entityList == NULL) { - if (freeInternalEntities == NULL) - break; - entityList = freeInternalEntities; - freeInternalEntities = NULL; - } - openEntity = entityList; - entityList = entityList->next; - FREE(openEntity); - } - - destroyBindings(freeBindingList, parser); - destroyBindings(inheritedBindings, parser); - poolDestroy(&tempPool); - poolDestroy(&temp2Pool); -#ifdef XML_DTD - /* external parameter entity parsers share the DTD structure - parser->m_dtd with the root parser, so we must not destroy it - */ - if (!isParamEntity && _dtd) -#else - if (_dtd) -#endif /* XML_DTD */ - dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); - FREE((void *)atts); -#ifdef XML_ATTR_INFO - FREE((void *)attInfo); -#endif - FREE(groupConnector); - FREE(buffer); - FREE(dataBuf); - FREE(nsAtts); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - FREE(parser); -} - -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) -{ - handlerArg = parser; -} - -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) -{ -#ifdef XML_DTD - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; - useForeignDTD = useDTD; - return XML_ERROR_NONE; -#else - return XML_ERROR_FEATURE_REQUIRES_XML_DTD; -#endif -} - -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return; - ns_triplets = do_nst ? XML_TRUE : XML_FALSE; -} - -void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) -{ - if (handlerArg == userData) - handlerArg = userData = p; - else - userData = p; -} - -enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) -{ - if (p) { - p = poolCopyString(&_dtd->pool, p); - if (!p) - return XML_STATUS_ERROR; - curBase = p; - } - else - curBase = NULL; - return XML_STATUS_OK; -} - -const XML_Char * XMLCALL -XML_GetBase(XML_Parser parser) -{ - return curBase; -} - -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) -{ - return nSpecifiedAtts; -} - -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) -{ - return idAttIndex; -} - -#ifdef XML_ATTR_INFO -const XML_AttrInfo * XMLCALL -XML_GetAttributeInfo(XML_Parser parser) -{ - return attInfo; -} -#endif - -void XMLCALL -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end) -{ - startElementHandler = start; - endElementHandler = end; -} - -void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler start) { - startElementHandler = start; -} - -void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler end) { - endElementHandler = end; -} - -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) -{ - characterDataHandler = handler; -} - -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) -{ - processingInstructionHandler = handler; -} - -void XMLCALL -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler) -{ - commentHandler = handler; -} - -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -{ - startCdataSectionHandler = start; - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start) { - startCdataSectionHandler = start; -} - -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end) { - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_FALSE; -} - -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_TRUE; -} - -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) -{ - startDoctypeDeclHandler = start; - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start) { - startDoctypeDeclHandler = start; -} - -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end) { - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) -{ - unparsedEntityDeclHandler = handler; -} - -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler) -{ - notationDeclHandler = handler; -} - -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -{ - startNamespaceDeclHandler = start; - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start) { - startNamespaceDeclHandler = start; -} - -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end) { - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) -{ - notStandaloneHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) -{ - externalEntityRefHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) -{ - if (arg) - externalEntityRefHandlerArg = (XML_Parser)arg; - else - externalEntityRefHandlerArg = parser; -} - -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) -{ - skippedEntityHandler = handler; -} - -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *data) -{ - unknownEncodingHandler = handler; - unknownEncodingHandlerData = data; -} - -void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl) -{ - elementDeclHandler = eldecl; -} - -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl) -{ - attlistDeclHandler = attdecl; -} - -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler) -{ - entityDeclHandler = handler; -} - -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler handler) { - xmlDeclHandler = handler; -} - -int XMLCALL -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; -#ifdef XML_DTD - paramEntityParsing = peParsing; - return 1; -#else - return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; -#endif -} - -int XMLCALL -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; - hash_secret_salt = hash_salt; - return 1; -} - -enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - if (len == 0) { - ps_finalBuffer = (XML_Bool)isFinal; - if (!isFinal) - return XML_STATUS_OK; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - - /* If data are left over from last buffer, and we now know that these - data are the final chunk of input, then we have to check them again - to detect errors based on that fact. - */ - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode == XML_ERROR_NONE) { - switch (ps_parsing) { - case XML_SUSPENDED: - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return XML_STATUS_SUSPENDED; - case XML_INITIALIZED: - case XML_PARSING: - ps_parsing = XML_FINISHED; - /* fall through */ - default: - return XML_STATUS_OK; - } - } - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } -#ifndef XML_CONTEXT_BYTES - else if (bufferPtr == bufferEnd) { - const char *end; - int nLeftOver; - enum XML_Error result; - parseEndByteIndex += len; - positionPtr = s; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, s, parseEndPtr = s + len, &end); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return XML_STATUS_OK; - } - /* fall through */ - default: - result = XML_STATUS_OK; - } - } - - XmlUpdatePosition(encoding, positionPtr, end, &position); - nLeftOver = s + len - end; - if (nLeftOver) { - if (buffer == NULL || nLeftOver > bufferLim - buffer) { - /* FIXME avoid integer overflow */ - char *temp; - temp = (buffer == NULL - ? (char *)MALLOC(len * 2) - : (char *)REALLOC(buffer, len * 2)); - if (temp == NULL) { - errorCode = XML_ERROR_NO_MEMORY; - eventPtr = eventEndPtr = NULL; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - buffer = temp; - bufferLim = buffer + len * 2; - } - memcpy(buffer, end, nLeftOver); - } - bufferPtr = buffer; - bufferEnd = buffer + nLeftOver; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - eventPtr = bufferPtr; - eventEndPtr = bufferPtr; - return result; - } -#endif /* not defined XML_CONTEXT_BYTES */ - else { - void *buff = XML_GetBuffer(parser, len); - if (buff == NULL) - return XML_STATUS_ERROR; - else { - memcpy(buff, s, len); - return XML_ParseBuffer(parser, len, isFinal); - } - } -} - -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) -{ - const char *start; - enum XML_Status result = XML_STATUS_OK; - - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - start = bufferPtr; - positionPtr = start; - bufferEnd += len; - parseEndPtr = bufferEnd; - parseEndByteIndex += len; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, start, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; /* should not happen */ - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void * XMLCALL -XML_GetBuffer(XML_Parser parser, int len) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return NULL; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return NULL; - default: ; - } - - if (len > bufferLim - bufferEnd) { - /* FIXME avoid integer overflow */ - int neededSize = len + (int)(bufferEnd - bufferPtr); -#ifdef XML_CONTEXT_BYTES - int keep = (int)(bufferPtr - buffer); - - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - neededSize += keep; -#endif /* defined XML_CONTEXT_BYTES */ - if (neededSize <= bufferLim - buffer) { -#ifdef XML_CONTEXT_BYTES - if (keep < bufferPtr - buffer) { - int offset = (int)(bufferPtr - buffer) - keep; - memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); - bufferEnd -= offset; - bufferPtr -= offset; - } -#else - memmove(buffer, bufferPtr, bufferEnd - bufferPtr); - bufferEnd = buffer + (bufferEnd - bufferPtr); - bufferPtr = buffer; -#endif /* not defined XML_CONTEXT_BYTES */ - } - else { - char *newBuf; - int bufferSize = (int)(bufferLim - bufferPtr); - if (bufferSize == 0) - bufferSize = INIT_BUFFER_SIZE; - do { - bufferSize *= 2; - } while (bufferSize < neededSize); - newBuf = (char *)MALLOC(bufferSize); - if (newBuf == 0) { - errorCode = XML_ERROR_NO_MEMORY; - return NULL; - } - bufferLim = newBuf + bufferSize; -#ifdef XML_CONTEXT_BYTES - if (bufferPtr) { - int keep = (int)(bufferPtr - buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); - FREE(buffer); - buffer = newBuf; - bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; - bufferPtr = buffer + keep; - } - else { - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; - } -#else - if (bufferPtr) { - memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); - FREE(buffer); - } - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; -#endif /* not defined XML_CONTEXT_BYTES */ - } - eventPtr = eventEndPtr = NULL; - positionPtr = NULL; - } - return bufferEnd; -} - -enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - if (resumable) { - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_FINISHED; - break; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - if (resumable) { -#ifdef XML_DTD - if (isParamEntity) { - errorCode = XML_ERROR_SUSPEND_PE; - return XML_STATUS_ERROR; - } -#endif - ps_parsing = XML_SUSPENDED; - } - else - ps_parsing = XML_FINISHED; - } - return XML_STATUS_OK; -} - -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) -{ - enum XML_Status result = XML_STATUS_OK; - - if (ps_parsing != XML_SUSPENDED) { - errorCode = XML_ERROR_NOT_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_PARSING; - - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (ps_finalBuffer) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) -{ - assert(status != NULL); - *status = parser->m_parsingStatus; -} - -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) -{ - return errorCode; -} - -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) -{ - if (eventPtr) - return parseEndByteIndex - (parseEndPtr - eventPtr); - return -1; -} - -int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) -{ - if (eventEndPtr && eventPtr) - return (int)(eventEndPtr - eventPtr); - return 0; -} - -const char * XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) -{ -#ifdef XML_CONTEXT_BYTES - if (eventPtr && buffer) { - *offset = (int)(eventPtr - buffer); - *size = (int)(bufferEnd - buffer); - return buffer; - } -#endif /* defined XML_CONTEXT_BYTES */ - return (char *) 0; -} - -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.lineNumber + 1; -} - -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.columnNumber; -} - -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) -{ - FREE(model); -} - -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) -{ - return MALLOC(size); -} - -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) -{ - return REALLOC(ptr, size); -} - -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) -{ - FREE(ptr); -} - -void XMLCALL -XML_DefaultCurrent(XML_Parser parser) -{ - if (defaultHandler) { - if (openInternalEntities) - reportDefault(parser, - internalEncoding, - openInternalEntities->internalEventPtr, - openInternalEntities->internalEventEndPtr); - else - reportDefault(parser, encoding, eventPtr, eventEndPtr); - } -} - -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code) -{ - static const XML_LChar* const message[] = { - 0, - XML_L("out of memory"), - XML_L("syntax error"), - XML_L("no element found"), - XML_L("not well-formed (invalid token)"), - XML_L("unclosed token"), - XML_L("partial character"), - XML_L("mismatched tag"), - XML_L("duplicate attribute"), - XML_L("junk after document element"), - XML_L("illegal parameter entity reference"), - XML_L("undefined entity"), - XML_L("recursive entity reference"), - XML_L("asynchronous entity"), - XML_L("reference to invalid character number"), - XML_L("reference to binary entity"), - XML_L("reference to external entity in attribute"), - XML_L("XML or text declaration not at start of entity"), - XML_L("unknown encoding"), - XML_L("encoding specified in XML declaration is incorrect"), - XML_L("unclosed CDATA section"), - XML_L("error in processing external entity reference"), - XML_L("document is not standalone"), - XML_L("unexpected parser state - please send a bug report"), - XML_L("entity declared in parameter entity"), - XML_L("requested feature requires XML_DTD support in Expat"), - XML_L("cannot change setting once parsing has begun"), - XML_L("unbound prefix"), - XML_L("must not undeclare prefix"), - XML_L("incomplete markup in parameter entity"), - XML_L("XML declaration not well-formed"), - XML_L("text declaration not well-formed"), - XML_L("illegal character(s) in public id"), - XML_L("parser suspended"), - XML_L("parser not suspended"), - XML_L("parsing aborted"), - XML_L("parsing finished"), - XML_L("cannot suspend in external parameter entity"), - XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"), - XML_L("reserved prefix (xmlns) must not be declared or undeclared"), - XML_L("prefix must not be bound to one of the reserved namespace names") - }; - if (code > 0 && code < sizeof(message)/sizeof(message[0])) - return message[code]; - return NULL; -} - -const XML_LChar * XMLCALL -XML_ExpatVersion(void) { - - /* V1 is used to string-ize the version number. However, it would - string-ize the actual version macro *names* unless we get them - substituted before being passed to V1. CPP is defined to expand - a macro, then rescan for more expansions. Thus, we use V2 to expand - the version macros, then CPP will expand the resulting V1() macro - with the correct numerals. */ - /* ### I'm assuming cpp is portable in this respect... */ - -#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) -#define V2(a,b,c) XML_L("expat_")V1(a,b,c) - - return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); - -#undef V1 -#undef V2 -} - -XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) -{ - XML_Expat_Version version; - - version.major = XML_MAJOR_VERSION; - version.minor = XML_MINOR_VERSION; - version.micro = XML_MICRO_VERSION; - - return version; -} - -const XML_Feature * XMLCALL -XML_GetFeatureList(void) -{ - static const XML_Feature features[] = { - {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, -#ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, -#endif -#ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, -#endif -#ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, -#endif -#ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, -#endif -#ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, -#endif -#ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, -#endif -#ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, -#endif -#ifdef XML_ATTR_INFO - {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, -#endif - {XML_FEATURE_END, NULL, 0} - }; - - return features; -} - -/* Initially tag->rawName always points into the parse buffer; - for those TAG instances opened while the current parse buffer was - processed, and not yet closed, we need to store tag->rawName in a more - permanent location, since the parse buffer is about to be discarded. -*/ -static XML_Bool -storeRawNames(XML_Parser parser) -{ - TAG *tag = tagStack; - while (tag) { - int bufSize; - int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); - char *rawNameBuf = tag->buf + nameLen; - /* Stop if already stored. Since tagStack is a stack, we can stop - at the first entry that has already been copied; everything - below it in the stack is already been accounted for in a - previous call to this function. - */ - if (tag->rawName == rawNameBuf) - break; - /* For re-use purposes we need to ensure that the - size of tag->buf is a multiple of sizeof(XML_Char). - */ - bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); - if (bufSize > tag->bufEnd - tag->buf) { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_FALSE; - /* if tag->name.str points to tag->buf (only when namespace - processing is off) then we have to update it - */ - if (tag->name.str == (XML_Char *)tag->buf) - tag->name.str = (XML_Char *)temp; - /* if tag->name.localPart is set (when namespace processing is on) - then update it as well, since it will always point into tag->buf - */ - if (tag->name.localPart) - tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - - (XML_Char *)tag->buf); - tag->buf = temp; - tag->bufEnd = temp + bufSize; - rawNameBuf = temp + nameLen; - } - memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); - tag->rawName = rawNameBuf; - tag = tag->parent; - } - return XML_TRUE; -} - -static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 0, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = externalEntityInitProcessor2; - return externalEntityInitProcessor2(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor2(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(encoding, start, end, &next); - switch (tok) { - case XML_TOK_BOM: - /* If we are at the end of the buffer, this would cause the next stage, - i.e. externalEntityInitProcessor3, to pass control directly to - doContent (by detecting XML_TOK_NONE) without processing any xml text - declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. - */ - if (next == end && !ps_finalBuffer) { - *endPtr = next; - return XML_ERROR_NONE; - } - start = next; - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityInitProcessor3; - return externalEntityInitProcessor3(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor3(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - int tok; - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - eventPtr = start; - tok = XmlContentTok(encoding, start, end, &next); - eventEndPtr = next; - - switch (tok) { - case XML_TOK_XML_DECL: - { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } - } - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityContentProcessor; - tagLevel = 1; - return externalEntityContentProcessor(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityContentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 1, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error -doContent(XML_Parser parser, - int startTagLevel, - const ENCODING *enc, - const char *s, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - - for (;;) { - const char *next = s; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_TRAILING_CR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - *eventEndPP = end; - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) - return XML_ERROR_NO_ELEMENTS; - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (startTagLevel > 0) { - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_NO_ELEMENTS; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (characterDataHandler) - characterDataHandler(handlerArg, &ch, 1); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (!dtd->hasParamEntityRefs || dtd->standalone) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (!defaultExpandInternalEntities) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, entity->name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } - else if (externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (!context) - return XML_ERROR_NO_MEMORY; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - context, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&tempPool); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - case XML_TOK_START_TAG_NO_ATTS: - /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: - { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (freeTagList) { - tag = freeTagList; - freeTagList = freeTagList->parent; - } - else { - tag = (TAG *)MALLOC(sizeof(TAG)); - if (!tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); - if (!tag->buf) { - FREE(tag); - return XML_ERROR_NO_MEMORY; - } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = tagStack; - tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - XmlConvert(enc, - &fromPtr, rawNameEnd, - (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if (fromPtr == rawNameEnd) { - tag->name.strLen = convLen; - break; - } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } - } - } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (startElementHandler) - startElementHandler(handlerArg, tag->name.str, - (const XML_Char **)atts); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - break; - } - case XML_TOK_EMPTY_ELEMENT_NO_ATTS: - /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: - { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (!name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result) - return result; - poolFinish(&tempPool); - if (startElementHandler) { - startElementHandler(handlerArg, name.str, (const XML_Char **)atts); - noElmHandlers = XML_FALSE; - } - if (endElementHandler) { - if (startElementHandler) - *eventPP = *eventEndPP; - endElementHandler(handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - while (bindings) { - BINDING *b = bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - break; - case XML_TOK_END_TAG: - if (tagLevel == startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - else { - int len; - const char *rawName; - TAG *tag = tagStack; - tagStack = tag->parent; - tag->parent = freeTagList; - freeTagList = tag; - rawName = s + enc->minBytesPerChar*2; - len = XmlNameLength(enc, rawName); - if (len != tag->rawNameLength - || memcmp(tag->rawName, rawName, len) != 0) { - *eventPP = rawName; - return XML_ERROR_TAG_MISMATCH; - } - --tagLevel; - if (endElementHandler) { - const XML_Char *localPart; - const XML_Char *prefix; - XML_Char *uri; - localPart = tag->name.localPart; - if (ns && localPart) { - /* localPart and prefix may have been overwritten in - tag->name.str, since this points to the binding->uri - buffer which gets re-used; so we have to add them again - */ - uri = (XML_Char *)tag->name.str + tag->name.uriLen; - /* don't need to check for space - already done in storeAtts() */ - while (*localPart) *uri++ = *localPart++; - prefix = (XML_Char *)tag->name.prefix; - if (ns_triplets && prefix) { - *uri++ = namespaceSeparator; - while (*prefix) *uri++ = *prefix++; - } - *uri = XML_T('\0'); - } - endElementHandler(handlerArg, tag->name.str); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - while (tag->bindings) { - BINDING *b = tag->bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - tag->bindings = tag->bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_CHAR_REF: - { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_CDATA_SECT_OPEN: - { - enum XML_Error result; - if (startCdataSectionHandler) - startCdataSectionHandler(handlerArg); -#if 0 - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = cdataSectionProcessor; - return result; - } - } - break; - case XML_TOK_TRAILING_RSQB: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (characterDataHandler) { - if (MUST_CONVERT(enc, s)) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - characterDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - } - else - characterDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) { - *eventPP = end; - return XML_ERROR_NO_ELEMENTS; - } - if (tagLevel != startTagLevel) { - *eventPP = end; - return XML_ERROR_ASYNC_ENTITY; - } - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - default: - if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -/* Precondition: all arguments must be non-NULL; - Purpose: - - normalize attributes - - check attributes for well-formedness - - generate namespace aware attribute names (URI, prefix) - - build list of attributes for startElementHandler - - default attributes - - process namespace declarations (check and report them) - - generate namespace aware element name (URI, prefix) -*/ -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, - const char *attStr, TAG_NAME *tagNamePtr, - BINDING **bindingsPtr) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ELEMENT_TYPE *elementType; - int nDefaultAtts; - const XML_Char **appAtts; /* the attribute list for the application */ - int attIndex = 0; - int prefixLen; - int i; - int n; - XML_Char *uri; - int nPrefixes = 0; - BINDING *binding; - const XML_Char *localPart; - - /* lookup the element type name */ - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); - if (!elementType) { - const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (!name) - return XML_ERROR_NO_MEMORY; - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, - sizeof(ELEMENT_TYPE)); - if (!elementType) - return XML_ERROR_NO_MEMORY; - if (ns && !setElementTypePrefix(parser, elementType)) - return XML_ERROR_NO_MEMORY; - } - nDefaultAtts = elementType->nDefaultAtts; - - /* get the attributes from the tokenizer */ - n = XmlGetAttributes(enc, attStr, attsSize, atts); - if (n + nDefaultAtts > attsSize) { - int oldAttsSize = attsSize; - ATTRIBUTE *temp; -#ifdef XML_ATTR_INFO - XML_AttrInfo *temp2; -#endif - attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - atts = temp; -#ifdef XML_ATTR_INFO - temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo)); - if (temp2 == NULL) - return XML_ERROR_NO_MEMORY; - attInfo = temp2; -#endif - if (n > oldAttsSize) - XmlGetAttributes(enc, attStr, n, atts); - } - - appAtts = (const XML_Char **)atts; - for (i = 0; i < n; i++) { - ATTRIBUTE *currAtt = &atts[i]; -#ifdef XML_ATTR_INFO - XML_AttrInfo *currAttInfo = &attInfo[i]; -#endif - /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, - currAtt->name - + XmlNameLength(enc, currAtt->name)); - if (!attId) - return XML_ERROR_NO_MEMORY; -#ifdef XML_ATTR_INFO - currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); - currAttInfo->nameEnd = currAttInfo->nameStart + - XmlNameLength(enc, currAtt->name); - currAttInfo->valueStart = parseEndByteIndex - - (parseEndPtr - currAtt->valuePtr); - currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd); -#endif - /* Detect duplicate attributes by their QNames. This does not work when - namespace processing is turned on and different prefixes for the same - namespace are used. For this case we have a check further down. - */ - if ((attId->name)[-1]) { - if (enc == encoding) - eventPtr = atts[i].name; - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - (attId->name)[-1] = 1; - appAtts[attIndex++] = attId->name; - if (!atts[i].normalized) { - enum XML_Error result; - XML_Bool isCdata = XML_TRUE; - - /* figure out whether declared as other than CDATA */ - if (attId->maybeTokenized) { - int j; - for (j = 0; j < nDefaultAtts; j++) { - if (attId == elementType->defaultAtts[j].id) { - isCdata = elementType->defaultAtts[j].isCdata; - break; - } - } - } - - /* normalize the attribute value */ - result = storeAttributeValue(parser, enc, isCdata, - atts[i].valuePtr, atts[i].valueEnd, - &tempPool); - if (result) - return result; - appAtts[attIndex] = poolStart(&tempPool); - poolFinish(&tempPool); - } - else { - /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, - atts[i].valueEnd); - if (appAtts[attIndex] == 0) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - } - /* handle prefixed attribute names */ - if (attId->prefix) { - if (attId->xmlns) { - /* deal with namespace declarations here */ - enum XML_Error result = addBinding(parser, attId->prefix, attId, - appAtts[attIndex], bindingsPtr); - if (result) - return result; - --attIndex; - } - else { - /* deal with other prefixed names later */ - attIndex++; - nPrefixes++; - (attId->name)[-1] = 2; - } - } - else - attIndex++; - } - - /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ - nSpecifiedAtts = attIndex; - if (elementType->idAtt && (elementType->idAtt->name)[-1]) { - for (i = 0; i < attIndex; i += 2) - if (appAtts[i] == elementType->idAtt->name) { - idAttIndex = i; - break; - } - } - else - idAttIndex = -1; - - /* do attribute defaulting */ - for (i = 0; i < nDefaultAtts; i++) { - const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (!(da->id->name)[-1] && da->value) { - if (da->id->prefix) { - if (da->id->xmlns) { - enum XML_Error result = addBinding(parser, da->id->prefix, da->id, - da->value, bindingsPtr); - if (result) - return result; - } - else { - (da->id->name)[-1] = 2; - nPrefixes++; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - else { - (da->id->name)[-1] = 1; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - } - appAtts[attIndex] = 0; - - /* expand prefixed attribute names, check for duplicates, - and clear flags that say whether attributes were specified */ - i = 0; - if (nPrefixes) { - int j; /* hash table index */ - unsigned long version = nsAttsVersion; - int nsAttsSize = (int)1 << nsAttsPower; - /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ - NS_ATT *temp; - /* hash table size must also be a power of 2 and >= 8 */ - while (nPrefixes >> nsAttsPower++); - if (nsAttsPower < 3) - nsAttsPower = 3; - nsAttsSize = (int)1 << nsAttsPower; - temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (!temp) - return XML_ERROR_NO_MEMORY; - nsAtts = temp; - version = 0; /* force re-initialization of nsAtts hash table */ - } - /* using a version flag saves us from initializing nsAtts every time */ - if (!version) { /* initialize version flags when version wraps around */ - version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0; ) - nsAtts[--j].version = version; - } - nsAttsVersion = --version; - - /* expand prefixed names and check for duplicates */ - for (; i < attIndex; i += 2) { - const XML_Char *s = appAtts[i]; - if (s[-1] == 2) { /* prefixed */ - ATTRIBUTE_ID *id; - const BINDING *b; - unsigned long uriHash = hash_secret_salt; - ((XML_Char *)s)[-1] = 0; /* clear flag */ - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); - b = id->prefix->binding; - if (!b) - return XML_ERROR_UNBOUND_PREFIX; - - /* as we expand the name we also calculate its hash value */ - for (j = 0; j < b->uriLen; j++) { - const XML_Char c = b->uri[j]; - if (!poolAppendChar(&tempPool, c)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } - while (*s++ != XML_T(ASCII_COLON)) - ; - do { /* copies null terminator */ - const XML_Char c = *s; - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } while (*s++); - - { /* Check hash table for duplicate of expanded name (uriName). - Derived from code in lookup(parser, HASH_TABLE *table, ...). - */ - unsigned char step = 0; - unsigned long mask = nsAttsSize - 1; - j = uriHash & mask; /* index into hash table */ - while (nsAtts[j].version == version) { - /* for speed we compare stored hash values first */ - if (uriHash == nsAtts[j].hash) { - const XML_Char *s1 = poolStart(&tempPool); - const XML_Char *s2 = nsAtts[j].uriName; - /* s1 is null terminated, but not s2 */ - for (; *s1 == *s2 && *s1 != 0; s1++, s2++); - if (*s1 == 0) - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - if (!step) - step = PROBE_STEP(uriHash, mask, nsAttsPower); - j < step ? (j += nsAttsSize - step) : (j -= step); - } - } - - if (ns_triplets) { /* append namespace separator and prefix */ - tempPool.ptr[-1] = namespaceSeparator; - s = b->prefix->name; - do { - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - } while (*s++); - } - - /* store expanded name in attribute list */ - s = poolStart(&tempPool); - poolFinish(&tempPool); - appAtts[i] = s; - - /* fill empty slot with new version, uriName and hash value */ - nsAtts[j].version = version; - nsAtts[j].hash = uriHash; - nsAtts[j].uriName = s; - - if (!--nPrefixes) { - i += 2; - break; - } - } - else /* not prefixed */ - ((XML_Char *)s)[-1] = 0; /* clear flag */ - } - } - /* clear flags for the remaining attributes */ - for (; i < attIndex; i += 2) - ((XML_Char *)(appAtts[i]))[-1] = 0; - for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) - binding->attId->name[-1] = 0; - - if (!ns) - return XML_ERROR_NONE; - - /* expand the element type name */ - if (elementType->prefix) { - binding = elementType->prefix->binding; - if (!binding) - return XML_ERROR_UNBOUND_PREFIX; - localPart = tagNamePtr->str; - while (*localPart++ != XML_T(ASCII_COLON)) - ; - } - else if (dtd->defaultPrefix.binding) { - binding = dtd->defaultPrefix.binding; - localPart = tagNamePtr->str; - } - else - return XML_ERROR_NONE; - prefixLen = 0; - if (ns_triplets && binding->prefix->name) { - for (; binding->prefix->name[prefixLen++];) - ; /* prefixLen includes null terminator */ - } - tagNamePtr->localPart = localPart; - tagNamePtr->uriLen = binding->uriLen; - tagNamePtr->prefix = binding->prefix->name; - tagNamePtr->prefixLen = prefixLen; - for (i = 0; localPart[i++];) - ; /* i includes null terminator */ - n = i + binding->uriLen + prefixLen; - if (n > binding->uriAlloc) { - TAG *p; - uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); - if (!uri) - return XML_ERROR_NO_MEMORY; - binding->uriAlloc = n + EXPAND_SPARE; - memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); - for (p = tagStack; p; p = p->parent) - if (p->name.str == binding->uri) - p->name.str = uri; - FREE(binding->uri); - binding->uri = uri; - } - /* if namespaceSeparator != '\0' then uri includes it already */ - uri = binding->uri + binding->uriLen; - memcpy(uri, localPart, i * sizeof(XML_Char)); - /* we always have a namespace separator between localPart and prefix */ - if (prefixLen) { - uri += i - 1; - *uri = namespaceSeparator; /* replace null terminator */ - memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); - } - tagNamePtr->str = binding->uri; - return XML_ERROR_NONE; -} - -/* addBinding() overwrites the value of prefix->binding without checking. - Therefore one must keep track of the old value outside of addBinding(). -*/ -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) -{ - static const XML_Char xmlNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, - ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0' - }; - static const int xmlLen = - (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, - ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, - ASCII_SLASH, '\0' - }; - static const int xmlnsLen = - (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; - - XML_Bool mustBeXML = XML_FALSE; - XML_Bool isXML = XML_TRUE; - XML_Bool isXMLNS = XML_TRUE; - - BINDING *b; - int len; - - /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ - if (*uri == XML_T('\0') && prefix->name) - return XML_ERROR_UNDECLARING_PREFIX; - - if (prefix->name - && prefix->name[0] == XML_T(ASCII_x) - && prefix->name[1] == XML_T(ASCII_m) - && prefix->name[2] == XML_T(ASCII_l)) { - - /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) - && prefix->name[4] == XML_T(ASCII_s) - && prefix->name[5] == XML_T('\0')) - return XML_ERROR_RESERVED_PREFIX_XMLNS; - - if (prefix->name[3] == XML_T('\0')) - mustBeXML = XML_TRUE; - } - - for (len = 0; uri[len]; len++) { - if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) - isXML = XML_FALSE; - - if (!mustBeXML && isXMLNS - && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) - isXMLNS = XML_FALSE; - } - isXML = isXML && len == xmlLen; - isXMLNS = isXMLNS && len == xmlnsLen; - - if (mustBeXML != isXML) - return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML - : XML_ERROR_RESERVED_NAMESPACE_URI; - - if (isXMLNS) - return XML_ERROR_RESERVED_NAMESPACE_URI; - - if (namespaceSeparator) - len++; - if (freeBindingList) { - b = freeBindingList; - if (len > b->uriAlloc) { - XML_Char *temp = (XML_Char *)REALLOC(b->uri, - sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - b->uri = temp; - b->uriAlloc = len + EXPAND_SPARE; - } - freeBindingList = b->nextTagBinding; - } - else { - b = (BINDING *)MALLOC(sizeof(BINDING)); - if (!b) - return XML_ERROR_NO_MEMORY; - b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (!b->uri) { - FREE(b); - return XML_ERROR_NO_MEMORY; - } - b->uriAlloc = len + EXPAND_SPARE; - } - b->uriLen = len; - memcpy(b->uri, uri, len * sizeof(XML_Char)); - if (namespaceSeparator) - b->uri[len - 1] = namespaceSeparator; - b->prefix = prefix; - b->attId = attId; - b->prevPrefixBinding = prefix->binding; - /* NULL binding when default namespace undeclared */ - if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) - prefix->binding = NULL; - else - prefix->binding = b; - b->nextTagBinding = *bindingsPtr; - *bindingsPtr = b; - /* if attId == NULL then we are not starting a namespace scope */ - if (attId && startNamespaceDeclHandler) - startNamespaceDeclHandler(handlerArg, prefix->name, - prefix->binding ? uri : 0); - return XML_ERROR_NONE; -} - -/* The idea here is to avoid using stack for each CDATA section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doCdataSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - if (parentParser) { /* we are parsing an external entity */ - processor = externalEntityContentProcessor; - return externalEntityContentProcessor(parser, start, end, endPtr); - } - else { - processor = contentProcessor; - return contentProcessor(parser, start, end, endPtr); - } - } - return result; -} - -/* startPtr gets set to non-null if the section is closed, and to null if - the section is not yet closed. -*/ -static enum XML_Error -doCdataSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - - for (;;) { - const char *next; - int tok = XmlCdataSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_CDATA_SECT_CLOSE: - if (endCdataSectionHandler) - endCdataSectionHandler(handlerArg); -#if 0 - /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = next; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_CDATA_SECTION; - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -#ifdef XML_DTD - -/* The idea here is to avoid using stack for each IGNORE section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - processor = prologProcessor; - return prologProcessor(parser, start, end, endPtr); - } - return result; -} - -/* startPtr gets set to non-null is the section is closed, and to null - if the section is not yet closed. -*/ -static enum XML_Error -doIgnoreSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *next; - int tok; - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - tok = XmlIgnoreSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_IGNORE_SECT: - if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - /* not reached */ -} - -#endif /* XML_DTD */ - -static enum XML_Error -initializeEncoding(XML_Parser parser) -{ - const char *s; -#ifdef XML_UNICODE - char encodingBuf[128]; - if (!protocolEncodingName) - s = NULL; - else { - int i; - for (i = 0; protocolEncodingName[i]; i++) { - if (i == sizeof(encodingBuf) - 1 - || (protocolEncodingName[i] & ~0x7f) != 0) { - encodingBuf[0] = '\0'; - break; - } - encodingBuf[i] = (char)protocolEncodingName[i]; - } - encodingBuf[i] = '\0'; - s = encodingBuf; - } -#else - s = protocolEncodingName; -#endif - if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) - return XML_ERROR_NONE; - return handleUnknownEncoding(parser, protocolEncodingName); -} - -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next) -{ - const char *encodingName = NULL; - const XML_Char *storedEncName = NULL; - const ENCODING *newEncoding = NULL; - const char *version = NULL; - const char *versionend; - const XML_Char *storedversion = NULL; - int standalone = -1; - if (!(ns - ? XmlParseXmlDeclNS - : XmlParseXmlDecl)(isGeneralTextEntity, - encoding, - s, - next, - &eventPtr, - &version, - &versionend, - &encodingName, - &newEncoding, - &standalone)) { - if (isGeneralTextEntity) - return XML_ERROR_TEXT_DECL; - else - return XML_ERROR_XML_DECL; - } - if (!isGeneralTextEntity && standalone == 1) { - _dtd->standalone = XML_TRUE; -#ifdef XML_DTD - if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif /* XML_DTD */ - } - if (xmlDeclHandler) { - if (encodingName != NULL) { - storedEncName = poolStoreString(&temp2Pool, - encoding, - encodingName, - encodingName - + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - poolFinish(&temp2Pool); - } - if (version) { - storedversion = poolStoreString(&temp2Pool, - encoding, - version, - versionend - encoding->minBytesPerChar); - if (!storedversion) - return XML_ERROR_NO_MEMORY; - } - xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); - } - else if (defaultHandler) - reportDefault(parser, encoding, s, next); - if (protocolEncodingName == NULL) { - if (newEncoding) { - if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { - eventPtr = encodingName; - return XML_ERROR_INCORRECT_ENCODING; - } - encoding = newEncoding; - } - else if (encodingName) { - enum XML_Error result; - if (!storedEncName) { - storedEncName = poolStoreString( - &temp2Pool, encoding, encodingName, - encodingName + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - } - result = handleUnknownEncoding(parser, storedEncName); - poolClear(&temp2Pool); - if (result == XML_ERROR_UNKNOWN_ENCODING) - eventPtr = encodingName; - return result; - } - } - - if (storedEncName || storedversion) - poolClear(&temp2Pool); - - return XML_ERROR_NONE; -} - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - if (unknownEncodingHandler) { - XML_Encoding info; - int i; - for (i = 0; i < 256; i++) - info.map[i] = -1; - info.convert = NULL; - info.data = NULL; - info.release = NULL; - if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, - &info)) { - ENCODING *enc; - unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); - if (!unknownEncodingMem) { - if (info.release) - info.release(info.data); - return XML_ERROR_NO_MEMORY; - } - enc = (ns - ? XmlInitUnknownEncodingNS - : XmlInitUnknownEncoding)(unknownEncodingMem, - info.map, - info.convert, - info.data); - if (enc) { - unknownEncodingData = info.data; - unknownEncodingRelease = info.release; - encoding = enc; - return XML_ERROR_NONE; - } - } - if (info.release != NULL) - info.release(info.data); - } - return XML_ERROR_UNKNOWN_ENCODING; -} - -static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = prologProcessor; - return prologProcessor(parser, s, end, nextPtr); -} - -#ifdef XML_DTD - -static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - - /* we know now that XML_Parse(Buffer) has been called, - so we consider the external parameter entity read */ - _dtd->paramEntityRead = XML_TRUE; - - if (prologState.inEntityValue) { - processor = entityValueInitProcessor; - return entityValueInitProcessor(parser, s, end, nextPtr); - } - else { - processor = externalParEntProcessor; - return externalParEntProcessor(parser, s, end, nextPtr); - } -} - -static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - int tok; - const char *start = s; - const char *next = start; - eventPtr = start; - - for (;;) { - tok = XmlPrologTok(encoding, start, end, &next); - eventEndPtr = next; - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, encoding, s, end); - } - else if (tok == XML_TOK_XML_DECL) { - enum XML_Error result; - result = processXmlDecl(parser, 0, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - *nextPtr = next; - } - /* stop scanning for text declaration - we found one */ - processor = entityValueProcessor; - return entityValueProcessor(parser, next, end, nextPtr); - } - /* If we are at the end of the buffer, this would cause XmlPrologTok to - return XML_TOK_NONE on the next call, which would then cause the - function to exit with *nextPtr set to s - that is what we want for other - tokens, but not for the BOM - we would rather like to skip it; - then, when this routine is entered the next time, XmlPrologTok will - return XML_TOK_INVALID, since the BOM is still in the buffer - */ - else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) { - *nextPtr = next; - return XML_ERROR_NONE; - } - start = next; - eventPtr = start; - } -} - -static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok; - - tok = XmlPrologTok(encoding, s, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - } - /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. - However, when parsing an external subset, doProlog will not accept a BOM - as valid, and report a syntax error, so we have to skip the BOM - */ - else if (tok == XML_TOK_BOM) { - s = next; - tok = XmlPrologTok(encoding, s, end, &next); - } - - processor = prologProcessor; - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *start = s; - const char *next = s; - const ENCODING *enc = encoding; - int tok; - - for (;;) { - tok = XmlPrologTok(enc, start, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, enc, s, end); - } - start = next; - } -} - -#endif /* XML_DTD */ - -static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error -doProlog(XML_Parser parser, - const ENCODING *enc, - const char *s, - const char *end, - int tok, - const char *next, - const char **nextPtr, - XML_Bool haveMore) -{ -#ifdef XML_DTD - static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; -#endif /* XML_DTD */ - static const XML_Char atypeCDATA[] = - { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; - static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; - static const XML_Char atypeIDREF[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; - static const XML_Char atypeIDREFS[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; - static const XML_Char atypeENTITY[] = - { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; - static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, - ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; - static const XML_Char atypeNMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; - static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, - ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; - static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, - ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; - static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; - static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; - - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - enum XML_Content_Quant quant; - - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - - for (;;) { - int role; - XML_Bool handleDefault = XML_TRUE; - *eventPP = s; - *eventEndPP = next; - if (tok <= 0) { - if (haveMore && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case -XML_TOK_PROLOG_S: - tok = -tok; - break; - case XML_TOK_NONE: -#ifdef XML_DTD - /* for internal PE NOT referenced between declarations */ - if (enc != encoding && !openInternalEntities->betweenDecl) { - *nextPtr = s; - return XML_ERROR_NONE; - } - /* WFC: PE Between Declarations - must check that PE contains - complete markup, not only for external PEs, but also for - internal PEs if the reference occurs between declarations. - */ - if (isParamEntity || enc != encoding) { - if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) - == XML_ROLE_ERROR) - return XML_ERROR_INCOMPLETE_PE; - *nextPtr = s; - return XML_ERROR_NONE; - } -#endif /* XML_DTD */ - return XML_ERROR_NO_ELEMENTS; - default: - tok = -tok; - next = end; - break; - } - } - role = XmlTokenRole(&prologState, tok, s, next, enc); - switch (role) { - case XML_ROLE_XML_DECL: - { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_NAME: - if (startDoctypeDeclHandler) { - doctypeName = poolStoreString(&tempPool, enc, s, next); - if (!doctypeName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - doctypePubid = NULL; - handleDefault = XML_FALSE; - } - doctypeSysid = NULL; /* always initialize to NULL */ - break; - case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: - if (startDoctypeDeclHandler) { - startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, - doctypePubid, 1); - doctypeName = NULL; - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - break; -#ifdef XML_DTD - case XML_ROLE_TEXT_DECL: - { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; -#endif /* XML_DTD */ - case XML_ROLE_DOCTYPE_PUBLIC_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - XML_Char *pubId; - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - pubId = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!pubId) - return XML_ERROR_NO_MEMORY; - normalizePublicId(pubId); - poolFinish(&tempPool); - doctypePubid = pubId; - handleDefault = XML_FALSE; - goto alreadyChecked; - } - /* fall through */ - case XML_ROLE_ENTITY_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - alreadyChecked: - if (dtd->keepProcessing && declEntity) { - XML_Char *tem = poolStoreString(&dtd->pool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declEntity->publicId = tem; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_CLOSE: - if (doctypeName) { - startDoctypeDeclHandler(handlerArg, doctypeName, - doctypeSysid, doctypePubid, 0); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - /* doctypeSysid will be non-NULL in the case of a previous - XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler - was not set, indicating an external subset - */ -#ifdef XML_DTD - if (doctypeSysid || useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - if (useForeignDTD) - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else if (!doctypeSysid) - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - useForeignDTD = XML_FALSE; - } -#endif /* XML_DTD */ - if (endDoctypeDeclHandler) { - endDoctypeDeclHandler(handlerArg); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_INSTANCE_START: -#ifdef XML_DTD - /* if there is no DOCTYPE declaration then now is the - last chance to read the foreign DTD - */ - if (useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - } -#endif /* XML_DTD */ - processor = contentProcessor; - return contentProcessor(parser, s, end, nextPtr); - case XML_ROLE_ATTLIST_ELEMENT_NAME: - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_NAME: - declAttributeId = getAttributeId(parser, enc, s, next); - if (!declAttributeId) - return XML_ERROR_NO_MEMORY; - declAttributeIsCdata = XML_FALSE; - declAttributeType = NULL; - declAttributeIsId = XML_FALSE; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_CDATA: - declAttributeIsCdata = XML_TRUE; - declAttributeType = atypeCDATA; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ID: - declAttributeIsId = XML_TRUE; - declAttributeType = atypeID; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREF: - declAttributeType = atypeIDREF; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: - declAttributeType = atypeIDREFS; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: - declAttributeType = atypeENTITY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: - declAttributeType = atypeENTITIES; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: - declAttributeType = atypeNMTOKEN; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: - declAttributeType = atypeNMTOKENS; - checkAttListDeclHandler: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTRIBUTE_ENUM_VALUE: - case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: - if (dtd->keepProcessing && attlistDeclHandler) { - const XML_Char *prefix; - if (declAttributeType) { - prefix = enumValueSep; - } - else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE - ? notationPrefix - : enumValueStart); - } - if (!poolAppendString(&tempPool, prefix)) - return XML_ERROR_NO_MEMORY; - if (!poolAppend(&tempPool, enc, s, next)) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: - case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, declAttributeIsId, - 0, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: - case XML_ROLE_FIXED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - const XML_Char *attVal; - enum XML_Error result = - storeAttributeValue(parser, enc, declAttributeIsCdata, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar, - &dtd->pool); - if (result) - return result; - attVal = poolStart(&dtd->pool); - poolFinish(&dtd->pool); - /* ID attributes aren't allowed to have a default */ - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, XML_FALSE, attVal, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - attVal, - role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_ENTITY_VALUE: - if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue(parser, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (declEntity) { - declEntity->textPtr = poolStart(&dtd->entityValuePool); - declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); - poolFinish(&dtd->entityValuePool); - if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - declEntity->textPtr, - declEntity->textLen, - curBase, 0, 0, 0); - handleDefault = XML_FALSE; - } - } - else - poolDiscard(&dtd->entityValuePool); - if (result != XML_ERROR_NONE) - return result; - } - break; - case XML_ROLE_DOCTYPE_SYSTEM_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - doctypeSysid = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (doctypeSysid == NULL) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } -#ifdef XML_DTD - else - /* use externalSubsetName to make doctypeSysid non-NULL - for the case where no startDoctypeDeclHandler is set */ - doctypeSysid = externalSubsetName; -#endif /* XML_DTD */ - if (!dtd->standalone -#ifdef XML_DTD - && !paramEntityParsing -#endif /* XML_DTD */ - && notStandaloneHandler - && !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; -#ifndef XML_DTD - break; -#else /* XML_DTD */ - if (!declEntity) { - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - declEntity->publicId = NULL; - } - /* fall through */ -#endif /* XML_DTD */ - case XML_ROLE_ENTITY_SYSTEM_ID: - if (dtd->keepProcessing && declEntity) { - declEntity->systemId = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!declEntity->systemId) - return XML_ERROR_NO_MEMORY; - declEntity->base = curBase; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && declEntity && entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - 0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - 0); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_NOTATION_NAME: - if (dtd->keepProcessing && declEntity) { - declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); - if (!declEntity->notation) - return XML_ERROR_NO_MEMORY; - poolFinish(&dtd->pool); - if (unparsedEntityDeclHandler) { - *eventEndPP = s; - unparsedEntityDeclHandler(handlerArg, - declEntity->name, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - else if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - 0,0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_GENERAL_ENTITY_NAME: - { - if (XmlPredefinedEntityName(enc, s, next)) { - declEntity = NULL; - break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - } - break; - case XML_ROLE_PARAM_ENTITY_NAME: -#ifdef XML_DTD - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, - name, sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_TRUE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } -#else /* not XML_DTD */ - declEntity = NULL; -#endif /* XML_DTD */ - break; - case XML_ROLE_NOTATION_NAME: - declNotationPublicId = NULL; - declNotationName = NULL; - if (notationDeclHandler) { - declNotationName = poolStoreString(&tempPool, enc, s, next); - if (!declNotationName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - if (declNotationName) { /* means notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&tempPool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declNotationPublicId = tem; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_SYSTEM_ID: - if (declNotationName && notationDeclHandler) { - const XML_Char *systemId - = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!systemId) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - systemId, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_NOTATION_NO_SYSTEM_ID: - if (declNotationPublicId && notationDeclHandler) { - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - 0, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_ERROR: - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: - /* PE references in internal subset are - not allowed within declarations. */ - return XML_ERROR_PARAM_ENTITY_REF; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - default: - return XML_ERROR_SYNTAX; - } -#ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: - { - enum XML_Error result; - if (defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = ignoreSectionProcessor; - return result; - } - } - break; -#endif /* XML_DTD */ - case XML_ROLE_GROUP_OPEN: - if (prologState.level >= groupSize) { - if (groupSize) { - char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - groupConnector = temp; - if (dtd->scaffIndex) { - int *temp = (int *)REALLOC(dtd->scaffIndex, - groupSize * sizeof(int)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = temp; - } - } - else { - groupConnector = (char *)MALLOC(groupSize = 32); - if (!groupConnector) - return XML_ERROR_NO_MEMORY; - } - } - groupConnector[prologState.level] = 0; - if (dtd->in_eldecl) { - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex[dtd->scaffLevel] = myindex; - dtd->scaffLevel++; - dtd->scaffold[myindex].type = XML_CTYPE_SEQ; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_GROUP_SEQUENCE: - if (groupConnector[prologState.level] == ASCII_PIPE) - return XML_ERROR_SYNTAX; - groupConnector[prologState.level] = ASCII_COMMA; - if (dtd->in_eldecl && elementDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_GROUP_CHOICE: - if (groupConnector[prologState.level] == ASCII_COMMA) - return XML_ERROR_SYNTAX; - if (dtd->in_eldecl - && !groupConnector[prologState.level] - && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED) - ) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_CHOICE; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - groupConnector[prologState.level] = ASCII_PIPE; - break; - case XML_ROLE_PARAM_ENTITY_REF: -#ifdef XML_DTD - case XML_ROLE_INNER_PARAM_ENTITY_REF: - dtd->hasParamEntityRefs = XML_TRUE; - if (!paramEntityParsing) - dtd->keepProcessing = dtd->standalone; - else { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&dtd->pool); - /* first, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity handler - */ - if (prologState.documentEntity && - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs)) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - dtd->keepProcessing = dtd->standalone; - /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { - skippedEntityHandler(handlerArg, name, 1); - handleDefault = XML_FALSE; - } - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - XML_Bool betweenDecl = - (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); - result = processInternalEntity(parser, entity, betweenDecl); - if (result != XML_ERROR_NONE) - return result; - handleDefault = XML_FALSE; - break; - } - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - } - entity->open = XML_FALSE; - handleDefault = XML_FALSE; - if (!dtd->paramEntityRead) { - dtd->keepProcessing = dtd->standalone; - break; - } - } - else { - dtd->keepProcessing = dtd->standalone; - break; - } - } -#endif /* XML_DTD */ - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - break; - - /* Element declaration stuff */ - - case XML_ROLE_ELEMENT_NAME: - if (elementDeclHandler) { - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - dtd->scaffLevel = 0; - dtd->scaffCount = 0; - dtd->in_eldecl = XML_TRUE; - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ANY: - case XML_ROLE_CONTENT_EMPTY: - if (dtd->in_eldecl) { - if (elementDeclHandler) { - XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); - if (!content) - return XML_ERROR_NO_MEMORY; - content->quant = XML_CQUANT_NONE; - content->name = NULL; - content->numchildren = 0; - content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? - XML_CTYPE_ANY : - XML_CTYPE_EMPTY); - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, content); - handleDefault = XML_FALSE; - } - dtd->in_eldecl = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_PCDATA: - if (dtd->in_eldecl) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_MIXED; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ELEMENT: - quant = XML_CQUANT_NONE; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_OPT: - quant = XML_CQUANT_OPT; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_REP: - quant = XML_CQUANT_REP; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_PLUS: - quant = XML_CQUANT_PLUS; - elementContent: - if (dtd->in_eldecl) { - ELEMENT_TYPE *el; - const XML_Char *name; - int nameLen; - const char *nxt = (quant == XML_CQUANT_NONE - ? next - : next - enc->minBytesPerChar); - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffold[myindex].type = XML_CTYPE_NAME; - dtd->scaffold[myindex].quant = quant; - el = getElementType(parser, enc, s, nxt); - if (!el) - return XML_ERROR_NO_MEMORY; - name = el->name; - dtd->scaffold[myindex].name = name; - nameLen = 0; - for (; name[nameLen++]; ); - dtd->contentStringLen += nameLen; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_GROUP_CLOSE: - quant = XML_CQUANT_NONE; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_OPT: - quant = XML_CQUANT_OPT; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_REP: - quant = XML_CQUANT_REP; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_PLUS: - quant = XML_CQUANT_PLUS; - closeGroup: - if (dtd->in_eldecl) { - if (elementDeclHandler) - handleDefault = XML_FALSE; - dtd->scaffLevel--; - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; - if (dtd->scaffLevel == 0) { - if (!handleDefault) { - XML_Content *model = build_model(parser); - if (!model) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, model); - } - dtd->in_eldecl = XML_FALSE; - dtd->contentStringLen = 0; - } - } - break; - /* End element declaration stuff */ - - case XML_ROLE_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_NONE: - switch (tok) { - case XML_TOK_BOM: - handleDefault = XML_FALSE; - break; - } - break; - case XML_ROLE_DOCTYPE_NONE: - if (startDoctypeDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ENTITY_NONE: - if (dtd->keepProcessing && entityDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_NOTATION_NONE: - if (notationDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTLIST_NONE: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ELEMENT_NONE: - if (elementDeclHandler) - handleDefault = XML_FALSE; - break; - } /* end of big switch */ - - if (handleDefault && defaultHandler) - reportDefault(parser, enc, s, next); - - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - s = next; - tok = XmlPrologTok(enc, s, end, &next); - } - } - /* not reached */ -} - -static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - processor = epilogProcessor; - eventPtr = s; - for (;;) { - const char *next = NULL; - int tok = XmlPrologTok(encoding, s, end, &next); - eventEndPtr = next; - switch (tok) { - /* report partial linebreak - it might be the last token */ - case -XML_TOK_PROLOG_S: - if (defaultHandler) { - reportDefault(parser, encoding, s, next); - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - } - *nextPtr = next; - return XML_ERROR_NONE; - case XML_TOK_NONE: - *nextPtr = s; - return XML_ERROR_NONE; - case XML_TOK_PROLOG_S: - if (defaultHandler) - reportDefault(parser, encoding, s, next); - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_INVALID: - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - default: - return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; - } - eventPtr = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } -} - -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl) -{ - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity; - - if (freeInternalEntities) { - openEntity = freeInternalEntities; - freeInternalEntities = openEntity->next; - } - else { - openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); - if (!openEntity) - return XML_ERROR_NO_MEMORY; - } - entity->open = XML_TRUE; - entity->processed = 0; - openEntity->next = openInternalEntities; - openInternalEntities = openEntity; - openEntity->entity = entity; - openEntity->startTagLevel = tagLevel; - openEntity->betweenDecl = betweenDecl; - openEntity->internalEventPtr = NULL; - openEntity->internalEventEndPtr = NULL; - textStart = (char *)entity->textPtr; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, tagLevel, internalEncoding, textStart, - textEnd, &next, XML_FALSE); - - if (result == XML_ERROR_NONE) { - if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - textStart); - processor = internalEntityProcessor; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - } - return result; -} - -static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - ENTITY *entity; - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; - if (!openEntity) - return XML_ERROR_UNEXPECTED_STATE; - - entity = openEntity->entity; - textStart = ((char *)entity->textPtr) + entity->processed; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, internalEncoding, - textStart, textEnd, &next, XML_FALSE); - - if (result != XML_ERROR_NONE) - return result; - else if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - (char *)entity->textPtr); - return result; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - -#ifdef XML_DTD - if (entity->is_param) { - int tok; - processor = prologProcessor; - tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, nextPtr, - (XML_Bool)!ps_finalBuffer); - } - else -#endif /* XML_DTD */ - { - processor = contentProcessor; - /* see externalEntityContentProcessor vs contentProcessor */ - return doContent(parser, parentParser ? 1 : 0, encoding, s, end, - nextPtr, (XML_Bool)!ps_finalBuffer); - } -} - -static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - return errorCode; -} - -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, - end, pool); - if (result) - return result; - if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) - poolChop(pool); - if (!poolAppendChar(pool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - return XML_ERROR_NONE; -} - -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - for (;;) { - const char *next; - int tok = XmlAttributeValueTok(enc, ptr, end, &next); - switch (tok) { - case XML_TOK_NONE: - return XML_ERROR_NONE; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (!isCdata - && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - for (i = 0; i < n; i++) { - if (!poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } - } - break; - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, ptr, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_TRAILING_CR: - next = ptr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_ATTRIBUTE_VALUE_S: - case XML_TOK_DATA_NEWLINE: - if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - if (!poolAppendChar(pool, 0x20)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (!poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = -#ifdef XML_DTD - prologState.documentEntity && -#endif /* XML_DTD */ - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs); - else /* if (pool == &tempPool): we are called from content */ - checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - /* Cannot report skipped entity here - see comments on - skippedEntityHandler. - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &tempPool) && defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (!entity->textPtr) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } - else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, internalEncoding, isCdata, - (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; - } - } - break; - default: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_UNEXPECTED_STATE; - } - ptr = next; - } - /* not reached */ -} - -static enum XML_Error -storeEntityValue(XML_Parser parser, - const ENCODING *enc, - const char *entityTextPtr, - const char *entityTextEnd) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - STRING_POOL *pool = &(dtd->entityValuePool); - enum XML_Error result = XML_ERROR_NONE; -#ifdef XML_DTD - int oldInEntityValue = prologState.inEntityValue; - prologState.inEntityValue = 1; -#endif /* XML_DTD */ - /* never return Null for the value argument in EntityDeclHandler, - since this would indicate an external entity; therefore we - have to make sure that entityValuePool.start is not null */ - if (!pool->blocks) { - if (!poolGrow(pool)) - return XML_ERROR_NO_MEMORY; - } - - for (;;) { - const char *next; - int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: -#ifdef XML_DTD - if (isParamEntity || enc != encoding) { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&tempPool, enc, - entityTextPtr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&tempPool); - if (!entity) { - /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ - /* cannot report skipped entity here - see comments on - skippedEntityHandler - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - dtd->keepProcessing = dtd->standalone; - goto endEntityValue; - } - if (entity->open) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_RECURSIVE_ENTITY_REF; - goto endEntityValue; - } - if (entity->systemId) { - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; - goto endEntityValue; - } - entity->open = XML_FALSE; - if (!dtd->paramEntityRead) - dtd->keepProcessing = dtd->standalone; - } - else - dtd->keepProcessing = dtd->standalone; - } - else { - entity->open = XML_TRUE; - result = storeEntityValue(parser, - internalEncoding, - (char *)entity->textPtr, - (char *)(entity->textPtr - + entity->textLen)); - entity->open = XML_FALSE; - if (result) - goto endEntityValue; - } - break; - } -#endif /* XML_DTD */ - /* In the internal subset, PE references are not legal - within markup declarations, e.g entity values in this case. */ - eventPtr = entityTextPtr; - result = XML_ERROR_PARAM_ENTITY_REF; - goto endEntityValue; - case XML_TOK_NONE: - result = XML_ERROR_NONE; - goto endEntityValue; - case XML_TOK_ENTITY_REF: - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, entityTextPtr, next)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - break; - case XML_TOK_TRAILING_CR: - next = entityTextPtr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = 0xA; - break; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = buf[i]; - } - } - break; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - default: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_UNEXPECTED_STATE; - goto endEntityValue; - } - entityTextPtr = next; - } -endEntityValue: -#ifdef XML_DTD - prologState.inEntityValue = oldInEntityValue; -#endif /* XML_DTD */ - return result; -} - -static void FASTCALL -normalizeLines(XML_Char *s) -{ - XML_Char *p; - for (;; s++) { - if (*s == XML_T('\0')) - return; - if (*s == 0xD) - break; - } - p = s; - do { - if (*s == 0xD) { - *p++ = 0xA; - if (*++s == 0xA) - s++; - } - else - *p++ = *s++; - } while (*s); - *p = XML_T('\0'); -} - -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - const XML_Char *target; - XML_Char *data; - const char *tem; - if (!processingInstructionHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - start += enc->minBytesPerChar * 2; - tem = start + XmlNameLength(enc, start); - target = poolStoreString(&tempPool, enc, start, tem); - if (!target) - return 0; - poolFinish(&tempPool); - data = poolStoreString(&tempPool, enc, - XmlSkipS(enc, tem), - end - enc->minBytesPerChar*2); - if (!data) - return 0; - normalizeLines(data); - processingInstructionHandler(handlerArg, target, data); - poolClear(&tempPool); - return 1; -} - -static int -reportComment(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - XML_Char *data; - if (!commentHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - data = poolStoreString(&tempPool, - enc, - start + enc->minBytesPerChar * 4, - end - enc->minBytesPerChar * 3); - if (!data) - return 0; - normalizeLines(data); - commentHandler(handlerArg, data); - poolClear(&tempPool); - return 1; -} - -static void -reportDefault(XML_Parser parser, const ENCODING *enc, - const char *s, const char *end) -{ - if (MUST_CONVERT(enc, s)) { - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - do { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); - *eventPP = s; - } while (s != end); - } - else - defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); -} - - -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) -{ - DEFAULT_ATTRIBUTE *att; - if (value || isId) { - /* The handling of default attributes gets messed up if we have - a default which duplicates a non-default. */ - int i; - for (i = 0; i < type->nDefaultAtts; i++) - if (attId == type->defaultAtts[i].id) - return 1; - if (isId && !type->idAtt && !attId->xmlns) - type->idAtt = attId; - } - if (type->nDefaultAtts == type->allocDefaultAtts) { - if (type->allocDefaultAtts == 0) { - type->allocDefaultAtts = 8; - type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts - * sizeof(DEFAULT_ATTRIBUTE)); - if (!type->defaultAtts) - return 0; - } - else { - DEFAULT_ATTRIBUTE *temp; - int count = type->allocDefaultAtts * 2; - temp = (DEFAULT_ATTRIBUTE *) - REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); - if (temp == NULL) - return 0; - type->allocDefaultAtts = count; - type->defaultAtts = temp; - } - } - att = type->defaultAtts + type->nDefaultAtts; - att->id = attId; - att->value = value; - att->isCdata = isCdata; - if (!isCdata) - attId->maybeTokenized = XML_TRUE; - type->nDefaultAtts += 1; - return 1; -} - -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name; - for (name = elementType->name; *name; name++) { - if (*name == XML_T(ASCII_COLON)) { - PREFIX *prefix; - const XML_Char *s; - for (s = elementType->name; s != name; s++) { - if (!poolAppendChar(&dtd->pool, *s)) - return 0; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return 0; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (!prefix) - return 0; - if (prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - elementType->prefix = prefix; - - } - } - return 1; -} - -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ATTRIBUTE_ID *id; - const XML_Char *name; - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - name = poolStoreString(&dtd->pool, enc, start, end); - if (!name) - return NULL; - /* skip quotation mark - its storage will be re-used (like in name[-1]) */ - ++name; - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (!id) - return NULL; - if (id->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!ns) - ; - else if (name[0] == XML_T(ASCII_x) - && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) - && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { - if (name[5] == XML_T('\0')) - id->prefix = &dtd->defaultPrefix; - else - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); - id->xmlns = XML_TRUE; - } - else { - int i; - for (i = 0; name[i]; i++) { - /* attributes without prefix are *not* in the default namespace */ - if (name[i] == XML_T(ASCII_COLON)) { - int j; - for (j = 0; j < i; j++) { - if (!poolAppendChar(&dtd->pool, name[j])) - return NULL; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (id->prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - break; - } - } - } - } - return id; -} - -#define CONTEXT_SEP XML_T(ASCII_FF) - -static const XML_Char * -getContext(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - HASH_TABLE_ITER iter; - XML_Bool needSep = XML_FALSE; - - if (dtd->defaultPrefix.binding) { - int i; - int len; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = dtd->defaultPrefix.binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - hashTableIterInit(&iter, &(dtd->prefixes)); - for (;;) { - int i; - int len; - const XML_Char *s; - PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (!prefix) - break; - if (!prefix->binding) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = prefix->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return NULL; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = prefix->binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - - hashTableIterInit(&iter, &(dtd->generalEntities)); - for (;;) { - const XML_Char *s; - ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (!e) - break; - if (!e->open) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = e->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return 0; - needSep = XML_TRUE; - } - - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return NULL; - return tempPool.start; -} - -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *s = context; - - while (*context != XML_T('\0')) { - if (*s == CONTEXT_SEP || *s == XML_T('\0')) { - ENTITY *e; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0); - if (e) - e->open = XML_TRUE; - if (*s != XML_T('\0')) - s++; - context = s; - poolDiscard(&tempPool); - } - else if (*s == XML_T(ASCII_EQUALS)) { - PREFIX *prefix; - if (poolLength(&tempPool) == 0) - prefix = &dtd->defaultPrefix; - else { - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), - sizeof(PREFIX)); - if (!prefix) - return XML_FALSE; - if (prefix->name == poolStart(&tempPool)) { - prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (!prefix->name) - return XML_FALSE; - } - poolDiscard(&tempPool); - } - for (context = s + 1; - *context != CONTEXT_SEP && *context != XML_T('\0'); - context++) - if (!poolAppendChar(&tempPool, *context)) - return XML_FALSE; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - if (addBinding(parser, prefix, NULL, poolStart(&tempPool), - &inheritedBindings) != XML_ERROR_NONE) - return XML_FALSE; - poolDiscard(&tempPool); - if (*context != XML_T('\0')) - ++context; - s = context; - } - else { - if (!poolAppendChar(&tempPool, *s)) - return XML_FALSE; - s++; - } - } - return XML_TRUE; -} - -static void FASTCALL -normalizePublicId(XML_Char *publicId) -{ - XML_Char *p = publicId; - XML_Char *s; - for (s = publicId; *s; s++) { - switch (*s) { - case 0x20: - case 0xD: - case 0xA: - if (p != publicId && p[-1] != 0x20) - *p++ = 0x20; - break; - default: - *p++ = *s; - } - } - if (p != publicId && p[-1] == 0x20) - --p; - *p = XML_T('\0'); -} - -static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) -{ - DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); - if (p == NULL) - return p; - poolInit(&(p->pool), ms); - poolInit(&(p->entityValuePool), ms); - hashTableInit(&(p->generalEntities), ms); - hashTableInit(&(p->elementTypes), ms); - hashTableInit(&(p->attributeIds), ms); - hashTableInit(&(p->prefixes), ms); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableInit(&(p->paramEntities), ms); -#endif /* XML_DTD */ - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - p->scaffIndex = NULL; - p->scaffold = NULL; - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; - return p; -} - -static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableClear(&(p->generalEntities)); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableClear(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableClear(&(p->elementTypes)); - hashTableClear(&(p->attributeIds)); - hashTableClear(&(p->prefixes)); - poolClear(&(p->pool)); - poolClear(&(p->entityValuePool)); - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - - ms->free_fcn(p->scaffIndex); - p->scaffIndex = NULL; - ms->free_fcn(p->scaffold); - p->scaffold = NULL; - - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; -} - -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableDestroy(&(p->generalEntities)); -#ifdef XML_DTD - hashTableDestroy(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableDestroy(&(p->elementTypes)); - hashTableDestroy(&(p->attributeIds)); - hashTableDestroy(&(p->prefixes)); - poolDestroy(&(p->pool)); - poolDestroy(&(p->entityValuePool)); - if (isDocEntity) { - ms->free_fcn(p->scaffIndex); - ms->free_fcn(p->scaffold); - } - ms->free_fcn(p); -} - -/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. - The new DTD has already been initialized. -*/ -static int -dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - - /* Copy the prefix table. */ - - hashTableIterInit(&iter, &(oldDtd->prefixes)); - for (;;) { - const XML_Char *name; - const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (!oldP) - break; - name = poolCopyString(&(newDtd->pool), oldP->name); - if (!name) - return 0; - if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) - return 0; - } - - hashTableIterInit(&iter, &(oldDtd->attributeIds)); - - /* Copy the attribute id table. */ - - for (;;) { - ATTRIBUTE_ID *newA; - const XML_Char *name; - const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - - if (!oldA) - break; - /* Remember to allocate the scratch byte before the name. */ - if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) - return 0; - name = poolCopyString(&(newDtd->pool), oldA->name); - if (!name) - return 0; - ++name; - newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, - sizeof(ATTRIBUTE_ID)); - if (!newA) - return 0; - newA->maybeTokenized = oldA->maybeTokenized; - if (oldA->prefix) { - newA->xmlns = oldA->xmlns; - if (oldA->prefix == &oldDtd->defaultPrefix) - newA->prefix = &newDtd->defaultPrefix; - else - newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldA->prefix->name, 0); - } - } - - /* Copy the element type table. */ - - hashTableIterInit(&iter, &(oldDtd->elementTypes)); - - for (;;) { - int i; - ELEMENT_TYPE *newE; - const XML_Char *name; - const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(&(newDtd->pool), oldE->name); - if (!name) - return 0; - newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, - sizeof(ELEMENT_TYPE)); - if (!newE) - return 0; - if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *) - ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (!newE->defaultAtts) { - ms->free_fcn(newE); - return 0; - } - } - if (oldE->idAtt) - newE->idAtt = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); - newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; - if (oldE->prefix) - newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldE->prefix->name, 0); - for (i = 0; i < newE->nDefaultAtts; i++) { - newE->defaultAtts[i].id = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); - newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; - if (oldE->defaultAtts[i].value) { - newE->defaultAtts[i].value - = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (!newE->defaultAtts[i].value) - return 0; - } - else - newE->defaultAtts[i].value = NULL; - } - } - - /* Copy the entity tables. */ - if (!copyEntityTable(oldParser, - &(newDtd->generalEntities), - &(newDtd->pool), - &(oldDtd->generalEntities))) - return 0; - -#ifdef XML_DTD - if (!copyEntityTable(oldParser, - &(newDtd->paramEntities), - &(newDtd->pool), - &(oldDtd->paramEntities))) - return 0; - newDtd->paramEntityRead = oldDtd->paramEntityRead; -#endif /* XML_DTD */ - - newDtd->keepProcessing = oldDtd->keepProcessing; - newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; - newDtd->standalone = oldDtd->standalone; - - /* Don't want deep copying for scaffolding */ - newDtd->in_eldecl = oldDtd->in_eldecl; - newDtd->scaffold = oldDtd->scaffold; - newDtd->contentStringLen = oldDtd->contentStringLen; - newDtd->scaffSize = oldDtd->scaffSize; - newDtd->scaffLevel = oldDtd->scaffLevel; - newDtd->scaffIndex = oldDtd->scaffIndex; - - return 1; -} /* End dtdCopy */ - -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *newTable, - STRING_POOL *newPool, - const HASH_TABLE *oldTable) -{ - HASH_TABLE_ITER iter; - const XML_Char *cachedOldBase = NULL; - const XML_Char *cachedNewBase = NULL; - - hashTableIterInit(&iter, oldTable); - - for (;;) { - ENTITY *newE; - const XML_Char *name; - const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(newPool, oldE->name); - if (!name) - return 0; - newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); - if (!newE) - return 0; - if (oldE->systemId) { - const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (!tem) - return 0; - newE->systemId = tem; - if (oldE->base) { - if (oldE->base == cachedOldBase) - newE->base = cachedNewBase; - else { - cachedOldBase = oldE->base; - tem = poolCopyString(newPool, cachedOldBase); - if (!tem) - return 0; - cachedNewBase = newE->base = tem; - } - } - if (oldE->publicId) { - tem = poolCopyString(newPool, oldE->publicId); - if (!tem) - return 0; - newE->publicId = tem; - } - } - else { - const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, - oldE->textLen); - if (!tem) - return 0; - newE->textPtr = tem; - newE->textLen = oldE->textLen; - } - if (oldE->notation) { - const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (!tem) - return 0; - newE->notation = tem; - } - newE->is_param = oldE->is_param; - newE->is_internal = oldE->is_internal; - } - return 1; -} - -#define INIT_POWER 6 - -static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) -{ - for (; *s1 == *s2; s1++, s2++) - if (*s1 == 0) - return XML_TRUE; - return XML_FALSE; -} - -static unsigned long FASTCALL -hash(XML_Parser parser, KEY s) -{ - unsigned long h = hash_secret_salt; - while (*s) - h = CHAR_HASH(h, *s++); - return h; -} - -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) -{ - size_t i; - if (table->size == 0) { - size_t tsize; - if (!createSize) - return NULL; - table->power = INIT_POWER; - /* table->size is a power of 2 */ - table->size = (size_t)1 << INIT_POWER; - tsize = table->size * sizeof(NAMED *); - table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (!table->v) { - table->size = 0; - return NULL; - } - memset(table->v, 0, tsize); - i = hash(parser, name) & ((unsigned long)table->size - 1); - } - else { - unsigned long h = hash(parser, name); - unsigned long mask = (unsigned long)table->size - 1; - unsigned char step = 0; - i = h & mask; - while (table->v[i]) { - if (keyeq(name, table->v[i]->name)) - return table->v[i]; - if (!step) - step = PROBE_STEP(h, mask, table->power); - i < step ? (i += table->size - step) : (i -= step); - } - if (!createSize) - return NULL; - - /* check for overflow (table is half full) */ - if (table->used >> (table->power - 1)) { - unsigned char newPower = table->power + 1; - size_t newSize = (size_t)1 << newPower; - unsigned long newMask = (unsigned long)newSize - 1; - size_t tsize = newSize * sizeof(NAMED *); - NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (!newV) - return NULL; - memset(newV, 0, tsize); - for (i = 0; i < table->size; i++) - if (table->v[i]) { - unsigned long newHash = hash(parser, table->v[i]->name); - size_t j = newHash & newMask; - step = 0; - while (newV[j]) { - if (!step) - step = PROBE_STEP(newHash, newMask, newPower); - j < step ? (j += newSize - step) : (j -= step); - } - newV[j] = table->v[i]; - } - table->mem->free_fcn(table->v); - table->v = newV; - table->power = newPower; - table->size = newSize; - i = h & newMask; - step = 0; - while (table->v[i]) { - if (!step) - step = PROBE_STEP(h, newMask, newPower); - i < step ? (i += newSize - step) : (i -= step); - } - } - } - table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (!table->v[i]) - return NULL; - memset(table->v[i], 0, createSize); - table->v[i]->name = name; - (table->used)++; - return table->v[i]; -} - -static void FASTCALL -hashTableClear(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) { - table->mem->free_fcn(table->v[i]); - table->v[i] = NULL; - } - table->used = 0; -} - -static void FASTCALL -hashTableDestroy(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) - table->mem->free_fcn(table->v[i]); - table->mem->free_fcn(table->v); -} - -static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) -{ - p->power = 0; - p->size = 0; - p->used = 0; - p->v = NULL; - p->mem = ms; -} - -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) -{ - iter->p = table->v; - iter->end = iter->p + table->size; -} - -static NAMED * FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) -{ - while (iter->p != iter->end) { - NAMED *tem = *(iter->p)++; - if (tem) - return tem; - } - return NULL; -} - -static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) -{ - pool->blocks = NULL; - pool->freeBlocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; - pool->mem = ms; -} - -static void FASTCALL -poolClear(STRING_POOL *pool) -{ - if (!pool->freeBlocks) - pool->freeBlocks = pool->blocks; - else { - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - p->next = pool->freeBlocks; - pool->freeBlocks = p; - p = tem; - } - } - pool->blocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; -} - -static void FASTCALL -poolDestroy(STRING_POOL *pool) -{ - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } - p = pool->freeBlocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } -} - -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (;;) { - XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if (ptr == end) - break; - if (!poolGrow(pool)) - return NULL; - } - return pool->start; -} - -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) -{ - do { - if (!poolAppendChar(pool, *s)) - return NULL; - } while (*s++); - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (; n > 0; --n, s++) { - if (!poolAppendChar(pool, *s)) - return NULL; - } - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) -{ - while (*s) { - if (!poolAppendChar(pool, *s)) - return NULL; - s++; - } - return pool->start; -} - -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!poolAppend(pool, enc, ptr, end)) - return NULL; - if (pool->ptr == pool->end && !poolGrow(pool)) - return NULL; - *(pool->ptr)++ = 0; - return pool->start; -} - -static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) -{ - if (pool->freeBlocks) { - if (pool->start == 0) { - pool->blocks = pool->freeBlocks; - pool->freeBlocks = pool->freeBlocks->next; - pool->blocks->next = NULL; - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - pool->ptr = pool->start; - return XML_TRUE; - } - if (pool->end - pool->start < pool->freeBlocks->size) { - BLOCK *tem = pool->freeBlocks->next; - pool->freeBlocks->next = pool->blocks; - pool->blocks = pool->freeBlocks; - pool->freeBlocks = tem; - memcpy(pool->blocks->s, pool->start, - (pool->end - pool->start) * sizeof(XML_Char)); - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - return XML_TRUE; - } - } - if (pool->blocks && pool->start == pool->blocks->s) { - int blockSize = (int)(pool->end - pool->start)*2; - BLOCK *temp = (BLOCK *) - pool->mem->realloc_fcn(pool->blocks, - (offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char))); - if (temp == NULL) - return XML_FALSE; - pool->blocks = temp; - pool->blocks->size = blockSize; - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + blockSize; - } - else { - BLOCK *tem; - int blockSize = (int)(pool->end - pool->start); - if (blockSize < INIT_BLOCK_SIZE) - blockSize = INIT_BLOCK_SIZE; - else - blockSize *= 2; - tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char)); - if (!tem) - return XML_FALSE; - tem->size = blockSize; - tem->next = pool->blocks; - pool->blocks = tem; - if (pool->ptr != pool->start) - memcpy(tem->s, pool->start, - (pool->ptr - pool->start) * sizeof(XML_Char)); - pool->ptr = tem->s + (pool->ptr - pool->start); - pool->start = tem->s; - pool->end = tem->s + blockSize; - } - return XML_TRUE; -} - -static int FASTCALL -nextScaffoldPart(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - CONTENT_SCAFFOLD * me; - int next; - - if (!dtd->scaffIndex) { - dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); - if (!dtd->scaffIndex) - return -1; - dtd->scaffIndex[0] = 0; - } - - if (dtd->scaffCount >= dtd->scaffSize) { - CONTENT_SCAFFOLD *temp; - if (dtd->scaffold) { - temp = (CONTENT_SCAFFOLD *) - REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize *= 2; - } - else { - temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; - } - dtd->scaffold = temp; - } - next = dtd->scaffCount++; - me = &dtd->scaffold[next]; - if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; - if (parent->lastchild) { - dtd->scaffold[parent->lastchild].nextsib = next; - } - if (!parent->childcnt) - parent->firstchild = next; - parent->lastchild = next; - parent->childcnt++; - } - me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; - return next; -} - -static void -build_node(XML_Parser parser, - int src_node, - XML_Content *dest, - XML_Content **contpos, - XML_Char **strpos) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - dest->type = dtd->scaffold[src_node].type; - dest->quant = dtd->scaffold[src_node].quant; - if (dest->type == XML_CTYPE_NAME) { - const XML_Char *src; - dest->name = *strpos; - src = dtd->scaffold[src_node].name; - for (;;) { - *(*strpos)++ = *src; - if (!*src) - break; - src++; - } - dest->numchildren = 0; - dest->children = NULL; - } - else { - unsigned int i; - int cn; - dest->numchildren = dtd->scaffold[src_node].childcnt; - dest->children = *contpos; - *contpos += dest->numchildren; - for (i = 0, cn = dtd->scaffold[src_node].firstchild; - i < dest->numchildren; - i++, cn = dtd->scaffold[cn].nextsib) { - build_node(parser, cn, &(dest->children[i]), contpos, strpos); - } - dest->name = NULL; - } -} - -static XML_Content * -build_model (XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - XML_Content *ret; - XML_Content *cpos; - XML_Char * str; - int allocsize = (dtd->scaffCount * sizeof(XML_Content) - + (dtd->contentStringLen * sizeof(XML_Char))); - - ret = (XML_Content *)MALLOC(allocsize); - if (!ret) - return NULL; - - str = (XML_Char *) (&ret[dtd->scaffCount]); - cpos = &ret[1]; - - build_node(parser, 0, ret, &cpos, &str); - return ret; -} - -static ELEMENT_TYPE * -getElementType(XML_Parser parser, - const ENCODING *enc, - const char *ptr, - const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); - ELEMENT_TYPE *ret; - - if (!name) - return NULL; - ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!ret) - return NULL; - if (ret->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!setElementTypePrefix(parser, ret)) - return NULL; - } - return ret; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c deleted file mode 100644 index 44772e21..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmlrole.h" -#include "ascii.h" - -/* Doesn't check: - - that ,| are not mixed in a model group - content of literals - -*/ - -static const char KW_ANY[] = { - ASCII_A, ASCII_N, ASCII_Y, '\0' }; -static const char KW_ATTLIST[] = { - ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; -static const char KW_CDATA[] = { - ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_DOCTYPE[] = { - ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; -static const char KW_ELEMENT[] = { - ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; -static const char KW_EMPTY[] = { - ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; -static const char KW_ENTITIES[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, - '\0' }; -static const char KW_ENTITY[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; -static const char KW_FIXED[] = { - ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; -static const char KW_ID[] = { - ASCII_I, ASCII_D, '\0' }; -static const char KW_IDREF[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; -static const char KW_IDREFS[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; -#ifdef XML_DTD -static const char KW_IGNORE[] = { - ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; -#endif -static const char KW_IMPLIED[] = { - ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; -#ifdef XML_DTD -static const char KW_INCLUDE[] = { - ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; -#endif -static const char KW_NDATA[] = { - ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_NMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; -static const char KW_NMTOKENS[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, - '\0' }; -static const char KW_NOTATION[] = - { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, - '\0' }; -static const char KW_PCDATA[] = { - ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_PUBLIC[] = { - ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; -static const char KW_REQUIRED[] = { - ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, - '\0' }; -static const char KW_SYSTEM[] = { - ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; - -#ifndef MIN_BYTES_PER_CHAR -#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) -#endif - -#ifdef XML_DTD -#define setTopLevel(state) \ - ((state)->handler = ((state)->documentEntity \ - ? internalSubset \ - : externalSubset1)) -#else /* not XML_DTD */ -#define setTopLevel(state) ((state)->handler = internalSubset) -#endif /* not XML_DTD */ - -typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - -static PROLOG_HANDLER - prolog0, prolog1, prolog2, - doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, - internalSubset, - entity0, entity1, entity2, entity3, entity4, entity5, entity6, - entity7, entity8, entity9, entity10, - notation0, notation1, notation2, notation3, notation4, - attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, - attlist7, attlist8, attlist9, - element0, element1, element2, element3, element4, element5, element6, - element7, -#ifdef XML_DTD - externalSubset0, externalSubset1, - condSect0, condSect1, condSect2, -#endif /* XML_DTD */ - declClose, - error; - -static int FASTCALL common(PROLOG_STATE *state, int tok); - -static int PTRCALL -prolog0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - state->handler = prolog1; - return XML_ROLE_NONE; - case XML_TOK_XML_DECL: - state->handler = prolog1; - return XML_ROLE_XML_DECL; - case XML_TOK_PI: - state->handler = prolog1; - return XML_ROLE_PI; - case XML_TOK_COMMENT: - state->handler = prolog1; - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -doctype0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = doctype1; - return XML_ROLE_DOCTYPE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -doctype1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = doctype3; - return XML_ROLE_DOCTYPE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = doctype2; - return XML_ROLE_DOCTYPE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -doctype2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype3; - return XML_ROLE_DOCTYPE_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype4; - return XML_ROLE_DOCTYPE_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -doctype5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -internalSubset(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ENTITY)) { - state->handler = entity0; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ATTLIST)) { - state->handler = attlist0; - return XML_ROLE_ATTLIST_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ELEMENT)) { - state->handler = element0; - return XML_ROLE_ELEMENT_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_NOTATION)) { - state->handler = notation0; - return XML_ROLE_NOTATION_NONE; - } - break; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_PARAM_ENTITY_REF: - return XML_ROLE_PARAM_ENTITY_REF; - case XML_TOK_CLOSE_BRACKET: - state->handler = doctype5; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NONE: - return XML_ROLE_NONE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -externalSubset0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - state->handler = externalSubset1; - if (tok == XML_TOK_XML_DECL) - return XML_ROLE_TEXT_DECL; - return externalSubset1(state, tok, ptr, end, enc); -} - -static int PTRCALL -externalSubset1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_COND_SECT_OPEN: - state->handler = condSect0; - return XML_ROLE_NONE; - case XML_TOK_COND_SECT_CLOSE: - if (state->includeLevel == 0) - break; - state->includeLevel -= 1; - return XML_ROLE_NONE; - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_CLOSE_BRACKET: - break; - case XML_TOK_NONE: - if (state->includeLevel) - break; - return XML_ROLE_NONE; - default: - return internalSubset(state, tok, ptr, end, enc); - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -entity0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_PERCENT: - state->handler = entity1; - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity2; - return XML_ROLE_GENERAL_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity7; - return XML_ROLE_PARAM_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity4; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity3; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity4; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity5; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { - state->handler = entity6; - return XML_ROLE_ENTITY_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -entity6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity9; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity8; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity9; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity10; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity10(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - } - return common(state, tok); -} - -static int PTRCALL -notation0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - state->handler = notation1; - return XML_ROLE_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -notation1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = notation3; - return XML_ROLE_NOTATION_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = notation2; - return XML_ROLE_NOTATION_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -notation2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = notation4; - return XML_ROLE_NOTATION_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_NOTATION_NO_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -attlist0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist1; - return XML_ROLE_ATTLIST_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist2; - return XML_ROLE_ATTRIBUTE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - { - static const char * const types[] = { - KW_CDATA, - KW_ID, - KW_IDREF, - KW_IDREFS, - KW_ENTITY, - KW_ENTITIES, - KW_NMTOKEN, - KW_NMTOKENS, - }; - int i; - for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) - if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { - state->handler = attlist8; - return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; - } - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { - state->handler = attlist5; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NMTOKEN: - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist4; - return XML_ROLE_ATTRIBUTE_ENUM_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OPEN_PAREN: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - state->handler = attlist7; - return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -/* default value */ -static int PTRCALL -attlist8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_IMPLIED)) { - state->handler = attlist1; - return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_REQUIRED)) { - state->handler = attlist1; - return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_FIXED)) { - state->handler = attlist9; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_FIXED_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -element0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element1; - return XML_ROLE_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -element1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_EMPTY; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_ANY; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = element2; - state->level = 1; - return XML_ROLE_GROUP_OPEN; - } - return common(state, tok); -} - -static int PTRCALL -element2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_PCDATA)) { - state->handler = element3; - return XML_ROLE_CONTENT_PCDATA; - } - break; - case XML_TOK_OPEN_PAREN: - state->level = 2; - state->handler = element6; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element5; - return XML_ROLE_CONTENT_ELEMENT; - } - return common(state, tok); -} - -static int PTRCALL -element5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_OPEN_PAREN: - state->level += 1; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_CLOSE_PAREN_QUESTION: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_OPT; - case XML_TOK_CLOSE_PAREN_PLUS: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_PLUS; - case XML_TOK_COMMA: - state->handler = element6; - return XML_ROLE_GROUP_SEQUENCE; - case XML_TOK_OR: - state->handler = element6; - return XML_ROLE_GROUP_CHOICE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -condSect0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { - state->handler = condSect1; - return XML_ROLE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { - state->handler = condSect2; - return XML_ROLE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -condSect1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - state->includeLevel += 1; - return XML_ROLE_NONE; - } - return common(state, tok); -} - -static int PTRCALL -condSect2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - return XML_ROLE_IGNORE_SECT; - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -declClose(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return state->role_none; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return state->role_none; - } - return common(state, tok); -} - -static int PTRCALL -error(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - return XML_ROLE_NONE; -} - -static int FASTCALL -common(PROLOG_STATE *state, int tok) -{ -#ifdef XML_DTD - if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) - return XML_ROLE_INNER_PARAM_ENTITY_REF; -#endif - state->handler = error; - return XML_ROLE_ERROR; -} - -void -XmlPrologStateInit(PROLOG_STATE *state) -{ - state->handler = prolog0; -#ifdef XML_DTD - state->documentEntity = 1; - state->includeLevel = 0; - state->inEntityValue = 0; -#endif /* XML_DTD */ -} - -#ifdef XML_DTD - -void -XmlPrologStateInitExternalEntity(PROLOG_STATE *state) -{ - state->handler = externalSubset0; - state->documentEntity = 0; - state->includeLevel = 0; -} - -#endif /* XML_DTD */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h deleted file mode 100644 index 4dd9f06f..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlRole_INCLUDED -#define XmlRole_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt -#endif - -#include "xmltok.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - XML_ROLE_ERROR = -1, - XML_ROLE_NONE = 0, - XML_ROLE_XML_DECL, - XML_ROLE_INSTANCE_START, - XML_ROLE_DOCTYPE_NONE, - XML_ROLE_DOCTYPE_NAME, - XML_ROLE_DOCTYPE_SYSTEM_ID, - XML_ROLE_DOCTYPE_PUBLIC_ID, - XML_ROLE_DOCTYPE_INTERNAL_SUBSET, - XML_ROLE_DOCTYPE_CLOSE, - XML_ROLE_GENERAL_ENTITY_NAME, - XML_ROLE_PARAM_ENTITY_NAME, - XML_ROLE_ENTITY_NONE, - XML_ROLE_ENTITY_VALUE, - XML_ROLE_ENTITY_SYSTEM_ID, - XML_ROLE_ENTITY_PUBLIC_ID, - XML_ROLE_ENTITY_COMPLETE, - XML_ROLE_ENTITY_NOTATION_NAME, - XML_ROLE_NOTATION_NONE, - XML_ROLE_NOTATION_NAME, - XML_ROLE_NOTATION_SYSTEM_ID, - XML_ROLE_NOTATION_NO_SYSTEM_ID, - XML_ROLE_NOTATION_PUBLIC_ID, - XML_ROLE_ATTRIBUTE_NAME, - XML_ROLE_ATTRIBUTE_TYPE_CDATA, - XML_ROLE_ATTRIBUTE_TYPE_ID, - XML_ROLE_ATTRIBUTE_TYPE_IDREF, - XML_ROLE_ATTRIBUTE_TYPE_IDREFS, - XML_ROLE_ATTRIBUTE_TYPE_ENTITY, - XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, - XML_ROLE_ATTRIBUTE_ENUM_VALUE, - XML_ROLE_ATTRIBUTE_NOTATION_VALUE, - XML_ROLE_ATTLIST_NONE, - XML_ROLE_ATTLIST_ELEMENT_NAME, - XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, - XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, - XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, - XML_ROLE_FIXED_ATTRIBUTE_VALUE, - XML_ROLE_ELEMENT_NONE, - XML_ROLE_ELEMENT_NAME, - XML_ROLE_CONTENT_ANY, - XML_ROLE_CONTENT_EMPTY, - XML_ROLE_CONTENT_PCDATA, - XML_ROLE_GROUP_OPEN, - XML_ROLE_GROUP_CLOSE, - XML_ROLE_GROUP_CLOSE_REP, - XML_ROLE_GROUP_CLOSE_OPT, - XML_ROLE_GROUP_CLOSE_PLUS, - XML_ROLE_GROUP_CHOICE, - XML_ROLE_GROUP_SEQUENCE, - XML_ROLE_CONTENT_ELEMENT, - XML_ROLE_CONTENT_ELEMENT_REP, - XML_ROLE_CONTENT_ELEMENT_OPT, - XML_ROLE_CONTENT_ELEMENT_PLUS, - XML_ROLE_PI, - XML_ROLE_COMMENT, -#ifdef XML_DTD - XML_ROLE_TEXT_DECL, - XML_ROLE_IGNORE_SECT, - XML_ROLE_INNER_PARAM_ENTITY_REF, -#endif /* XML_DTD */ - XML_ROLE_PARAM_ENTITY_REF -}; - -typedef struct prolog_state { - int (PTRCALL *handler) (struct prolog_state *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - unsigned level; - int role_none; -#ifdef XML_DTD - unsigned includeLevel; - int documentEntity; - int inEntityValue; -#endif /* XML_DTD */ -} PROLOG_STATE; - -void XmlPrologStateInit(PROLOG_STATE *); -#ifdef XML_DTD -void XmlPrologStateInitExternalEntity(PROLOG_STATE *); -#endif /* XML_DTD */ - -#define XmlTokenRole(state, tok, ptr, end, enc) \ - (((state)->handler)(state, tok, ptr, end, enc)) - -#ifdef __cplusplus -} -#endif - -#endif /* not XmlRole_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c deleted file mode 100644 index bf09dfc7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c +++ /dev/null @@ -1,1651 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmltok.h" -#include "nametab.h" - -#ifdef XML_DTD -#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) -#else -#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ -#endif - -#define VTABLE1 \ - { PREFIX(prologTok), PREFIX(contentTok), \ - PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ - { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ - PREFIX(sameName), \ - PREFIX(nameMatchesAscii), \ - PREFIX(nameLength), \ - PREFIX(skipS), \ - PREFIX(getAtts), \ - PREFIX(charRefNumber), \ - PREFIX(predefinedEntityName), \ - PREFIX(updatePosition), \ - PREFIX(isPublicId) - -#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) - -#define UCS2_GET_NAMING(pages, hi, lo) \ - (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) - -/* A 2 byte UTF-8 representation splits the characters 11 bits between - the bottom 5 and 6 bits of the bytes. We need 8 bits to index into - pages, 3 bits to add to that index and 5 bits to generate the mask. -*/ -#define UTF8_GET_NAMING2(pages, byte) \ - (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ - + ((((byte)[0]) & 3) << 1) \ - + ((((byte)[1]) >> 5) & 1)] \ - & (1 << (((byte)[1]) & 0x1F))) - -/* A 3 byte UTF-8 representation splits the characters 16 bits between - the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index - into pages, 3 bits to add to that index and 5 bits to generate the - mask. -*/ -#define UTF8_GET_NAMING3(pages, byte) \ - (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ - + ((((byte)[1]) >> 2) & 0xF)] \ - << 3) \ - + ((((byte)[1]) & 3) << 1) \ - + ((((byte)[2]) >> 5) & 1)] \ - & (1 << (((byte)[2]) & 0x1F))) - -#define UTF8_GET_NAMING(pages, p, n) \ - ((n) == 2 \ - ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ - : ((n) == 3 \ - ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ - : 0)) - -/* Detection of invalid UTF-8 sequences is based on Table 3.1B - of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ - with the additional restriction of not allowing the Unicode - code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). - Implementation details: - (A & 0x80) == 0 means A < 0x80 - and - (A & 0xC0) == 0xC0 means A > 0xBF -*/ - -#define UTF8_INVALID2(p) \ - ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) - -#define UTF8_INVALID3(p) \ - (((p)[2] & 0x80) == 0 \ - || \ - ((*p) == 0xEF && (p)[1] == 0xBF \ - ? \ - (p)[2] > 0xBD \ - : \ - ((p)[2] & 0xC0) == 0xC0) \ - || \ - ((*p) == 0xE0 \ - ? \ - (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) - -#define UTF8_INVALID4(p) \ - (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ - || \ - ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ - || \ - ((*p) == 0xF0 \ - ? \ - (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) - -static int PTRFASTCALL -isNever(const ENCODING *enc, const char *p) -{ - return 0; -} - -static int PTRFASTCALL -utf8_isName2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isName3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); -} - -#define utf8_isName4 isNever - -static int PTRFASTCALL -utf8_isNmstrt2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isNmstrt3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); -} - -#define utf8_isNmstrt4 isNever - -static int PTRFASTCALL -utf8_isInvalid2(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID2((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid3(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID3((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid4(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID4((const unsigned char *)p); -} - -struct normal_encoding { - ENCODING enc; - unsigned char type[256]; -#ifdef XML_MIN_SIZE - int (PTRFASTCALL *byteType)(const ENCODING *, const char *); - int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); - int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); - int (PTRCALL *charMatches)(const ENCODING *, const char *, int); -#endif /* XML_MIN_SIZE */ - int (PTRFASTCALL *isName2)(const ENCODING *, const char *); - int (PTRFASTCALL *isName3)(const ENCODING *, const char *); - int (PTRFASTCALL *isName4)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); -}; - -#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) - -#ifdef XML_MIN_SIZE - -#define STANDARD_VTABLE(E) \ - E ## byteType, \ - E ## isNameMin, \ - E ## isNmstrtMin, \ - E ## byteToAscii, \ - E ## charMatches, - -#else - -#define STANDARD_VTABLE(E) /* as nothing */ - -#endif - -#define NORMAL_VTABLE(E) \ - E ## isName2, \ - E ## isName3, \ - E ## isName4, \ - E ## isNmstrt2, \ - E ## isNmstrt3, \ - E ## isNmstrt4, \ - E ## isInvalid2, \ - E ## isInvalid3, \ - E ## isInvalid4 - -static int FASTCALL checkCharRefNumber(int); - -#include "xmltok_impl.h" -#include "ascii.h" - -#ifdef XML_MIN_SIZE -#define sb_isNameMin isNever -#define sb_isNmstrtMin isNever -#endif - -#ifdef XML_MIN_SIZE -#define MINBPC(enc) ((enc)->minBytesPerChar) -#else -/* minimum bytes per character */ -#define MINBPC(enc) 1 -#endif - -#define SB_BYTE_TYPE(enc, p) \ - (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) - -#ifdef XML_MIN_SIZE -static int PTRFASTCALL -sb_byteType(const ENCODING *enc, const char *p) -{ - return SB_BYTE_TYPE(enc, p); -} -#define BYTE_TYPE(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) -#else -#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) -#endif - -#ifdef XML_MIN_SIZE -#define BYTE_TO_ASCII(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) -static int PTRFASTCALL -sb_byteToAscii(const ENCODING *enc, const char *p) -{ - return *p; -} -#else -#define BYTE_TO_ASCII(enc, p) (*(p)) -#endif - -#define IS_NAME_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) -#define IS_NMSTRT_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) - -#ifdef XML_MIN_SIZE -#define IS_NAME_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) -#else -#define IS_NAME_CHAR_MINBPC(enc, p) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) -#endif - -#ifdef XML_MIN_SIZE -#define CHAR_MATCHES(enc, p, c) \ - (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) -static int PTRCALL -sb_charMatches(const ENCODING *enc, const char *p, int c) -{ - return *p == c; -} -#else -/* c is an ASCII character */ -#define CHAR_MATCHES(enc, p, c) (*(p) == c) -#endif - -#define PREFIX(ident) normal_ ## ident -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ - UTF8_cval1 = 0x00, - UTF8_cval2 = 0xc0, - UTF8_cval3 = 0xe0, - UTF8_cval4 = 0xf0 -}; - -static void PTRCALL -utf8_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - char *to; - const char *from; - if (fromLim - *fromP > toLim - *toP) { - /* Avoid copying partial characters. */ - for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) - if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) - break; - } - for (to = *toP, from = *fromP; from != fromLim; from++, to++) - *to = *from; - *fromP = from; - *toP = to; -} - -static void PTRCALL -utf8_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - unsigned short *to = *toP; - const char *from = *fromP; - while (from != fromLim && to != toLim) { - switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { - case BT_LEAD2: - *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); - from += 2; - break; - case BT_LEAD3: - *to++ = (unsigned short)(((from[0] & 0xf) << 12) - | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); - from += 3; - break; - case BT_LEAD4: - { - unsigned long n; - if (to + 1 == toLim) - goto after; - n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) - | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); - n -= 0x10000; - to[0] = (unsigned short)((n >> 10) | 0xD800); - to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); - to += 2; - from += 4; - } - break; - default: - *to++ = *from++; - break; - } - } -after: - *fromP = from; - *toP = to; -} - -#ifdef XML_NS -static const struct normal_encoding utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; -#endif - -static const struct normal_encoding utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#ifdef XML_NS - -static const struct normal_encoding internal_utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "iasciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#endif - -static const struct normal_encoding internal_utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -static void PTRCALL -latin1_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - for (;;) { - unsigned char c; - if (*fromP == fromLim) - break; - c = (unsigned char)**fromP; - if (c & 0x80) { - if (toLim - *toP < 2) - break; - *(*toP)++ = (char)((c >> 6) | UTF8_cval2); - *(*toP)++ = (char)((c & 0x3f) | 0x80); - (*fromP)++; - } - else { - if (*toP == toLim) - break; - *(*toP)++ = *(*fromP)++; - } - } -} - -static void PTRCALL -latin1_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = (unsigned char)*(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding latin1_encoding_ns = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding latin1_encoding = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -static void PTRCALL -ascii_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = *(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding ascii_encoding_ns = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding ascii_encoding = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -static int PTRFASTCALL -unicode_byte_type(char hi, char lo) -{ - switch ((unsigned char)hi) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - return BT_LEAD4; - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return BT_TRAIL; - case 0xFF: - switch ((unsigned char)lo) { - case 0xFF: - case 0xFE: - return BT_NONXML; - } - break; - } - return BT_NONASCII; -} - -#define DEFINE_UTF16_TO_UTF8(E) \ -static void PTRCALL \ -E ## toUtf8(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - char **toP, const char *toLim) \ -{ \ - const char *from; \ - for (from = *fromP; from != fromLim; from += 2) { \ - int plane; \ - unsigned char lo2; \ - unsigned char lo = GET_LO(from); \ - unsigned char hi = GET_HI(from); \ - switch (hi) { \ - case 0: \ - if (lo < 0x80) { \ - if (*toP == toLim) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = lo; \ - break; \ - } \ - /* fall through */ \ - case 0x1: case 0x2: case 0x3: \ - case 0x4: case 0x5: case 0x6: case 0x7: \ - if (toLim - *toP < 2) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - default: \ - if (toLim - *toP < 3) { \ - *fromP = from; \ - return; \ - } \ - /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ - *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ - *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ - if (toLim - *toP < 4) { \ - *fromP = from; \ - return; \ - } \ - plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ - *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ - *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ - from += 2; \ - lo2 = GET_LO(from); \ - *(*toP)++ = (((lo & 0x3) << 4) \ - | ((GET_HI(from) & 0x3) << 2) \ - | (lo2 >> 6) \ - | 0x80); \ - *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ - break; \ - } \ - } \ - *fromP = from; \ -} - -#define DEFINE_UTF16_TO_UTF16(E) \ -static void PTRCALL \ -E ## toUtf16(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - unsigned short **toP, const unsigned short *toLim) \ -{ \ - /* Avoid copying first half only of surrogate */ \ - if (fromLim - *fromP > ((toLim - *toP) << 1) \ - && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ - fromLim -= 2; \ - for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ - *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ -} - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) -#define GET_LO(ptr) ((unsigned char)(ptr)[0]) -#define GET_HI(ptr) ((unsigned char)(ptr)[1]) - -DEFINE_UTF16_TO_UTF8(little2_) -DEFINE_UTF16_TO_UTF16(little2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) -#define GET_LO(ptr) ((unsigned char)(ptr)[1]) -#define GET_HI(ptr) ((unsigned char)(ptr)[0]) - -DEFINE_UTF16_TO_UTF8(big2_) -DEFINE_UTF16_TO_UTF16(big2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define LITTLE2_BYTE_TYPE(enc, p) \ - ((p)[1] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ - : unicode_byte_type((p)[1], (p)[0])) -#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) -#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) -#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) -#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -little2_byteType(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -little2_byteToAscii(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -little2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return LITTLE2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -little2_isNameMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -little2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) little2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding little2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding little2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#if BYTEORDER != 4321 - -#ifdef XML_NS - -static const struct normal_encoding internal_little2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding internal_little2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - - -#define BIG2_BYTE_TYPE(enc, p) \ - ((p)[0] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ - : unicode_byte_type((p)[0], (p)[1])) -#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) -#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) -#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) -#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -big2_byteType(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -big2_byteToAscii(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -big2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return BIG2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -big2_isNameMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -big2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) big2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding big2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding big2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#if BYTEORDER != 1234 - -#ifdef XML_NS - -static const struct normal_encoding internal_big2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding internal_big2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -#undef PREFIX - -static int FASTCALL -streqci(const char *s1, const char *s2) -{ - for (;;) { - char c1 = *s1++; - char c2 = *s2++; - if (ASCII_a <= c1 && c1 <= ASCII_z) - c1 += ASCII_A - ASCII_a; - if (ASCII_a <= c2 && c2 <= ASCII_z) - c2 += ASCII_A - ASCII_a; - if (c1 != c2) - return 0; - if (!c1) - break; - } - return 1; -} - -static void PTRCALL -initUpdatePosition(const ENCODING *enc, const char *ptr, - const char *end, POSITION *pos) -{ - normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); -} - -static int -toAscii(const ENCODING *enc, const char *ptr, const char *end) -{ - char buf[1]; - char *p = buf; - XmlUtf8Convert(enc, &ptr, end, &p, p + 1); - if (p == buf) - return -1; - else - return buf[0]; -} - -static int FASTCALL -isSpace(int c) -{ - switch (c) { - case 0x20: - case 0xD: - case 0xA: - case 0x9: - return 1; - } - return 0; -} - -/* Return 1 if there's just optional white space or there's an S - followed by name=val. -*/ -static int -parsePseudoAttribute(const ENCODING *enc, - const char *ptr, - const char *end, - const char **namePtr, - const char **nameEndPtr, - const char **valPtr, - const char **nextTokPtr) -{ - int c; - char open; - if (ptr == end) { - *namePtr = NULL; - return 1; - } - if (!isSpace(toAscii(enc, ptr, end))) { - *nextTokPtr = ptr; - return 0; - } - do { - ptr += enc->minBytesPerChar; - } while (isSpace(toAscii(enc, ptr, end))); - if (ptr == end) { - *namePtr = NULL; - return 1; - } - *namePtr = ptr; - for (;;) { - c = toAscii(enc, ptr, end); - if (c == -1) { - *nextTokPtr = ptr; - return 0; - } - if (c == ASCII_EQUALS) { - *nameEndPtr = ptr; - break; - } - if (isSpace(c)) { - *nameEndPtr = ptr; - do { - ptr += enc->minBytesPerChar; - } while (isSpace(c = toAscii(enc, ptr, end))); - if (c != ASCII_EQUALS) { - *nextTokPtr = ptr; - return 0; - } - break; - } - ptr += enc->minBytesPerChar; - } - if (ptr == *namePtr) { - *nextTokPtr = ptr; - return 0; - } - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - while (isSpace(c)) { - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - } - if (c != ASCII_QUOT && c != ASCII_APOS) { - *nextTokPtr = ptr; - return 0; - } - open = (char)c; - ptr += enc->minBytesPerChar; - *valPtr = ptr; - for (;; ptr += enc->minBytesPerChar) { - c = toAscii(enc, ptr, end); - if (c == open) - break; - if (!(ASCII_a <= c && c <= ASCII_z) - && !(ASCII_A <= c && c <= ASCII_Z) - && !(ASCII_0 <= c && c <= ASCII_9) - && c != ASCII_PERIOD - && c != ASCII_MINUS - && c != ASCII_UNDERSCORE) { - *nextTokPtr = ptr; - return 0; - } - } - *nextTokPtr = ptr + enc->minBytesPerChar; - return 1; -} - -static const char KW_version[] = { - ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' -}; - -static const char KW_encoding[] = { - ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' -}; - -static const char KW_standalone[] = { - ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, - ASCII_n, ASCII_e, '\0' -}; - -static const char KW_yes[] = { - ASCII_y, ASCII_e, ASCII_s, '\0' -}; - -static const char KW_no[] = { - ASCII_n, ASCII_o, '\0' -}; - -static int -doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, - const char *, - const char *), - int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - const char *val = NULL; - const char *name = NULL; - const char *nameEnd = NULL; - ptr += 5 * enc->minBytesPerChar; - end -= 2 * enc->minBytesPerChar; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) - || !name) { - *badPtr = ptr; - return 0; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { - if (!isGeneralTextEntity) { - *badPtr = name; - return 0; - } - } - else { - if (versionPtr) - *versionPtr = val; - if (versionEndPtr) - *versionEndPtr = ptr; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) { - if (isGeneralTextEntity) { - /* a TextDecl must have an EncodingDecl */ - *badPtr = ptr; - return 0; - } - return 1; - } - } - if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { - int c = toAscii(enc, val, end); - if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { - *badPtr = val; - return 0; - } - if (encodingName) - *encodingName = val; - if (encoding) - *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) - return 1; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) - || isGeneralTextEntity) { - *badPtr = name; - return 0; - } - if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { - if (standalone) - *standalone = 1; - } - else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { - if (standalone) - *standalone = 0; - } - else { - *badPtr = val; - return 0; - } - while (isSpace(toAscii(enc, ptr, end))) - ptr += enc->minBytesPerChar; - if (ptr != end) { - *badPtr = ptr; - return 0; - } - return 1; -} - -static int FASTCALL -checkCharRefNumber(int result) -{ - switch (result >> 8) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return -1; - case 0: - if (latin1_encoding.type[result] == BT_NONXML) - return -1; - break; - case 0xFF: - if (result == 0xFFFE || result == 0xFFFF) - return -1; - break; - } - return result; -} - -int FASTCALL -XmlUtf8Encode(int c, char *buf) -{ - enum { - /* minN is minimum legal resulting value for N byte sequence */ - min2 = 0x80, - min3 = 0x800, - min4 = 0x10000 - }; - - if (c < 0) - return 0; - if (c < min2) { - buf[0] = (char)(c | UTF8_cval1); - return 1; - } - if (c < min3) { - buf[0] = (char)((c >> 6) | UTF8_cval2); - buf[1] = (char)((c & 0x3f) | 0x80); - return 2; - } - if (c < min4) { - buf[0] = (char)((c >> 12) | UTF8_cval3); - buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[2] = (char)((c & 0x3f) | 0x80); - return 3; - } - if (c < 0x110000) { - buf[0] = (char)((c >> 18) | UTF8_cval4); - buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); - buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[3] = (char)((c & 0x3f) | 0x80); - return 4; - } - return 0; -} - -int FASTCALL -XmlUtf16Encode(int charNum, unsigned short *buf) -{ - if (charNum < 0) - return 0; - if (charNum < 0x10000) { - buf[0] = (unsigned short)charNum; - return 1; - } - if (charNum < 0x110000) { - charNum -= 0x10000; - buf[0] = (unsigned short)((charNum >> 10) + 0xD800); - buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); - return 2; - } - return 0; -} - -struct unknown_encoding { - struct normal_encoding normal; - CONVERTER convert; - void *userData; - unsigned short utf16[256]; - char utf8[256][4]; -}; - -#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) - -int -XmlSizeOfUnknownEncoding(void) -{ - return sizeof(struct unknown_encoding); -} - -static int PTRFASTCALL -unknown_isName(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isNmstrt(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isInvalid(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; -} - -static void PTRCALL -unknown_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - char buf[XML_UTF8_ENCODE_MAX]; - for (;;) { - const char *utf8; - int n; - if (*fromP == fromLim) - break; - utf8 = uenc->utf8[(unsigned char)**fromP]; - n = *utf8++; - if (n == 0) { - int c = uenc->convert(uenc->userData, *fromP); - n = XmlUtf8Encode(c, buf); - if (n > toLim - *toP) - break; - utf8 = buf; - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else { - if (n > toLim - *toP) - break; - (*fromP)++; - } - do { - *(*toP)++ = *utf8++; - } while (--n != 0); - } -} - -static void PTRCALL -unknown_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - while (*fromP != fromLim && *toP != toLim) { - unsigned short c = uenc->utf16[(unsigned char)**fromP]; - if (c == 0) { - c = (unsigned short) - uenc->convert(uenc->userData, *fromP); - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else - (*fromP)++; - *(*toP)++ = c; - } -} - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - int i; - struct unknown_encoding *e = (struct unknown_encoding *)mem; - for (i = 0; i < (int)sizeof(struct normal_encoding); i++) - ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; - for (i = 0; i < 128; i++) - if (latin1_encoding.type[i] != BT_OTHER - && latin1_encoding.type[i] != BT_NONXML - && table[i] != i) - return 0; - for (i = 0; i < 256; i++) { - int c = table[i]; - if (c == -1) { - e->normal.type[i] = BT_MALFORM; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else if (c < 0) { - if (c < -4) - return 0; - e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); - e->utf8[i][0] = 0; - e->utf16[i] = 0; - } - else if (c < 0x80) { - if (latin1_encoding.type[c] != BT_OTHER - && latin1_encoding.type[c] != BT_NONXML - && c != i) - return 0; - e->normal.type[i] = latin1_encoding.type[c]; - e->utf8[i][0] = 1; - e->utf8[i][1] = (char)c; - e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); - } - else if (checkCharRefNumber(c) < 0) { - e->normal.type[i] = BT_NONXML; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else { - if (c > 0xFFFF) - return 0; - if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NMSTRT; - else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NAME; - else - e->normal.type[i] = BT_OTHER; - e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); - e->utf16[i] = (unsigned short)c; - } - } - e->userData = userData; - e->convert = convert; - if (convert) { - e->normal.isName2 = unknown_isName; - e->normal.isName3 = unknown_isName; - e->normal.isName4 = unknown_isName; - e->normal.isNmstrt2 = unknown_isNmstrt; - e->normal.isNmstrt3 = unknown_isNmstrt; - e->normal.isNmstrt4 = unknown_isNmstrt; - e->normal.isInvalid2 = unknown_isInvalid; - e->normal.isInvalid3 = unknown_isInvalid; - e->normal.isInvalid4 = unknown_isInvalid; - } - e->normal.enc.utf8Convert = unknown_toUtf8; - e->normal.enc.utf16Convert = unknown_toUtf16; - return &(e->normal.enc); -} - -/* If this enumeration is changed, getEncodingIndex and encodings -must also be changed. */ -enum { - UNKNOWN_ENC = -1, - ISO_8859_1_ENC = 0, - US_ASCII_ENC, - UTF_8_ENC, - UTF_16_ENC, - UTF_16BE_ENC, - UTF_16LE_ENC, - /* must match encodingNames up to here */ - NO_ENC -}; - -static const char KW_ISO_8859_1[] = { - ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, - ASCII_MINUS, ASCII_1, '\0' -}; -static const char KW_US_ASCII[] = { - ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, - '\0' -}; -static const char KW_UTF_8[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' -}; -static const char KW_UTF_16[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' -}; -static const char KW_UTF_16BE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, - '\0' -}; -static const char KW_UTF_16LE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, - '\0' -}; - -static int FASTCALL -getEncodingIndex(const char *name) -{ - static const char * const encodingNames[] = { - KW_ISO_8859_1, - KW_US_ASCII, - KW_UTF_8, - KW_UTF_16, - KW_UTF_16BE, - KW_UTF_16LE, - }; - int i; - if (name == NULL) - return NO_ENC; - for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) - if (streqci(name, encodingNames[i])) - return i; - return UNKNOWN_ENC; -} - -/* For binary compatibility, we store the index of the encoding - specified at initialization in the isUtf16 member. -*/ - -#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) -#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) - -/* This is what detects the encoding. encodingTable maps from - encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of - the external (protocol) specified encoding; state is - XML_CONTENT_STATE if we're parsing an external text entity, and - XML_PROLOG_STATE otherwise. -*/ - - -static int -initScan(const ENCODING * const *encodingTable, - const INIT_ENCODING *enc, - int state, - const char *ptr, - const char *end, - const char **nextTokPtr) -{ - const ENCODING **encPtr; - - if (ptr == end) - return XML_TOK_NONE; - encPtr = enc->encPtr; - if (ptr + 1 == end) { - /* only a single byte available for auto-detection */ -#ifndef XML_DTD /* FIXME */ - /* a well-formed document entity must have more than one byte */ - if (state != XML_CONTENT_STATE) - return XML_TOK_PARTIAL; -#endif - /* so we're parsing an external text entity... */ - /* if UTF-16 was externally specified, then we need at least 2 bytes */ - switch (INIT_ENC_INDEX(enc)) { - case UTF_16_ENC: - case UTF_16LE_ENC: - case UTF_16BE_ENC: - return XML_TOK_PARTIAL; - } - switch ((unsigned char)*ptr) { - case 0xFE: - case 0xFF: - case 0xEF: /* possibly first byte of UTF-8 BOM */ - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - /* fall through */ - case 0x00: - case 0x3C: - return XML_TOK_PARTIAL; - } - } - else { - switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { - case 0xFEFF: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XML_TOK_BOM; - /* 00 3C is handled in the default case */ - case 0x3C00: - if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC - || INIT_ENC_INDEX(enc) == UTF_16_ENC) - && state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - case 0xFFFE: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XML_TOK_BOM; - case 0xEFBB: - /* Maybe a UTF-8 BOM (EF BB BF) */ - /* If there's an explicitly specified (external) encoding - of ISO-8859-1 or some flavour of UTF-16 - and this is an external text entity, - don't look for the BOM, - because it might be a legal data. - */ - if (state == XML_CONTENT_STATE) { - int e = INIT_ENC_INDEX(enc); - if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC - || e == UTF_16LE_ENC || e == UTF_16_ENC) - break; - } - if (ptr + 2 == end) - return XML_TOK_PARTIAL; - if ((unsigned char)ptr[2] == 0xBF) { - *nextTokPtr = ptr + 3; - *encPtr = encodingTable[UTF_8_ENC]; - return XML_TOK_BOM; - } - break; - default: - if (ptr[0] == '\0') { - /* 0 isn't a legal data character. Furthermore a document - entity can only start with ASCII characters. So the only - way this can fail to be big-endian UTF-16 if it it's an - external parsed general entity that's labelled as - UTF-16LE. - */ - if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) - break; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - else if (ptr[1] == '\0') { - /* We could recover here in the case: - - parsing an external entity - - second byte is 0 - - no externally specified encoding - - no encoding declaration - by assuming UTF-16LE. But we don't, because this would mean when - presented just with a single byte, we couldn't reliably determine - whether we needed further bytes. - */ - if (state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - break; - } - } - *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); -} - - -#define NS(x) x -#define ns(x) x -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C -#undef NS -#undef ns - -#ifdef XML_NS - -#define NS(x) x ## NS -#define ns(x) x ## _ns - -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C - -#undef NS -#undef ns - -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); - if (enc) - ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; - return enc; -} - -#endif /* XML_NS */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h deleted file mode 100644 index ca867aa6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlTok_INCLUDED -#define XmlTok_INCLUDED 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* The following token may be returned by XmlContentTok */ -#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be - start of illegal ]]> sequence */ -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_NONE -4 /* The string to be scanned is empty */ -#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; - might be part of CRLF sequence */ -#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ -#define XML_TOK_PARTIAL -1 /* only part of a token */ -#define XML_TOK_INVALID 0 - -/* The following tokens are returned by XmlContentTok; some are also - returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. -*/ -#define XML_TOK_START_TAG_WITH_ATTS 1 -#define XML_TOK_START_TAG_NO_ATTS 2 -#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ -#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 -#define XML_TOK_END_TAG 5 -#define XML_TOK_DATA_CHARS 6 -#define XML_TOK_DATA_NEWLINE 7 -#define XML_TOK_CDATA_SECT_OPEN 8 -#define XML_TOK_ENTITY_REF 9 -#define XML_TOK_CHAR_REF 10 /* numeric character reference */ - -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_PI 11 /* processing instruction */ -#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ -#define XML_TOK_COMMENT 13 -#define XML_TOK_BOM 14 /* Byte order mark */ - -/* The following tokens are returned only by XmlPrologTok */ -#define XML_TOK_PROLOG_S 15 -#define XML_TOK_DECL_OPEN 16 /* */ -#define XML_TOK_NAME 18 -#define XML_TOK_NMTOKEN 19 -#define XML_TOK_POUND_NAME 20 /* #name */ -#define XML_TOK_OR 21 /* | */ -#define XML_TOK_PERCENT 22 -#define XML_TOK_OPEN_PAREN 23 -#define XML_TOK_CLOSE_PAREN 24 -#define XML_TOK_OPEN_BRACKET 25 -#define XML_TOK_CLOSE_BRACKET 26 -#define XML_TOK_LITERAL 27 -#define XML_TOK_PARAM_ENTITY_REF 28 -#define XML_TOK_INSTANCE_START 29 - -/* The following occur only in element type declarations */ -#define XML_TOK_NAME_QUESTION 30 /* name? */ -#define XML_TOK_NAME_ASTERISK 31 /* name* */ -#define XML_TOK_NAME_PLUS 32 /* name+ */ -#define XML_TOK_COND_SECT_OPEN 33 /* */ -#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ -#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ -#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ -#define XML_TOK_COMMA 38 - -/* The following token is returned only by XmlAttributeValueTok */ -#define XML_TOK_ATTRIBUTE_VALUE_S 39 - -/* The following token is returned only by XmlCdataSectionTok */ -#define XML_TOK_CDATA_SECT_CLOSE 40 - -/* With namespace processing this is returned by XmlPrologTok for a - name with a colon. -*/ -#define XML_TOK_PREFIXED_NAME 41 - -#ifdef XML_DTD -#define XML_TOK_IGNORE_SECT 42 -#endif /* XML_DTD */ - -#ifdef XML_DTD -#define XML_N_STATES 4 -#else /* not XML_DTD */ -#define XML_N_STATES 3 -#endif /* not XML_DTD */ - -#define XML_PROLOG_STATE 0 -#define XML_CONTENT_STATE 1 -#define XML_CDATA_SECTION_STATE 2 -#ifdef XML_DTD -#define XML_IGNORE_SECTION_STATE 3 -#endif /* XML_DTD */ - -#define XML_N_LITERAL_TYPES 2 -#define XML_ATTRIBUTE_VALUE_LITERAL 0 -#define XML_ENTITY_VALUE_LITERAL 1 - -/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ -#define XML_UTF8_ENCODE_MAX 4 -/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ -#define XML_UTF16_ENCODE_MAX 2 - -typedef struct position { - /* first line and first column are 0 not 1 */ - XML_Size lineNumber; - XML_Size columnNumber; -} POSITION; - -typedef struct { - const char *name; - const char *valuePtr; - const char *valueEnd; - char normalized; -} ATTRIBUTE; - -struct encoding; -typedef struct encoding ENCODING; - -typedef int (PTRCALL *SCANNER)(const ENCODING *, - const char *, - const char *, - const char **); - -struct encoding { - SCANNER scanners[XML_N_STATES]; - SCANNER literalScanners[XML_N_LITERAL_TYPES]; - int (PTRCALL *sameName)(const ENCODING *, - const char *, - const char *); - int (PTRCALL *nameMatchesAscii)(const ENCODING *, - const char *, - const char *, - const char *); - int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); - const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); - int (PTRCALL *getAtts)(const ENCODING *enc, - const char *ptr, - int attsMax, - ATTRIBUTE *atts); - int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); - int (PTRCALL *predefinedEntityName)(const ENCODING *, - const char *, - const char *); - void (PTRCALL *updatePosition)(const ENCODING *, - const char *ptr, - const char *end, - POSITION *); - int (PTRCALL *isPublicId)(const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr); - void (PTRCALL *utf8Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - char **toP, - const char *toLim); - void (PTRCALL *utf16Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - unsigned short **toP, - const unsigned short *toLim); - int minBytesPerChar; - char isUtf8; - char isUtf16; -}; - -/* Scan the string starting at ptr until the end of the next complete - token, but do not scan past eptr. Return an integer giving the - type of token. - - Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. - - Return XML_TOK_PARTIAL when the string does not contain a complete - token; nextTokPtr will not be set. - - Return XML_TOK_INVALID when the string does not start a valid - token; nextTokPtr will be set to point to the character which made - the token invalid. - - Otherwise the string starts with a valid token; nextTokPtr will be - set to point to the character following the end of that token. - - Each data character counts as a single token, but adjacent data - characters may be returned together. Similarly for characters in - the prolog outside literals, comments and processing instructions. -*/ - - -#define XmlTok(enc, state, ptr, end, nextTokPtr) \ - (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) - -#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) - -#define XmlContentTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) - -#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) - -#ifdef XML_DTD - -#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) - -#endif /* XML_DTD */ - -/* This is used for performing a 2nd-level tokenization on the content - of a literal that has already been returned by XmlTok. -*/ -#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ - (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) - -#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) - -#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ - (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) - -#define XmlNameLength(enc, ptr) \ - (((enc)->nameLength)(enc, ptr)) - -#define XmlSkipS(enc, ptr) \ - (((enc)->skipS)(enc, ptr)) - -#define XmlGetAttributes(enc, ptr, attsMax, atts) \ - (((enc)->getAtts)(enc, ptr, attsMax, atts)) - -#define XmlCharRefNumber(enc, ptr) \ - (((enc)->charRefNumber)(enc, ptr)) - -#define XmlPredefinedEntityName(enc, ptr, end) \ - (((enc)->predefinedEntityName)(enc, ptr, end)) - -#define XmlUpdatePosition(enc, ptr, end, pos) \ - (((enc)->updatePosition)(enc, ptr, end, pos)) - -#define XmlIsPublicId(enc, ptr, end, badPtr) \ - (((enc)->isPublicId)(enc, ptr, end, badPtr)) - -#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) - -#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) - -typedef struct { - ENCODING initEnc; - const ENCODING **encPtr; -} INIT_ENCODING; - -int XmlParseXmlDecl(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncoding(void); -const ENCODING *XmlGetUtf16InternalEncoding(void); -int FASTCALL XmlUtf8Encode(int charNumber, char *buf); -int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); -int XmlSizeOfUnknownEncoding(void); - - -typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData); - -int XmlParseXmlDeclNS(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncodingNS(void); -const ENCODING *XmlGetUtf16InternalEncodingNS(void); -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData); -#ifdef __cplusplus -} -#endif - -#endif /* not XmlTok_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c deleted file mode 100644 index 9c2895b8..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c +++ /dev/null @@ -1,1783 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_IMPL_C - -#ifndef IS_INVALID_CHAR -#define IS_INVALID_CHAR(enc, ptr, n) (0) -#endif - -#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_INVALID_CHAR(enc, ptr, n)) { \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define INVALID_CASES(ptr, nextTokPtr) \ - INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ - case BT_NONXML: \ - case BT_MALFORM: \ - case BT_TRAIL: \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; - -#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NAME_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - case BT_DIGIT: \ - case BT_NAME: \ - case BT_MINUS: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) - -#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) - -#ifndef PREFIX -#define PREFIX(ident) ident -#endif - -/* ptr points to character following " */ - switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { - case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* fall through */ - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DECL_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, - const char *end, int *tokPtr) -{ - int upper = 0; - *tokPtr = XML_TOK_PI; - if (end - ptr != MINBPC(enc)*3) - return 1; - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_x: - break; - case ASCII_X: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_m: - break; - case ASCII_M: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - break; - case ASCII_L: - upper = 1; - break; - default: - return 1; - } - if (upper) - return 0; - *tokPtr = XML_TOK_XML_DECL; - return 1; -} - -/* ptr points to character following " 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CDATA_SECT_CLOSE; - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - case BT_RSQB: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following " 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_LT: - return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_AMP: - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_RSQB: - if (ptr + MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { - ptr += MINBPC(enc); - break; - } - if (ptr + 2*MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { - ptr += MINBPC(enc); - break; - } - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_AMP: - case BT_LT: - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "%" */ - -static int PTRCALL -PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_PERCENT; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_PARAM_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_CR: case BT_LF: case BT_S: - case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: - *nextTokPtr = ptr; - return XML_TOK_POUND_NAME; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -XML_TOK_POUND_NAME; -} - -static int PTRCALL -PREFIX(scanLit)(int open, const ENCODING *enc, - const char *ptr, const char *end, - const char **nextTokPtr) -{ - while (ptr != end) { - int t = BYTE_TYPE(enc, ptr); - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUOT: - case BT_APOS: - ptr += MINBPC(enc); - if (t != open) - break; - if (ptr == end) - return -XML_TOK_LITERAL; - *nextTokPtr = ptr; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - case BT_GT: case BT_PERCNT: case BT_LSQB: - return XML_TOK_LITERAL; - default: - return XML_TOK_INVALID; - } - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - int tok; - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_QUOT: - return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_APOS: - return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LT: - { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_EXCL: - return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_NMSTRT: - case BT_HEX: - case BT_NONASCII: - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - *nextTokPtr = ptr - MINBPC(enc); - return XML_TOK_INSTANCE_START; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - case BT_CR: - if (ptr + MINBPC(enc) == end) { - *nextTokPtr = end; - /* indicate that this might be part of a CR/LF pair */ - return -XML_TOK_PROLOG_S; - } - /* fall through */ - case BT_S: case BT_LF: - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - break; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_LF: - break; - case BT_CR: - /* don't split CR/LF pair */ - if (ptr + MINBPC(enc) != end) - break; - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - } - } - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - case BT_PERCNT: - return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_COMMA: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMA; - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_BRACKET; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_BRACKET; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_COND_SECT_CLOSE; - } - } - *nextTokPtr = ptr; - return XML_TOK_CLOSE_BRACKET; - case BT_LPAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_PAREN; - case BT_RPAR: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_PAREN; - switch (BYTE_TYPE(enc, ptr)) { - case BT_AST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_ASTERISK; - case BT_QUEST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_QUESTION; - case BT_PLUS: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_PLUS; - case BT_CR: case BT_LF: case BT_S: - case BT_GT: case BT_COMMA: case BT_VERBAR: - case BT_RPAR: - *nextTokPtr = ptr; - return XML_TOK_CLOSE_PAREN; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_VERBAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OR; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DECL_CLOSE; - case BT_NUM: - return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NAME; \ - break; \ - } \ - if (IS_NAME_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NMTOKEN; \ - break; \ - } \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NMSTRT: - case BT_HEX: - tok = XML_TOK_NAME; - ptr += MINBPC(enc); - break; - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: -#ifdef XML_NS - case BT_COLON: -#endif - tok = XML_TOK_NMTOKEN; - ptr += MINBPC(enc); - break; - case BT_NONASCII: - if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NAME; - break; - } - if (IS_NAME_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NMTOKEN; - break; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: case BT_RPAR: case BT_COMMA: - case BT_VERBAR: case BT_LSQB: case BT_PERCNT: - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return tok; -#ifdef XML_NS - case BT_COLON: - ptr += MINBPC(enc); - switch (tok) { - case XML_TOK_NAME: - if (ptr == end) - return XML_TOK_PARTIAL; - tok = XML_TOK_PREFIXED_NAME; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - default: - tok = XML_TOK_NMTOKEN; - break; - } - break; - case XML_TOK_PREFIXED_NAME: - tok = XML_TOK_NMTOKEN; - break; - } - break; -#endif - case BT_PLUS: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_PLUS; - case BT_AST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_ASTERISK; - case BT_QUEST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_QUESTION; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -tok; -} - -static int PTRCALL -PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LT: - /* this is for inside entity references */ - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_S: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ATTRIBUTE_VALUE_S; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -static int PTRCALL -PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_PERCNT: - if (ptr == start) { - int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -#ifdef XML_DTD - -static int PTRCALL -PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int level = 0; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - end = ptr + n; - } - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_LT: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { - ++level; - ptr += MINBPC(enc); - } - } - break; - case BT_RSQB: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr += MINBPC(enc); - if (level == 0) { - *nextTokPtr = ptr; - return XML_TOK_IGNORE_SECT; - } - --level; - } - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -#endif /* XML_DTD */ - -static int PTRCALL -PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, - const char **badPtr) -{ - ptr += MINBPC(enc); - end -= MINBPC(enc); - for (; ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - case BT_MINUS: - case BT_APOS: - case BT_LPAR: - case BT_RPAR: - case BT_PLUS: - case BT_COMMA: - case BT_SOL: - case BT_EQUALS: - case BT_QUEST: - case BT_CR: - case BT_LF: - case BT_SEMI: - case BT_EXCL: - case BT_AST: - case BT_PERCNT: - case BT_NUM: -#ifdef XML_NS - case BT_COLON: -#endif - break; - case BT_S: - if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { - *badPtr = ptr; - return 0; - } - break; - case BT_NAME: - case BT_NMSTRT: - if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) - break; - default: - switch (BYTE_TO_ASCII(enc, ptr)) { - case 0x24: /* $ */ - case 0x40: /* @ */ - break; - default: - *badPtr = ptr; - return 0; - } - break; - } - } - return 1; -} - -/* This must only be called for a well-formed start-tag or empty - element tag. Returns the number of attributes. Pointers to the - first attsMax attributes are stored in atts. -*/ - -static int PTRCALL -PREFIX(getAtts)(const ENCODING *enc, const char *ptr, - int attsMax, ATTRIBUTE *atts) -{ - enum { other, inName, inValue } state = inName; - int nAtts = 0; - int open = 0; /* defined when state == inValue; - initialization just to shut up compilers */ - - for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { -#define START_NAME \ - if (state == other) { \ - if (nAtts < attsMax) { \ - atts[nAtts].name = ptr; \ - atts[nAtts].normalized = 1; \ - } \ - state = inName; \ - } -#define LEAD_CASE(n) \ - case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: - case BT_HEX: - START_NAME - break; -#undef START_NAME - case BT_QUOT: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_QUOT; - } - else if (open == BT_QUOT) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_APOS: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_APOS; - } - else if (open == BT_APOS) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_AMP: - if (nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_S: - if (state == inName) - state = other; - else if (state == inValue - && nAtts < attsMax - && atts[nAtts].normalized - && (ptr == atts[nAtts].valuePtr - || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE - || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE - || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) - atts[nAtts].normalized = 0; - break; - case BT_CR: case BT_LF: - /* This case ensures that the first attribute name is counted - Apart from that we could just change state on the quote. */ - if (state == inName) - state = other; - else if (state == inValue && nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_GT: - case BT_SOL: - if (state != inValue) - return nAtts; - break; - default: - break; - } - } - /* not reached */ -} - -static int PTRFASTCALL -PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) -{ - int result = 0; - /* skip &# */ - ptr += 2*MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_x)) { - for (ptr += MINBPC(enc); - !CHAR_MATCHES(enc, ptr, ASCII_SEMI); - ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - switch (c) { - case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: - case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: - result <<= 4; - result |= (c - ASCII_0); - break; - case ASCII_A: case ASCII_B: case ASCII_C: - case ASCII_D: case ASCII_E: case ASCII_F: - result <<= 4; - result += 10 + (c - ASCII_A); - break; - case ASCII_a: case ASCII_b: case ASCII_c: - case ASCII_d: case ASCII_e: case ASCII_f: - result <<= 4; - result += 10 + (c - ASCII_a); - break; - } - if (result >= 0x110000) - return -1; - } - } - else { - for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - result *= 10; - result += (c - ASCII_0); - if (result >= 0x110000) - return -1; - } - } - return checkCharRefNumber(result); -} - -static int PTRCALL -PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, - const char *end) -{ - switch ((end - ptr)/MINBPC(enc)) { - case 2: - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - return ASCII_LT; - case ASCII_g: - return ASCII_GT; - } - } - break; - case 3: - if (CHAR_MATCHES(enc, ptr, ASCII_a)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_m)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) - return ASCII_AMP; - } - } - break; - case 4: - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_q: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_u)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_t)) - return ASCII_QUOT; - } - } - break; - case ASCII_a: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_s)) - return ASCII_APOS; - } - } - break; - } - } - return 0; -} - -static int PTRCALL -PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr1)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (*ptr1++ != *ptr2++) \ - return 0; - LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) -#undef LEAD_CASE - /* fall through */ - if (*ptr1++ != *ptr2++) - return 0; - break; - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 1) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 2) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 3) { - if (*ptr2++ != *ptr1++) - return 0; - } - } - } - break; - default: - if (MINBPC(enc) == 1 && *ptr1 == *ptr2) - return 1; - switch (BYTE_TYPE(enc, ptr2)) { - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - return 0; - default: - return 1; - } - } - } - /* not reached */ -} - -static int PTRCALL -PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, - const char *end1, const char *ptr2) -{ - for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { - if (ptr1 == end1) - return 0; - if (!CHAR_MATCHES(enc, ptr1, *ptr2)) - return 0; - } - return ptr1 == end1; -} - -static int PTRFASTCALL -PREFIX(nameLength)(const ENCODING *enc, const char *ptr) -{ - const char *start = ptr; - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - ptr += MINBPC(enc); - break; - default: - return (int)(ptr - start); - } - } -} - -static const char * PTRFASTCALL -PREFIX(skipS)(const ENCODING *enc, const char *ptr) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_LF: - case BT_CR: - case BT_S: - ptr += MINBPC(enc); - break; - default: - return ptr; - } - } -} - -static void PTRCALL -PREFIX(updatePosition)(const ENCODING *enc, - const char *ptr, - const char *end, - POSITION *pos) -{ - while (ptr < end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_LF: - pos->columnNumber = (XML_Size)-1; - pos->lineNumber++; - ptr += MINBPC(enc); - break; - case BT_CR: - pos->lineNumber++; - ptr += MINBPC(enc); - if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - pos->columnNumber = (XML_Size)-1; - break; - default: - ptr += MINBPC(enc); - break; - } - pos->columnNumber++; - } -} - -#undef DO_LEAD_CASE -#undef MULTIBYTE_CASES -#undef INVALID_CASES -#undef CHECK_NAME_CASE -#undef CHECK_NAME_CASES -#undef CHECK_NMSTRT_CASE -#undef CHECK_NMSTRT_CASES - -#endif /* XML_TOK_IMPL_C */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h deleted file mode 100644 index da0ea60a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd -See the file COPYING for copying permission. -*/ - -enum { - BT_NONXML, - BT_MALFORM, - BT_LT, - BT_AMP, - BT_RSQB, - BT_LEAD2, - BT_LEAD3, - BT_LEAD4, - BT_TRAIL, - BT_CR, - BT_LF, - BT_GT, - BT_QUOT, - BT_APOS, - BT_EQUALS, - BT_QUEST, - BT_EXCL, - BT_SOL, - BT_SEMI, - BT_NUM, - BT_LSQB, - BT_S, - BT_NMSTRT, - BT_COLON, - BT_HEX, - BT_DIGIT, - BT_NAME, - BT_MINUS, - BT_OTHER, /* known not to be a name or name start character */ - BT_NONASCII, /* might be a name or name start character */ - BT_PERCNT, - BT_LPAR, - BT_RPAR, - BT_AST, - BT_PLUS, - BT_COMMA, - BT_VERBAR -}; - -#include diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c deleted file mode 100644 index c3b88fdf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_NS_C - -const ENCODING * -NS(XmlGetUtf8InternalEncoding)(void) -{ - return &ns(internal_utf8_encoding).enc; -} - -const ENCODING * -NS(XmlGetUtf16InternalEncoding)(void) -{ -#if BYTEORDER == 1234 - return &ns(internal_little2_encoding).enc; -#elif BYTEORDER == 4321 - return &ns(internal_big2_encoding).enc; -#else - const short n = 1; - return (*(const char *)&n - ? &ns(internal_little2_encoding).enc - : &ns(internal_big2_encoding).enc); -#endif -} - -static const ENCODING * const NS(encodings)[] = { - &ns(latin1_encoding).enc, - &ns(ascii_encoding).enc, - &ns(utf8_encoding).enc, - &ns(big2_encoding).enc, - &ns(big2_encoding).enc, - &ns(little2_encoding).enc, - &ns(utf8_encoding).enc /* NO_ENC */ -}; - -static int PTRCALL -NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_PROLOG_STATE, ptr, end, nextTokPtr); -} - -static int PTRCALL -NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_CONTENT_STATE, ptr, end, nextTokPtr); -} - -int -NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, - const char *name) -{ - int i = getEncodingIndex(name); - if (i == UNKNOWN_ENC) - return 0; - SET_INIT_ENC_INDEX(p, i); - p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); - p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); - p->initEnc.updatePosition = initUpdatePosition; - p->encPtr = encPtr; - *encPtr = &(p->initEnc); - return 1; -} - -static const ENCODING * -NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) -{ -#define ENCODING_MAX 128 - char buf[ENCODING_MAX]; - char *p = buf; - int i; - XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); - if (ptr != end) - return 0; - *p = 0; - if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) - return enc; - i = getEncodingIndex(buf); - if (i == UNKNOWN_ENC) - return 0; - return NS(encodings)[i]; -} - -int -NS(XmlParseXmlDecl)(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - return doParseXmlDecl(NS(findEncoding), - isGeneralTextEntity, - enc, - ptr, - end, - badPtr, - versionPtr, - versionEndPtr, - encodingName, - encoding, - standalone); -} - -#endif /* XML_TOK_NS_C */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c deleted file mode 100644 index 57e48ff2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include "codepage.h" - -#if (defined(WIN32) || (defined(__WATCOMC__) && defined(__NT__))) -#define STRICT 1 -#define WIN32_LEAN_AND_MEAN 1 - -#include - -int -codepageMap(int cp, int *map) -{ - int i; - CPINFO info; - if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2) - return 0; - for (i = 0; i < 256; i++) - map[i] = -1; - if (info.MaxCharSize > 1) { - for (i = 0; i < MAX_LEADBYTES; i+=2) { - int j, lim; - if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0) - break; - lim = info.LeadByte[i + 1]; - for (j = info.LeadByte[i]; j <= lim; j++) - map[j] = -2; - } - } - for (i = 0; i < 256; i++) { - if (map[i] == -1) { - char c = (char)i; - unsigned short n; - if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, - &c, 1, &n, 1) == 1) - map[i] = n; - } - } - return 1; -} - -int -codepageConvert(int cp, const char *p) -{ - unsigned short c; - if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, - p, 2, &c, 1) == 1) - return c; - return -1; -} - -#else /* not WIN32 */ - -int -codepageMap(int cp, int *map) -{ - return 0; -} - -int -codepageConvert(int cp, const char *p) -{ - return -1; -} - -#endif /* not WIN32 */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h deleted file mode 100644 index 6a4df688..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -int codepageMap(int cp, int *map); -int codepageConvert(int cp, const char *p); diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c deleted file mode 100644 index 95903a34..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c +++ /dev/null @@ -1,147 +0,0 @@ -#define CHARSET_MAX 41 - -static const char * -getTok(const char **pp) -{ - enum { inAtom, inString, init, inComment }; - int state = init; - const char *tokStart = 0; - for (;;) { - switch (**pp) { - case '\0': - return 0; - case ' ': - case '\r': - case '\t': - case '\n': - if (state == inAtom) - return tokStart; - break; - case '(': - if (state == inAtom) - return tokStart; - if (state != inString) - state++; - break; - case ')': - if (state > init) - --state; - else if (state != inString) - return 0; - break; - case ';': - case '/': - case '=': - if (state == inAtom) - return tokStart; - if (state == init) - return (*pp)++; - break; - case '\\': - ++*pp; - if (**pp == '\0') - return 0; - break; - case '"': - switch (state) { - case inString: - ++*pp; - return tokStart; - case inAtom: - return tokStart; - case init: - tokStart = *pp; - state = inString; - break; - } - break; - default: - if (state == init) { - tokStart = *pp; - state = inAtom; - } - break; - } - ++*pp; - } - /* not reached */ -} - -/* key must be lowercase ASCII */ - -static int -matchkey(const char *start, const char *end, const char *key) -{ - if (!start) - return 0; - for (; start != end; start++, key++) - if (*start != *key && *start != 'A' + (*key - 'a')) - return 0; - return *key == '\0'; -} - -void -getXMLCharset(const char *buf, char *charset) -{ - const char *next, *p; - - charset[0] = '\0'; - next = buf; - p = getTok(&next); - if (matchkey(p, next, "text")) - strcpy(charset, "us-ascii"); - else if (!matchkey(p, next, "application")) - return; - p = getTok(&next); - if (!p || *p != '/') - return; - p = getTok(&next); - if (matchkey(p, next, "xml")) - isXml = 1; - p = getTok(&next); - while (p) { - if (*p == ';') { - p = getTok(&next); - if (matchkey(p, next, "charset")) { - p = getTok(&next); - if (p && *p == '=') { - p = getTok(&next); - if (p) { - char *s = charset; - if (*p == '"') { - while (++p != next - 1) { - if (*p == '\\') - ++p; - if (s == charset + CHARSET_MAX - 1) { - charset[0] = '\0'; - break; - } - *s++ = *p; - } - *s++ = '\0'; - } - else { - if (next - p > CHARSET_MAX - 1) - break; - while (p != next) - *s++ = *p++; - *s = 0; - break; - } - } - } - } - } - else - p = getTok(&next); - } -} - -int -main(int argc, char **argv) -{ - char buf[CHARSET_MAX]; - getXMLCharset(argv[1], buf); - printf("charset = \"%s\"\n", buf); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h deleted file mode 100644 index 814edec2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include - -#ifdef XML_UNICODE -int filemap(const wchar_t *name, - void (*processor)(const void *, size_t, - const wchar_t *, void *arg), - void *arg); -#else -int filemap(const char *name, - void (*processor)(const void *, size_t, - const char *, void *arg), - void *arg); -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c deleted file mode 100644 index bd32b934..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include -#include -#include -#include - -#ifdef __WATCOMC__ -#ifndef __LINUX__ -#include -#else -#include -#endif -#endif - -#ifdef __BEOS__ -#include -#endif - -#ifndef S_ISREG -#ifndef S_IFREG -#define S_IFREG _S_IFREG -#endif -#ifndef S_IFMT -#define S_IFMT _S_IFMT -#endif -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif /* not S_ISREG */ - -#ifndef O_BINARY -#ifdef _O_BINARY -#define O_BINARY _O_BINARY -#else -#define O_BINARY 0 -#endif -#endif - -#include "filemap.h" - -int -filemap(const char *name, - void (*processor)(const void *, size_t, const char *, void *arg), - void *arg) -{ - size_t nbytes; - int fd; - int n; - struct stat sb; - void *p; - - fd = open(name, O_RDONLY|O_BINARY); - if (fd < 0) { - perror(name); - return 0; - } - if (fstat(fd, &sb) < 0) { - perror(name); - close(fd); - return 0; - } - if (!S_ISREG(sb.st_mode)) { - fprintf(stderr, "%s: not a regular file\n", name); - close(fd); - return 0; - } - nbytes = sb.st_size; - /* malloc will return NULL with nbytes == 0, handle files with size 0 */ - if (nbytes == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - close(fd); - return 1; - } - p = malloc(nbytes); - if (!p) { - fprintf(stderr, "%s: out of memory\n", name); - close(fd); - return 0; - } - n = read(fd, p, nbytes); - if (n < 0) { - perror(name); - free(p); - close(fd); - return 0; - } - if (n != nbytes) { - fprintf(stderr, "%s: read unexpected number of bytes\n", name); - free(p); - close(fd); - return 0; - } - processor(p, nbytes, name, arg); - free(p); - close(fd); - return 1; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c deleted file mode 100644 index 93adce32..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef MAP_FILE -#define MAP_FILE 0 -#endif - -#include "filemap.h" - -int -filemap(const char *name, - void (*processor)(const void *, size_t, const char *, void *arg), - void *arg) -{ - int fd; - size_t nbytes; - struct stat sb; - void *p; - - fd = open(name, O_RDONLY); - if (fd < 0) { - perror(name); - return 0; - } - if (fstat(fd, &sb) < 0) { - perror(name); - close(fd); - return 0; - } - if (!S_ISREG(sb.st_mode)) { - close(fd); - fprintf(stderr, "%s: not a regular file\n", name); - return 0; - } - - nbytes = sb.st_size; - /* mmap fails for zero length files */ - if (nbytes == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - close(fd); - return 1; - } - p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ, - MAP_FILE|MAP_PRIVATE, fd, (off_t)0); - if (p == (void *)-1) { - perror(name); - close(fd); - return 0; - } - processor(p, nbytes, name, arg); - munmap((caddr_t)p, nbytes); - close(fd); - return 1; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c deleted file mode 100644 index 41dc35b6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define STRICT 1 -#define WIN32_LEAN_AND_MEAN 1 - -#ifdef XML_UNICODE_WCHAR_T -#ifndef XML_UNICODE -#define XML_UNICODE -#endif -#endif - -#ifdef XML_UNICODE -#define UNICODE -#define _UNICODE -#endif /* XML_UNICODE */ -#include -#include -#include -#include "filemap.h" - -static void win32perror(const TCHAR *); - -int -filemap(const TCHAR *name, - void (*processor)(const void *, size_t, const TCHAR *, void *arg), - void *arg) -{ - HANDLE f; - HANDLE m; - DWORD size; - DWORD sizeHi; - void *p; - - f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN, NULL); - if (f == INVALID_HANDLE_VALUE) { - win32perror(name); - return 0; - } - size = GetFileSize(f, &sizeHi); - if (size == (DWORD)-1) { - win32perror(name); - return 0; - } - if (sizeHi) { - _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name); - return 0; - } - /* CreateFileMapping barfs on zero length files */ - if (size == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - CloseHandle(f); - return 1; - } - m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); - if (m == NULL) { - win32perror(name); - CloseHandle(f); - return 0; - } - p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); - if (p == NULL) { - win32perror(name); - CloseHandle(m); - CloseHandle(f); - return 0; - } - processor(p, size, name, arg); - UnmapViewOfFile(p); - CloseHandle(m); - CloseHandle(f); - return 1; -} - -static void -win32perror(const TCHAR *s) -{ - LPVOID buf; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL)) { - _ftprintf(stderr, _T("%s: %s"), s, buf); - fflush(stderr); - LocalFree(buf); - } - else - _ftprintf(stderr, _T("%s: unknown Windows error\n"), s); -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c deleted file mode 100644 index 99eeeaae..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c +++ /dev/null @@ -1,244 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include -#include -#include -#include - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -#include -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat.h" -#include "xmlfile.h" -#include "xmltchar.h" -#include "filemap.h" - -#if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__))) -#include -#endif - -#if defined(__amigaos__) && defined(__USE_INLINE__) -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifndef O_BINARY -#ifdef _O_BINARY -#define O_BINARY _O_BINARY -#else -#define O_BINARY 0 -#endif -#endif - -#ifdef _DEBUG -#define READ_SIZE 16 -#else -#define READ_SIZE (1024*8) -#endif - - -typedef struct { - XML_Parser parser; - int *retPtr; -} PROCESS_ARGS; - -static void -reportError(XML_Parser parser, const XML_Char *filename) -{ - enum XML_Error code = XML_GetErrorCode(parser); - const XML_Char *message = XML_ErrorString(code); - if (message) - ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"), - filename, - XML_GetErrorLineNumber(parser), - XML_GetErrorColumnNumber(parser), - message); - else - ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code); -} - -/* This implementation will give problems on files larger than INT_MAX. */ -static void -processFile(const void *data, size_t size, - const XML_Char *filename, void *args) -{ - XML_Parser parser = ((PROCESS_ARGS *)args)->parser; - int *retPtr = ((PROCESS_ARGS *)args)->retPtr; - if (XML_Parse(parser, (const char *)data, (int)size, 1) == XML_STATUS_ERROR) { - reportError(parser, filename); - *retPtr = 0; - } - else - *retPtr = 1; -} - -#if (defined(WIN32) || defined(__WATCOMC__)) - -static int -isAsciiLetter(XML_Char c) -{ - return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); -} - -#endif /* WIN32 */ - -static const XML_Char * -resolveSystemId(const XML_Char *base, const XML_Char *systemId, - XML_Char **toFree) -{ - XML_Char *s; - *toFree = 0; - if (!base - || *systemId == T('/') -#if (defined(WIN32) || defined(__WATCOMC__)) - || *systemId == T('\\') - || (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) -#endif - ) - return systemId; - *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2) - * sizeof(XML_Char)); - if (!*toFree) - return systemId; - tcscpy(*toFree, base); - s = *toFree; - if (tcsrchr(s, T('/'))) - s = tcsrchr(s, T('/')) + 1; -#if (defined(WIN32) || defined(__WATCOMC__)) - if (tcsrchr(s, T('\\'))) - s = tcsrchr(s, T('\\')) + 1; -#endif - tcscpy(s, systemId); - return *toFree; -} - -static int -externalEntityRefFilemap(XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - int result; - XML_Char *s; - const XML_Char *filename; - XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); - PROCESS_ARGS args; - args.retPtr = &result; - args.parser = entParser; - filename = resolveSystemId(base, systemId, &s); - XML_SetBase(entParser, filename); - if (!filemap(filename, processFile, &args)) - result = 0; - free(s); - XML_ParserFree(entParser); - return result; -} - -static int -processStream(const XML_Char *filename, XML_Parser parser) -{ - /* passing NULL for filename means read intput from stdin */ - int fd = 0; /* 0 is the fileno for stdin */ - - if (filename != NULL) { - fd = topen(filename, O_BINARY|O_RDONLY); - if (fd < 0) { - tperror(filename); - return 0; - } - } - for (;;) { - int nread; - char *buf = (char *)XML_GetBuffer(parser, READ_SIZE); - if (!buf) { - if (filename != NULL) - close(fd); - ftprintf(stderr, T("%s: out of memory\n"), - filename != NULL ? filename : "xmlwf"); - return 0; - } - nread = read(fd, buf, READ_SIZE); - if (nread < 0) { - tperror(filename != NULL ? filename : "STDIN"); - if (filename != NULL) - close(fd); - return 0; - } - if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) { - reportError(parser, filename != NULL ? filename : "STDIN"); - if (filename != NULL) - close(fd); - return 0; - } - if (nread == 0) { - if (filename != NULL) - close(fd); - break;; - } - } - return 1; -} - -static int -externalEntityRefStream(XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Char *s; - const XML_Char *filename; - int ret; - XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); - filename = resolveSystemId(base, systemId, &s); - XML_SetBase(entParser, filename); - ret = processStream(filename, entParser); - free(s); - XML_ParserFree(entParser); - return ret; -} - -int -XML_ProcessFile(XML_Parser parser, - const XML_Char *filename, - unsigned flags) -{ - int result; - - if (!XML_SetBase(parser, filename)) { - ftprintf(stderr, T("%s: out of memory"), filename); - exit(1); - } - - if (flags & XML_EXTERNAL_ENTITIES) - XML_SetExternalEntityRefHandler(parser, - (flags & XML_MAP_FILE) - ? externalEntityRefFilemap - : externalEntityRefStream); - if (flags & XML_MAP_FILE) { - PROCESS_ARGS args; - args.retPtr = &result; - args.parser = parser; - if (!filemap(filename, processFile, &args)) - result = 0; - } - else - result = processStream(filename, parser); - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h deleted file mode 100644 index d093ecc0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define XML_MAP_FILE 01 -#define XML_EXTERNAL_ENTITIES 02 - -#ifdef XML_LARGE_SIZE -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -#define XML_FMT_INT_MOD "I64" -#else -#define XML_FMT_INT_MOD "ll" -#endif -#else -#define XML_FMT_INT_MOD "l" -#endif - -extern int XML_ProcessFile(XML_Parser parser, - const XML_Char *filename, - unsigned flags); diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c deleted file mode 100644 index 56a0e7f4..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include "xmlmime.h" - -static const char * -getTok(const char **pp) -{ - /* inComment means one level of nesting; inComment+1 means two levels etc */ - enum { inAtom, inString, init, inComment }; - int state = init; - const char *tokStart = 0; - for (;;) { - switch (**pp) { - case '\0': - if (state == inAtom) - return tokStart; - return 0; - case ' ': - case '\r': - case '\t': - case '\n': - if (state == inAtom) - return tokStart; - break; - case '(': - if (state == inAtom) - return tokStart; - if (state != inString) - state++; - break; - case ')': - if (state > init) - --state; - else if (state != inString) - return 0; - break; - case ';': - case '/': - case '=': - if (state == inAtom) - return tokStart; - if (state == init) - return (*pp)++; - break; - case '\\': - ++*pp; - if (**pp == '\0') - return 0; - break; - case '"': - switch (state) { - case inString: - ++*pp; - return tokStart; - case inAtom: - return tokStart; - case init: - tokStart = *pp; - state = inString; - break; - } - break; - default: - if (state == init) { - tokStart = *pp; - state = inAtom; - } - break; - } - ++*pp; - } - /* not reached */ -} - -/* key must be lowercase ASCII */ - -static int -matchkey(const char *start, const char *end, const char *key) -{ - if (!start) - return 0; - for (; start != end; start++, key++) - if (*start != *key && *start != 'A' + (*key - 'a')) - return 0; - return *key == '\0'; -} - -void -getXMLCharset(const char *buf, char *charset) -{ - const char *next, *p; - - charset[0] = '\0'; - next = buf; - p = getTok(&next); - if (matchkey(p, next, "text")) - strcpy(charset, "us-ascii"); - else if (!matchkey(p, next, "application")) - return; - p = getTok(&next); - if (!p || *p != '/') - return; - p = getTok(&next); -#if 0 - if (!matchkey(p, next, "xml") && charset[0] == '\0') - return; -#endif - p = getTok(&next); - while (p) { - if (*p == ';') { - p = getTok(&next); - if (matchkey(p, next, "charset")) { - p = getTok(&next); - if (p && *p == '=') { - p = getTok(&next); - if (p) { - char *s = charset; - if (*p == '"') { - while (++p != next - 1) { - if (*p == '\\') - ++p; - if (s == charset + CHARSET_MAX - 1) { - charset[0] = '\0'; - break; - } - *s++ = *p; - } - *s++ = '\0'; - } - else { - if (next - p > CHARSET_MAX - 1) - break; - while (p != next) - *s++ = *p++; - *s = 0; - break; - } - } - } - break; - } - } - else - p = getTok(&next); - } -} - -#ifdef TEST - -#include - -int -main(int argc, char *argv[]) -{ - char buf[CHARSET_MAX]; - if (argc <= 1) - return 1; - printf("%s\n", argv[1]); - getXMLCharset(argv[1], buf); - printf("charset=\"%s\"\n", buf); - return 0; -} - -#endif /* TEST */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h deleted file mode 100644 index bf0356df..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -/* Registered charset names are at most 40 characters long. */ - -#define CHARSET_MAX 41 - -/* Figure out the charset to use from the ContentType. - buf contains the body of the header field (the part after "Content-Type:"). - charset gets the charset to use. It must be at least CHARSET_MAX chars - long. charset will be empty if the default charset should be used. -*/ - -void getXMLCharset(const char *buf, char *charset); - -#ifdef __cplusplus -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h deleted file mode 100644 index 10885755..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifdef XML_UNICODE -#ifndef XML_UNICODE_WCHAR_T -#error xmlwf requires a 16-bit Unicode-compatible wchar_t -#endif -#define T(x) L ## x -#define ftprintf fwprintf -#define tfopen _wfopen -#define fputts fputws -#define puttc putwc -#define tcscmp wcscmp -#define tcscpy wcscpy -#define tcscat wcscat -#define tcschr wcschr -#define tcsrchr wcsrchr -#define tcslen wcslen -#define tperror _wperror -#define topen _wopen -#define tmain wmain -#define tremove _wremove -#else /* not XML_UNICODE */ -#define T(x) x -#define ftprintf fprintf -#define tfopen fopen -#define fputts fputs -#define puttc putc -#define tcscmp strcmp -#define tcscpy strcpy -#define tcscat strcat -#define tcschr strchr -#define tcsrchr strrchr -#define tcslen strlen -#define tperror perror -#define topen open -#define tmain main -#define tremove remove -#endif /* not XML_UNICODE */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h deleted file mode 100644 index d329913a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -int XML_URLInit(); -void XML_URLUninit(); -int XML_ProcessURL(XML_Parser parser, - const XML_Char *url, - unsigned flags); - -#ifdef __cplusplus -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c deleted file mode 100644 index 4fc77da9..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c +++ /dev/null @@ -1,861 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include -#include -#include - -#include "expat.h" -#include "codepage.h" -#include "xmlfile.h" -#include "xmltchar.h" - -#ifdef _MSC_VER -#include -#endif - -#if defined(__amigaos__) && defined(__USE_INLINE__) -#include -#endif - -/* This ensures proper sorting. */ - -#define NSSEP T('\001') - -static void XMLCALL -characterData(void *userData, const XML_Char *s, int len) -{ - FILE *fp = (FILE *)userData; - for (; len > 0; --len, ++s) { - switch (*s) { - case T('&'): - fputts(T("&"), fp); - break; - case T('<'): - fputts(T("<"), fp); - break; - case T('>'): - fputts(T(">"), fp); - break; -#ifdef W3C14N - case 13: - fputts(T(" "), fp); - break; -#else - case T('"'): - fputts(T("""), fp); - break; - case 9: - case 10: - case 13: - ftprintf(fp, T("&#%d;"), *s); - break; -#endif - default: - puttc(*s, fp); - break; - } - } -} - -static void -attributeValue(FILE *fp, const XML_Char *s) -{ - puttc(T('='), fp); - puttc(T('"'), fp); - for (;;) { - switch (*s) { - case 0: - case NSSEP: - puttc(T('"'), fp); - return; - case T('&'): - fputts(T("&"), fp); - break; - case T('<'): - fputts(T("<"), fp); - break; - case T('"'): - fputts(T("""), fp); - break; -#ifdef W3C14N - case 9: - fputts(T(" "), fp); - break; - case 10: - fputts(T(" "), fp); - break; - case 13: - fputts(T(" "), fp); - break; -#else - case T('>'): - fputts(T(">"), fp); - break; - case 9: - case 10: - case 13: - ftprintf(fp, T("&#%d;"), *s); - break; -#endif - default: - puttc(*s, fp); - break; - } - s++; - } -} - -/* Lexicographically comparing UTF-8 encoded attribute values, -is equivalent to lexicographically comparing based on the character number. */ - -static int -attcmp(const void *att1, const void *att2) -{ - return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2); -} - -static void XMLCALL -startElement(void *userData, const XML_Char *name, const XML_Char **atts) -{ - int nAtts; - const XML_Char **p; - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - fputts(name, fp); - - p = atts; - while (*p) - ++p; - nAtts = (int)((p - atts) >> 1); - if (nAtts > 1) - qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp); - while (*atts) { - puttc(T(' '), fp); - fputts(*atts++, fp); - attributeValue(fp, *atts); - atts++; - } - puttc(T('>'), fp); -} - -static void XMLCALL -endElement(void *userData, const XML_Char *name) -{ - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - puttc(T('/'), fp); - fputts(name, fp); - puttc(T('>'), fp); -} - -static int -nsattcmp(const void *p1, const void *p2) -{ - const XML_Char *att1 = *(const XML_Char **)p1; - const XML_Char *att2 = *(const XML_Char **)p2; - int sep1 = (tcsrchr(att1, NSSEP) != 0); - int sep2 = (tcsrchr(att1, NSSEP) != 0); - if (sep1 != sep2) - return sep1 - sep2; - return tcscmp(att1, att2); -} - -static void XMLCALL -startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) -{ - int nAtts; - int nsi; - const XML_Char **p; - FILE *fp = (FILE *)userData; - const XML_Char *sep; - puttc(T('<'), fp); - - sep = tcsrchr(name, NSSEP); - if (sep) { - fputts(T("n1:"), fp); - fputts(sep + 1, fp); - fputts(T(" xmlns:n1"), fp); - attributeValue(fp, name); - nsi = 2; - } - else { - fputts(name, fp); - nsi = 1; - } - - p = atts; - while (*p) - ++p; - nAtts = (int)((p - atts) >> 1); - if (nAtts > 1) - qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp); - while (*atts) { - name = *atts++; - sep = tcsrchr(name, NSSEP); - puttc(T(' '), fp); - if (sep) { - ftprintf(fp, T("n%d:"), nsi); - fputts(sep + 1, fp); - } - else - fputts(name, fp); - attributeValue(fp, *atts); - if (sep) { - ftprintf(fp, T(" xmlns:n%d"), nsi++); - attributeValue(fp, name); - } - atts++; - } - puttc(T('>'), fp); -} - -static void XMLCALL -endElementNS(void *userData, const XML_Char *name) -{ - FILE *fp = (FILE *)userData; - const XML_Char *sep; - puttc(T('<'), fp); - puttc(T('/'), fp); - sep = tcsrchr(name, NSSEP); - if (sep) { - fputts(T("n1:"), fp); - fputts(sep + 1, fp); - } - else - fputts(name, fp); - puttc(T('>'), fp); -} - -#ifndef W3C14N - -static void XMLCALL -processingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - puttc(T('?'), fp); - fputts(target, fp); - puttc(T(' '), fp); - fputts(data, fp); - puttc(T('?'), fp); - puttc(T('>'), fp); -} - -#endif /* not W3C14N */ - -static void XMLCALL -defaultCharacterData(void *userData, const XML_Char *s, int len) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultStartElement(void *userData, const XML_Char *name, - const XML_Char **atts) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultEndElement(void *userData, const XML_Char *name) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -nopCharacterData(void *userData, const XML_Char *s, int len) -{ -} - -static void XMLCALL -nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts) -{ -} - -static void XMLCALL -nopEndElement(void *userData, const XML_Char *name) -{ -} - -static void XMLCALL -nopProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ -} - -static void XMLCALL -markup(void *userData, const XML_Char *s, int len) -{ - FILE *fp = (FILE *)XML_GetUserData((XML_Parser) userData); - for (; len > 0; --len, ++s) - puttc(*s, fp); -} - -static void -metaLocation(XML_Parser parser) -{ - const XML_Char *uri = XML_GetBase(parser); - if (uri) - ftprintf((FILE *)XML_GetUserData(parser), T(" uri=\"%s\""), uri); - ftprintf((FILE *)XML_GetUserData(parser), - T(" byte=\"%" XML_FMT_INT_MOD "d\" nbytes=\"%d\" \ - line=\"%" XML_FMT_INT_MOD "u\" col=\"%" XML_FMT_INT_MOD "u\""), - XML_GetCurrentByteIndex(parser), - XML_GetCurrentByteCount(parser), - XML_GetCurrentLineNumber(parser), - XML_GetCurrentColumnNumber(parser)); -} - -static void -metaStartDocument(void *userData) -{ - fputts(T("\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); -} - -static void -metaEndDocument(void *userData) -{ - fputts(T("\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); -} - -static void XMLCALL -metaStartElement(void *userData, const XML_Char *name, - const XML_Char **atts) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - const XML_Char **specifiedAttsEnd - = atts + XML_GetSpecifiedAttributeCount(parser); - const XML_Char **idAttPtr; - int idAttIndex = XML_GetIdAttributeIndex(parser); - if (idAttIndex < 0) - idAttPtr = 0; - else - idAttPtr = atts + idAttIndex; - - ftprintf(fp, T("\n"), fp); - do { - ftprintf(fp, T("= specifiedAttsEnd) - fputts(T("\" defaulted=\"yes\"/>\n"), fp); - else if (atts == idAttPtr) - fputts(T("\" id=\"yes\"/>\n"), fp); - else - fputts(T("\"/>\n"), fp); - } while (*(atts += 2)); - fputts(T("\n"), fp); - } - else - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndElement(void *userData, const XML_Char *name) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("\n"), fp); -} - -static void XMLCALL -metaProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("\n"), fp); -} - -static void XMLCALL -metaComment(void *userData, const XML_Char *data) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); -} - -static void XMLCALL -metaStartCdataSection(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); -} - -static void XMLCALL -metaEndCdataSection(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); -} - -static void XMLCALL -metaCharacterData(void *userData, const XML_Char *s, int len) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); -} - -static void XMLCALL -metaStartDoctypeDecl(void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("\n"), fp); -} - -static void XMLCALL -metaEndDoctypeDecl(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); -} - -static void XMLCALL -metaNotationDecl(void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("\n"), fp); -} - - -static void XMLCALL -metaEntityDecl(void *userData, - const XML_Char *entityName, - int is_param, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - - if (value) { - ftprintf(fp, T("'), fp); - characterData(fp, value, value_length); - fputts(T("\n"), fp); - } - else if (notationName) { - ftprintf(fp, T("\n"), fp); - } - else { - ftprintf(fp, T("\n"), fp); - } -} - -static void XMLCALL -metaStartNamespaceDecl(void *userData, - const XML_Char *prefix, - const XML_Char *uri) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("\n"), fp); - } - else - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndNamespaceDecl(void *userData, const XML_Char *prefix) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - if (!prefix) - fputts(T("\n"), fp); - else - ftprintf(fp, T("\n"), prefix); -} - -static int XMLCALL -unknownEncodingConvert(void *data, const char *p) -{ - return codepageConvert(*(int *)data, p); -} - -static int XMLCALL -unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info) -{ - int cp; - static const XML_Char prefixL[] = T("windows-"); - static const XML_Char prefixU[] = T("WINDOWS-"); - int i; - - for (i = 0; prefixU[i]; i++) - if (name[i] != prefixU[i] && name[i] != prefixL[i]) - return 0; - - cp = 0; - for (; name[i]; i++) { - static const XML_Char digits[] = T("0123456789"); - const XML_Char *s = tcschr(digits, name[i]); - if (!s) - return 0; - cp *= 10; - cp += (int)(s - digits); - if (cp >= 0x10000) - return 0; - } - if (!codepageMap(cp, info->map)) - return 0; - info->convert = unknownEncodingConvert; - /* We could just cast the code page integer to a void *, - and avoid the use of release. */ - info->release = free; - info->data = malloc(sizeof(int)); - if (!info->data) - return 0; - *(int *)info->data = cp; - return 1; -} - -static int XMLCALL -notStandalone(void *userData) -{ - return 0; -} - -static void -showVersion(XML_Char *prog) -{ - XML_Char *s = prog; - XML_Char ch; - const XML_Feature *features = XML_GetFeatureList(); - while ((ch = *s) != 0) { - if (ch == '/' -#if (defined(WIN32) || defined(__WATCOMC__)) - || ch == '\\' -#endif - ) - prog = s + 1; - ++s; - } - ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion()); - if (features != NULL && features[0].feature != XML_FEATURE_END) { - int i = 1; - ftprintf(stdout, T("%s"), features[0].name); - if (features[0].value) - ftprintf(stdout, T("=%ld"), features[0].value); - while (features[i].feature != XML_FEATURE_END) { - ftprintf(stdout, T(", %s"), features[i].name); - if (features[i].value) - ftprintf(stdout, T("=%ld"), features[i].value); - ++i; - } - ftprintf(stdout, T("\n")); - } -} - -static void -usage(const XML_Char *prog, int rc) -{ - ftprintf(stderr, - T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] " - "[-e encoding] file ...\n"), prog); - exit(rc); -} - -int -tmain(int argc, XML_Char **argv) -{ - int i, j; - const XML_Char *outputDir = NULL; - const XML_Char *encoding = NULL; - unsigned processFlags = XML_MAP_FILE; - int windowsCodePages = 0; - int outputType = 0; - int useNamespaces = 0; - int requireStandalone = 0; - enum XML_ParamEntityParsing paramEntityParsing = - XML_PARAM_ENTITY_PARSING_NEVER; - int useStdin = 0; - -#ifdef _MSC_VER - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); -#endif - - i = 1; - j = 0; - while (i < argc) { - if (j == 0) { - if (argv[i][0] != T('-')) - break; - if (argv[i][1] == T('-') && argv[i][2] == T('\0')) { - i++; - break; - } - j++; - } - switch (argv[i][j]) { - case T('r'): - processFlags &= ~XML_MAP_FILE; - j++; - break; - case T('s'): - requireStandalone = 1; - j++; - break; - case T('n'): - useNamespaces = 1; - j++; - break; - case T('p'): - paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS; - /* fall through */ - case T('x'): - processFlags |= XML_EXTERNAL_ENTITIES; - j++; - break; - case T('w'): - windowsCodePages = 1; - j++; - break; - case T('m'): - outputType = 'm'; - j++; - break; - case T('c'): - outputType = 'c'; - useNamespaces = 0; - j++; - break; - case T('t'): - outputType = 't'; - j++; - break; - case T('d'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 2); - outputDir = argv[i]; - } - else - outputDir = argv[i] + j + 1; - i++; - j = 0; - break; - case T('e'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 2); - encoding = argv[i]; - } - else - encoding = argv[i] + j + 1; - i++; - j = 0; - break; - case T('h'): - usage(argv[0], 0); - return 0; - case T('v'): - showVersion(argv[0]); - return 0; - case T('\0'): - if (j > 1) { - i++; - j = 0; - break; - } - /* fall through */ - default: - usage(argv[0], 2); - } - } - if (i == argc) { - useStdin = 1; - processFlags &= ~XML_MAP_FILE; - i--; - } - for (; i < argc; i++) { - FILE *fp = 0; - XML_Char *outName = 0; - int result; - XML_Parser parser; - if (useNamespaces) - parser = XML_ParserCreateNS(encoding, NSSEP); - else - parser = XML_ParserCreate(encoding); - if (requireStandalone) - XML_SetNotStandaloneHandler(parser, notStandalone); - XML_SetParamEntityParsing(parser, paramEntityParsing); - if (outputType == 't') { - /* This is for doing timings; this gives a more realistic estimate of - the parsing time. */ - outputDir = 0; - XML_SetElementHandler(parser, nopStartElement, nopEndElement); - XML_SetCharacterDataHandler(parser, nopCharacterData); - XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction); - } - else if (outputDir) { - const XML_Char * delim = T("/"); - const XML_Char *file = useStdin ? T("STDIN") : argv[i]; - if (!useStdin) { - /* Jump after last (back)slash */ - const XML_Char * lastDelim = tcsrchr(file, delim[0]); - if (lastDelim) - file = lastDelim + 1; -#if (defined(WIN32) || defined(__WATCOMC__)) - else { - const XML_Char * winDelim = T("\\"); - lastDelim = tcsrchr(file, winDelim[0]); - if (lastDelim) { - file = lastDelim + 1; - delim = winDelim; - } - } -#endif - } - outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2) - * sizeof(XML_Char)); - tcscpy(outName, outputDir); - tcscat(outName, delim); - tcscat(outName, file); - fp = tfopen(outName, T("wb")); - if (!fp) { - tperror(outName); - exit(1); - } - setvbuf(fp, NULL, _IOFBF, 16384); -#ifdef XML_UNICODE - puttc(0xFEFF, fp); -#endif - XML_SetUserData(parser, fp); - switch (outputType) { - case 'm': - XML_UseParserAsHandlerArg(parser); - XML_SetElementHandler(parser, metaStartElement, metaEndElement); - XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction); - XML_SetCommentHandler(parser, metaComment); - XML_SetCdataSectionHandler(parser, metaStartCdataSection, - metaEndCdataSection); - XML_SetCharacterDataHandler(parser, metaCharacterData); - XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, - metaEndDoctypeDecl); - XML_SetEntityDeclHandler(parser, metaEntityDecl); - XML_SetNotationDeclHandler(parser, metaNotationDecl); - XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, - metaEndNamespaceDecl); - metaStartDocument(parser); - break; - case 'c': - XML_UseParserAsHandlerArg(parser); - XML_SetDefaultHandler(parser, markup); - XML_SetElementHandler(parser, defaultStartElement, defaultEndElement); - XML_SetCharacterDataHandler(parser, defaultCharacterData); - XML_SetProcessingInstructionHandler(parser, - defaultProcessingInstruction); - break; - default: - if (useNamespaces) - XML_SetElementHandler(parser, startElementNS, endElementNS); - else - XML_SetElementHandler(parser, startElement, endElement); - XML_SetCharacterDataHandler(parser, characterData); -#ifndef W3C14N - XML_SetProcessingInstructionHandler(parser, processingInstruction); -#endif /* not W3C14N */ - break; - } - } - if (windowsCodePages) - XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0); - result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags); - if (outputDir) { - if (outputType == 'm') - metaEndDocument(parser); - fclose(fp); - if (!result) { - tremove(outName); - exit(2); - } - free(outName); - } - XML_ParserFree(parser); - } - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp deleted file mode 100644 index eb80c62b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp +++ /dev/null @@ -1,139 +0,0 @@ -# Microsoft Developer Studio Project File - Name="xmlwf" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=xmlwf - Win32 Release -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "xmlwf.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "xmlwf.mak" CFG="xmlwf - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "xmlwf - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "xmlwf - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "xmlwf - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir ".\Release" -# PROP BASE Intermediate_Dir ".\Release" -# PROP BASE Target_Dir "." -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-xmlwf" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "." -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /subsystem:console /machine:I386 -# ADD LINK32 libexpat.lib setargv.obj /nologo /subsystem:console /pdb:none /machine:I386 /libpath:"..\win32\bin\Release" /out:"..\win32\bin\Release\xmlwf.exe" -# SUBTRACT LINK32 /nodefaultlib - -!ELSEIF "$(CFG)" == "xmlwf - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\Debug" -# PROP BASE Intermediate_Dir ".\Debug" -# PROP BASE Target_Dir "." -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-xmlwf" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "." -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /Fr /YX -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 libexpat.lib setargv.obj /nologo /subsystem:console /pdb:none /debug /machine:I386 /libpath:"..\win32\bin\Debug" /out:"..\win32\bin\Debug\xmlwf.exe" - -!ENDIF - -# Begin Target - -# Name "xmlwf - Win32 Release" -# Name "xmlwf - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=.\codepage.c -# End Source File -# Begin Source File - -SOURCE=.\readfilemap.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=.\unixfilemap.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=.\win32filemap.c -# End Source File -# Begin Source File - -SOURCE=.\xmlfile.c -# End Source File -# Begin Source File - -SOURCE=.\xmlwf.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# Begin Source File - -SOURCE=.\codepage.h -# End Source File -# Begin Source File - -SOURCE=.\xmlfile.h -# End Source File -# Begin Source File - -SOURCE=.\xmltchar.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx deleted file mode 100644 index bbfcce22..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx +++ /dev/null @@ -1,395 +0,0 @@ -#include "expat.h" -#ifdef XML_UNICODE -#define UNICODE -#endif -#include -#include -#include -#include -#include -#include "xmlurl.h" -#include "xmlmime.h" - -static int -processURL(XML_Parser parser, IMoniker *baseMoniker, const XML_Char *url); - -typedef void (*StopHandler)(void *, HRESULT); - -class Callback : public IBindStatusCallback { -public: - // IUnknown methods - STDMETHODIMP QueryInterface(REFIID,void **); - STDMETHODIMP_(ULONG) AddRef(); - STDMETHODIMP_(ULONG) Release(); - // IBindStatusCallback methods - STDMETHODIMP OnStartBinding(DWORD, IBinding *); - STDMETHODIMP GetPriority(LONG *); - STDMETHODIMP OnLowResource(DWORD); - STDMETHODIMP OnProgress(ULONG, ULONG, ULONG, LPCWSTR); - STDMETHODIMP OnStopBinding(HRESULT, LPCWSTR); - STDMETHODIMP GetBindInfo(DWORD *, BINDINFO *); - STDMETHODIMP OnDataAvailable(DWORD, DWORD, FORMATETC *, STGMEDIUM *); - STDMETHODIMP OnObjectAvailable(REFIID, IUnknown *); - Callback(XML_Parser, IMoniker *, StopHandler, void *); - ~Callback(); - int externalEntityRef(const XML_Char *context, - const XML_Char *systemId, const XML_Char *publicId); -private: - XML_Parser parser_; - IMoniker *baseMoniker_; - DWORD totalRead_; - ULONG ref_; - IBinding *pBinding_; - StopHandler stopHandler_; - void *stopArg_; -}; - -STDMETHODIMP_(ULONG) -Callback::AddRef() -{ - return ref_++; -} - -STDMETHODIMP_(ULONG) -Callback::Release() -{ - if (--ref_ == 0) { - delete this; - return 0; - } - return ref_; -} - -STDMETHODIMP -Callback::QueryInterface(REFIID riid, void** ppv) -{ - if (IsEqualGUID(riid, IID_IUnknown)) - *ppv = (IUnknown *)this; - else if (IsEqualGUID(riid, IID_IBindStatusCallback)) - *ppv = (IBindStatusCallback *)this; - else - return E_NOINTERFACE; - ((LPUNKNOWN)*ppv)->AddRef(); - return S_OK; -} - -STDMETHODIMP -Callback::OnStartBinding(DWORD, IBinding* pBinding) -{ - pBinding_ = pBinding; - pBinding->AddRef(); - return S_OK; -} - -STDMETHODIMP -Callback::GetPriority(LONG *) -{ - return E_NOTIMPL; -} - -STDMETHODIMP -Callback::OnLowResource(DWORD) -{ - return E_NOTIMPL; -} - -STDMETHODIMP -Callback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR) -{ - return S_OK; -} - -STDMETHODIMP -Callback::OnStopBinding(HRESULT hr, LPCWSTR szError) -{ - if (pBinding_) { - pBinding_->Release(); - pBinding_ = 0; - } - if (baseMoniker_) { - baseMoniker_->Release(); - baseMoniker_ = 0; - } - stopHandler_(stopArg_, hr); - return S_OK; -} - -STDMETHODIMP -Callback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo) -{ - *pgrfBINDF = BINDF_ASYNCHRONOUS; - return S_OK; -} - -static void -reportError(XML_Parser parser) -{ - int code = XML_GetErrorCode(parser); - const XML_Char *message = XML_ErrorString(code); - if (message) - _ftprintf(stderr, _T("%s:%d:%ld: %s\n"), - XML_GetBase(parser), - XML_GetErrorLineNumber(parser), - XML_GetErrorColumnNumber(parser), - message); - else - _ftprintf(stderr, _T("%s: (unknown message %d)\n"), - XML_GetBase(parser), code); -} - -STDMETHODIMP -Callback::OnDataAvailable(DWORD grfBSCF, - DWORD dwSize, - FORMATETC *pfmtetc, - STGMEDIUM* pstgmed) -{ - if (grfBSCF & BSCF_FIRSTDATANOTIFICATION) { - IWinInetHttpInfo *hp; - HRESULT hr = pBinding_->QueryInterface(IID_IWinInetHttpInfo, - (void **)&hp); - if (SUCCEEDED(hr)) { - char contentType[1024]; - DWORD bufSize = sizeof(contentType); - DWORD flags = 0; - contentType[0] = 0; - hr = hp->QueryInfo(HTTP_QUERY_CONTENT_TYPE, contentType, - &bufSize, 0, NULL); - if (SUCCEEDED(hr)) { - char charset[CHARSET_MAX]; - getXMLCharset(contentType, charset); - if (charset[0]) { -#ifdef XML_UNICODE - XML_Char wcharset[CHARSET_MAX]; - XML_Char *p1 = wcharset; - const char *p2 = charset; - while ((*p1++ = (unsigned char)*p2++) != 0) - ; - XML_SetEncoding(parser_, wcharset); -#else - XML_SetEncoding(parser_, charset); -#endif - } - } - hp->Release(); - } - } - if (!parser_) - return E_ABORT; - if (pstgmed->tymed == TYMED_ISTREAM) { - while (totalRead_ < dwSize) { -#define READ_MAX (64*1024) - DWORD nToRead = dwSize - totalRead_; - if (nToRead > READ_MAX) - nToRead = READ_MAX; - void *buf = XML_GetBuffer(parser_, nToRead); - if (!buf) { - _ftprintf(stderr, _T("out of memory\n")); - return E_ABORT; - } - DWORD nRead; - HRESULT hr = pstgmed->pstm->Read(buf, nToRead, &nRead); - if (SUCCEEDED(hr)) { - totalRead_ += nRead; - if (!XML_ParseBuffer(parser_, - nRead, - (grfBSCF & BSCF_LASTDATANOTIFICATION) != 0 - && totalRead_ == dwSize)) { - reportError(parser_); - return E_ABORT; - } - } - } - } - return S_OK; -} - -STDMETHODIMP -Callback::OnObjectAvailable(REFIID, IUnknown *) -{ - return S_OK; -} - -int -Callback::externalEntityRef(const XML_Char *context, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Parser entParser = XML_ExternalEntityParserCreate(parser_, context, 0); - XML_SetBase(entParser, systemId); - int ret = processURL(entParser, baseMoniker_, systemId); - XML_ParserFree(entParser); - return ret; -} - -Callback::Callback(XML_Parser parser, IMoniker *baseMoniker, - StopHandler stopHandler, void *stopArg) -: parser_(parser), - baseMoniker_(baseMoniker), - ref_(0), - pBinding_(0), - totalRead_(0), - stopHandler_(stopHandler), - stopArg_(stopArg) -{ - if (baseMoniker_) - baseMoniker_->AddRef(); -} - -Callback::~Callback() -{ - if (pBinding_) - pBinding_->Release(); - if (baseMoniker_) - baseMoniker_->Release(); -} - -static int -externalEntityRef(void *arg, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - return ((Callback *)arg)->externalEntityRef(context, systemId, publicId); -} - - -static HRESULT -openStream(XML_Parser parser, - IMoniker *baseMoniker, - const XML_Char *uri, - StopHandler stopHandler, void *stopArg) -{ - if (!XML_SetBase(parser, uri)) - return E_OUTOFMEMORY; - HRESULT hr; - IMoniker *m; -#ifdef XML_UNICODE - hr = CreateURLMoniker(0, uri, &m); -#else - LPWSTR uriw = new wchar_t[strlen(uri) + 1]; - for (int i = 0;; i++) { - uriw[i] = uri[i]; - if (uriw[i] == 0) - break; - } - hr = CreateURLMoniker(baseMoniker, uriw, &m); - delete [] uriw; -#endif - if (FAILED(hr)) - return hr; - IBindStatusCallback *cb = new Callback(parser, m, stopHandler, stopArg); - XML_SetExternalEntityRefHandler(parser, externalEntityRef); - XML_SetExternalEntityRefHandlerArg(parser, cb); - cb->AddRef(); - IBindCtx *b; - if (FAILED(hr = CreateAsyncBindCtx(0, cb, 0, &b))) { - cb->Release(); - m->Release(); - return hr; - } - cb->Release(); - IStream *pStream; - hr = m->BindToStorage(b, 0, IID_IStream, (void **)&pStream); - if (SUCCEEDED(hr)) { - if (pStream) - pStream->Release(); - } - if (hr == MK_S_ASYNCHRONOUS) - hr = S_OK; - m->Release(); - b->Release(); - return hr; -} - -struct QuitInfo { - const XML_Char *url; - HRESULT hr; - int stop; -}; - -static void -winPerror(const XML_Char *url, HRESULT hr) -{ - LPVOID buf; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_HMODULE, - GetModuleHandleA("urlmon.dll"), - hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL) - || FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - 0, - hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL)) { - /* The system error messages seem to end with a newline. */ - _ftprintf(stderr, _T("%s: %s"), url, buf); - fflush(stderr); - LocalFree(buf); - } - else - _ftprintf(stderr, _T("%s: error %x\n"), url, hr); -} - -static void -threadQuit(void *p, HRESULT hr) -{ - QuitInfo *qi = (QuitInfo *)p; - qi->hr = hr; - qi->stop = 1; -} - -extern "C" -int -XML_URLInit(void) -{ - return SUCCEEDED(CoInitialize(0)); -} - -extern "C" -void -XML_URLUninit(void) -{ - CoUninitialize(); -} - -static int -processURL(XML_Parser parser, IMoniker *baseMoniker, - const XML_Char *url) -{ - QuitInfo qi; - qi.stop = 0; - qi.url = url; - - XML_SetBase(parser, url); - HRESULT hr = openStream(parser, baseMoniker, url, threadQuit, &qi); - if (FAILED(hr)) { - winPerror(url, hr); - return 0; - } - else if (FAILED(qi.hr)) { - winPerror(url, qi.hr); - return 0; - } - MSG msg; - while (!qi.stop && GetMessage (&msg, NULL, 0, 0)) { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - return 1; -} - -extern "C" -int -XML_ProcessURL(XML_Parser parser, - const XML_Char *url, - unsigned flags) -{ - return processURL(parser, 0, url); -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp b/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp deleted file mode 100644 index cd71111e..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp +++ /dev/null @@ -1,428 +0,0 @@ -#include -#include "aolxml.h" -#include "stl/stringUtils.h" -#include - -#ifdef AOLXML_FASTLOOKUP -#ifdef _WIN32 -#include -#endif -#endif - -using namespace std; -using namespace stringUtil; - -// stl helpers -static void ndelete(aolxml::node *n) { delete n; } -static bool matchNameVS2005(const aolxml::node* n, string name) - { return (n->name() == name); } -////////// - -aolxml::node::~node() -{ - // delete the children - for_each(m_children.begin(),m_children.end(),ndelete); -} - -void aolxml::node::deleteChild(childIterator_t i) -{ - // deletes child and all subchildren - aolxml::node *n = (*i); - -#ifdef AOLXML_FASTLOOKUP - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); -#endif - m_children.erase(i); - - delete n; -} - -bool aolxml::node::deleteChild(aolxml::node *n) -{ - list::iterator i = find(m_children.begin(),m_children.end(),n); - if (i != m_children.end()) - { - #ifdef AOLXML_FASTLOOKUP - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); - #endif - m_children.erase(i); - delete n; - return true; - } - return false; -} - -void aolxml::node::snipChild(childIterator_t i) -{ - // remove child from this node but keeps subtree in tact -#ifdef AOLXML_FASTLOOKUP - aolxml::node *n = (*i); - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); -#endif - (*i)->m_parent = 0; - m_children.erase(i); -} - -void aolxml::node::addChild(node *n) -{ - n->m_parent = this; - m_children.push_back(n); -#ifdef AOLXML_FASTLOOKUP - m_nameToNodeMap.insert(make_pair(n->name(),n)); -#endif -} - -void aolxml::node::insertChild(childIterator_t i,node *n) -{ - n->m_parent = this; - m_children.insert(i,n); -#ifdef AOLXML_FASTLOOKUP - m_nameToNodeMap.insert(make_pair(n->name(),n)); -#endif -} - -aolxml::node* aolxml::node::findNode(node *root,const string &path) throw() -{ - if (path.empty() || (!root)) - { - return 0; - } - - vector v = tokenizer(path,'/'); - - node *current = root; - if (path[0] == '/') - { - // move to root of tree - while (current->parent()) - current = current->parent(); - - // make sure first tag matches first token - if (current && (!v.empty()) && (current->name() != v[0])) - { - current = 0; - } - else - { - v.erase(v.begin()); - } - } - - for(vector::const_iterator i = v.begin(); (i != v.end()) && current; ++i) - { - string s = stripWhitespace(*i); - if (s == "" || s == ".") - { - continue; - } - else if (s == "..") - { - current = current->parent(); - } - else - { -#ifdef AOLXML_FASTLOOKUP - nameToNodeMap_t::iterator mi = current->m_nameToNodeMap.find(s); - current = (mi == current->m_nameToNodeMap.end() ? 0 : (*mi).second); -#else - list::iterator ci = find_if( - current->childrenBegin(),current->childrenEnd(),bind2nd(ptr_fun(matchNameVS2005),s)); - current = (ci == current->childrenEnd() ? 0 : (*ci)); -#endif - } - } - - return current; -} - -list aolxml::node::findNodes(node *root,const string &path) throw() -{ - list result; - - if (path.empty() || (!root)) - { - return result; - } - - vector v = tokenizer(path,'/'); - - node *current = root; - if (path[0] == '/') - { - // move to root of tree - while (current->parent()) - { - current = current->parent(); - } - - // make sure first tag matches first token - if (current && (!v.empty()) && (current->name() != v[0])) - { - current = 0; - } - else - { - v.erase(v.begin()); - } - } - - string last; - if (!v.empty()) - { - last = v.back(); - v.pop_back(); - } - - for(vector::const_iterator i = v.begin(); (i != v.end()) && current; ++i) - { - string s = stripWhitespace(*i); - if (s == "" || s == ".") - { - continue; - } - else if (s == "..") - { - current = current->parent(); - } - else - { -#ifdef AOLXML_FASTLOOKUP - nameToNodeMap_t::iterator mi = current->m_nameToNodeMap.find(s); - current = (mi == current->m_nameToNodeMap.end() ? 0 : (*mi).second); -#else - list::iterator ci = find_if( - current->childrenBegin(),current->childrenEnd(),bind2nd(ptr_fun(matchNameVS2005),s)); - current = (ci == current->childrenEnd() ? 0 : (*ci)); -#endif - } - } - // now do last - if (current && last != "") - { - list nv = current->m_children; - copy(nv.begin(),stable_partition(nv.begin(),nv.end(),bind2nd(ptr_fun(matchNameVS2005),last)),back_inserter(result)); - } - - return result; -} - -static bool isAttr(pair attr,string name) throw() -{ - return (attr.first == name); -} - -aolxml::node::attributeList_t::iterator aolxml::node::findAttribute(const string &name) throw() -{ - return find_if(m_attributes.begin(),m_attributes.end(),bind2nd(ptr_fun(isAttr),name)); -} - -aolxml::node::attributeList_t::const_iterator aolxml::node::findAttribute(const string &name) const throw() -{ - return find_if(m_attributes.begin(),m_attributes.end(),bind2nd(ptr_fun(isAttr),name)); -} - -std::string aolxml::node::findAttributeString(const std::string &attr,const std::string &deflt) const throw() -{ - aolxml::node::attributeList_t::const_iterator i = findAttribute(attr); - return (i == m_attributes.end() ? deflt : (*i).second); -} - -std::string aolxml::node::findAttributeStringTHROW(const std::string &attr) const throw(std::runtime_error) -{ - aolxml::node::attributeList_t::const_iterator i = findAttribute(attr); - if (i == m_attributes.end()) - { - throw runtime_error("attribute " + attr + " in node " + m_name + " not found."); - } - return (*i).second; -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,std::string &s) const throw(std::runtime_error) -{ - s = findAttributeStringTHROW(attr); -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,int &i) const throw(std::runtime_error) -{ - i = atoi(findAttributeStringTHROW(attr).c_str()); -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,double &d) const throw(std::runtime_error) -{ - d = atof(findAttributeStringTHROW(attr).c_str()); -} - -///////////////////////////////////////////////////////////////////////////// -////////////////////// Parsing (expat) ////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -void aolxml::StartTag (void *parser, const XML_Char * name, const XML_Char ** atts) -{ - aolxml::node* parent = reinterpret_cast(XML_GetUserData((XML_Parser) parser)); - aolxml::node* current = new aolxml::node(name); - - if (parent) - { - current->m_preserveSpaces = parent->m_preserveSpaces; - parent->addChild(current); - } - - int attnum = XML_GetSpecifiedAttributeCount((XML_Parser) parser); - for (int i = 0; i < attnum; i += 2) - { - string key = atts[i]; - string value = atts[i+1]; - current->addAttribute(aolxml::node::attribute_t(key,value)); - if (key == "xml:space") - { - current->m_preserveSpaces = (value == "preserve"); - } - } - - XML_SetUserData((XML_Parser) parser, current); -} - -void aolxml::EndTag(void *parser, const XML_Char * /*name*/) -{ - aolxml::node* current = reinterpret_cast(XML_GetUserData ((XML_Parser) parser)); - if (!current->m_preserveSpaces) - { - current->pcdata() = stripWhitespace(current->pcdata()); - } - XML_SetUserData((XML_Parser) parser,current->parent() ? current->parent() : current); -} - -void aolxml::CData(void *parser) -{ - aolxml::node* tag = reinterpret_cast(XML_GetUserData ((XML_Parser) parser)); - tag->m_preserveSpaces = true; -} - -void aolxml::PCData (void *parser, const XML_Char * s, int len) -{ - aolxml::node* tag = reinterpret_cast(XML_GetUserData ((XML_Parser) parser)); - - string ss(s,s+len); - tag->pcdata() = tag->pcdata() + ss;//(tag->m_preserveSpaces ? ss : stripWhitespace(ss)); - // whitespace stripping moved to end tag because sometimes we get the PCData in - // multiple calls -} - -aolxml::node* aolxml::node::parse(const char *data,size_t len) throw(runtime_error) -{ - aolxml::node *root = 0; - - XML_Parser parser = XML_ParserCreate (NULL); - - // setup the parser - XML_UseParserAsHandlerArg(parser); - XML_SetElementHandler(parser, StartTag, EndTag); - XML_SetCharacterDataHandler(parser, PCData); - XML_SetUserData(parser, 0); - XML_SetStartCdataSectionHandler(parser,CData); - - if (XML_Parse(parser, data,(int)len, 1)) - { - root = reinterpret_cast(XML_GetUserData (parser)); - } - else - { - // cleanup tree fragment - root = reinterpret_cast(XML_GetUserData (parser)); - if (root) - { - while (root->parent()) - { - root = root->parent(); - } - delete root; - } - ////////// - - std::ostringstream o; - o << "[XML] " << XML_ErrorString(XML_GetErrorCode(parser)) << - " at line " << XML_GetCurrentLineNumber(parser); - XML_ParserFree(parser); - throw std::runtime_error(o.str()); - } - - XML_ParserFree (parser); - return root; -} - -aolxml::node* aolxml::node::parse(const string &text) throw(runtime_error) -{ - return aolxml::node::parse(text.c_str(),text.size()); -} - -aolxml::node* aolxml::node::parse(const uniString::utf8::value_type *data,size_t len) throw(std::runtime_error) -{ - return aolxml::node::parse((const char *)data,len); -} - -aolxml::node* aolxml::node::parse(const uniString::utf8 &text) throw(std::runtime_error) -{ - return aolxml::node::parse(&(text[0]),text.size()); -} - -static void out_tabs(ostream &o,int t) -{ - for(int x = 0; x < t; ++x) o << "\t"; -} - -static void outputXML(ostream &o,const aolxml::node *n,int tabs) -{ - o << endl; out_tabs(o,tabs); - o << "<" << n->name(); - for(aolxml::node::attributeList_t::const_iterator i = n->attributes().begin(); - i != n->attributes().end(); ++i) - o << " " << (*i).first << "=\"" << (*i).second << "\""; - o << ">" << n->pcdata(); - if (!n->childrenEmpty()) - { - for(aolxml::node::const_childIterator_t i = n->childrenBegin(); i != n->childrenEnd(); ++i) - { - outputXML(o,(*i),tabs+1); - } - o << endl; - out_tabs(o,tabs); - } - o << "name() << ">"; -} - -ostream& aolxml::operator<<(ostream &o,const aolxml::node *n) -{ - outputXML(o,n,0); - o << endl; - return o; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h b/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h deleted file mode 100644 index f87e4789..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h +++ /dev/null @@ -1,372 +0,0 @@ -#pragma once -#ifndef xml_H_ -#define xml_H_ - -#include -#include -#include -#include -#include -#include -#include "stl/stringUtils.h" -#include "unicode/uniString.h" - -#define XMLIMPORT -#include "expat.h" - -#ifdef _WIN32 -#pragma warning(push) -#pragma warning( disable : 4290 ) -#pragma warning( disable : 4996 ) -#endif - -//#define AOLXML_FASTLOOKUP 1 - -#ifdef AOLXML_FASTLOOKUP -#include -#endif - -namespace aolxml -{ - class node - { - public: - typedef std::pair attribute_t; - typedef std::list attributeList_t; - typedef std::list nodeList_t; - typedef nodeList_t::iterator childIterator_t; - typedef nodeList_t::const_iterator const_childIterator_t; - - private: - std::string m_name; - attributeList_t m_attributes; - std::string m_pcdata; - node* m_parent; - std::list m_children; - -#ifdef AOLXML_FASTLOOKUP - typedef std::multimap nameToNodeMap_t; - nameToNodeMap_t m_nameToNodeMap; -#endif - bool m_preserveSpaces; - - public: - node(const std::string &name,const std::string &pcd = "") - :m_name(name),m_pcdata(pcd),m_parent(0),m_preserveSpaces(false){} - - ~node(); - - const std::string &name() const throw() { return m_name; } - std::string& name() throw() { return m_name; } - - attributeList_t& attributes() throw() { return m_attributes; } - const attributeList_t& attributes() const throw() { return m_attributes; } - void addAttribute(const attribute_t &a) throw() { m_attributes.push_back(a); } - attributeList_t::iterator findAttribute(const std::string &attr) throw(); - attributeList_t::const_iterator findAttribute(const std::string &attr) const throw(); - std::string findAttributeString(const std::string &attr,const std::string &deflt = "") const throw(); - std::string findAttributeStringTHROW(const std::string &attr) const throw(std::runtime_error); // throws if attribute not found - void findAttributeStringTHROW(const std::string &attr,std::string &s) const throw(std::runtime_error); - void findAttributeStringTHROW(const std::string &attr,int &i) const throw(std::runtime_error); - void findAttributeStringTHROW(const std::string &attr,double &f) const throw(std::runtime_error); - - node* parent() throw() { return m_parent;} - const node* parent() const throw() { return m_parent; } - const std::string &pcdata() const throw() { return m_pcdata; } - std::string& pcdata() throw() { return m_pcdata; } - - childIterator_t childrenBegin() throw() { return m_children.begin(); } - childIterator_t childrenEnd() throw() { return m_children.end(); } - const_childIterator_t childrenBegin() const throw() { return m_children.begin(); } - const_childIterator_t childrenEnd() const throw() { return m_children.end(); } - bool childrenEmpty() const throw() { return m_children.empty(); } - - void deleteChild(childIterator_t i); // deletes child and all subchildren - bool deleteChild(node *n); - void snipChild(childIterator_t i); // remove child from this node but keeps subtree in tact - - void addChild(node *n); - void insertChild(childIterator_t i,node *n); - - static node* findNode(node *root,const std::string &path) throw(); - static nodeList_t findNodes(node *root,const std::string &path) throw(); - - static node* parse(const std::string &text) throw(std::runtime_error); - static node* parse(const char *data,size_t len) throw(std::runtime_error); - static node* parse(const uniString::utf8 &text) throw(std::runtime_error); - static node* parse(const uniString::utf8::value_type *data,size_t len) throw(std::runtime_error); - - friend std::ostream& operator<<(std::ostream &o,const node *n); - friend void StartTag (void *parser, const XML_Char * name, const XML_Char ** atts); - friend void EndTag(void *parser, const XML_Char * name); - friend void PCData (void *parser, const XML_Char * s, int len); - friend void CData(void *parser); - }; - - ////////////////////////////////////////////// - ///// utility functions on nodes //////// - //////////////////////////////////////////////// - - template // convert from text - inline T nodeText(node *n) { return n->pcdata(); } - - template<> - inline int nodeText(node *n) { return atoi(n->pcdata().c_str()); } - - template<> - inline unsigned short nodeText(node *n) { return atoi(n->pcdata().c_str()); } - -#ifdef _WIN32 - template<> - inline __int64 nodeText(node *n) { return _strtoi64(n->pcdata().c_str(),0,10); } - - template<> - inline unsigned __int64 nodeText(node *n) { return _strtoui64(n->pcdata().c_str(),0,10); } -#endif - - template<> - inline bool nodeText(node *n) - { - const std::string &s = n->pcdata(); - if (s.empty()) return false; - return (s[0] == 't' || s[0] == 'T' || s[0] == '1' || s[0] == 'y' || s[0] == 'Y'); - } - - template<> - inline double nodeText(node *n) { return atof(n->pcdata().c_str()); } - - - // get a subnode value. Returns true if value existed - template - inline bool subNodeText(node *n,const std::string &path,T& value,const T defaultValue) throw() - { - value = defaultValue; - if (!n) - { - return false; - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - return false; - } - value = aolxml::nodeText(subNode); - - return true; - } - - // same as above, but you cannot detect missing value - template - inline T subNodeText(node *n,const std::string &path,const T defaultValue) throw() - { - if (!n) - { - return defaultValue; - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - return defaultValue; - } - return aolxml::nodeText(subNode); - } - - inline void subNodeText(node *n,const std::string &path,char *result,int maxLen,const char *defaultValue) throw() - { - strncpy(result,defaultValue,maxLen); - - if (!n) - { - return; - } - - node *subNode = node::findNode(n,path); - if (!subNode) - { - return; - } - std::string tmp = aolxml::nodeText(subNode); - strncpy(result,tmp.c_str(),maxLen); - } - - // this one throws if the value is not found - template - inline T subNodeTextTHROW(node *n,const std::string &path) throw(std::runtime_error) - { - if (!n) - { - throw std::runtime_error("node NULL"); - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - throw std::runtime_error(path + " missing"); - } - return aolxml::nodeText(subNode); - } - - // throws and returns value as a param instead of a function value - template - inline void subNodeTextTHROW(node *n,const std::string &path,T &result) throw(std::runtime_error) - { - result = aolxml::subNodeTextTHROW(n,path); - } - - /// calls function 'f' with each node in the list and the value 'l' - // The purpose is to allow you to write a function which will insert - // data from each node into container 'l' - template - inline void XMLList(L &l,const node::nodeList_t &lnode,Func f) throw(std::runtime_error) - { - for(node::nodeList_t::const_iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - template - inline void XMLList(L &l,node::nodeList_t &lnode,Func f) throw(std::runtime_error) - { - for(node::nodeList_t::iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - template - inline void XMLList(L &l,node *n,const std::string &path,Func f) throw(std::runtime_error) - { - if (!n) - { - return; - } - node::nodeList_t lnode = node::findNodes(n,path); - for(node::nodeList_t::iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - - //**************************************************************** - //* Various templates for constructing XML data - //**************************************************************** - - // embed a value in a set of tags (value) providing a function - // which will convert the value to a string - template - std::string xmlTag(const std::string &tag,const T value,ConverterFunc func) - { - return std::string("<") + tag + ">" + func(value) + ""; - } - - // embed a string convertible value to value - template - std::string xmlTag(const std::string &tag,const T value) - { - return std::string("<") + tag + ">" + stringUtil::tos(value) + ""; - } - - inline std::string xmlTag(const std::string &tag,bool value) - { - return std::string("<") + tag + ">" + (value ? "1" : "0") + ""; - } - - // helper functor to make lists of web taged values using accumulate - template - class xmlListFunctor: public std::binary_function - { - std::string m_tag; - ConverterFunc m_func; - - public: - xmlListFunctor(const std::string &tag,ConverterFunc f): m_tag(tag),m_func(f){} - std::string operator()(const std::string &accum,const T &val) - { - return accum + xmlTag(m_tag,val,m_func); - } - }; - - // template function so we don't have to use the entire accumulate syntax. - /* example: - - list items; - items.push_back("foo"); - items.push_back("bar"); - items.push_back("narf"); - - string result = xmlList(items,"junk"); - - // the value of result is now - // foobarnarf - */ - - template - std::string xmlList(const Container &c,const std::string &tag) - { - typedef std::string (*tostype)(const typename Container::value_type); - - return std::accumulate(c.begin(),c.end(),std::string(""), - xmlListFunctor(tag,stringUtil::tos)); - } - - // similar to xmlList, but you provide a converter func to make your values into a string - template - std::string xmlList(const Container &c,const std::string &tag,ConverterFunc func) - { - return std::accumulate(c.begin(),c.end(),std::string(""), - xmlListFunctor(tag,func)); - } - - // similar to xmlList, but with auto indenting - template - static std::string xmlListIndented(const Container &c,const std::string &tag,const std::string &indent) - { - std::string result; - for (typename Container::const_iterator i = c.begin(); i != c.end(); ++i) - { - result += indent + "<" + tag + ">" + stringUtil::tos(*i) + "" + stringUtil::eol(); - } - return result; - } - - template - static std::string xmlListIndented(const Container &c,const std::string &tag,const std::string &indent,Func f) - { - std::string result; - for (typename Container::const_iterator i = c.begin(); i != c.end(); ++i) - { - result += indent + "<" + tag + ">" + stringUtil::eol(); - result += f(*i,indent + "\t"); - result += indent + "" + stringUtil::eol(); - } - return result; - } - - // escape a string so it is valid inside an XML tag - std::string escapeXML(const std::string &s) throw(); - uniString::utf8 escapeXML(const uniString::utf8 &s) throw(); - /*static std::string utf8Header() throw() { return "\n"; } - static std::string latin1Header() throw() { return "\n"; }*/ - - std::ostream& operator<<(std::ostream &o,const node *n); - void StartTag (void *parser, const XML_Char * name, const XML_Char ** atts); - void EndTag(void *parser, const XML_Char * name); - void PCData (void *parser, const XML_Char * s, int len); - void CData(void *parser); -} - -#ifdef _WIN32 -#pragma warning(pop) -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp b/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp deleted file mode 100644 index df8ad66d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "aolxml.h" -#include "stl/stringUtils.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -class xmlEscapes: public map -{ -public: - xmlEscapes() - { - (*this)['<'] = "<"; - (*this)['>'] = ">"; - (*this)['&'] = "&"; - (*this)['\''] = "'"; - (*this)['"'] = """; - } -}; - -static const xmlEscapes gsXmlEscapes; - -string aolxml::escapeXML(const string &s) throw() -{ - string result; - string::size_type siz = s.size(); - for(string::size_type x = 0; x < siz; ++x) - { - unsigned char uc = s[x]; - if (((uc > 0x7f) || (uc >= 1 && uc <= 8) || (uc >= 0x0b && uc <= 0x0c) || (uc >= 0x0e && uc <= 0x1f))) - { - result += "&#" + tos((unsigned int)uc) + ";"; - } - else - { - xmlEscapes::const_iterator i = gsXmlEscapes.find(s[x]); - if (i != gsXmlEscapes.end()) - result += (*i).second; - else - result += s[x]; - } - } - return result; -} - -utf8 aolxml::escapeXML(const utf8 &s) throw() -{ - string result; - string::size_type siz = s.size(); - for(string::size_type x = 0; x < siz; ++x) - { - //unsigned char uc = s[x]; - xmlEscapes::const_iterator i = gsXmlEscapes.find(s[x]); - if (i != gsXmlEscapes.end()) - result += (*i).second; - else - result += s[x]; - } - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat b/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat deleted file mode 100644 index a54a8b4c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd expat -chmod a+x configure -./configure --prefix=$OLDPWD -make install diff --git a/Src/Plugins/DSP/sc_serv3/auth.cpp b/Src/Plugins/DSP/sc_serv3/auth.cpp deleted file mode 100644 index 021e0919..00000000 --- a/Src/Plugins/DSP/sc_serv3/auth.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* auth.cpp routines for authenticating client details with external server */ - -#include -#include - -#include "protocol_shoutcastClient.h" -#include "uvox2Common.h" -#include "webClient.h" -#include "auth.h" -#include "bandwidth.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -#define MAX_AUTH_THREADS 20 -#define AMNT_ALLOWED_BEFORE_SKIPPING 1000 - -#define LOGNAME "[AUTH] " -#define DEBUG_LOG(...) do { if (gOptions.authDebug()) DLOG(__VA_ARGS__); } while(0) - -extern int xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow); - -namespace auth -{ - using namespace std; - using namespace uniString; - using namespace stringUtil; - - class authService - { - public: - time_t restart_time; - utf8 main_post; - list clients; - CURL *m_curl; - bool in_use; - - authService(); - ~authService(); - - static THREAD_FUNC process(void *arg); - - friend void schedule(auth_info *info); - friend void init(); - }; - - list g_queue; - AOL_namespace::mutex g_qMutex; - authService * g_services = 0; - utf8 g_authURL = DNAS_AUTH_URL; - -#ifdef CURLOPT_PASSWDFUNCTION - /* make sure that prompting at the console does not occur */ - static int my_getpass(void *client, char *prompt, char *buffer, int buflen) - { - buffer[0] = '\0'; - return 0; - } -#endif - - static int handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream) - { - auth_info *info = reinterpret_cast(stream); - if (info) - { - utf8 line((char*)ptr); - if (!line.empty()) - { - line = stripWhitespace(line); - if (!line.empty()) - { - // skip over the initial HTTP header and just look at key pairs - utf8::size_type pos = line.find(utf8(":")); - if (pos != utf8::npos) - { - utf8 key = toLower(stripWhitespace(line.substr(0,pos))); - utf8 value = stripWhitespace(line.substr(pos+1)); - - if (!key.empty()) - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Auth Header [" + key + ":" + value + "]"); - - if (key == "shoutcast-auth-user") - { - if (value == "withintro") - { - info->has_intro = true; - } - info->authenticated = true; - info->valid_response = true; - } - else if (key == "advert-group") - { - info->group = atoi(value.hideAsString().c_str()); - #if defined(_DEBUG) || defined(DEBUG) - if (info->group == 1729) - { - info->group = 501; - } - #endif - info->valid_response = true; - } - } - } - } - } - } - - int amount = (int)(size * nmemb); - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; - } - - static int handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream) - { - auth_info *info = reinterpret_cast(stream); - if (info) - { - // cap any intro content to a few meg - if (info->has_intro && ((int)info->content.size() <= gOptions.maxSpecialFileSize())) - { - vector <__uint8> &v = info->content; - __uint8 *s = (__uint8*)ptr; - v.insert (v.end(), s, s + (size * nmemb)); - } - } - - int amount = (int)(size * nmemb); - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; - } - - authService::authService() : restart_time(0), in_use(false) - { - m_curl = webClient::setupCurlDefaults (NULL, LOGNAME, g_authURL, 4L); - //DEBUG_LOG("[AUTH] Starting auth instance"); - } - - authService::~authService() - { - restart_time = 0; - in_use = false; - if (m_curl) - { - curl_easy_cleanup(m_curl); - m_curl = NULL; - } - //DEBUG_LOG("[AUTH] Stopping auth instance"); - } - - THREAD_FUNC authService::process(void* arg) - { - try - { - authService* m_auth = reinterpret_cast(arg); - if (m_auth) - { - if (!iskilled()) - { - g_qMutex.lock(); - - while (!m_auth->clients.empty()) - { - auth_info *info = m_auth->clients.front(); - m_auth->clients.pop_front(); - g_qMutex.unlock(); - - if (info) - { - if (info->url.empty() == false) - { - g_qMutex.lock(); - m_auth->main_post = info->post; - m_auth->m_curl = webClient::setupCurlDefaults (m_auth->m_curl, LOGNAME, info->url, 4L); - DLOG ("updated main post to " + m_auth->main_post + " and URL " + info->url, LOGNAME, info->sid); - g_qMutex.unlock(); - } - - if (m_auth->restart_time && (::time(NULL) >= m_auth->restart_time)) - { - m_auth->restart_time = 0; - DEBUG_LOG("Restarting disabled auth", LOGNAME, info->sid); - } - - protocol_shoutcastClient *client = info->client; - if (client) // if set to be kicked then no point in processing - { - if (client->m_kickNextRound == false) - { - if (m_auth->restart_time) - { - // auth is disabled for now, but assume client is ok - info->authenticated = true; - } - else - { - if (info->post.empty() == false) - { - utf8 post = info->post + "&" + m_auth->main_post; - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("POST body: " + utf8(post.c_str()), LOGNAME, info->sid); -#endif - - char errormsg[CURL_ERROR_SIZE] = {0}; - if (m_auth->m_curl) - { - curl_easy_setopt(m_auth->m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt(m_auth->m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); - - curl_easy_setopt(m_auth->m_curl, CURLOPT_ERRORBUFFER, errormsg); - curl_easy_setopt(m_auth->m_curl, CURLOPT_HEADERDATA, info); - curl_easy_setopt(m_auth->m_curl, CURLOPT_WRITEDATA, info); - curl_easy_setopt(m_auth->m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt(m_auth->m_curl, CURLOPT_COPYPOSTFIELDS, post.c_str()); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt(m_auth->m_curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt(m_auth->m_curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt(m_auth->m_curl, CURLOPT_XFERINFODATA, info->sid); - } - - CURLcode ret = CURLE_FAILED_INIT; - if (!m_auth->m_curl || ((ret = curl_easy_perform(m_auth->m_curl)) != CURLE_OK)) - { - ELOG("[AUTH sid=" + tos(info->sid) + "] Request failed on auth with " + - (errormsg[0] ? errormsg : curl_easy_strerror(ret))); - - g_qMutex.lock(); - if (m_auth->restart_time == 0) - { - m_auth->restart_time = ::time(NULL) + 60; - } - g_qMutex.unlock(); - - info->authenticated = true; - } - } - } - - if (info->authenticated) - { - // we need to double-check that the client still - // exists as there could have been a delay with - // the processing of this and it's since dropped - // or been kicked - if so we don't want to crash - //stats:: - - if (info->group >= 0) - { - client->setGroup(info->group); - } - if (info->has_intro) - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Listener auth supplied intro of " + tos((long)info->content.size())); - client->setIntro(info->content, info->m_dataType); - } - } - else - { - // if we didn't get the required header responses - // but we did get a valid response from the server - // then we should just allow the client to connect - // as we don't know what's going on so assume "ok" - if (!info->valid_response) - { - info->authenticated = true; - } - else - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Auth failed, 403 returned"); - client->return_403(); - } - } - } - - // if we're re-processing the client then we - // musn't re-schedule it else it'll go boom! - if (!info->delayed_auth) - { - threadedRunner::scheduleRunnable(client); - } - } - } - - delete info; - info = NULL; - - g_qMutex.lock(); - } - - m_auth->clients.clear(); - m_auth->in_use = false; - g_qMutex.unlock(); - } - } - } - catch (...) - { - authService* m_auth = reinterpret_cast(arg); - if (m_auth) - { - g_qMutex.lock(); - m_auth->clients.clear(); - m_auth->in_use = false; - g_qMutex.unlock(); - } - } - return 0; - } - - void schedule(auth_info *info) - { - if (info) - { - g_qMutex.lock(); - do - { - if (g_queue.size() > AMNT_ALLOWED_BEFORE_SKIPPING) - { - // what to do when under stress/timeout - DEBUG_LOG(LOGNAME "Heavy backlog of auth requests, skipping"); - threadedRunner::scheduleRunnable(info->client); - delete info; - info = NULL; - break; - } - - if (g_services) - { - int i = 0; - for (; i < MAX_AUTH_THREADS; ++i) - { - if (g_services[i].in_use == false) - { - // start auth thread processing - g_services[i].in_use = true; - g_services[i].clients.push_back(info); - if (!g_queue.empty()) - { - g_services[i].clients.insert(g_services[i].clients.end(), g_queue.begin(), g_queue.end()); - g_queue.clear(); - } - - // do what we can to make sure that if we fail - // to start the thread then we'll pass it on - DEBUG_LOG(LOGNAME "Starting auth thread #" + tos(i+1)); - SimpleThread(authService::process, &g_services[i]); - break; - } - } - - if (i >= MAX_AUTH_THREADS) - { - g_queue.push_back(info); - //DEBUG_LOG(LOGNAME "Unable to process auth requests, skipping"); - //threadedRunner::scheduleRunnable(info->client); - //delete info; - //info = NULL; - break; - } - } - else - { - DEBUG_LOG(LOGNAME "Unable to process auth requests, skipping"); - info->authenticated = true; - threadedRunner::scheduleRunnable(info->client); - delete info; - info = NULL; - break; - } - - // make sure that if things go arwy that we should be able to terminate - if (iskilled()) - { - break; - } - } while (0); - g_qMutex.unlock(); - } - } - - void updateServices (bool initial) - { - if (g_services == NULL) - return; - httpHeaderMap_t vars; - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - utf8 main_post = encodeVariables(vars); - - for (int i = 0; i < MAX_AUTH_THREADS; ++i) - { - if (initial) - { - g_services[i].main_post = main_post; - } - else - { - auth_info *info = new auth::auth_info (g_authURL); - info->post = main_post; - g_qMutex.lock(); - g_services[i].clients.push_back (info); - if (g_services[i].in_use == false) - { - g_services[i].in_use = true; - SimpleThread(authService::process, &g_services[i]); - } - g_qMutex.unlock(); - } - } - } - - void init() - { - g_services = new authService[MAX_AUTH_THREADS]; - if (g_services) - { - updateServices (true); - } - else - { - WLOG(LOGNAME "Failed to start auth service threads"); - } - } - - void cleanup() - { - if (g_services) - { - delete[] g_services; - g_services = NULL; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/auth.h b/Src/Plugins/DSP/sc_serv3/auth.h deleted file mode 100644 index 86e96e3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/auth.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once -#ifndef _AUTH_H -#define _AUTH_H - -#include -#include "unicode/uniString.h" -#include "uvox2Common.h" - - -class protocol_shoutcastClient; - -#define DNAS_AUTH_URL "https://auth.shoutcast.com/AddShout" - -namespace auth -{ - using namespace uniString; - class authService; - - typedef size_t streamID_t; - struct auth_info - { - protocol_shoutcastClient *client; - utf8 url; - utf8 post; - std::vector<__uint8> content; - streamID_t sid; - int group; - int m_dataType; - bool authenticated; - bool has_intro; - bool valid_response; - bool delayed_auth; - - explicit auth_info(const utf8& _url = "") - { - url = _url; - client = NULL; - group = -1; - authenticated = false; - has_intro = false; - valid_response = false; - delayed_auth = false; - sid = 1; - m_dataType = MP3_DATA; // default - } - - ~auth_info() - { - client = NULL; - post.clear(); - group = -1; - authenticated = false; - has_intro = false; - valid_response = false; - delayed_auth = false; - content.clear(); - sid = 0; - } - }; - - extern utf8 g_authURL; - - void schedule(auth_info *info); - void updateServices (bool initial = false); - void init(); - void cleanup(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/banList.cpp b/Src/Plugins/DSP/sc_serv3/banList.cpp deleted file mode 100644 index ac9bf6a4..00000000 --- a/Src/Plugins/DSP/sc_serv3/banList.cpp +++ /dev/null @@ -1,431 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -#include -#include "banList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[BAN] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -banList g_banList; - -class banList::impl -{ -private: - struct banEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct banEntry: public ban_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - void save(banEntrySave entrySave) throw(exception) - { - if (m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_numericIP + ";" + tos(m_mask) + ";" + m_comment + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " ban file"); - } - } - } - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - bool validMask() throw() - { - return (m_mask <= 255); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - banEntry(const utf8 &numericIP, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw() - :ban_t(numericIP, mask, comment, stream_ID), m_ip(stringToIP(numericIP, m_hostIP)) {} - banEntry() throw():m_ip(0){} - }; - - AOL_namespace::mutex m_lock; - list m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read ban file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - s = stripWhitespace(s); - - utf8::size_type pos1 = s.find(utf8::value_type(';')); - if (pos1 == utf8::npos) - { - throwEx(LOGNAME "Parse error in " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file on line " + tos(l)); - } - - utf8::size_type pos2 = s.find(utf8::value_type(';'),pos1+1); - if (pos2 == utf8::npos) - { - throwEx(LOGNAME "Parse error in " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + "ban file on line " + tos(l)); - } - - banEntry e(s.substr(0,pos1),utf8(s.substr(pos1+1,pos2 - pos1 - 1)).toInt(),s.substr(pos2+1),stream_ID); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list has been ignored (bad IP)"); - } - else if (!e.validMask()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list has been ignored (bad MASK)"); - } - else - { - if (this->find(e.m_numericIP,e.m_mask,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - ILOG(LOGNAME "Banned " + tos(count) + " IP" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file"); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " ban file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - banEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&banEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if (!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &ipAddr, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - banEntry e(ipAddr, mask,comment, stream_ID); - if (!e.validIP()) - { - throwEx(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - if (!e.validMask()) - { - throwEx(LOGNAME "Invalid MASK specified - `" + tos(mask) + "'"); - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, - const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for (list::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ( - (allStream || (!allStream && (((*i).m_numericIP == ipAddr) || ((*i).m_hostIP == ipAddr)) && ((*i).m_mask == mask))) && - ((*i).m_stream_ID == stream_ID)) - { - m_list.erase(i); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, mask, stream_ID, allStream, true, false); - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t mask, const size_t stream_ID, const bool use_lock=true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - utf8 hostIP; - in_addr_t ip = banEntry::stringToIP(ipAddr, hostIP); - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_mask == mask) && - ((*i).m_stream_ID == stream_ID) && - (ntohl((*i).m_ip) & ((*i).m_mask|0xffffff00)) == - (ntohl(ip) & ((*i).m_mask|0xffffff00) - ) - ) - return true; - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t stream_ID, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - utf8 hostIP; - in_addr_t ip = banEntry::stringToIP(ipAddr, hostIP); - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && - (ntohl((*i).m_ip) & ((*i).m_mask|0xffffff00)) == - (ntohl(ip) & ((*i).m_mask|0xffffff00))) - { - return true; - } - } - } - - return false; - } - - void get(std::vector &bl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - bl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -banList::banList():m_impl(0) -{ - m_impl = new banList::impl; -} - -banList::~banList() throw() -{ - forget(m_impl); -} - -bool banList::load(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool banList::save(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool banList::add(const utf8 &ipAddr, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, mask, comment, stream_ID); -} - -// true if removed -bool banList::remove(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, mask, stream_ID, allStream); -} - -// true if found -bool banList::find(const utf8 &ipAddr, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, stream_ID); -} - -// true if found -bool banList::find(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, mask, stream_ID); -} - -void banList::get(vector &bl, const size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl, stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/banList.h b/Src/Plugins/DSP/sc_serv3/banList.h deleted file mode 100644 index 97cb781d..00000000 --- a/Src/Plugins/DSP/sc_serv3/banList.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#ifndef banList_H_ -#define banList_H_ - -#include -#include "unicode/uniFile.h" - -// class that manages list of addresses banned from the system - -class banList -{ -private: - class impl; - impl *m_impl; - -public: - struct ban_t - { - size_t m_mask; - size_t m_stream_ID; // used to differentiate - uniString::utf8 m_numericIP; - uniString::utf8 m_comment; // hostname or other symbolic name - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - - ban_t(const uniString::utf8 &numericIP, const __uint32 mask, const uniString::utf8 &comment, const size_t stream_ID) throw() - : m_mask(mask), m_stream_ID(stream_ID), m_numericIP(numericIP), m_comment(comment) {} - - ban_t() throw() : m_mask(0), m_stream_ID(1){} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const __uint32 mask, const uniString::utf8 &comment, const size_t stream_ID) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &ipAddr, const size_t stream_ID) throw(); - bool find(const uniString::utf8 &ipAddr, const __uint32 mask, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - banList(); - ~banList() throw(); - - // for web administration reference - void get(std::vector &bl, const size_t stream_ID) throw(); -}; - -extern banList g_banList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/bandwidth.cpp b/Src/Plugins/DSP/sc_serv3/bandwidth.cpp deleted file mode 100644 index b909eb8f..00000000 --- a/Src/Plugins/DSP/sc_serv3/bandwidth.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "bandwidth.h" -#include "global.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.statsDebug()) DLOG(__VA_ARGS__); } while (0) - -#define LOGNAME "[BANDWIDTH] " - -static __uint64 g_bandWidthTable[bandWidth::ALL_OTHER]; -static AOL_namespace::rwLock g_bandwidthLock; - -const __uint64 bandWidth::getAmount(const bandWidth::usageType_t type) -{ - stackRWLock sl (g_bandwidthLock); - - if (type < ALL_SENT) - { - return g_bandWidthTable[type]; - } - - switch (type) - { - case bandWidth::ALL_SENT: - { - return g_bandWidthTable[CLIENT_V1_SENT] + - g_bandWidthTable[CLIENT_V2_SENT] + - g_bandWidthTable[CLIENT_HTTP_SENT] + - g_bandWidthTable[CLIENT_FLV_SENT] + - g_bandWidthTable[CLIENT_M4A_SENT] + - g_bandWidthTable[SOURCE_V1_SENT] + - g_bandWidthTable[SOURCE_V2_SENT] + - g_bandWidthTable[PUBLIC_WEB] + - g_bandWidthTable[PRIVATE_WEB] + - g_bandWidthTable[FLASH_POLICY] + - g_bandWidthTable[RELAY_V2_SENT]+ - g_bandWidthTable[YP_SENT] + - g_bandWidthTable[AUTH_AND_METRICS]; - } - case bandWidth::ALL_RECV: - { - return g_bandWidthTable[SOURCE_V1_RECV] + - g_bandWidthTable[SOURCE_V2_RECV] + - g_bandWidthTable[RELAY_MISC_RECV] + - g_bandWidthTable[RELAY_V1_RECV] + - g_bandWidthTable[RELAY_V2_RECV] + - g_bandWidthTable[YP_RECV] + - g_bandWidthTable[ADVERTS]; - } - case bandWidth::ALL_WEB: - { - return g_bandWidthTable[PUBLIC_WEB] + - g_bandWidthTable[PRIVATE_WEB]; - } - case bandWidth::ALL_SOURCE_SENT: - { - return g_bandWidthTable[SOURCE_V1_SENT] + - g_bandWidthTable[SOURCE_V2_SENT]; - } - case bandWidth::ALL_SOURCE_RECV: - { - return g_bandWidthTable[SOURCE_V1_RECV] + - g_bandWidthTable[SOURCE_V2_RECV]; - } - case bandWidth::ALL_CLIENT_SENT: - { - return g_bandWidthTable[CLIENT_V1_SENT] + - g_bandWidthTable[CLIENT_V2_SENT] + - g_bandWidthTable[CLIENT_HTTP_SENT] + - g_bandWidthTable[CLIENT_FLV_SENT] + - g_bandWidthTable[CLIENT_M4A_SENT]; - } - case bandWidth::ALL_RELAY_RECV: - { - return g_bandWidthTable[RELAY_MISC_RECV] + - g_bandWidthTable[RELAY_V1_RECV] + - g_bandWidthTable[RELAY_V2_RECV]; - } - case bandWidth::ALL_OTHER: - { - return g_bandWidthTable[FLASH_POLICY] + - g_bandWidthTable[RELAY_V2_SENT] + - g_bandWidthTable[YP_SENT] + - g_bandWidthTable[YP_RECV] + - g_bandWidthTable[AUTH_AND_METRICS] + - g_bandWidthTable[ADVERTS]; - } - default: - { - return 0; - } - } -} - -void bandWidth::updateAmount(const bandWidth::usageType_t type, const __uint64 amount) -{ - if (amount > 0) - { - stackRWLock sl (g_bandwidthLock, false); - g_bandWidthTable[type] += amount; - g_bandWidthTable[bandWidth::ALL] += amount; - } -} - -void bandWidth::getFinalAmounts() -{ - __uint64 all = getAmount(bandWidth::ALL); - if (all > 0) - { - ILOG(LOGNAME "Total: " + tos(all) + - ", Sent: " + tos(getAmount(bandWidth::ALL_SENT)) + - ", Recv: " + tos(getAmount(bandWidth::ALL_RECV))); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/bandwidth.h b/Src/Plugins/DSP/sc_serv3/bandwidth.h deleted file mode 100644 index a74c1c8b..00000000 --- a/Src/Plugins/DSP/sc_serv3/bandwidth.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#ifndef bandWidth_H_ -#define bandWidth_H_ - -#include "unicode/uniString.h" - -namespace bandWidth -{ - typedef enum - { - ALL = 0, - PUBLIC_WEB, // public facing pages - PRIVATE_WEB, // private admin pages - - SOURCE_V1_SENT, // v1 source connections sent - SOURCE_V1_RECV, // v1 source connections received - SOURCE_V2_SENT, // v2 source connections sent - SOURCE_V2_RECV, // v2 source connections received - - CLIENT_V1_SENT, // v1 client connections - CLIENT_V2_SENT, // v2 client connections - CLIENT_HTTP_SENT, // HTTP client connections - CLIENT_FLV_SENT, // FLV client connections - CLIENT_M4A_SENT, // M4A client connections - - FLASH_POLICY, // flash policy server - - RELAY_MISC_RECV, // relay connnections handshaking - RELAY_V1_RECV, // v1 relay connnections received - RELAY_V2_SENT, // v2 relay connnections sent - RELAY_V2_RECV, // v2 relay connnections received - - YP_SENT, // YP connections sent - YP_RECV, // YP connections received - - AUTH_AND_METRICS, // metrics based responses - ADVERTS, // advert data requests / pulls - - ALL_SENT, // consolidated sent total - ALL_RECV, // consolidated received total - ALL_WEB, // consolidated web page total - ALL_SOURCE_SENT, // consolidated source sent total - ALL_SOURCE_RECV, // consolidated source received total - ALL_CLIENT_SENT, // consolidated client sent total - ALL_RELAY_RECV, // consolidated relay received total - ALL_OTHER // consolidated remainder total - } usageType_t; - - const __uint64 getAmount(const bandWidth::usageType_t); - void updateAmount(const bandWidth::usageType_t, const __uint64 amount); - void getFinalAmounts(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/base64.cpp b/Src/Plugins/DSP/sc_serv3/base64.cpp deleted file mode 100644 index 358ed66c..00000000 --- a/Src/Plugins/DSP/sc_serv3/base64.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include "base64.h" - -using namespace std; - -static const std::string base64_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - -static inline bool is_base64(__uint8 c) -{ - return (isalnum(c) || (c == '+') || (c == '/')); -} - -const std::vector<__uint8> base64::decode(std::string const& encoded_string) -{ - size_t in_len = encoded_string.size(); - int i = 0, in_ = 0; - __uint8 char_array_4[4], char_array_3[3]; - std::vector<__uint8> ret; - - while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) - { - char_array_4[i++] = encoded_string[in_]; ++in_; - if (i == 4) - { - for (i = 0; i <4; i++) - { - char_array_4[i] = (__uint8)base64_chars.find(char_array_4[i]); - } - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (i = 0; (i < 3); i++) - { - ret.push_back(char_array_3[i]); - } - - i = 0; - } - } - - if (i) - { - int j = 0; - for (j = i; j <4; j++) - { - char_array_4[j] = 0; - } - - for (j = 0; j <4; j++) - { - char_array_4[j] = (__uint8)base64_chars.find(char_array_4[j]); - } - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (j = 0; (j < i - 1); j++) - { - ret.push_back(char_array_3[j]); - } - } - - return ret; -} diff --git a/Src/Plugins/DSP/sc_serv3/base64.h b/Src/Plugins/DSP/sc_serv3/base64.h deleted file mode 100644 index 723cc6a1..00000000 --- a/Src/Plugins/DSP/sc_serv3/base64.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#ifndef base64_H_ -#define base64_H_ - -#include "unicode/uniString.h" - -// no decoding... yet -namespace base64 -{ - template - OUTT encode(ITER start, ITER finish) throw() - { - static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int shift = 0; - int accum = 0; - - ITER i = start; - OUTT result; - - while (i != finish) - { - accum <<= 8; - shift += 8; - accum |= *(i++); - while (shift >= 6) - { - shift -= 6; - result.push_back((typename OUTT::value_type)alphabet[(accum >> shift) & 0x3F]); - } - } - if (shift == 4) - { - result.push_back((typename OUTT::value_type)alphabet[(accum & 0xF)<<2]); - result.push_back((typename OUTT::value_type)'='); - } - else if (shift == 2) - { - result.push_back((typename OUTT::value_type)alphabet[(accum & 0x3)<<4]); - result.push_back((typename OUTT::value_type)'='); - result.push_back((typename OUTT::value_type)'='); - } - return result; - } - - template - OUTT encode(const CONT &c) throw() - { - return base64::encode(c.begin(), c.end()); - } - - const std::vector<__uint8> decode(std::string const& encoded_string); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cache.cpp b/Src/Plugins/DSP/sc_serv3/cache.cpp deleted file mode 100644 index ea9fe2fa..00000000 --- a/Src/Plugins/DSP/sc_serv3/cache.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "cache.h" - -void AddorUpdateCache(cacheItem *item, const time_t now, const bool compressed, - const uniString::utf8 &header, const uniString::utf8 &response, - CacheMap_t &cache, AOL_namespace::mutex &lock, - const streamData::streamID_t sid) -{ - if (lock.timedLock(3000)) - { - // if we've already got an instance then we update - if (item == NULL) - { - item = cache[sid] = new cacheItem(); - } - - if (item != NULL) - { - if (compressed) - { - item->generatedGZIP = now; - item->responseGZIP = response; - item->headerGZIP = header; - } - else - { - item->generatedRaw = now; - item->responseRaw = response; - item->headerRaw = header; - } - } - lock.unlock(); - } -} - -bool GetFromCache(const cacheItem *item, AOL_namespace::mutex &lock, - const time_t now, const bool compressed, - const bool headRequest, uniString::utf8 &response, - const int limit) -{ - if (lock.timedLock(3000)) - { - if (item != NULL) - { - if (((now - item->generatedGZIP) < limit) && compressed) - { - if (item->responseGZIP.size() > 0) - { - response = (!headRequest ? item->responseGZIP : item->headerGZIP); - lock.unlock(); - return true; - } - } - else if (((now - item->generatedRaw) < limit) && !compressed) - { - if (item->responseRaw.size() > 0) - { - response = (!headRequest ? item->responseRaw : item->headerRaw); - lock.unlock(); - return true; - } - } - } - lock.unlock(); - } - return false; -} - -void DeleteCache(CacheMap_t &cache) -{ - if (!cache.empty()) - { - for (CacheMap_t::const_iterator i = cache.begin(); i != cache.end(); ++i) - { - delete (*i).second; - } - cache.clear(); - } -} - -void DeleteAllCaches() -{ - DeleteCache(m_xmlStatsCache); - DeleteCache(m_xmlStatisticsCache); - DeleteCache(m_jsonStatsCache); - DeleteCache(m_jsonStatisticsCache); - DeleteCache(m_7Cache); - DeleteCache(m_PLSCache); - DeleteCache(m_M3UCache); - DeleteCache(m_ASXCache); - DeleteCache(m_QTLCache); - DeleteCache(m_XSPFCache); - DeleteCache(m_xmlTracksCache); - DeleteCache(m_jsonTracksCache); - DeleteCache(m_xmlPlayedCache); - DeleteCache(m_jsonPlayedCache); - DeleteCache(m_htmlPlayedCache); - DeleteCache(m_streamArtCache); - DeleteCache(m_playingArtCache); - DeleteCache(m_crossdomainCache); -} diff --git a/Src/Plugins/DSP/sc_serv3/cache.h b/Src/Plugins/DSP/sc_serv3/cache.h deleted file mode 100644 index 72dfb9c5..00000000 --- a/Src/Plugins/DSP/sc_serv3/cache.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#ifndef _CACHE_H -#define _CACHE_H - -#include "unicode/uniString.h" -#include "streamData.h" - -struct cacheItem -{ - time_t generatedGZIP; - time_t generatedRaw; - uniString::utf8 headerGZIP; - uniString::utf8 headerRaw; - uniString::utf8 responseGZIP; - uniString::utf8 responseRaw; - - cacheItem() : generatedGZIP(0), generatedRaw(0) - { - } - - ~cacheItem() - { - generatedGZIP = generatedRaw = 0; - headerGZIP.clear(); - headerRaw.clear(); - responseGZIP.clear(); - responseRaw.clear(); - } -}; - -typedef std::map CacheMap_t; - -void AddorUpdateCache(cacheItem *item, const time_t now, const bool compressed, - const uniString::utf8 &header, const uniString::utf8 &response, - CacheMap_t &cache, AOL_namespace::mutex &lock, - const streamData::streamID_t sid); - -bool GetFromCache(const cacheItem *item, AOL_namespace::mutex &lock, - const time_t now, const bool compressed, - const bool headRequest, uniString::utf8 &response, - const int limit = 1); - -void DeleteCache(CacheMap_t &cache); -void DeleteAllCaches(); - -extern CacheMap_t m_xmlStatsCache, m_xmlStatisticsCache, m_jsonStatsCache, - m_jsonStatisticsCache, m_7Cache, m_PLSCache, m_M3UCache, - m_ASXCache, m_QTLCache, m_XSPFCache, m_xmlTracksCache, - m_jsonTracksCache, m_xmlPlayedCache, m_jsonPlayedCache, - m_htmlPlayedCache, m_streamArtCache, m_playingArtCache, - m_crossdomainCache; -#endif diff --git a/Src/Plugins/DSP/sc_serv3/config.cpp b/Src/Plugins/DSP/sc_serv3/config.cpp deleted file mode 100644 index 0b6cd64b..00000000 --- a/Src/Plugins/DSP/sc_serv3/config.cpp +++ /dev/null @@ -1,2867 +0,0 @@ -#include "config.h" -#include "stl/stringUtils.h" -#include -#include "cpucount.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#else -#include "unixversion.h" -#endif -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "agentList.h" -#include "w3cLog.h" -#include "global.h" -#include -#include -#include -#include - -#define LOGNAME "[CONFIG] " - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -config::config() throw() -{ - #define OPTINIT(n) accessor_t(&config::assign_##n, &config::fetch_##n, &config::count_##n, &config::multi_##n, &config::def_##n) - - m_optMap["configrewrite"] = OPTINIT(configRewrite); - - m_optMap["log"] = OPTINIT(log); - m_optMap["screenlog"] = OPTINIT(screenLog); - m_optMap["logfile"] = OPTINIT(logFile); - m_optMap["reallogfile"] = OPTINIT(realLogFile); - m_optMap["logrotates"] = OPTINIT(logRotates); - m_optMap["logarchive"] = OPTINIT(logArchive); - m_optMap["rotateinterval"] = OPTINIT(rotateInterval); - - // networking - m_optMap["namelookups"] = OPTINIT(nameLookups); - m_optMap["alternateports"] = OPTINIT(alternatePorts); - m_optMap["portbase"] = OPTINIT(portBase); - m_optMap["publicport"] = OPTINIT(publicPort); - m_optMap["portlegacy"] = OPTINIT(portLegacy); - m_optMap["autodumptime"] = OPTINIT(autoDumpTime); - m_optMap["maxheaderlinesize"] = OPTINIT(maxHeaderLineSize); - m_optMap["maxheaderlinecount"] = OPTINIT(maxHeaderLineCount); - m_optMap["password"] = OPTINIT(password); - m_optMap["adminpassword"] = OPTINIT(adminPassword); - m_optMap["sslcertificatefile"] = OPTINIT(sslCertificateFile); - m_optMap["sslcertificatekeyfile"] = OPTINIT(sslCertificateKeyFile); - - m_optMap["buffertype"] = OPTINIT(bufferType); - m_optMap["fixedbuffersize"] = OPTINIT(fixedBufferSize); - m_optMap["adaptivebuffersize"] = OPTINIT(adaptiveBufferSize); - m_optMap["bufferhardlimit"] = OPTINIT(bufferHardLimit); - m_optMap["metainterval"] = OPTINIT(metaInterval); - - m_optMap["adtestfileloop"] = OPTINIT(adTestFileLoop); - m_optMap["adtestfile"] = OPTINIT(adTestFile); - m_optMap["adtestfile2"] = OPTINIT(adTestFile2); - m_optMap["adtestfile3"] = OPTINIT(adTestFile3); - m_optMap["adtestfile4"] = OPTINIT(adTestFile4); - m_optMap["introfile"] = OPTINIT(introFile); - m_optMap["backupfile"] = OPTINIT(backupFile); - m_optMap["backuptitle"] = OPTINIT(backupTitle); - m_optMap["backuploop"] = OPTINIT(backupLoop); - m_optMap["maxspecialfilesize"] = OPTINIT(maxSpecialFileSize); - - m_optMap["artworkfile"] = OPTINIT(artworkFile); - - m_optMap["uvoxcipherkey"] = OPTINIT(uvoxCipherKey); - - //// w3c logging - m_optMap["w3cenable"] = OPTINIT(w3cEnable); - m_optMap["w3clog"] = OPTINIT(w3cLog); - - m_optMap["pidfile"] = OPTINIT(pidFile); - - //// relaying - m_optMap["relayreconnecttime"] = OPTINIT(relayReconnectTime); - m_optMap["relayconnectretries"] = OPTINIT(relayConnectRetries); - m_optMap["maxhttpredirects"] = OPTINIT(maxHTTPRedirects); - m_optMap["allowrelay"] = OPTINIT(allowRelay); - m_optMap["allowpublicrelay"] = OPTINIT(allowPublicRelay); - ///// - - //// stream configuration - m_optMap["streamid"] = OPTINIT(stream_ID); - m_optMap["streamauthhash"] = OPTINIT(stream_authHash); - m_optMap["streampath"] = OPTINIT(stream_path); - m_optMap["streamrelayurl"] = OPTINIT(stream_relayURL); - m_optMap["streambackupurl"] = OPTINIT(stream_backupURL); - m_optMap["streamminbitrate"] = OPTINIT(stream_minBitrate); - m_optMap["streammaxbitrate"] = OPTINIT(stream_maxBitrate); - m_optMap["streammaxuser"] = OPTINIT(stream_maxUser); - m_optMap["streampassword"] = OPTINIT(stream_password); - m_optMap["streamadminpassword"] = OPTINIT(stream_adminPassword); - m_optMap["streampublicserver"] = OPTINIT(stream_publicServer); - m_optMap["streamallowrelay"] = OPTINIT(stream_allowRelay); - m_optMap["streamallowpublicrelay"] = OPTINIT(stream_allowPublicRelay); - m_optMap["streamriponly"] = OPTINIT(stream_ripOnly); - m_optMap["streamautodumpsourcetime"] = OPTINIT(stream_autoDumpSourceTime); - m_optMap["streamautodumptime"] = OPTINIT(stream_autoDumpTime); - m_optMap["streamautodumpusers"] = OPTINIT(stream_autoDumpUsers); - m_optMap["streamlistenertime"] = OPTINIT(stream_listenerTime); - m_optMap["streamsonghistory"] = OPTINIT(stream_songHistory); - m_optMap["streamuvoxcipherkey"] = OPTINIT(stream_uvoxCipherKey); - m_optMap["streamlogfile"] = OPTINIT(stream_logFile); - m_optMap["streamadtestfileloop"] = OPTINIT(stream_adTestFileLoop); - m_optMap["streamadtestfile"] = OPTINIT(stream_adTestFile); - m_optMap["streamadtestfile2"] = OPTINIT(stream_adTestFile2); - m_optMap["streamadtestfile3"] = OPTINIT(stream_adTestFile3); - m_optMap["streamadtestfile4"] = OPTINIT(stream_adTestFile4); - m_optMap["streamintrofile"] = OPTINIT(stream_introFile); - m_optMap["streambackupfile"] = OPTINIT(stream_backupFile); - m_optMap["streambackuptitle"] = OPTINIT(stream_backupTitle); - m_optMap["streambackuploop"] = OPTINIT(stream_backupLoop); - m_optMap["streambanfile"] = OPTINIT(stream_banFile); - m_optMap["streamripfile"] = OPTINIT(stream_ripFile); - m_optMap["streamagentfile"] = OPTINIT(stream_agentFile); - m_optMap["streamartworkfile"] = OPTINIT(stream_artworkFile); - m_optMap["streamw3clog"] = OPTINIT(stream_w3cLog); - m_optMap["streamhidestats"] = OPTINIT(stream_hideStats); - m_optMap["streamredirecturl"] = OPTINIT(stream_redirectUrl); - m_optMap["streammovedurl"] = OPTINIT(stream_movedUrl); - m_optMap["streamratelimitwait"] = OPTINIT(stream_rateLimitWait); - - m_optMap["requirestreamconfigs"] = OPTINIT(requireStreamConfigs); - m_optMap["userid"] = OPTINIT(userId); - m_optMap["licenceid"] = OPTINIT(licenceId); - - //// cdn - m_optMap["cdn"] = OPTINIT(cdn); - m_optMap["cdnmaster"] = OPTINIT(cdn_master); - m_optMap["cdnslave"] = OPTINIT(cdn_slave); - - //// flash - m_optMap["flashpolicyfile"] = OPTINIT(flashPolicyFile); - m_optMap["flashpolicyserverport"] = OPTINIT(flashPolicyServerPort); - - //// yp - m_optMap["yptimeout"] = OPTINIT(ypTimeout); - m_optMap["ypaddr"] = OPTINIT(ypAddr); - m_optMap["ypport"] = OPTINIT(ypPort); - m_optMap["yport"] = OPTINIT(ypPort); - m_optMap["yppath"] = OPTINIT(ypPath); - m_optMap["ypmaxretries"] = OPTINIT(ypMaxRetries); - m_optMap["ypreportinterval"] = OPTINIT(ypReportInterval); - m_optMap["ypminreportinterval"] = OPTINIT(ypMinReportInterval); - m_optMap["publicserver"] = OPTINIT(publicServer); - - /// agent - m_optMap["agentfile"] = OPTINIT(agentFile); - m_optMap["saveagentlistonexit"] = OPTINIT(saveAgentListOnExit); - m_optMap["blockemptyuseragent"] = OPTINIT(blockEmptyUserAgent); - - //// stats - m_optMap["hidestats"] = OPTINIT(hideStats); - m_optMap["minbitrate"] = OPTINIT(minBitrate); - m_optMap["maxbitrate"] = OPTINIT(maxBitrate); - m_optMap["maxuser"] = OPTINIT(maxUser); - - // radionomy metrics - m_optMap["admetricsdebug"] = OPTINIT(adMetricsDebug); - m_optMap["metricsmaxqueue"] = OPTINIT(metricsMaxQueue); - - m_optMap["authdebug"] = OPTINIT(authDebug); - - /// client behaviour - m_optMap["listenertime"] = OPTINIT(listenerTime); - m_optMap["autodumpusers"] = OPTINIT(autoDumpUsers); - m_optMap["srcdns"] = OPTINIT(srcIP); - m_optMap["srcip"] = OPTINIT(srcIP); - m_optMap["destdns"] = OPTINIT(destIP); - m_optMap["destip"] = OPTINIT(destIP); - m_optMap["dstip"] = OPTINIT(destIP); - m_optMap["publicdns"] = OPTINIT(publicIP); - m_optMap["publicip"] = OPTINIT(publicIP); - m_optMap["titleformat"] = OPTINIT(titleFormat); - m_optMap["urlformat"] = OPTINIT(urlFormat); - - //// banning - m_optMap["banfile"] = OPTINIT(banFile); - m_optMap["savebanlistonexit"] = OPTINIT(saveBanListOnExit); - - //// rip - m_optMap["ripfile"] = OPTINIT(ripFile); - m_optMap["saveriplistonexit"] = OPTINIT(saveRipListOnExit); - m_optMap["riponly"] = OPTINIT(ripOnly); - - m_optMap["adminfile"] = OPTINIT(adminFile); - - //// debugging - m_optMap["webclientdebug"] = OPTINIT(webClientDebug); - m_optMap["yp2debug"] = OPTINIT(yp2Debug); - m_optMap["shoutcastsourcedebug"] = OPTINIT(shoutcastSourceDebug); - m_optMap["uvox2sourcedebug"] = OPTINIT(uvox2SourceDebug); - m_optMap["httpsourcedebug"] = OPTINIT(HTTPSourceDebug); - m_optMap["streamdatadebug"] = OPTINIT(streamDataDebug); - m_optMap["microserverdebug"] = OPTINIT(microServerDebug); - m_optMap["httpstyledebug"] = OPTINIT(httpStyleDebug); - m_optMap["shoutcast1clientdebug"] = OPTINIT(shoutcast1ClientDebug); - m_optMap["shoutcast2clientdebug"] = OPTINIT(shoutcast2ClientDebug); - m_optMap["httpclientdebug"] = OPTINIT(HTTPClientDebug); - m_optMap["flvclientdebug"] = OPTINIT(flvClientDebug); - m_optMap["m4aclientdebug"] = OPTINIT(m4aClientDebug); - m_optMap["relaydebug"] = OPTINIT(relayDebug); - m_optMap["relayshoutcastdebug"] = OPTINIT(relayShoutcastDebug); - m_optMap["relayuvoxdebug"] = OPTINIT(relayUvoxDebug); - m_optMap["statsdebug"] = OPTINIT(statsDebug); - m_optMap["threadrunnerdebug"] = OPTINIT(threadRunnerDebug); - - m_optMap["songhistory"] = OPTINIT(songHistory); - m_optMap["showlastsongs"] = OPTINIT(songHistory); - - ///// misc nonsense - m_optMap["unique"] = OPTINIT(unique); - m_optMap["include"] = OPTINIT(include); - m_optMap["cpucount"] = OPTINIT(cpuCount); - m_optMap["clacks"] = OPTINIT(clacks); - m_optMap["startinactive"] = OPTINIT(startInactive); - m_optMap["ratelimit"] = OPTINIT(rateLimit); - m_optMap["ratelimitwait"] = OPTINIT(rateLimitWait); - m_optMap["usexff"] = OPTINIT(useXFF); - m_optMap["logclients"] = OPTINIT(logClients); - m_optMap["admincssfile"] = OPTINIT(adminCSSFile); - m_optMap["faviconfile"] = OPTINIT(faviconFile); - m_optMap["faviconmimetype"] = OPTINIT(faviconFileMimeType); - m_optMap["robotstxtfile"] = OPTINIT(robotstxtFile); - m_optMap["redirecturl"] = OPTINIT(redirectUrl); - m_optMap["forceshortsends"] = OPTINIT(forceShortSends); - m_optMap["adminnowrap"] = OPTINIT(adminNoWrap); - - // used to control the cache handling - m_favIconTime = m_styleCustomHeaderTime = 0; -} - -// return the streamConfig entries that reference relays -const vector config::getRelayList() -{ - vector result; - streams_t stream_configs; - getStreamConfigs(stream_configs); - - // get all stream configs and then make a vector list of only valid configs - // which ensures we're only getting known stream configs unlike prior to - // the behaviour with builds 24 which usually gave an extra config than was - for (config::streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if ((*i).second.m_relayUrl.isSet()) - { - result.push_back((*i).second); - } - } - - return result; -} - -// return the streamConfig entry that references the backup url asked -const vector config::getBackupUrl(const size_t streamID) throw(exception) -{ - vector result; - streams_t stream_configs; - getStreamConfigs(stream_configs); - config::streams_t::const_iterator i = stream_configs.find(streamID); - - if (i != stream_configs.end()) - { - if ((*i).second.m_backupUrl.isSet()) - { - result.push_back((*i).second); - } - } - - return result; -} - -unsigned short config::getMetaInterval(const size_t streamID) const throw() -{ - unsigned short metainterval = stream_metaInterval(streamID); - if (!read_stream_metaInterval(streamID)) - { - metainterval = metaInterval(); - } - - // don't allow less than 256 and - // due to overflow we don't need - // to do an upper check as it'll - // have wrapped around for this. - return (metainterval < 256 ? 256 : metainterval); -} - -int config::getBackupLoop(const size_t streamID) const throw() -{ - int backuploop = stream_backupLoop(streamID); - if (!read_stream_backupLoop(streamID)) - { - backuploop = backupLoop(); - } - return backuploop; -} - -int config::getRateLimitWait(const size_t streamID) const throw() -{ - int ratelimitwait = stream_rateLimitWait(streamID); - if (!read_stream_rateLimitWait(streamID)) - { - ratelimitwait = rateLimitWait(); - } - // just to make sure that we're giving a sane value - return (ratelimitwait > 0 ? ratelimitwait : def_rateLimitWait().toInt()); -} - -const int config::isBitrateDisallowed(const size_t streamID, const int bitrate, - int &streamMinBitrate, int &streamMaxBitrate) const throw() -{ - int ret = 0; - - // check that these bitrates are allowed (looking at both max and average values) - streamMinBitrate = stream_minBitrate(streamID); - if (!read_stream_minBitrate(streamID) || !streamMinBitrate) - { - streamMinBitrate = minBitrate(); - } - - if ((streamMinBitrate > 0) && (bitrate < streamMinBitrate)) - { - ret |= 1; - } - - streamMaxBitrate = stream_maxBitrate(streamID); - if (!read_stream_maxBitrate(streamID) || !streamMaxBitrate) - { - streamMaxBitrate = maxBitrate(); - } - - if ((streamMaxBitrate > 0) && (bitrate > streamMaxBitrate)) - { - ret |= 2; - } - - return ret; -} - -size_t config::getSongHistorySize(const size_t streamID) const throw() -{ - size_t songhistory = stream_songHistory(streamID); - if (!read_stream_songHistory(streamID)) - { - songhistory = songHistory(); - } - return songhistory; -} - -const int config::getAutoDumpTime(const size_t streamID) const throw() -{ - size_t sid = (!streamID ? streamID : DEFAULT_SOURCE_STREAM); - int dumpTime = stream_autoDumpTime(sid); - if (!read_stream_autoDumpTime(sid) || !dumpTime) - { - dumpTime = autoDumpTime(); - } - return dumpTime; -} - -const int config::getCPUCount() const throw() -{ - int cpu_count = cpuCount(); // check options - - if (cpu_count < 1) - { - int maxclients = gOptions.maxUser(); - if (maxclients < 1100) - cpu_count = (maxclients/350) +1; - else - { - int hwcpus = cpucount(); - if (hwcpus < 5) - cpu_count = hwcpus; - else - cpu_count = (((int)::log10 ((double)maxclients) - 2) * 6) - 2; // should be range of 4-12 - } - } - if (cpu_count < 1) cpu_count = 2; // eh? can never be less than 1 - return cpu_count; -} - -bool config::setupPasswords(const streams_t &stream_configs) throw(exception) -{ - // now form the per stream versions of passwords if there are any - bool passwordError = false; - for (streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - utf8 tempAdminPassword = (*i).second.m_adminPassword; - if (tempAdminPassword.empty()) - { - tempAdminPassword = gOptions.adminPassword(); - } - - utf8 tempPassword = (*i).second.m_password; - if (tempPassword.empty()) - { - tempPassword = gOptions.password(); - } - - // follow legacy behaviour (just incase) - if (tempAdminPassword.empty()) - { - tempAdminPassword = tempPassword; - } - else - { - // otherwise if explicitly set as the same then we abort - if (tempAdminPassword == tempPassword) - { - WLOG(logSectionName() + "Stream " + tos((*i).first) + " should not have matching passwords for `adminpassword' and `password'."); - } - } - - if (tempAdminPassword.empty() && tempPassword.empty()) - { - ELOG(logSectionName() + "Stream " + tos((*i).first) + " does not have any passwords specified."); - passwordError = true; - } - } - - return passwordError; -} - -config::streamConfig& config::getPerStreamConfig(streamConfig& stream, const size_t sid, const bool useParent) -{ - // tweak the maxuser setting on the stream so it can be made to follow the - // per stream setting or for it to revert to the global server limit - int tempMaxUser = native_fetch_stream_maxUser(sid); - if (!tempMaxUser || (tempMaxUser > gOptions.maxUser())) - { - if (useParent) - { - tempMaxUser = 0; - } - } - - int tempMaxBitrate = native_fetch_stream_maxBitrate(sid); - if (!read_stream_maxBitrate(sid)) - { - if (useParent) - { - tempMaxBitrate = gOptions.maxBitrate(); - } - } - - int tempMinBitrate = native_fetch_stream_minBitrate(sid); - if (!read_stream_minBitrate(sid)) - { - if (useParent) - { - tempMinBitrate = gOptions.minBitrate(); - } - } - - bool tempAllowRelay = native_fetch_stream_allowRelay(sid); - if (!read_stream_allowRelay(sid)) - { - if (useParent) - { - tempAllowRelay = gOptions.allowRelay(); - } - } - - bool tempAllowPublicRelay = native_fetch_stream_allowPublicRelay(sid); - if (!read_stream_allowPublicRelay(sid)) - { - if (useParent) - { - tempAllowPublicRelay = gOptions.allowPublicRelay(); - } - } - - utf8 tempAdminPassword = native_fetch_stream_adminPassword(sid); - if (tempAdminPassword.empty()) - { - if (useParent) - { - tempAdminPassword = gOptions.adminPassword(); - } - } - - utf8 tempPassword = native_fetch_stream_password(sid); - if (tempPassword.empty()) - { - if (useParent) - { - tempPassword = gOptions.password(); - } - } - - utf8 tempPublicServer = native_fetch_stream_publicServer(sid); - if (tempPublicServer.empty()) - { - if (useParent) - { - tempPublicServer = gOptions.publicServer(); - } - } - - return (stream = streamConfig(native_fetch_stream_ID(sid), native_fetch_stream_authHash(sid), - native_fetch_stream_path(sid), native_fetch_stream_relayURL(sid), - native_fetch_stream_backupURL(sid), tempMaxUser, tempMaxBitrate, - tempMinBitrate, tempAdminPassword, tempPassword, - tempPublicServer, tempAllowRelay, tempAllowPublicRelay)); -} - -// return a streamConfig entry for the streamID -const bool config::getStreamConfig(streamConfig& stream, const size_t streamID) -{ - stackLock sml(m_lock); - - map::iterator i = m_stream_ID.find(streamID); - if (i != m_stream_ID.end()) - { - config::getPerStreamConfig(stream, streamID); - return true; - } - - return false; -} - -// return all streamConfig entries organized by streamID -void config::getStreamConfigs(streams_t& streams, const bool useParent) -{ - stackLock sml(m_lock); - - for (map::const_iterator i = m_stream_ID.begin(); i != m_stream_ID.end(); ++i) - { - streamConfig stream; - streams[native_fetch_stream_ID((*i).second)] = getPerStreamConfig(stream, (*i).second, useParent); - } - - -} - -// attempt to update an existing stream configuration with the new data -// and then attempt to pass it to the currently active stream based on it -__uint64 config::updateStreamConfig(config &readConfig, streamConfig update) throw(exception) -{ - if (!update.m_streamID) - { - return 0; - } - - stackLock sml(m_lock); - size_t streamID = update.m_streamID; - __uint64 updated = 0; - - if (native_fetch_stream_authHash(streamID) != update.m_authHash) - { - native_assign_stream_authHash(streamID, update.m_authHash); - updated |= AUTH_HASH; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AUTH_HASH"); - #endif - } - - if (native_fetch_stream_path(streamID) != update.m_urlPath) - { - native_assign_stream_path(streamID, update.m_urlPath); - updated |= URL_PATH; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("URL_PATH"); - #endif - } - - if (native_fetch_stream_relayURL(streamID) != update.m_relayUrl.url()) - { - native_assign_stream_relayURL(streamID, update.m_relayUrl.url()); - updated |= RELAY_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RELAY_URL"); - #endif - } - - if (native_fetch_stream_backupURL(streamID) != update.m_backupUrl.url()) - { - native_assign_stream_backupURL(streamID, update.m_backupUrl.url()); - updated |= BACKUP_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_URL"); - #endif - } - - if (native_fetch_stream_maxUser(streamID) != update.m_maxStreamUser) - { - native_assign_stream_maxUser(streamID, update.m_maxStreamUser); - updated |= MAX_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MAX_USER"); - #endif - } - - if (native_fetch_stream_maxBitrate(streamID) != update.m_maxStreamBitrate) - { - native_assign_stream_maxBitrate(streamID, update.m_maxStreamBitrate); - updated |= MAX_BITRATE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MAX_BITRATE"); - #endif - } - - if (native_fetch_stream_minBitrate(streamID) != update.m_minStreamBitrate) - { - native_assign_stream_minBitrate(streamID, update.m_minStreamBitrate); - updated |= MIN_BITRATE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MIN_BITRATE"); - #endif - } - - utf8 publicServer = readConfig.stream_publicServer(streamID); - if (native_fetch_stream_publicServer(streamID) != publicServer) - { - if (!readConfig.read_stream_publicServer(streamID)) - { - publicServer = gOptions.publicServer(); - } - else - { - updated |= PUBLIC_SRV; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("PUBLIC_SRV"); - #endif - } - native_assign_stream_publicServer(streamID, publicServer); - } - - bool allowRelay = readConfig.stream_allowRelay(streamID); - if (native_fetch_stream_allowRelay(streamID) != allowRelay) - { - if (!readConfig.read_stream_allowRelay(streamID)) - { - allowRelay = gOptions.allowRelay(); - } - native_assign_stream_allowRelay(streamID, allowRelay); - updated |= ALLOW_RELAY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ALLOW_RELAY"); - #endif - } - - bool allowPublicRelay = readConfig.stream_allowPublicRelay(streamID); - if (native_fetch_stream_allowPublicRelay(streamID) != allowPublicRelay) - { - if (!readConfig.read_stream_allowPublicRelay(streamID)) - { - allowPublicRelay = gOptions.allowPublicRelay(); - } - native_assign_stream_allowPublicRelay(streamID, allowPublicRelay); - updated |= ALLOW_PUBLIC_RELAY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ALLOW_PUBLIC_RELAY"); - #endif - } - - bool ripOnly = readConfig.stream_ripOnly(streamID); - if (native_fetch_stream_ripOnly(streamID) != ripOnly) - { - if (!readConfig.read_stream_ripOnly(streamID)) - { - ripOnly = gOptions.ripOnly(); - } - native_assign_stream_ripOnly(streamID, ripOnly); - updated |= RIP_ONLY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RIP_ONLY"); - #endif - } - - int autoDumpTime = readConfig.stream_autoDumpTime(streamID); - if (native_fetch_stream_autoDumpTime(streamID) != autoDumpTime) - { - if (!readConfig.read_stream_autoDumpTime(streamID)) - { - autoDumpTime = gOptions.autoDumpTime(); - } - native_assign_stream_autoDumpTime(streamID, autoDumpTime); - updated |= DUMP_TIME; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("DUMP_TIME"); - #endif - } - - bool autoDumpUsers = readConfig.stream_autoDumpUsers(streamID); - if (native_fetch_stream_autoDumpUsers(streamID) != autoDumpUsers) - { - if (!readConfig.read_stream_autoDumpUsers(streamID)) - { - autoDumpUsers = gOptions.autoDumpUsers(); - } - native_assign_stream_autoDumpUsers(streamID, autoDumpUsers); - updated |= DUMP_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("DUMP_USER"); - #endif - } - - size_t listenerTime = readConfig.stream_listenerTime(streamID); - if (native_fetch_stream_listenerTime(streamID) != listenerTime) - { - if (!readConfig.read_stream_listenerTime(streamID)) - { - listenerTime = gOptions.listenerTime(); - } - native_assign_stream_listenerTime(streamID, listenerTime); - updated |= LIST_TIME; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("LIST_TIME"); - #endif - } - - int songHistory = readConfig.stream_songHistory(streamID); - if (native_fetch_stream_songHistory(streamID) != songHistory) - { - if (!readConfig.read_stream_songHistory(streamID)) - { - songHistory = gOptions.songHistory(); - } - native_assign_stream_songHistory(streamID, songHistory); - updated |= SONG_HIST; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("SONG_HIST"); - #endif - } - - utf8 uvoxCipherKey = readConfig.stream_uvoxCipherKey(streamID); - if (native_fetch_stream_uvoxCipherKey(streamID) != uvoxCipherKey) - { - if (!readConfig.read_stream_uvoxCipherKey(streamID)) - { - uvoxCipherKey = gOptions.uvoxCipherKey(); - } - native_assign_stream_uvoxCipherKey(streamID, uvoxCipherKey); - updated |= CIPHER_KEY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CIPHER_KEY"); - #endif - } - - // passwords are handled slightly differently as clearing of the - // password will lead to an invalid scenario so we check and block - utf8 streamPassword = readConfig.stream_password(streamID); - if (native_fetch_stream_password(streamID) != streamPassword) - { - if (!readConfig.read_stream_password(streamID)) - { - // clear what was being previously stored if possible - m_stream_password[streamID].clear(); - updated |= SOURCE_PWD; - } - else - { - // if empty then set back to the master password - if(streamPassword.empty()) - { - streamPassword = readConfig.password(); - } - - // if empty then set back to the master admin password - if(streamPassword.empty()) - { - ELOG(LOGNAME "'password' cannot be set to empty. Not applying this change to stream config# " + tos(streamID)); - } - else - { - native_assign_stream_password(streamID, streamPassword); - updated |= SOURCE_PWD; - } - } - - #if defined(_DEBUG) || defined(DEBUG) - if (updated & SOURCE_PWD) - { - ELOG("SOURCE_PWD"); - } - #endif - } - - utf8 adminPassword = readConfig.stream_adminPassword(streamID); - if (native_fetch_stream_adminPassword(streamID) != adminPassword) - { - if (!readConfig.read_stream_adminPassword(streamID)) - { - // clear what was being previously stored if possible - m_stream_adminPassword[streamID].clear(); - updated |= ADMIN_PWD; - } - // if empty then set back to the master admin password - else if (adminPassword.empty()) - { - ELOG(LOGNAME "'adminpassword' cannot be set to empty. Not applying this change to stream config# " + tos(streamID)); - } - else - { - native_assign_stream_adminPassword(streamID, adminPassword); - updated |= ADMIN_PWD; - } - - #if defined(_DEBUG) || defined(DEBUG) - if (updated & ADMIN_PWD) - { - ELOG("ADMIN_PWD"); - } - #endif - } - - utf8 movedUrl = readConfig.stream_movedUrl(streamID); - if (native_fetch_stream_movedUrl(streamID) != movedUrl) - { - native_assign_stream_movedUrl(streamID, movedUrl); - updated |= MOVED_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MOVED_URL"); - #endif - } - - utf8 artworkFile = readConfig.stream_artworkFile(streamID); - if (native_fetch_stream_artworkFile(streamID) != artworkFile) - { - if (!readConfig.read_stream_artworkFile(streamID)) - { - artworkFile = gOptions.artworkFile(); - } - native_assign_stream_artworkFile(streamID, artworkFile); - updated |= ARTWORK_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ARTWORK_FILE"); - #endif - } - - utf8 adTestFile = readConfig.stream_adTestFile(streamID); - if (native_fetch_stream_adTestFile(streamID) != adTestFile) - { - if (!readConfig.read_stream_adTestFile(streamID)) - { - adTestFile = gOptions.adTestFile(); - } - native_assign_stream_adTestFile(streamID, adTestFile); - updated |= AD_TEST_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE"); - #endif - } - - utf8 adTestFile2 = readConfig.stream_adTestFile2(streamID); - if (native_fetch_stream_adTestFile2(streamID) != adTestFile2) - { - if (!readConfig.read_stream_adTestFile2(streamID)) - { - adTestFile2 = gOptions.adTestFile2(); - } - native_assign_stream_adTestFile2(streamID, adTestFile2); - updated |= AD_TEST_FILE_2; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_2"); - #endif - } - - utf8 adTestFile3 = readConfig.stream_adTestFile3(streamID); - if (native_fetch_stream_adTestFile3(streamID) != adTestFile3) - { - if (!readConfig.read_stream_adTestFile3(streamID)) - { - adTestFile3 = gOptions.adTestFile3(); - } - native_assign_stream_adTestFile3(streamID, adTestFile3); - updated |= AD_TEST_FILE_3; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_3"); - #endif - } - - utf8 adTestFile4 = readConfig.stream_adTestFile4(streamID); - if (native_fetch_stream_adTestFile4(streamID) != adTestFile4) - { - if (!readConfig.read_stream_adTestFile4(streamID)) - { - adTestFile4 = gOptions.adTestFile4(); - } - native_assign_stream_adTestFile4(streamID, adTestFile4); - updated |= AD_TEST_FILE_4; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_4"); - #endif - } - - int adTestFileLoop = readConfig.stream_adTestFileLoop(streamID); - if (native_fetch_stream_adTestFileLoop(streamID) != adTestFileLoop) - { - if (!readConfig.read_stream_adTestFileLoop(streamID)) - { - adTestFileLoop = gOptions.adTestFileLoop(); - } - native_assign_stream_adTestFileLoop(streamID, adTestFileLoop); - updated |= AD_TEST_FILE_LOOP; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_LOOP"); - #endif - } - - utf8 introFile = readConfig.stream_introFile(streamID); - if (native_fetch_stream_introFile(streamID) != introFile) - { - if (!readConfig.read_stream_introFile(streamID)) - { - introFile = gOptions.introFile(); - } - native_assign_stream_introFile(streamID, introFile); - updated |= INTRO_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("INTRO_FILE"); - #endif - } - - utf8 backupFile = readConfig.stream_backupFile(streamID); - if (native_fetch_stream_backupFile(streamID) != backupFile) - { - if (!readConfig.read_stream_backupFile(streamID)) - { - backupFile = gOptions.backupFile(); - } - native_assign_stream_backupFile(streamID, backupFile); - updated |= BACKUP_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_FILE"); - #endif - } - - utf8 backupTitle = readConfig.stream_backupTitle(streamID); - if (native_fetch_stream_backupTitle(streamID) != backupTitle) - { - if (!readConfig.read_stream_backupTitle(streamID)) - { - backupTitle = gOptions.backupTitle(); - } - native_assign_stream_backupTitle(streamID, backupTitle); - updated |= BACKUP_TITLE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_TITLE"); - #endif - } - - utf8 banFile = readConfig.stream_banFile(streamID); - if (native_fetch_stream_banFile(streamID) != banFile) - { - if (!readConfig.read_stream_banFile(streamID)) - { - m_stream_banFile[streamID].clear(); - gOptions.unread_stream_banFile(streamID); - - // unload the IPs from the list - g_banList.remove("", 0, streamID, true); - } - else - { - // load the IPs from the list - size_t sID = (!banFile.empty() ? streamID : 0); - g_banList.load(banFile,sID); - } - native_assign_stream_banFile(streamID, banFile); - updated |= BAN_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BAN_FILE"); - #endif - } - - utf8 ripFile = readConfig.stream_ripFile(streamID); - if (native_fetch_stream_ripFile(streamID) != ripFile) - { - if (!readConfig.read_stream_ripFile(streamID)) - { - m_stream_ripFile[streamID].clear(); - gOptions.unread_stream_ripFile(streamID); - - // unload the IPs from the list - g_ripList.remove("",streamID,true); - } - else - { - // load the IPs from the list - size_t sID = (!ripFile.empty() ? streamID : 0); - g_ripList.load(ripFile,sID); - } - native_assign_stream_ripFile(streamID, ripFile); - updated |= RIP_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RIP_FILE"); - #endif - } - - utf8 agentFile = readConfig.stream_agentFile(streamID); - if (native_fetch_stream_agentFile(streamID) != agentFile) - { - if (!readConfig.read_stream_agentFile(streamID)) - { - m_stream_agentFile[streamID].clear(); - gOptions.unread_stream_agentFile(streamID); - - // unload the agents from the list - g_agentList.remove("", streamID, true); - } - else - { - // load the agents from the list - size_t sID = (!agentFile.empty() ? streamID : 0); - g_agentList.load(agentFile, sID); - } - native_assign_stream_agentFile(streamID, agentFile); - updated |= AGENT_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AGENT_FILE"); - #endif - } - - utf8 w3cLog = readConfig.stream_w3cLog(streamID); - if (native_fetch_stream_w3cLog(streamID) != w3cLog) - { - if (!readConfig.read_stream_w3cLog(streamID)) - { - m_stream_w3cLog[streamID].clear(); - gOptions.unread_stream_w3cLog(streamID); - w3cLog::close(streamID); - } - else - { - // could have just changed so update as needed - utf8 oldw3cLog = native_fetch_stream_w3cLog(streamID); - if (!oldw3cLog.empty()) - { - w3cLog::close(streamID); - } - size_t sID = (!w3cLog.empty() ? streamID : 0); - if (gOptions.w3cEnable()) - { - w3cLog::open(w3cLog, sID); - } - } - native_assign_stream_w3cLog(streamID, w3cLog); - updated |= W3C_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("W3C_FILE"); - #endif - } - - utf8 hideStats = readConfig.stream_hideStats(streamID); - if (native_fetch_stream_hideStats(streamID) != hideStats) - { - if (!readConfig.read_stream_hideStats(streamID)) - { - hideStats = gOptions.hideStats(); - } - native_assign_stream_hideStats(streamID, hideStats); - updated |= HIDE_STATS; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("HIDE_STATS"); - #endif - } - - int cdnMaster = readConfig.cdn_master(streamID); - if (native_fetch_cdn_master(streamID) != cdnMaster) - { - if (!readConfig.read_cdn_master(streamID)) - { - cdnMaster = -1; - } - native_assign_cdn_master(streamID, cdnMaster); - updated |= CDN_MASTER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CDN_MASTER"); - #endif - } - - int cdnSlave = readConfig.cdn_slave(streamID); - if (native_fetch_cdn_slave(streamID) != cdnSlave) - { - if (!readConfig.read_cdn_slave(streamID)) - { - cdnSlave = -1; - } - native_assign_cdn_slave(streamID, cdnSlave); - updated |= CDN_SLAVE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CDN_SLAVE"); - #endif - } - - int backupLoop = readConfig.stream_backupLoop(streamID); - if (native_fetch_stream_backupLoop(streamID) != backupLoop) - { - if (!readConfig.read_stream_backupLoop(streamID)) - { - backupLoop = gOptions.backupLoop(); - } - native_assign_stream_backupLoop(streamID, backupLoop); - updated |= DUMP_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_LOOP"); - #endif - } - - int rateLimitWait = readConfig.stream_rateLimitWait(streamID); - if (native_fetch_stream_rateLimitWait(streamID) != rateLimitWait) - { - if (!readConfig.read_stream_rateLimitWait(streamID)) - { - rateLimitWait = gOptions.rateLimitWait(); - } - native_assign_stream_rateLimitWait(streamID, rateLimitWait); - updated |= RATE_LIMIT_WAIT; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RATE_LIMIT_WAIT"); - #endif - } - - int metainterval = readConfig.stream_metaInterval(streamID); - if (native_fetch_stream_metaInterval(streamID) != metainterval) - { - if (!readConfig.read_stream_metaInterval(streamID)) - { - metainterval = gOptions.metaInterval(); - } - native_assign_stream_metaInterval(streamID, metainterval); - updated |= METAINTERVAL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("METAINTERVAL"); - #endif - } - - if (updated) - { - ILOG(LOGNAME "Updates applied to stream config# " + tos(streamID) + " [code: 0x" + tohex(updated) + "]"); - } - else - { - ILOG(LOGNAME "No updates required for stream config# " + tos(streamID)); - } - return updated; -} - -void config::addStreamConfig(config &readConfig, streamConfig add) throw(exception) -{ - if (!add.m_streamID) - { - return; - } - - stackLock sml(m_lock); - size_t streamID = add.m_streamID; - - native_assign_stream_ID(streamID, streamID); - native_assign_stream_adminPassword(streamID, add.m_adminPassword); - native_assign_stream_allowPublicRelay(streamID, add.m_allowPublicRelay); - native_assign_stream_allowRelay(streamID, add.m_allowRelay); - native_assign_stream_authHash(streamID, add.m_authHash); - native_assign_stream_password(streamID, add.m_password); - native_assign_stream_publicServer(streamID, add.m_publicServer); - native_assign_stream_maxBitrate(streamID, add.m_maxStreamBitrate); - native_assign_stream_minBitrate(streamID, add.m_minStreamBitrate); - native_assign_stream_maxUser(streamID, add.m_maxStreamUser); - native_assign_stream_relayURL(streamID, add.m_relayUrl.url()); - native_assign_stream_backupURL(streamID, add.m_backupUrl.url()); - native_assign_stream_path(streamID, add.m_urlPath); - - if (gOptions.w3cEnable()) - { - utf8 w3cLog = readConfig.stream_w3cLog(streamID); - if (readConfig.read_stream_w3cLog(streamID)) - { - if (gOptions.w3cEnable()) - { - w3cLog::open(w3cLog, streamID); - } - } - } - - if (gOptions.saveBanListOnExit()) - { - if (readConfig.read_stream_banFile(streamID) && !gOptions.stream_banFile(streamID).empty()) - { - g_banList.save(gOptions.stream_banFile(streamID),streamID); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (readConfig.read_stream_ripFile(streamID) && !gOptions.stream_ripFile(streamID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(streamID),streamID); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (readConfig.read_stream_agentFile(streamID) && !gOptions.stream_agentFile(streamID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(streamID),streamID); - } - } - - ILOG(LOGNAME "Added stream config# " + tos(streamID)); -} - -void config::removeStreamConfig(streamConfig remove) throw(exception) -{ - if (!remove.m_streamID) - { - return; - } - - stackLock sml(m_lock); - size_t streamID = remove.m_streamID; - - // clean up the per-stream files - if (gOptions.w3cEnable()) - { - w3cLog::close(streamID); - } - - if (gOptions.saveBanListOnExit()) - { - if (gOptions.read_stream_banFile(streamID) && !gOptions.stream_banFile(streamID).empty()) - { - g_banList.save(gOptions.stream_banFile(streamID),streamID); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (gOptions.read_stream_ripFile(streamID) && !gOptions.stream_ripFile(streamID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(streamID),streamID); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (gOptions.read_stream_agentFile(streamID) && !gOptions.stream_agentFile(streamID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(streamID),streamID); - } - } - - // now clear out where possible the per-stream values - gOptions.unread_stream_ID(streamID); - gOptions.unread_stream_adminPassword(streamID); - gOptions.unread_stream_agentFile(streamID); - gOptions.unread_stream_allowPublicRelay(streamID); - gOptions.unread_stream_allowRelay(streamID); - gOptions.unread_stream_authHash(streamID); - gOptions.unread_stream_autoDumpTime(streamID); - gOptions.unread_stream_autoDumpUsers(streamID); - gOptions.unread_stream_backupFile(streamID); - gOptions.unread_stream_backupTitle(streamID); - gOptions.unread_stream_backupLoop(streamID); - gOptions.unread_stream_banFile(streamID); - gOptions.unread_stream_introFile(streamID); - gOptions.unread_stream_listenerTime(streamID); - gOptions.unread_stream_maxBitrate(streamID); - gOptions.unread_stream_minBitrate(streamID); - gOptions.unread_stream_maxUser(streamID); - gOptions.unread_stream_password(streamID); - gOptions.unread_stream_path(streamID); - gOptions.unread_stream_publicServer(streamID); - gOptions.unread_stream_relayURL(streamID); - gOptions.unread_stream_backupURL(streamID); - gOptions.unread_stream_ripFile(streamID); - gOptions.unread_stream_ripOnly(streamID); - gOptions.unread_stream_agentFile(streamID); - gOptions.unread_stream_songHistory(streamID); - gOptions.unread_stream_uvoxCipherKey(streamID); - gOptions.unread_stream_w3cLog(streamID); - - gOptions.unread_cdn_master(streamID); - gOptions.unread_cdn_slave(streamID); - - map::iterator i = m_stream_ID.find(streamID); - if (i != m_stream_ID.end()) - { - m_stream_ID.erase(i); - } - - ILOG(LOGNAME "Removed stream config# " + tos(streamID)); -} - -config::~config() throw() -{ -} - -static void write_option(const utf8 &name, const utf8 &value, FILE *f, - const uniFile::filenameType &fn, bool &written) throw(exception) -{ - const char *delimiter = "="; - const size_t delimiter_size = 1; - size_t name_size = name.size(); - size_t value_size = value.size(); - size_t eol_size = eol().size(); - - if (written && (::fwrite(eol().c_str(), 1, eol_size, f) != eol_size)) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(name.c_str(), 1, name_size, f) != name_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(delimiter, 1, delimiter_size, f) != delimiter_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(value.c_str(), 1, value_size, f) != value_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - written = true; -} - -std::string config::logSectionName() -{ - return LOGNAME; -} - -bool config::rewriteConfigurationFile(bool minimal, bool messages, bool setup) const throw(exception) -{ - if (!cdn().empty()) - { - WLOG(LOGNAME "CDN mode prevents re-writing of the configuration file"); - return false; - } - - if (messages) - { - ILOG(LOGNAME "Rewriting config file"); - } - - stackLock sml(m_lock); - - // add any config options to be ignored when re-writing - set ignore_set; - ignore_set.insert("streamid"); - ignore_set.insert("include"); - ignore_set.insert("dstip"); - ignore_set.insert("yport"); - ignore_set.insert("showlastsongs"); - ignore_set.insert("streambitrate"); - ignore_set.insert("relayserver"); - ignore_set.insert("relayport"); - ignore_set.insert("reallogfile"); - ignore_set.insert("clacks"); - if (flashPolicyServerPort() == -1) - { - ignore_set.insert("flashpolicyserverport"); - } - if (portLegacy() == -1) - { - ignore_set.insert("portlegacy"); - } - if (publicPort() == -1) - { - ignore_set.insert("publicport"); - } - - bool saved = true; - FILE *f = 0; - try - { - uniFile::filenameType fn = _confFile(); - // create a backup of the current config file and then use that - if (fileUtil::fileExists(fn)) - { - uniFile::filenameType fn_backup(_confFile() + ".backup"); - uniFile::unlink(fn_backup); - #ifdef _WIN32 - if (!::MoveFileW(fn.toWString().c_str(), fn_backup.toWString().c_str())) - { - throw runtime_error("Cannot create backup of the current config file `" + - fn.hideAsString() + "' (" + errMessage().hideAsString() + ")"); - } - #else - if (::rename(fn.hideAsString().c_str(), fn_backup.hideAsString().c_str()) < 0) - { - throw runtime_error("Cannot create backup of the current config file `" + - fn.hideAsString() + "' (" + errMessage().hideAsString() + ")"); - } - #endif - } - - f = uniFile::fopen(fn,"wb"); - if (!f) - { - throw runtime_error("Cannot open config file `" + fn.hideAsString() + - "' for writing (" + errMessage().hideAsString() + ")"); - } - - map deferredOptions = m_deferredOptions; - bool written = false; - for (optMap_t::const_iterator i = m_optMap.begin(); i != m_optMap.end(); ++i) - { - const utf8 &optName = (*i).first; - const accessor_t &a = (*i).second; - - if (ignore_set.find(optName) != ignore_set.end()) - { - continue; - } - - map::iterator deferred_i = deferredOptions.find(optName); - if (deferred_i != deferredOptions.end()) - { - if (!minimal || (!((*deferred_i).second == (this->*a.m_defaultFunc)()))) - { - write_option(optName,(*deferred_i).second, f, fn, written); - } - deferredOptions.erase(deferred_i); - } - else - { - if ((this->*a.m_multiFunc)()) - { - const size_t num = (this->*a.m_countFunc)(); - for (size_t x = 0; x < num; ++x) - { - size_t index = 0; - if (!minimal || (!((this->*a.m_fetchFunc)(x, &index) == (this->*a.m_defaultFunc)()))) - { - write_option(optName + "_" + tos(index), (this->*a.m_fetchFunc)(index, 0), f, fn, written); - } - } - } - else - { - if (!minimal || (!((this->*a.m_fetchFunc)(1, 0) == (this->*a.m_defaultFunc)()))) - { - write_option(optName,(this->*a.m_fetchFunc)(1, 0), f, fn, written); - } - } - } - } - - // remaining deferred options - for (map::const_iterator i = deferredOptions.begin(); i != deferredOptions.end(); ++i) - { - if (ignore_set.find((*i).first) != ignore_set.end()) - { - continue; - } - - optMap_t::const_iterator m = m_optMap.find((*i).first); - const accessor_t &a = (*m).second; - - if (!minimal || (!((*i).second == (this->*a.m_defaultFunc)()))) - { - write_option((*i).first, (*i).second, f, fn, written); - } - } - deferredOptions.clear(); - - ::fclose(f); - } - catch(const exception &ex) - { - saved = false; - ELOG(utf8(setup ? "[SETUP] " : LOGNAME) + ex.what()); - if (f) - { - ::fclose(f); - } - } - return saved; -} - -utf8 config::dumpConfigFile() throw() -{ - utf8 streams, general, debug; - - stackLock sml(m_lock); - - // add any config options to be ignored when re-writing - set ignore_set; - ignore_set.insert("streamid"); - ignore_set.insert("include"); - ignore_set.insert("dstip"); - ignore_set.insert("yport"); - ignore_set.insert("showlastsongs"); - ignore_set.insert("streambitrate"); - ignore_set.insert("relayserver"); - ignore_set.insert("relayport"); - ignore_set.insert("reallogfile"); - if (flashPolicyServerPort() == -1) - { - ignore_set.insert("flashpolicyserverport"); - } - if (portLegacy() == -1) - { - ignore_set.insert("portlegacy"); - } - if (publicPort() == -1) - { - ignore_set.insert("publicport"); - } - - for (optMap_t::const_iterator i = m_optMap.begin(); i != m_optMap.end(); ++i) - { - const utf8 &optName = (*i).first; - const accessor_t &a = (*i).second; - - if (ignore_set.find(optName) != ignore_set.end()) - { - continue; - } - - if ((this->*a.m_multiFunc)()) - { - size_t num = (this->*a.m_countFunc)(); - for (size_t x = 0; x < num; ++x) - { - size_t index = 0; - if (!((this->*a.m_fetchFunc)(x, &index) == (this->*a.m_defaultFunc)())) - { - if (optName.find((utf8)"stream") == 0) - { - streams += optName + "_" + tos(index) + "=" + (this->*a.m_fetchFunc)(index, 0) + "
"; - } - else if (optName.find((utf8)"debug") != utf8::npos) - { - debug += optName + "_" + tos(index) + "=" + (this->*a.m_fetchFunc)(index, 0) + "
"; - } - else - { - general += optName + "_" + tos(index) + "=" + (this->*a.m_fetchFunc)(index, 0) + "
"; - } - } - } - } - else - { - if (!((this->*a.m_fetchFunc)(1, 0) == (this->*a.m_defaultFunc)())) - { - if (optName.find((utf8)"debug") != utf8::npos) - { - debug += optName + "=" + (this->*a.m_fetchFunc)(1, 0) + "
"; - } - else - { - general += optName + "=" + (this->*a.m_fetchFunc)(1, 0) + "
"; - } - } - } - } - - return "
" + - (!streams.empty() ? "
Stream Settings:

" : (utf8)"") + - streams + "
" + - (!general.empty() ? "
General Settings:

" : "") + - general + "
" + - (!debug.empty() ? "
Debugging Settings:

" : "") + - debug + "
"; -} - -int config::promptConfigFile() throw() -{ - if (!sDaemon) - { - #ifdef _WIN32 - vector fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"*.ini", L"", true, true); - vector fileListConf = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"*.conf", L"", true, true); - #else - vector fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "*.ini", ""); - vector fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "*.conf", ""); - #endif - - if (!fileList.empty()) - { - #ifdef _WIN32 - // exclude desktop.ini on windows builds as that can cause other issues - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - { - if ((*i) == L".\\desktop.ini") - { - fileList.erase(i); - break; - } - } - #endif - fileList.insert(fileList.end(), fileListConf.begin(), fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - ILOG(LOGNAME "Choose one of the listed config file(s) to load or"); - ILOG(LOGNAME "enter `s' to enable the setup mode for the DNAS or"); -#if CONFIG_BUILDER - ILOG(LOGNAME "enter `b' to enable the builder mode for the DNAS or"); -#endif - ILOG(LOGNAME "enter `x' to close this instance of the DNAS:"); - ILOG(LOGNAME "Note: Press `Enter' after choosing the config file."); - if (fileList.size() > 10) - { - ILOG(LOGNAME " Only the first 10 config files detected will be shown."); - } - - int option = 0; - if (fileList.size() > 10) - { - fileList.resize(10); - } - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i, option++) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i, option++) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8().substr(1 + u32file.rfind(utf32("\\")))); - ILOG(LOGNAME " [" + tos(option) + "] : " + u8f + (fileUtil::getSuffix(*i) == L"ini" ? " [1.x config file]" : "")); - #else - ILOG(LOGNAME " [" + tos(option) + "] : " + (*i).substr(1 + (*i).rfind("/")) + (fileUtil::getSuffix(*i) == "ini" ? " [1.x config file]" : "")); - #endif - } - - string input; - cin >> input; - - while ((!input.empty() && (input[0] != 'x') && (input[0] != 's') && (!isdigit(input[0]) || !((size_t)(input[0] - '0') < fileList.size())))) - { - ELOG(LOGNAME "You have entered an invalid option. Please enter a number matching the config file required."); - input.clear(); - cin >> input; - } - - if (input[0] == 'x') - { - return -2; - } - - if (input[0] == 's') - { - ILOG(LOGNAME "Entering setup mode. Open 127.0.0.1:8000/setup in a"); - ILOG(LOGNAME "browser on the same machine the DNAS is started on."); - return 2; - } -#ifdef CONFIG_BUILDER - if (input[0] == 'b') - { - ILOG(LOGNAME "Entering builder mode. Open 127.0.0.1:8000/builder in"); - ILOG(LOGNAME "a browser on the same machine the DNAS is started on."); - return 2; - } -#endif - if (!input.empty() && isdigit(input[0])) - { - size_t index = input[0] - '0'; - // clamped to 0 - 9 (fileList can be larger but input is only 0-9) - if (index < fileList.size()) - { - #ifdef _WIN32 - utf32 u32file(fileList[index]); - utf8 u8f(u32file.toUtf8().substr(2)); - return load(u8f); - #else - return load(fileList[index]); - #endif - } - } - } - else - { - return -1; - } - } - #ifndef _WIN32 - else - { - // if running as a daemon then make checks just for the default - // if we've not had a configuration file specified to be used. - vector fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.ini", ""); - vector fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.conf", ""); - - if (!fileList.empty()) - { - fileList.insert(fileList.end(), fileListConf.begin(), fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - load(fileList[0]); - } - } - #endif - return 0; -} - -bool config::load(const uniFile::filenameType &filename, bool load) throw() -{ - stackLock sml(m_lock); - - // set the option that returns the name of the config file - m_confFile[DEFAULT_CLIENT_STREAM_ID] = filename; - - // only need to set the filename when creating a new file - if (!load) - { - return true; - } - - // check for 'setup' and abort config file loading -#ifdef CONFIG_BUILDER - if ((filename == "builder") || (filename == "setup")) -#else - if (filename == "setup") -#endif - { - return false; - } - - // setup the legacy relay config options to cope with reloads, etc - m_legacyRelayServer.clear(); - m_legacyRelayPort = ":80"; - - bool result = _load(filename, (utf8)"", true); - - // if the server hasn't been read then skip over this as it's - // likely there wasn't any legacy relay config options read - if (!m_legacyRelayServer.empty() && !(m_legacyRelayServer == "http://")) - { - // make sure that the old relay url is added by force setting streamid=1 - optMap_t::const_iterator i = m_optMap.find("streamid"); - (this->*((*i).second.m_assignFunc))(tos(DEFAULT_CLIENT_STREAM_ID), DEFAULT_CLIENT_STREAM_ID); - - utf8 legacyRelay = m_legacyRelayServer + m_legacyRelayPort; - i = m_optMap.find("streamrelayurl"); - (this->*((*i).second.m_assignFunc))(legacyRelay, DEFAULT_CLIENT_STREAM_ID); - } - - // use this to map the v2.0.0 value to that from 2.0.1+ - if (hideStats() == "1") - { - optMap_t::const_iterator i = m_optMap.find("hidestats"); - (this->*((*i).second.m_assignFunc))("stats", 0); - } - - // detect a failed attempt to load a config file and ensure we follow defaults on fail - if (m_log.empty()) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = true; - } - if (result == true) - { - if (m_logFile.empty()) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = true; - } - else if (m_logFile[DEFAULT_CLIENT_STREAM_ID].size() < 1) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - else if (compareStringsWithoutCase(m_logFile[0], uniFile::filenameType("none"))) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - else if (compareStringsWithoutCase(m_logFile[0], uniFile::filenameType("/dev/null"))) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - } - return result; -} - -// load options from a config file. Generally only done at startup. -// Config file should be in utf8 format -const bool config::_load(const uniFile::filenameType &filename, const utf8& uniqueStr, const bool parent = false) throw() -{ - const utf8 unique_matching_token("$"); - utf8 unique(unique_matching_token); - if (uniqueStr.empty()) - { - unique = unique_matching_token; - } - else - { - unique = uniqueStr; - } - - int l = 0; // line counter - bool loaded = true; - - // open it. Use the deferred messages since this happens at startup - FILE *conf = uniFile::fopen(filename, "rb"); - if (!conf) - { - loaded = false; - m_deferredWarnLogMessages.push_back(LOGNAME "Could not find `" + fileUtil::getFullFilePath(filename) + - (parent == true ? "' - looking for config file to load..." : "'")); - goto no_read_conf; - } - - // parse each line of the file - while (true) - { - int subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), conf)) - { - break; // get a line - } - - size_t offset = strlen(buffer) - 1; - while (buffer[offset] == '\n' || buffer[offset] == '\r') - { - buffer[offset]='\0'; // get rid of cr/lf - } - ++l; // increment line counter - - char *pbuffer = buffer; - while (pbuffer && (*pbuffer == ' ' || *pbuffer == '\t')) - { - ++pbuffer; // remove trailing whitespace - } - - if (!pbuffer || !*pbuffer || (*pbuffer == ';') || (*pbuffer == '[') || (*pbuffer == '#')) - { - continue; // blank lines or comments skipped - } - - char *tok = pbuffer; - while (pbuffer && *pbuffer && (*pbuffer != '=') && (*pbuffer != '\r')) - { - ++pbuffer; // look for = sign - } - if (!pbuffer || !*pbuffer) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Invalid statement on line " + tos(l) + " of " + filename + " -> `" + utf8(buffer) + "'"); - continue; - } - *pbuffer++=0; - - // skip utf-8 BOM - if ((strlen(tok) > 2) && - (((unsigned char*)tok)[0] == 0xef) && - (((unsigned char*)tok)[1] == 0xbb) && - (((unsigned char*)tok)[2] == 0xbf)) - { - tok += 3; - } - - utf8 stok = tok; - // see if it's a multi option and set the subIndex value - const vector tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - - // this ensure the subIndex has been specified even if there is no streamid - // this is to fix a load of config setup issues from people not setting it. - optMap_t::const_iterator sid = m_optMap.find("streamid"); - (this->*((*sid).second.m_assignFunc))(tos(subIndex), subIndex); - } - stok = stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - utf8 base_option_name = toLower(stok); - if (base_option_name.empty()) - { - // skip over empty values - continue; - } - - // used for mapping *autodumpsourcetime to *autodumptime - int autoDumpTime = 0; - if (base_option_name == "autodumpsourcetime") - { - base_option_name = "autodumptime"; - autoDumpTime = 1; - } - else if (base_option_name == "streamautodumpsourcetime") - { - base_option_name = "streamautodumptime"; - autoDumpTime = 2; - } - else if (base_option_name == "reallogfile" || - base_option_name == "autoauthhash") - { - // skip over as not pubiically exposed - continue; - } - - optMap_t::const_iterator i = m_optMap.find(base_option_name); - bool legacyRelay = false; - bool stream_bitrate = (base_option_name == "streambitrate"); - if (i == m_optMap.end()) - { - if (!((base_option_name == "relayserver") || (base_option_name == "relayport") || stream_bitrate)) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Invalid item on line " + tos(l) + " of " + filename + " -> `" + base_option_name + "'"); - continue; - } - else - { - if (!stream_bitrate) - { - legacyRelay = true; - } - } - } - else - { - // do we have a stream* entry and no stream id mentioned / working against default - // if yes then force streamid=1 to be set so that the options will be recognised - uniString::utf8::size_type spos = base_option_name.find(utf8("stream")); - if ((spos != uniString::utf8::npos) && (spos == 0) && (subIndex == DEFAULT_CLIENT_STREAM_ID)) - { - // this ensure the subIndex has been specified even if there is no streamid - // this is to fix a load of config setup issues from people not setting it. - const optMap_t::const_iterator sid = m_optMap.find("streamid"); - (this->*((*sid).second.m_assignFunc))(tos(subIndex), subIndex); - } - } - - // move tok to the value - tok = pbuffer; - while (tok && *tok && *tok == ' ') - { - ++tok; - } - - utf8 value = stripWhitespace(utf8(tok)); - - // if we're re-mapping *autodumpsourcetime then indicate in the log output - if (autoDumpTime > 0) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Deprecated statement found on line " + tos(l) + " of " + - filename + " -> change " + (autoDumpTime == 2 ? "stream" : "") + - "autodumpsourcetime_" + tos(subIndex) + "=" + value + " to " + - (autoDumpTime == 2 ? "stream" : "") + "autodumptime_" + - tos(subIndex) + "=" + value); - } - - // this is used in the mapping of the old ocnfig options to the new style streamrelayurl - if (legacyRelay == true) - { - if (base_option_name == "relayserver") - { - utf8::size_type check = (!value.empty() ? value.find(utf8("http://")) : 0); - if (check == utf8::npos) - { - m_legacyRelayServer = "http://" + value; - } - else - { - m_legacyRelayServer = value; - } - } - if (base_option_name == "relayport") - { - utf8::size_type check = value.find(utf8(":")); - if ((check == utf8::npos) || (check != 0)) - { - m_legacyRelayPort = ":" + value; - } - else - { - m_legacyRelayPort = value; - } - } - - continue; - } - - // check for yes / no values and map them to 1 or 0 to cope with legacy config loading - if ((base_option_name == "w3cenable") || - (base_option_name == "allowrelay") || - (base_option_name == "allowpublicrelay") || - (base_option_name == "riponly")) - { - if (toLower(value) == "yes") - { - value = "1"; - } - if (toLower(value) == "no") - { - value = "0"; - } - } - - // validation checks on the 'cdn' parameter to ensure we're all good else where - if (base_option_name == "cdn") - { - value = toLower(value); - if (!(value == "on") && !(value == "always") && !(value == "master")) - { - value = ""; - } - } - - if (stream_bitrate) - { - const optMap_t::const_iterator min = m_optMap.find("streamminbitrate"); - (this->*((*min).second.m_assignFunc))(value, subIndex); - const optMap_t::const_iterator max = m_optMap.find("streammaxbitrate"); - (this->*((*max).second.m_assignFunc))(value, subIndex); - continue; - } - - // validation checks on the port parameters to detect the 'any' - // case which is meant to be treated the same as an empty value - if ((base_option_name == "srcdns") || - (base_option_name == "srcip") || - (base_option_name == "destdns") || - (base_option_name == "destip") || - (base_option_name == "dstip") || - (base_option_name == "publicdns") || - (base_option_name == "publicip")) - { - if (toLower(value) == "any") - { - value = ""; - } - } - - // check for streampath values and fix to have / on the start to ensure it will - // work for client connections without impacting on client connection time, etc - if (base_option_name == "streampath") - { - utf8::size_type path = value.find(utf8(":")); - if (path != utf8::npos) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this will produce an invalid path."); - value.clear(); - continue; - } - - path = value.find(utf8("var/www")); - // catches var/www... or /var/www... style paths - // which are best just filtered as it gives away - // paths on the host machine which looks crappy! - if ((path != utf8::npos) && (path < 2)) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this will produce an invalid path."); - value.clear(); - continue; - } - - // check for empty as we can incorrectly end up - // setting streampath_xx=/ which causes issues! - if (!value.empty()) - { - path = value.find(utf8("/")); - if ((path == utf8::npos) || (path != 0)) - { - value = "/" + value; - } - } - - // additionally we check for specific 'default' paths and block their usage - // based on a match against the start of the streampath (might block some - // possibly valid streampaths but it'll avoid stupid configuration issues). - const char * disallowed[] = { "/listen.pls", "/listen.m3u", "/listen.asx", "/listen.xspf", - "/listen.qtl", "/listen", "/7.html", "/index.html", - "/played", "/played.html", "/admin.cgi", "/statistics", - "/stats", "/streamart", "/playingart", "/nextsong", "/home", - "/home.html", "/nextsongs", "/currentsong", "/shoutcast.swf", - "/crossdomain.xml", "/index.css", "/images/", "/favicon.ico", - "/robots.txt", "/images/favicon.ico", "/images/listen.png", - "/images/history.png", "/images/lock.png", "/images/noadavail.png", - "/images/streamart.png", "/images/adavail.png", "/images/v2.png", - "/images/playingart.png", "/adplayed/adplayed.png", "/images/v1.png", - "/images/relay.png", "/images/wa.png", "/images/chrome.png", - "/images/firefox.png", "/images/safari.png", "/images/ie.png", - "/images/vlc.png", "/images/fb2k.png", "/images/wmp.png", - "/images/icecast.png", "/images/html5.png", "/images/rtb.png", - "/images/ps.png", "/images/mplayer.png", "/images/apple.png", - "/images/roku.png", "/images/itunes.png", "/images/warn.png", - "/images/xff.png", "/images/radionomy.png", "/images/curl.png", - "/images/flash.png", "/images/synology.png", "/images/wiimc.png" - }; - for (size_t x = 0; x < sizeof(disallowed) / sizeof(disallowed[0]); x++) - { - path = value.find(utf8(disallowed[x])); - if ((path != utf8::npos) && !path) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this contains a reserved path."); - value.clear(); - continue; - } - } - } - - // check for redirecturl and streamredirecturl and ensure there is a http:// - // otherwise we need to process multiple times on page hits which isn't good - if ((base_option_name == "redirecturl" || base_option_name == "streamredirecturl") && !value.empty()) - { - utf8::size_type url = (!value.empty() ? value.find(utf8("http://")) : 0); - if (url == utf8::npos) - { - value = "http://" + value; - } - } - - // check the passwords for validity e.g. they're not allowed to contain a colon - // as that can break the multiple-1.x source support as well as 2.x source join - if (base_option_name == "password" || base_option_name == "streampassword" || - base_option_name == "adminpassword" || base_option_name == "streamadminpassword") - { - if (value.find(utf8(":")) != utf8::npos) - { - m_deferredErrorLogMessages.push_back(LOGNAME "`" + base_option_name + - (subIndex > 1 ? "_" + tos(subIndex) : "") + - "' contains a reserved character and will be ignored. " - "Please remove all colons to resolve this issue."); - value.clear(); - continue; - } - } - - // special case to mimic old sc_serv conf file behaviour. In old sc_serv, the conf variable "unique" can - // be subsituted for $ in any value related to a filename - if (base_option_name == "unique") - { - unique = value; - } - - if ((base_option_name == "logfile") || - (base_option_name == "adtestfile") || - (base_option_name == "adtestfile2") || - (base_option_name == "adtestfile3") || - (base_option_name == "adtestfile4") || - (base_option_name == "streamadtestfile") || - (base_option_name == "streamadtestfile2") || - (base_option_name == "streamadtestfile3") || - (base_option_name == "streamadtestfile4") || - (base_option_name == "introfile") || - (base_option_name == "streamintrofile") || - (base_option_name == "backupfile") || - (base_option_name == "streambackupfile") || - (base_option_name == "banfile") || - (base_option_name == "streambanfile") || - (base_option_name == "ripfile") || - (base_option_name == "streamripfile") || - (base_option_name == "agentfile") || - (base_option_name == "artworkfile") || - (base_option_name == "streamagentfile") || - (base_option_name == "streamartworkfile") || - (base_option_name == "include") || - (base_option_name == "w3clog") || - (base_option_name == "streamw3clog") || - (base_option_name == "portbase")) - { - if (unique != unique_matching_token) - { - utf8::size_type pos = value.find(unique_matching_token); - while (pos != utf8::npos) - { - value.replace(pos, 1, unique); - pos = value.find(unique_matching_token); - } - } - - // attempt to convert \ to / and vice versa as needed for cross-platform sharing of configuration files - fileUtil::convertOSFilePathDelimiter(value); - } - - if (base_option_name == "include") - { - // get the current folder so we can load from include=common.conf if using full paths, etc - uniFile::filenameType currentPath = fileUtil::onlyPath(filename); - - // this will handle wildcard matching as applicable to what has been set in the 'include' - // value so will allow us to have individual configs via 'include=./stream/stream_*.conf' - #ifdef _WIN32 - vector fileList = fileUtil::directoryFileList(value.toWString(), currentPath.toWString(), true, true); - #else - vector fileList = fileUtil::directoryFileList(value.hideAsString(), currentPath.hideAsString()); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - _load(u8f, unique); - #else - _load(*i, unique); - #endif - } - } - } - else - { - (this->*((*i).second.m_assignFunc))(value, subIndex); - } - } - - // close the config file - ::fclose(conf); - -no_read_conf: - return loaded; -} - -bool config::editConfigFileEntry(size_t sid, const uniFile::filenameType &filename, - const uniString::utf8 &authhash, - const uniString::utf8 ¶m, const bool add, - bool &handled, bool &idHandled, - const bool parent = false) throw() -{ - bool loaded = true; - FILE *conf = NULL, *newconf = NULL; - char buffer[4096] = {0}; - char copyBuffer[4096] = {0}; - char *pbuffer = buffer; - int l = 0; // line counter - - // create a backup of the current config file and then use that - uniFile::filenameType fn(filename + ".backup"); - uniFile::unlink(fn); - #ifdef _WIN32 - if (!::MoveFileW(filename.toWString().c_str(), fn.toWString().c_str())) - #else - if (::rename(filename.hideAsString().c_str(), fn.hideAsString().c_str())) - #endif - { - loaded = false; - ELOG(LOGNAME "Could not backup original file `" + filename + "'"); - goto no_write_conf; - } - - conf = uniFile::fopen(filename+".backup","rb"); - if (!conf) - { - loaded = false; - ELOG(LOGNAME "Could not open `" + filename + "'(" + errMessage().hideAsString() + ")"); - goto no_write_conf; - } - - newconf = uniFile::fopen(filename,"wb"); - if (!newconf) - { - loaded = false; - ELOG(LOGNAME "Could not open `" + filename+".backup' (" + errMessage().hideAsString() + ")"); - goto no_write_conf; - } - - // parse each line of the file - while (true) - { - size_t subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - - if (!fgets(buffer, sizeof(buffer), conf)) - { - break; // get a line - } - memcpy(copyBuffer, buffer, sizeof(copyBuffer)); - - size_t offset = strlen(buffer)-1; - while (buffer[offset]=='\n' || buffer[offset]=='\r') - { - buffer[offset]='\0'; // get rid of cr/lf - } - ++l; // increment line counter - - pbuffer = buffer; - while (pbuffer && (*pbuffer == ' ' || *pbuffer == '\t')) - { - ++pbuffer; // remove trailing whitespace - } - - if (!pbuffer || !*pbuffer || *pbuffer == ';' || *pbuffer == '[' || *pbuffer == '#') - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; // blank lines or comments skipped - } - - char *tok = pbuffer; - while (pbuffer && *pbuffer && *pbuffer != '=' && *pbuffer != '\r') - { - ++pbuffer; // look for = sign - } - if (!pbuffer || !*pbuffer) - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; - } - *pbuffer++=0; - - // skip utf-8 BOM - if ((strlen(tok) > 2) && - (((unsigned char*)tok)[0] == 0xef) && - (((unsigned char*)tok)[1] == 0xbb) && - (((unsigned char*)tok)[2] == 0xbf)) - { - tok += 3; - } - - utf8 stok = tok; - // see if it's a multi option and set the subIndex value - const vector tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - } - stok = stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - utf8 base_option_name = toLower(stok); - optMap_t::const_iterator i = m_optMap.find(base_option_name); - if (i == m_optMap.end()) - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; - } - - // move tok to the value - tok = pbuffer; - while (tok && *tok && *tok == ' ') - { - ++tok; - } - - utf8 value = stripWhitespace(utf8(tok)); - - // this will attempt to check if streamid is present, otherwise we need to add otherwise - // when the DNAS is restarted then it will not find the authhash despite being in there - if (base_option_name == "streamid" && subIndex == sid && add == true) - { - idHandled = true; - } - - // this will attempt to update a dummy entry in the config or remove depending on the mode - if (base_option_name == "streamauthhash" && subIndex == sid) - { - // attempt to match the line breaks already in the file so it's consistent - if (add == true) - { - // default to the current platforms encoding so it'll at least have a line break - utf8 readEol = eol(); - if (copyBuffer[0]) - { - // determine if just \n or \r\n - size_t offset = strlen(copyBuffer)-1; - if (copyBuffer[offset] == '\n') - { - if (copyBuffer[offset-1] == '\r') - { - readEol = "\r\n"; - } - else - { - readEol = "\n"; - } - } - else if (copyBuffer[offset] == '\r') - { - readEol = "\r"; - } - } - - uniString::utf8 newEntry("streamauthhash_"+tos(sid)+"="+authhash+readEol); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - } - handled = true; - } - // this will attempt to update a dummy entry in the config or remove depending on the mode - else if (base_option_name == authhash && !sid) - { - // attempt to match the line breaks already in the file so it's consistent - if (add == true) - { - // default to the current platforms encoding so it'll at least have a line break - utf8 readEol = eol(); - if (copyBuffer[0]) - { - // determine if just \n or \r\n - size_t offset = strlen(copyBuffer)-1; - if (copyBuffer[offset] == '\n') - { - if (copyBuffer[offset-1] == '\r') - { - readEol = "\r\n"; - } - else - { - readEol = "\n"; - } - } - else if (copyBuffer[offset] == '\r') - { - readEol = "\r"; - } - } - - if (param == "1") - { - uniString::utf8 newEntry(authhash+"="+param+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - } - } - handled = true; - } - else - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - } - - if (base_option_name == "include") - { - // get the current folder so we can load from include=common.conf if using full paths, etc - uniFile::filenameType currentPath = fileUtil::onlyPath(filename); - - // this will handle wildcard matching as applicable to what has been set in the 'include' - // value so will allow us to have individual configs via 'include=./stream/stream_*.conf' - #ifdef _WIN32 - vector fileList = fileUtil::directoryFileList(value.toWString(), currentPath.toWString(), true, true); - #else - vector fileList = fileUtil::directoryFileList(value.hideAsString(), currentPath.hideAsString()); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - editConfigFileEntry(sid, u8f, authhash, param, add, handled, idHandled); - #else - editConfigFileEntry(sid, *i, authhash, param, add, handled, idHandled); - #endif - } - } - } - } - - // only save back to the first config file if nothing was done in any included files - if (parent == true && add == true && (handled == false || idHandled == false)) - { - if (sid && idHandled == false) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - idHandled = true; - } - - if (sid && handled == false) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - uniString::utf8 newEntry("streamauthhash_"+tos(sid)+"="+authhash+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - handled = true; - } - - // for anything else, if it's at the default then no need to add, just remove it - if (!sid && handled == false && (param == "1")) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - uniString::utf8 newEntry(authhash+"="+param+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - handled = true; - } - } - - // close the config file - ::fclose(conf); - ::fclose(newconf); - -no_write_conf: - return loaded; -} - -///////////////////////////////////////////////// -///// service template interface methods //////// -///////////////////////////////////////////////// - -const vector config::fromArgs(const vector &cl) throw() -{ - vector result; - // only attempt to load a passed configuration file otherwise beforehand - // this would cause sc_serv to load and appear to do nothing so make sure - // that we let the defaults stay in effect so it will do work correctly - if (!cl.empty()) - { - load(cl.front()); - vector::const_iterator i = cl.begin(); - ++i; - while (i != cl.end()) - { - result.push_back(*(i++)); - } - } - - #ifdef _WIN32 - if (_logFile() == DEFAULT_LOG) - { - // this will fill in the default log path as required - wchar_t m_fileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_fileName, MAX_PATH); - assign_logFile(utf32(m_fileName).toUtf8(), DEFAULT_CLIENT_STREAM_ID); - } - #endif - - return result; -} - -bool config::getConsoleLogging() const throw() -{ - stackLock sml(m_lock); - return (!sDaemon ? _screenLog() && _log() : false); -} - -const uniFile::filenameType config::getFileLog() const throw() -{ - stackLock sml(m_lock); - - static const uniFile::filenameType empty; - return (_log() ? _logFile() : empty); -} - -#ifdef _WIN32 -utf8 config::getSystemLogConfigString() throw() { return AOL_logger::systemLogger_element::panicConfiguration(); } -#else -utf8 config::getSystemLogConfigString() throw() { return "";} -#endif - -utf8 config::getVersionBuildStrings() throw() -{ - static utf8 version = ""; - if (version.empty()) - { -#ifdef _WIN32 - getVersionInfo(version); -#else - for (int x = 0; x < VENT; ++x) - { - if (x) - { - version += "."; - } - version += tos(PRODUCTVERSION[x]); - } -#endif -#ifdef LICENCE_FREE - version += " no-licence-check"; -#endif - } - return version; -} - -utf8 config::streamConfig::urlObj::parse(const utf8 &in_url, utf8 &out_server, u_short &out_port, utf8 &out_path) throw(exception) -{ - utf8 url(in_url); - - // quick out - if (in_url.empty()) - { - out_server.clear(); - out_port = 0; - out_path.clear(); - return in_url; - } - ///////////// - - utf8 server; - utf8 path("/"); - u_short port = 80; - - if (url.empty()) - { - throwEx(LOGNAME "Parse error in url (" + url + ")"); - } - - url = stripHTTPprefix(url); - - utf8::size_type pos = url.find(utf8(":")), - pos2 = url.find(utf8("/")); - - if ((pos != utf8::npos) && ((pos2 == utf8::npos) || (pos < pos2))) - { - // port - server = url.substr(0, pos); - url.erase(0,pos + 1); - pos2 = url.find(utf8("/")); - port = utf8(url.substr(0, pos2)).toInt(); - url.erase(0,pos2); - } - else - { - server = url.substr(0,pos2); - url.erase(0,pos2); - } - - if (!url.empty()) - { - path = url; - } - out_server = server; - out_port = port; - out_path = path; - return in_url; -} - -uniString::utf8 config::getCrossDomainFile(const bool compressed) throw() -{ - if (m_crossdomainStr.empty()) - { - utf8 body = loadLocalFile(fileUtil::getFullFilePath(flashPolicyFile())); - if (body.empty()) - { - utf8 ports = tos(portBase()); - if (g_legacyPort >= 1 && g_legacyPort <= 65535) - { - ports += "," + tos(g_legacyPort); - } - if (!m_usedAlternatePorts.empty()) - { - ports += m_usedAlternatePorts; - } - - body = "\n\n" - "\n" - "\n" - "\n" - ""; - } - - m_crossdomainStrGZ = m_crossdomainStr = body; - - if (!compressData(m_crossdomainStrGZ)) - { - m_crossdomainStrGZ.clear(); - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_crossdomainStrGZ.empty() ? m_crossdomainStrGZ : m_crossdomainStr) : m_crossdomainStr); -} - -uniString::utf8 config::getShoutcastSWF(const bool compressed) throw() -{ - if (m_shoutcastSWFStr.empty()) - { - utf8 body = loadLocalFile(gStartupDirectory + "shoutcast.swf"); - if (body.empty()) - { - body = MSG_HTTP404; - } - - m_shoutcastSWFStrGZ = m_shoutcastSWFStr = body; - - if (!compressData(m_shoutcastSWFStrGZ)) - { - m_shoutcastSWFStrGZ.clear(); - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_shoutcastSWFStrGZ.empty() ? m_shoutcastSWFStrGZ : m_shoutcastSWFStr) : m_shoutcastSWFStr); -} - -uniString::utf8 config::getIndexCSS(const bool compressed) throw() -{ - if (m_styleCustomStr.empty()) - { - utf8 body = loadLocalFile(fileUtil::getFullFilePath(adminCSSFile())); - if (!body.empty()) - { - m_styleCustomStrGZ = m_styleCustomStr = body; - - if (!compressData(m_styleCustomStrGZ)) - { - m_styleCustomStrGZ.clear(); - } - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_styleCustomStrGZ.empty() ? m_styleCustomStrGZ : m_styleCustomStr) : m_styleCustomStr); -} - -const uniString::utf8 config::getStreamHideStats(const size_t streamID) const -{ - if (!streamID) - { - return hideStats(); - } - else - { - uniString::utf8 hide = stream_hideStats(streamID); - if (!read_stream_hideStats(streamID) || hide.empty()) - { - hide = hideStats(); - } - return hide; - } -} - -const uniString::utf8 config::getStreamRedirectURL(const size_t streamID, const bool isStats, - const bool homeSet, const bool compress, - const bool force) const throw() -{ - utf8 url; - // check if hiding of public pages is enabled with some - // specific handling as required for 'all' or 'stats'. - bool all = (getStreamHideStats(streamID) == "all"), - //none = !(getStreamHideStats(streamID) == "none"), - stats = ((getStreamHideStats(streamID) == "stats") && isStats); - - if (all || stats || force) - { - // if no streamid then look at global redirect option only - if (!streamID) - { - // if not set then we look at the streamurl from source - // and if that is not valid then and return a 403 error - if (!redirectUrl().empty()) - { - url = redirect(redirectUrl(), compress); - } - else - { - // but we check if it's for a stats only hide on a - // stats method and then redirect to /index.html - if (stats && !force) - { - url = redirect("index.html", compress); - } - else - { - url = MSG_HTTP403; - } - } - } - else - { - // look for a stream specific - utf8 surl = stream_redirectUrl(streamID); - if (!read_stream_redirectUrl(streamID) || surl.empty()) - { - // see if it's a stats page and redirect to /index.html - if (stats && !force) - { - url = redirect("index.html", compress); - } - else - { - // otherwise attempt to use the streamurl (if available) - if (homeSet && !force) - { - url = redirect("home.html?sid="+tos(streamID), compress); - } - else - { - // and if not then try the global redirect - if (!redirectUrl().empty()) - { - url = redirect(redirectUrl(), compress); - } - // before reverting to a 403 error - else - { - url = MSG_HTTP403; - } - } - } - } - else - { - url = redirect(surl, compress); - } - } - } - - return url; -} - -void config::setOption(uniString::utf8 key, uniString::utf8 value) throw(exception) -{ - stackLock sml(m_lock); - - size_t subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - uniString::utf8 stok = key; - - // see if it's a multi option and set the subIndex value - const vector tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - } - stok = stringUtil::stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - uniString::utf8 base_option_name = stringUtil::toLower(stok); - - std::map::const_iterator mi = m_optMap.find(base_option_name); - if (mi == m_optMap.end()) - { - throw std::runtime_error("Unknown option " + base_option_name.hideAsString()); - } - - // first see if the value has changed. If not then we don't worry about it - if ((this->*(*mi).second.m_fetchFunc)(subIndex, 0) != value) - { - if ((base_option_name == "log") || (base_option_name == "screenlog")) - { - m_deferredOptions[base_option_name] = value; - } - else - { - // tweak things as needed with checking the type so we can use the sid or not - (this->*(*mi).second.m_assignFunc)(value, subIndex); - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/config.h b/Src/Plugins/DSP/sc_serv3/config.h deleted file mode 100644 index ab2bc095..00000000 --- a/Src/Plugins/DSP/sc_serv3/config.h +++ /dev/null @@ -1,710 +0,0 @@ -#pragma once -#ifndef config_H_ -#define config_H_ - -#include -#include -#include -#include -#include -#include -#include "unicode/uniFile.h" -#include "stl/stringUtils.h" -#include "threading/thread.h" -#include "metrics.h" - -#define DEFAULT_SOURCE_STREAM 1 -#define DEFAULT_CLIENT_STREAM_ID 1 -#define DEFAULT_YP_ADDRESS "yp.shoutcast.com" - -#ifdef _WIN32 -#define DEFAULT_LOG "%temp%\\sc_serv.log" -#define DEFAULT_LOGW L"%temp%\\sc_serv.log" -#else -#define DEFAULT_LOG "/tmp/sc_serv.log" -#endif -#define DEFAULT_FLASH_POLICY_FILE "crossdomain.xml" - -/* - -Each option has a map associated with a member. Let's take an option called foobar - - std::map m_foobar; - -For single options (non-multi options) the map only has a single element. We use a map -so we can treat all options, multi or not, in the same fashion - -The value of the option is assigned via the assign_ method. subIndex is only used -for multi options (zero based). The value is always passed as a string and is converted -automatically internally - - inline void assign_foobar(int subIndex,const uniString::utf8 &value) - -The value of the option is retrieved as a string via the fetch_ method. The value -is fetched as a native type via native_fetch_ method. subIndex is used to select a -particular entry in a multi option. It's ignored for regular options - - uniString::utf8 fetch_foobar(int subIndex) - int native_fetch_foobar(int subIndex) - -A shorthand is provided via the _ method. It returns the same value as native_fetch_ - - const int _foobar() - -The number of elements for the option is returned by the count_ method. For single options -this is always one - - size_t count_foobar() - -The multi_ method returns true if the option is a multi option - - bool multi_foobar() - -The def_ method returns the default value for the option as a string - - utf8 def_foobar() - -All the proceeding options are private, and not protected by a mutex. -There are two public methods for accessing methods that provide mutex -protection. The value of the options is () and the default value -is provided by _Default() - - const int foobar() - const int foobar_Default() - -All of this is created automatically via the OPT and OPT_MULTI macros below - - -In the optMap table we associated all these functions with the actual name of the option -as it appears in the config file. In addition there is a change function associated with -each option that is fired when the option is changed. -*/ - -///////////////////////////////////////////////////////////////////////////////////// -///////// crazy macros to provide uniform assign/fetch functions for each option - -/* - Create a single option of type "tipe" with the name "name" and a default value of "def" -*/ -#define OPT(tipe,name,def)\ -private:\ -std::map m_##name;\ -inline void assign_##name(const uniString::utf8 &value, const size_t subIndex = DEFAULT_CLIENT_STREAM_ID) throw() { assignMulti(m_##name, subIndex, value); }\ -uniString::utf8 fetch_##name(const size_t subIndex = DEFAULT_CLIENT_STREAM_ID, size_t *fetchByPos = 0) const throw() { return revert(fetchMulti(m_##name, subIndex, def, fetchByPos)); }\ -tipe native_fetch_##name(const size_t subIndex = DEFAULT_CLIENT_STREAM_ID, size_t *fetchByPos = 0) const throw() { return fetchMulti(m_##name, subIndex, def, fetchByPos); }\ -const tipe _##name() const throw() { return fetchMulti(m_##name, DEFAULT_CLIENT_STREAM_ID, def, 0); }\ -size_t count_##name() const throw() { return 1; }\ -bool multi_##name() const throw() { return false; }\ -uniString::utf8 def_##name() const throw() { return revert(def); }\ -public:\ -const tipe name() const throw() { return fetchMulti(m_##name, DEFAULT_CLIENT_STREAM_ID, def, 0); }\ -const tipe name##_Default() const throw() { return def; } - -// for options that can have multiple instances (like encoders and broadcast points) -/* - The option has the type "tipe" with the name "name" and a default value of "def" -*/ -#define OPT_MULTI(tipe,name,def)\ -private:\ -std::map m_##name;\ -inline void assign_##name(const uniString::utf8 &value, const size_t subIndex) throw() { assignMulti(m_##name, subIndex, value); }\ -inline void native_assign_##name(const size_t subIndex, const tipe &value) throw() { native_assignMulti(m_##name, subIndex, value); }\ -uniString::utf8 fetch_##name(const size_t subIndex, size_t *fetchByPos = 0) const throw() { return revert(fetchMulti(m_##name, subIndex, def, fetchByPos)); }\ -tipe native_fetch_##name(const size_t subIndex) const throw() { return fetchMulti(m_##name, subIndex, def, 0); }\ -const tipe _##name(const std::vector::size_type i) const throw() { return fetchMulti(m_##name, i, def, 0); }\ -bool multi_##name() const throw() { return true; }\ -uniString::utf8 def_##name() const throw() { return revert(def); }\ -public:\ -const bool read_##name(const size_t subIndex) const throw() { return (m_##name.find(subIndex) != m_##name.end()); }\ -void unread_##name(const size_t subIndex) { native_assignMulti(m_##name, subIndex, name##_Default()); }\ -const tipe name(const size_t subIndex) const throw() { return fetchMulti(m_##name, subIndex, def, 0); }\ -size_t count_##name() const throw() { return m_##name.size(); }\ -const std::map& name##_map() const { return m_##name; } \ -const tipe name##_Default() const throw() { return def; } - -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - -// global configuration -class config -{ -public: - // stream specifications from config file. -#pragma pack(push, 1) - struct streamConfig - { -#pragma pack(push, 1) - class urlObj - { - private: - uniString::utf8 m_url; - uniString::utf8 m_server; - uniString::utf8 m_path; - u_short m_port; - - static uniString::utf8 parse(const uniString::utf8 &url, uniString::utf8 &server, - u_short &port, uniString::utf8 &path) throw(std::exception); - - public: - explicit urlObj(const uniString::utf8 &url) throw(std::exception) - { - if (!url.empty()) - { - set(url); - } - else - { - clear(); - } - } - urlObj& operator=(const uniString::utf8 &url) throw(std::exception) - { - set(url); - return *this; - } - const uniString::utf8 &url() const throw() { return m_url; } - const uniString::utf8 &server() const throw() { return m_server; } - const uniString::utf8 &path() const throw() { return m_path; } - const u_short port() const throw() { return m_port; } - bool isSet() const throw() { return !m_url.empty(); } - void set(const uniString::utf8 &url) throw(std::exception) - { - m_url = parse(url, m_server, m_port, m_path); - } - void clear() throw() - { - m_url.clear(); - m_port = 0; - } - }; -#pragma pack(pop) - - uniString::utf8 m_authHash; - uniString::utf8 m_urlPath; // url that clients use to connect - uniString::utf8 m_adminPassword; // per stream admin password - uniString::utf8 m_password; // per stream source password - uniString::utf8 m_publicServer; // per stream source public flag - size_t m_streamID; - int m_maxStreamUser; // per stream user limit - int m_maxStreamBitrate; // per stream max bitrate limit - int m_minStreamBitrate; // per stream min bitrate limit - urlObj m_relayUrl; // if this is a relay, then this is set to the source url - urlObj m_backupUrl; // if there is a backup, then this is set to the backup url - bool m_allowRelay; // per stream relay allowed flag - bool m_allowPublicRelay; // per stream relay public flag - - streamConfig() throw() : m_streamID(DEFAULT_CLIENT_STREAM_ID), m_maxStreamUser(0), - m_maxStreamBitrate(0), m_minStreamBitrate(0), - m_relayUrl((uniString::utf8)""), m_backupUrl((uniString::utf8)""), - m_allowRelay(true), m_allowPublicRelay(true) {} - - streamConfig(const size_t id, const uniString::utf8 &authHash, const uniString::utf8 &url, - const uniString::utf8 &relayUrl, const uniString::utf8 &backupUrl, - const int maxStreamUser, const int maxStreamBitrate, const int minStreamBitrate, - const uniString::utf8 &adminPassword, const uniString::utf8 &password, - const uniString::utf8 &publicServer, const bool allowRelay, - const bool allowPublicRelay) throw(std::exception) - : m_authHash(authHash), m_urlPath(url), m_adminPassword(adminPassword), m_password(password), - m_publicServer(publicServer), m_streamID(id), m_maxStreamUser(maxStreamUser), - m_maxStreamBitrate(maxStreamBitrate), m_minStreamBitrate(minStreamBitrate), m_relayUrl(relayUrl), - m_backupUrl(backupUrl), m_allowRelay(allowRelay), m_allowPublicRelay(allowPublicRelay) {} - }; -#pragma pack(pop) - - /////////////////////////////////////////////////////////////////////// - ///// functions to convert types to and from unicode strings - template inline static void convert(const uniString::utf8 &v,T &r) throw() { r = v; } - #ifdef _WIN64 - inline static void convert(const uniString::utf8 &v,size_t &r) throw() { r = atoi((const char *)v.c_str()); } - #endif - inline static void convert(const uniString::utf8 &v, int &r) throw() { r = atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned int &r) throw() { r = atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned long &r) throw() { r = atol((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned short &r) throw() { r = (unsigned short)atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, short &r) throw() { r = (short)atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, bool &r) throw() { r = (atoi((const char *)v.c_str()) ? true : false); } - inline static void convert(const uniString::utf8 &v, double &r) throw() { r = atof((const char *)v.c_str()); } - - template inline static uniString::utf8 revert(const T &r) throw() { return r; } - #ifdef _WIN64 - inline static uniString::utf8 revert(size_t r) throw() { return stringUtil::tos(r); } - #endif - inline static uniString::utf8 revert(int r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned int r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned long r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned short r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(short r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(bool r) throw() { return (r ? "1" : "0"); } - inline static uniString::utf8 revert(double r) throw() { return stringUtil::tos(r); } - //////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// - -private: - mutable AOL_namespace::mutex m_lock; // api may write to config, so we need a lock - - //////////////////////////////////////////////////////////////////////////////////////////// - //// tables and functions so we can read and write options in a generic manner based - /// on the names that are used in the config file - typedef void (config::*assignFunc_t)(const uniString::utf8 &, const size_t subIndex); - typedef uniString::utf8 (config::*fetchFunc_t)(const size_t subIndex, size_t *fetchByPos) const; - typedef size_t (config::*countFunc_t)() const; - typedef bool (config::*multiFunc_t)() const; - typedef uniString::utf8 (config::*defaultFunc_t)() const; - - struct accessor_t - { - assignFunc_t m_assignFunc; - fetchFunc_t m_fetchFunc; - countFunc_t m_countFunc; - multiFunc_t m_multiFunc; - defaultFunc_t m_defaultFunc; - - accessor_t(assignFunc_t af, fetchFunc_t ff, countFunc_t cf, multiFunc_t mf, defaultFunc_t df) throw() - : m_assignFunc(af), m_fetchFunc(ff), m_countFunc(cf), m_multiFunc(mf), m_defaultFunc(df) {} - - accessor_t() throw() : m_assignFunc(0), m_fetchFunc(0), m_countFunc(0), m_multiFunc(0), m_defaultFunc(0) {} - }; -public: - typedef std::map optMap_t; - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - // takes an option map (container) and returns the value at the index (i) if it exists, - // otherwise it returns the default value (defaultValue). Value returned as native type - template - static T fetchMulti(const std::map &container, const typename std::vector::size_type &subIndex, - const D defaultValue, size_t *fetchByPos) throw() - { - if (!fetchByPos) - { - typename std::map::const_iterator i = container.find(subIndex); - if (i != container.end()) - { - return (*i).second; - } - } - else - { - // there's cases where we need to get the value - // effectively by it's position in the map so - // for the moment we'll just look through (bad - // for speed but it's not a commonly used mode). - typename std::vector::size_type pos = 0; - for (typename std::map::const_iterator i = container.begin(); i != container.end(); ++i, pos++) - { - if (pos == subIndex) - { - *fetchByPos = (*i).first; - return (*i).second; - } - } - } - return defaultValue; - } -private: - // assign map index. Expand with default value as needed. Value is specified as a string and converted as needed - template - static void assignMulti(std::map &container, const typename std::vector::size_type subIndex, const uniString::utf8 &value) throw() - { - T vtmp; - convert(value, vtmp); - container[subIndex] = vtmp; - } - - // same as assignMulti, but you can provide the native type instead of a string - template - static void native_assignMulti(std::map &container, const typename std::vector::size_type subIndex, const T &value) throw() - { - container[subIndex] = value; - } - - ///////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////// - - // radionomy metrics - OPT(bool,adMetricsDebug,false) - OPT(size_t,metricsMaxQueue,80000) - - OPT(bool,authDebug,false) - -public: - friend void metrics::metrics_apply(config &conf); - -private: - optMap_t m_optMap; - - // we can't log during startup because the loggers don't exist - std::vector m_deferredWarnLogMessages; // log warning messages from startup - std::vector m_deferredErrorLogMessages; // log error messages from startup - - // deferred options are those that weren't set because they can't take effect immediately - // they are used when writing out the new config file. - std::map m_deferredOptions; - - OPT(size_t,configRewrite,0) - OPT(uniFile::filenameType,confFile,"") - - OPT(uniFile::filenameType,logFile,DEFAULT_LOG) // file for logging - OPT(uniFile::filenameType,realLogFile,DEFAULT_LOG) // file for logging - - OPT(bool,screenLog,true) // log to screen - OPT(bool,log,true) // do I log? - OPT(int,logRotates,5) // hwo many backups to keep when doing a log rotate? - OPT(bool,logArchive,false) // backup rotated files which would otherwise be deleted - OPT(int,rotateInterval,86400) // interval between log file rotations (24 hours) - // if set to 0 then we won't rotate any of the files - - OPT(int,portBase,8000) // listen port - OPT(int,publicPort,-1) // listen port for firehose - workaround for firehose hosts running on port 8000 - // but need to effectively be seen as bound to port 80 - allowing all to work ok - OPT(int,portLegacy,-1) // legacy port override/disable - OPT(uniString::utf8,alternatePorts,(uniString::utf8)"") // alternate port(s) for client only connections - comma separated string - OPT(bool,nameLookups,false) // do internet reverse lookups - - OPT(uniString::utf8,sslCertificateFile,""); - OPT(uniString::utf8,sslCertificateKeyFile,""); - - OPT(int,autoDumpTime,30) // how long before an idle connection is dumped (in seconds). Zero means no timeout - OPT(int,maxHeaderLineSize,4096) // maximum size of an HTTP header line. Default is pretty arbitrary right now - // but should be at least as big as a u-vox packet, since we have to anaylize - // initial data bytes to determine protocol and type of connectee (source or client) - OPT(int,maxHeaderLineCount,100) // max headers lines in HTTP style exchange - OPT(uniString::utf8,password,(uniString::utf8)""); // password for broadcaster to connect - OPT(uniString::utf8,adminPassword,(uniString::utf8)""); // administrator password - - // buffer configuration options - OPT(int,bufferType,1) // 0 - fixed, 1 - adaptive - OPT(size_t,fixedBufferSize,524288) // size of buffer if fixed (gives ~32 seconds ~ 128kbps, 44.1kHz) - OPT(double,adaptiveBufferSize,16) // size of adaptive buffer in seconds - OPT(size_t,bufferHardLimit,16777216) // no more than this give or take a factor of two - - OPT(unsigned short,metaInterval,16384) // metadata interval for shoutcast 1 - OPT_MULTI(unsigned short,stream_metaInterval,16384) // per-stream override - - // special intro and backup files - OPT(uniFile::filenameType,introFile,"") - OPT(uniFile::filenameType,backupFile,"") - OPT(uniFile::filenameType,backupTitle,"") - OPT(int,backupLoop,0) - OPT(int,maxSpecialFileSize,30000000) - - OPT(int,adTestFileLoop,1) - OPT(uniFile::filenameType,adTestFile,"") - OPT(uniFile::filenameType,adTestFile2,"") - OPT(uniFile::filenameType,adTestFile3,"") - OPT(uniFile::filenameType,adTestFile4,"") - - OPT(uniFile::filenameType,artworkFile,"") - std::map m_artworkBody; - - OPT(uniString::utf8,uvoxCipherKey,uniString::utf8("foobar")) - - // w3c logs - OPT(bool,w3cEnable,true) - OPT(uniString::utf8,w3cLog,uniString::utf8("sc_w3c.log")) - - OPT(uniString::utf8,pidFile,uniString::utf8("sc_serv_$.pid")) - - // relaying - OPT(bool,allowRelay,true) // can other servers relay us. Based on Shoutcast user agent, not reliable - OPT(bool,allowPublicRelay,true) // relays can list themselves in yp - - OPT(short,maxHTTPRedirects,5) // max times we can redirect (http 3xx) - OPT(int,relayReconnectTime,5) // seconds to reconnect on relay failure - OPT(int,relayConnectRetries,0) // number of times we retry a relay request before throwing it away - // which if set as zero will keep retrying (excluding bitrate blocks) - - ////// stream configs - OPT_MULTI(size_t,stream_ID,DEFAULT_CLIENT_STREAM_ID) - OPT_MULTI(uniString::utf8,stream_authHash,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_path,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_relayURL,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_backupURL,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_password,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_adminPassword,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_publicServer,(uniString::utf8)"") // if "always" or "never" overrides public flag from source - OPT_MULTI(bool,stream_allowRelay,true) // can other servers relay us. Based on Shoutcast user agent, not reliable - OPT_MULTI(bool,stream_allowPublicRelay,true) // relays can list themselves in yp - - OPT_MULTI(int,stream_maxUser,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(int,stream_maxBitrate,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(int,stream_minBitrate,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(bool,stream_ripOnly,false) // only addrs in rip file may connect - OPT_MULTI(int,stream_autoDumpTime,30) // how long before an idle connection is dumped (in seconds). Zero means no timeout - OPT_MULTI(int,stream_autoDumpSourceTime,7) // how long before an idle source connection is dumped (in seconds). Zero means no timeout - OPT_MULTI(bool,stream_autoDumpUsers,false) // if true, then users are dumped if source disconnects - OPT_MULTI(size_t,stream_listenerTime,0) // max time in minutes you can listen. 0 means no limit - - OPT_MULTI(int,stream_songHistory,10) // max song history to preserve - OPT_MULTI(uniString::utf8,stream_uvoxCipherKey,(uniString::utf8)"") - - OPT_MULTI(uniFile::filenameType,stream_logFile,""); // file for per mount logging - - OPT_MULTI(int,stream_adTestFileLoop,1) - OPT_MULTI(uniFile::filenameType,stream_adTestFile,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile2,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile3,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile4,"") - OPT_MULTI(uniFile::filenameType,stream_introFile,"") - OPT_MULTI(uniFile::filenameType,stream_backupFile,"") - OPT_MULTI(uniFile::filenameType,stream_backupTitle,"") - OPT_MULTI(int,stream_backupLoop,0) - - OPT_MULTI(int,stream_rateLimitWait,0) - - OPT_MULTI(uniFile::filenameType,stream_artworkFile,"") - - OPT_MULTI(uniFile::filenameType,stream_banFile,"") - OPT_MULTI(uniFile::filenameType,stream_ripFile,"") - OPT_MULTI(uniFile::filenameType,stream_agentFile,"") - OPT_MULTI(uniString::utf8,stream_w3cLog,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_hideStats,(uniString::utf8)"") // hide /stats & /statistics as well as /index and /played public facing pages - OPT_MULTI(uniString::utf8,stream_redirectUrl,(uniString::utf8)"") // used with hideStats=all or if the stream version isn't specified - OPT_MULTI(uniString::utf8,stream_movedUrl,(uniString::utf8)"") // used to redirect a deemed dead stream (just in case) - - OPT(bool,requireStreamConfigs,false) // if true, then sources can only connect if stream configs have been defined - OPT(uniString::utf8,userId,"") - OPT(uniString::utf8,licenceId,"") - - // flash policy - OPT(int,flashPolicyServerPort,-1) // listen on port 843 for flash policy server request - OPT(uniFile::filenameType,flashPolicyFile,DEFAULT_FLASH_POLICY_FILE) - uniString::utf8 m_crossdomainStr; // used to hold a cached copy of the crossdomain.xml file - uniString::utf8 m_crossdomainStrGZ; // used to hold a cached copy of the gzipped crossdomain.xml file - uniString::utf8 m_shoutcastSWFStr; // used to hold a cached copy of the shoutcast.swf file - uniString::utf8 m_shoutcastSWFStrGZ; // used to hold a cached copy of the gzipped shoutcast.swf file - uniString::utf8 m_usedAlternatePorts; // used to hold a copy of the valid alternate ports in use - - ////// yp - OPT(int,ypTimeout,30) // yp timeout interval for requests - OPT(uniString::utf8,ypAddr,DEFAULT_YP_ADDRESS) - OPT(int,ypPort,80) - OPT(uniString::utf8,ypPath,"/yp2") - OPT(int,ypMaxRetries,10) // number of times we retry a yp request before throwing it away - OPT(int,ypReportInterval,5 * 60) // never touch any slower than this - OPT(int,ypMinReportInterval,10) // never touch any faster than this - OPT(uniString::utf8,publicServer,"default") // if "always" or "never" overrides public flag from source - - //// cdn behaviour - OPT(uniString::utf8,cdn,"") // if 'on' or 'always' then we enable all of the cdn modes (including YP pings for private streams) - // but use it to determine opt-in (via 'on') or opt-out (via 'always') - OPT_MULTI(int,cdn_master,-1) // this and the option below is used to control the behaviour of things - OPT_MULTI(int,cdn_slave,-1) - - //// stats - OPT(int,maxUser,512) // max clients - OPT(int,minBitrate,0) // min bitrate of source connections - if zero / not set then there is no limit - OPT(int,maxBitrate,0) // max bitrate of source connections - if zero / not set then there is no limit - OPT(uniString::utf8,hideStats,"") // hide /stats & /statistics as well as /index and /played public facing pages - OPT(uniString::utf8,redirectUrl,"") // used with hideStats=all or if the stream version isn't specified - - /// client behaviour - OPT(size_t,listenerTime,0) // max time in minutes you can listen. 0 means no limit - OPT(bool,autoDumpUsers,false) // if true, then users are dumped if source disconnects - OPT(uniString::utf8,srcIP,"") // bind addr for sources - OPT(uniString::utf8,destIP,"") // bind addr for clients - OPT(uniString::utf8,publicIP,"") // public address to use for the YP listing if the bind addr is not appropriate - OPT(uniString::utf8,titleFormat,"") // modifies icy-name - OPT(uniString::utf8,urlFormat,"") // modifies icy-url - - //// banning - OPT(uniFile::filenameType,banFile,"sc_serv.ban") - OPT(bool,saveBanListOnExit,true) // save on exiting - - //// rip - OPT(uniFile::filenameType,ripFile,"sc_serv.rip") - OPT(bool,saveRipListOnExit,true) // save on exiting - OPT(bool,ripOnly,false) // only addrs in rip file may connect - OPT(uniFile::filenameType,adminFile,"sc_serv.admin") - - /// agent - OPT(uniFile::filenameType,agentFile,"sc_serv.agent") - OPT(bool,saveAgentListOnExit,true) // save on exiting - OPT(bool,blockEmptyUserAgent,false) // if true, block the client connection if there is no user agent specified - - //// debugging - OPT(bool,webClientDebug,false) - OPT(bool,yp2Debug,false) - OPT(bool,shoutcastSourceDebug,false) - OPT(bool,uvox2SourceDebug,false) - OPT(bool,HTTPSourceDebug,false) - OPT(bool,streamDataDebug,false) - OPT(bool,microServerDebug,false) - OPT(bool,httpStyleDebug,false) - OPT(bool,shoutcast1ClientDebug,false) - OPT(bool,shoutcast2ClientDebug,false) - OPT(bool,HTTPClientDebug,false) - OPT(bool,flvClientDebug,false) - OPT(bool,m4aClientDebug,false) - - OPT(bool,relayDebug,false) - OPT(bool,relayShoutcastDebug,false) - OPT(bool,relayUvoxDebug,false) - OPT(bool,statsDebug,false) - OPT(bool,threadRunnerDebug,false) - - OPT(bool,logClients,true) - - OPT(int,songHistory,20) // max song history to preserve - - /// misc nonsense - OPT(uniString::utf8,unique,"$") // subsitution string for file names to mimic old sc_serv conf file behaviour - OPT(uniString::utf8,include,"") // include file placeholder - OPT(int,cpuCount,0) // cpu usage. zero is default - OPT(bool,clacks,true) // need i say more...? - OPT(bool,startInactive,false) // used to not start the relays on startup - OPT(bool,rateLimit,true); // if we do frame rate limiting or not - OPT(int,rateLimitWait,5); // if we do frame rate limiting, how many seconds before we enforce it fully - OPT(bool,useXFF,true); // if we use XFF (if available) for the listener address (and related actions) - OPT(bool,forceShortSends,false);// used for debugging streaming issues by introducing forced delays into sends - OPT(bool,adminNoWrap,false); // used for defaulting the admin listener page mode for wrapping or not - // wrapping the listener output list which might be handy for some users - - // used for customising the css of the index.html and admin pages - OPT(uniFile::filenameType,adminCSSFile,"v2") - uniString::utf8 m_styleCustomStr; // used to hold a cached copy of the custom css file - uniString::utf8 m_styleCustomStrGZ; // used to hold a cached copy of the gzipped custom css file - uniString::utf8 m_styleCustomHeader; // used to hold a cached copy of the gzipped custom css file - uniString::utf8 m_styleCustomHeaderGZ; // used to hold a cached copy of the gzipped custom css file - time_t m_styleCustomHeaderTime; // used to control the cache handling - - OPT(uniFile::filenameType,faviconFile,"") - OPT(uniFile::filenameType,faviconFileMimeType,"image/x-icon") - uniString::utf8 m_faviconBody; - uniString::utf8 m_faviconHeader; - uniString::utf8 m_faviconBodyGZ; // gzipped version - uniString::utf8 m_faviconHeaderGZ; // gzipped version - time_t m_favIconTime; // used to control the cache handling - - // used for returning robots.txt - OPT(uniFile::filenameType,robotstxtFile,"") - uniString::utf8 m_robotsTxtBody; - uniString::utf8 m_robotsTxtHeader; - uniString::utf8 m_robotsTxtBodyGZ; // gzipped version - uniString::utf8 m_robotsTxtHeaderGZ; // gzipped version - - uniString::utf8 m_certPath; - uniString::utf8 m_certFileBody; - - const bool _load(const uniFile::filenameType &file, const uniString::utf8 &uniqueStr, const bool parent) throw(); - int promptConfigFile() throw(); - - bool editConfigFileEntry(size_t sid, const uniFile::filenameType &filename, - const uniString::utf8 &authhash, const uniString::utf8 ¶m, - bool add, bool &handled, bool &idHandled, bool parent) throw(); - - // used for legacy handling of the relayport and relayserver options to sid=1 - uniString::utf8 m_legacyRelayPort; - uniString::utf8 m_legacyRelayServer; - - streamConfig& getPerStreamConfig(streamConfig& stream, const size_t sid, const bool useParent = true); - -public: - config() throw(); - ~config() throw(); - - static std::string logSectionName(); - - uniString::utf8 getCrossDomainFile(const bool compressed) throw(); - uniString::utf8 getIndexCSS(const bool compressed) throw(); - uniString::utf8 getShoutcastSWF(const bool compressed) throw(); - - const uniString::utf8 getStreamRedirectURL(const size_t streamID, const bool isStats, const bool homeSet, - const bool compress, const bool force = false) const throw(); - - int getRateLimitWait(const size_t streamID) const throw(); - - const int isBitrateDisallowed(const size_t streamID, const int bitrate, int &streamMinBitrate, int &streamMaxBitrate) const throw(); - - unsigned short getMetaInterval(const size_t streamID) const throw(); - int getBackupLoop(const size_t streamID) const throw(); - size_t getSongHistorySize(const size_t streamID) const throw(); - const int getAutoDumpTime(const size_t streamID = DEFAULT_SOURCE_STREAM) const throw(); - - const int getCPUCount() const throw(); - - const std::vector getRelayList(); - const std::vector getBackupUrl(const size_t streamID) throw(std::exception); - const uniString::utf8 getStreamHideStats(const size_t streamID) const; - - typedef std::map streams_t; - void getStreamConfigs(streams_t& streams, const bool useParent = true); - const bool getStreamConfig(streamConfig& stream, const size_t streamID); - - // handle updating stream configs on the fly (as applicable) - #define AUTH_HASH 0x1 - #define URL_PATH 0x2 - #define RELAY_URL 0x4 - #define MAX_USER 0x8 - #define SOURCE_PWD 0x10 - #define ADMIN_PWD 0x20 - #define PUBLIC_SRV 0x40 - #define ALLOW_RELAY 0x80 - #define ALLOW_PUBLIC_RELAY 0x100 - #define RIP_ONLY 0x200 - #define DUMP_TIME 0x400 - #define DUMP_USER 0x800 - #define LIST_TIME 0x1000 - #define SONG_HIST 0x2000 - #define CIPHER_KEY 0x4000 - #define INTRO_FILE 0x8000 - #define BACKUP_FILE 0x10000 - #define BAN_FILE 0x20000 - #define RIP_FILE 0x40000 - #define W3C_FILE 0x80000 - #define MAX_BITRATE 0x100000 - #define BACKUP_URL 0x200000 - #define HIDE_STATS 0x400000 - #define MOVED_URL 0x800000 - #define AGENT_FILE 0x1000000 - #define CDN_MASTER 0x2000000 - #define CDN_SLAVE 0x4000000 - #define ARTWORK_FILE 0x8000000 - #define BACKUP_LOOP 0x10000000 - #define BACKUP_TITLE 0x20000000 - #define MIN_BITRATE 0x40000000 - #define AD_TEST_FILE 0x80000000 - #define AD_TEST_FILE_LOOP 0x100000000ULL - #define RATE_LIMIT_WAIT 0x200000000ULL - #define METAINTERVAL 0x400000000ULL - #define AD_TEST_FILE_2 0x800000000ULL - #define AD_TEST_FILE_3 0x1000000000ULL - #define AD_TEST_FILE_4 0x2000000000ULL - - void addStreamConfig(config &readConfig, config::streamConfig) throw(std::exception); - __uint64 updateStreamConfig(config &readConfig, config::streamConfig update) throw(std::exception); - void removeStreamConfig(config::streamConfig) throw(std::exception); - - // deals with configuring all of the per-stream passwords, etc - static bool setupPasswords(const config::streams_t &) throw(std::exception); - - void setOption(uniString::utf8 key, uniString::utf8 value) throw(std::exception); - - bool load(const uniFile::filenameType &file, bool load = true) throw(); - bool rewriteConfigurationFile(bool minimal = true, bool messages = false, bool setup = false) const throw(std::exception); // throw on I/O error - uniString::utf8 dumpConfigFile() throw(); - - ////////////////////////////////////////////////////////////////////////////////////// - - const std::vector& deferredWarnLogMessages() const throw() { stackLock sml(m_lock); return m_deferredWarnLogMessages; } - const std::vector& deferredErrorLogMessages() const throw() { stackLock sml(m_lock); return m_deferredErrorLogMessages; } - - void clearDeferredWarnLogMessages() throw() { stackLock sml(m_lock); m_deferredWarnLogMessages.clear(); } - void clearDeferredErrorLogMessages() throw() { stackLock sml(m_lock); m_deferredErrorLogMessages.clear(); } - - /////////// interface for service templates - const std::vector fromArgs(const std::vector &cl) throw(); - bool getConsoleLogging() const throw(); - const uniFile::filenameType getFileLog() const throw(); - static uniString::utf8 getSystemLogConfigString() throw(); - static uniString::utf8 getVersionBuildStrings() throw(); - //////////////////////////////////////////////////////////////////////////// -}; - -#undef OPT -#undef OPT_MULTI - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cpucount.cpp b/Src/Plugins/DSP/sc_serv3/cpucount.cpp deleted file mode 100644 index fc2a1156..00000000 --- a/Src/Plugins/DSP/sc_serv3/cpucount.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "cpucount.h" - -#ifdef _WIN32 -#include - -int cpucount() throw() -{ - SYSTEM_INFO sysinfo = {0}; - ::GetSystemInfo(&sysinfo); - - return sysinfo.dwNumberOfProcessors; -} -#endif - -#ifdef __APPLE_CC__ -#import -#import - -int cpucount() throw() -{ - int count = 0; - size_t size = sizeof(count); - - if (sysctlbyname("hw.ncpu",&count,&size,NULL,0)) return 1; - - return count; -} -#endif - -#if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) -#include -int cpucount() throw() -{ - return sysconf(_SC_NPROCESSORS_ONLN); -} -#endif - -#ifdef PLATFORM_BSD -#include -#include -#ifndef HW_AVAILCPU -#define HW_AVAILCPU 25 -#endif - -int cpucount() throw() -{ - int numCPU = 1; - int mib[4] = {0}; - size_t len = 0; - - /* set the mib for hw.ncpu */ - mib[0] = CTL_HW; - mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; - - /* get the number of CPUs from the system */ - sysctl(mib, 2, &numCPU, &len, NULL, 0); - - if( numCPU < 1 ) - { - mib[1] = HW_NCPU; - sysctl( mib, 2, &numCPU, &len, NULL, 0 ); - - if( numCPU < 1 ) - { - numCPU = 1; - } - } - return numCPU; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cpucount.h b/Src/Plugins/DSP/sc_serv3/cpucount.h deleted file mode 100644 index c11e40ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/cpucount.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#ifndef cpucount_H_ -#define cpucount_H_ - -// platform independent function to return number of logical processors -int cpucount() throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h b/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h deleted file mode 100644 index ad0fb2ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Module: sched.h - * - * Purpose: - * Provides an implementation of POSIX realtime extensions - * as defined in - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2012 Pthreads-win32 contributors - * - * Homepage1: http://sourceware.org/pthreads-win32/ - * Homepage2: http://sourceforge.net/projects/pthreads4w/ - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * 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 in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined(_SCHED_H) -#define _SCHED_H - -#if defined(_MSC_VER) -# if _MSC_VER < 1300 -# define PTW32_CONFIG_MSVC6 -# endif -# if _MSC_VER < 1400 -# define PTW32_CONFIG_MSVC7 -# endif -#endif - -#undef PTW32_SCHED_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SCHED_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SCHED_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) -#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX -/* Include everything */ -#endif - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * The Open Watcom C/C++ compiler uses a non-standard calling convention - * that passes function args in registers unless __cdecl is explicitly specified - * in exposed function prototypes. - * - * We force all calls to cdecl even though this could slow Watcom code down - * slightly. If you know that the Watcom compiler will be used to build both - * the DLL and application, then you can probably define this as a null string. - * Remember that sched.h (this file) is used for both the DLL and application builds. - */ -#if !defined(PTW32_CDECL) -# define PTW32_CDECL __cdecl -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#include - -#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ - -#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) -# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -/* For pid_t */ -# include -/* Required by Unix 98 */ -# include -# else - typedef int pid_t; -# endif -#else - /* [i_a] fix for using pthread_win32 with mongoose code, which #define's its own pid_t akin to typedef HANDLE pid_t; */ - #undef pid_t -# if defined(_MSC_VER) - typedef void *pid_t; -# else - typedef int pid_t; -# endif -#endif - -/* - * Microsoft VC++6.0 lacks these *_PTR types - */ -#if defined(_MSC_VER) && _MSC_VER < 1300 && !defined(PTW32_HAVE_DWORD_PTR) -typedef unsigned long ULONG_PTR; -typedef ULONG_PTR DWORD_PTR; -#endif - -/* Thread scheduling policies */ - -enum { - SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; - -struct sched_param { - int sched_priority; -}; - -/* - * CPU affinity - * - * cpu_set_t: - * Considered opaque but cannot be an opaque pointer - * due to the need for compatibility with GNU systems - * and sched_setaffinity() et.al. which include the - * cpusetsize parameter "normally set to sizeof(cpu_set_t)". - */ - -#define CPU_SETSIZE (sizeof(size_t)*8) - -#define CPU_COUNT(setptr) (_sched_affinitycpucount(setptr)) - -#define CPU_ZERO(setptr) (_sched_affinitycpuzero(setptr)) - -#define CPU_SET(cpu, setptr) (_sched_affinitycpuset((cpu),(setptr))) - -#define CPU_CLR(cpu, setptr) (_sched_affinitycpuclr((cpu),(setptr))) - -#define CPU_ISSET(cpu, setptr) (_sched_affinitycpuisset((cpu),(setptr))) - -#define CPU_AND(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuand((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_OR(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuor((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_XOR(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuxor((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_EQUAL(set1ptr, set2ptr) (_sched_affinitycpuequal((set1ptr),(set2ptr))) - -typedef union -{ - char cpuset[CPU_SETSIZE/8]; - size_t _align; -} cpu_set_t; - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -PTW32_DLLPORT int PTW32_CDECL sched_yield (void); - -PTW32_DLLPORT int PTW32_CDECL sched_get_priority_min (int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_get_priority_max (int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_setscheduler (pid_t pid, int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_getscheduler (pid_t pid); - -/* Compatibility with Linux - not standard */ - -PTW32_DLLPORT int PTW32_CDECL sched_setaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); - -PTW32_DLLPORT int PTW32_CDECL sched_getaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); - -/* - * Support routines and macros for cpu_set_t - */ -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpucount (const cpu_set_t *set); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuzero (cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuset (int cpu, cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuclr (int cpu, cpu_set_t *pset); - -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpuisset (int cpu, const cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuand(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuxor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpuequal (const cpu_set_t *pset1, const cpu_set_t *pset2); - -/* - * Note that this macro returns ENOTSUP rather than - * ENOSYS as might be expected. However, returning ENOSYS - * should mean that sched_get_priority_{min,max} are - * not implemented as well as sched_rr_get_interval. - * This is not the case, since we just don't support - * round-robin scheduling. Therefore I have chosen to - * return the same value as sched_setscheduler when - * SCHED_RR is passed to it. - */ -#define sched_rr_get_interval(_pid, _interval) \ - ( errno = ENOTSUP, (int) -1 ) - - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SCHED_LEVEL -#undef PTW32_SCHED_LEVEL_MAX - -#endif /* !_SCHED_H */ - diff --git a/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp b/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp deleted file mode 100644 index d335a5e4..00000000 --- a/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp +++ /dev/null @@ -1,681 +0,0 @@ -#include "filenameMetadata.h" -#include "metadata.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include -#include -#include -#include -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -/* - Overview of how it works: - - The setPattern() method looks at the pattern string and builds a stack of parseState objects. - Each of these objects are responsible for finding their associated pattern within a text range. - - parsing is done right to left. - - the parseState_optional object is used to encapsulate other state objects that are - optional (bracketed by [] in the pattern). -*/ - -class filenameMetadata::impl -{ - // to make unicode compatibility easier, we're just going to store things as utf32 - utf32 m_pattern; - utf32 m_data; - - // put the map will be in utf 8 - typedef map tokenMap_t; - tokenMap_t m_tokens; - - class parseState; - typedef list parseStack_t; - parseStack_t m_parseStack; - static void clearparseStack(parseStack_t &ps) throw() - { - while (!ps.empty()) - { - delete ps.back(); - ps.pop_back(); - } - } - - void clearparseStack() throw() { clearparseStack(m_parseStack); } - - ///////////// parse states ////////////////////////// - class parseState // virtual base - { - public: - typedef utf32::const_reverse_iterator range_e; - typedef pair range_t; - - virtual ~parseState() throw() {} - virtual range_t findRange(range_e rbegin, range_e rend) throw() { return make_pair(rbegin, rend); } - virtual void setFromRange(range_e /*rbegin*/, range_e /*rend*/) throw() {} - virtual void reportValue(tokenMap_t &/*tm*/) const throw() {} - virtual utf8 describe() const throw() = 0; // for diagnostics - virtual void reset() throw() {} - virtual bool optional() const throw() { return false; } - virtual bool finite() const throw() { return false; } // fixed width match - }; - - class parseState_optional: public parseState - { - parseStack_t m_parseStack; - - public: - parseState_optional(){} - ~parseState_optional() throw() { clearparseStack(m_parseStack); } - parseStack_t* stack() throw() { return &m_parseStack; } - - virtual bool optional() const throw() { return true; } - - virtual void reset() throw() - { - for_each(m_parseStack.begin(), m_parseStack.end(), mem_fun(&parseState::reset)); - } - - virtual utf8 describe() const throw() - { - utf8 result("["); - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - result += (*i)->describe(); - } - result = result + utf8("]"); - return result; - } - - virtual range_t findRange(range_e rbegin,range_e rend) throw() - { - const range_t NOTFOUND(make_pair(rend, rend)); - range_t result; - - reset(); - if (m_parseStack.empty()) - { - return NOTFOUND; - } - - parseStack_t::reverse_iterator s_cur = m_parseStack.rbegin(); - parseStack_t::reverse_iterator s_nxt = s_cur; - ++s_nxt; - - range_e data_start = rbegin; - range_e data_end = rend; - range_e last_restart = rbegin; - - bool first(true); - while (s_cur != m_parseStack.rend()) - { - if (data_start == data_end) - { - reset(); - return NOTFOUND; - } - - range_t curR(NOTFOUND); - range_t nxtR(NOTFOUND); - curR = (*s_cur)->findRange(data_start,data_end); - if (curR.first == data_end) - { - reset(); - return NOTFOUND; - } - if ((!first) && (curR.first != data_start)) - { - // must abut. Try moving forward again - reset(); - s_cur = m_parseStack.rbegin(); - s_nxt = s_cur; - ++s_nxt; - ++last_restart; - data_start = last_restart; - first = true; - continue; - } - if (first) - { - result.first = curR.first; - } - first = false; - - // don't do this if we have a single character state followed - // by anything (in particular, a string which eats all - if (curR.first + 1 != curR.second) - { - if (s_nxt != m_parseStack.rend()) - { - nxtR = (*s_nxt)->findRange(data_start,data_end); - } - if (nxtR.first < curR.second) - { - curR.second = nxtR.first; - } - } - (*s_cur)->setFromRange(curR.first,curR.second); - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - data_start = curR.second; - } - result.second = data_start; - return result; - } - - virtual void setFromRange(utf32::const_reverse_iterator rbegin, utf32::const_reverse_iterator rend) throw() - { - findRange(rbegin, rend); // resets to restricted range if necessary - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - (*i)->reportValue(tm); - } - } - - virtual bool finite() const throw() - { - bool result = true; - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - result &= (*i)->finite(); - } - return result; - } - }; - - class parseState_char: public parseState - { - utf32::value_type m_char; - - public: - explicit parseState_char(utf32::value_type c) : m_char(c){} - virtual pair - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if ((*i) == m_char) - { - return make_pair(i, i + 1); - } - } - return make_pair(rend,rend); - } - - virtual utf8 describe() const throw() - { - utf32 u32; u32.push_back(m_char); - return u32.toUtf8(); - } - - virtual bool finite() const throw() { return true; } - }; - - class parseState_stringSymbol: public parseState - { - utf8 m_symbolName; // can be empty for any string - utf32 m_value; - - public: - parseState_stringSymbol() throw(){} - explicit parseState_stringSymbol(const string &s) throw() : m_symbolName(s){} - ~parseState_stringSymbol() throw(){} - void reset() throw() { m_value.clear(); } - void setFromRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - if (!m_symbolName.empty()) - { - m_value.clear(); - m_value.insert(m_value.begin(),rbegin,rend); - reverse(m_value.begin(),m_value.end()); - m_value = stripWhitespace(m_value); - } - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - if (!m_symbolName.empty() && !m_value.empty()) - { - tm[m_symbolName] = m_value.toUtf8(); - } - } - - virtual utf8 describe() const throw() - { - if (m_symbolName.empty()) return utf8("*"); - return utf8("%") + m_symbolName; - } - }; - - class parseState_digits: public parseState - { - public: - parseState_digits() throw(){} - virtual range_t findRange(range_e rbegin,range_e rend) throw() - { - range_t result(make_pair(rend,rend)); - - bool got_start = false; - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if (uniString::is_a_number(*i)) - { - if (!got_start) - { - got_start = true; - result.first = i; - } - } - else - { - if (got_start) - { - result.second = i; - return result; - } - } - } - return result; - } - - virtual utf8 describe() const throw() { return utf8("%#"); } - }; - - class parseState_year: public parseState - { - utf32 m_value; - - public: - parseState_year() throw(){} - ~parseState_year() throw(){} - void reset() throw() { m_value.clear(); } - virtual pair - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - int count = 4; - - pair result(make_pair(rend,rend)); - - bool got_start = false; - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if (uniString::is_a_number(*i)) - { - if (!got_start) - { - got_start = true; - result.first = i; - } - count -= 1; - if (count == 0) - { - result.second = ++i; - return result; - } - } - else - { - if (got_start) - { - got_start = false; - result.first = rend; - } - } - } - return make_pair(rend,rend); - } - - void setFromRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - m_value.clear(); - m_value.insert(m_value.begin(),rbegin,rend); - reverse(m_value.begin(),m_value.end()); - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - if (!m_value.empty()) - { - tm[utf8(metadata::YEAR())] = m_value.toUtf8(); - } - } - - virtual utf8 describe() const throw() { return utf8("%YEAR"); } - virtual bool finite() const throw() { return true; } - }; - - class parseState_fixed: public parseState - { - utf32 m_value; - - public: - // fixed string - explicit parseState_fixed(const utf32 &val) throw() : m_value(val) {} - ~parseState_fixed() throw(){} - - virtual pair - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - assert(!m_value.empty()); - if (m_value.empty()) return make_pair(rend,rend); - - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if ((*i) == (*(m_value.rbegin()))) - { - utf32::const_reverse_iterator t_i = i; - utf32::const_reverse_iterator v_i = m_value.rbegin(); - utf32::const_reverse_iterator v_i_end = m_value.rend(); - bool match(true); - for (; match && (v_i != v_i_end); ++t_i, ++v_i) - { - if ((t_i == rend) || ((*t_i) != (*v_i))) - { - match = false; - } - } - if (match) - { - return make_pair(i, i + m_value.size()); - } - } - } - return make_pair(rend,rend); - } - - virtual utf8 describe() const throw() - { - return m_value.toUtf8(); - } - - virtual bool finite() const throw() { return true; } - }; - - static string stringify(utf32::value_type v) throw() - { - if (v >= '0' && v <= 'z') return string(1,(string::value_type)v); - return tos((int)v); - } - -public: - - impl(){} - ~impl() throw() - { - clearparseStack(); - } - - void deleteToken(const utf8 &token) throw() - { - tokenMap_t::iterator i = m_tokens.find(token); - if (i != m_tokens.end()) m_tokens.erase(i); - } - - const tokenMap_t::size_type countTokens() const throw() { return m_tokens.size(); } - utf8& operator[](const utf8 &key) throw() { return m_tokens[key]; } - const map& getTokens() const throw() { return m_tokens; } - - void setPattern(const utf8 &pattern) throw(runtime_error) - { - parseState_optional *opt = 0; - parseStack_t *stack = &m_parseStack; - - try - { - utf32 fixedAccumulator; // fixed string value - - #define DUMPACCUMULATOR { if (!fixedAccumulator.empty()) { stack->push_back(new parseState_fixed(fixedAccumulator)); fixedAccumulator.clear(); } } - - clearparseStack(); - m_pattern.assign(pattern); - for (utf32::const_iterator i = m_pattern.begin(); i != m_pattern.end(); ++i) - { - if ((*i) == ']') - { - DUMPACCUMULATOR - if (!opt) throw runtime_error("Unmatched ']' in pattern"); - stack = &m_parseStack; - stack->push_back(opt); - opt = 0; - } - else if ((*i) == '[') - { - DUMPACCUMULATOR - if (opt) throw runtime_error("Optional sequences cannot be nested in pattern"); - opt = new parseState_optional; - stack = opt->stack(); - } - else if ((*i) == '%') - { - ++i; - if (i == m_pattern.end()) throw runtime_error("Bad pattern. Trailing %"); - switch (*i) - { - case 'N': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::NAME())); break; - case 'G': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::GENRE())); break; - case 'A': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::ALBUM())); break; - case 'R': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::ARTIST()));break; - case 'Y': DUMPACCUMULATOR stack->push_back(new parseState_year); break; - case '#': DUMPACCUMULATOR stack->push_back(new parseState_digits); break; - case '%': fixedAccumulator.push_back('%'); break; - default: throw runtime_error("Unknown symbol %" + stringify(*i)); - } - } - else if ((*i) == '*') - { - DUMPACCUMULATOR - stack->push_back(new parseState_stringSymbol); - } - else - { - fixedAccumulator.push_back(*i); - } - } - if (opt) - { - throw runtime_error("Unterminated optional sequence in pattern"); - } - DUMPACCUMULATOR - } - catch(...) - { - delete opt; - throw; - } - } - - static utf8 describeStackRange(parseStack_t::const_reverse_iterator begin,parseStack_t::const_reverse_iterator end) throw() - { - parseStack_t stck(begin,end); - reverse(stck.begin(),stck.end()); - utf8 result; - for (parseStack_t::const_iterator i = stck.begin(); i != stck.end(); ++i) - { - result = result + (*i)->describe(); - } - return result; - } - - static utf8 describeRemainingData(utf32::const_reverse_iterator begin,utf32::const_reverse_iterator end) throw() - { - utf32 u32(begin,end); - reverse(u32.begin(),u32.end()); - return u32.toUtf8(); - } - - void parse(const utf8 &data) throw(runtime_error) - { - m_data.assign(data); - - // beginning and end of data string - utf32::const_reverse_iterator data_start = m_data.rbegin(); - utf32::const_reverse_iterator data_end = m_data.rend(); - - // current and next object pointers from the parse stack - parseStack_t::reverse_iterator s_cur = m_parseStack.rbegin(); - parseStack_t::reverse_iterator s_nxt = s_cur; - ++s_nxt; - - while(s_cur != m_parseStack.rend()) - { - // if we haven't finished the parse stack, and we're out of data then it's an error - if (data_start == data_end) - { - throw runtime_error("Premature end of data (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ")"); - } - - // we do one lookahead. Get the range match for the current parse object and - // the next parse object. Note that there is some added complexity due to optional objects - pair curR(make_pair(data_end,data_end)); - pair nxtR(make_pair(data_end,data_end)); - - // find widest possible match for current state - curR = (*s_cur)->findRange(data_start,data_end); - - // if no match, and the object is optional, just move on to the next (continue) - if ((curR.first == data_end) && (*s_cur)->optional()) - { - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - continue; - } - - // if no match, but object is not optional, then we have an error - if (curR.first == data_end) - { - throw runtime_error("Parse error, symbol not found (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ") (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - // if match was not found at our current starting point, then we have an error - if (curR.first != data_start) - { - throw runtime_error("Parse error, data skipped to find symbol (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ") (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - // restrict match range by one lookahead. Do not do lookahead - // if our current state is a single character match - if (!(*s_cur)->finite()) //curR.first + 1 != curR.second) - { - // we must loop in case the followup objects are optional and we must - // continue to look ahead - while (true) - { - if (s_nxt == m_parseStack.rend()) break; - // to handle the case of two optional string elements in a row, we - // repeat this if the range of the current and follow up objects match by - // incrementing the start - nxtR = (*s_nxt)->findRange(data_start,data_end); - if ((nxtR.first == curR.first) && (!(*s_nxt)->finite())) - { - nxtR = (*s_nxt)->findRange(data_start+1,data_end); - } - if (nxtR.first < curR.second) - { - // lookahead object restricts range - curR.second = nxtR.first; - break; - } - if ((nxtR.first == data_end) && (nxtR.second == data_end) && (*s_nxt)->optional()) - { - // lookahead object not found and is optional. try the next - ++s_nxt; - } - else - { - // no restriction - break; - } - } - } - - // set value and advance to next parse object - (*s_cur)->setFromRange(curR.first,curR.second); - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - data_start = curR.second; - } - if (data_start != data_end) - { - throw runtime_error("Data extends beyond pattern (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - m_tokens.clear(); - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - (*i)->reportValue(m_tokens); - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -filenameMetadata::filenameMetadata(): m_impl(0) -{ - m_impl = new filenameMetadata::impl; -} - -filenameMetadata::~filenameMetadata() throw() -{ - forget(m_impl); -} - -void filenameMetadata::setPattern(const utf8 &pattern) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->setPattern(pattern); -} - -void filenameMetadata::parse(const utf8 &data) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->parse(data); -} - -void filenameMetadata::deleteToken(const utf8 &token) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->deleteToken(token); -} - -const size_t filenameMetadata::countTokens() throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->countTokens(); -} - -utf8& filenameMetadata::operator[](const utf8 &key) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->operator[](key); -} - -const map& filenameMetadata::getTokens() const throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->getTokens(); -} diff --git a/Src/Plugins/DSP/sc_serv3/filenameMetadata.h b/Src/Plugins/DSP/sc_serv3/filenameMetadata.h deleted file mode 100644 index 4b23f4cc..00000000 --- a/Src/Plugins/DSP/sc_serv3/filenameMetadata.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef filenameMetadata_H_ -#define filenameMetadata_H_ - -#include "unicode/uniString.h" -#include -#include - -class filenameMetadata -{ - class impl; - impl *m_impl; - -public: - filenameMetadata(); - ~filenameMetadata() throw(); - - void setPattern(const uniString::utf8 &pattern) throw(std::exception); - void parse(const uniString::utf8 &data) throw(std::exception); - void deleteToken(const uniString::utf8 &token) throw(std::exception); - const size_t countTokens() throw(std::exception); - uniString::utf8& operator[](const uniString::utf8 &key) throw(std::exception); - const std::map& getTokens() const throw(std::exception); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/global.cpp b/Src/Plugins/DSP/sc_serv3/global.cpp deleted file mode 100644 index 8671e227..00000000 --- a/Src/Plugins/DSP/sc_serv3/global.cpp +++ /dev/null @@ -1,1177 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include -#endif -#include -#include "global.h" -#include "aolxml/aolxml.h" -#include "threadedRunner.h" -#include "w3cLog.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#ifndef _WIN32 -#include -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -config gOptions; - -unsigned char appname_tmpbuf[] = -{ - (unsigned char)~'B', (unsigned char)~'a', (unsigned char)~'n', (unsigned char)~'a', (unsigned char)~'n', (unsigned char)~'a', (unsigned char)~'r', (unsigned char)~'a', (unsigned char)~'m', (unsigned char)~'a', 255, 0, -}; - -void tealike_crappy_code(unsigned long v[2], unsigned long k[4]) -{ - unsigned long y = v[0], z = v[1], sum = 0, /* set up */ - delta = 0x9e3779b9UL, n = 32 ; /* key schedule constant*/ - - while (n-- > 0) - { - /* basic cycle start */ - sum += delta; - y += ((z << 4) + k[0]) ^(z + sum) ^((z >> 5) + k[1]); - z += ((y << 4) + k[2]) ^(y + sum) ^((y >> 5) + k[3]); /* end cycle */ - } - v[0] = y; v[1] = z; -} - -const utf8 bob() -{ - static utf8 _bob; - if (_bob.empty()) - { - char* app_name = (char*)appname_tmpbuf; - tealike_crappy_code((unsigned long *)(app_name += 12), (unsigned long *)appname_tmpbuf); - for (int x = 0; x < 12; x ++) - { - appname_tmpbuf[x] ^= 255; - } - app_name -= 12; - _bob = app_name; - } - return _bob; -} - -static int gs_kill = false; -static int gs_postSetup = false; - -const int iskilled() throw() { return gs_kill; } -void setkill(int v) throw() -{ - gs_kill = v; - threadedRunner::wakeup(); -} - -const int isPostSetup() throw() { return gs_postSetup; } -void setPostSetup(int v) throw() { gs_postSetup = v; } - -utf8 MSG_ICY_HTTP401; -utf8 MSG_ICY200; -utf8 MSG_ICY_HTTP200; -utf8 MSG_UVOX_HTTP200; - -int MSG_ICY_HTTP401_LEN; - -const utf8::value_type* MSG_INVALIDPASSWORD = (const utf8::value_type*)"Invalid Password\r\n"; -const int MSG_INVALIDPASSWORD_LEN = (int)strlen(MSG_INVALIDPASSWORD); - -const utf8::value_type* MSG_VALIDPASSWORD = (const utf8::value_type*)"OK2\r\nicy-caps:11\r\n\r\n"; -const int MSG_VALIDPASSWORD_LEN = (int)strlen(MSG_VALIDPASSWORD); - -const utf8::value_type* MSG_HTTP_VALIDPASSWORD = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n\r\n"; -const int MSG_HTTP_VALIDPASSWORD_LEN = (int)strlen(MSG_VALIDPASSWORD); - -const utf8::value_type* MSG_STREAMMOVED = (const utf8::value_type*)"Stream Moved\r\n"; -const int MSG_STREAMMOVED_LEN = (int)strlen(MSG_STREAMMOVED); - -const utf8::value_type* MSG_BADSTREAMID = (const utf8::value_type*)"Bad Stream ID\r\n"; -const int MSG_BADSTREAMID_LEN = (int)strlen(MSG_BADSTREAMID); - -const utf8::value_type* MSG_STREAMINUSE = (const utf8::value_type*)"Stream In Use\r\n"; -const int MSG_STREAMINUSE_LEN = (int)strlen(MSG_STREAMINUSE); - -const utf8::value_type* MSG_200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\nConnection:close\r\n\r\n"; - -const utf8::value_type* MSG_NO_CLOSE_200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n"; - -const utf8::value_type* MSG_STD200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Connection:close\r\n\r\n"; - -const utf8::value_type* MSG_HTTP400 = (const utf8::value_type*)("HTTP/1.1 400 Bad Request\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_AUTHFAILURE401 = (const utf8::value_type*) - ("HTTP/1.1 401 Unauthorized\r\n" - "Connection:close\r\n" - "Server:Shoutcast DNAS\r\n" - "WWW-authenticate:basic realm=\"Shoutcast Server\"\r\n" - "Content-type:text/html;charset=utf-8\r\n\r\n"); - -const utf8::value_type* MSG_HTTP403 = (const utf8::value_type*)("HTTP/1.1 403 Service Forbidden\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_HTTP404 = (const utf8::value_type*)("HTTP/1.1 404 Not Found\r\nConnection:close\r\n\r\n"); -const int MSG_HTTP404_LEN = (int)strlen(MSG_HTTP404); - -const utf8::value_type* MSG_HTTP405 = (const utf8::value_type*)("HTTP/1.1 405 Method Not Allowed\r\nAllow:GET\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_HTTP503 = (const utf8::value_type*)("HTTP/1.1 503 Server limit reached\r\nConnection:close\r\n\r\n"); -const int MSG_HTTP503_LEN = (int)strlen(MSG_HTTP503); - -void constructMessageResponses() -{ - MSG_ICY_HTTP200 = utf8("HTTP/1.0 200 OK\r\n" - "icy-notice1:
This stream requires " - "Winamp
\r\n" - "icy-notice2:Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "
\r\n" - "Accept-Ranges:none\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:no-cache,no-store,must-revalidate,max-age=0\r\n" - "Connection:close\r\n"); - - MSG_UVOX_HTTP200 = utf8("HTTP/1.0 200 OK\r\n" - "Accept-Ranges:none\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:no-cache,no-store,must-revalidate,max-age=0\r\n" - "Connection:close\r\n" - "Server:Ultravox/2.1 Shoutcast v" + gOptions.getVersionBuildStrings() + "/" SERV_OSNAME"\r\n" + - "Content-Type:misc/ultravox\r\n"); - - // this is only used for WMP which won't play the stream correctly when the in-stream - // metadata is being provided and we use the now standard HTTP response (added 2.4.3) - MSG_ICY200 = utf8("ICY 200 OK\r\n" - "icy-notice1:
This stream requires " - "Winamp
\r\n" - "icy-notice2:Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "
\r\n" - "Connection:close\r\n"); - - MSG_ICY_HTTP401 = utf8("HTTP/1.0 401 Unauthorized\r\n" // Service Unavailable - "icy-notice1:
Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "
\r\n" - "icy-notice2:The resource requested is currently unavailable
\r\n" - "Connection:close\r\n\r\n"); - MSG_ICY_HTTP401_LEN = (int)MSG_ICY_HTTP401.size(); -} - -utf8 g_userAgentBase = "Ultravox/2.1 ""Shoutcast Server "/**/; // user agent for sc_serv2 - // comment out for testing -utf8 g_userAgent; -time_t g_upTime = 0; - -const bool isUserAgentRelay(const utf8 &user_agent) throw() -{ - if (!user_agent.empty()) - { - return ((user_agent.find(utf8("shoutcast")) != utf8::npos) && - (user_agent != utf8("shoutcast directory tester")) && - (user_agent != utf8("relay")) && - (user_agent != utf8("icecast"))); - } - return false; -} - -const bool isUserAgentOfficial(const utf8 &user_agent) throw() -{ - if (!user_agent.empty()) - { - return ((user_agent == utf8("shoutcast directory tester")) || - (user_agent.find(utf8("shoutcast-to-dnas message sender")) == 0)); - } - return false; -} - -const utf8 redirect(const utf8 &url, const bool compress) throw() -{ - utf8 header = "HTTP/1.1 302 Found\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Location:" + url + "\r\n"; - utf8 body = "Redirect" - "Click here for redirect." - ""; - if (compress && compressData(body)) - { - header += "Content-Encoding:gzip\r\n"; - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - return header + body; -} - -const utf8 urlLink(const utf8 &url, const utf8 &text, const bool embed) throw() -{ - // so the pages have a better chance of wrapping - // we'll attempt to insert to give a hint. - utf8 wbrUrl = stripHTTPprefix((!text.empty() ? text : url)), fixedUrl; - vector parts = tokenizer(wbrUrl, '/'); - for (vector::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - fixedUrl += (i == parts.begin() ? "" : "/") + aolxml::escapeXML((*i)); - } - - wbrUrl.clear(); - parts = tokenizer(fixedUrl, '.'); - for (vector::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - wbrUrl += (i == parts.begin() ? "" : ".") + (*i); - } - - return "" + wbrUrl + ""; -} - -const utf8 http302(const utf8 &url) throw() -{ - return "HTTP/1.1 302 Found\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Location:" + url + "\r\n\r\n" - "RedirectClick HERE for redirect."; -} - -const utf8 addWBR(const utf8 &str) throw() -{ - if (!str.empty()) - { - // this allows browsers to word break the string on small displays - // and is aimed for user agent strings, hence / and ( to break on - utf8 wbrIdent, fixedIdent; - vector parts = tokenizer(str, '/'); - for (vector::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - wbrIdent += (i == parts.begin() ? "" : "/") + aolxml::escapeXML((*i)); - } - - parts = tokenizer(wbrIdent, '('); - for (vector::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - fixedIdent += (i == parts.begin() ? "" : "(") + (*i); - } - - return fixedIdent; - } - return str; -} - -utf8 getfooterStr() -{ - return ""; -} - -const utf8 randomId(utf8 &temp) -{ - temp.clear(); - - // construct a secondary temp id for this - // action for use after the check happened - for (int i = 0; i < 8; i++) - { - temp.append(utf8(tos(rand() % 10))); - } - return temp; -} - -utf8 getStreamListeners(const size_t sid, const bool nowrap, const int fh) -{ - return ""; -} - -utf8 getHTML5Remover() -{ - return ""; -} - -utf8 getIEFlexFix() -{ - return ""; -} - -utf8 g_IPAddressForClients; // address clients will connect to -u_short g_portForClients = 0; // port clients will connect to, generally portBase -int g_legacyPort = -1; // port legacy v1 sources will connect to, or not - -// attempt to compress everything in one go though -// only use if its smaller than the original data. -const bool compressData(utf8 &body) -{ - if (!body.empty()) - { - z_stream stream = {0}; - - const uInt size = (uInt)body.size(); - stream.next_in = (Bytef*)body.data(); - stream.avail_in = size; - - char *m_outMsg = new char[size * 2]; - stream.next_out = (Bytef*)m_outMsg; - stream.avail_out = size * 2; - - // set windowBits to 31 to allow gzip encoded output - if (deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK) - { - int ret = deflate(&stream, Z_FINISH); - deflateEnd(&stream); - if (ret == Z_STREAM_END) - { - // if it's bigger than we started with then there's no - // sensible reason to return the compressed data block - if (stream.total_out < size) - { - body = utf8(m_outMsg, stream.total_out); - delete [] m_outMsg; - return true; - } - } - } - delete [] m_outMsg; - } - return false; -} - -const bool compressDataStart(utf8 &body, z_stream *stream, Bytef* name, const bool local) -{ - if (!stream || body.empty()) - { - return false; - } - - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = Z_NULL; - - // set windowBits to 31 to allow gzip encoded output - if (deflateInit2(stream, (local ? Z_BEST_COMPRESSION : Z_DEFAULT_COMPRESSION), Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) != Z_OK) - { - return false; - } - - if (local) - { - gz_header head = {0}; - head.text = 1; - head.name = head.comment = name; - head.time = (uLong)::time(NULL); - deflateSetHeader(stream, &head); - } - - return (compressDataCont(body, stream) != 0); -} - -const int compressDataCont(utf8 &body, z_stream *stream) -{ - #define CHUNK 1024 - static utf8 body2; - body2.clear(); - static unsigned char out[CHUNK] = {0}; - int ret = Z_OK; - uInt start = (uInt)body.size(), have = 0, pos = 0; - - do - { - if (start - pos > 0) - { - if (have == 0) - { - stream->next_in = (Bytef*)body.data(); - pos += (stream->avail_in = min(CHUNK, (int)start)); - have = start - stream->avail_in; - } - else - { - stream->next_in = (Bytef*)&body[pos]; - pos += (stream->avail_in = min(CHUNK, (int)have)); - have = have - stream->avail_in; - } - } - - do - { - stream->avail_out = CHUNK; - stream->next_out = out; - ret = deflate(stream, Z_PARTIAL_FLUSH); - body2 += utf8(out, (CHUNK - stream->avail_out)); - if (!stream->avail_in) - { - break; - } - } while (stream->avail_out == 0); - } while (ret != Z_BUF_ERROR); - - if (!body2.empty()) - { - body = body2; - } - return stream->total_out; -} - -void compressDataFinish(utf8 &body, z_stream *stream) -{ - if (stream) - { - #define CHUNK 1024 - static utf8 body2; - body2.clear(); - static unsigned char out[CHUNK] = {0}; - stream->avail_out = CHUNK; - stream->next_out = out; - deflate(stream, Z_FINISH); - body2 = utf8(out, (CHUNK - stream->avail_out)); - if (!body2.empty()) - { - body = body2; - } - } -} - -const bool compressDataEnd(z_stream *stream) -{ - return (stream && (deflateEnd(stream) == Z_OK)); -} - -const utf8 loadLocalFile(uniFile::filenameType fn, const utf8& logPrefix, const size_t sizeLimit) -{ - utf8 body; - if (!fn.empty()) - { - size_t fileSize = uniFile::fileSize(fn); - if (fileSize && (!sizeLimit || fileSize <= sizeLimit)) - { - FILE *f = uniFile::fopen(fn, "rb"); - if (f) - { - size_t alloc = fileSize + 1; - utf8::value_type *buf = new utf8::value_type[alloc]; - memset(buf, 0, sizeof(utf8::value_type) * alloc); - ::fread(buf, 1, fileSize, f); - ::fclose(f); - - body = utf8(buf,fileSize); - delete [] buf; - } - } - else if (fileSize) - { - WLOG(logPrefix + "Unable to load `" + fn + "' as it is over the allowed size limit (" + tos(sizeLimit) + " bytes)"); - } - } - return body; -} - -#ifdef _WIN32 -static const char *abb_weekdays[] = { - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - NULL -}; - -static const char *abb_month[] = { - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - NULL -}; - -/* - * tm_year is relative this year - */ -const int tm_year_base = 1900; - -inline int match_string(const char **buf, const char **strs) -{ - for (int i = 0; (strs && strs[i] != NULL); ++i) { - size_t len = (strs && strs[i] ? strlen(strs[i]) : 0); - if (len && strncmp(*buf, strs[i], len) == 0) { - *buf += len; - return i; - } - } - return -1; -} - -// stripped down version which only processes against '%a, %d %b %Y %H:%M:%S' -// which is only used on the Windows builds as it's native for other targets -char *strptime(const char *buf, const char *format, struct tm *timeptr) -{ - char c; - - for (; (c = *format) != '\0'; ++format) - { - char *s = 0; - - if (isspace (c)) - { - while (isspace (*buf)) ++buf; - } - else if (c == '%' && format[1] != '\0') - { - int ret; - c = *++format; - if (c == 'E' || c == 'O') c = *++format; - switch (c) - { - case 'a': - { - ret = match_string (&buf, abb_weekdays); - if (ret < 0) return NULL; - timeptr->tm_wday = ret; - break; - } - case 'b': - { - ret = match_string (&buf, abb_month); - if (ret < 0) return NULL; - timeptr->tm_mon = ret; - break; - } - case 'd': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_mday = ret; - buf = s; - break; - } - case 'H': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_hour = ret; - buf = s; - break; - } - case 'M': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_min = ret; - buf = s; - break; - } - case 'S': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_sec = ret; - buf = s; - break; - } - case 'Y': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_year = ret - tm_year_base; - buf = s; - break; - } - case '\0': - { - --format; - /* FALLTHROUGH */ - } - case '%': - { - if (*buf == '%') ++buf; - else return NULL; - break; - } - default: - { - if (*buf == '%' || *++buf == c) ++buf; - else return NULL; - break; - } - } - } - else - { - if (*buf == c) ++buf; - else return NULL; - } - } - return (char *)buf; -} -#endif - -const time_t readRFCDate(const utf8& str) -{ - struct tm tmdate = {0}; - if (strptime(str.toANSI().c_str(), "%a, %d %b %Y %H:%M:%S", &tmdate)) - { - #ifdef _WIN32 - return _mkgmtime(&tmdate); - #else - return timegm(&tmdate); - #endif - } - return 0; -} - -const utf8 getRFCDate(const time_t use) -{ - char buf[1024] = {0}; - const time_t now = ::time(NULL); - struct tm tm = *gmtime((use ? &use : &now)); - const size_t size = strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &tm); - return (size > 0 ? utf8(buf, size) : (utf8)""); -} - -const utf8 timeString(const time_t t, const bool slim) throw() -{ - __int64 sec = t; - __int64 min = sec / 60; - sec -= min * 60; - __int64 hours = min / 60; - min -= hours * 60; - - if (slim) - { - char buf[24] = {0}; - snprintf(buf, sizeof(buf), "%02lld:%02u:%02u", hours, (unsigned int)min, (unsigned int)sec); - return buf; - } - else - { - utf8 result; - __int64 days = hours / 24; - hours -= days * 24; - const __int64 years = days / 365; - days -= years * 365; - - if (years) result += tos(years) + " year" + (years != 1 ? "s" : "") + " "; - if (days) result += tos(days) + " day" + (days != 1 ? "s" : "") + " "; - if (hours) result += tos(hours) + " hour" + (hours != 1 ? "s" : "") + " "; - if (min) result += tos(min) + " minute" + (min != 1 ? "s" : "") + " "; - if (sec) result += tos(sec) + " second" + (sec != 1 ? "s" : ""); - return stripWhitespace(result); - } -} - -class jsonEscapes: public map -{ -public: - jsonEscapes() - { - (*this)['\\'] = "\\\\"; - (*this)['/'] = "\\/"; - (*this)['\"'] = "\\\""; - (*this)['\b'] = "\\b"; - (*this)['\f'] = "\\f"; - (*this)['\n'] = "\\n"; - (*this)['\r'] = "\\r"; - (*this)['\t'] = "\\t"; - } -}; - -static const jsonEscapes gsJSONEscapes; - -const utf8 escapeJSON(const utf8 &s) throw() -{ - string result; - const string::size_type siz = s.size(); - for (string::size_type x = 0; x < siz; ++x) - { - jsonEscapes::const_iterator i = gsJSONEscapes.find(s[x]); - if (i != gsJSONEscapes.end()) - { - result += (*i).second; - } - else - { - result += s[x]; - } - } - return result; -} - -void rotatew3cFiles(utf8 files) -{ - // w3c logging (global) - if (gOptions.w3cEnable()) - { - if (files == "w3c" || files == "") - { - w3cLog::rotate_log(gOptions.w3cLog()); - } - } - - // w3c logging (per stream) - if (files == "w3c" || files == "") - { - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::rotate_log(gOptions.stream_w3cLog((*i).first),(*i).first); - } - } - } -} - -utf8 &fixSongMetadata(utf8& metadata, int& trigger) -{ - utf8::size_type pos = metadata.find((unsigned char *)"Advert:", 0, 7); - - if (pos == utf8::npos) - pos = metadata.find((unsigned char *)"Advert!", 0, 7); - - if (!metadata.empty() && (pos == 0)) - { - trigger = 1; - - // got a first matching block - metadata.erase (0, 7); - - // look for an end block - metadata = stripWhitespace(metadata); - - // check for it being empty after stripping out non-alpha - // characters so we can show what is sent to the listener - if (stripAlphaDigit(metadata).empty()) - { - metadata.clear(); - } - } - return metadata; -} - -const utf8 getCurrentSong(utf8 currentSong) -{ - int trigger = 0; - utf8 &song = fixSongMetadata(currentSong, trigger); - if (trigger) - { - if (song.empty()) - { - song = "" + utf8(trigger == 2 ? "Test " : "") + "Advert Trigger"; - } - else - { - song = "" + utf8(trigger == 2 ? "Test " : "") + "Advert Trigger:  " + aolxml::escapeXML(song) + "
"; - } - } - else - { - if (song.empty()) - { - song = "Empty Title"; - } - else - { - song = aolxml::escapeXML(song); - } - } - - return song; -} - -const utf8 stripHTTPprefix(const utf8& addr) -{ - if (!addr.empty()) - { - utf8::size_type pos = addr.find(utf8("://")); - if (pos != utf8::npos) - { - return addr.substr(pos + 3); - } - } - return addr; -} - -const bool isAddress(const utf8& addr) -{ - if (!addr.empty()) - { - if (addr.find(utf8(".")) != utf8::npos) - { - return true; - } - } - return false; -} - -const bool extractPassword(utf8 &dj_password, utf8 &dj_name, int &streamID) -{ - if (!dj_password.empty()) - { - const vector tokens = tokenizer(dj_password, ':'); - // if 2 or 3 then we've got user:password or password:#sid or - // user:password:#sid so we need to check for which version - if (tokens.size() >= 2) - { - if (tokens[1].size() > 0) - { - // this is user:password:#sid or user:password - if (tokens[1].find(utf8("#")) != 0) - { - dj_password = tokens[1]; - dj_name = tokens[0]; - - if (tokens.size() == 3) - { - if (tokens[2].size() > 1) - { - if (tokens[2].find(utf8("#")) == 0) - { - streamID = atoi((const char *)tokens[2].c_str()+1); - } - } - } - } - // this could be password:#sid - else - { - streamID = atoi((const char *)tokens[1].c_str()+1); - dj_password = tokens[0]; - } - return true; - } - } - } - return false; -} - -#ifdef _WIN32 - -const utf8 errMessage() throw() -{ - LPVOID lpMsgBuf = NULL; - ::FormatMessageW( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - if (lpMsgBuf) - { - utf32 u32((const wchar_t*)lpMsgBuf); - const utf8 result = stripWhitespace(u32.toUtf8()); - ::LocalFree(lpMsgBuf); - return result; - } - return "Unknown error"; -} - -#else -#include -#include -#include "stl/stringUtils.h" -#include - -const utf8 errMessage() throw() -{ - const int e = errno; - const utf8 b = strerror(e); - return (!b.empty() ? utf8(b) : tos(e)); -} - -#endif - -#ifdef _WIN32 -#define _WS2DEF_ -#define _WINSOCK2API_ -#endif -#include "threadedRunner.h" -const int getStreamBitrate(const httpHeaderMap_t &headers) -{ - const int bitrate = mapGet(headers, "icy-br", 0); - if (!bitrate) - { - // try to find a bitrate if not provided by looking at the possible Icecast info header - const utf8 info = mapGet(headers, "ice-audio-info", utf8()); - if (!info.empty()) - { - vector blocks = tokenizer(info, ';'); - for (vector::const_iterator i = blocks.begin(); i != blocks.end(); ++i) - { - vector pairs = tokenizer((*i), '='); - if (pairs.size() == 2) - { - utf8 key = toLower(stripWhitespace(pairs[0])); - if (!key.empty()) - { - // should just be "ice-bitrate" but seen some servers use "bitrate" - if ((key == "bitrate") || (key == "ice-bitrate")) - { - return atoi((const char *)stripWhitespace(pairs[1]).c_str()); - } - } - } - } - } - } - return bitrate; -} - -const int getStreamSamplerate(const httpHeaderMap_t &headers) -{ - const int samplerate = mapGet(headers, "icy-sr", 0); - if (!samplerate) - { - // try to find a bitrate if not provided by looking at the possible Icecast info header - const utf8 info = mapGet(headers, "ice-audio-info", utf8()); - if (!info.empty()) - { - vector blocks = tokenizer(info, ';'); - for (vector::const_iterator i = blocks.begin(); i != blocks.end(); ++i) - { - vector pairs = tokenizer((*i), '='); - if (pairs.size() == 2) - { - utf8 key = toLower(stripWhitespace(pairs[0])); - if (!key.empty()) - { - if (key == "samplerate") - { - return atoi((const char *)stripWhitespace(pairs[1]).c_str()); - } - } - } - } - } - } - return samplerate; -} - -const int getHTTPRequestDetails(const string &firstLine, string &request, string &url, string &protocolAndVersion) -{ - const vector parts = tokenizer(firstLine, ' '); - if (!parts.empty()) - { - int state = 0, partsCount = (int)parts.size(); - switch (partsCount) - { - case 3: - { - request = parts[0]; - url = parts[1]; - protocolAndVersion = parts[2]; - state = partsCount; - } - break; - case 2: - { - request = parts[0]; - url = parts[1]; - // this allows things like old v1 sc_trans to send - // title updates without failing (like v1 allowed) - protocolAndVersion = "HTTP/1.0"; - state = 3; - } - break; - case 1: - { - request = parts[0]; - state = partsCount; - } - break; - default: - { - // if we're here then it's likely that it's an - // incorrectly encoded request and we'll need - // to re-combine to make the 'url' not cludge - // the expected data for 'protocolAndVersion'. - request = parts[0]; - for (int i = 1; i < partsCount - 1; i++) - { - url += (i != 1 ? " " : "") + parts[i]; - } - protocolAndVersion = parts[partsCount - 1]; - state = 3; - } - break; - } - return state; - } - return 0; -} - -const utf8 fixMimeType(const utf8& mimeType) -{ - if (mimeType.empty() || (mimeType == "mp3") || (mimeType == "audio/mp3")) - { - return "audio/mpeg"; - } - if (mimeType == "audio/aac") - { - return "audio/aacp"; - } - return mimeType; -} - -const int detectAutoDumpTimeout(time_t &cur_time, const time_t lastActivityTime, - const utf8& msg, const bool debug, - const size_t streamID) throw(runtime_error) -{ - const int autoDumpTime = gOptions.getAutoDumpTime(streamID); - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - lastActivityTime) >= autoDumpTime)) - { - throwEx((debug ? (msg + " (" + tos(cur_time) + " " + - tos(lastActivityTime) + " [" + - tos(cur_time - lastActivityTime) + "])") : (utf8)"")); - } - return autoDumpTime; -} - -const utf8 sampleRateStr(const int sr) -{ - switch (sr) - { - case 88200: - { - return "88.2 kHz"; - } - case 44100: - { - return "44.1 kHz"; - } - case 22050: - { - return "22.05 kHz"; - } - case 11025: - { - return "11.025 kHz"; - } - case 7350: - { - return "7.35 kHz"; - } - default: - { - // 96, 64, 48, 32, 24, 16, 12, 8 - return (sr > 0 ? tos(sr / 1000) : "unknown") + " kHz"; - } - } -} - -const __uint64 time_now_ms() -{ -#ifdef _WIN32 - FILETIME ft = {0}; - ::GetSystemTimeAsFileTime(&ft); - - __uint64 t = ((__uint64)(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; - - t -= 116444736000000000LL; // convert epoch as there's this - // many 100ns between 1601 & 1970 - t /= 10000; // convert to milliseconds as this is - // based on the number of 100-nanosecond - // intervals since January 1, 1601 (UTC) - return t; -#else - struct timeval now; - gettimeofday(&now, NULL); - return (((__uint64)now.tv_sec) * 1000) + (now.tv_usec / 1000); -#endif -} - -const bool isRemoteAddress(const utf8 &addr) -{ - return (!addr.empty() && - (addr.find(utf8("127.")) != 0) && - (addr.find(utf8("10.")) != 0) && - (addr.find(utf8("192.168.")) != 0) && - (addr.find(utf8("192.0.0.")) != 0) && - (addr.find(utf8("198.18.")) != 0) && - (addr.find(utf8("198.19.")) != 0) && - (toLower(addr).find(utf8("localhost")) != 0)); -} diff --git a/Src/Plugins/DSP/sc_serv3/global.h b/Src/Plugins/DSP/sc_serv3/global.h deleted file mode 100644 index 6f2065f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/global.h +++ /dev/null @@ -1,218 +0,0 @@ -#pragma once -#ifndef global_H_ -#define global_H_ - -#include "config.h" -#include "versions.h" -#include -#include - -// #define INCLUDE_BACKUP_STREAMS 1 -// #define INCLUDE_SSL_CERTS 1 - -#define EL "\n" - -#ifdef _WIN32 -#define getpid _getpid -#define MAXHOSTNAMELEN 256 -#endif -#ifndef MAXHOSTNAMELEN -#ifndef HOST_NAME_MAX -#define HOST_NAME_MAX _POSIX_HOST_NAME_MAX -#endif -#define MAXHOSTNAMELEN HOST_NAME_MAX -#endif - -extern config gOptions; -extern size_t gFF_fix; - -// manage killed state -const int iskilled() throw(); -void setkill(int v) throw(); - -// manage post-setup handling -const int isPostSetup() throw(); -void setPostSetup(int v) throw(); - -// helper template to throw an exception with a utf8 stream -template inline void throwEx(const char *msg) throw(T) { throw T(msg); } -template inline void throwEx(const uniString::utf8 &msg) throw(T) { throw T(msg.hideAsString()); } -template inline void throwEx(const std::string &msg) throw(T) { throw T(msg); } - -// subclass used to distinguish between error messages that are already labeled -// with [] and those that aren't -class tagged_error: public std::runtime_error -{ -public: - explicit tagged_error(const std::string &s):runtime_error(s){} -}; - - -struct parserInfo -{ - unsigned long m_mask; - unsigned long m_pattern; - unsigned int m_samplerate; - int m_version; - int m_bitrate; - unsigned m_frameCount; - unsigned m_reduce; - float m_duration; - bool m_inUse; - std::string m_description; - - virtual int verifyFrame (const unsigned char *buf, unsigned int len) = 0; - virtual const std::string &getDescription() const { return m_description; } - virtual const char *getVersionName() const = 0; - - parserInfo(unsigned long mask = 0, unsigned long v = 0) { m_mask = mask; m_pattern = v; m_samplerate = m_bitrate = 0; m_inUse = false; m_frameCount = m_reduce = 0; m_duration = 0.0; m_version = 0; } - virtual int getUvoxType() = 0; - virtual ~parserInfo() {} -}; - -/////////////// various strings ///////////////////////////// - -void constructMessageResponses(); - -extern const uniString::utf8::value_type* MSG_INVALIDPASSWORD; -extern const int MSG_INVALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_VALIDPASSWORD; -extern const int MSG_VALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_HTTP_VALIDPASSWORD; -extern const int MSG_HTTP_VALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_BADSTREAMID; -extern const int MSG_BADSTREAMID_LEN; - -extern const uniString::utf8::value_type* MSG_STREAMINUSE; -extern const int MSG_STREAMINUSE_LEN; - -extern const uniString::utf8::value_type* MSG_STREAMMOVED; -extern const int MSG_STREAMMOVED_LEN; - -extern uniString::utf8 MSG_ICY_HTTP401; -extern uniString::utf8 MSG_ICY200; -extern uniString::utf8 MSG_ICY_HTTP200; -extern uniString::utf8 MSG_UVOX_HTTP200; - -extern int MSG_ICY_HTTP401_LEN; - -extern const uniString::utf8::value_type* MSG_AUTHFAILURE401; - -extern const uniString::utf8::value_type* MSG_200; -extern const uniString::utf8::value_type* MSG_NO_CLOSE_200; -extern const uniString::utf8::value_type* MSG_STD200; - -extern const uniString::utf8::value_type* MSG_HTTP400; - -extern const uniString::utf8::value_type* MSG_HTTP403; - -extern const uniString::utf8::value_type* MSG_HTTP404; -extern const int MSG_HTTP404_LEN; - -extern const uniString::utf8::value_type* MSG_HTTP405; - -extern const uniString::utf8::value_type* MSG_HTTP503; -extern const int MSG_HTTP503_LEN; - -extern uniString::utf8 g_userAgentBase; // user agent for sc_serv2 -extern uniString::utf8 g_userAgent; // user agent for sc_serv2 - -extern time_t g_upTime; -const uniString::utf8 timeString(const time_t t, const bool slim = false) throw(); - -const bool isUserAgentRelay(const uniString::utf8 &user_agent) throw(); -const bool isUserAgentOfficial(const uniString::utf8 &user_agent) throw(); - -const uniString::utf8 redirect(const uniString::utf8 &url, bool compress) throw(); -const uniString::utf8 urlLink(const uniString::utf8 &url, const uniString::utf8 &text = "", const bool embed = false) throw(); - -const uniString::utf8 http302(const uniString::utf8 &url) throw(); - -const uniString::utf8 addWBR(const uniString::utf8 &str) throw(); - -uniString::utf8 getfooterStr(); -uniString::utf8 getHTML5Remover(); -uniString::utf8 getIEFlexFix(); -uniString::utf8 getStreamListeners(const size_t sid, const bool nowrap, const int fh); - -extern uniString::utf8 g_IPAddressForClients; // address clients will connect to -extern u_short g_portForClients; // port clients will connect to, generally portBase -extern int g_legacyPort; // port legacy v1 sources will connect to, or not - -const bool reloadConfig(int force); -void reloadBanLists(); -void reloadRipLists(); -void reloadAdminAccessList(); -void reloadAgentLists(); -void rotatew3cFiles(uniString::utf8 files); - -const uniString::utf8 loadLocalFile(uniFile::filenameType fn, const uniString::utf8& logPrefix = "", const size_t sizeLimit = 0); - -const uniString::utf8 escapeJSON(const uniString::utf8 &s) throw(); - -// creates GZIP (RFC 1952) encoded output as -// either one go or in blocks for logs, etc -#include -const bool compressData(uniString::utf8 &body); -const bool compressDataStart(uniString::utf8 &body, z_stream *stream, Bytef* name = (Bytef*)"sc_serv.log\0", bool local = true); -const int compressDataCont(uniString::utf8 &body, z_stream *stream); -void compressDataFinish(uniString::utf8 &body, z_stream *stream); -const bool compressDataEnd(z_stream *stream); - - -// used for getting and setting modified dates on relevant http responses -// set use = 0 for current time, otherwise pass in a time_t as needed -const uniString::utf8 getRFCDate(const time_t use); -const time_t readRFCDate(const uniString::utf8& str); -#ifdef _WIN32 -char *strptime(const char *buf, const char *format, struct tm *timeptr); -#endif -const uniString::utf8 getStreamPath(const size_t sid, const bool for_public = false); - -const bool isCDNMaster(size_t sid); -const bool isCDNSlave(size_t sid); - -#ifndef _WIN32 -#define localtime_s(x,y) localtime_r(y,x) -#else -#define snprintf _snprintf -#endif - -// return system error string -const uniString::utf8 errMessage() throw(); - -const uniString::utf8 bob(); - -void printUpdateMessage(); - -extern uniString::utf8 listenerId; -const uniString::utf8 randomId(uniString::utf8 &temp); - -const uniString::utf8 getCurrentSong(uniString::utf8 currentSong); -const uniString::utf8 stripHTTPprefix(const uniString::utf8& addr); - -const bool isAddress(const uniString::utf8& addr); - -const bool extractPassword(uniString::utf8 &dj_password, uniString::utf8 &dj_name, int &streamID); - -typedef std::map httpHeaderMap_t; -const int getStreamBitrate(const httpHeaderMap_t &headers); -const int getStreamSamplerate(const httpHeaderMap_t &headers); -const int getHTTPRequestDetails(const std::string &firstLine, std::string &request, - std::string &url, std::string &protocolAndVersion); -const uniString::utf8 fixMimeType(const uniString::utf8& mimeType); - -const uniString::utf8 sampleRateStr(const int sr); - -const int detectAutoDumpTimeout(time_t &cur_time, const time_t lastActivityTime, - const uniString::utf8& msg, const bool debug, - const size_t streamID = DEFAULT_SOURCE_STREAM) throw(std::runtime_error); - -const __uint64 time_now_ms(); - -const bool isRemoteAddress(const uniString::utf8 &addr); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/icy.ico b/Src/Plugins/DSP/sc_serv3/icy.ico deleted file mode 100644 index ba0bb6d7357c6a3e63b140fb8ce7409ba33fa047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40585 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 diff --git a/Src/Plugins/DSP/sc_serv3/libcurl_building.txt b/Src/Plugins/DSP/sc_serv3/libcurl_building.txt deleted file mode 100644 index 2cd06c23..00000000 --- a/Src/Plugins/DSP/sc_serv3/libcurl_building.txt +++ /dev/null @@ -1,43 +0,0 @@ ------------------------------------------------------------------------------------------------------- - -OpenSSL -------- -Linux / BSD / Mac OS X / Raspbian - -./config no-ssl2 no-ssl3 no-unit-test no-shared - - -Windows - -Note: Use "Visual Studio 2008 Command Prompt" -build-openssl.bat build x86 static release -build-openssl.bat build x86 static debug - -Note: Use "Visual Studio 2008 x64 Win64 Command Prompt" -build-openssl.bat build x64 static release -build-openssl.bat build x64 static debug - -The generated lib files are created in build\openssl-x[86|64]-static-[release|debug]-vs2008\lib - ------------------------------------------------------------------------------------------------------- - -libcurl -------- -Need to ensure that --with-ssl is set to the correct version of openssl being used otherwise we'll have inconsistencies in the generated libraries :o( -(and not to use my folder path) - -Linux / BSD (SSL) - change the openssl path as needed - -./configure --with-ssl=/home/dro/Desktop/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-smb --disable-dependency-tracking - - -Mac OS X (SSL) - change the openssl path as needed - -./configure --with-ssl=/Users/dro/Desktop/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-ldap --disable-ldaps --disable-smb --disable-dependency-tracking - - -Raspbian (SSL) - change the openssl path as needed - -./configure --with-ssl=/home/pi/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-ldap --disable-rtmp --disable-scp --disable-sftp --without-libssh2 --without-librtmp --disable-smb --disable-dependency-tracking - -Note: may also need to do 'apt-get install libcurl4-openssl-dev' first so that libcurl will see that there's a valid OpenSSL setup, otherwise HTTPS support will not build. diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a deleted file mode 100644 index 6ca029f7b8aab8ef6c5cd0619048249a1fcdaf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476516 zcmeFae|%I|o&SID{D8?Y)(ZrU5%p41O*OWIMMW3aP|^x6tplVj)vTRBLcxY)8iJ*6 zbq5F}rD1m{&{7NSRN4Kq%G%VeyIsFlhZb$EUB%kgTC2{F+(J`oQLCa>`95D~?uCHV zb=}A3`}qFx&Es)$?ma)>=l$!v&-rb-eoKPI)1);>fekDX3n}`#;jS%_qcA- zWR3mry6>3r?srvdq~n%lEwrrIf&V{%gV4^Q|8W?1P0S)Jxn#jrsrKI0oxO`XS9kVV zdSBexcTxAUo{p8>SDW{0{>8nWonv0-_I9@SbzXJJC4ZE5>Eb_1G6@&0?d$CAZtuFN zyKiOR_0>kJt(fe~R(Dp@=B%FA-rdpF**mAV+CMoL_w;tIyt=!kwZ)VL!bP2ZYkIpc zUEJEcGShVuaLV?!wD+|K#V%}LU4{Asoqc1U7iT(`tz5pcvtv$QU+>DLYx+9p_N?iy zj-R6QPo~fB?&w?_G-`J|Dm!b#Y&NZ{L}-F6!<$bH>~i?Y-^Gz=)tdt-Vxl z&$7g(z(2SP1orI zKQ;BDwHXK(Af=^eS>N@U&X&$)U8jL=AbI6%0D0xi%eph-){ZI@ouTndd-~dit}|t| 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

RsQA|A-%KTqc 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 z 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

VE$C! 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 J?LqfO|1YmbvOxd< diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a deleted file mode 100644 index 91505b28a112883e5e183630eb9dc5af55abce17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512028 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

e&h^vzUl#X&CwvmzzOFq?^h?;o$Ogvk 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%0Dq@sEszeF1MpW#hpu^wSQ`RLAof-2MA~Z(5L>1z zn3khLKpDh14v0DyYtdAIC0cC6NNddj_+zU>r-GKvA)o=ofQIDcfq=FUPzEuz?&wQfY7P)v zrc*)7b}dW=!E0QOQ}KogGL4d{z_wD0c0WL`C*?-#*0cV-qkq4A?oBE zi>3|mS7AE62YrHA1Ov?q>dXpenH98}74R2cnF|E+?+W=F0EwCXhR(E$hS-HU=w(<) z(f~+r4kXK-oNbVOPsm;ZF9opykX{$&X)mSNi>zrErPzh6Y5wFAko-GC(lW55Q$Y8S zzYNHxtNb)+nWR=}ay_3ZJHP$aU}4bh!BN~hi;-quif z5xi!tp{_MASf|DI8KfQN0Q|k2Ibs2{><9rR5L=cyk+zxx#FpuCg_g@hKpDhL8XuU$cUKW(7Rps8}${tf0xPV7ggB zvsppAS>ssfbzm?x08-dafHdA5fGp-fvLwmgL6TgEErDu})d!f8>dXN~B@U!|a{%&@ zJzYtp+@nS3Gav?}D~W(UYQ{>Uo2f2O7m3CmUk4SNlTBx_fN<+A1|Qlt;W4J%nT<)i zC&s&Pj}h7ZBj(Uf5#5>n18?t8P_1tA~l%<@EdOCK;qd# zZ6%;RaUgY?1Mo+c)*?_hBWe;q1JNA>mqfEE=8`kst91&j=05!hF@C+`uo*&o_80D>7%LucBoAvQBd91tyY zA#VvB8^i`+9bcVhD8&r=Kq}jOU+B0Dtj$%RU&vGjR%~*|Jd-h|c})Ww=wS`Adv%(m zA)CZn7Nd!tH-8A=_fKy0Z;Po(WM2Z$}x6-=KUA)pLm zK)Qkn*r0_in{2yXj$OZD51B^En;N#G4v0FcPYIh9;BRql#7On#0Q>>%p;JN2?jfKA zV#`t|(kOF)*fO08S{~4%w+;{k(y4gE3~yK*IhTbRieR}Gs~%~CIl#umfwb8iV0+?- z^H0k8A)o=olntFoglFD9h;0w15{R*-5WChKV51i5(sidKOH#^q*e0{43B)AjkYt59 zKul5&Nj8}SkdN%?#5T#YR14b}`PRD}d&eGM_>Wj>HsFY5WCOg1WP>Cty=5i~(-Bum z%)>YihBigOpDp{QD5;+o9TNe6qwEfEO3S^WWeLQV+7uPqC$ubq*fQNlX}L4BEQ1)3 zPURbBAmFIQk+Ut-Pz3E-ta_v+<^W3*2hvJ&fYpg3&eSkjW`%$fh$;2vE^V1PKx~fGArOmJY@xqW(8Bt3YyId z_@Ph5f;O`P{)Svuu*$4pwOPR$vjYBxT(Q}@*M@1g5_of9cGO)PA&a{sR0bsQphblsS|;|nf``O zq)}S54T7;+LKFhESQL__Z^)+K7^bHL@E*EC>3>5AD1#V~u22G|s~IbW0WNi!VG*5O zSs8zO#-FS#{LGA279d2E30{AK=wnw1EP~xy7(uZUX^%O;-o$})&>Vn2@wXOnQaWVa z9s)`rrYwb&`^*7i%XIUn<;D(@MQaa?4`LbAn-vtz3YyIdW|r zMYj7MA)pLmK)U`aWgV-9^+z{tE;A~kv-?M1>HV}ER$mN0v~R*miB<2Lk`C{l81KG4 zMyShVMaLXk(b1h*=Xeiar3AkI3ZaH=TC^E}?OG_X*om~$9AH=CK-y~#a3FESNnS3? z<`7TJub&$ z*GNBNvDttl)|3tK9+LG$R(i{<98BAS=`|A_^HBR@{oRJv1mLHKwPk^2W(6zE3f7tx z@ckKz1>4LDc9<3HG%K*5S4++j=yg@_Hh>N-;k^ifd~6I2ok-R&**j^NlUe-&yoYY@ z1RT_&>k|+I(p5viay4VstPt0^OlR9&rg&Or_q&Y0J>yR%AOAKjY|_I2(=^b>{NAAr zXwzc50n$=)0KN*u97udQpn3s(?}s_!`Xpt02q=Nrveb#R#vCBFOm_oX?$e@~12G_- zIRcibDYHVhbuP!Q->`>FqxNj0qYj8V4rf= zRN{!m(AU1uR|&+vG)D^U5n7f2iEOh&>T3=#Dsf~}?hGl*fJC&^tRiXAbc0xaxf7|E zIRHIa3#5ML0HYE|wyy)~By6_w_SS+-!+|cx*d2;H@=!g3fFl>43Gm+9vsrWMDRTrO z&ym-kH)0&kp-mCY(qfx5(h73`zM{n(u{T;ag@6)>ElZt9OU(gd%XC|(<@gX#1~DMr z)(M!dh3O;Pa+hP*Z`eboQ8GK&jyfRf*sMjHG}xlWMvS!A9N<9Wi1pBNLkK8=*s|1# zwA&mYwoIpjmTN*l8N`5eDhSx5g{dIh9+zX+Z`eboQ8E?SjyfRf7@@CT(NutuT5Kwi z#+n0+PaH^1<^WR@2U4p!z~aOaM?hZ#LqG}81AUb`k?PF>NMsJA>E-~76Gt{>uMkiM zB%)q-Jw~*jKuOD1VqdtROmSbeV>;T#j}1kbcCWW&@5` zcs9U$OV%b?={d98V>;sci+LEw>d>YL)@ZR6jI_-hU}xgUwpV(W7lukL#9zOJJ^moAnNF?FWAwx4*F=ZsX*#$4$v=g zAdN5w7@0Vb>dgVBCXP4)`syA6N`M}0lSUe74nQJvAdNByn3_1UDfcU_-pK%oXsKt# zBvosX1H|(6gu1jka{zj<7D!{w0j4I7Y+t=(Wd)Ibn9DRA?{bXY_j*Ik1{|^QY=HNc ztWC1gb7ot|bj0-+^DvH8p-mC24Pql$XI8M@tYC{-!B(>ZzWG?22smg~z_&@r3hXzC z8xQZbA@<5FH+0hR_K=|gki{H93i%qkcs_F+p0X5E>d6%HZ3y{Fz)HRf>@q7Lw_?*S zO0f%Bv-y{Wz%p1H#3^8-S;1Dbf^B96Huxzq(^8ozQ5OoCF0J!$XYir!> zrcp8#*p50N>KLg-QvvFO*a(Vd1&w9}O=bmrahJ9)&|y}v#;jniS%LjTd2-lDdu@ol zGS3a2bUZaQYXIan2huWg0MeTS$+9OG@M-o^HhU>#pB|Ewz2^GSx3n&209uTV#}aj3q_SfN3+ZUtfNx4BYlh{#|n!9q_)O!g_C`?7B-03IdXjU zlaKLf)!|-iBCs-(*-ir+VxH^)L=7-kp{Mw#OiMej8)*r$a)i=9Zl^?hJ!2Kc%(bHs_D`>Fqh$4BJL-U_W0MxGNU$x4jbOW3!49*6 zJ!S=a%?b{f74QQJ+JZpeAQl1N;+EO2(q0>4ugr5pCmrt($r=Dz%z?yj3TP(*?>s3>~ie-4SUEmN+t~3Q3pgF`?Y9a0SC0$h>@zRg98lIa_Cgha*r0Rau8dVI+1#X zmL(8drc*)7ouOqJ#DH`v2-v5EsUTY)r9qCbH|!zPD47auM;#D#OxL2R0L@x##7N7{ z0Xh;#&R?_~uSMG;h%FmBkqFOhq{P+-QwhXa{Z+QKCFTIJmvq`_IV=Q}K@3Qzjex0I zm@2X@b2;a)H|!zPD48~F%e81$KAOw*wOduh*Y3PL3W(oj6zzPc&2laA3vHsEFHqqdTt;=(ylROrzB(l* zy-o|h_~M&6_!5x#wH(pT_df8&67fqPqJ5bD>b6NsyB7Y~JiaRRZ2Lehv$XJ+6!8_G zh>wrMzmdJKKHeLzrJaxYw8Yoz*||htt0i8&$9T@m>$R-W!kK7%@qWpheS9m8cGglq zEpZh^JKq3O5&r(TBL9CUo{-DyC7+gj>+I`P=bY9B^IBVK_3Ma1(GLOE&O&Z!pFg8* zT1$Id%YwNxTFn-NLx5ICSn-9W`FzhowO15QtQe^8OROziUpsiv;KB*DmG2VkkXx|~ z)l!4@;BmE|7(8fv;n`chp>{V^excB_wlFV*RGy`P{seuhlAyxwTP6lup`)_4u(7?e znihq#E5_#w-D?Xs*B0JAvA%K?4bCLNfWqoyC(`b_?Gw%XwPR}w&$v=&rq2~Bn+6ZM zyYR2VV}#zdcw*r#wV|?^6ALHT{(M(I`t#7{32U=MZF<)BAACh&fsJQy;qi)zg4+^HH!+I! zQ7FtwY=s^n{`a{s&HuS$V&T+@g+<}tf!xGG=bg2Mow>Vu6}H|ov1j3%mEX8~&=Ael z)3?+rX!vD=2VGD&@2;M818+pSr*fjX58P7w{%G8PtQ+rdm$C5Tv7X}N?X`tlCTc)R zGB5lr=81*lYYVqd99DQL=KY$w{Y&opnEJnC>MtnQ(-onPNriuP z@eY^VrVh24+-O_QU%G@LK5*MaZIgvXwPt;>OKstkxBWb(+z}gp_O{x>8Fy(;3t#UN zR`*kCr+V6%_QCa?a(qcm|K0u#ru)Q-#(d$GW3DfJVA1u3o31Z(t1ZmAUh||4dj9pZ zt|%Noamawe^y_;ncF2UnhGQnGuGs@aVI+Mj=Ouql)4fRB!WD%xzY$A1$9?atEwuPl z*A1Ff80O{)wS}s?dft1*pnJ6{ZTjcfv~9WVG39uV${jeg@ZC7DCpEC8nybP$E8@z$ zJzbd(EpGptgpZ3BlhOr^}Quv^6av!-PgkI2#ech%-YfDjsi~6sy)5E@e$74MU z+w$JmH||LK(z+R3_(ncV?)SCbrISnZFY9-Mf2jc!)^zcvzfmu*5nEclFkWii{{cM6{B2a6Be_C6h_`|;RjCvAMoUKx#l42d3y ziT-tXqQVenJ?sxpRe1Mb(+vObZJP7l$9M&67adkX;q=GCq2kG7!jx>$PI$5o6`IdN zn;jksUp=O_u#N458PcJ``+4*j@8|c6(vt6u##b>8svTVTSJ#mEu3IN^%v@B<;jMq+ zpI!e}SamD8d`tOtSI@Tk*4n~~JCnV8OHBB6)&7!x+>Rsg4$Jw3a=y0M|L$5__{yz^ z6}vvB|Iw{!v7OQQ8#msqE&QQqd`X3LEM|7DDEzfj?=Bp!SLonzigvHsLU%Sgy>XPn z8%^PNm9?MlIb_hly1|3zvcnCoI7aVwEv+qcTIRM5&*{I}ZHtCDFK`ZZ4s*u13thj+ zIl_5yuIbA9X{E{anrT;!uAee4wT^CVte;SBoHl9lq;a{M<~Pr1YbnlK zIJ<53yt%pA3yU{h*E)OVgyuuyOA{`g(l~C~q|sMq@{E~0sZl*l8&^N>N-=Fv99+YG80l1RhSs7aF>M>kHG zJju#_?GVRIzOq<9t}#>HxKe3yDL137t#$UowjoitAPPgHFf0ngqi|sqE{ej4C|sPI zId5)rxn*WsT_O!hqzlq&RZp0c=6N&Q7R_%Np5qK=+T3|_TXI)iJ#E6}lO~tO<>qP{ z>RaaC&^8NWam?7!jiYl5XU>>Aw`IY?G*?_-KF>#A3)71AQ_7(aO~?fO5W_;vX-lqk z-rO6iXU}cJ6Sj&8eg0!u4ztdQT5Ne zp-ip`b7!|5Qk-ubjn@=?iz7Fq9IJI-&JCV5Z%)hL`LhQvoH=b_%YvJS4xTZuRi|l# z!|7X^$tGo5dEA)BoX-0O$1}N^m<>trDJxQ2sUBxMv)=wCt+LIBay(TjJTH5?IJ7nXyrbgcb*fHkLTQFxv>+D-wnyH~Qu3^fA(vb!~ zrhalcv%$wXDPL1=9CsxnXbme=IYv*qCbw|byajF5hZO1up1Pb1I`Y_|=z_3mUOA&} z=B$>5qZiJcJv(}a+4eC`zqjqNIt*E(i*gH9{h_<|gh`Xem8KnbJV>Vf5KlO|EPT)G z`Q>!(E-y`YFl>FG~+pP_~c^dkd%qmj26=t@gT+&CApJ5jU%LfmVI9H?726v zGVFkwn>Ax@b8E|jv_Z1@q?4Z{OMHhOJ*}d$*6z4TW7LaZ#n?t%ms_ay&ynK@JKs1D zwPR^ogcYabV?0oDv{uo!EytsDQSS_sFP~Ockd8op#H~xSq+6-&VOKUzzGB>@BvPA( zw;6h*HsdBuxzgWn=7&SZ1v)y;nWJ|WKN8kOVMr7%h{Dh)9CFmx8c3$n=4^6N^=Mpi zpt+f|W-KVRTtDfiIoD~WG`Gxb9n(5*VK~xG^7302ESR@|Mj9S(emUm$&|_@&FlL8h zh1>en7+PmBK=Nj-$ys!IeQZhTX=x}SMt2ol8Sza^oe)MeB zyQcSBoLrv3J7C%*?(&CjS;=;gow~T4kGrzicnuTbZPR2)guR_lJ7oWPt&@F-Y1d%v z>f5&4G~4ClwC9hmk7of#tniRytxb8dst=nDf43S^mzy(t?xl;`S{4>t7L1{U*K6ZD z>k-_^3bO;TZK--&2wUusG+~_ILkgWRX-xf;v6-zhMorM^P-&9JT%K}id0b=e@<~&w z$5aoi9Z`Eh^`JR37R;P=$&3YaZoW{;^{w+}v<;eZ-Rw&=fMyKyZ@T2>>*q^qYh5^~ zdG?G}onu^b!`z#y2i;ITXtEM4Y->ip_~Pn8*SECKY?;rQQf3P-PRQv%GI{KTNtdSs z2ydIO|Hc#FTV6jRIT9Xn<~PC4EsoO6PCV12Ve4#dCNo;g@#IDuplyjaw6u+GYs-vd z!XzDhTO4W{_LSzhV(a6 zZgidQWzA^Oy3Xa#li2mb+%d;g=8wxCUvWy8Uink=rxkkVPtTuGQB~-Ze@n&L`5fO9 z^&h?T8ySmF?0!P7m-P7J``pK#Sh=*~p?t2l8?p5b_8v>S+*7zW>*Gt!E47S0G4)k@ zJHDIxpyW$WtiHQ)>9O}5b8pxCx-2W)pKZ_m&4I6zo3F~HeKvQjmG3Q`o~e~F@#32@ z*T^3A<+{HqQ=;=Nh^-ktr*9;in$f4eM(3;4mS+5XiPx5lo;%?+?WH%#ALov*2ih(@ zJBC;r_gJ%i^TjBu6dT7FzE?wIx%9*?ONC?%d?iG+^gdd6@tq9Y#IYy#zWbP^UGM2~ zZ{a@XIQGLA2xR-=&+KO@KKh$Z(QVI+&Yw6pXLSBvw>6{lx1l{UbIhL>?#=l5Q@Ct= zrS1V|=a75CSwDXcvOm+FKXPEsx@+OZp9EyvkJ7`o+41mnbXMnK+-y8glxF=re~CY? zqp7<0O#eq(N5wvew&f`#a>aF2sr%9!LtEQtV$IyIZk9djJW)Wq*e4%hzh0kh`oxde z*p`nKv--elJ&_=Ptf51C7p;%D-^O-)3eq=|XN&Yc(sQ*77tLv#ah=$?C?sVy>2xJ)QI9YIT;_Qmc1By>HE!`5voL z7vl?NUw4zd7Mz+X`376`q*FTvli{c z+Pp%0;yCu4>$*Pb39nvfyWpTNUIVlc|3-0jilL1TyW#bE`Q9O~;^yC#iL)O+F+&{3 z+oWd4(e_6@39E*TgE@%fm?Syd@1}D!FS5l~%r{YnY`(rP+8mLO@x^@aluW+(>gcOu z`bAMoeOJkp&DX4amD+#E$H!MO-}RES`3_#I<4ByOjIS*tOU!M1xAI+yWUrXxZmChm zv*U?et{TB#(RZixY<;cA<#ReDhx)WRB=vnja%>|pw_o{|WDHSU^P0G}&�qyZDN6 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 diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a deleted file mode 100644 index 7994b76c86ebbfeb40347e115034b70e40d1bd2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396228 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 K|2Y=P@Bal;8knB| diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a deleted file mode 100644 index 5b0037760bdee327f45bc5ff65d760cacae89cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513008 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 z 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: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 XP!w;3tw=3(F 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ⅅz(wpfJQVa`Pu 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 z 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

h)zTl+ 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 diff --git a/Src/Plugins/DSP/sc_serv3/main.cpp b/Src/Plugins/DSP/sc_serv3/main.cpp deleted file mode 100644 index 3b167b49..00000000 --- a/Src/Plugins/DSP/sc_serv3/main.cpp +++ /dev/null @@ -1,1213 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include -#include -#else -#include -#include -#endif -#include -#include -#include -#include -#include "services/stdServiceImpl.h" -#include "file/fileUtils.h" -#include "global.h" -#include "threadedRunner.h" -#include "protocol_relay.h" -#include "w3cLog.h" -#include "yp2.h" -#include "updater.h" -#include "auth.h" -#include "streamData.h" -#include "adminList.h" -#include "banList.h" -#include "ripList.h" -#include "agentList.h" -#include "cpucount.h" -#include "stats.h" -#include "bandwidth.h" -#include "cache.h" - -#ifdef _WIN32 -#define _WSPIAPI_H_ -#endif -//#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[MAIN] " - -#ifdef _WIN32 -#include -static void win32SocketSetup() throw(runtime_error) -{ - WSADATA wsaData = {0}; - WORD wVersionRequested = MAKEWORD( 2, 2 ); - int err = WSAStartup(wVersionRequested, &wsaData); - if (err != 0) - { - throw runtime_error("Could not find usable Winsock DLL"); - } - - /* Confirm that the WinSock DLL supports 2.2.*/ - /* Note that if the DLL supports versions greater */ - /* than 2.2 in addition to 2.2, it will still return */ - /* 2.2 in wVersion since that is the version we */ - /* requested. */ - - if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) - { - /* Tell the user that we could not find a usable */ - /* WinSock DLL. */ - WSACleanup(); - throw runtime_error("Could not find appropriate winsock dll version"); - } - /* The WinSock DLL is acceptable. Proceed. */ - - // if we can detect WSAPoll(..) then we'll use that over - // select which means Vista+ should be similar to Linux. - HINSTANCE ws2_32 = GetModuleHandle(TEXT("WS2_32.DLL")); - if (ws2_32 != NULL) - { - typedef INT (WSAAPI *LPFN_WSAPOLL)(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout); - extern LPFN_WSAPOLL fnWSAPoll; - fnWSAPoll = (LPFN_WSAPOLL)GetProcAddress(ws2_32, "WSAPoll"); - } -} - -static void win32SocketCleanup() throw() -{ - WSACleanup(); -} -#else -int _kbhit(void) -{ - struct termios oldt, newt; - tcgetattr(STDIN_FILENO, &oldt); - newt = oldt; - newt.c_lflag &= ~(ICANON | ECHO); - tcsetattr(STDIN_FILENO, TCSANOW, &newt); - int oldf = fcntl(STDIN_FILENO, F_GETFL, 0); - fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); - - int ch = getchar(); - tcsetattr(STDIN_FILENO, TCSANOW, &oldt); - fcntl(STDIN_FILENO, F_SETFL, oldf); - - return (ch != EOF); -} -#endif - -void scheduleRelay(const config::streamConfig &info) throw() -{ - // only attempt to run if not indicated as having moved - if(gOptions.stream_movedUrl(info.m_streamID).empty()) - { - threadedRunner::scheduleRunnable(new protocol_relay(info)); - } -} - -utf8 getLogFile(utf8 fileName) -{ -#ifdef _WIN32 - // this will fill in the default log path as required - wchar_t s_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, s_defaultFileName, MAX_PATH); - utf8 m_defaultFilename(utf32(s_defaultFileName).toUtf8()), m_fileName = fileName; - - HANDLE m_file = ::CreateFileW(m_fileName.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - m_file = ::CreateFileW(m_defaultFilename.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - uniFile::filenameType fallbackFilename("%temp%\\sc_serv_" + tos(getpid()) + ".log"); - wchar_t s_fallbackFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(fallbackFilename.toWString().c_str(), s_fallbackFileName, MAX_PATH); - utf8 m_fallbackFilename(utf32(s_fallbackFileName).toUtf8()); - - m_file = ::CreateFileW(m_fallbackFilename.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file != INVALID_HANDLE_VALUE) - { - forgetHandleInvalid(m_file); - } - else - { - m_fileName = m_fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } -#else - utf8 m_defaultFilename = gOptions.logFile_Default(), m_fileName = fileName; - - int m_file = ::open(m_fileName.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - m_file = ::open(m_defaultFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - uniFile::filenameType fallbackFilename("/tmp/sc_serv_" + tos(getpid()) + ".log"); - m_file = ::open(fallbackFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } -#endif - return m_fileName; -} - -// event triggers for main loop -static vector s_ControlEvents; - -class sc_serv2_service -{ - // log messages that have been stuffed in config objects deferred list. - // this only need be called at startup, to display messages that were created during - // system initialization, but could not be displayed because the loggers didn't yet exist. - static void logDeferredMessages() - { - const vector &deferred_error_log_messages(gOptions.deferredErrorLogMessages()); - for (vector::const_iterator i = deferred_error_log_messages.begin(); i != deferred_error_log_messages.end(); ++i) - { - ELOG((*i).hideAsString()); - } - - const vector &deferred_warn_log_messages(gOptions.deferredWarnLogMessages()); - for (vector::const_iterator i = deferred_warn_log_messages.begin(); i != deferred_warn_log_messages.end(); ++i) - { - WLOG((*i).hideAsString()); - } - - gOptions.clearDeferredErrorLogMessages(); - gOptions.clearDeferredWarnLogMessages(); - } - -public: - static void addCustomLogElements() {} - sc_serv2_service() {} - - // main application loop - static int go(stdServiceBase &base) throw() - { - g_upTime = ::time(NULL); - g_userAgent = g_userAgentBase + gOptions.getVersionBuildStrings(); - #ifdef _WIN32 - bool win32_socket_cleanup_required(false); - #endif - int mainResult = 0; // result of main loop - utf8 pidFn; - vector runners; - - try - { -runserver: -#ifdef CONFIG_BUILDER - bool builderMode = (gOptions.confFile() == "builder" || gOptions.confFile() == "-b"); - bool setupMode = (gOptions.confFile() == "setup" || gOptions.confFile() == "-s" || builderMode); -#else - bool setupMode = (gOptions.confFile() == "setup" || gOptions.confFile() == "-s"); -#endif - bool gotConfig = (!gOptions.confFile().empty() && uniFile::fileExists(gOptions.confFile())); - // look for sc_serv.conf or sc_serv.ini to emulate v1 DNAS behaviour as - // too many people cannot get on with having to specify a config file :( - if (gotConfig == false && setupMode == false) - { - utf8 currentLogFile = gOptions.logFile(); - - #ifdef _WIN32 - vector fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_serv.ini", L"", true, true); - vector fileListConf = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_serv.conf", L"", true, true); - #else - vector fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.ini", ""); - vector fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.conf", ""); - #endif - - if (!fileList.empty()) - { - fileList.insert(fileList.end(), fileListConf.begin(),fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - #ifdef _WIN32 - utf32 u32file(fileList[0]); - utf8 u8f(u32file.toUtf8()); - gotConfig = gOptions.load(u8f); - #else - gotConfig = gOptions.load(fileList[0]); - #endif - } - - // if these do not match then we need to update the log file being used - // as otherwise it reports the wrong thing on the admin pages, etc - if (gOptions.logFile() != currentLogFile) - { - base.startNormalLog(false); - } - } - - if (isPostSetup() == false) - { - if (gOptions.screenLog()) - { - base.startScreenLog(); - } - // during initial startup some messages are produced but cannot be logged because - // the loggers do not yet exist. These are in the deferred list. At this point they - // can be safely logged - logDeferredMessages(); - - gOptions.m_certPath = fileUtil::getFullFilePath(gStartupDirectory + "cacert.pem"); - if (!uniFile::fileExists(gOptions.m_certPath)) - { - WLOG(LOGNAME "Cannot find `" + gOptions.m_certPath + "'"); - WLOG(LOGNAME "Without `cacert.pem' the DNAS may not be able to contact the Directory"); - WLOG(LOGNAME "The latest can be downloaded from `http://curl.haxx.se/ca/cacert.pem'" + eol()); - } - - #ifdef _WIN32 - ILOG("*********************" + - string(!sDaemon ? "***************************" : "<>") + - "*********************"); - #else - ILOG("*********************" + - string(!sDaemon ? "***************************" : "<>") + - "*********************"); - #endif - ILOG("** Shoutcast Distributed Network Audio Server (DNAS) **"); - ILOG("** Copyright (C) 2014-2023 Radionomy SA, All Rights Reserved **"); - if (gotConfig == false && setupMode == false) - { - ILOG("** Use \"sc_serv [filename]\" to specify a config file **"); - } - ILOG("*********************************************************************"); - utf8 version = gOptions.getVersionBuildStrings(); -#if defined(_DEBUG) || defined(DEBUG) - version += "[DBUG]"; -#endif - ILOG(LOGNAME "Shoutcast DNAS/" SERV_OSNAME " v" + version + " (" __DATE__ ")"); - ILOG(LOGNAME "PID: " + tos(getpid())); - } - if (gotConfig) - { - ILOG(LOGNAME "Saving log output to `" + fileUtil::getFullFilePath(gOptions.realLogFile()) + "'"); - ILOG(LOGNAME "Automatic log rotation " + (!gOptions.rotateInterval() ? utf8("disabled") : utf8("interval: ") + timeString(gOptions.rotateInterval()))); - ILOG(LOGNAME "Loaded config from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - } - else - { - uniFile::filenameType oldLogFile = gOptions.logFile(); - // if we get to this state then to make things easier, we attempt to offer - // some possible configuration files to attempt to load as the config file - int mode = (setupMode ? 2 : gOptions.promptConfigFile()); - if (mode <= 0) - { - if (mode == -1) - { - ELOG(LOGNAME "Aborting as no valid config files could be found."); - throwEx(LOGNAME "Try running setup mode to create a valid config file."); - } - else if (mode == -2) - { - throwEx(LOGNAME "Aborting at user request."); - } - else - { - if (!gOptions.confFile().empty() && !uniFile::fileExists(gOptions.confFile())) - { - throwEx(LOGNAME "Passed config file does not exist (check the file path exists)"); - } - else - { - throwEx(LOGNAME "No config file passed"); - } - } - } - else if (mode == 1) - { - // if these do not match then we need to update the log file being used - utf8 newLogFile = getLogFile(gOptions.logFile()); - if (newLogFile != oldLogFile) - { - uniString::utf8 file = newLogFile.substr(0,gOptions.logFile().rfind(fileUtil::getFilePathDelimiter())).c_str(); - if ((file == newLogFile) || fileUtil::directoryExists(fileUtil::onlyPath(newLogFile))) - { - #ifdef _WIN32 - // see if we can create the file, if not then just keep using the temp folder for the log file as we know it's ok - HANDLE m_file = ::CreateFileW(newLogFile.toWString().c_str(),GENERIC_WRITE, - FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file != INVALID_HANDLE_VALUE) - { - gOptions.setOption(utf8("reallogfile"), newLogFile); - forgetHandleInvalid(m_file); - base.startNormalLog(true); - } - // make sure it's showing the correct log file - else - { - // this will fill in the default log path as required - wchar_t m_fileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_fileName, MAX_PATH); - utf8 log(utf32(m_fileName).toUtf8()); - gOptions.setOption(utf8("logfile"), log); - gOptions.setOption(utf8("reallogfile"), log); - ILOG(LOGNAME "Logger keeping log file as `" + fileUtil::getFullFilePath(log) + "'"); - ILOG(LOGNAME "Check you have write permissions for the folder(s) set in the config file."); - } - #else - // see if we can create the file, if not then just keep using the temp folder for the log file as we know it's ok - int m_file = ::open(newLogFile.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file != -1) - { - ::close(m_file); - gOptions.setOption(utf8("reallogfile"), newLogFile); - base.startNormalLog(true); - } - // make sure it's showing the correct log file - else - { - // this will fill in the default log path as required - utf8 log(DEFAULT_LOG); - gOptions.setOption(utf8("logfile"), log); - gOptions.setOption(utf8("reallogfile"), log); - ILOG(LOGNAME "Logger keeping log file as `" + fileUtil::getFullFilePath(log) + "'"); - ILOG(LOGNAME "Check you have write permissions for the folder(s) set in the config file."); - } - #endif - } - else - { - throwEx(LOGNAME "Log file path does not exist (check the folder path exists)"); - } - } - - ILOG(LOGNAME "Saving log output to `" + fileUtil::getFullFilePath(gOptions.realLogFile()) + "'"); - ILOG(LOGNAME "Automatic log rotation " + (!gOptions.rotateInterval() ? utf8("disabled") : - utf8("interval: ") + timeString(gOptions.rotateInterval()))); - ILOG(LOGNAME "Loaded config from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - } - else if (mode == 2) - { - if (setupMode) - { -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ILOG(LOGNAME "Entering setup mode - Open 127.0.0.1:8000/setup in a"); - ILOG(LOGNAME "browser on the same machine the DNAS was started on"); -#ifdef CONFIG_BUILDER - } - else - { - ILOG(LOGNAME "Entering builder mode - Open 127.0.0.1:8000/builder in"); - ILOG(LOGNAME "a browser on the same machine the DNAS was started on"); - } -#endif - ILOG(LOGNAME "if the browser does not automatically open the page."); - ILOG(LOGNAME "If working remotely then replace 127.0.0.1 with the"); - ILOG(LOGNAME "IP / address of the remote system to use this mode."); - } - - // attempt to open the setup / builder page on the system's browser i.e. kiss option - #ifdef _WIN32 -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ::system("start http://127.0.0.1:8000/setup"); -#ifdef CONFIG_BUILDER - } - else - { - ::system("start http://127.0.0.1:8000/builder"); - } -#endif - #else -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ::system("(if(which xdg-open > /dev/null)then(xdg-open http://127.0.0.1:8000/setup)elif(which gnome-open > /dev/null)then(gnome-open http://127.0.0.1:8000/setup)fi)&>/dev/null"); -#ifdef CONFIG_BUILDER - } - else - { - ::system("(if(which xdg-open > /dev/null)then(xdg-open http://127.0.0.1:8000/builder)elif(which gnome-open > /dev/null)then(gnome-open http://127.0.0.1:8000/builder)fi)&>/dev/null"); - } -#endif - #endif - - #ifdef _WIN32 - win32SocketSetup(); - win32_socket_cleanup_required = true; - #endif - - threadedRunner *tr = new threadedRunner; - runners.push_back(tr); - tr->start(); - - threadedRunner::scheduleRunnable(new microServer("", gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_WEB_SETUP), - microServer::L_MISC)); - - s_ControlEvents.push_back(serviceMain::sStop); - while (!iskilled()) - { - #if defined(_WIN32) && defined(_WIN64) - if (WaitForMultipleObjects((DWORD)s_ControlEvents.size(), &(s_ControlEvents[0]), 0, 1000) == WAIT_OBJECT_0) - #else - if (WaitForMultipleObjects(s_ControlEvents.size(), &(s_ControlEvents[0]), 0, 1000) == WAIT_OBJECT_0) - #endif - { - // stop signal - setkill(1); - break; - } - } - - if (iskilled() == 2) - { - ILOG(LOGNAME "Stopping setup mode. Preparing for broadcasting..."); - } - else - { - ILOG(LOGNAME "Stopping setup mode. Shutting down..."); - } - - for (vector::const_iterator i = runners.begin(); i != runners.end(); ++i) - { - (*i)->stop(); - (*i)->join(); - delete (*i); - } - runners.clear(); - - #ifdef _WIN32 - if (win32_socket_cleanup_required) - { - win32SocketCleanup(); - } - #endif - - s_ControlEvents.clear(); - - // if we get here, we effectively restart the server post-setup - if (iskilled() == 2) - { - #ifdef _WIN32 - gOptions.load(gStartupDirectory + "sc_serv.conf"); - #else - gOptions.load(gStartupDirectory.hideAsString() + "sc_serv.conf"); - #endif - setPostSetup(true); - setkill(0); - goto runserver; - } - setkill(0); - return mainResult; - } - } - - // just make sure that we can do this else we need to abort - if (curl_global_init(CURL_GLOBAL_DEFAULT) != CURLE_OK) - { - throwEx(LOGNAME "Unable to load libcurl & / or its dependencies - cannot continue."); - } - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - // the old sc_serv had two sets of passwords, mimic this - if (gOptions.adminPassword().empty()) - { - WLOG(gOptions.logSectionName() + "A dedicated `adminpassword' should be specified in the configuration."); - WLOG(gOptions.logSectionName() + "Legacy handling has been enabled to map `adminpassword' to `password'."); - WLOG(gOptions.logSectionName() + "This is not deemed safe and `adminpassword' should be directly set."); - gOptions.setOption(utf8("adminpassword"), gOptions.password()); - } - else - { - // otherwise if explicitly set as the same then we abort - if (gOptions.adminPassword() == gOptions.password()) - { - throwEx(gOptions.logSectionName() + "You must specify different passwords for `adminpassword' and `password'."); - } - } - - - // abort no matter what as without passwords we can be at risk - if (gOptions.adminPassword().empty() && gOptions.password().empty()) - { - throwEx(gOptions.logSectionName() + "You must specify a password for `adminpassword' and `password'."); - } - - if (!streams.empty()) - { - if (gOptions.setupPasswords(streams)) - { - // if there was any error on the passwords then we need to abort - // so it can be fixed. important if using multi-stream hosting! - throwEx(gOptions.logSectionName() + "Check the stream configurations above or ensure `adminpassword' and `password' have been set."); - } - } - else - { - // if there are no stream configs and no main password - // then we'll also need to abort as that's not allowed - if (gOptions.password().empty()) - { - throwEx(gOptions.logSectionName() + "You must specify a password for `password'."); - } - } - - - if (!gOptions.cdn().empty()) - { - ILOG(LOGNAME "CDN " + utf8(gOptions.cdn() == "on" ? "opt-in" : "opt-out") + " mode enabled -> ensure all stream(s) are properly configured"); - } - - const int cpu_count = gOptions.getCPUCount(); // check options - ILOG(LOGNAME "Calculated CPU count is " + tos(cpucount()) + " -> " + (cpu_count == cpucount() ? "using " + - utf8(cpu_count > 1 ? "all" : "the") + " available CPU" + (cpu_count > 1 ? "s" : "") : - tos(cpu_count) + " CPU" + (cpu_count > 1 ? "s" : "") + " specified to be used")); -#ifndef _WIN32 - rlimit rlim = {0}; - if(!getrlimit(RLIMIT_NOFILE, &rlim)) - { - ILOG(LOGNAME "Limited to " + tos(rlim.rlim_cur) + " file descriptors [relates to ulimit -n]"); - } -#endif - // calculate defaults for yp - // if 'publicport' is not the same as 'portbase' - // then we use it instead of the normal portbase - g_portForClients = ((gOptions.publicPort() != -1 && (gOptions.publicPort() != gOptions.portBase())) ? gOptions.publicPort() : gOptions.portBase()); - - // before anything else starts up we'll start this as needed - metrics::metrics_apply(gOptions); - auth::init(); - - // load any SSL certificates - threadedRunner::SSL_init(); - - #ifdef _WIN32 - win32SocketSetup(); - win32_socket_cleanup_required = true; - #endif - - ILOG(LOGNAME "Starting " + tos(cpu_count) + " network thread" + (cpu_count > 1 ? "s" : "")); - - for (int x = 0; x < cpu_count; ++x) - { - threadedRunner *tr = new threadedRunner; - runners.push_back(tr); - tr->start(); - } - - constructMessageResponses(); - - // w3c logging - if (gOptions.w3cEnable()) - { - w3cLog::open(gOptions.w3cLog()); - } - - // load geoIP database if able to be found - /*{ - static utf8 dir = gStartupDirectory; - char path[1024] = {0}; - GeoIP_setup_custom_directory(strncpy(path, (char*)dir.hideAsString().c_str(), sizeof(path))); - GeoIP * gi = GeoIP_new(GEOIP_MEMORY_CACHE); - if(gi != NULL) - { - ILOG(LOGNAME "Loaded GeoIP database - Ban and Reserve by country is enabled"); - const char* returnedCountry, - * ips[] = {"58.218.199.227","77.76.181.71","87.104.93.85","195.238.117.56", - "114.244.60.232","108.52.34.116","91.121.164.186","78.46.75.50", - "62.75.139.39","172.17.200.143","205.188.215.228","82.30.80.183" - }; - for (int ip = 0; ip < sizeof(ips)/sizeof(ips[0]); ip++) - { - utf8 details; - returnedCountry = GeoIP_country_code_by_addr(gi, ips[ip]); - details = (returnedCountry ? returnedCountry : utf8("UNKNOWN")); - returnedCountry = GeoIP_country_name_by_addr(gi, ips[ip]); - details += " (" + (returnedCountry ? returnedCountry : utf8("UNKNOWN")) + ")"; - WLOG(details); - } - - GeoIP_delete(gi); - } - }*/ - - // load up stream branding artwork - gOptions.m_artworkBody[0] = loadLocalFile(fileUtil::getFullFilePath(gOptions.artworkFile()), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - - // load up ban file - g_banList.load(gOptions.banFile(),0); - - // load up rip file - g_ripList.load(gOptions.ripFile(),0); - - // load up admin access file - g_adminList.load(gOptions.adminFile()); - - // load up agent file - g_agentList.load(gOptions.agentFile(),0); - - // per-stream options - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // w3c logging - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::open(gOptions.stream_w3cLog((*i).first),(*i).first); - } - - // load up ban file - if (gOptions.read_stream_banFile((*i).first)) - { - g_banList.load(gOptions.stream_banFile((*i).first),(*i).first); - } - - // load up rip file - if (gOptions.read_stream_ripFile((*i).first)) - { - g_ripList.load(gOptions.stream_ripFile((*i).first),(*i).first); - } - - // load up agent file - if (gOptions.read_stream_agentFile((*i).first)) - { - g_agentList.load(gOptions.stream_agentFile((*i).first),(*i).first); - } - - // load up stream branding artwork - if (gOptions.read_stream_artworkFile((*i).first)) - { - gOptions.m_artworkBody[(*i).first] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile((*i).first)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - } - - utf8 srcBindAddr = stripHTTPprefix(stripWhitespace(gOptions.srcIP())); - utf8 destBindAddr = metrics::metrics_verifyDestIP(gOptions, false); - - if (g_IPAddressForClients.empty()) - { - char s[MAXHOSTNAMELEN] = {0}; // paranoia - if (!::gethostname(s, MAXHOSTNAMELEN - 1)) - { - // changed to not throw (build 43) as this will still run correctly - // and has caused a number of users to go back to v1 unnecessarily. - g_IPAddressForClients = socketOps::hostNameToAddress(s, g_portForClients); - } - } - else - { - utf8 addr = socketOps::hostNameToAddress(destBindAddr.hideAsString().c_str()); - if (!addr.empty()) - { - destBindAddr = addr; - } - /*hostent *host; - if ((host = ::gethostbyname((const char *)destBindAddr.c_str())) != NULL){ - destBindAddr = (inet_ntoa(*( (struct in_addr *)host->h_addr))); - }*/ - } - - if (!srcBindAddr.empty()) - { - utf8 addr = socketOps::hostNameToAddress(srcBindAddr.hideAsString().c_str()); - if (!addr.empty()) - { - srcBindAddr = addr; - } - /*hostent *host; - if ((host = ::gethostbyname((const char *)srcBindAddr.c_str())) != NULL){ - srcBindAddr = (inet_ntoa(*( (struct in_addr *)host->h_addr))); - }*/ - } - - // for legacy sources (with optional portbase override / disable) - g_legacyPort = ((gOptions.portLegacy() != gOptions.portBase() + 1) && (gOptions.portLegacy() != -1) ? - gOptions.portLegacy() : gOptions.portBase() + 1); - - // if src and dst are same we configure ourselves a bit differently - if ((srcBindAddr == destBindAddr) || - (inet_addr((const char *)srcBindAddr.c_str()) == inet_addr((const char *)destBindAddr.c_str()))) - { - // for clients and sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT))); - } - else - { - // changed in b71 as it's possible to specify a destip which does not correctly bind but the - // value of destip could be correct and able to work in all other areas e.g. via listen.pls - // so if there is an issue with the destip specific bind, then attempt a destip==srcip bind - microServer *r = 0; - try - { - // for clients - // changed in b79 - r = new microServer(destBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | P_SHOUTCAST1SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT)); - threadedRunner::scheduleRunnable(r); - - // for sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - microServer::L_SOURCE)); - } - catch(const exception &ex) - { - if (r == 0) - { - WLOG(ex.what()); - } - - try - { - // for clients and sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT))); - } - catch(const exception &exx) - { - // changed in b79 - // if we get to here, if we've been able to bind at least on the destip - // but the srcip bind fails then attempt to allow v2 sources on destip. - if (r != 0) - { - r->updateProtocols((microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_SOURCE2), gOptions.portBase()); - } - else - { - throwEx(exx.what()); - } - } - } - } - - if (g_legacyPort > 0) - { - // for v1 sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), g_legacyPort, - (microServer::AllowableProtocols_t)(P_SHOUTCAST1SOURCE), - microServer::L_SOURCE)); - } - else - { - ILOG("[MICROSERVER] Legacy v1 source support not enabled"); - } - - // for flash policy file server - if (gOptions.flashPolicyServerPort() != -1) - { - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.flashPolicyServerPort(), - (microServer::AllowableProtocols_t)(P_FLASHPOLICYFILE), microServer::L_FLASH)); - } - else - { - ILOG("[MICROSERVER] Flash policy file server not enabled"); - } - - // and finally look at adding any extra client ports e.g. so you can run on 80 - // and 8000 and anything else for clients that cannot connect to the main port - if (!gOptions.alternatePorts().empty()) - { - vector tokens = tokenizer(gOptions.alternatePorts(), ','); - for (size_t tok = 0; tok < tokens.size(); tok++) - { - u_short port = (u_short)atoi(tokens[tok].hideAsString().c_str()); - // make sure we're only allowing a valid port number and it isn't already been registered - if (port && (port != gOptions.portBase()) && (port != g_portForClients)) - { - microServer *r = 0; - try - { - r = new microServer(srcBindAddr.hideAsString(), port, - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT), - (microServer::ListenTypes_t)(microServer::L_CLIENT_ALT)); - threadedRunner::scheduleRunnable(r); - gOptions.m_usedAlternatePorts += "," + tokens[tok]; - } - catch(const exception &ex) - { - if (r == 0) - { - WLOG(ex.what()); - WLOG("[MICROSERVER] Alternate client connections on port " + tokens[tok] + " will not work"); - } - } - } - else - { - if (port != gOptions.portBase() && port != g_portForClients) - { - WLOG("[MICROSERVER] Skipping `" + tokens[tok] + "' as it is an invalid alternate client port"); - } - else - { - WLOG("[MICROSERVER] Skipping alternate port " + tokens[tok] + " as it is already a used port"); - } - } - } - } - - if (gOptions.pidFile().empty() || (gOptions.pidFile() == "sc_serv_$.pid")) - { - pidFn = gStartupDirectory + "sc_serv_" + tos(gOptions.portBase()) + ".pid"; - } - else if (!gOptions.pidFile().empty()) - { - pidFn = gOptions.pidFile(); - } - - if (!pidFn.empty()) - { - FILE *f = uniFile::fopen(pidFn, "wb"); - if (f) - { - try - { - utf8 s(tos(getpid()) + eol()); - if (fwrite(s.c_str(),1,s.size(),f) != s.size()) - { - ELOG(LOGNAME "I/O error writing PID file `" + fileUtil::getFullFilePath(pidFn) + "'"); - } - } - catch(...) - { - if (f) - { - ::fclose(f); - } - ELOG(LOGNAME "Error writing to PID file `" + fileUtil::getFullFilePath(pidFn) + "'"); - } - if (f) - { - ::fclose(f); - } - } - else - { - ELOG(LOGNAME "Could not open PID file `" + fileUtil::getFullFilePath(pidFn) + - "' for writing (" + errMessage().hideAsString() + ")"); - } - } - - // schedule relays - if (!gOptions.startInactive()) - { - vector relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for_each(relayList.begin(), relayList.end(), scheduleRelay); - } - } - - //threadedRunner::scheduleRunnable(new yp2); - threadedRunner::scheduleRunnable(new updater); - - s_ControlEvents.push_back(serviceMain::sStop); -#ifndef _WIN32 - s_ControlEvents.push_back(serviceMain::sWINCH); - s_ControlEvents.push_back(serviceMain::sHUP); - s_ControlEvents.push_back(serviceMain::sUSR1); - s_ControlEvents.push_back(serviceMain::sUSR2); -#endif - -#ifdef OPEN_PORT_CHECKER - //BOOL CheckPortTCP(short int dwPort , char*ipAddressStr) - { - struct sockaddr_in client; - int sock; - - client.sin_family = AF_INET; - client.sin_port = htons(gOptions.portBase()-1000); - //client.sin_addr.s_addr = inet_addr(g_IPAddressForClients/*destBindAddr*/.hideAsString().c_str()/*"127.0.0.1"); - client.sin_addr.s_addr = inet_addr("192.168.2.3"/*"127.0.0.1"*/); - - sock = (int) socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - ELOG(g_IPAddressForClients + ":" + tos(gOptions.portBase()) + /*destBindAddr*/ + " " + tos(connect(sock, (struct sockaddr *) &client,sizeof(client)) == 0)); - } -#endif - - while (!iskilled()) - { - metrics::metrics_wakeup(); - - #if defined(_WIN32) && defined(_WIN64) - int waitResult = WaitForMultipleObjects((DWORD)s_ControlEvents.size(),&(s_ControlEvents[0]),0,1000); - #else - int waitResult = WaitForMultipleObjects(s_ControlEvents.size(),&(s_ControlEvents[0]),0,1000); - #endif - switch (waitResult) - { - // stop signal - case WAIT_OBJECT_0: - { - setkill(true); - // remove the pid file on successful exit - if (!pidFn.empty() && uniFile::fileExists(pidFn)) - { - uniFile::unlink(pidFn); - } - break; - } -#ifdef _WIN32 - case WAIT_OBJECT_0+1: // admin server - break; - - case WAIT_OBJECT_0+2: // main msg loop - break; -#else - case WAIT_OBJECT_0+1: // winch - { - // reserved, banned and blocked user agent list(s) reload - reloadBanLists(); - reloadRipLists(); - reloadAdminAccessList(); - reloadAgentLists(); - break; - } - case WAIT_OBJECT_0+2: // hup - { - ILOG(LOGNAME "Rotating log and W3C files [PID: " + tos(getpid()) + "]"); - ROTATE; - printUpdateMessage(); - rotatew3cFiles("w3c"); - ILOG(LOGNAME "Rotated log and W3C files [PID: " + tos(getpid()) + "]"); - break; - } - case WAIT_OBJECT_0+3: // usr1 - { - // config reload - reloadConfig(false); - break; - } - case WAIT_OBJECT_0+4: // usr2 - { - // forced config reload - reloadConfig(true); - break; - } - case WAIT_OBJECT_0+5: // admin server - break; - - case WAIT_OBJECT_0+6: // main msg loop - break; -#endif - default: - { - } - } - } - - ILOG(LOGNAME "Exiting threads..."); - if (gOptions.configRewrite()) - { - gOptions.rewriteConfigurationFile((gOptions.configRewrite() == 1), true); - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - mainResult = -2; - } - catch(...) - { - ELOG(LOGNAME "Unknown exception caught"); - mainResult = -1; - } - - if (stats::getTotalUniqueListeners() > 0) - { - ILOG(LOGNAME "Terminating listeners..."); - stats::kickAllClients(0, true); - } - - // Stop all sources and wait up to ten seconds for everything to clear out - const streamData::streamIDs_t streamIds = streamData::getStreamIds(true); - if (!streamIds.empty()) - { - ILOG(LOGNAME "Terminating sources..."); - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - // kick source off system - streamData::killStreamSource((*i)); - } - } - - if (yp2::requestsInQueue()) - { - ILOG(LOGNAME "Running Directory cleanup..."); - // now wait for YP to clear out - for (int x = 0; (x < 100); ++x) - { - if (yp2::requestsInQueue()) - { - safe_sleep(0, 10000); - } - else - { - break; - } - } - } - - for (vector::const_iterator i = runners.begin(); i != runners.end(); ++i) - { - (*i)->stop(); - (*i)->join(); - delete (*i); - } - - runners.clear(); - metrics::metrics_wakeup(true); - metrics::metrics_stop(); - auth::cleanup(); - - // general files to save - if (gOptions.saveBanListOnExit()) - { - g_banList.save(gOptions.banFile(),0); - } - - if (gOptions.saveRipListOnExit()) - { - g_ripList.save(gOptions.ripFile(),0); - } - - if (gOptions.saveAgentListOnExit()) - { - g_agentList.save(gOptions.agentFile(),0); - } - - if (gOptions.w3cEnable()) - { - w3cLog::close(0); - } - - // per-stream files to save - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (gOptions.saveBanListOnExit()) - { - if (gOptions.read_stream_banFile((*i).first) && !gOptions.stream_banFile((*i).first).empty()) - { - g_banList.save(gOptions.stream_banFile((*i).first),(*i).first); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (gOptions.read_stream_ripFile((*i).first) && !gOptions.stream_ripFile((*i).first).empty()) - { - g_ripList.save(gOptions.stream_ripFile((*i).first),(*i).first); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (gOptions.read_stream_agentFile((*i).first) && !gOptions.stream_agentFile((*i).first).empty()) - { - g_agentList.save(gOptions.stream_agentFile((*i).first),(*i).first); - } - } - - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::close((*i).first); - } - } - - #ifdef _WIN32 - if (win32_socket_cleanup_required) - { - win32SocketCleanup(); - } - #endif - - s_ControlEvents.clear(); - DeleteAllCaches(); - - stats::getFinalStats(); - bandWidth::getFinalAmounts(); - utf8 t = timeString(::time(NULL) - g_upTime); - ILOG(LOGNAME + (t.empty() ? "Shutdown" : "Shutdown after " + t + " running") + eol()); - - curl_global_cleanup(); - -/*#ifdef _WIN32 - { - wchar_t buf[MAX_PATH] = L"\""; - STARTUPINFO si = {sizeof(si), }; - PROCESS_INFORMATION pi; - GetModuleFileName(NULL, buf + 1, sizeof(buf) - 1); - wcsncat(buf, L"\"", MAX_PATH); - CreateProcess(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); - } -#else -#endif*/ - - // if we're in 'user' mode then if there was an exception - // we'll not immediately abort and instead keep things on - // display so it's easier for noobs, etc to see the error - if (!sDaemon && gOptions.screenLog() && (mainResult < 0)) - { - ILOG(LOGNAME "Press any key to continue . . ."); - while(!_kbhit()) {} - #ifdef _WIN32 - // do this so we consume the input which - // as we already have a custom _kbhit() - // on non-Windows already does it for us - _getch(); - #endif - } - return mainResult; - } -}; - -// create the appropriate handler for the app/daemon/service framework -int sm_main(const vector &args) throw() -{ -#ifdef _WIN32 - stdServiceWin32 s("Shoutcast DNAS"); -#else - stdServiceUnix s; -#endif - return s.sm_main(args); -} diff --git a/Src/Plugins/DSP/sc_serv3/manifest.xml b/Src/Plugins/DSP/sc_serv3/manifest.xml deleted file mode 100644 index 436c2df7..00000000 --- a/Src/Plugins/DSP/sc_serv3/manifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - SHOUTcast DNAS 2.4.3 Build 187 - - - - - - - - \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/manifest64.xml b/Src/Plugins/DSP/sc_serv3/manifest64.xml deleted file mode 100644 index 7dcc9720..00000000 --- a/Src/Plugins/DSP/sc_serv3/manifest64.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - SHOUTcast DNAS 2.4.3 Build 187 - - - - - - - - \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/messagefile.h b/Src/Plugins/DSP/sc_serv3/messagefile.h deleted file mode 100644 index 4a0518fb..00000000 --- a/Src/Plugins/DSP/sc_serv3/messagefile.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// Values are 32 bit values laid out as follows: -// -// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 -// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +---+-+-+-----------------------+-------------------------------+ -// |Sev|C|R| Facility | Code | -// +---+-+-+-----------------------+-------------------------------+ -// -// where -// -// Sev - is the severity code -// -// 00 - Success -// 01 - Informational -// 10 - Warning -// 11 - Error -// -// C - is the Customer code flag -// -// R - is a reserved bit -// -// Facility - is the facility code -// -// Code - is the facility's status code -// -// -// Define the facility codes -// - - -// -// Define the severity codes -// - - -// -// MessageId: MSG_CMD_ERR -// -// MessageText: -// -// %1 -// -#define MSG_CMD_ERR 0xC0000001L - diff --git a/Src/Plugins/DSP/sc_serv3/messagefile.mc b/Src/Plugins/DSP/sc_serv3/messagefile.mc deleted file mode 100644 index f7caddb6..00000000 --- a/Src/Plugins/DSP/sc_serv3/messagefile.mc +++ /dev/null @@ -1,6 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 -. diff --git a/Src/Plugins/DSP/sc_serv3/metadata.cpp b/Src/Plugins/DSP/sc_serv3/metadata.cpp deleted file mode 100644 index df55d841..00000000 --- a/Src/Plugins/DSP/sc_serv3/metadata.cpp +++ /dev/null @@ -1,459 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "metadata.h" -#include "aolxml/aolxml.h" -#include "filenameMetadata.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "streamData.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -metadata::metadata(const metadata &m) -{ - copy(m); -} - -metadata& metadata::operator=(const metadata &m) -{ - copy(m); - return *this; -} - -void metadata::clear() throw() -{ - for (keyValueMap_t::const_iterator i = m_keyValueMap.begin(); i != m_keyValueMap.end(); ++i) - { - delete (*i).second; - } - m_keyValueMap.clear(); -} - -void metadata::copy(const metadata &m) throw() -{ - clear(); - for (keyValueMap_t::const_iterator i = m.m_keyValueMap.begin(); i != m.m_keyValueMap.end(); ++i) - { - if ((*i).second) - { - m_keyValueMap.insert(make_pair((*i).first,(*i).second->clone())); - } - } -} - -metadata::~metadata() throw() -{ - clear(); -} - -// remove all values for key -void metadata::removeValue(const string &key) throw() -{ - keyValueMap_t::iterator i = m_keyValueMap.find(key); - while (i != m_keyValueMap.end()) - { - delete (*i).second; - m_keyValueMap.erase(i); - i = m_keyValueMap.find(key); - } -} - -bool metadata::valueExists(const string &key) const throw() -{ - return (m_keyValueMap.find(key) != m_keyValueMap.end()); -} - -//// only returns first one found -const metadata::metaValue_base* metadata::getValue(const string &key) const throw() -{ - keyValueMap_t::const_iterator i = m_keyValueMap.find(key); - return (i == m_keyValueMap.end() ? 0 : (*i).second); -} - -//// only returns first one found -utf8 metadata::getValueAsString(const std::string &key) const throw() -{ - static utf8 empty; - - const metaValue_base *mv = getValue(key); - return (mv ? mv->toString() : empty); -} - -void metadata::setValue(const string &key,metadata::metaValue_base *value) throw() -{ - m_keyValueMap.insert(make_pair(key,value)); -} - -utf8 metadata::safeXML(const string &tag,const metaValue_base *m) throw() -{ - static utf8 empty; - if (!m) return empty; - return m->toXML(tag); -} - -utf8 metadata::safeString(const metaValue_base *m) throw() -{ - static utf8 empty; - if (!m) return empty; - return m->toString(); -} - -bool metadata::noMeaningfulMetadata() const throw() -{ - return (m_keyValueMap.find(NAME()) == m_keyValueMap.end()); -} - -bool metadata::get_replayGain(double &gain) const throw() -{ - pair mdrange = m_keyValueMap.equal_range("TXXX"); - for (keyValueMap_t::const_iterator i = mdrange.first; i != mdrange.second; ++i) - { - metadata::metaValue *md = dynamic_cast *>((*i).second); - if (md) - { - ID3V2::userText_t ut = md->value(); - if (ut.m_id == "replaygain_track_gain" || ut.m_id == "REPLAYGAIN_TRACK_GAIN") - { - gain = atof((const char *)ut.m_text.c_str()); - return true; - } - } - } - return false; -} - -bool metadata::get_replayGain() const throw() -{ - double g; - return get_replayGain(g); -} - -const utf8 METADATA(""); -const utf8 E_METADATA(""); -#ifdef XML_DEBUG -static const utf8 EOL(eol()); -#else -static const utf8 EOL(""); -#endif - -// new xml for shoutcast -utf8 metadata::toXML() const throw() -{ - utf8 o; - o += "" + EOL; - o += METADATA + EOL; - for (keyValueMap_t::const_iterator i = m_keyValueMap.begin(); i != m_keyValueMap.end(); ++i) - { - o += safeXML((*i).first,(*i).second) + EOL; - } - o += E_METADATA + EOL; - return o; -} - -utf8 metadata::toXML_fromFilename(const uniFile::filenameType &filename,const uniFile::filenameType &url,const utf8 &pattern) throw() -{ - utf8 o; - - o += "" + EOL; - o += METADATA + EOL; - - bool patternWorked(false); - try - { - filenameMetadata fm; - fm.setPattern(pattern); - fm.parse(filename); - const std::map&m = fm.getTokens(); - for (map::const_iterator i = m.begin(); i != m.end(); ++i) - { - o += "<" + (*i).first + ">" + (*i).second.escapeXML() + "" + EOL; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - } - - if (!patternWorked) - { - try - { - string str = string(filename.toANSI(true)); - utf8 song = asciiToUtf8(str); - - filenameMetadata fm; - fm.setPattern(pattern); - fm.parse(song); - const std::map&m = fm.getTokens(); - for (map::const_iterator i = m.begin(); i != m.end(); ++i) - { - o += "<" + (*i).first + ">" + (*i).second.escapeXML() + "" + EOL; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - //ELOG(string("[METADATA] Failure converting filename to metadata ") + ex.what()); - } - } - - if (!patternWorked) - { - o += ""; - - utf8 us = fileUtil::stripSuffix(filename); - // remove path based on delimiter for Unix (/) Win32 (\) or MacOS (:) - us = fileUtil::stripPath(us,utf8("/")); - us = fileUtil::stripPath(us,utf8("\\")); - us = fileUtil::stripPath(us,utf8(":")); - o += us.escapeXML(); - o += "" + EOL; - } - - if (!url.empty()) - { - utf8 u = url; - if ((u.find(utf8("://")) == utf8::npos) && - (u.find(utf8("&")) != 0) && - u.find(utf8("DNAS/streamart?sid=")) == utf8::npos && - u.find(utf8("DNAS/playingart?sid=")) == utf8::npos) - { - u = "http://" + u; - } - o += "" + u.escapeXML() + "" + EOL; - } - - o += E_METADATA + EOL; - return o; -} - -utf8 metadata::toFixedString(const uniFile::filenameType &filename) throw() -{ - utf8 o; - - bool patternWorked(false); - try - { - filenameMetadata fm; - fm.setPattern("%N"); - fm.parse(filename); - const std::map&m = fm.getTokens(); - for (map::const_iterator i = m.begin(); i != m.end(); ++i) - { - o = (*i).second; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - } - - if (!patternWorked) - { - try - { - string str = string(filename.toANSI(true)); - utf8 song = asciiToUtf8(str); - - filenameMetadata fm; - fm.setPattern("%N"); - fm.parse(song); - const std::map&m = fm.getTokens(); - for (map::const_iterator i = m.begin(); i != m.end(); ++i) - { - o = (*i).second; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - //ELOG(string("[METADATA] Failure converting filename to metadata ") + ex.what()); - } - } - - if (!patternWorked) - { - o = filename; - } - - return o; -} - -uniString::utf8 metadata::convert_3902_to_shoutcast1(const uniString::utf8 &d, const streamID_t id) throw (std::runtime_error) -{ - utf8 o; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - utf8 artist = aolxml::subNodeText(n, "/metadata/" + ARTIST(), (utf8)""); - utf8 name = aolxml::subNodeText(n, "/metadata/" + NAME(), (utf8)""); - - if (!artist.empty()) - { - if (!o.empty()) - { - o += " - "; - } - o += artist; - } - if (!name.empty()) - { - if (!o.empty()) - { - o += " - "; - } - o += name; - } - - if (!streamData::validateTitle(o)) - { - WLOG("[ADMINCGI sid=" + tos(id) + "] Title update rejected - value not allowed: " + o); - o.clear(); - } - - o = "StreamTitle='" + o + "';"; - - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/metadata/extension/title"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - { - if (*i) - { - // skip the first element as that is the current song and not what we want to get - int seq = atoi((*i)->findAttributeString("seq").c_str()); - if (seq == 2) - { - utf8 next = ((*i)->pcdata()); - if (streamData::validateTitle(next)) - { - o += "StreamNext='" + next + "';"; - } - break; - } - } - } - } - - utf8 url = aolxml::subNodeText(n, "/metadata/" + URL(), (utf8)""); - if (!url.empty()) - { - utf8::size_type pos = url.find(utf8("://")); - if (pos == utf8::npos) - { - url = "http://" + url; - } - - o += "StreamUrl='" + url + "';"; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return o; -} - -uniString::utf8 metadata::get_song_title_from_3902(const uniString::utf8 &d) -{ - utf8 o; - utf8 result; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - utf8 artist = aolxml::subNodeText(n, "/metadata/" + ARTIST(), (utf8)""); - utf8 name = aolxml::subNodeText(n, "/metadata/" + NAME(), (utf8)""); - - if (!artist.empty()) - { - if (!result.empty()) result += " - "; - result += artist; - } - if (!name.empty()) - { - if (!result.empty()) result += " - "; - result += name; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return result; -} - -uniString::utf8 metadata::get_XX_from_3902(const uniString::utf8& node, const uniString::utf8 &d, - const uniString::utf8 &old) throw (std::runtime_error) -{ - utf8 result; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - result = aolxml::subNodeText(n, utf8("/metadata/" + node).hideAsString(), old); - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return result; -} - -std::vector metadata::get_nextsongs_from_3902(const uniString::utf8 &d, - std::vector& oldSongList, - const bool first) throw (std::runtime_error) -{ - aolxml::node *n = 0; - std::vector nextSongList; - - try - { - n = aolxml::node::parse(d.hideAsString()); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/metadata/extension/title"); - if(!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - { - if (*i) - { - // skip the first element as that is the current song and not what we want to hold - int seq = atoi((*i)->findAttributeString("seq").c_str()); - if ((seq > 1 && !first) || (first && seq == 2)) - { - nextSongList.push_back((*i)->pcdata()); - } - if (first) - { - break; - } - } - } - } - else - { - // if there are no nodes then as this could be from a stream-specific metadata - // update then we need to preserve the existing list so it's not cleared out. - forget(n); - return oldSongList; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return nextSongList; -} diff --git a/Src/Plugins/DSP/sc_serv3/metadata.h b/Src/Plugins/DSP/sc_serv3/metadata.h deleted file mode 100644 index b3bb289c..00000000 --- a/Src/Plugins/DSP/sc_serv3/metadata.h +++ /dev/null @@ -1,151 +0,0 @@ -#pragma once -#ifndef metadata_H_ -#define metadata_H_ - -#include -#include "ID3miniParsers.h" -#include "unicode/uniFile.h" - -// metadata class. Mostly just a container for key/value pairs -// stored ala ID3V2. Some helper functions also to aid in -// ID3V1 mapping -/* - metadata strings are stored in utf8 format -*/ -class metadata -{ -public: - // The metadata values are polymorphic since they may contain all sorts of differnt - // types of information depending on the specific tag. All you can do with them - // is clone them or convert them to xml - class metaValue_base - { - public: - virtual ~metaValue_base(){} - virtual metaValue_base* clone() const throw() = 0; - virtual metaValue_base* clone(const std::vector &s) const = 0; - virtual uniString::utf8 toXML(const std::string &tag) const throw() = 0; - virtual uniString::utf8 toString() const throw() = 0; - }; - - // templatized subclass of metaValue_base. You instantiate this with a class or - // struct of your creation that represents the specific data for a tag. - // The most interesting part is the constructor. You must provide - // an overload in the ID3V2 space (see ID3miniParsers.h) of the function - // fromStringList() which loads your struct from a list of unicode strings. A string - // list is adequate to represent all data coming out of ID3V2. Even binary hunks which - // get base64 encoded before being passed in a list to your constructor. - template - class metaValue: public metaValue_base - { - T m_value; - std::vector m_originalStringList; - - public: - metaValue() {} - metaValue(const T &v, const std::vector &slist) : m_value(v), m_originalStringList(slist) {} - metaValue(const std::vector &slist) : m_originalStringList(slist) - { - ID3V2::fromStringList(slist,m_value); - } - virtual metaValue_base* clone() const throw() - { return new metaValue(m_originalStringList); } - virtual metaValue_base* clone(const std::vector &slist) const // clone with new data - { return new metaValue(slist); } - virtual uniString::utf8 toString() const throw() - { return ID3V2::toString(m_value); } - virtual uniString::utf8 toXML(const std::string &tag) const throw() - { return ID3V2::toXML(uniString::utf8(tag),m_value); } - const T& value() const throw() { return m_value; } - }; - -private: - typedef std::multimap keyValueMap_t; - keyValueMap_t m_keyValueMap; - - // make a copy of this object. Necessary because data is allocated on heap - void copy(const metadata &m) throw(); - -public: - metadata() { m_keyValueMap.clear(); } - // force our private copy() to be called in all copy scenarios - metadata(const metadata &m); - metadata& operator=(const metadata &m); - ///////// - - ~metadata() throw(); - void clear() throw(); - bool empty() const throw() { return m_keyValueMap.empty(); } - - // return true if a particular value exists at least once - bool valueExists(const std::string &key) const throw(); - // note: setValue() takes ownership of the 'value' parameter. This will - // add another key/value pair. Since we have a multimap, existing values of "key" are - // not replaced. - void setValue(const std::string &key,metaValue_base* value) throw(); - void removeValue(const std::string &key) throw(); // remove all values for key - - // only returns first one found - const metaValue_base* getValue(const std::string &key) const throw(); - - // returns a string representation of first instance found - uniString::utf8 getValueAsString(const std::string &key) const throw(); - - // V1 mappings - static const std::string& NAME() throw() { static const std::string k("TIT2"); return k; } - static const std::string& ARTIST() throw() { static const std::string k("TPE1"); return k; } - static const std::string& ALBUM() throw() { static const std::string k("TALB"); return k; } - static const std::string& YEAR() throw() { static const std::string k("TYER"); return k; } - static const std::string& COMMENT() throw() { static const std::string k("COMM"); return k; } - static const std::string& GENRE() throw() { static const std::string k("TCON"); return k; } - - // other mappings (flac/ogg/internal etc) - static const std::string& COMPOSER() throw() { static const std::string k("TCOM"); return k; } - static const std::string& PUBLISHER() throw() { static const std::string k("TPUB"); return k; } - static const std::string& TRACKNUMBER() throw() { static const std::string k("TRCK"); return k; } - static const std::string& DISKNUMBER() throw() { static const std::string k("TPOS"); return k; } - static const std::string& ALBUMARTIST() throw() { static const std::string k("TPE2"); return k; } - static const std::string& BAND() throw() { static const std::string k("TPE2"); return k; } - static const std::string& PERFORMER() throw() { static const std::string k("TPE2"); return k; } - static const std::string& CONDUCTOR() throw() { static const std::string k("TPE3"); return k; } - static const std::string& BEATSPERMINUTE() throw() { static const std::string k("TBPM"); return k; } - static const std::string& LYRICS() throw() { static const std::string k("USLT"); return k; } - static const std::string& ENCODERSETTINGS() throw() { static const std::string k("TSSE"); return k; } - static const std::string& RATING() throw() { static const std::string k("POPM"); return k; } - static const std::string& PICTURE() throw() { static const std::string k("APIC"); return k; } - static const std::string& CUSTOMTEXT() throw() { static const std::string k("TXXX"); return k; } - static const std::string& VERSION() throw() { static const std::string k("TPE4"); return k; } - static const std::string& COPYRIGHT() throw() { static const std::string k("TCOP"); return k; } - static const std::string& LICENSE() throw() { static const std::string k("TOWN"); return k; } - static const std::string& ISRC() throw() { static const std::string k("TSRC"); return k; } - - static const std::string& DJ() throw() { static const std::string k("DJ"); return k; } - static const std::string& URL() throw() { static const std::string k("URL"); return k; } - - // output xml. "safe" functions deal with null value scenario without barfing - static uniString::utf8 safeXML(const std::string &tag,const metaValue_base *m) throw(); - static uniString::utf8 safeString(const metaValue_base *m) throw(); - - uniString::utf8 toXML() const throw(); - - static uniString::utf8 toXML_fromFilename(const uniFile::filenameType &filename, - const uniFile::filenameType &url, - const uniString::utf8 &pattern) throw(); - static uniString::utf8 toFixedString(const uniFile::filenameType &filename) throw(); - - bool get_replayGain(double &gain) const throw(); // return true if value found - bool get_replayGain() const throw(); // same, but just the return value - bool noMeaningfulMetadata() const throw(); // return true if metadata is empty, or stuff in there is not - // useful for user (like replaygain). - - typedef size_t streamID_t; - static uniString::utf8 convert_3902_to_shoutcast1(const uniString::utf8 &d, const streamID_t id) throw(std::runtime_error); - static uniString::utf8 get_song_title_from_3902(const uniString::utf8 &d); - static uniString::utf8 get_XX_from_3902(const uniString::utf8& node, const uniString::utf8 &d, const uniString::utf8 &old) throw(std::runtime_error); - static std::vector get_nextsongs_from_3902(const uniString::utf8 &d, std::vector& oldSongList, bool first = false) throw(std::runtime_error); -}; - -extern const uniString::utf8 METADATA; -extern const uniString::utf8 E_METADATA; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/metrics.cpp b/Src/Plugins/DSP/sc_serv3/metrics.cpp deleted file mode 100644 index 8cb2e1a3..00000000 --- a/Src/Plugins/DSP/sc_serv3/metrics.cpp +++ /dev/null @@ -1,1249 +0,0 @@ -/* metrics,c routines for sending client details to external server */ - -#include -#include -#include -#include -#include -#include - -#include "bandwidth.h" -#include "metrics.h" -#include "protocol_shoutcastClient.h" -#include "stats.h" -#include "config.h" -#include "services/stdServiceImpl.h" -#include "file/fileUtils.h" -#include "webNet/urlUtils.h" -#include "aolxml/aolxml.h" - - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "METRICS" -#define DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -namespace metrics -{ -#if 0 -#define METRICS_LICENCE_URL "http://www.google.com" -#define LICENCE_RESP "\ -\ - \ - \ - \ - \ - \ - \ -\ -" -#else -#define METRICS_LICENCE_URL "https://dnas-licensing.shoutcast.com/registration/" -#endif - class service; - - struct metrics_info - { - httpHeaderMap_t vars; - utf8 url; - size_t id; - unsigned int match; - streamData::streamID_t sid; - int group; - int mode; - metrics_info() : id(0), sid(0), group(0), mode(0) { match = 0; } - }; - - struct metrics_data - { - utf8 post; - utf8 url; - virtual int post_callback() { return 0; } - virtual int failed_callback() { return 0; } - size_t id; - int group; - time_t m_schedule; - int flags; - streamData::streamID_t sid; - - metrics_data () : id(0), group(0), m_schedule((time_t)0), flags(0), sid(0) {} - metrics_data (metrics_info &info) : id(0), group(0), m_schedule((time_t)0), flags(0) { sid = info.sid; } - virtual ~metrics_data() {} - - virtual const char *name() { return "metrics"; } - }; - - struct parse_response_data : public metrics_data - { - stringstream m_ss; - size_t m_length; - - parse_response_data() : metrics_data(), m_length(0) {} - parse_response_data(metrics_info &info) : metrics_data(info), m_length(0) {} - - virtual int post_callback() = 0; - virtual int failed_callback() { WLOG ("failed " + utf8(name()) + " attempt with " + m_ss.str(), LOGNAME, sid); m_ss.str(""); return 0; } - }; - - - struct licence_data : public parse_response_data - { - licence_data() {;} - licence_data (metrics_info &info) : parse_response_data (info) {;} - const char *name() { return "licence"; } - - int post_callback(); - void handleURLs (aolxml::node *root); - void checkURLNode (aolxml::node *root, const char *ref, service_t s); - }; - - - struct YP_data : public parse_response_data - { - YP_data (metrics_info &info) : parse_response_data (info) {;} - - const char *name() { return "YP"; } - int post_callback(); - }; - - -// libcurl related stuff - -#ifdef CURLOPT_PASSWDFUNCTION -/* make sure that prompting at the console does not occur */ -static int my_getpass(void *client, char *prompt, char *buffer, int buflen) -{ - buffer[0] = '\0'; - return 0; -} -#endif - -static int handle_returned_header(void * ptr, size_t size, size_t nmemb, void *stream) -{ - int amount = (int)(size * nmemb); -#if defined(_DEBUG) || defined(DEBUG) - metrics_data *entry = (metrics_data *)stream; - DEBUG_LOG (utf8(entry->name()) + " header [" + utf8 ((const char*)ptr, amount>2 ? amount-2 : 0) + "]", LOGNAME); -#endif - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; -} - - -static int handle_returned_data(void * ptr, size_t size, size_t nmemb, void * /*stream*/) -{ - int amount = (int)(size * nmemb); -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG ("Body " + tos (amount) + ":" + utf8 ((const char*)ptr, amount), LOGNAME); -#endif - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; -} - - -static size_t handle_licence_body (void *ptr, size_t size, size_t nmemb, void *stream) -{ - licence_data *entry = (licence_data *)stream; - size_t length = size * nmemb; - if (entry->m_ss) - { - if (entry->m_length > 20000) - { - WLOG ("response for was too large, ignoring for now"); - return 0; - } - //DLOG ("Adding " + tos (length) + ":" + utf8 ((const char*)ptr, length)); - entry->m_ss.write ((const char*)ptr, length); - entry->m_length += length; - } - - bandWidth::updateAmount (bandWidth::ADVERTS, length); - return length; -} - - - - time_t g_metrics_updated = 0, g_recheck_services = 0; - AOL_namespace::mutex g_serversLock; - utf8 g_licence_DID = ""; - static short int g_uniqueMetricsId = 0; - -const short int getMetricsClientId() -{ - return ++g_uniqueMetricsId; -} - - -class service -{ -protected: - int m_queueCount; - const short int m_id; - unsigned short m_flags; - CURL *m_curl; - string desc; - bool in_use; - bool running; - utf8 url; - const time_t updated; - time_t stop_time; - utf8 main_post; - list queue; - - virtual void resetURL (utf8 &new_url) - { - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 5L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - friend void addToServices(metrics_info &info); - friend void metrics_stop(); - - service(short int in_type, const char *in_url, const string in_desc) : m_id(getMetricsClientId()), in_use(false), running(true), - updated(g_metrics_updated), stop_time(0) - { - httpHeaderMap_t vars; - m_flags = in_type; - m_queueCount = 0; - url = in_url; - desc = in_desc; - m_curl = NULL; - - resetURL (url); - - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - main_post = encodeVariables(vars); - DEBUG_LOG ("using " + url + " : " + main_post, in_desc.c_str()); - } - - virtual ~service(void) - { - metrics_cleanup(); - curl_easy_cleanup (m_curl); - } - - virtual metrics_data *metrics_node(metrics_info &info) { return new metrics_data (info); } - virtual int failedEntry (metrics_data *) { return 0; } - - int addEntry (metrics_info &info); - void metrics_cleanup(void); - - static THREAD_FUNC process(void* arg); -}; - - -class licenceService : public service -{ - int m_initial; - time_t m_nextCheck; // for licence - - void addCheckup(time_t when); - metrics_data *metrics_node (metrics_info &info) { return new licence_data (info); } - - void resetURL (utf8 &new_url) - { - //DLOG ("in reset url with " + new_url); - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 5L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_licence_body); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - licenceService() : service (METRIC_LICENCE, "", "licence") - { - m_initial = 0; - m_nextCheck = (time_t)0; - utf8 s = METRICS_LICENCE_URL; - resetURL (s); - addCheckup (::time(NULL)); - } - - int failedEntry (metrics_data *entry) - { - if (entry->sid == 0) // assume licence checker - { - if (entry->flags & 1) - return -1; // no licence, so no retry - int retry = -1; - m_initial++; - if (m_initial == 1) - retry = 1; - else if (m_initial == 2) - { - retry = 10; - } - else if (m_initial == 3) - //retry = 60; - addCheckup (::time(NULL) + 60); - else - { - m_initial = 0; - addCheckup (::time(NULL) + 3600); - } - return retry; - } - return 0; - } -}; - - -class ypService : public service -{ - void resetURL (utf8 &new_url) - { - //DLOG ("in reset url with " + new_url); - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 15L, 4L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_licence_body); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - ypService() : service (METRIC_YP, METRICS_YP_URL, "YP") { resetURL (url); } - - metrics_data *metrics_node(metrics_info &info) { return new YP_data (info); } - - int failedEntry (metrics_data *entry) - { - if (entry->flags) - return -1; - entry->flags |= 1; - return 15; - } -}; - - -list servers; - - -int service::addEntry(metrics_info &info) -{ - httpHeaderMap_t &vars = info.vars; - bool start_thread = false, queue_it = false; - - if (vars.empty()) - { - if (running && (g_metrics_updated > updated)) - { - DEBUG_LOG("Service " + tos(m_id) + " expired, start clean up", LOGNAME, (size_t)info.sid); - running = false; - } - - if ((running == false) && queue.empty()) - { - DEBUG_LOG ("[METRICS] service to be removed, " + desc); - return -1; // trigger a service removal - } - start_thread = true; - } - - if (stop_time == 0 && start_thread == false) - { - if (running && queue.size() < gOptions.metricsMaxQueue()) - queue_it = true; - } - if (info.mode || queue_it) - { - metrics_data *copy = metrics_node(info); - copy->id = info.id; - copy->sid = info.sid; - copy->post = encodeVariables(vars); - copy->url = info.url; - start_thread = true; - if (info.mode == 2) - queue.push_front(copy); - else - queue.push_back(copy); - m_queueCount++; - DEBUG_LOG("[METRICS sid=" + tos(copy->sid) + "] Added " + utf8(desc) + " details to queue [count: " + tos(queue.size()) + "]", LOGNAME, copy->sid); - } - - if ((in_use == false) && start_thread && !queue.empty()) - { - in_use = true; - SimpleThread(service::process, this); - } - return 0; -} - -void service::metrics_cleanup() -{ - if (!queue.empty()) - { - DEBUG_LOG("Purging " + tos(queue.size()) + " entries from " + tos(m_id), LOGNAME); - - while (!queue.empty()) - { - list::iterator to_go = queue.begin(); - metrics_data *m = *to_go; - //DLOG ("erasing metric for " + m->post); - queue.erase(to_go); - delete m; - m = NULL; - } - } -} - -THREAD_FUNC service::process(void* arg) -{ - try - { - service* m_service = reinterpret_cast(arg); - if (m_service) - { - g_serversLock.lock(); - - if (m_service->stop_time) - { - time_t diff = ::time(NULL) - m_service->stop_time; - - if (diff > (12 * 3600)) // drop after 12 hours of no response - { - m_service->metrics_cleanup(); - m_service->in_use = false; - g_serversLock.unlock(); - return 0; - } - DEBUG_LOG ("[METRICS] time since stopping " + tos ((long)diff)); - } - if (m_service->queue.size() < 5) - { - // allow for a build up of metrics over a small time, saves excessive thread creation - g_serversLock.unlock(); - safe_sleep (0, 80); - g_serversLock.lock(); - } - - int count = 0; - int try_later = 0; - time_t stop_time = (time_t)0; - - while (1) - { - utf8 post; - char errormsg[CURL_ERROR_SIZE] = {0}; - - if (m_service->m_queueCount <= try_later) - { - if (count) - DEBUG_LOG ("[METRICS] run queue " + m_service->desc + " complete"); - break; - } - - metrics_data *entry = m_service->queue.front(); - m_service->queue.pop_front(); - m_service->m_queueCount--; - if (entry->m_schedule > 0 && entry->m_schedule > time(NULL)) - { - m_service->queue.push_back (entry); - m_service->m_queueCount++; - try_later++; - continue; - } - g_serversLock.unlock(); - - if (entry->url.empty() == false) - m_service->resetURL (entry->url); // update the URL - - bool failed = false; - - if (entry->post.empty()) - { - if (entry->url.empty()) - DLOG ("empty Post/URL update on " + m_service->desc, LOGNAME); - } - else - { - CURLcode ret = CURLE_FAILED_INIT; - - if (m_service->m_curl) - { - post = entry->post + "&" + m_service->main_post; - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_service->desc + utf8(" POST body: " + post), LOGNAME, entry->sid); -#endif - - curl_easy_setopt (m_service->m_curl, CURLOPT_ERRORBUFFER, errormsg); - curl_easy_setopt (m_service->m_curl, CURLOPT_HEADERDATA, entry); - curl_easy_setopt (m_service->m_curl, CURLOPT_WRITEDATA, entry); - curl_easy_setopt (m_service->m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt (m_service->m_curl, CURLOPT_POSTFIELDS, post.c_str()); - ret = curl_easy_perform (m_service->m_curl); - ++count; - } - - if (ret != CURLE_OK) - { - ELOG("Request failed on " + m_service->desc + " with " - + (errormsg[0] ? errormsg : curl_easy_strerror(ret)), LOGNAME, entry->sid); - failed = true; - } - else - { - long response_code = 0; - curl_easy_getinfo (m_service->m_curl, CURLINFO_RESPONSE_CODE, &response_code); - if (response_code >= 200 && response_code < 300) - { - entry->post_callback(); - stop_time = 0; - } - else - { - ELOG("Request failed on " + m_service->desc + " with code " + tos (response_code)); - entry->failed_callback(); - failed = true; - } - } - } - if (failed && !iskilled()) // a failed metric, and server still running - { - int delay = m_service->failedEntry (entry); - - if (stop_time == 0) - stop_time = ::time(NULL); - if (delay >= 0) // do we drop this one? < 0 something else is done, else put back on queue - { - g_serversLock.lock(); - m_service->queue.push_front (entry); - m_service->m_queueCount++; - - if (delay == 0) - { - m_service->stop_time = stop_time; - break; - } - - g_serversLock.unlock(); - DLOG ("sleeping for " + tos (delay) + "s on " + m_service->desc); - safe_sleep (delay, 0); - g_serversLock.lock(); - continue; - } - } - - delete entry; - entry = NULL; - g_serversLock.lock(); - m_service->stop_time = stop_time; - } // while - - m_service->in_use = false; - g_serversLock.unlock(); - } - } - catch(exception &e) - { - service* m_service = reinterpret_cast(arg); - DLOG ("abort in metric " + m_service->desc + ", " + e.what()); - safe_sleep (0,500); - if (m_service) - { - g_serversLock.lock(); - m_service->in_use = false; - g_serversLock.unlock(); - } - } - return 0; -} - - -void addToServices(metrics_info &info) -{ - g_serversLock.lock(); - list ::iterator it = servers.begin(); - - while (it != servers.end()) - { - service &s = **it; - // DLOG ("Applying metric to " + s.desc + "(" + tos((long)s.flags) + ", " + tos((long)info.match) + ")"); - if ((s.m_flags & info.match) && s.addEntry(info) < 0) - { - list ::iterator to_go = it; - service *s = *it; - ++it; - servers.erase(to_go); - delete s; - s = NULL; - } - else - { - ++it; - } - } - g_serversLock.unlock(); -} - - -// assume only called from one thread. -void metrics_wakeup(bool force) -{ - time_t now = ::time(NULL); - metrics_info info; - info.match = METRIC_AUDIENCE | METRIC_ADVERT | METRIC_LICENCE | METRIC_YP; - if ((now > g_recheck_services) || force) - { - if (force) - { - g_recheck_services = now + 60; - } - info.match |= METRIC_AUDIENCE | METRIC_ADVERT; - - g_recheck_services = now + 60; // next recheck in case stalled metrics - } - addToServices(info); -} - - -void metrics_listener_new(const protocol_shoutcastClient &client) -{ - const streamData *sd = client.m_streamData; - if (sd && !sd->radionomyID().empty()) - { - metrics_info info; - const streamData::streamInfo &stream = sd->getInfo(); - - info.vars["action"] = "listener_add"; - info.vars["tstamp"] = tos(::time(NULL)); - info.vars["host"] = sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = sd->radionomyID(); - info.vars["client"] = tos(client.m_unique); - info.vars["group"] = tos(client.getGroup()); - info.vars["ip"] = client.m_clientAddr; - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = getStreamPath(client.m_streamID); - info.vars["agent"] = client.m_userAgent; - info.vars["referer"] = client.m_referer; - info.vars["bitrate"] = tos(sd->streamBitrate()); - info.vars["codec"] = sd->streamContentType(); - info.vars["contr"] = client.getContainer(); - - info.id = client.m_unique; - info.sid = client.m_streamID; - info.match = METRIC_AUDIENCE; - - addToServices(info); - } -} - -void metrics_listener_drop(const protocol_shoutcastClient &client) -{ - const streamData *sd = client.m_streamData; - if (sd && !sd->radionomyID().empty()) - { - metrics_info info; - const streamData::streamInfo &stream = sd->getInfo(); - time_t now = ::time(NULL); - - info.vars["action"] = "listener_remove"; - info.vars["tstamp"] = tos(now); - info.vars["host"] = sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = sd->radionomyID(); - info.vars["client"] = tos(client.m_unique); - info.vars["ip"] = client.m_clientAddr; - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = getStreamPath(client.m_streamID); - info.vars["duration"] = tos(now - client.m_startTime); - info.vars["agent"] = client.m_userAgent; - info.vars["referer"] = client.m_referer; - info.vars["bitrate"] = tos(sd->streamBitrate()); - info.vars["codec"] = sd->streamContentType(); - info.vars["contr"] = client.getContainer(); - - info.id = client.m_unique; - info.sid = client.m_streamID; - info.match = METRIC_AUDIENCE; - - addToServices(info); - } -} - - -void metrics_adListener (const protocol_shoutcastClient &client, const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "listener_admetric"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["id"] = summary.id; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["client"] = tos(client.getUnique()); - info.vars["group"] = tos(client.getGroup()); - info.vars["sent"] = tos (client.getAdAccess().total_processed); - info.vars["started"] = tos (client.getAdAccess().start_time); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -void metrics_advert_started (const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "ad_trigger"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["id"] = summary.id; - info.vars["listeners"] = tos(summary.count); - info.vars["bitrate"] = tos(summary.sd->streamBitrate()); - info.vars["codec"] = summary.sd->streamContentType(); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -void metrics_advert_stats(const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "ad_metric"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["id"] = summary.id; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["group"] = tos(summary.group); - info.vars["file"] = summary.name; - if (summary.missing) - info.vars["missing"] = (summary.failed ? "failed" : "timeout"); - else - info.vars["listeners"] = tos(summary.count); - info.vars["bitrate"] = tos(summary.sd->streamBitrate()); - info.vars["codec"] = summary.sd->streamContentType(); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -static bool _filled_info_notify (metrics_info &info, const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm = ::time(NULL)) -{ - if (radionomyID.empty() || serverID.empty() || publicip.empty()) - return false; - - info.vars["action"] = iskilled() ? "shutdown" : "reset"; - info.vars["tstamp"] = tos ((long)tm); - info.vars["host"] = publicip; - info.vars["radionomyid"] = info.vars["ref"] = radionomyID; - info.vars["srvid"] = serverID; - info.vars["mount"] = getStreamPath(sid); - - info.sid = sid; - info.match = METRIC_NOTIFICATION; - info.mode = 2; - return true; -} - -void metrics_stream_down (const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm) -{ - metrics_info info; - if (_filled_info_notify (info, sid, radionomyID, serverID, publicip)) - { - info.vars["action"] = iskilled() ? "shutdown" : "stopped"; - info.vars["started"] = tos(tm); - addToServices(info); - } -} - -void metrics_stream_up (const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm) -{ - metrics_info info; - if (_filled_info_notify (info, sid, radionomyID, serverID, publicip)) - { - info.vars["action"] = iskilled() ? "shutdown" : "reset"; - addToServices(info); - } -} - - -utf8 metrics_verifyDestIP(config &conf, bool full, uniString::utf8 url) -{ - // we'll try to set this where possible but it depends on 'destip' or 'publicip' - // being set in order for us to have something to be able to be used by the YP - utf8 destBindAddr = stripWhitespace((url.empty() ? (full && !conf.publicIP().empty() ? conf.publicIP() : conf.destIP()) : url)); - destBindAddr = stripHTTPprefix(destBindAddr); - - // with full then we're wanting to filter out some of the values - // since this is then used for the public reponses / YP details - if (full) - { - // cleanup things and only provide what should be valid i.e. nothing from a private network - // and not send this even if provided just means the YP server will use the connection's IP - if (isRemoteAddress(destBindAddr)) - { - return destBindAddr; - } - return ""; - } - // otherwise we just return the cleaned version as-is - // since it'll allow for use in normal bindings, etc - return destBindAddr; -} - -utf8 createGuid() -{ -#ifdef _WIN32 -#define rand_r(x) rand() -#else - static unsigned int seed = time(NULL); -#endif - std::stringstream ss; - for (int i = 0; i < 30; i++) - ss << std::hex << (unsigned int)(rand_r(&seed) % 16); - return ss.str(); -} - - -#ifdef _MSC_VER -utf8 getWindowsRegKey (bool newone = false) -{ - wchar_t *subKey = L"Software\\Microsoft\\Cryptography"; - HKEY hKey; - - LONG nError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey); - if (nError == ERROR_FILE_NOT_FOUND) - { -#if 0 - // maybe try to create a local guid to read from. - subkey = L"Software\\SHOUTcast"; - nError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey); - if (nError == ERROR_FILE_NOT_FOUND) - { - // create one and put id in there - nError = RegCreateKeyEx (HKEY_LOCAL_MACHINE, subKey, NULL, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL, &hKey, NULL); - if (nError == ERROR_FILE_NOT_FOUND) - return ""; - - string guid = createGuid (); - DWORD dwSize = lstrlen(&guid[0]) * sizeof(TCHAR); - nError = RegSetValueEx (hKey, lpValue, NULL, REG_SZ, (unsigned char *)&guid[0], dwSize); - return guid; - } -#else - return ""; -#endif - } - char buff[100]; - DWORD rdwSize = sizeof (buff); - DWORD dwType = REG_SZ; - nError = RegQueryValueExA (hKey, "MachineGuid", NULL, &dwType, (unsigned char*)buff, &rdwSize); - RegCloseKey (hKey); - return (nError) ? "" : buff; -} -#endif - - -void hashDID (utf8 &ident) -{ - // uses openssl for hashing a machine/installation Id - unsigned char digest[SHA256_DIGEST_LENGTH]; - - SHA256((unsigned char*)&ident[0], ident.size(), (unsigned char*)&digest); - - std::stringstream ss; - for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) - ss << std::hex << (unsigned int)digest[i]; - g_licence_DID = ss.str(); - DLOG ("ident is " + ident + ", DID is " + g_licence_DID); -} - - -void metricsCheckDID () -{ - if (g_licence_DID.empty() == false) - return; - - utf8 s = "DIDC"; // Dnas ID Code - do - { -#ifdef _WIN32 - utf8 key = getWindowsRegKey(); - if (key.empty() == false) - { - s += key; - break; - } -#endif -#ifdef PLATFORM_LINUX - ifstream myfile ("/etc/machine-id"); - if (myfile.is_open()) - { - string line; - getline (myfile, line); - s += line; - break; - } -#endif - // get random sequence if all else fails - ILOG ("failed to get a static unique number, falling back to random sequence"); - s += createGuid(); - } while (0); - - // append conf bits to string. XXXX[-publicip]-baseport - s += "-"; - s += tos(gOptions.portBase()); - utf8 p = gOptions.publicIP(); - if (p.empty() == false) - { - s += "-"; - s += p; - } - hashDID (s); -} - - -void metrics_apply(config &conf) -{ - bool same = (metrics_verifyDestIP(conf) == metrics_verifyDestIP(gOptions)); - if (!same || servers.empty()) - { - if (!same) - { - metrics_stop(); - } - - DEBUG_LOG(utf8(same ? "Adding" : "Updating") + " metrics details", LOGNAME); - metricsCheckDID (); - - service *s = new service (METRIC_AUDIENCE, METRICS_AUDIENCE_URL, "audience"); - servers.push_front(s); - - s = new service (METRIC_ADVERT, METRICS_ADVERTS_URL, "adservice"); - servers.push_front(s); - - s = new service (METRIC_NOTIFICATION, METRICS_RESET_URL, "notification"); - servers.push_front(s); - -#ifndef LICENCE_FREE - s = new licenceService (); - servers.push_front(s); -#endif - - s = new ypService (); - servers.push_front(s); - } -} - - -void metrics_stop() -{ - g_serversLock.lock(); - if (!servers.empty()) - { - int loop = 50; - while (loop > 0) - { - list ::iterator it = servers.begin(); - if (it == servers.end()) - { - break; - } - - service *s = *it; - if (s) - { - if (s->in_use) - { - loop--; - g_serversLock.unlock(); - safe_sleep(0, 100); // thread active so wait and try again - g_serversLock.lock(); - continue; - } - } - - servers.erase(it); - - if (s) - { - delete s; - s = NULL; - } - } - } - g_serversLock.unlock(); -} - - -// called near the start of the stream and each metadata update. -// -void updateMeta (const metaInfo &meta) -{ - metrics_info info; - utf8 uid = gOptions.userId (); - - utf8 ah = gOptions.stream_authHash (meta.m_sid); - if (ah.empty()) - return; - info.vars ["uid"] = uid; - info.vars ["ah"] = ah; - info.vars ["did"] = g_licence_DID; - info.vars ["tstamp"] = tos (time(NULL)); - - info.vars ["private"] = tos(meta.m_private ? 1 : 0); - info.vars ["sid"] = tos(meta.m_sid); - info.vars ["format"] = meta.m_format; - info.vars ["audience"] = tos (stats::getUserCount (meta.m_sid)); - info.vars ["maxlisteners"] = tos(meta.m_maxListeners); - info.vars ["currentsong"] = meta.m_song; - info.vars ["bitrate"] = tos(meta.m_bitrate); - info.vars ["mount"] = getStreamPath (meta.m_sid); - info.vars ["samplerate"] = tos (meta.m_samplerate); - info.vars ["verinfo"] = meta.m_version; - info.vars ["agent"] = meta.m_agent; - info.vars ["sourceip"] = meta.m_sourceIP; - info.vars ["publicip"] = gOptions.publicIP(); - info.vars ["publicport"] = tos (gOptions.publicPort()); - info.vars ["secure"] = tos (threadedRunner::isSSLCapable() ? 1 : 0); - - stats::statsData_t data; - stats::getStats (meta.m_sid, data); - info.vars ["peaklisteners"] = tos(data.peakListeners); - - info.match = METRIC_YP; - info.sid = meta.m_sid; - info.mode = 1; - DLOG ("push to YP requested \"" + meta.m_song + "\"", LOGNAME, meta.m_sid); - addToServices(info); -} - - -void licence_data::checkURLNode (aolxml::node *root, const char *ref, service_t s) -{ - aolxml::node *n = aolxml::node::findNode (root, ref); - if (n) - { - utf8 url = n->findAttributeString ("url"); - if (url.empty() == false) - { - metrics_info info; - info.url = url; - info.match = s; - info.mode = 2; - addToServices (info); - } - } -} - - -void licence_data::handleURLs (aolxml::node *root) -{ - if (root == NULL) - return; - checkURLNode (root, "/SHOUTCAST/METRICS", METRIC_AUDIENCE); - checkURLNode (root, "/SHOUTCAST/METRICSAD", METRIC_ADVERT); - checkURLNode (root, "/SHOUTCAST/YP", METRIC_YP); - - aolxml::node *n = aolxml::node::findNode (root, "/SHOUTCAST/AUTH"); - if (n) - { - utf8 s = n->findAttributeString ("url"); - if (s.empty() == false) - { - auth::g_authURL = s; - auth::updateServices (); - } - } -} - - -int licence_data::post_callback () -{ - vector<__uint8> v; -#ifdef LICENCE_RESP - utf8 s = LICENCE_RESP; - v.assign (&s[0], &s[s.size()]); -#else - v.reserve (m_ss.tellp()); - std::copy (std::istreambuf_iterator( m_ss ), std::istreambuf_iterator(), std::back_inserter(v)); -#endif - - aolxml::node *n = NULL, *root = NULL; - do - { - if (v.empty()) - break; -#if defined(_DEBUG) || defined(DEBUG) - //DLOG ("response size is " + tos (v.size())); - DEBUG_LOG ("Licence body " + tos (v.size()) + ":" + utf8 ((const char*)&v[0], v.size()), LOGNAME); -#endif - root = aolxml::node::parse (&v[0], v.size()); - if (root) - n = aolxml::node::findNode (root, "/SHOUTCAST/FUNCTION"); - if (n == NULL) - { - ILOG ("license parse failed, skipping", LOGNAME); - break; - } - - utf8 s = n->findAttributeString ("level"); - if (s == "10") - { - ILOG ("detected paying offer", LOGNAME); - streamData::streamInfo::m_allowSSL_global = 1; - streamData::streamInfo::m_allowAllFormats_global = 1; - streamData::streamInfo::m_allowBackupURL_global = 1; - streamData::streamInfo::m_allowMaxBitrate_global = 0; - break; - } - ILOG ("free offer only", LOGNAME); - streamData::streamInfo::m_allowSSL_global = 0; - streamData::streamInfo::m_allowAllFormats_global = 0; - streamData::streamInfo::m_allowBackupURL_global = 0; - streamData::streamInfo::m_allowMaxBitrate_global = 128; - } while (0); - - handleURLs (root); - - forget (root); - return 0; -} - - -// Called at server start and every hour. -void licenceService::addCheckup (time_t when) -{ - // eg http://dnas-services.shoutcast.com:8500/registration/?lid=2&debug=yes - // eg https://dnas-services.shoutcast.com/registration/?lid=2&debug=yes - httpHeaderMap_t vars; - bool licenceMissing = true; - utf8 s = gOptions.userId(); - - if (s.empty()) - return; - vars ["uid"] = s; - s = gOptions.licenceId(); - if (s.empty() == false) - { - vars ["lid"] = s; - licenceMissing = false; - } - - vars ["did"] = g_licence_DID; - vars ["tstamp"] = tos (time(NULL)); - - licence_data *copy = new licence_data(); - - copy->post = encodeVariables(vars); - copy->m_schedule = when; - if (licenceMissing) - copy->flags |= 1; - - g_serversLock.lock(); - queue.push_front (copy); - m_queueCount++; - g_serversLock.unlock(); -} - - -int YP_data::post_callback () -{ - vector<__uint8> v; - v.reserve (m_ss.tellp()); - std::copy (std::istreambuf_iterator( m_ss ), std::istreambuf_iterator(), std::back_inserter(v)); - - aolxml::node *n = NULL, *root = NULL; - do - { - //DLOG ("response size is " + tos (v.size())); - if (v.empty()) - break; -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG ("YP Body " + tos (v.size()) + ":" + utf8 ((const char*)&v[0], v.size()), name(), sid); -#endif - root = aolxml::node::parse (&v[0], v.size()); - if (root) - n = aolxml::node::findNode (root, "/response"); - if (n == NULL) - { - ILOG ("response invalid, skipping", name(), sid); - break; - } - int code = aolxml::subNodeText(n, "/response/statusCode", 400); - if (code != 200) - { - utf8 msg = aolxml::subNodeText(n, "/response/statusText", (utf8)""); - if (msg != (utf8)"") - WLOG ("response returned " + tos(code) + ", " + msg, name(), sid); - break; - } - n = aolxml::node::findNode (root, "/response/data"); - if (n == NULL) - { - ILOG ("No special settings from YP for stream " + tos(sid), name(), sid); - break; - } - yp2::stationInfo info; - info.m_advertMode = aolxml::subNodeText(n, "/response/data/admode", 0); - info.m_streamTitle = aolxml::subNodeText(n, "/response/data/stationname", (utf8)""); - info.m_stationID = aolxml::subNodeText(n, "/response/data/stationid", (utf8)""); - info.m_serverID = aolxml::subNodeText(n, "/response/data/serverid", (utf8)""); - info.m_radionomyID = aolxml::subNodeText(n, "/response/data/callsign", (utf8)""); - info.m_responseCode = code; - info.m_advertType = aolxml::subNodeText(n, "/response/data/advert/type", (utf8)"fixed"); - info.m_advertTrigger = aolxml::subNodeText(n, "/response/data/advert/trigger", (utf8)"meta"); - - streamData *sd = streamData::accessStream (sid); - if (sd) - { - sd->YP2_updateInfo (info); - sd->releaseStream(); - } - ILOG ("Stream #" + tos(sid) + " has been updated on the Shoutcast Directory.", name(), sid); - - } while (0); - - forget (root); - return 0; -} - -} // namespace diff --git a/Src/Plugins/DSP/sc_serv3/metrics.h b/Src/Plugins/DSP/sc_serv3/metrics.h deleted file mode 100644 index f324beaa..00000000 --- a/Src/Plugins/DSP/sc_serv3/metrics.h +++ /dev/null @@ -1,101 +0,0 @@ -/* metrics.h external interface to metric processing */ - -#ifndef _METRICS_H -#define _METRICS_H - -#include "unicode/uniString.h" - -class protocol_shoutcastClient; -class streamData; -class config; - -#if 1 -#define METRICS_AUDIENCE_URL "https://metrics.shoutcast.com/metrics" -#define METRICS_ADVERTS_URL "https://ads.shoutcast.com/dnas" -#define TARGETSPOT_URL "https://ads.shoutcast.com/dnas" -#define METRICS_YP_URL "https://dnas-services.shoutcast.com/yp/" -#else -#define METRICS_AUDIENCE_URL "http://localhost:9001" -#define METRICS_ADVERTS_URL "http://localhost:9001/dnas" -#define TARGETSPOT_URL "http://localhost/~karl/mapping1.php" -#endif -#define METRICS_RESET_URL "https://metrics.radionomy.com/connections/closednas" - - -namespace metrics -{ - typedef size_t streamID_t; - typedef enum { - METRIC_AUDIENCE = 1, - METRIC_ADVERT = 2, - METRIC_NOTIFICATION = 4, - METRIC_LICENCE = 8, - METRIC_YP = 16 - } service_t; - - struct adSummary - { - streamID_t sid; - bool sendRest; - bool failed; - bool missing; - uniString::utf8 path; - time_t tstamp; - const char *name; - int count; - std::string id; - size_t group; - streamData *sd; - - adSummary() : sid(1), tstamp(0), name(0), count(0), group(0) { sd = NULL; sendRest = failed = missing = false; } - }; - - struct metaInfo - { - streamID_t m_sid; - bool m_private; - unsigned int m_audience; - unsigned int m_maxListeners; - unsigned int m_bitrate; - unsigned int m_samplerate; - uniString::utf8 m_version; - uniString::utf8 m_song; - uniString::utf8 m_format; - uniString::utf8 m_agent; - uniString::utf8 m_publicIP; - uniString::utf8 m_sourceIP; - }; - - void metrics_init(); - void metrics_stop(); - void metrics_apply(config &conf); - - // new listener triggers - void metrics_listener_new(const protocol_shoutcastClient &client); - - // exiting listener triggers - void metrics_listener_drop(const protocol_shoutcastClient &client); - - void metrics_adListener (const protocol_shoutcastClient &client, const adSummary &summary); - - void metrics_advert_started (const adSummary &summary); - - void metrics_advert_stats(const adSummary &summary); - - typedef unsigned yp2SessionKey; - - void metrics_stream_down (const streamID_t sid, const uniString::utf8& radionomyID, - const uniString::utf8& serverID, const uniString::utf8& publicip, time_t tm); - - void metrics_stream_up (const streamID_t sid, const uniString::utf8& radionomyID, - const uniString::utf8& serverID, const uniString::utf8& publicip, time_t tm); - - // periodic wakeup for any stalled metrics - void metrics_wakeup(bool force = false); - - void updateMeta (const metaInfo &meta); - - uniString::utf8 metrics_verifyDestIP(config &conf, bool full = true, uniString::utf8 url = ""); -} - -#endif /* _METRICS_H */ diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp deleted file mode 100644 index 941746d2..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#endif -#include "fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include -#include "../../global.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -bool fileUtil::convertOSFilePathDelimiter(uniString::utf8 &value) throw() -{ - bool converted = false; - if (!value.empty()) - { - #ifdef _WIN32 - const uniString::utf8& replaceFilePathDelimiter("/"); - #else - const uniString::utf8& replaceFilePathDelimiter("\\"); - #endif - - uniString::utf8::size_type pos = value.find(replaceFilePathDelimiter); - if (pos != uniString::utf8::npos) converted = true; - while (pos != uniString::utf8::npos) - { - value.replace(pos,1,getFilePathDelimiter()); - pos = value.find(replaceFilePathDelimiter); - } - } - return converted; -} - -#ifdef _WIN32 - -uniFile::filenameType fileUtil::getFullFilePath(const uniFile::filenameType &partial_path) throw() -{ - wchar_t resolved_path[MAX_PATH] = {0}; - - uniString::utf32 u32(partial_path); - std::wstring u16; - u32.toUtf16(u16); - - if (_wfullpath(resolved_path, u16.c_str(), MAX_PATH)) - { - return utf32(resolved_path).toUtf8(); - } - return partial_path; -} - -bool fileUtil::fileExists(const uniFile::filenameType &fullPath) throw() -{ - uniString::utf32 u32(fullPath); - std::wstring u16; - u32.toUtf16(u16); - - HANDLE hPF = ::CreateFileW(u16.c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (hPF == INVALID_HANDLE_VALUE) - { - return false; - } - ::CloseHandle(hPF); - return true; -} - -bool fileUtil::directoryExists(const uniFile::filenameType &fullPath) throw() -{ - WIN32_FIND_DATAW fd = {0}; - - uniString::utf32 u32(fullPath); - std::wstring u16; - u32.toUtf16(u16); - - wstring path = u16.substr(0, u16.rfind(L"\\")); - HANDLE h = ::FindFirstFileW(path.c_str(), &fd); - if (h != INVALID_HANDLE_VALUE) - { - ::FindClose(h); - } - - return (h != INVALID_HANDLE_VALUE); -} - -vector fileUtil::directoryFileList(const wstring &pattern, const wstring ¤tPath, bool fullPaths, bool preserveCase) throw() -{ - vector result; - WIN32_FIND_DATAW fd = {0}; - wstring search = pattern; - - if (search.empty()) - { - return result; - } - - // look at the path and see if it's been setup correctly i.e has a .\ on the front for relative searches - if (!((search[1] == ':' && search[2] == '\\') || - (search[0] == '\\' && search[1] == '\\') || - (search[0] == '.' && search[1] == '\\') || - (search[0] == '.' && search[1] == '.' && search[2] == '\\'))) - { - if (!currentPath.empty()) - { - search = currentPath + search; - } - else - { - search = gStartupDirectory.toWString() + search; - } - } - - wstring path = search.substr(0,search.rfind(L"\\")); - HANDLE h = ::FindFirstFileW(search.c_str(),&fd); - if (h != INVALID_HANDLE_VALUE) - { - do - { - if (fullPaths) - { - if (preserveCase) - { - result.push_back((path + L"\\" + fd.cFileName)); - } - else - { - result.push_back(toLower(path + L"\\" + fd.cFileName)); - } - } - else - { - if (preserveCase) - { - result.push_back((fd.cFileName)); - } - else - { - result.push_back(toLower(wstring(fd.cFileName))); - } - } - } - while(::FindNextFileW(h,&fd)); - } - - if (h != INVALID_HANDLE_VALUE) - { - ::FindClose(h); - } - - return result; -} - -#else - -#include -#include -#include - -utf8 fileUtil::getFullFilePath(const uniFile::filenameType &partial_path) throw() -{ - char resolved_path[MAXPATHLEN + 1] = {0}; - if (realpath(partial_path.hideAsString().c_str(), resolved_path)) - { - return utf8(resolved_path); - } - return partial_path; -} - -bool fileUtil::fileExists(const uniFile::filenameType &fullPath) throw() -{ - struct stat sbuf; - return (::stat(fullPath.hideAsString().c_str(),&sbuf) ? false : true); -} - -bool fileUtil::directoryExists(const uniFile::filenameType &fullPath) throw() -{ - glob_t gt; - bool found = false; - - if (glob(fullPath.hideAsString().c_str(),GLOB_NOSORT,0,>) == 0) - { - found = true; - } - - globfree(>); - return found; -} - -std::vector fileUtil::directoryFileList(const std::string &pattern, const std::string ¤tPath) throw() -{ - vector result; - - glob_t gt; - - string search = pattern; - - if (search.empty()) - { - return result; - } - - // look at the path and see if it's been setup correctly i.e has a ./ on the front for relative searches - if (!((search[0] == '\\' && search[1] == '\\') || - (search[0] == '/') || - (search[0] == '.' && search[1] == '/') || - (search[0] == '.' && search[1] == '.' && search[2] == '/'))) - { - if (!currentPath.empty()) - { - search = currentPath + search; - } - else - { - search = string("./") + search; - } - } - - if (glob(search.c_str(),GLOB_NOSORT,0,>) == 0) - { - for (size_t x = 0; x < gt.gl_pathc; ++x) - { - result.push_back(gt.gl_pathv[x]); - } - } - - globfree(>); - return result; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h deleted file mode 100644 index 12a1d419..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once -#ifndef _fileUtils_H_ -#define _fileUtils_H_ - -#include -#include -#include -#include "unicode/uniString.h" -#include "unicode/uniFile.h" - -namespace fileUtil -{ - #ifdef _WIN32 - const char filePathDelimiter='\\'; - #else - const char filePathDelimiter='/'; - #endif - - static uniString::utf8 getFilePathDelimiter() - { - #ifdef _WIN32 - return (uniString::utf8)"\\"; - #else - return (uniString::utf8)"/"; - #endif - } - - //******************************************** - //* stripPath - //* - //* remove the path from a filename - //******************************************** - template - S stripPath(const S &s,const S &delim) throw() - { - typename S::size_type pos = s.find_last_of(delim); - if (pos == S::npos) return s; - if (pos == s.size() -1) return S(); - return s.substr(pos+1); - } - - template - S stripPath(const S &s) throw() - { - return fileUtil::stripPath(s,S(1,(typename S::value_type)fileUtil::filePathDelimiter)); - } - - template - S onlyPath(const S &s,const S &delim) throw() - { - typename S::size_type pos = s.find_last_of(delim); - if (pos == S::npos) return S(); - return s.substr(0,pos+1); - } - - template - S onlyPath(const S &s) throw() - { - return fileUtil::onlyPath(s,S(1,(typename S::value_type)fileUtil::filePathDelimiter)); - } - - template - S mustEndIn(const S &s,typename S::value_type c) throw() - { - return ((s.empty() || ((*(s.rbegin())) != c)) ? (s+c) : s); - } - - template - S stripSuffix(const S &s,const S &delim) throw() - { - return s.substr(0,s.rfind(delim)); - } - - template - S stripSuffix(const S &s) throw() - { - return fileUtil::stripSuffix(s,S(1,(typename S::value_type)'.')); - } - - template - S getSuffix(const S &s,const S &delim) throw() - { - S empty; - typename S::size_type pos = s.rfind(delim); - if (pos == S::npos) - return empty; - return s.substr(pos+1); - } - - template - S getSuffix(const S &s) throw() - { - return fileUtil::getSuffix(s,S(1,(typename S::value_type)'.')); - } - - //////////// - - // return true if a file exists - bool fileExists(const uniFile::filenameType &fullPath) throw(); - - // return true if a directory exists - bool directoryExists(const uniFile::filenameType &fullPath) throw(); - - // get list of all files that match a pattern - #ifdef _WIN32 - std::vector directoryFileList(const std::wstring &pattern, const std::wstring ¤tPath, - bool fullPaths, bool preserveCase = false) throw(); - #else - std::vector directoryFileList(const std::string &pattern, const std::string ¤tPath) throw(); - #endif - - bool convertOSFilePathDelimiter(uniString::utf8 &value) throw(); - - uniFile::filenameType getFullFilePath(const uniFile::filenameType &partial) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h deleted file mode 100644 index ffaaeb36..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef intTypes_H_ -#define intTypes_H_ - -#if defined(__APPLE_CC__) | defined(PLATFORM_BSD) -#include -#else -#ifndef WIN32 -#include -#endif -#endif - -#ifndef WIN32 -// these are defined under windows -typedef char __int8; -typedef short __int16; -typedef int __int32; -typedef long long __int64; -#endif - -typedef unsigned char __uint8; -typedef unsigned short __uint16; -typedef unsigned int __uint32; -typedef unsigned long long __uint64; - -#ifdef __cplusplus - - -#undef ByteSwap32 -#undef ByteSwap16 -#undef ByteSwap -#undef bs16 -#undef bs32 -#undef bs -#undef bs16s -#undef bs16u -#undef bs32s -#undef bs32u - -inline __uint32 ByteSwap32u (__uint32 nLongNumber) -{ - return (((nLongNumber&0x000000FF)<<24)+((nLongNumber&0x0000FF00)<<8)+ - ((nLongNumber&0x00FF0000)>>8)+((nLongNumber&0xFF000000)>>24)); -} - -inline __uint16 ByteSwap16u (__uint16 nValue) -{ - return (((nValue>> 8)) | (nValue << 8)); - -} - -inline __int16 ByteSwap16s(__int16 nValue) { return ByteSwap16u(nValue); } -inline __int32 ByteSwap32s(__int32 nValue) { return ByteSwap32u(nValue); } - -inline __uint16 ByteSwap(__uint16 nValue) { return ByteSwap16u(nValue); } -inline __uint32 ByteSwap(__uint32 nValue) { return ByteSwap32u(nValue); } -inline __int16 ByteSwap(__int16 nValue) { return ByteSwap16u(nValue); } -inline __int32 ByteSwap(__int32 nValue) { return ByteSwap32u(nValue); } - -#ifdef __BYTE_ORDER - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define bs16(x) (x) -#define bs16s(x) (x) -#define bs16u(x) (x) -#define bs32(x) (x) -#define bs32s(x) (x) -#define bs32u(x) (x) -#define bs(x) (x) -#else -#if __BYTE_ORDER == __BIG_ENDIAN -#define bs16(x) ByteSwap16u(x) -#define bs16s(x) ByteSwap16s(x) -#define bs16u(x) ByteSwap16u(x) -#define bs32(x) ByteSwap32u(x) -#define bs32s(x) ByteSwap32s(x) -#define bs32u(x) ByteSwap32u(x) -#define bs(x) ByteSwap(x) -#else -//#error "No endian defined (__BYTE_ORDER)" -#endif -#endif - -#else - -#ifdef BYTE_ORDER - -#if BYTE_ORDER == LITTLE_ENDIAN -#define bs16(x) (x) -#define bs16s(x) (x) -#define bs16u(x) (x) -#define bs32(x) (x) -#define bs32s(x) (x) -#define bs32u(x) (x) -#define bs(x) (x) -#else -#if BYTE_ORDER == BIG_ENDIAN -#define bs16(x) ByteSwap16u(x) -#define bs16s(x) ByteSwap16s(x) -#define bs16u(x) ByteSwap16u(x) -#define bs32(x) ByteSwap32u(x) -#define bs32s(x) ByteSwap32s(x) -#define bs32u(x) ByteSwap32u(x) -#define bs(x) ByteSwap(x) -#else -//#error "No endian defined (BYTE_ORDER)" -#endif -#endif - -#else - -//#error "Neither __BYTE_ORDER or BYTE_ORDER is defined" -#endif -#endif - -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h deleted file mode 100644 index 60ac48ef..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _commonmacros_H_ -#define _commonmacros_H_ - -#ifndef NDEBUG -#define DIAG(x) OutputDebugString(x); -#else -#define DIAG(x) -#endif - -/** - * The __TODO__ macro provides a way to notate source code in a way that the - * compiler will recognize and print out the file and line number in the Build - * window. This should be used like so: - * - * #pragma message(__TODO__"Message here") - */ -#define __TODO_STR2__(str) #str -#define __TODO_STR__(str) __TODO_STR2__(str) -#define __TODO__ __FILE__ "(" __TODO_STR__(__LINE__)") : TODO: " - -/* nocopy macros makes an uncopyable object use as follows - class foobar - { - nocopy(foobar) - - public: - // other methods here - }; -*/ -#define nocopy(c) private: c(const c &/*v*/) { ASSERT(0); } c& operator=(const c &/*v*/) { ASSERT(0); return *this;} - -// various forget macros that delete objects and zero them out safely. -#define forget(x) { if (x) { delete x; x = 0; } } -#define forgetArray(x) { if (x) { delete [] x; x = 0; } } -#define safeRelease(x) { if (x) { x->Release(); x = 0; } } -#define forgetHandleNULL(x) { if (x) { ::CloseHandle(x); x = NULL; } } - -#ifdef WIN32 -#define forgetHandleInvalid(x) { if (x != INVALID_HANDLE_VALUE) ::CloseHandle(x); x = INVALID_HANDLE_VALUE; } -#define forgetGDIObject(x) { if (x) ::DeleteObject(x); x = NULL; } -#define forgetGDIIcon(x) { if (x) ::DestroyIcon(x); x = NULL; } - -#ifdef HRESULT -// I do this so often, I turned it into a macro -struct bad_hresult -{ - HRESULT err; - bad_hresult(HRESULT herr): err(herr){} -}; -#endif - -#define checkCOMReturn(x) { HRESULT err = x; if (FAILED(err)) return err; } -#define checkCOMThrow(x) { HRESULT err = x; if (FAILED(err)) throw bad_hresult(err); } -#endif - -// so I don't have to include nsvlib.h all the time -#ifndef NSV_MAKETYPE -#define NSV_MAKETYPE(A,B,C,D) ((A) | ((B)<<8) | ((C)<<16) | ((D)<<24)) -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h deleted file mode 100644 index 2650e7f6..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef refPtr_H_ -#define refPtr_H_ - -#include "threading/thread.h" -#ifdef WIN32 -#include -#else -#include -#endif - -#ifndef WIN32 -#ifndef _ASSERTE -#define _ASSERTE(x) assert(x) -#endif -#endif - -/* - Intrusive reference counted pointer template. - - The class to be reference counted must implement - - void refIncrement() const // increment the reference count - int refDecrement() const // decrement the reference count and return the new value. - - Yes, the methods are const. This provides maximum flexibility. - Obviously the reference counted values must be mutable for this to work. - - Two predefined bases are provided. - - refCountBase - non locking base for single threaded scenarios - refCountBaseMT - locking base for multi threaded scenarios - -*/ - -// base class for single threaded reference count objects -class refCountBase -{ -template friend class refPtr; -public: - /// return the number of references to this object (useful for debugging) - int refCount() const { return m_refCount; } - -protected: - refCountBase() : m_refCount(0) {} - virtual ~refCountBase() - { - // make sure nobody has deleted this directly with delete - _ASSERTE(m_refCount == 0); - } - -private: - mutable int m_refCount; - - void refIncrement() const { _ASSERTE(m_refCount >= 0); ++m_refCount; } - - int refDecrement() const { _ASSERTE(m_refCount > 0); return --m_refCount; } -}; - -// base class for multi threaded reference count objects -class refCountBaseMT -{ -template friend class refPtr; -public: - /// return the number of references to this object (useful for debugging) - int refCount() const - { - stackLock sl(m_lock); - return m_refCount; - } - -protected: - refCountBaseMT() : m_refCount(0) {} - virtual ~refCountBaseMT() - { - // make sure nobody has deleted this directly with delete - _ASSERTE(m_refCount == 0); - } - -private: - mutable int m_refCount; - mutable AOL_namespace::mutex m_lock; - - void refIncrement() const - { - stackLock sl(m_lock); - _ASSERTE(m_refCount >= 0); - ++m_refCount; - } - - int refDecrement() const - { - stackLock sl(m_lock); - _ASSERTE(m_refCount > 0); - return --m_refCount; - } -}; - -template class refPtr -{ -public: - typedef T *pointer_t; - - // construction - refPtr() : m_object(NULL) {} - - refPtr(const refPtr &rhs) : m_object(rhs.m_object) - { - if (m_object) - m_object->refIncrement(); - } - - refPtr(T *object) : m_object(object) - { - if (m_object) - m_object->refIncrement(); - } - - ~refPtr() - { - if (m_object && (m_object->refDecrement() == 0)) - delete m_object; - } - - // asignment - refPtr &operator=(const refPtr &rhs) - { - if (m_object != rhs.m_object) - { - if (m_object && (m_object->refDecrement() == 0)) - delete m_object; - m_object = rhs.m_object; - if (m_object) - m_object->refIncrement(); - } - return *this; - } - - /// test if pointers are the same - inline bool operator==(const refPtr &rhs) const - { - return m_object == rhs.m_object; - } - - inline bool operator==(void *nl) const - { - return m_object == nl; - } - - /// test if pointers are not the same - inline bool operator!=(const refPtr &rhs) const - { - return m_object != rhs.m_object; - } - - inline bool operator!=(void *nl) const - { - return m_object != nl; - } - - // dereferencing - T *operator->() const { _ASSERTE(m_object); return (T *)m_object; } - T &operator*() const { _ASSERTE(m_object); return *((T *)m_object); } - operator T *() const { return (T *)m_object; } - - /// explicit get - do NOT delete this pointer! - T *get() const { return (T *)m_object; } - - /* these member templates allows conversion of this smart pointer to - other smart pointers in the parent hierarchy. This simulates up-casting - the pointer to a base */ - template - operator refPtr() { return refPtr((T *)m_object); } - - template - operator const refPtr() const { return refPtr((T *)m_object); } - -private: - T *m_object; -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp deleted file mode 100644 index b1445cba..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "baseOptions.h" -#include "stl/stringUtils.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#else -#include "unixversion.h" -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -bool baseOptions::toBool(const utf8 &s) throw() -{ - if (s.empty()) return true; - utf8 ss = toLower(s); - return (s[0] == 't' || s[0] == '1' || s[0] == 'y'); -} - -const vector baseOptions::fromArgs(const vector &cl) throw() -{ - vector unused; - - for (vector::const_iterator i = cl.begin(); i != cl.end(); ++i) - { - utf8::size_type colon_pos = (*i).find(utf8(":")); - if (colon_pos != utf8::npos) - { - utf8 key = (*i).substr(0,colon_pos); - utf8 value = (*i).substr(colon_pos+1); - if (key == "flog") - { - m_fileLog = value; - } - else if (key == "clog") - { - m_consoleLogging = toBool(value); - } - else - { - unused.push_back(*i); - } - } - else - { - unused.push_back(*i); - } - } - - return unused; -} - -utf8 baseOptions::getVersionBuildStrings() throw() -{ -#ifdef _WIN32 - static utf8 version; - if (version.empty()) - { - getVersionInfo(version); - } -#else - static utf8 version; - if (version.empty()) - { - for (int x = 0; x < VENT; ++x) - { - if (x) - { - version += "."; - } - version += tos(PRODUCTVERSION[x]); - } - } -#endif - return version; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h deleted file mode 100644 index 96d96dbe..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#ifndef baseOptions_H_ -#define baseOptions_H_ - -#include -#include -#include "unicode/uniFile.h" -#include "services/logger.h" - -struct baseOptions -{ - uniFile::filenameType m_fileLog; - bool m_consoleLogging; - - // convert a string to a boolean - static bool toBool(const uniString::utf8 &s) throw(); - - // process command line options. Options are key:value pairs. All unprocessed - // options are returned - const std::vector fromArgs(const std::vector &cl) throw(); - - const uniFile::filenameType &getFileLog() const throw() { return m_fileLog; } - bool getConsoleLogging() const throw() { return m_consoleLogging; } - #ifdef _WIN32 - static uniString::utf8 getSystemLogConfigString() throw() { return AOL_logger::systemLogger_element::panicConfiguration(); } - #else - static uniString::utf8 getSystemLogConfigString() throw() { return "";} - #endif - static uniString::utf8 getVersionBuildStrings() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp deleted file mode 100644 index 3e8bf438..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp +++ /dev/null @@ -1,966 +0,0 @@ -#include "logger.h" -#include -#include -#include "stl/functors.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "../../global.h" - -#ifndef _WIN32 -#include -#include -#include -#include -#endif - -#ifdef _WIN32 -#define __F__ __FUNCTION__ -#else -#define __F__ string(__PRETTY_FUNCTION__) + -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -//////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////// LOGGER ELEMENTS /////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////// - -#ifdef _WIN32 -//////////// Win32 File Logger - -inline uniFile::filenameType AOL_logger::fileLogger_element::make_backup_log(const uniFile::filenameType &filename,int which) throw() -{ - return fileUtil::stripSuffix(filename) + "_" + - tobs(which) + "." - + fileUtil::getSuffix(filename); -} - -uniFile::filenameType AOL_logger::fileLogger_element::make_archive_log() throw() -{ - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - wchar_t d[100] = {0}, t[100] = {0}; - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("yyyy'_'MM'_'dd"),d,99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("HH'_'mm'_'ss"),t,99); - return tos((const wchar_t *)d) + "_" + tos((const wchar_t *)t); -} - -void AOL_logger::fileLogger_element::rotate() throw() -{ - m_lastRolloverTime = ::time(NULL); - - if (m_file == INVALID_HANDLE_VALUE || m_first == false) - { - return; - } - - // close the log - forgetHandleInvalid(m_file); - - // rotate - for (int x = m_numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(m_fileName,x); - - // archive the log file about to be removed into a gz file - if (m_numFileBackups > 0 && x == m_numFileBackups && m_archiveFileBackups) - { - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_"+tos(m_numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0,pos) + utf8("_log_" + make_archive_log() + ".gz")); - - HANDLE m_archive = ::CreateFileW(archive.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_archive != INVALID_HANDLE_VALUE) - { - DWORD written(0); - utf8 out; - z_stream m_stream = {0}; - - if (uniFile::fileSize(dest) > 0) - { - FILE* m_logFile = uniFile::fopen(dest,"rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - } - } - - compressDataFinish(out, &m_stream); - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - forgetHandleInvalid(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - forgetHandleInvalid(m_archive); - uniFile::unlink(archive); - } - } - } - } - } - ::DeleteFileW(dest.toWString().c_str()); - ::MoveFileW( - ((x-1) ? make_backup_log(m_fileName,(x-1)).toWString().c_str() - : m_fileName.toWString().c_str()), - dest.toWString().c_str()); - } - - // open new log - m_file = ::CreateFileW(m_fileName.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); -} - -AOL_logger::fileLogger_element::fileLogger_element(const uniFile::filenameType &filename, const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, bool archive, int rolloverInterval, size_t SID) throw(exception) - - : m_fileName(filename), m_file(INVALID_HANDLE_VALUE), m_lastRolloverTime(0), m_rolloverInterval(rolloverInterval), m_numFileBackups(backups), - m_archiveFileBackups(archive), m_first(false), m_SID(SID) -{ - // this will fill in the default log path as required - wchar_t s_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(defaultFilename.toWString().c_str(), s_defaultFileName, MAX_PATH); - utf8 m_defaultFilename(utf32(s_defaultFileName).toUtf8()); - - useDefaultPath = false; - m_file = ::CreateFileW(m_fileName.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - m_file = ::CreateFileW(m_defaultFilename.toWString().c_str(),GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - uniFile::filenameType fallbackFilename("%temp%\\sc_serv_" + tos(getpid()) + ".log"); - wchar_t s_fallbackFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(fallbackFilename.toWString().c_str(), s_fallbackFileName, MAX_PATH); - utf8 m_fallbackFilename(utf32(s_fallbackFileName).toUtf8()); - m_file = ::CreateFileW(m_fallbackFilename.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = m_fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } - - ::SetFilePointer(m_file,0,0,FILE_END); // seek to end - if (m_fileName == m_defaultFilename) - { - useDefaultPath = true; - } - - gOptions.setOption(utf8("reallogfile"), m_fileName); - - // using this to prevent rotating empty log files on startup - m_first = fileUtil::fileExists(m_fileName.hideAsString()); - if (m_first && !uniFile::fileSize(m_fileName)) - { - m_first = false; - } - - rotate(); -} - -AOL_logger::fileLogger_element::~fileLogger_element() throw() -{ - forgetHandleInvalid(m_file); -} - -void AOL_logger::fileLogger_element::log(message &m) throw(exception) -{ - time_t t = ::time(NULL); - if (t < m_lastRolloverTime || (((t - m_lastRolloverTime) > m_rolloverInterval) && m_rolloverInterval)) - { - rotate(); - rotatew3cFiles("w3c"); - } - if (m.m_alreadyLogged) - return; - if (m_SID != m.m_streamID && m_SID) - { - return; - } - m.m_alreadyLogged = true; - m_first = true; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map *fields = m.getFields(); - if (fields) - { - for (map::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - ss += msg; - ss += eol(); - - if (m_file == INVALID_HANDLE_VALUE) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } - - DWORD written(0); - if ((!::WriteFile(m_file, ss.c_str(), (DWORD)ss.size(), &written, NULL)) || (written != ss.size())) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } -} - -#else - -/////////// Unix File Logger - -uniFile::filenameType AOL_logger::fileLogger_element::make_backup_log(const uniFile::filenameType &filename,int which) throw() -{ - return fileUtil::stripSuffix(filename) + "_" + tos(which) + "." + fileUtil::getSuffix(filename); -} - -uniFile::filenameType AOL_logger::fileLogger_element::make_archive_log() throw() -{ - char buf[256] = {0}; - struct tm ttm; - time_t ttt; - ::time(&ttt); - ::strftime(buf, 255, "%Y_%m_%d_%H_%M_%S", ::localtime_r(&ttt, &ttm)); - return buf; -} - -void AOL_logger::fileLogger_element::rotate() throw() -{ - m_lastRolloverTime = ::time(NULL); - - if ((m_file == -1) || (m_first == false)) - { - return; - } - - // close the log - ::close(m_file); - m_file = -1; - - // rotate - for (int x = m_numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(m_fileName,x); - - // archive the log file about to be removed into a gz file - if (m_numFileBackups > 0 && x == m_numFileBackups && m_archiveFileBackups) - { - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_"+tos(m_numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0,pos) + utf8("_log_" + make_archive_log() + ".gz")); - - int m_archive = ::open(archive.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_archive != -1) - { - utf8 out; - z_stream m_stream = {0}; - - if (uniFile::fileSize(dest) > 0) - { - FILE* m_logFile = uniFile::fopen(dest,"rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::write(m_archive,out.c_str(),out.size()); - } - } - - compressDataFinish(out, &m_stream); - ::write(m_archive,out.c_str(),out.size()); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - ::close(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - ::close(m_archive); - uniFile::unlink(archive); - } - } - } - } - } - - ::remove(dest.hideAsString().c_str()); - ::rename( - ((x-1) ? make_backup_log(m_fileName,(x-1)).hideAsString().c_str() - : m_fileName.hideAsString().c_str()), - dest.hideAsString().c_str()); - } - - // open new log - m_file = ::open(m_fileName.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); -} - -AOL_logger::fileLogger_element::fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID) throw(exception): - m_fileName(filename), m_file(-1), m_lastRolloverTime(0), - m_rolloverInterval(rolloverInterval), m_numFileBackups(backups), - m_archiveFileBackups(archive), m_first(false), m_SID(SID) -{ - umask(0); - useDefaultPath = false; - m_file = ::open(filename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - if (SID == 0) - m_file = ::open (defaultFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - uniFile::filenameType fallbackFilename("/tmp/sc_serv_" + tos(getpid()) + ".log"); - m_file = ::open(fallbackFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = fallbackFilename; - } - } - else - { - m_fileName = defaultFilename; - } - } - - if (m_fileName == defaultFilename) - { - useDefaultPath = true; - } - - gOptions.setOption(utf8("reallogfile"), m_fileName); - - // using this to prevent rotating empty log files on startup - m_first = fileUtil::fileExists(m_fileName.hideAsString()); - if (m_first && !uniFile::fileSize(m_fileName)) - { - m_first = false; - } - - rotate(); -} - -AOL_logger::fileLogger_element::~fileLogger_element() throw() -{ - if (m_file != -1) - ::close(m_file); - m_file = -1; -} - -void AOL_logger::fileLogger_element::log(message &m) throw(exception) -{ - time_t t = ::time(NULL); - if (t < m_lastRolloverTime || (((t - m_lastRolloverTime) > m_rolloverInterval) && m_rolloverInterval)) - { - rotate(); - rotatew3cFiles("w3c"); - } - if (m.m_alreadyLogged) - return; - if (m_SID != m.m_streamID && m_SID) - { - return; - } - m.m_alreadyLogged = true; - m_first = true; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map *fields = m.getFields(); - if (fields) - { - for (map::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - ss += " "; - } - ss += msg; - ss += eol(); - - if (m_file == -1) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } - - if (::write(m_file,ss.c_str(),ss.size()) == -1) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } -} - -#endif - -#ifdef _WIN32 -//////// Win32 console logger - -AOL_logger::consoleLogger_element::consoleLogger_element() throw(exception) : m_stdoutConsole(NULL), m_stderrConsole(NULL) -{ - ::AllocConsole(); - ::SetConsoleOutputCP(65001); // utf-8 - ::SetConsoleCP(CP_UTF8);//65001); - - m_stdoutConsole = ::GetStdHandle(STD_OUTPUT_HANDLE); - m_stderrConsole = ::GetStdHandle(STD_ERROR_HANDLE); - - if ((!m_stdoutConsole) || (!m_stderrConsole)) - { - throw runtime_error("Logger could not open console"); - } -} - -AOL_logger::consoleLogger_element::~consoleLogger_element() throw() -{ - if (m_stdoutConsole != NULL) - { - ::FreeConsole(); - m_stdoutConsole = NULL; - m_stderrConsole = NULL; - } -} - -void AOL_logger::consoleLogger_element::log(message &m) throw(exception) -{ - static const DWORD maxLogLine=2048; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - - const utf8 &msg = m.getMsg(); - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map *fields = m.getFields(); - if (fields) - { - for (map::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - - ss += m.getMsg(); - ss += eol(); - - HANDLE h = (m.getType() == AOL_logger::message::BM_ERROR ? m_stderrConsole : m_stdoutConsole); - if (h != INVALID_HANDLE_VALUE) - { - // see if we need to colour the output - only used for errors and warnings - AOL_logger::message::message_t type = m.getType(); - bool painted = false; - CONSOLE_SCREEN_BUFFER_INFO csbiInfo = {0}; - WORD wOldColorAttrs = 0; - if (type != AOL_logger::message::BM_INFO && GetConsoleScreenBufferInfo(h, &csbiInfo)) - { - wOldColorAttrs = csbiInfo.wAttributes; - - // red for error, yellow for warnings, green for debug, blue for update - if (type == AOL_logger::message::BM_ERROR) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY); - } - else if (type == AOL_logger::message::BM_WARNING) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); - } - else if (type == AOL_logger::message::BM_DEBUG) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_GREEN); - } - else if (type == AOL_logger::message::BM_UPDATE) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_BLUE); - } - } - - // utf8 sometimes returns a size that does not match input - DWORD written(0); - DWORD amtToWrite = (DWORD)ss.size(); - bool truncated = false; - if (amtToWrite > maxLogLine) - { - amtToWrite = maxLogLine; - truncated = true; - } - - if (truncated) - { - utf8 truncateMsg = m.getTimestamp() + "\t" + ((char)message::BM_WARNING) + "\t[MAIN] Next line is truncated" + eol(); - ::WriteFile(h,truncateMsg.c_str(),(DWORD)truncateMsg.size(),&written,NULL); - written = 0; - } - - if (::WriteFile(h,ss.c_str(),amtToWrite,&written,NULL)) - { - if (truncated) - { - // eol - written = 0; - ::WriteFile(h,eol().c_str(),(DWORD)eol().size(),&written,NULL); - } - } - - // revert the colouring if we needed to change it - if (painted) - { - SetConsoleTextAttribute(h, wOldColorAttrs); - } - } -} - -#else -/////// Unix console logger - -AOL_logger::consoleLogger_element::consoleLogger_element() throw(exception) : - m_stdoutConsole(STDOUT_FILENO), m_stderrConsole(STDERR_FILENO) -{ - if ((m_stdoutConsole == -1) || (m_stderrConsole == -1)) - { - throw runtime_error("Logger could not open console"); - } -} - -AOL_logger::consoleLogger_element::~consoleLogger_element() throw() -{ - m_stdoutConsole = m_stderrConsole = -1; -} - -void AOL_logger::consoleLogger_element::log(message &m) throw(exception) -{ - utf8 sc = ""; - // see if we need to colour the output - only used for errors, warnings and debugs - AOL_logger::message::message_t type = m.getType(); - if (type != AOL_logger::message::BM_INFO) - { - // red for error, yellow for warnings, green for debug, blue for update - if (type == AOL_logger::message::BM_ERROR) - { - sc = "\033[01;31m"; - } - else if (type == AOL_logger::message::BM_WARNING) - { - sc = "\033[01;33m"; - } - else if (type == AOL_logger::message::BM_DEBUG) - { - sc = "\033[0;32m"; - } - else if (type == AOL_logger::message::BM_UPDATE) - { - sc = "\033[0;34m"; - } - } - - utf8 ss = sc + m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - const map *fields = m.getFields(); - if (fields) - { - for (map::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - - ss += m.getMsg(); - ss += eol() + (!sc.empty() ? "\033[0m" : ""); - - int console = (m.getType() == AOL_logger::message::BM_ERROR ? m_stderrConsole : m_stdoutConsole); - - if (console != -1) - { - ::write(console,ss.c_str(),ss.size()); - } -} -#endif - -#ifdef _WIN32 - -// Win32 system logger -void AOL_logger::systemLogger_element::registerEventLog(const utf8 &log_object_name, - const uniFile::filenameType &fullExePath) throw() -{ - HKEY key = NULL; - DWORD disposition = 0; - - wstring regEntry = L"System\\CurrentControlSet\\Services\\EventLog\\Application\\"; - regEntry += log_object_name.toWString(); - - LONG err = ::RegCreateKeyExW(HKEY_LOCAL_MACHINE, regEntry.c_str(), 0, NULL, - REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &key, &disposition); - - if (err == ERROR_SUCCESS) - { - DWORD ts = 1; - wstring widePath = fullExePath.toWString(); - ::RegSetValueExW(key,L"EventMessageFile",0,REG_SZ,(const BYTE *)widePath.c_str(),(DWORD)((fullExePath.size() + 1) * 2)); - ::RegSetValueExW(key,L"TypesSupported",0,REG_DWORD,(const BYTE *)&ts,sizeof(ts)); - ::RegCloseKey(key); - } -} - -AOL_logger::systemLogger_element::systemLogger_element(const utf8 &log_object_name, - const uniFile::filenameType &fullExePath, - const utf8 &loggerConfigString) throw(exception) - : m_systemLog(NULL), m_loggerConfigString(loggerConfigString) -{ - registerEventLog(log_object_name,fullExePath); - m_systemLog = ::RegisterEventSourceW(NULL, // uses local computer - log_object_name.toWString().c_str()); // source name - if (m_systemLog == NULL) - { - throw runtime_error("Could not register the event source for the system logs."); - } -} - -AOL_logger::systemLogger_element::~systemLogger_element() throw() -{ - if (m_systemLog != NULL) - { - ::DeregisterEventSource(m_systemLog); - m_systemLog = NULL; - } -} - -static WORD charToLogType(char c) throw() -{ - if (c == 'E') - { - return EVENTLOG_ERROR_TYPE; - } - if (c == 'W') - { - return EVENTLOG_WARNING_TYPE; - } - if (c == 'I') - { - return EVENTLOG_INFORMATION_TYPE; - } - return 0; -} - -static WORD messageTypeToLogType(AOL_logger::message::message_t t, const utf8 &configString) throw() -{ - if (configString.size() < 5) - { - return EVENTLOG_ERROR_TYPE; - } - - switch (t) - { - case AOL_logger::message::BM_INFO: - { - return charToLogType(configString[3]); - } - case AOL_logger::message::BM_WARNING: - { - return charToLogType(configString[2]); - } - case AOL_logger::message::BM_ERROR: - { - return charToLogType(configString[0]); - } - case AOL_logger::message::BM_DEBUG: - { - return charToLogType(configString[4]); - } - } - return 0; -} - -void AOL_logger::systemLogger_element::log(message &m) throw(exception) -{ - if (m_systemLog == NULL) - { - throw runtime_error(__F__ " Error writing to system log"); - } - - const map *fields = m.getFields(); - - utf8 ss; - if (fields) - { - for (map::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += (!ss.empty() ? "\t" : "") + (*i).second; - } - else - { - return; - } - } - } - } - ss += m.getMsg(); - if (!ss.empty()) - { - utf32 u32(stripWhitespace(ss)); - utf16 u16(u32.toUtf16(true)); - - const wchar_t *s = (const wchar_t *)u16.c_str(); - WORD et = messageTypeToLogType(m.getType(), m_loggerConfigString); - if (et) - { - ::ReportEventW(m_systemLog, // event log handle - et, // event type - 0, // category 0 - ((DWORD)0xC0000001L), // event identifier - NULL, // no user security identifier - 1, // one substitution string - 0, // no data - &s, // pointer to string array - NULL); - } - } -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h deleted file mode 100644 index 1cd634de..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h +++ /dev/null @@ -1,461 +0,0 @@ -#pragma once -#ifndef logger_H_ -#define logger_H_ - -#ifdef _WIN32 -#include -#include -#endif -#include -#include -#include -#include -#include -#include "unicode/uniFile.h" -#include "stl/stringUtils.h" -#include "stl/functors.h" -#include "threading/messageThread.h" -#include "unicode/uniFile.h" - -namespace AOL_logger -{ - /* - A function object, used in conjunction with the messageThread template to create a - thread safe logging entity which runs on it's own thread. - - The logger is meant to be run in the context of a messageThread object like so: - - extern messageThread *gLog; - - You post messages using the postMessage method from the messageThread class - - gLog->postMessage(whatever); - - The E (logger element) type has the following requirements - - 1) Must be a heap element that can be deleted. - 2) An install() method which is called when the element becomes part of - the logging system. Install may throw an exception - 3) An uninstall() mehod which is called when before the log element is - destroyed by the logger system. It MUST NOT throw an exception. - - The M (message) type has the following requirements - - 1) Must support a static makeError(const uniString::utf8 &s) throw() for - constructing an error message - 2) Must have - bool done() const throw() - which returns true to indicate it's a message to shutdown the logger - 3) Any other signatures required by the logger element - */ - - class message; - template class logger_element; - - template > - class logger - { - // NOTE: logger takes ownership of the elements and deletes them - // when done. - private: - std::vector m_elements; - - void uninstallElements() throw() - { - std::for_each(m_elements.begin(), m_elements.end(), std::mem_fun(&E::uninstall)); - } - - public: - typedef M message_t; - - // constructors. If the constructor succeeds (does not throw), then this - // logger object has posession of the elements, and will delete them - // itself. - logger() throw() {} - - // create the logger with a single element. An exception - // means that the element was not added. The logger has not taken - // posession of the element and it's up to the caller to delete it. - explicit logger(E *e) throw(std::exception) - { - addElement(e); - } - - // create the logger from a container of elements. If the install() method - // of any element throws, then this constructor will throw. All methods that - // were installed() will be uninstalled() but NO elements will be deleted. Thatt - // is up to the caller. - template - logger(ITER first,ITER last) throw (std::exception) - { - try - { - addElement(first, last); - } - catch(...) - { - uninstallElements(); - m_elements.clear(); - throw; - } - } - - ///////////////////////// - - // destructor - ~logger() throw() - { - uninstallElements(); - std::for_each(m_elements.begin(), m_elements.end(), stlx::delete_fntr); - } - - // warning... there is no lock protection. Do not add a logger element - // while the thread is running - void addElement(E *e) throw(std::exception) - { - // note: element is not added to internal list if install() throws - e->install(); - m_elements.push_back(e); - } - - // if any element throws, then all the ones passed in will be uninstalled if - // they were installed, and no objects in the list will be taken posession of - template - void addElement(ITER first, ITER last) throw(std::exception) - { - std::vector tmp; - try - { - for (ITER i = first; i != last; ++i) - { - (*i)->install(); - tmp.push_back(*i); - } - } - catch(...) - { - for (typename std::vector::const_iterator i = tmp.begin(); i != tmp.end(); ++i) - { - (*i)->uninstall(); - } - throw; - } - m_elements.insert(m_elements.end(), tmp.begin(), tmp.end()); - } - - ////////////////////////////////////////////////////// - - // main dispatch loop - bool operator()(M &m) throw() - { - if (m.done()) // if this is the done message, exit the loop - { - return false; - } - - if (m.rotate()) - { - for (typename std::vector::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) - { - (*i)->rotate(); - } - return true; - } - - for (typename std::vector::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) - { - try - { - (*i)->log(m); - } - catch (const std::exception &ex) - { - // on an exception, create an error message and dispatch it to everyone - // via their 'NOTHROW' handler - M mex = M::makeError(ex.what()); - for (typename std::vector::const_iterator ix = m_elements.begin(); ix != m_elements.end(); ++ix) - { - (*ix)->logNOTHROW(mex); - } - } - } - return true; - } - }; - -/////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// Here is a basic set of elements you can use /////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////// - - class fileLogger_element; - - // the message class - class message - { - public: - typedef enum - { - BM_DONE, - BM_ROTATE, - BM_ERROR = 'E', - BM_WARNING = 'W', - BM_INFO = 'I', - BM_DEBUG = 'D', - BM_UPDATE = 'U' - } message_t; - - size_t m_streamID; - private: - //uniString::utf8 m_typeStr; - friend class AOL_logger::fileLogger_element; - - uniString::utf8 m_timestamp; - std::map *m_fields; - uniString::utf8 m_msg; - const char *m_section; - message_t m_type; - bool m_alreadyLogged; - - static uniString::utf8 timeStamp() throw() - { -#ifdef _WIN32 - SYSTEMTIME lastTime = {0}; - wchar_t d[100] = {0}, t[100] = {0}; - uniString::utf8 lastMsg; - - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, _T("yyyy'-'MM'-'dd"), d, 99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, _T("HH':'mm':'ss"), t, 99); - lastMsg = stringUtil::tos((const wchar_t *)d) + " " + stringUtil::tos((const wchar_t *)t); - return lastMsg; -#else - char buf[32] = {0}; - - struct tm ttm; - time_t ttt = ::time(NULL); - ::strftime(buf, sizeof (buf), "%Y-%m-%d %H:%M:%S", ::localtime_r(&ttt, &ttm)); - return buf; -#endif - } - - message (const message_t m, const uniString::utf8 &msg, const char *section = NULL, size_t id = 0) - : m_streamID(id), m_timestamp(timeStamp()), m_fields(NULL), m_msg(msg), m_section(section), m_type(m), m_alreadyLogged(false) { } - - message(const message_t m, const char *msg, const char *section = NULL, size_t id = 0) - : m_streamID(id), m_timestamp(timeStamp()), m_fields(NULL), m_msg(msg), m_section(section), m_type(m), m_alreadyLogged(false) { } - - message(const message_t m, const char *section = NULL, size_t id = 0, const std::map *fields = NULL) - : m_streamID(id), m_timestamp(timeStamp()), m_section(section), m_type(m), m_alreadyLogged(false) - { - if (fields) - m_fields = new std::map (*fields); - } - - public: - inline bool done() const throw() { return (m_type == BM_DONE); } - inline bool rotate() const throw() { return (m_type == BM_ROTATE); } - - inline message_t getType() const throw() { return m_type; } - inline void setType(message_t m) { m_type = m; } - inline const uniString::utf8 &getTimestamp() const throw() { return m_timestamp; } - inline const std::map *getFields() const throw() { return m_fields; } - inline const char *fromSection() const throw() { return m_section; } - inline const uniString::utf8 &getMsg() const throw() { return m_msg; } - inline size_t getID() const throw() { return m_streamID; } - - static message makeDone() throw() { return message(BM_DONE); } - static message makeRotate() throw() { return message(BM_ROTATE); } - static message makeUpdate (const std::map *f) throw() { return message(BM_UPDATE,NULL,0,f); } - static message makeDebug (const std::map *f) throw() { return message(BM_DEBUG,NULL,0,f); } - static message makeInfo (const std::map *f) throw() { return message(BM_INFO,NULL,0,f); } - - static message makeUpdate (const uniString::utf8 &s) throw() { std::map f; f["msg"] = s; return message(BM_UPDATE,NULL,0,&f); } - - static message makeDebug (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_DEBUG,s,sct,id); } - static message makeDebug (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_DEBUG,s,sct,id); } - - static message makeInfo (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_INFO,s,sct,id); } - static message makeInfo (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_INFO,s,sct,id); } - - static message makeWarning (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_WARNING,s,sct,id); } - static message makeWarning (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_WARNING,s,sct,id); } - - static message makeError (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_ERROR,s,sct,id); } - static message makeError (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_ERROR,s,sct,id); } - - const char *typeAsStr() const - { - const char *str; - switch (m_type) - { - case BM_INFO: str = "INFO"; break; - case BM_ERROR: str = "ERROR"; break; - case BM_WARNING: str = "WARN"; break; - case BM_DEBUG: str = "DEBUG"; break; - case BM_UPDATE: str = "UPDATE"; break; - default: str = ""; break; - } - return str; - } - }; - - // a base virtual message class for use by the logger - template - class logger_element - { - protected: - // the message class used by the logger - - private: - virtual void install() throw(std::exception) = 0; - virtual void log(M &m) throw(std::exception) = 0; - virtual void logNOTHROW(M &m) throw() { try { log(m); } catch(...){} } - virtual void uninstall() throw() = 0; - virtual void rotate() throw() {} - - public: - virtual ~logger_element() throw() {} - friend class AOL_logger::logger >; - }; - -//////////////////////////////////////////////////////////////////////////////////// -///////////////////////// WIN32 ELEMENTS /////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -#ifdef _WIN32 - // Win32 file logger - class fileLogger_element: public logger_element - { - private: - uniFile::filenameType m_fileName; - HANDLE m_file; - time_t m_lastRolloverTime; - const int m_rolloverInterval; - const int m_numFileBackups; - const bool m_archiveFileBackups; - bool m_first; - size_t m_SID; - - void rotate() throw(); - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - static uniFile::filenameType make_backup_log(const uniFile::filenameType &filename, int which) throw(); - static uniFile::filenameType make_archive_log() throw(); - - public: - fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID = 0) throw(std::exception); - ~fileLogger_element() throw(); - }; - - class consoleLogger_element: public logger_element - { - private: - HANDLE m_stdoutConsole; - HANDLE m_stderrConsole; - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - public: - consoleLogger_element() throw(std::exception); - ~consoleLogger_element() throw(); - }; - - class systemLogger_element: public logger_element - { - private: - HANDLE m_systemLog; - const uniString::utf8 m_loggerConfigString; - - void registerEventLog(const uniString::utf8 &log_object_name, - const uniFile::filenameType &fullExePath) throw(); - - virtual void install() throw(std::exception){} - virtual void uninstall() throw() {} - virtual void log(AOL_logger::message &m) throw(std::exception); - - public: - systemLogger_element(const uniString::utf8 &log_object_name, - const uniFile::filenameType &fullExePath, - const uniString::utf8 &loggerConfigString) throw(std::exception); - ~systemLogger_element() throw(); - static uniString::utf8 panicConfiguration() throw() { return "EEW Z"; } - }; - -#else // Unix - - ////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////// Unix ELEMENTS /////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////// - - class fileLogger_element: public logger_element - { - private: - uniFile::filenameType m_fileName; - int m_file; - time_t m_lastRolloverTime; - const int m_rolloverInterval; - const int m_numFileBackups; - const bool m_archiveFileBackups; - bool m_first; - size_t m_SID; - - void rotate() throw(); - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - static uniFile::filenameType make_backup_log(const uniFile::filenameType &filename,int which) throw(); - static uniFile::filenameType make_archive_log() throw(); - - public: - fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID = 0) throw(std::exception); - ~fileLogger_element() throw(); - }; - - class consoleLogger_element: public logger_element - { - private: - int m_stdoutConsole; - int m_stderrConsole; - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - public: - consoleLogger_element() throw(std::exception); - ~consoleLogger_element() throw(); - }; - - // unix system logger (not implemented) - class systemLogger_element: public logger_element - { - private: - virtual void install() throw(std::exception){} - virtual void uninstall() throw() {} - virtual void log(const AOL_logger::message &/*m*/) throw(std::exception){} - - public: - explicit systemLogger_element(const uniString::utf8 &/*srcName*/) throw(){} - ~systemLogger_element() throw(){} - }; - - #endif - typedef messageThread > > stdLog_t; -} // namespace AOLLogger - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc deleted file mode 100644 index 8b3a4be8..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc +++ /dev/null @@ -1,7 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 - - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp deleted file mode 100644 index 915cbb3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp +++ /dev/null @@ -1,876 +0,0 @@ -#include "serviceMain.h" -#include -#include -#include -#include "expat.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "../../versions.h" -#include "../../global.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#include -#include -#else -#ifdef PLATFORM_LINUX -#include "../stacktrace/StackTrace.h" -#endif -#include -#include "unixversion.h" -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __APPLE_CC__ -#include -#include "file/fileUtils.h" -#endif -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#ifndef _WIN32 -#define TRUE true -#define FALSE false -#endif - -// are we running as a daemon or service -bool sDaemon = false; - -event serviceMain::sStop(TRUE); -#ifndef _WIN32 -event serviceMain::sWINCH(FALSE); -event serviceMain::sHUP(FALSE); -event serviceMain::sUSR1(FALSE); -event serviceMain::sUSR2(FALSE); -#endif - -#ifdef _WIN32 -static SERVICE_STATUS_HANDLE ssh=NULL; // does not have to be closed - -BOOL WINAPI _console_handler(DWORD fdwCtrlType) -{ - switch (fdwCtrlType) - { - // Handle the CTRL+C signal. - case CTRL_CLOSE_EVENT: - case CTRL_BREAK_EVENT: - case CTRL_C_EVENT: - { - _SetEvent(serviceMain::sStop); - return TRUE; - } - default: - { - return FALSE; - } - } -} - -#else -#ifdef PLATFORM_LINUX -static void custom_signal_handler(int signum) -{ - signal(signum, SIG_DFL); - // http://sourceforge.net/p/stacktrace/code/HEAD/tree/ - // ensure we building with -rdynamic so this works ok - - static char buf[256] = {0}; - static time_t last_ttt; - - struct tm ttm; - time_t ttt = ::time(NULL); - if (ttt != last_ttt) - { - last_ttt = ttt; - ::strftime(buf, 255, "%Y-%m-%d %H:%M:%S", ::localtime_r(&ttt, &ttm)); - } - - FILE *fp = freopen(("/tmp/sc_serv_segfault_" + tos(getpid()) + ".log").c_str(), "w", stderr); - fprintf(stderr, "Shoutcast DNAS/" SERV_OSNAME " v%s (" __DATE__ ")\n" - "An unrecoverable error (%d) has occurred @ %s.\n\n", - gOptions.getVersionBuildStrings().hideAsString().c_str(), signum, buf); - stacktrace::displayCurrentStackTrace(/*-1U, 0*/); - fflush(fp); - kill(getpid(), signum); -} -#endif -unsigned sigWatcher() -{ - while (::WaitForSingleObject(serviceMain::sStop,0) != WAIT_OBJECT_0) - { - sigset_t catchset; - sigemptyset(&catchset); - sigaddset(&catchset,SIGPIPE); - sigaddset(&catchset,SIGTERM); - sigaddset(&catchset,SIGHUP); - sigaddset(&catchset,SIGINT); - sigaddset(&catchset,SIGQUIT); - sigaddset(&catchset,SIGTSTP); // ^Z allow this - sigaddset(&catchset,SIGCHLD); - sigaddset(&catchset,SIGWINCH); - sigaddset(&catchset,SIGUSR1); - sigaddset(&catchset,SIGUSR2); - - //struct timespec ts; - //ts.tv_sec = 1; - //ts.tv_nsec = 0; - //apple is missing sigtimed wait. - int err = 0; - if (::sigwait(&catchset,&err)) - { - err = SIGTERM; - } - - switch (err) - { - case SIGTERM: case SIGINT: case SIGQUIT: case SIGTSTP: - { - _SetEvent(serviceMain::sStop); - break; - } - case SIGHUP: - { - _SetEvent(serviceMain::sHUP); - break; - } - case SIGWINCH: - { - _SetEvent(serviceMain::sWINCH); - break; - } - case SIGUSR1: - { - _SetEvent(serviceMain::sUSR1); - break; - } - case SIGUSR2: - { - _SetEvent(serviceMain::sUSR2); - break; - } - } - } - return 0; -} - -// We need access to this for Apple, because we don't have sigtimedwait(). This means there -// circumstances when we need access to this thread so we can signal it and force sigwait() to exit -Tthread gSigWatcherThread(sigWatcher); - -#endif - -#ifdef _WIN32 -int run_install(const vector &args) throw(); -int run_uninstall(const vector &args) throw(); -int run_run(const vector &args) throw(std::exception); -int run_daemon(const vector &args) throw(std::exception); -#else -int run_run(const vector &args, const vector &arg) throw(std::exception); -int run_daemon(const vector &args, const vector &arg) throw(std::exception); - -int blockSignals() throw() -{ - return thread_CORE::standard_signal_block(); -} -#endif - - -uniString::utf8 getVersionBuildStrings() throw() -{ -#ifdef _WIN32 - static utf8 version = ""; - if (version.empty()) - { - getVersionInfo(version); - } -#else - static utf8 version = ""; - if (version.empty()) - { - for (int x = 0; x < VENT; ++x) - { - if (x) version += "."; - version += tos(PRODUCTVERSION[x]); - } - } -#endif -#ifdef LICENCE_FREE - version += " no-licence-check"; -#endif - return version; -} - -#ifdef _WIN32 -int do__main(vector &args) throw(std::exception) -#else -int do__main(vector &args, vector &arg) throw(std::exception) -#endif -{ - if (!args.empty()) - { - utf8 s = toLower(args.front()); - - if (s == "--version" || s == "-v") - { - XML_Expat_Version expat = XML_ExpatVersionInfo(); - printf("%s", utf8("Shoutcast DNAS/" SERV_OSNAME " v" + getVersionBuildStrings() + - " (" __DATE__ ") " + utf8(curl_version()) + " expat/" + - tos(expat.major) + "." + tos(expat.minor) + "." + tos(expat.micro) + -//#ifdef _WIN32 -// " pthread-win32/" PTW32_VERSION_STR "-mod" + -//#endif - eol()).toANSI().c_str()); - return 0; - } - - if (s == "--help" || s == "/?") - { - #ifdef _WIN32 - #define SC_SERV_END ".exe" - #else - #define SC_SERV_END "" - #endif - - printf("%s", utf8("*********************************************************************" + eol()).toANSI().c_str()); - printf("%s", utf8("** Shoutcast Distributed Network Audio Server (DNAS) **" + eol()).toANSI().c_str()); - printf("%s", utf8("** Copyright (C) 2014-2023 Radionomy SA, All Rights Reserved **" + eol()).toANSI().c_str()); - printf("%s", utf8("*********************************************************************" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "Usage: sc_serv" SC_SERV_END " [OPTION] [PARAMETERS]... [conf]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t[conf] - File path to the configuration file (this can be" + - eol() + "\t\t relative or absolute) [optional]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t\t If not specified then sc_serv.conf / sc_serv.ini" + - eol() + "\t\t in the same folder will be automatically loaded." + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "Options:").toANSI().c_str()); - - printf("%s", utf8(eol() + "\t-s, setup\t\tRun the DNAS in setup mode for" + eol() + - "\t\t\t\tcreating a basic configuration" + eol()).toANSI().c_str()); -#ifdef CONFIG_BUILDER - printf("%s", utf8(eol() + "\t-b, builder\t\tRun the DNAS in builder mode for" + eol() + - "\t\t\t\tcreating an advanced configuration" + eol()).toANSI().c_str()); -#endif - printf("%s", utf8(eol() + "\t-v, --version\t\tDisplay version information" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t/?, --help\t\tDisplay this information" + eol()).toANSI().c_str()); - - #ifdef _WIN32 - printf("%s", utf8(eol() + eol() + "Service Options:" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\tinstall [servicename] [username] [password] [conf]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t\tservicename - Unique name for the service install" + eol() + - "\t\t\t if the default is not appropriate or" + eol() + - "\t\t\t needing multiple services [optional]" + eol() + - "\t\t\t Default is: \"Shoutcast DNAS Service\"" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tusername - User under which to run the service as" + eol() + - "\t\t\t or '0' for the local system [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tpassword - Password for user or '0' for the local" + eol() + - "\t\t\t system or with no password [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tconf - File path to the configuration file either" + eol() + - "\t\t as a full or relative path [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\texample:" + eol() + "\t\tsc_serv.exe install" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe install sc_serv" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe install sc_serv 0 0 sc_serv.conf" + - eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + eol() + "\tuninstall [servicename]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tservicename - Name used to install the service or" + eol() + - "\t\t\t leave blank for default [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\texample:" + eol() + "\t\tsc_serv.exe uninstall" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe uninstall sc_serv" + eol() + eol()).toANSI().c_str()); - #else - #define SC_SERV_FILE "sc_serv" - printf("%s", utf8(eol() + "Daemon Options:" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\tdaemon [conf]\t\tRun the DNAS in daemon mode " + eol()).toANSI().c_str()); - #endif - XML_Expat_Version expat = XML_ExpatVersionInfo(); - printf("%s", utf8(eol() + eol() + "Built with: " + utf8(curl_version()) + - " expat/" + tos(expat.major) + "." + tos(expat.minor) + "." + - tos(expat.micro) + eol()).toANSI().c_str()); - return 0; - } - - if (s == "install") - { - #ifdef _WIN32 - args.erase(args.begin()); - return run_install(args); - #else - cerr << "install is not supported on this platform" << endl; - return -1; - #endif - } - - if (s == "uninstall") - { - #ifdef _WIN32 - args.erase(args.begin()); - return run_uninstall(args); - #else - cerr << "uninstall is not supported on this platform" << endl; - return -1; - #endif - } - - if (s == "daemon") - { - args.erase(args.begin()); - #ifdef _WIN32 - return run_daemon(args); - #else - return run_daemon(args, arg); - #endif - } - } - -#ifdef _WIN32 - return run_run(args); -#else - return run_run(args, arg); -#endif -} - -int main(int argc, char* argv[]) throw(std::exception) -{ - int result = 0; - try - { - vector args; - - // convert args to vector of strings - for (int x = 1; x < argc; ++x) - { - args.push_back(argv[x]); - } - - // grab the calling program param as - // will be needed to ensure relative - // path handling will work correctly -#ifdef _WIN32 - result = do__main(args); -#else - vector arg; - arg.push_back(argv[0]); - result = do__main(args, arg); -#endif - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - return result; -} - -///////////////////////////////////////////////////// - -// surround by quotes -#ifdef _WIN32 -static wstring quote(const wstring &s) throw() -{ - return wstring(L"\"") + s + wstring(L"\""); -} - -int run_install(const vector &args) throw() -{ - int result = -1; - - SC_HANDLE schSCManager = 0; - SC_HANDLE schService = 0; - - try - { - wstring serviceName = (!args.empty() ? args[0].toWString().c_str() : L"Shoutcast DNAS Service"); - wstring account = (args.size() > 2 ? (args[1] == "0" ? L"" : args[1].toWString()) : L""); - wstring password = (args.size() > 3 ? (args[2] == "0" ? L"" : args[2].toWString()) : L""); - - const size_t SIZ(2048); - wchar_t nameBuffer[SIZ+2] = {0}; - ::GetModuleFileNameW(0,nameBuffer,SIZ); - - schSCManager = ::OpenSCManagerW(NULL, // local machine - NULL, // ServicesActive database - SC_MANAGER_ALL_ACCESS); // full access rights - - if (schSCManager == NULL) - { - if (GetLastError() == ERROR_ACCESS_DENIED) - { - throw runtime_error("Aborting service install due to a lack of required permissions.\n\n" - "Ensure you are using an Administrator Command Prompt or that you have administrator access to be able to install a service."); - } - else - { - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service install due to OpenSCManager(..) failure.\n\nError code: %d\n[%s]", - GetLastError(), errMessage().c_str()); - throw runtime_error(error); - } - } - - wstring cmdString = quote(nameBuffer) + L" " + quote(L"daemon") + L" " + quote(serviceName); - if (args.size() > 4) cmdString += L" " + quote(args[3].toWString()); - - schService = ::CreateServiceW( - schSCManager, // SCManager database - serviceName.c_str(), // name of service - serviceName.c_str(), // service name to display - SERVICE_ALL_ACCESS, // desired access - SERVICE_WIN32_OWN_PROCESS, // service type - SERVICE_DEMAND_START, // start type - SERVICE_ERROR_NORMAL, // error control type - cmdString.c_str(), - NULL, // no load ordering group - NULL, // no tag identifier - NULL, // no dependencies - (account == L"" ? NULL : account.c_str()), // LocalSystem account - (password == L"" ? NULL : password.c_str())); // no password - - if (schService == NULL) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service install due to CreateService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_EXISTS ? "\n\nCheck the service name has not already been used." : - (err == ERROR_SERVICE_MARKED_FOR_DELETE ? "\n\nCheck the previous service instance has been completely stopped." : ""))); - throw runtime_error(error); - } - else - { - SERVICE_DESCRIPTION schServiceDesc; - schServiceDesc.lpDescription = L"Shoutcast DNAS Server (sc_serv) v2"; - ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &schServiceDesc); - } - ::CloseServiceHandle(schService); - ::CloseServiceHandle(schSCManager); - - result = 0; - } - catch(const exception &ex) - { - ::MessageBox(0,tows(ex.what()).c_str(),L"Shoutcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - if (schService) - ::CloseServiceHandle(schService); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - catch(...) - { - ::MessageBox(0,L"Unknown exception",L"Shoutcast DNAS Error",MB_OK); - if (schService) - ::CloseServiceHandle(schService); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - - return result; -} - -///////////////////////////////////////////////////// - -int run_uninstall(const vector &args) throw() -{ - int result = -1; - - SC_HANDLE schSCManager = 0; - SC_HANDLE service = 0; - try - { - schSCManager = ::OpenSCManagerW(NULL, // local machine - NULL, // ServicesActive database - SC_MANAGER_ALL_ACCESS); // full access rights - - if (schSCManager == NULL) - { - if (GetLastError() == ERROR_ACCESS_DENIED) - { - throw runtime_error("Aborting service uninstall due to a lack of required permissions.\n\n" - "Ensure you are using an Administrator Command Prompt or that you have administrator access to be able to uninstall a service."); - } - else - { - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to OpenSCManager(..) failure.\n\nError code: %d\n[%s]", - GetLastError(), errMessage().c_str()); - throw runtime_error(error); - } - } - - service = ::OpenServiceW(schSCManager, (!args.empty() ? args[0].toWString().c_str() : L"Shoutcast DNAS Service"), DELETE); - if (!service) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to OpenService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_DOES_NOT_EXIST ? "\n\nCheck the service has not already been uninstalled and the\n" - "service name matches what was used to register the service." : "")); - throw runtime_error(error); - } - - if (!::DeleteService(service)) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to DeleteService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_DOES_NOT_EXIST ? "\n\nCheck the service has not already been removed and that the\n" - "service name matches what was used to register the service." : - (err == ERROR_SERVICE_MARKED_FOR_DELETE ? "\n\nCheck the previous service instance has been completely stopped." : ""))); - throw runtime_error(error); - } - - ::CloseServiceHandle(service); - ::CloseServiceHandle(schSCManager); - - result = 0; - } - catch(const exception &ex) - { - ::MessageBox(0,tows(ex.what()).c_str(),L"Shoutcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - if (service) - { - ::CloseServiceHandle(service); - } - if (schSCManager) - { - ::CloseServiceHandle(schSCManager); - } - } - catch(...) - { - if (service) - ::CloseServiceHandle(service); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - - return result; -} -#endif - -///////////////////////////////////////////////////// -static vector gServiceArgs; - -#ifdef _WIN32 - -// Wraps SetServiceStatus. -void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, - DWORD dwCheckPoint, DWORD dwWaitHint) -{ - SERVICE_STATUS ss; // Current status of the service. - - // Disable control requests until the service is started. - if (dwCurrentState == SERVICE_START_PENDING) - ss.dwControlsAccepted = 0; - else - ss.dwControlsAccepted = - SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; - // Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE - // and SERVICE_ACCEPT_SHUTDOWN. - - // Initialize ss structure. - ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - ss.dwServiceSpecificExitCode = 0; - ss.dwCurrentState = dwCurrentState; - ss.dwWin32ExitCode = dwWin32ExitCode; - ss.dwCheckPoint = dwCheckPoint; - ss.dwWaitHint = dwWaitHint; - - // Send status of the service to the Service Controller. - ::SetServiceStatus(ssh, &ss); -} - -static void WINAPI service_ctrl(DWORD dwCtrlCode) -{ - DWORD dwState = SERVICE_RUNNING; - - switch (dwCtrlCode) - { - case SERVICE_CONTROL_STOP: - dwState = SERVICE_STOP_PENDING; - break; - - case SERVICE_CONTROL_SHUTDOWN: - dwState = SERVICE_STOP_PENDING; - break; - - case SERVICE_CONTROL_INTERROGATE: - break; - - default: - break; - } - - // Set the status of the service. - SetTheServiceStatus(dwState, NO_ERROR, 0, 0); - - // Tell service_main thread to stop. - if ((dwCtrlCode == SERVICE_CONTROL_STOP) || - (dwCtrlCode == SERVICE_CONTROL_SHUTDOWN)) - { - _SetEvent(serviceMain::sStop); - } -} - -static void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv) -{ - try - { - // Register the service ctrl handler. - //if (dwArgc == 0) - if (gServiceArgs.empty()) - { - throw runtime_error("service_main - no name"); - } - ssh = ::RegisterServiceCtrlHandler(lpszArgv[0],(LPHANDLER_FUNCTION)service_ctrl); - if (!ssh) - { - throw runtime_error("RegisterServiceCtrlHandler returned NULL"); - } - // The service has started. - SetTheServiceStatus(SERVICE_RUNNING, 0, 0, 0); - - vector args(gServiceArgs.begin() + 1,gServiceArgs.end()); - - #ifdef _WIN32 - ::SetConsoleCtrlHandler(_console_handler,TRUE); - #else - gSigWatcherThread.start(); - #endif - - sm_main(args); - - #ifndef _WIN32 - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); - #endif - - // Stop the service. - OutputDebugString(TEXT("SetTheServiceStatus, SERVICE_STOPPED\n")); - SetTheServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0); - } - catch(...) - { - SetTheServiceStatus(SERVICE_STOPPED, ::GetLastError(), 0, 0); - } -} - -#endif - -#ifdef _WIN32 -int run_daemon(const vector &args) throw(std::exception) -#else -int run_daemon(const vector &args, const vector &arg) throw(std::exception) -#endif -{ - sDaemon = true; - - gServiceArgs = args; - _ResetEvent(serviceMain::sStop); - -#ifdef _WIN32 - SERVICE_TABLE_ENTRY ste[] = - {{TEXT("Shoutcast DNAS"),(LPSERVICE_MAIN_FUNCTION)service_main}, {NULL, NULL}}; - - gStartupDirectory = utf32(getfwd()).toUtf8(); - - if (!::StartServiceCtrlDispatcher(ste)) - { - static TCHAR error[512]; - _snwprintf(error, sizeof(error), - TEXT("Error code for StartServiceCtrlDispatcher: %u [%hs].\n"), - GetLastError(), errMessage().c_str()); - MessageBox (NULL, error, NULL, MB_SERVICE_NOTIFICATION); - return -1; - } - return 0; - -#else - pid_t pid; - if ((pid = fork()) < 0) - { - return -1; - } - else if (pid != 0) - { - cout << "sc_serv2 going daemon with PID [" << tos(pid) << "]" << endl; - exit(0); // parent goes away - } - // child continues - setsid(); - gStartupDirectory = getfwd((const char*)&(arg[0])); - - blockSignals(); - gSigWatcherThread.start(); - - int result = sm_main(args); - - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); - - return result; -#endif -} - -////////////////////////////////////////////////////// -#ifdef _WIN32 -wchar_t* getfwd() throw() -{ - // determine the actual location of ourselves and use as needed - static wchar_t fwd[MAX_PATH]; - if (!fwd[0]) - { - GetModuleFileNameW(NULL, fwd, ARRAYSIZE(fwd)); - - // this is needed for the service mode - // so simpler to set it here than later - gStartupPath = utf32(fwd).toUtf8(); - - PathRemoveFileSpecW(fwd); - PathAddBackslashW(fwd); - - // this mirrors existing Windows handling despite - // other 2.4.2 changes needing to be made for it. - SetCurrentDirectory(fwd); - } - return fwd; -} -#else -char* getfwd(const char* argv) throw() -{ - // determine the actual location of ourselves and use as needed - static char fwd[MAXPATHLEN + 1]; - if (!fwd[0]) - { - // first attempt to use readlink(..) as per the platform build - #if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) - if(readlink("/proc/self/exe", fwd, sizeof(fwd) - 1) == -1) - #endif - #ifdef PLATFORM_BSD - if(readlink("/proc/curproc/file", fwd, sizeof(fwd) - 1) == -1) - #endif - #ifdef __APPLE_CC__ - uint32_t fwdSize = sizeof(fwd); - if(!_NSGetExecutablePath(fwd, &fwdSize)) - #endif - { - #ifdef __APPLE_CC__ - // for this, we get the full program path which can include symlinks - // so this will adjust it all so as to get a clean path and then to - // strip off the program file name (also included) so we match all of - // the other OS versions of this method so it will work consistently. - strncpy(fwd, fileUtil::onlyPath(fileUtil::getFullFilePath(string(fwd))).hideAsString().c_str(), sizeof(fwd) - 1); - #endif - - // now look at argv for a / in it - if (strchr(argv, '/')) - { - // if it starts with a / it's absolute so just use - if (argv[0] == '/') - { - strncpy(fwd, argv, sizeof(fwd) - 1); - } - // otherwise attempt to append to the cwd - // only risk is if the cwd changed onload - else - { - if (getcwd(fwd, sizeof(fwd) - 1)) - { - int len = sizeof(fwd) - strlen(fwd); - strncat(fwd, argv, min(len - 1, (int)sizeof(fwd) - 1)); - } - // and if that doesn't work then set - // it as / and behave like older builds - else - { - strncpy(fwd, "/", sizeof(fwd) - 1); - } - } - } - } - else - { - char tmp[MAXPATHLEN + 1] = {0}; - strncpy(fwd, strncpy(tmp, dirname(fwd), sizeof(tmp) - 1), sizeof(fwd) - 1); - } - - // must be slash terminated - size_t fwd_len = strlen(fwd); - if (fwd_len && (fwd_len < (sizeof(fwd) - 1)) && fwd[fwd_len - 1] != '/') - { - strncat(fwd, "/", sizeof(fwd) - 1); - } - } - - return fwd; -} -#endif - -#ifdef _WIN32 -int run_run(const vector &args) throw(std::exception) -#else -int run_run(const vector &args, const vector &arg) throw(std::exception) -#endif -{ -#ifdef _WIN32 - ::SetConsoleCtrlHandler(_console_handler,TRUE); - gStartupDirectory = utf32(getfwd()).toUtf8(); -#else - if (blockSignals()) - { - cerr << "pthread_sigmask failed in run_run()" << endl; exit(-1); - } - gSigWatcherThread.start(); - -#ifdef PLATFORM_LINUX - struct sigaction sa; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = custom_signal_handler; - sigaction(SIGSEGV, &sa, NULL); - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGFPE, &sa, NULL); -#endif - - gStartupDirectory = getfwd((const char*)&(arg[0])); -#endif - - int result = 0; - try - { - result = sm_main(args); - } - catch(const std::runtime_error &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - catch(...) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Unknown exception in main()").c_str()); - } - -#ifndef _WIN32 - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); -#endif - - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h deleted file mode 100644 index f6ed4134..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#ifndef serviceMain_H_ -#define serviceMain_H_ - -#ifdef _WIN32 -#include -#endif -#include -#include -#include "threading/thread.h" -#include "unicode/uniFile.h" -#include "../../versions.h" - -/* - Class to encapsulate command line or service based launching. - convention is that the first parameter will determine the action - taken, either "install" (install service) "uninstall" (uninstall service) - "daemon" (run as windows service or unix daemon) or "run" (run as application). - If the keyword is missing then "run" is assumed. - - if action is "install" then you must provide the following arguments - - servicename logon password .... application arguments ..... - - for example - - pm.exe install procmgr myaccount mypassword param1 param2 param3 - - To use the default account and password you use a zero - - pm.exe install procmgr 0 0 param1 param2 - - if action is "uninstall" then you must provide the following arguments - - servicename - - This only deals with process services. -*/ - -class serviceMain -{ -public: - static event sStop; // if this is signaled, the service must stop. You must monitor this variable -#ifndef _WIN32 - static event sHUP; // other unix signals - static event sWINCH; - static event sUSR1; - static event sUSR2; -#endif -}; - -extern int main(int argc, char* argv[]) throw(std::exception); - -// you must define this guy: -extern int sm_main(const std::vector &args) throw(); - -#ifdef _WIN32 -BOOL WINAPI _console_handler(DWORD fdwCtrlType); -wchar_t* getfwd() throw(); -#else -int blockSignals() throw(); -char* getfwd(const char* argv) throw(); -#endif - -#ifndef _WIN32 -// We need access to this for Apple, because we don't have sigtimedwait(). This means there -// circumstances when we need access to this thread so we can signal it and force sigwait() to exit - -extern Tthread gSigWatcherThread; -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp deleted file mode 100644 index fcc61279..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "stdServiceImpl.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -AOL_logger::stdLog_t *gLog = 0; -uniFile::filenameType gStartupDirectory; -uniFile::filenameType gStartupPath; - -// shutdown the logger -void stdServiceBase::stopLog() throw() -{ - if (!gLog) return; - //ILOG(LIBRARY_LOG_TAG "Logger shutdown"); - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); // wait for logger to stop - forget(gLog); -} - -// start log in minimal panic mode -void stdServiceBase::startPanicLog() throw() -{ - stopLog(); - try - { - gLog = new AOL_logger::stdLog_t; - addPanicLogElements(); - gLog->start(); - } - catch(...){} -} - -// start log in normal mode -void stdServiceBase::startNormalLog(bool partial) throw(std::runtime_error) -{ - if (partial == false) - { - stopLog(); - } - try - { - if (partial == false) - { - gLog = new AOL_logger::stdLog_t; - } - addNormalLogElements(partial); - gLog->start(); - if (partial == false) - { - //ILOG(LIBRARY_LOG_TAG "Logger startup"); - } - else - { - ILOG("[MAIN] Logger updating log file to use"); - } - } - catch(...) - { - forget(gLog); - throw; - } -} - - -// start log in normal mode -void stdServiceBase::startScreenLog() throw() -{ - try - { - addConsoleLogElements(); - } - catch(...){} -} - -void stdServiceBase::postloop() throw() -{ - comUninit(); - _SetEvent(serviceMain::sStop); -} - -///// main entry point to primary flow of control (after daemon nonsense, Win32 service nonsense, etc). -int stdServiceBase::sm_main(const vector &args) throw() -{ - int result = -1; - try - { - preloop(/* args */); // moved to preflight so logger can be reconfigured on internal restart - result = loop(args); // will only throw during preflight - } - catch(const exception &err) - { - panic(err.what()); - } - catch(...) - { - panic("Unknown exception"); - } - postloop(); - return result; -} - -#ifdef _WIN32 -////////////////////////////////////////////////////////////////////////////// -//////////////////////// win32 specific /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -void stdServiceWin32generic::comInit() throw(exception) -{ - if (FAILED(CoInitialize(NULL))) - { - throw runtime_error("CoInitialize failure"); - } -} - -void stdServiceWin32generic::comUninit() throw() -{ - CoUninitialize(); -} - -// panic occurs when an error happens before the loggers -// are brought up. -void stdServiceWin32generic::panic(const utf8 &errM) throw() -{ - wstring err_m(errM.toWString()); - if (!sDaemon) - { - ::MessageBox(0,err_m.c_str(),L"SHOUTcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - } - - // try to build the event logger - if (FAILED(CoInitialize(NULL))) - { - return; - } - - try - { - startPanicLog(); - ELOG(LIBRARY_LOG_TAG + errM); - stopLog(); - } - catch(...){} - CoUninitialize(); -} - -#else -////////////////////////////////////////////////////////////////////////////// -//////////////////////// unix specific /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -void stdServiceUnixgeneric::panic(const utf8 &errM) throw() -{ - try - { - startPanicLog(); - ELOG(LIBRARY_LOG_TAG + errM); - stopLog(); - } - catch(...){} -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h deleted file mode 100644 index aa3b2c7c..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h +++ /dev/null @@ -1,322 +0,0 @@ -#pragma once -#ifndef stdServiceImpl_H_ -#define stdServiceImpl_H_ - -#include -#include -#include -#include - -#include "serviceMain.h" -#include "logger.h" -#include "../../config.h" - -#ifdef _WIN32 -#define __F__ __FUNCTION__ -#else -#define __F__ string(__PRETTY_FUNCTION__) + -#endif - -#define LIBRARY_LOG_TAG "<***> " - -extern AOL_logger::stdLog_t *gLog; -extern uniFile::filenameType gStartupDirectory; -extern uniFile::filenameType gStartupPath; -extern config gOptions; - -// are we running as a daemon or service -extern bool sDaemon; - -#define ELOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeError(__VA_ARGS__)); } while (0) -#define WLOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeWarning(__VA_ARGS__)); } while (0) -#define ILOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeInfo(__VA_ARGS__)); } while (0) -#define DLOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeDebug(__VA_ARGS__)); } while (0) -#define ULOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeUpdate(__VA_ARGS__)); } while (0) -#define ROTATE do { if (gLog) gLog->postMessage(AOL_logger::message::makeRotate()); } while (0) - -#define HUP_SIGNAL 45 - -class stdServiceBase -{ -protected: - virtual ~stdServiceBase() throw(){} - virtual void addPanicLogElements() throw(std::exception) = 0; - virtual void addConsoleLogElements() throw(std::exception) = 0; - virtual void addNormalLogElements(bool partial) throw(std::exception) = 0; - virtual void preloop() throw(std::exception) = 0; - virtual int loop(const std::vector &args) throw(std::exception) = 0; - - void base_preloop() throw(std::exception) - { - comInit(); - } - - virtual void postloop() throw(); - - static void preflight(const std::vector &args) throw(std::exception) - { - // get cmd line settings - const std::vector leftover(gOptions.fromArgs(args)); - if (!leftover.empty()) - { - uniString::utf8 s; - for (std::vector::const_iterator i = leftover.begin(); i != leftover.end(); ++i) - { - s += (*i) + " "; - } - throw std::runtime_error(std::string(LIBRARY_LOG_TAG) + "Bad cmd line parameters: `" + s.hideAsString() + "'"); - } - } - - template - int base_loop(const std::vector &args) throw(std::exception) - { - int result = -1; - bool done(false); - while (!done) - { - _ResetEvent(serviceMain::sStop); - - try - { - preflight(args); - startNormalLog(false); - result = APP().go(*this); - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - done = true; - } - catch(...) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Unknown exception in main()").c_str()); - done = true; - } - - stopLog(); - if (result != HUP_SIGNAL) - { - done = true; - } - } - return result; - } - -public: - virtual void comInit() throw(std::exception) = 0; - virtual void comUninit() throw() = 0; - virtual void stopLog() throw(); - virtual void startNormalLog(bool partial) throw(std::runtime_error); - virtual void startScreenLog() throw(); - virtual void startPanicLog() throw(); - virtual void panic(const uniString::utf8 &errM) throw() = 0; - int sm_main(const std::vector &args) throw(); -}; - -#ifdef _WIN32 -// stuff that doesn't require templates -class stdServiceWin32generic: public stdServiceBase -{ -public: - virtual void comInit() throw(std::exception); - virtual void comUninit() throw(); - virtual void panic(const uniString::utf8 &errM) throw(); -}; - -template -class stdServiceWin32: public stdServiceWin32generic -{ -protected: - uniString::utf8 m_serviceName; - - virtual void addPanicLogElements() throw(std::exception) - { - gLog->addElement(new AOL_logger::systemLogger_element(m_serviceName, gStartupPath, AOL_logger::systemLogger_element::panicConfiguration())); - } - - virtual void addConsoleLogElements() throw(std::exception) - { - _ASSERTE(gLog); - - AOL_logger::consoleLogger_element *c = 0; - - try - { - if (gOptions.getConsoleLogging()) - { - gLog->addElement(c = new AOL_logger::consoleLogger_element()); - c = 0; - } - } - catch(...) - { - forget(c); - throw; - } - - // handler must be set after console is created - if (!sDaemon && (gOptions.getConsoleLogging())) - { - ::SetConsoleCtrlHandler(_console_handler,TRUE); - } - } - - // start log in normal mode (may throw) - virtual void addNormalLogElements(bool partial) throw(std::exception) - { - _ASSERTE(gLog); - - AOL_logger::fileLogger_element *f = 0; - AOL_logger::systemLogger_element *s = 0; - - try - { - APP::addCustomLogElements();// give app opportunity to add special elements - if (!gOptions.getFileLog().empty()) - { - if (partial == true) - { - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); - } - bool m_useDefault = false; - gLog->addElement(f = new AOL_logger::fileLogger_element(gOptions.getFileLog(), gOptions.logFile_Default(), - m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval())); - if (m_useDefault) - { - wchar_t m_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_defaultFileName, MAX_PATH); - gOptions.setOption(uniString::utf8("logfile"), uniString::utf32(m_defaultFileName).toUtf8()); - } - - f = 0; - } - if ((partial == false) && sDaemon) - { - gLog->addElement(s = new AOL_logger::systemLogger_element(m_serviceName, gStartupPath, - gOptions.getSystemLogConfigString())); - s = 0; - } - } - catch(...) - { - forget(f); - forget(s); - throw; - } - - // handler must be set after console is created - if ((partial == false) && !sDaemon && (gOptions.getConsoleLogging())) - { - ::SetConsoleCtrlHandler(_console_handler,TRUE); - } - } - - virtual void preloop() throw(std::exception) { stdServiceBase::base_preloop(); } - virtual int loop(const std::vector &args) throw(std::exception) { return stdServiceBase::base_loop(args); } - -public: - explicit stdServiceWin32(const std::string &serviceName):m_serviceName(serviceName){} -}; - -#else - -// stuff that doesn't require templates -class stdServiceUnixgeneric: public stdServiceBase -{ -public: - virtual void comInit() throw(std::exception){} - virtual void comUninit() throw(){} - virtual void panic(const uniString::utf8 &errM) throw(); -}; - -template -class stdServiceUnix: public stdServiceUnixgeneric -{ -protected: - virtual void addPanicLogElements() throw(std::exception) - { - gLog->addElement(new AOL_logger::consoleLogger_element()); - } - - virtual void addConsoleLogElements() throw(std::exception) - { - assert(gLog); - - AOL_logger::consoleLogger_element *c = 0; - - try - { - if (gOptions.getConsoleLogging()) - { - gLog->addElement(c = new AOL_logger::consoleLogger_element()); - c = 0; - } - } - catch(...) - { - forget(c); - throw; - } - } - - // start log in normal mode (may throw) - virtual void addNormalLogElements(bool partial) throw(std::exception) - { - assert(gLog); - - AOL_logger::fileLogger_element *f = 0; - - try - { - APP::addCustomLogElements(); // give app an opporunity to add special loggers - if (!gOptions.getFileLog().empty()) - { - if (partial == true) - { - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); - } - size_t sid; - size_t count = gOptions.count_stream_logFile(); - int i; - - for (i = 0; i < count; ++i) - { - sid = 0; - uniString::utf8 fn = gOptions.fetchMulti (gOptions.stream_logFile_map(), i, "", &sid); - bool m_useDefault = false; - f = new AOL_logger::fileLogger_element (fn, fn, m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval(), sid); - gLog->addElement (f); - } - - bool m_useDefault = false; - gLog->addElement(f = new AOL_logger::fileLogger_element(gOptions.getFileLog(), gOptions.logFile_Default(), - m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval())); - if (m_useDefault) - { - gOptions.setOption(uniString::utf8("logfile"),gOptions.logFile_Default()); - } - f = 0; - } - } - catch(...) - { - forget(f); - throw; - } - } - - virtual void preloop() throw(std::exception) { stdServiceBase::base_preloop(); } - virtual int loop(const std::vector &args) throw(std::exception) { return stdServiceBase::base_loop(args); } - -public: - stdServiceUnix() throw(){} -}; -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile deleted file mode 100644 index b66827ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile +++ /dev/null @@ -1,78 +0,0 @@ -default: release - -CXX=gcc - -CXXFLAGS_DEBUG= -g -D_REENTRANT -D_INC_PROCESS -Wall -Wno-unused-function -Wno-sign-compare -Werror - -CXXFLAGS_RELEASE= -D_REENTRANT -D_INC_PROCESS -DNDEBUG -Wall -Wno-unused-function -Wno-sign-compare -Werror - -INCLUDES= \ - -I. \ - -I.. \ - -I../.. - -HEADER_FILES= \ - $(wildcard *.h) \ - $(wildcard ../*.h) \ - -SOURCE_FILES= \ - $(wildcard *.cpp) \ - $(wildcard ../*.cpp) \ - $(wildcard ../../threading/thread.cpp) \ - $(wildcard ../../file/fileUtils.cpp) - -OBJECT_FILES= \ - $(addsuffix .o,$(basename $(notdir $(SOURCE_FILES)))) - -DEBUG_OBJECTS= \ - $(addprefix debug/,$(OBJECT_FILES)) - -RELEASE_OBJECTS= \ - $(addprefix release/,$(OBJECT_FILES)) - -debug/%.o: ../../threading/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../../threading/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: ../../file/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../../file/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: ../%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: %.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: %.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -releasedir: - -mkdir -p release - -debugdir: - -mkdir -p debug - -release/test: $(RELEASE_OBJECTS) - $(CXX) $(CXXFLAGS_RELEASE) $(RELEASE_OBJECTS) -lrt -lsocket -lnsl -lpthread -lstdc++ -lz -lm - -debug/test: $(DEBUG_OBJECTS) - $(CXX) $(CXXFLAGS_DEBUG) $(DEBUG_OBJECTS) -lrt -lsocket -lnsl -lpthread -lstdc++ -lz -lm - -release: releasedir $(RELEASE_OBJECTS) release/test - -debug: debugdir $(DEBUG_OBJECTS) debug/test - -clean: - rm -rf release - rm -rf debug - -all: release debug - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp deleted file mode 100644 index cfd204cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include "stdServiceImpl.h" - -using namespace std; - -#ifndef WIN32 -#define DWORD int -#define TRUE true -#define FALSE false -#endif - -static bool valToBool(const string &s) throw() -{ - if (s.empty()) return false; - return (s[0] == '1' || s[0] == 't' || s[0] == 'T' || s[0] == 'y' || s[0] == 'Y'); -} - -class options -{ -public: - string m_name; - string m_fileLog; - bool m_consoleLogging; - - vector fromArgs(const vector &args) throw() - { - vector unused; - - for(vector::const_iterator i = args.begin(); i != args.end(); ++i) - { - string::size_type colon_pos = (*i).find(":"); - if (colon_pos != string::npos) - { - string key = (*i).substr(0,colon_pos); - string value= (*i).substr(colon_pos+1); - if (key == "name") { m_name = value; } - else if (key == "clog") { m_consoleLogging = valToBool(value); } - else if (key == "flog") { m_fileLog = value; } - else - { - unused.push_back(*i); - } - } - else - { - unused.push_back(*i); - } - } - - return unused; - } - - string logText() const throw() - { - ostringstream o; - o << endl; - o << "name = " << m_name << endl; - o << "file log = " << m_fileLog << endl; - o << "console logging = " << m_consoleLogging << endl; - return o.str(); - } -}; - -options gOptions; - -class testService -{ -private: - bool m_done; - int m_goResult; - -public: - explicit testService(stdServiceBase &b) : - m_done(false), - m_goResult(0){} - - int go(stdServiceBase &b) throw(exception) - { - DLOG(__F__ ""); - - m_goResult = 0; - bool comInitialized = false; - - try - { - b.comInit(); - - // event loop (until done) - while (!m_done) - { - event dummyEvent(TRUE); - HANDLE evts[2]; - DWORD evtCount = 0; - - evts[evtCount++] = serviceMain::sStop; -// evts[evtCount++] = m_webServer.getRequestQueueEvent();//m_webServer.getCommandSignal(); - - //wait for a single from the webserver or console abort and take action - DWORD waitResult = ::WaitForMultipleObjects(evtCount,evts,FALSE,250); - -// gProcessTable.update(); - switch(waitResult) - { - case WAIT_OBJECT_0: - { - ILOG("Ctrl+C application termination"); - m_done = true; - break; - } -// case WAIT_OBJECT_0+1: -// { -// DLOG("Got a web event"); -// handleWebEvent(); -// break; -// } - default: - { -// if (m_perfmon) -// { -// time_t ttt = time(NULL); -// m_perfmon->updateEPOCH(ttt); -// m_perfmon->updateAppCounter(gProcessTable.countRunning()); -// } - - //DLOG("PM: Got a periodic event"); - // periodic event -// if (gProcessTable.isIdle()) -// { -// if (m_QuitWhenIdle) -// { -// m_done = true; -// m_goResult = 0; -// } -// else if (m_HUPWhenIdle) -// { -// m_done = true; -// m_goResult = HUP_SIGNAL; -// } -// } - break; - } - } - } - b.comUninit(); - comInitialized = false; - ::SetEvent(serviceMain::sStop); - } - catch(...) - { - ELOG(__F__ " Caught an exception"); - if (comInitialized) - { - b.comUninit(); - } - ::SetEvent(serviceMain::sStop); - throw; - } - return m_goResult; - } -}; - -int sm_main(const vector &args) throw() -{ -#ifdef WIN32 - stdServiceWin32 s("testService"); -#else - stdServiceUnix s; -#endif - return s.sm_main(args); -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc deleted file mode 100644 index 8b3a4be8..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc +++ /dev/null @@ -1,7 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 - - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h deleted file mode 100644 index d6780c17..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by test.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc deleted file mode 100644 index 0d0fd098..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc +++ /dev/null @@ -1,101 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,1,0,0 - PRODUCTVERSION 0,1,0,0 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "test Application" - VALUE "FileVersion", "0, 1, 0, 0" - VALUE "InternalName", "test" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "test.exe" - VALUE "ProductName", " test Application" - VALUE "ProductVersion", "0, 1, 0, 0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln deleted file mode 100644 index 15c8dadf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{07D71318-C429-4ED4-A42C-C1A3FC2C40C5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Debug.ActiveCfg = Debug|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Debug.Build.0 = Debug|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Release.ActiveCfg = Release|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj deleted file mode 100644 index bb2de619..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp deleted file mode 100644 index d78fa9a1..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp +++ /dev/null @@ -1,868 +0,0 @@ -#ifdef PLATFORM_LINUX -#if !defined(__APPLE__) && !defined(_GNU_SOURCE) -# define _GNU_SOURCE // enable dladdr and getline -#endif - -#include "StackTrace.h" -#include - -#if defined(__APPLE__) // need atos -# if defined(STACKTRACE_USE_BACKTRACE) -# include // to record the backtrace addresses -# endif -// for display: -# include // forkpty to make a pseudo-terminal for atos -# include // set pseudo-terminal to raw mode -# include // test whether atos has responded yet - -#elif defined(STACKTRACE_USE_BACKTRACE) -# include // to record the backtrace addresses -// for display: -# include // dladdr() -# include // realpath() -# include -# if defined(__GNUC__) && defined(__cplusplus) -# include // demangling -# include -# endif -# if defined(__linux__) -# include -# endif -#endif - -#ifdef __cplusplus -# include -# include -# include -#else -# include -# include -# include -#endif - -#ifdef ST_UNUSED -#elif defined(__GNUC__) && __GNUC__>3 -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) UNUSED_##x __attribute__((unused)) -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) /*no body necessary*/ - -#elif defined(__LCLINT__) -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) /*@unused@*/ x -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) /*no body necessary*/ - -#else -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) UNUSED_##x -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) (void)UNUSED_##x /* ugly hack to avoid warning */ -#endif - -#ifdef __cplusplus -namespace stacktrace { -#endif /* __cplusplus */ - -int unrollStackFrame(struct StackFrame* curFrame, struct StackFrame* nextFrame) { - if(curFrame==NULL) - return 0; - curFrame->caller=NULL; - if(nextFrame==NULL) - return 0; - - -#ifdef STACKTRACE_USE_BACKTRACE - - if(curFrame->packedRA==NULL) - return 0; // don't have current frame - if(*curFrame->packedRAUsed<=curFrame->depth+1) { - // last element - if(curFrame!=nextFrame) { - nextFrame->packedRA = NULL; - nextFrame->packedRAUsed = nextFrame->packedRACap = NULL; - } - return 0; - } - if(curFrame!=nextFrame) { - nextFrame->packedRA = curFrame->packedRA; - nextFrame->packedRAUsed = curFrame->packedRAUsed; - nextFrame->packedRACap = curFrame->packedRACap; - nextFrame->depth = curFrame->depth; // will be incremented below - } - nextFrame->ra = (*nextFrame->packedRA)[++(nextFrame->depth)]; - curFrame->caller=nextFrame; - return 1; - -#else - - void* nsp=NULL; - machineInstruction * nra=NULL; - -#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) - if(curFrame->sp==NULL) - return 0; - if(((void**)curFrame->sp)-1==NULL) - return 0; - nsp=((void***)curFrame->sp)[-1]; - if(nsp==NULL) - return 0; - nsp=(void**)nsp+1; //move from frame pointer to stack pointer of previous frame - nra=*((machineInstruction**)curFrame->sp); - if(nsp<=curFrame->sp) { - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,curFrame->ra,nsp,nra); - return 0; - } -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; - curFrame->caller=nextFrame; - return 1; -#endif -#ifdef __POWERPC__ - if(curFrame->sp==NULL) - return 0; - if(*(void**)curFrame->sp==NULL) - return 0; - nsp=*(void**)curFrame->sp; - nra=((machineInstruction**)nsp)[2]; - if(nsp<=curFrame->sp) { - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,curFrame->ra,nsp,nra); - return 0; - } -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; - curFrame->caller=nextFrame; - return 1; -#endif -#if defined(__MIPSEL__) || defined(__MIPS__) /* we're running on PLATFORM_APERIOS */ - if(curFrame->sp==NULL) - return 0; - /* Have to scan through intructions being executed because stack pointer is not stored directly on the stack */ - machineInstruction * ins; - const machineInstruction * INS_BASE=(const machineInstruction *)0x2000; // lowest valid memory address? - -#ifdef __PIC__ - ins = reinterpret_cast(curFrame->gp-curFrame->ra); -#else - ins = curFrame->ra; -#endif - // find previous return address - for(; ins>=INS_BASE; ins--) { - // gcc will always save the return address with the instruction - // sw ra, offset(sp) - // - // the high word in this case is sw sp ra - if ( ( *ins & 0xffff0000 ) == 0xafbf0000 ) - { - // the low word is the offset from sp - int offset = *ins & 0x000ffff; - - // in case things went horribly awry, don't deref the non-aligned ptr - if (offset & 0x3) - return 0; - - nra = *reinterpret_cast((char*)curFrame->sp + offset); - break; // now search for stack pointer - } - - //it appears the aperios stub entry functions always begin with "ori t0,ra,0x0" - //if we hit one of these, return 0, because we can't unroll any more - //(or at least, I don't know how it returns from these... there's no return statements!) - if ( *ins == 0x37e80000 ) { -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { kernel? }\n",curFrame->sp,curFrame->ra,curFrame->gp); -# endif - return 0; - } - } - // find previous stack pointer - for(; ins>=INS_BASE; ins--) { - // gcc will always change the stack frame with the instruction - // addiu sp,sp,offset - // - // at the beginning of the function the offset will be negative since the stack grows - // from high to low addresses - // - // first check the high word which will be instruction + regs in this case (I-type) - if ( ( *ins & 0xffff0000 ) == 0x27bd0000 ) { - // the offset is in the low word. since we're finding occurrence at the start of the function, - // it will be negative (increase stack size), so sign extend it - int offset = ( *ins & 0x0000ffff ) | 0xffff0000; - - // in case things went horribly awry, don't deref the non-aligned ptr - if (offset & 0x3) - return 0; - - nsp = (char*)curFrame->sp - offset; - break; - } - } - - - if(ins>=INS_BASE) { - if(nsp<=curFrame->sp) { -#ifdef __PIC__ - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p,gp=%p) directed to invalid next frame: (sp=%p,ra=%p,gp=%p)\n",curFrame->sp,(void*)curFrame->ra,(void*)curFrame->gp,nsp,nra,(void*)(reinterpret_cast(nsp)[4])); -#else - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,(void*)curFrame->ra,nsp,nra); -#endif - return 0; - } - -#ifdef __PIC__ -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { %p %p %p }\n",curFrame->sp,curFrame->ra,curFrame->gp,nsp,nra,reinterpret_cast(nsp)[4]); - nextFrame->debug=curFrame->debug; -# endif - // I'm not actually sure this is a valid stop criteria, but in testing, - // after this it seems to cross into some kind of kernel code. - // (We get a really low gp (0x106), although a fairly normal nra, and then go bouncing - // around in memory until we hit sp=0x80808080, ra=0x2700, which seems to be the 'real' last frame) - //if(reinterpret_cast(nra)>reinterpret_cast(nsp)[4]) - //return 0; - //instead of this however, now we check for the ori t0,ra,0 statement, and reuse previous gp below - - nextFrame->sp=nsp; - //not sure how valid this is either: - if(reinterpret_cast(nra)>reinterpret_cast(nsp)[4]) { - nextFrame->gp = curFrame->gp; - } else { - nextFrame->gp = reinterpret_cast(nsp)[4]; // gp is stored 4 words from stack pointer - } - nextFrame->ra = nextFrame->gp-reinterpret_cast(nra); -#else -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; -#endif /* __PIC__ */ - curFrame->caller=nextFrame; - return 1; - } -#ifdef __PIC__ -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { %p %p --- }\n",curFrame->sp,curFrame->ra,curFrame->gp,nsp,nra); -# endif -#else -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); -# endif -#endif - return 0; -#endif -#endif /* backtrace */ -} - -#ifdef STACKTRACE_USE_BACKTRACE -static int growAlloc(struct StackFrame* frame) { - void** r = (void**)realloc(*frame->packedRA, *frame->packedRACap * sizeof(void*) * 2); - if(r==NULL) - return 0; - *frame->packedRACap *= 2; - *frame->packedRA = r; - return 1; -} -#endif - -#ifdef STACKTRACE_USE_BACKTRACE -const size_t MIN_CAP=50; -static void allocBacktraceRegion(struct StackFrame* frame, size_t /*cap*/) { - /*if(cap < MIN_CAP) - cap=MIN_CAP;*/ - frame->packedRACap = (size_t*)malloc(sizeof(size_t)); - *frame->packedRACap = MIN_CAP; - frame->packedRAUsed = (size_t*)malloc(sizeof(size_t)); - *frame->packedRAUsed = 0; - frame->packedRA = (void***)malloc(sizeof(void**)); - *frame->packedRA = (void**)malloc(*frame->packedRACap * sizeof(void*)); - //printf("Allocated %p\n",*frame->packedRA); -} - -static void freeBacktraceRegion(struct StackFrame* frame) { - //printf("Freeing %p\n",*frame->packedRA); - free(frame->packedRACap); - frame->packedRACap = NULL; - free(frame->packedRAUsed); - frame->packedRAUsed = NULL; - free(*frame->packedRA); - *frame->packedRA=NULL; - free(frame->packedRA); - frame->packedRA=NULL; -} -#endif - -void getCurrentStackFrame(struct StackFrame* frame) { -#ifdef STACKTRACE_USE_BACKTRACE - - // first call? allocate the storage area - if(frame->packedRA==NULL) - allocBacktraceRegion(frame,MIN_CAP); - - // call backtrace, if we hit the capacity, grow the buffer and try again - do { - *frame->packedRAUsed = backtrace(*frame->packedRA, *frame->packedRACap); - } while(*frame->packedRAUsed==*frame->packedRACap && growAlloc(frame)); - - // if we used an oversized buffer, shrink it back down - if(*frame->packedRACap > *frame->packedRAUsed*2 && *frame->packedRACap>MIN_CAP) { - unsigned int newsize = *frame->packedRAUsed * 3 / 2; - if(newsize < MIN_CAP) - newsize = MIN_CAP; - void** r = (void**)realloc(*frame->packedRA, newsize * sizeof(void*) * 2); - if(r!=NULL) { - *frame->packedRACap = newsize; - *frame->packedRA = r; - } - } - frame->depth=1; - -#else - - void** csp=NULL; - machineInstruction* cra=NULL; - -#ifdef __POWERPC__ - __asm __volatile__ ("mr %0,r1" : "=r"(csp) ); // get the current stack pointer - __asm __volatile__ ("mflr %0" : "=r"(cra) ); // get the current return address -#endif /* __POWERPC__ */ - -#if defined(__MIPSEL__) || defined(__MIPS__) -#ifdef __PIC__ - size_t cgp=0; - __asm __volatile__ ("move %0,$gp" : "=r"(cgp) ); //get the gp register so we can compute link addresses -#endif /* __PIC__ */ - __asm __volatile__ ("move %0,$sp" : "=r"(csp) ); // get the current stack pointer - __asm __volatile__ ("jal readepc; nop; readepc: move %0,$ra" : "=r"(cra) ); // get the current return address -#endif /* __MIPSEL__ */ - -#if defined(__i386__) - __asm __volatile__ ("movl %%ebp,%0" : "=m"(csp) ); // get the caller's stack pointer - csp++; //go back one to really be a stack pointer - //__asm __volatile__ ("movl (%%esp),%0" : "=r"(cra) ); // get the caller's address - cra=*((machineInstruction**)csp); - csp=((void***)csp)[-1]+1; -#endif /* __i386__ */ - -// basically the same as i386, but movq instead of movl, and rbp instead of ebp -#if defined(__x86_64__) || defined(__amd64__) - __asm __volatile__ ("movq %%rbp,%0" : "=m"(csp) ); // get the caller's stack pointer - csp++; //go back one to really be a stack pointer - //__asm __volatile__ ("movq (%%rsp),%0" : "=r"(cra) ); // get the caller's address - cra=*((machineInstruction**)csp); - csp=((void***)csp)[-1]+1; -#endif /* amd64/x86_64 */ - - frame->sp=csp; -#if defined(__PIC__) && (defined(__MIPSEL__) || defined(__MIPS__)) - frame->ra=cgp-reinterpret_cast(cra); - frame->gp=cgp; -#else - frame->ra=cra; -#endif /* __PIC__ */ - -#if !defined(__i386__) && !defined(__x86_64__) && !defined(__amd64__) - //with ia-32 it was more convenient to directly provide caller, so don't need to unroll - //otherwise we actually want to return *caller's* frame, so unroll once - unrollStackFrame(frame,frame); -#endif /* not __i386__ */ -#endif /* backtrace */ -} - -void freeStackTrace(struct StackFrame* frame) { -#ifdef STACKTRACE_USE_BACKTRACE - if(frame!=NULL && frame->packedRA!=NULL) { - freeBacktraceRegion(frame); - } -#endif - while(frame!=NULL) { - struct StackFrame * next=frame->caller; - free(frame); - if(frame==next) - return; - frame=next; - } -} - -struct StackFrame* allocateStackTrace(unsigned int size) { - struct StackFrame * frame=NULL; - while(size--!=0) { - struct StackFrame * prev = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(prev, 0, sizeof(*prev)); -#ifdef STACKTRACE_USE_BACKTRACE - if(frame==NULL) { - allocBacktraceRegion(prev,size); - } else { - prev->packedRA = frame->packedRA; - prev->packedRAUsed = frame->packedRAUsed; - prev->packedRACap = frame->packedRACap; - } - prev->depth = size-1; -#endif - prev->caller=frame; - frame=prev; - } - return frame; -} - - -struct StackFrame * recordStackTrace(unsigned int limit/*=-1U*/, unsigned int skip/*=0*/) { - if(limit==0) - return NULL; - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - getCurrentStackFrame(cur); - for(; skip!=0; skip--) - if(!unrollStackFrame(cur,cur)) { - freeStackTrace(cur); - return NULL; - } - struct StackFrame * prev = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(prev, 0, sizeof(*prev)); -#ifdef DEBUG_STACKTRACE - prev->debug=0; -#endif - - unrollStackFrame(cur,prev); //unroll once more for the current frame -#ifdef STACKTRACE_USE_BACKTRACE - memset(cur,0,sizeof(*cur)); // clear cur, prev is now responsible for packedRA allocation -#endif - freeStackTrace(cur); - cur=prev; - - for(--limit; limit!=0; limit--) { - struct StackFrame * next = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(next, 0, sizeof(*next)); -#ifdef DEBUG_STACKTRACE - next->debug=0; -#endif - if(!unrollStackFrame(prev,next)) { - // reached end of trace - free(next); - prev->caller=NULL; //denotes end was reached - return cur; - } - prev=next; - } - // reaching here implies limit was reached - prev->caller=prev; //denotes limit was reached - return cur; -} - -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip) { - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - if(frame==NULL) - return frame; - getCurrentStackFrame(cur); - for(; skip!=0; skip--) - if(!unrollStackFrame(cur,cur)) { - freeStackTrace(cur); - return frame; - } -#ifdef STACKTRACE_USE_BACKTRACE - if(frame->packedRA!=NULL) - freeBacktraceRegion(frame); -#endif - unrollStackFrame(cur,frame); //unroll once more for the current frame -#ifdef STACKTRACE_USE_BACKTRACE - memset(cur,0,sizeof(*cur)); // clear cur, frame is now responsible for packedRA allocation -#endif - freeStackTrace(cur); - - for(; frame->caller!=NULL && frame->caller!=frame; frame=frame->caller) { - struct StackFrame *ans=frame->caller; //don't lose remainder of free list if we hit the end - if(!unrollStackFrame(frame,frame->caller)) { - return ans; // reached end of trace - } - } - // reaching here implies limit was reached - frame->caller=frame; //denotes limit was reached - return NULL; -} - - -#ifdef __APPLE__ -// use atos to do symbol lookup, can lookup non-dynamic symbols and also line numbers -/*! This function is more complicated than you'd expect because atos doesn't flush after each line, - * so plain pipe() or socketpair() won't work until we close the write side. But the whole point is - * we want to keep atos around so we don't have to reprocess the symbol table over and over. - * What we wind up doing is using forkpty() to make a new pseudoterminal for atos to run in, - * and thus will use line-buffering for stdout, and then we can get each line. */ -static void atosLookup(unsigned int depth, void* ra) { - static int fd=-1; - int isfirst=0; - - if(fd==-1) { - struct termios opts; - cfmakeraw(&opts); // have to set this first, otherwise queries echo until child kicks in - pid_t child = forkpty(&fd,NULL,&opts,NULL); - if(child<0) { - perror("Could not forkpty for atos call"); - return; - } - if(child==0) { - //sleep(3); - char pidstr[50]; - snprintf(pidstr,50,"%d",getppid()); - execlp("atos","atos","-p",pidstr,(char*)0); - //snprintf(pidstr,50,"atos -p %d",getppid()); - //execlp("sh","sh","-i","-c",pidstr,(char*)0); - fprintf(stderr,"Could not exec atos for stack trace!\n"); - _exit(1); - } - isfirst=1; - } - - { - char q[50]; - size_t qlen = snprintf(q,50,"%p\n",ra); - //printf("query: %.*s",50,q); - write(fd,q,qlen); - } - - if(isfirst) { - // atos can take a while to parse symbol table on first request, which is why we leave it running - // if we see a delay, explain what's going on... - int err; - struct timeval tv = {3,0}; - fd_set fds; - FD_ZERO(&fds); - FD_SET(fd,&fds); - err = select(fd+1,&fds,NULL,NULL,&tv); - if(err<0) - perror("select for atos output"); - if(err==0) // timeout - printf("Generating... first call takes some time for 'atos' to cache the symbol table.\n"); - } - - { - const unsigned int MAXLINE=1024; - char line[MAXLINE]; - size_t nread=0; - char c='x'; - while(c!='\n' && nread=cmdlen) { - fprintf(stderr, "[ERR addr2line command grew? %d vs %lu]\n",cmdused,(unsigned long)cmdlen); - free(cmd); - return -1; - } - FILE* look=popen(cmd,"r"); - free(cmd); - if(look==NULL) { - fprintf(stderr, "[Missing addr2line]\n"); - return -1; - } - if(getline(func,funclen,look)<=0) { - pclose(look); - return -1; - } - if(getline(srcfile,srcfilelen,look)<=0) { - pclose(look); - return -1; - } - pclose(look); - char* nl = strrchr(*func,'\n'); - if(nl!=NULL) - *nl='\0'; - nl = strrchr(*srcfile,'\n'); - if(nl!=NULL) - *nl='\0'; - return 0; -} - -static void displayRelPath(FILE* os, const char * wd, const char* path) { - unsigned int same=0,i=0; - for(i=0; path[i]!='\0'; ++i) { - if(wd[i]=='/') - same=i+1; - else if(wd[i]=='\0') { - same=i; - break; - } else if(wd[i]!=path[i]) - break; - } - if(wd[same]=='\0') - ++same; - else if(same>1) { - // really want to be relative to source tree root, don't bother with ..'s - /*for(i=same; wd[i]!='\0'; ++i) - if(wd[i]=='/') - fprintf(os,"../"); - fprintf(os,"../");*/ - } - fprintf(os,"%s",&path[same]); -} -#endif - -//! attempts to read symbol information and displays stack trace header -static void beginDisplay() { -#ifdef STACKTRACE_USE_BACKTRACE - //fprintf(stderr,"Stack Trace:\n"); -#elif defined(PLATFORM_APERIOS) - fprintf(stderr,"Run trace_lookup:"); -#elif defined(__APPLE__) - fprintf(stderr,"backtrace_symbols() unavailable, try 'atos' to make human-readable backtrace (-p %d):",getpid()); -#else - fprintf(stderr,"backtrace_symbols() unavailable, try addr2line or tools/trace_lookup to make human-readable backtrace:"); -#endif -} - -#ifdef __APPLE__ -static void displayStackFrame(unsigned int depth, const struct StackFrame* frame) { - atosLookup(depth,(void*)frame->ra); -} -#elif defined(STACKTRACE_USE_BACKTRACE) -static void displayStackFrame(unsigned int depth, const struct StackFrame* frame) { - void* ra = (void*)frame->ra; - Dl_info sym; - memset(&sym,0,sizeof(Dl_info)); - int dlres = dladdr(frame->ra, &sym); - - int isExe = (sym.dli_fname==NULL); // if lib unknown, assume static linkage, implies executable -# ifdef __linux__ - // detect if /proc/self/exe points to sym.dli_fname - if(!isExe && sym.dli_fname[0]!='\0') { - struct stat exeStat; - struct stat libStat; - if(stat("/proc/self/exe",&exeStat)!=0) { - perror(" stat /proc/self/exe"); - } else if(stat(sym.dli_fname,&libStat)!=0) { - perror(" stat lib"); - } else { - isExe = (exeStat.st_dev==libStat.st_dev && exeStat.st_ino==libStat.st_ino); - } - } -# endif - - if(dlres==0 || sym.dli_sname==NULL) { - if(sym.dli_fname==NULL || sym.dli_fname[0]=='\0') { - fprintf(stderr,"%4u [non-dynamic symbol @ %p]",depth,ra); - fprintf(stderr," (has offset %p in unknown library)\n",sym.dli_fbase); - } else { - // use addr2line for static function lookup - const void* const off = (isExe) ? ra : (void*)((size_t)ra-(size_t)sym.dli_fbase); - char* srcfile=NULL, *func=NULL; - size_t srcfilelen=0, funclen=0; - if(addr2lineLookup(sym.dli_fname,off,&srcfile,&srcfilelen,&func,&funclen)==0) { - fprintf(stderr,"%4u %s",depth,(strlen(func)==0) ? "[unknown symbol]" : func); - if(!isExe) { - const char * base = strrchr(sym.dli_fname,'/'); - fprintf(stderr," (%s)",(base==NULL)?sym.dli_fname:base+1); - } - if(strcmp(srcfile,"??:0")!=0) { - fprintf(stderr," "); - char * wd = getcwd(NULL,0); - if(wd==NULL) { - perror("getcwd"); - return; - } - fprintf(stderr,"("); - displayRelPath(stderr,wd,srcfile); - fprintf(stderr,")"); - free(wd); - } - fprintf(stderr,"\n"); - } - free(srcfile); - free(func); - } - return; - } else { - const char * dispFmt="%4d %s +%#lx"; -# ifdef __cplusplus - fprintf(stderr,dispFmt,depth,demangle(sym.dli_sname).c_str(),(size_t)ra-(size_t)sym.dli_saddr); -# else - fprintf(stderr,dispFmt,depth,sym.dli_sname,(size_t)ra-(size_t)sym.dli_saddr); -# endif - } - - if(sym.dli_fname==NULL || sym.dli_fname[0]=='\0') { - fprintf(stderr," (%p, offset %p in unknown lib)\n",ra,sym.dli_fbase); - return; - } else if(isExe) { - // don't bother listing executable name, just show return address - // ...or since the symbol name and offset imply the return address, just skip it - //fprintf(stderr," (%p)",ra); - } else { - // ra is meaningless in dynamically loaded libraries... address space layout randomization (ASLR) - // just show library name - const char * base = strrchr(sym.dli_fname,'/'); - fprintf(stderr," (%s)",(base==NULL)?sym.dli_fname:base+1); - } - - // now do file and line number lookup of function via addr2line - const void* const off = (isExe) ? ra : (void*)((size_t)ra-(size_t)sym.dli_fbase); - char* srcfile=NULL, *func=NULL; - size_t srcfilelen=0, funclen=0; - if(addr2lineLookup(sym.dli_fname,off,&srcfile,&srcfilelen,&func,&funclen)==0 && strcmp(srcfile,"??:0")!=0) { - fprintf(stderr," "); - char * wd = getcwd(NULL,0); - if(wd==NULL) { - perror("getcwd"); - return; - } - fprintf(stderr,"("); - displayRelPath(stderr,wd,srcfile); - fprintf(stderr,")"); - free(wd); - } - fprintf(stderr,"\n"); - free(srcfile); - free(func); -} -#else -static void displayStackFrame(unsigned int ST_UNUSED(depth), const struct StackFrame* frame) { - ST_BODY_UNUSED(depth); - fprintf(stderr," %p",(void*)frame->ra); -} -#endif - -//! releases symbol information used during display -static void completeDisplay(int isend) { -#if defined(STACKTRACE_USE_BACKTRACE) -#endif - if(!isend) - fprintf(stderr," ...\n"); -} - -void displayCurrentStackTrace(unsigned int limit/*=-1U*/, unsigned int skip/*=0*/) { - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - unsigned int i; - int more; - if(limit==0) - return; - getCurrentStackFrame(cur); - //printf(" initial (%p\t%p\t%p)\n",cur.ra,cur.sp,*(void**)cur.sp); - beginDisplay(); - for(; skip!=0; skip--) { - if(!unrollStackFrame(cur,cur)) { - completeDisplay(1); - return; - } - //printf(" skip (%p\t%p\t%p)\n",cur.ra,cur.sp,*(void**)cur.sp); - } - for(i=0; (more=unrollStackFrame(cur,cur)) && icaller!=frame; i++) { - displayStackFrame(i,frame); - frame=frame->caller; - } - if(frame!=NULL) - displayStackFrame(i+1,frame); - completeDisplay(frame==NULL); -} - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/*! @file - * @brief Implements functionality for performing stack traces - * @author ejt (Generalized and implementation for non-MIPS platforms) - * @author Stuart Scandrett (original inspiration, Aperios/MIPS stack operations) - * - * $Author: ejtttje $ - * $Name: $ - * $Revision: 1.2 $ - * $State: Exp $ - * $Date: 2009/11/20 00:50:23 $ - */ -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h deleted file mode 100644 index fe79f863..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef INCLUDED_StackTrace_h_ -#define INCLUDED_StackTrace_h_ - -#ifdef __APPLE__ -# include -#endif -// Aperios and Mac OS X 10.4 and prior need the "manual" unroll; otherwise assume execinfo.h and backtrace() are available -#if !defined(PLATFORM_APERIOS) && (!defined(__APPLE__) || defined(MAC_OS_X_VERSION_10_5)) -# define STACKTRACE_USE_BACKTRACE -#endif - -#ifndef __cplusplus -# include - -#else -# include -//! Holds the C-style interface for the stack trace routines -namespace stacktrace { -extern "C" { -#endif /* __cplusplus */ - -typedef int machineInstruction; //!< typedef in case type needs to change on other platforms (i.e. long for 64 bit architectures?) - -//! Stores information about a single stack frame -struct StackFrame { - -#ifdef STACKTRACE_USE_BACKTRACE - //! pointer to array of return addresses, shared by all StackFrames in the list - void*** packedRA; - //! pointer to number of entries available at #packedRA - size_t* packedRAUsed; - //! pointer to size of array at #packedRA - size_t* packedRACap; - //! entry in #packedRA corresponding to this frame - size_t depth; - //! return address, points to instruction being executed within current frame - void* ra; -#else - //! stack pointer, points to end of stack frame - void * sp; - -# if defined(__PIC__) && (defined(__MIPSEL__) || defined(__MIPS__)) - //! return address, points to instruction being executed within current frame - /*! Note that this is the address that is being returned to by the @e sub-function, - * @e not the address that this frame itself is returning to. - * When executing position independent code (PIC), this is the address relative - * to #gp. In other words, subtract this from #gp to get current memory address, - * or subtract from the binary's _gp symbol to get link-time address (for looking up file/line) */ - size_t ra; - - //! global offset used in position independent code (PIC) - /*! subtract #ra from this to get the actual run-time memory address of the instruction */ - size_t gp; - -# else - //! return address, points to instruction being executed within current frame - /*! Note that this is the address that is being returned to by the @e sub-function, - * @e not the address that this frame itself is returning to. */ - machineInstruction * ra; -# endif /* __PIC__ */ - -# ifdef DEBUG_STACKTRACE - //! if DEBUG_STACKTRACE is defined, this field is available which, if non-zero, will cause debugging info to be displayed on each unroll - int debug; -# endif -#endif - - //! points to the caller's stack frame (stack frame of function which called this one), may be NULL or self-referential at end of list - /*! a self-referential value indicates the frame is not the last on the stack, but is the last recorded. */ - struct StackFrame * caller; - -}; - - -//! stores information about the caller's stack frame into @a frame -void getCurrentStackFrame(struct StackFrame* frame); - -//! stores information about the caller to @a curFrame into @a nextFrame -/*! @return 0 if error occurred (i.e. bottom of the stack), non-zero upon success - * @a nextFrame @e can be the same instance as @a curFrame, will update in place. - * @a curFrame->caller will be set to @a nextFrame. */ -int unrollStackFrame(struct StackFrame* curFrame, struct StackFrame* nextFrame); - -//! frees a list of StackFrames, such as is returned by recordStackTrace -void freeStackTrace(struct StackFrame* frame); - -//! preallocates a stack trace of a particular size (doesn't actually perform a stack trace, merely allocates the linked list) -/*! this is a good idea if you want to do a stack trace within an exception handler, which might have been triggered by running out of heap */ -struct StackFrame* allocateStackTrace(unsigned int size); - -//! dumps stored stack trace to stderr -void displayStackTrace(const struct StackFrame* frame); - -#ifndef __cplusplus - -//! dumps current stack trace to stderr, up to @a limit depth and skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -void displayCurrentStackTrace(unsigned int limit, unsigned int skip); - -//! repeatedly calls unrollStackFrame() until the root frame is reached or @a limit is hit, skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -struct StackFrame * recordStackTrace(unsigned int limit, unsigned int skip); -//! repeatedly calls unrollStackFrame() until the root frame is reached or end of @a frame list is hit, skipping the top @a skip frames -/*! This is handy for reusing previously allocated frames, returns the unused portion (if return value equals @a frame, none were used -- implies never cleared @a skip) */ -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip); - -#else /* __cplusplus */ - -//! dumps current stack trace to stderr, up to @a limit depth and skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -void displayCurrentStackTrace(unsigned int limit=-1U, unsigned int skip=0); - -//! repeatedly calls unrollStackFrame() until the root frame is reached or @a limit is hit, skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -struct StackFrame * recordStackTrace(unsigned int limit=-1U, unsigned int skip=0); -//! repeatedly calls unrollStackFrame() until the root frame is reached or end of @a frame list is hit, skipping the top @a skip frames -/*! This is handy for reusing previously allocated frames, returns the unused portion (if return value equals @a frame, none were used -- implies never cleared @a skip) */ -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip=0); - -} -} - -#endif /* __cplusplus */ - -/*! @file - * @brief Describes functionality for performing stack traces - * @author ejt (Creator) - * - * $Author: ejtttje $ - * $Name: $ - * $Revision: 1.2 $ - * $State: Exp $ - * $Date: 2009/11/20 00:50:23 $ - */ -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h deleted file mode 100644 index fb8c53da..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#ifndef functors_H_ -#define functors_H_ - -namespace stlx -{ - template - void delete_fntr(T *t) - { - if (t) - { - try - { - delete t; - t = 0; - } - catch(...) - { - } - } - } -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h deleted file mode 100644 index 89ec3a9c..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h +++ /dev/null @@ -1,324 +0,0 @@ -#pragma once -#ifndef _stlx_H_ -#define _stlx_H_ - -#include - -namespace stlx { - -template -struct triple -{ - typedef Type1 first_type; - typedef Type2 second_type; - typedef Type3 third_type; - Type1 first; - Type2 second; - Type3 third; - triple(){} - triple(const Type1& __Val1, const Type2& __Val2,const Type3& __Val3) - :first(__Val1),second(__Val2),third(__Val3){} - template - triple(const triple& _Right) - :first(_Right.first),second(_Right.second),third(_Right.third){} -}; - -template - triple make_triple( - Type1 _Val1, - Type2 _Val2, - Type3 _Val3 - ) - { return triple(_Val1,_Val2,_Val3); } - -/// templates which allow STL iterations using a class and it's method -/// (as opposed to mem_fun which requires the container class to hold the -/// class and it's method -/// -/// ie -/// -/// vector a -/// B b; -/// for_each(a.begin(),a.end(),class_method_ref(b,B::foo)) -/// -/// this will invoke b.foo(a) for each element. - -template -class class_method_functor: public std::unary_function -{ - typedef Result (T::*methodType)(P s); - T *m_class; - methodType m_method; -public: - class_method_functor(T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) { return (m_class->*m_method)(s); } -}; - -template -class class_method_functor_const: public std::unary_function -{ - typedef Result (T::*methodType)(P s) const; - const T *m_class; - methodType m_method; -public: - class_method_functor_const(const T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) const { return (m_class->*m_method)(s); } -}; - -template -class class_method_ref_functor: public std::unary_function -{ - typedef Result (T::*methodType)(P s); - T &m_class; - methodType m_method; -public: - class_method_ref_functor(T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) { return (m_class.*m_method)(s); } -}; - -template -class class_method_ref_functor_const: public std::unary_function -{ - typedef Result (T::*methodType)(P s) const; - const T &m_class; - methodType m_method; -public: - class_method_ref_functor_const(const T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) const { return (m_class.*m_method)(s); } -}; - -template -class class_method_functor1: public std::binary_function -{ - typedef Result (T::*methodType)(P s,PP ss); - T *m_class; - methodType m_method; -public: - class_method_functor1(T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) { return (m_class->*m_method)(s,ss); } -}; - -template -class class_method_functor1_const: public std::binary_function -{ - typedef Result (T::*methodType)(P s,PP ss) const; - const T *m_class; - methodType m_method; -public: - class_method_functor1_const(const T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) const { return (m_class->*m_method)(s,ss); } -}; - -template -class class_method_ref_functor1: public std::binary_function -{ - typedef Result (T::*methodType)(P s,PP ss); - T &m_class; - methodType m_method; -public: - class_method_ref_functor1(T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) { return (m_class.*m_method)(s,ss); } -}; - -template -class class_method_ref_functor1_const: public std::binary_function -{ - typedef Result (T::*methodType)(P s,PP ss) const; - const T &m_class; - methodType m_method; -public: - class_method_ref_functor1_const(const T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) const { return (m_class.*m_method)(s,ss); } -}; - -template - class_method_functor - class_method(T *c,Result (T::*m)(P s)) - { return class_method_functor(c,m); } - -template - class_method_functor_const - class_method(const T *c,Result (T::*m)(P s) const) - { return class_method_functor_const(c,m); } - -template - class_method_ref_functor - class_method_ref(T &c,Result (T::*m)(P s)) - { return class_method_ref_functor(c,m); } - -template - class_method_ref_functor_const - class_method_ref(const T &c,Result (T::*m)(P s) const) - { return class_method_ref_functor_const(c,m); } - -template - class_method_functor1 - class_method(T *c,Result (T::*m)(P s,PP ss)) - { return class_method_functor1(c,m); } - -template - class_method_functor1_const - class_method(const T *c,Result (T::*m)(P s,PP ss) const) - { return class_method_functor1_const(c,m); } - -template - class_method_ref_functor1 - class_method_ref(T &c,Result (T::*m)(P s,PP ss)) - { return class_method_ref_functor1(c,m); } - -template - class_method_ref_functor1_const - class_method_ref(const T &c,Result (T::*m)(P s,PP ss) const) - { return class_method_ref_functor1_const(c,m); } - -/////////////////////////////////////////////////////////// -/* - Allows search matches on members - - class foo - { - string m_memberToMatchOn; - }; - - vector myList; - find_if(myList.begin(),m_myList.end(), - member_match(string("hello"),&foo::m_memberToMatchOn)); - -*/ -//////////////////////////////////////////////////////////// -template -class member_match_functor -{ -private: - T m_value; - T (OBJ::*m_member); -public: - member_match_functor(const T &s,T OBJ::*m):m_value(s),m_member(m){} - bool operator()(const OBJ &obj) throw() - { - return m_value == (obj.*m_member); - } -}; - -template - member_match_functor member_match(const T &s,T OBJ::* m) - { return member_match_functor(s,m); } - -template -class member2_match_functor -{ -private: - T1 m_value1; - T1 (OBJ::*m_member1); - T2 m_value2; - T2 (OBJ::*m_member2); -public: - member2_match_functor(const T1 &s1,T1 OBJ::*m1,const T2 &s2,T2 OBJ::*m2):m_value1(s1),m_member1(m1),m_value2(s2),m_member2(m2){} - bool operator()(const OBJ &obj) throw() - { return ((m_value1 == (obj.*m_member1)) && (m_value2 == (obj.*m_member2))); } -}; - -template - member2_match_functor member2_match(const T1 &s1,T1 OBJ::* m1,const T2 &s2,T2 OBJ::* m2) - { return member2_match_functor(s1,m1,s2,m2); } - -//*********************************************************** -//* accumulate with a delimiter -//* -//*********************************************************** -template inline _Ty accumulate_with_delimiter(_InIt _First, _InIt _Last, _Ty _Val, _Tdel _del) -{ // return sum of _Val and all in [_First, _Last) - if (_First != _Last) - { - _Val = _Val + *_First; - ++_First; - } - - for (; _First != _Last; ++_First) - { - _Val = _Val + _del + *_First; - } - return (_Val); -} - -// with binop. Not sure if this one makes much sense -template inline _Ty accumulate_with_delimiter(_InIt _First, _InIt _Last, _Ty _Val, _Tdel _del,_Fn2 _Func) -{ // return sum of _Val and all in [_First, _Last), using _Func - if (_First != _Last) - { - _Val = _Func(_Val, *_First); - ++_First; - } - - for (; _First != _Last; ++_First) - { - _Val = _Val + _del; - _Val = _Func(_Val, *_First); - } - return (_Val); -} - -//********************************************************** -//* streamOutFunctor -//* -//* functor class which will output an element to a stream -//* with a prefix and suffix string. Useful for outputing -//* elements of a container -//********************************************************* -template class streamOutFunctor -{ - std::ostream &m_o; - const std::string m_prefix; - const std::string m_suffix; -public: - inline streamOutFunctor(std::ostream &o) : m_o(o){} - inline streamOutFunctor(std::ostream &o,const std::string &prefix,const std::string &suffix) - : m_o(o),m_prefix(prefix),m_suffix(suffix){} - inline void operator()(const T &t) { m_o << m_prefix << t << m_suffix; } -}; - -//// for use on maps. Sort of the opposite of lower_bound. Returns the largest element -//// less than the key -template typename Map::const_iterator -greatest_less(Map const& m, typename Map::key_type const& k) { - typename Map::const_iterator it = m.lower_bound(k); - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template typename Map::iterator -greatest_less(Map & m, typename Map::key_type const& k) { - typename Map::iterator it = m.lower_bound(k); - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template typename Map::const_iterator -greatest_less_or_equal(Map const& m, typename Map::key_type const& k) { - typename Map::const_iterator it = m.lower_bound(k); - if ((it != m.end()) && ((*it).first == k)) - return it; - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template typename Map::iterator -greatest_less_or_equal(Map & m, typename Map::key_type const& k) { - typename Map::iterator it = m.lower_bound(k); - if ((it != m.end()) && ((*it).first == k)) - return it; - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h deleted file mode 100644 index 647fc242..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h +++ /dev/null @@ -1,383 +0,0 @@ -#pragma once -#ifndef _stringUtils_H_ -#define _stringUtils_H_ - -#include -#include -#include -#include -#include -#include - -namespace stringUtil -{ - #ifdef _WIN32 - inline std::string eol() throw() { return "\r\n"; } - #elif MACINTOSH - inline std::string eol() throw() { return "\r"; } - #else - inline std::string eol() throw() { return "\n"; } - #endif - - ////////////////////////////////////////////////////////////////// - //////////////////// String Conversion /////////////////////////// - ////////////////////////////////////////////////////////////////// - - // the 'safe' functions are to avoid bad_cast exceptions when the - // passed in type does not have a facet, or the facet indicates that - // the value is out of range. Since I may be running this against Unicode - // strings, I need to deal with this. Most likely there's a way to set the - // proper locale and facet so the error doesn't occur, but this is beyond - // me right now - NMR - template - bool safe_is_alpha(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isalpha((char)v,std::locale()); - } - - template - bool safe_is_digit(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isdigit((char)v,std::locale()); - } - - template - bool safe_is_space(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isspace((char)v,std::locale()); - } - - template - T safe_to_lower(T v) - { - if (((unsigned int)v) > 0x7f) return v; - return std::tolower((char)v,std::locale()); - } - - template - T safe_to_upper(T v) - { - if (((unsigned int)v) > 0x7f) return v; - return std::toupper((char)v,std::locale()); - } - - template - S toLower(const S &s) throw() - { - S result; - for (typename S::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (stringUtil::safe_is_alpha(*i) ? stringUtil::safe_to_lower(*i) : *i); - } - - return result; - } - - template - S toUpper(const S &s) throw() - { - S result; - for (typename S::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (stringUtil::safe_is_alpha(*i) ? stringUtil::safe_to_upper(*i) : *i); - } - - return result; - } - - template - inline bool compareStringsWithoutCase(const S &s1,const S &s2) throw() - { - S s1c(toLower(s1)); - S s2c(toLower(s2)); - return (s1c == s2c); - } - - inline std::string dosToUnix(const std::string &s) throw() - { - std::string result; - bool r(false); - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - if ((*i) == '\n') - { - if (r) - { - result += '\n'; - } - else - { - result.push_back(*i); - } - r = false; - } - else if ((*i) == '\r') - { - if (r) - result.push_back('\r'); - r = true; - } - else - { - if (r) - result.push_back('\r'); - r = false; - result.push_back(*i); - } - } - return result; - } - - inline std::string unixToDos(const std::string &s) throw() - { - std::string result; - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - if ((*i) == '\n') - result += "\r\n"; - else - result.push_back(*i); - } - return result; - } - - //*************************************************************** - //* tos, tows - //* - //* These templates and overloaded functions allow you to convert - //* any streamable value to a string or wide-string. It can be a - //* great convenience to be able to do - //* - //* string("test five ") + tos(5); - //* - //* instead of - //* - //* ostringstream o; - //* o << "test five " << 5; - //* o.str() - //* - //* tows is just like tos, but for wide strings. You can also use these - //* to convert standard strings to wide strings and vice-versa - //* - //* for example: - //* - //* wstring ws = tows(string("hello")); - //* string s = tos(wstring(L"goodbye")); - //* - //************************************************************************ - - template - S tobs(T v) // to basic string - { - std::basic_ostringstream o; - o << v; - return o.str(); - } - - template - S tobs(const S v) { return v; } - template - S tobs(const typename S::value_type *v) { return S(v); } - - template - std::string tos(t v) - { - std::ostringstream o; - o << v; - return o.str(); - } - - inline std::string tos(const std::string &v) { return v; } - inline std::string tos(const char *v) { return std::string(v); } - - template - std::string tohex(t v) - { - std::ostringstream o; - o << std::hex << v; - return o.str(); - } - - #ifdef _WIN32 - template - std::wstring tows(t v) - { - std::wostringstream o; - o << v; - return o.str(); - } - - inline std::string tos(const wchar_t *value) - { - if (!value) return ""; - - size_t len = ::wcslen(value); - - char *s = new char[len + 1]; - ::wcstombs(s,value,len); - s[len] = '\0'; - std::string result(s); - delete [] s; - - return result; - } - - inline std::string tos(const std::wstring &s) - { - return tos(s.c_str()); - } - - inline std::wstring tows(const char *value) - { - if (!value) return L""; - - size_t len = ::strlen(value); - - wchar_t *s = new wchar_t[len + 1]; - ::mbstowcs(s,value,len); - s[len] = 0; - std::wstring result(s); - delete [] s; - - return result; - } - - inline std::wstring tows(const std::string &value) - { - return tows(value.c_str()); - } - #endif - - //////////////////////////////////////////////////////////////////// - ////////////////////// String stripping //////////////////////////// - //////////////////////////////////////////////////////////////////// - - //****************************************************************** - //* A collection of templates and functions to allow stripping of - //* leading and trailing items from a string - //* - //* --- stripItem - //* - //* Strip leading and trailing items from a container - //* template parameters are the container type, and a function which returns - //* true if we have the value to strip - //* - //* - //* ---- stripChar - //* strips characters off a string by either a function (which returns - //* true if the character is found), or by an actual character mathc. - //* There are also forms for wide strings - //* - //* ---- stripWhitespace - //* removes leading and trailing spaces from a string using isspace() - //************************************************************************* - template - S stripItem(const S &s,F func,bool stripLeading = true, bool stripTrailing = true) - { - typename S::const_iterator leftit = s.begin(); - typename S::const_reverse_iterator rightit = s.rbegin(); - - if (s.length() < 1 ) - return s; - - if (stripLeading) - { - while (leftit != s.end() && func(*leftit)) - { - ++leftit; - } - } - if (leftit == s.end()) return S(); - - if (stripTrailing) - { - while (rightit != s.rend() && func(*rightit)) - { - ++rightit; - } - } - if (rightit == s.rend()) return S(); - - typename S::const_iterator endpnt = (++rightit).base(); - - if (leftit > endpnt) - return S(); - - return s.substr( (leftit - s.begin()) ,(endpnt-leftit) +1); - } - - template - S stripChar(const S &s,FUNC f,bool stripLeading = true,bool stripTrailing = true) - { return stripItem(s,f,stripLeading,stripTrailing); } - - template - inline S stripChar(const S &s,typename S::value_type c,bool stripLeading = true,bool stripTrailing = true) - { return stripItem(s,bind1st(std::equal_to(),c),stripLeading,stripTrailing); } - - template - bool myspace(S c) { return safe_is_space(c); } - template - inline S stripWhitespace(const S &s) { return stripChar(s,stringUtil::myspace); } - - template - bool myalphadigit(S c) { return !(safe_is_alpha(c) || safe_is_digit(c)); } - template - inline S stripAlphaDigit(const S &s) { return stripChar(s,stringUtil::myalphadigit); } - - //***************************************************************** - //* tokenizer - //* - //* break up a string into substrings based on a delimiter item. - //****************************************************************** - template - std::vector tokenizer_if(const S &ins,F isdelimiter) throw() - { - std::vector result; - S accum; - - for (typename S::const_iterator i = ins.begin(); i != ins.end(); ++i) - { - if (!isdelimiter(*i)) - { - accum.push_back(*i);// was += - } - else - { - if (!accum.empty()) - { - result.push_back(accum); - accum = S(); - } - } - } - - if (!accum.empty()) - { - result.push_back(accum); - } - return result; - } - - template - inline std::vector tokenizer(const S &ins,typename S::value_type delim) throw() - { return tokenizer_if(ins,bind1st(std::equal_to(),delim)); } - - inline std::string escapeBackslashes(const std::string &s) throw() - { - std::string result; - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (*i); - if ((*i) == '\\') - result += (*i); - } - return result; - } - - ////////////////////////////////////////////////////////////////////////// -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h deleted file mode 100644 index 7b4de1bf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once -#ifndef MT_stl_H_ -#define MT_stl_H_ - -#include -#include "thread.h" - -/***** STL like containers that have Multithread features *******/ - -template -class MT_queue -{ - std::queue m_container; - mutable AOL_namespace::mutex m_mutex; - conditionVariable m_conditionVariable; - -public: - typedef T value_type; - typedef T message_t; - typedef typename std::queue::size_type size_type; - - MT_queue(){} - - size_type size() const - { - stackLock sl(m_mutex); - return m_container.size(); - } - - bool empty() const - { - stackLock sl(m_mutex); - return m_container.empty(); - } - - // note, it is important that this is T and not T&. If it was - // T& and we did something like this - // - // T &f = mtq.front(); - // - // Then f would be able to manipulate a queue entry outside the - // protection of the lock. We avoid this by returning T (a copy) - // instead. - T front() const - { - stackLock sl(m_mutex); - return m_container.front(); - } - - void has_front(T &t,bool &has) const - { - stackLock sl(m_mutex); - has = false; - if (!m_container.empty()) - { - has = true; - t = m_container.front(); - } - } - - void push(const T &t) // push_back - { - stackLock sl(m_mutex); - m_container.push(t); - m_conditionVariable.signal(); - } - - void pop() // pop_front - { - stackLock sl(m_mutex); - if (!m_container.empty()) - { - m_container.pop(); - } - } - - std::queue getAll() - { - stackLock sl(m_mutex); - - std::queue result = m_container; - m_container.clear(); - return result; - } - - void clear() - { - stackLock sl(m_mutex); - m_container.clear(); - } - - // blocking retrieval. Will block until something is in the - // queue to get - T get() - { - stackLock sl(m_mutex); - - while (m_container.empty()) - { - m_conditionVariable.wait(m_mutex); - } - - T t = m_container.front(); - m_container.pop(); - - return t; - } -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h deleted file mode 100644 index 8b47bf09..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef messageThread_H_ -#define messageThread_H_ - -#include "thread.h" -#include "MT_stl.h" -#include -#ifdef _WIN32 -#include -#else -#include -#endif - -#ifndef _WIN32 -#define _ASSERTE assert -#endif - -///////////////////////////////////////////////////////////////// -//* templates that allow you to build a message driven thread -//* -//* -//* define a class that is your handler. It must have a type -//* message_t which is the message type, and a method -//* bool operator()(const message_t &m) which is the message handler. -//* this method should return false when all processing is done and -//* the thread should shutdown -//* -/* example - -class mh -{ - string m_string; - -public: - struct message - { - int m_v; - message(int v):m_v(v){} - }; - typedef message message_t; - -protected: - - bool operator()(const message_t &mm) - { - if (!mm.m_v) return false; // if value is zero, then we are done - ::MessageBox(0,tos(mm.m_v).c_str(),m_string.c_str(),MB_OK); - return true; - } - - mh(const string &s):m_string(s){} -}; - -main() -{ -messageThread m("this is a test"); -m.start(); -m.postMessage(m::message(1)); -m.postMessage(m::message(2)); -m.postMessage(m::message(3)); -m.postMessage(m::message(4)); -m.postMessage(m::message(0)); -m.join(); -} - -*/ - -template -class messageHandler: public Handler -{ -private: - Queue m_queue; - -protected: - unsigned operator()() throw() - { - unsigned result = (unsigned)-1; - try - { - while (true) - { - typename Queue::value_type m = m_queue.get(); - if (!Handler::operator()(m)) - break; - } - result = 0; - } - catch(...){} - - return result; - } -public: - inline void postMessage(const typename Queue::message_t &m) - { - m_queue.push(m); - } - - inline typename Queue::size_type pendingMessages() const throw() { return m_queue.size(); } - inline void clearMessageQueue() throw() { m_queue.clear(); } - - messageHandler(){} - template messageHandler(const P1 &p1):Handler(p1){} - template messageHandler(const P1 &p1,const P2 &p2):Handler(p1,p2){} - template messageHandler(const P1 &p1,const P2 &p2,const P3 &p3):Handler(p1,p2,p3){} - template messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4):Handler(p1,p2,p3,p4){} - template messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5):Handler(p1,p2,p3,p4,p5){} - template messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template messageHandler(P1 &p1):Handler(p1){} -}; - -template -class messageThread: public Tthread > > -{ -public: - messageThread(){} - template messageThread(const P1 &p1):Tthread > >(p1){} - template messageThread(const P1 &p1,const P2 &p2):Tthread > >(p1,p2){} - template messageThread(const P1 &p1,const P2 &p2,const P3 &p3):Tthread > >(p1,p2,p3){} - template messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4):Tthread > >(p1,p2,p3,p4){} - template messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5):Tthread > >(p1,p2,p3,p4,p5){} - template messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6):Tthread > >(p1,p2,p3,p4,p5,p6){} - template messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7):Tthread > >(p1,p2,p3,p4,p5,p6,p7){} - template messageThread(P1 &p1):Tthread > >(p1){} -}; - -//////////////// Finite state machine -template -class fsm: public Handler { - -public: - typedef RETVAL (Handler::*state)(const typename Handler::message_t &m);// throw(); // should not throw an exception - - // this is broken in VC 7, so trans must be made public - //friend class Handler; -public: - RETVAL operator()(const typename Handler::message_t &m) throw() { _ASSERTE(m_State);return (this->*m_State)(m); } - - void trans(state target) throw() - { - if (target == m_State) return; - _ASSERTE(m_State); -#ifndef NDEBUG - state tmp = m_State; -#endif - (this->*m_State)(Handler::message_t::exitStateMessage()); -#ifndef NDEBUG - // sanity check - don't change states in exit_sig - _ASSERTE(tmp == m_State); -#endif - m_State = target; - (this->*m_State)(Handler::message_t::enterStateMessage()); - _ASSERTE(m_State == target); // don't change states in enter_sig - } -public: - - fsm():m_State(&fsm::initialState){} - template fsm(const P1 &p1): - Handler(p1),m_State(&fsm::initialState){} - template fsm(P1 &p1): - Handler(p1),m_State(&fsm::initialState){} - - template fsm(const P1 &p1,const P2 &p2): - Handler(p1,p2),m_State(&fsm::initialState){} - template fsm(const P1 &p1,P2 &p2): - Handler(p1,p2),m_State(&fsm::initialState){} - template fsm(P1 &p1,P2 &p2): - Handler(p1,p2),m_State(&fsm::initialState){} - - template fsm(const P1 &p1,const P2 &p2,const P3 &p3): - Handler(p1,p2,p3),m_State(&fsm::initialState){} - template fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4): - Handler(p1,p2,p3,p4),m_State(&fsm::initialState){} - template fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5): - Handler(p1,p2,p3,p4,p5),m_State(&fsm::initialState){} - template fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6): - Handler(p1,p2,p3,p4,p5,p6),m_State(&fsm::initialState){} - template fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7): - Handler(p1,p2,p3,p4,p5,p6,p7),m_State(&fsm::initialState){} - -private: - state m_State; -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp deleted file mode 100644 index 3100453a..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp +++ /dev/null @@ -1,375 +0,0 @@ -#include "threading/thread.h" -#ifndef _WIN32 -#include -#include "global.h" -#else -#include -#endif - -using namespace std; - -// thread safe sleep function -// which is clamped to 10 ms. -void safe_sleep(int sec, int usec) -{ -#ifdef _WIN32 - int ms = (usec / 1000); - ms += (sec * 1000); - if (ms < 10) ms = 10; - ::Sleep(ms); -#else - struct timeval mytime; - if (!sec && (usec < 10000)) usec = 10000; - mytime.tv_sec = sec; - mytime.tv_usec = usec; - select(0, NULL, NULL, NULL, &mytime); -#endif -} - -#ifndef _WIN32 -#include -#include -#endif - -using namespace AOL_namespace; - -rwLock::rwLock() -{ -#ifdef PTHREAD_RWLOCK_PREFER_WRITER_NP - pthread_rwlockattr_t attr; - ::pthread_rwlockattr_init (&attr); - ::pthread_rwlockattr_setkind_np (&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP); - int r = ::pthread_rwlock_init (&m_lock, &attr); - ::pthread_rwlockattr_destroy (&attr); -#else - int r = ::pthread_rwlock_init (&m_lock, NULL); -#endif - if (r) - throw runtime_error("Could not create rwlock"); -} - -rwLock::~rwLock() -{ - ::pthread_rwlock_destroy (&m_lock); -} - -void rwLock::lock() -{ - ::pthread_rwlock_wrlock (&m_lock); -} - -void rwLock::rdLock() -{ - ::pthread_rwlock_rdlock (&m_lock); -} - -bool rwLock::tryRdLock() -{ - int n = ::pthread_rwlock_tryrdlock (&m_lock); - if (n == 0) - return true; - if (n != EBUSY) - throw runtime_error("Error with trying rwlock, " + n); - return false; -} - -void rwLock::unlock() -{ - ::pthread_rwlock_unlock (&m_lock); -} - - -mutex::mutex() throw(runtime_error) -{ - if (::pthread_mutex_init(&m_mutex, NULL)) - { - throw runtime_error("Could not create mutex"); - } -} - -mutex::~mutex() throw() -{ - ::pthread_mutex_destroy(&m_mutex); -#ifdef _WIN32 - m_mutex = NULL; -#endif -} - -void mutex::lock() throw(runtime_error) -{ - if (::pthread_mutex_lock(&m_mutex)) - { - throw runtime_error("Could not lock mutex"); - } -} - -bool mutex::timedLock(int milliseconds) throw(runtime_error) -{ - if (milliseconds == INFINITE) - { - lock(); - return true; - } - - if (milliseconds == 0) - { - int err = ::pthread_mutex_trylock(&m_mutex); - if (err == EBUSY) - { - return false; - } - if (err) - { - throw runtime_error("Could not trylock mutex"); - } - return true; - } - - int tenth_second_sleep_intervals = (milliseconds / 100); - for (int x = 0; x < tenth_second_sleep_intervals; ++x) - { - int err = ::pthread_mutex_trylock(&m_mutex); - if (!err) - { - return true; - } - safe_sleep(0, 100000); - if (err == EBUSY) - { - continue; - } - throw runtime_error("Could not trylock mutex"); - } - return false; -} - -void mutex::unlock() throw(runtime_error) -{ - if (::pthread_mutex_unlock(&m_mutex)) - { - throw runtime_error("Could not unlock mutex"); - } -} - -conditionVariable::conditionVariable() throw(runtime_error) -{ - if (::pthread_cond_init(&m_conditionVariable,NULL)) - { - throw runtime_error("Could not create conditionVariable"); - } -} - -conditionVariable::~conditionVariable() throw() -{ - ::pthread_cond_destroy(&m_conditionVariable); -} - -void conditionVariable::wait(mutex &m) throw(runtime_error) -{ - if (::pthread_cond_wait(&m_conditionVariable,&m.m_mutex)) - { - throw runtime_error("Could not wait on condition variable"); - } -} - -bool conditionVariable::timedWait(AOL_namespace::mutex &m,int milliseconds) throw(runtime_error) -{ - struct timespec ts; - ts.tv_sec = ::time(NULL) + (milliseconds / 1000); - ts.tv_nsec = (milliseconds - ((milliseconds / 1000) * 1000)) * 1000000; - int err = ::pthread_cond_timedwait(&m_conditionVariable,&m.m_mutex,&ts); - if (!err) - { - return true; - } - if (err == ETIMEDOUT) - { - return false; - } - throw runtime_error("timedWait error"); -} - -void conditionVariable::signal() throw(runtime_error) -{ - if (::pthread_cond_signal(&m_conditionVariable)) - { - throw runtime_error("Could not signal condition variable"); - } -} - -void conditionVariable::broadcast() throw(runtime_error) -{ - if (::pthread_cond_broadcast(&m_conditionVariable)) - { - throw runtime_error("Could not broadcast on condition variable"); - } -} - -#ifdef _WIN32 -event::event(BOOL bManualReset) throw(runtime_error) : m_event(NULL) -{ - m_event = ::CreateEvent(NULL,bManualReset,FALSE,NULL); - if (!m_event) - { - throw runtime_error("Could not create event object"); - } -} - -event::~event() throw() -{ - forgetHandleNULL(m_event); -} - -void event::wait() throw(std::runtime_error) -{ - if (::WaitForSingleObject(m_event,INFINITE) != WAIT_OBJECT_0) - { - throw runtime_error("event::wait() - wait error"); - } -} - -void event::setEvent() throw(std::runtime_error) -{ - if (!::SetEvent(m_event)) - { - throw runtime_error("event::setEvent() - set error"); - } -} - -void event::resetEvent() throw(std::runtime_error) -{ - if (!::ResetEvent(m_event)) - { - throw runtime_error("event::resetEvent() - reset error"); - } -} -#else -event::event(bool manualReset) throw(runtime_error) - : m_manualReset(manualReset), m_signaled(false) -{ -} - -void event::wait() throw(runtime_error) -{ - stackLock sl(m_mutex); - while (!m_signaled) - { - m_conditionVariable.wait(m_mutex); - } - if (!m_manualReset) - { - m_signaled = false; - } -} - -bool event::timedWait(int milliseconds) throw(runtime_error) -{ - if (milliseconds == INFINITE) - { - wait(); - return true; - } - - if (milliseconds == 0) - { - stackLock sl(m_mutex); - bool result = m_signaled; - if (m_signaled && !m_manualReset) - { - m_signaled = false; - } - return result; - } - - stackLock sl(m_mutex); - while(!m_signaled) - { - if (!m_conditionVariable.timedWait(m_mutex,milliseconds)) - { - return false; - } - } - - if (!m_manualReset) - { - m_signaled = false; - } - return true; -} - -void event::setEvent() throw(runtime_error) -{ - stackLock sl(m_mutex); - m_signaled = true; - m_conditionVariable.broadcast(); -} - -void event::resetEvent() throw(runtime_error) -{ - stackLock sl(m_mutex); - m_signaled = false; -} - -int WaitForSingleObject(Win32SyncObject &o, int milli_timeout) throw() -{ - int result = WAIT_ABANDONED; - - try - { - result = (o.syncObjectTimedWait(milli_timeout) ? WAIT_OBJECT_0 : WAIT_TIMEOUT); - } - catch(...) {} - - return result; -} - -int WaitForMultipleObjects(int count, Win32SyncObjectPtr *objs, bool waitall, int milliseconds) throw() -{ - __uint64 start = time_now_ms(); - - try - { - std::vector signaled(count,false); - int sig_count = 0/*, ms = (milliseconds % 1000)*/, - quantum = 100;/*(ms > 100 ? (ms / 10) : 100);*/ - - // as milliseconds is only set as '1000' in main.cpp - // then we don't need to do the checking and can just - // hard-code the quantum value to give 100ms interval - - for (int x = 0; (x <= milliseconds) || (milliseconds == INFINITE); x += quantum) - { - for (int oo = 0; oo < count; ++oo) - { - if (!signaled[oo]) - { - if (objs[oo]->syncObjectTimedWait(0)) - { - signaled[oo] = true; - ++sig_count; - if (!waitall) - { - return WAIT_OBJECT_0 + oo; - } - if (sig_count == count) - { - return WAIT_OBJECT_0; - } - } - } - } //for - - safe_sleep(0, quantum * 1000); - - __uint64 now = time_now_ms(); - if ((int)(now - start) >= milliseconds) - { - break; - } - } // for - return WAIT_TIMEOUT; - } //try - catch(...) {} - return WAIT_ABANDONED; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h deleted file mode 100644 index 05fd8033..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h +++ /dev/null @@ -1,575 +0,0 @@ -#pragma once -#ifndef _THREAD_H_ -#define _THREAD_H_ - -#ifdef _WIN32 -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#endif -#include -#include "macros.h" - -/////////////////////////////////////////////////////////////////////////////// -/// Various thread classes for applications that need to do threading and -/// aren't going to be including various Microsoft class libraries -////////////////////////////////////////////////////////////////////////////// - - -//******************************************************************** -//* Tthread and thread -//* -//* allows you to run code on a thread via a template. Create a class -//* which has a method const unsigned operator()() and use it to instantiate -//* the template. If you want to use a bare function, encapsulate it in the -//* class pointer_to_thread_function. The Vthread class uses the traditional -//* virtual function approach -/* - Example: - - class foo - { - const unsigned operator()() - { - for (int x = 0; x < 4: ++x) - { - cout << x << endl; - } - return 1; - } - }; - - unsigned bar() - { - for (int x = 0; x < 4; ++x) - cout << x << endl; - return 1; - } - - class narf: public Vthread - { - const unsigned operator()() - { - for (int x = 0; x < 4; ++x) - { - cout << x << endl; - } - return 1; - } - }; - - main() - { - Tthread f; - Tthread b(bar); - narf n; - n.start(); - f.start(); - b.start(); - ::WaitForSingleObject(f,INFINITE); // or f.join(); - ::WaitForSingleObject(b,INFINITE); // or b.join(); - ::WaitForSingleObject(n,INFINITE); // or n.join(); - } - -*/ - -//********************************************************************** - -#ifdef _WIN32 -#ifndef ASSERT -#define ASSERT(x) { if (!(x)) ::MessageBoxW(0,L"Assert failure",L"ASSERT",MB_OK); } -#endif -#else -#ifndef ASSERT -#define ASSERT(x) assert(x) -#endif -#endif - -#ifdef _WIN32 -#define THREAD_FUNC unsigned __stdcall -#else -#define THREAD_FUNC void* -#endif - -#ifdef _WIN32 -class thread_CORE -{ -#pragma warning(push) -#pragma warning(disable: 4127) -#pragma warning(disable: 4100) - nocopy(thread_CORE) -#pragma warning(pop) - -protected: - HANDLE m_threadHandle; - -public: - static int standard_signal_block() throw(){return 0;} // unix only - - thread_CORE() : m_threadHandle(0) {} - - ~thread_CORE() throw() - { - if (m_threadHandle) - { - ::WaitForSingleObject(m_threadHandle, INFINITE); - ::CloseHandle(m_threadHandle); - } - m_threadHandle = 0; - } - - inline void join() - { - if (m_threadHandle) - { - ::WaitForSingleObject(m_threadHandle, INFINITE); - } - } - inline operator HANDLE() const throw() { return m_threadHandle; } - static unsigned long getCurrentThreadID() { return (unsigned long)GetCurrentThreadId(); } -}; - -template -class Tthread: public thread_CORE, public Handler -{ - static inline unsigned __stdcall _start_func(void *arg) - { return reinterpret_cast *>(arg)->operator()(); } - -public: - Tthread(){} - template Tthread( P1 &p1):Handler(p1){} - template Tthread( P1 &p1, P2 &p2):Handler(p1,p2){} - template Tthread( P1 &p1, P2 &p2, P3 &p3):Handler(p1,p2,p3){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4):Handler(p1,p2,p3,p4){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5):Handler(p1,p2,p3,p4,p5){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5,P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6,P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7,P8 &p8):Handler(p1,p2,p3,p4,p5,p6,p7,p8){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11,P12 &p12):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12){} - - void start(int __unused = 1) throw(std::runtime_error) - { - unsigned m_threadIdentifier = 0; - m_threadHandle = (HANDLE)::_beginthreadex(NULL, 0, _start_func, this, 0, &m_threadIdentifier); - if (!m_threadHandle) - { - throw std::runtime_error("Could not start thread"); - } - } -}; - -class SimpleThread -{ -protected: - HANDLE m_threadHandle; - -public: - SimpleThread(unsigned (__stdcall *_start_func) (void *arg) = 0, void *user = 0) : m_threadHandle(0) - { - if (_start_func) - { - start(_start_func, user); - } - } - - ~SimpleThread() throw() - { - if (m_threadHandle) - { - ::CloseHandle(m_threadHandle); - } - m_threadHandle = 0; - } - - void start(unsigned (__stdcall *_start_func) (void *arg), void *user) throw(std::runtime_error) - { - unsigned m_threadIdentifier = 0; - m_threadHandle = (HANDLE)::_beginthreadex(NULL, 0, _start_func, user, 0, &m_threadIdentifier); - if (!m_threadHandle) - { - throw std::runtime_error("Could not start thread"); - } - } -}; - -#else - -class thread_CORE -{ - nocopy(thread_CORE) - -protected: - pthread_t m_threadHandle; - -public: - static int standard_signal_block() throw() - { - sigset_t catchset; - sigemptyset(&catchset); - sigaddset(&catchset,SIGPIPE); - sigaddset(&catchset,SIGTERM); - sigaddset(&catchset,SIGHUP); - sigaddset(&catchset,SIGINT); - sigaddset(&catchset,SIGQUIT); - sigaddset(&catchset,SIGTSTP); // ^Z allow this - sigaddset(&catchset,SIGCHLD); - sigaddset(&catchset,SIGWINCH); - sigaddset(&catchset,SIGUSR1); - sigaddset(&catchset,SIGUSR2); - return pthread_sigmask(SIG_BLOCK,&catchset,NULL); - } - - thread_CORE() : m_threadHandle(0) {} - - ~thread_CORE() throw() - { - if (m_threadHandle) - { - ::pthread_join(m_threadHandle, NULL); - } - m_threadHandle = 0; - } - - inline void join() - { - if (m_threadHandle) - { - ::pthread_join(m_threadHandle,NULL); - m_threadHandle = 0; - } - } - inline operator pthread_t() const throw() { return m_threadHandle; } - static unsigned long getCurrentThreadID() { return (unsigned long)::pthread_self(); } -}; - -template -class Tthread: public thread_CORE, public Handler -{ - static inline void* _start_func(void *arg) - { - standard_signal_block(); - long x = (long)(reinterpret_cast *>(arg))->operator()(); - return (void*)x; - } - -public: - Tthread(){} - template Tthread( P1 &p1):Handler(p1){} - template Tthread( P1 &p1, P2 &p2):Handler(p1,p2){} - template Tthread( P1 &p1, P2 &p2, P3 &p3):Handler(p1,p2,p3){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4):Handler(p1,p2,p3,p4){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5):Handler(p1,p2,p3,p4,p5){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5,P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6,P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7,P8 &p8):Handler(p1,p2,p3,p4,p5,p6,p7,p8){} - template Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11){} - template Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11,P12 &p12):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12){} - - void start(int joined = 1) throw(std::runtime_error) - { - if (joined && m_threadHandle) - { - throw std::runtime_error("Thread already exists"); - } - int ret = pthread_create(&m_threadHandle, NULL, _start_func, this); - if (ret) - { - throw std::runtime_error("Could not start thread" + std::string(ret == EAGAIN ? " [Increase the open files (ulimit -n) limit]" : "")); - } - } -}; - - -class SimpleThread -{ -public: - SimpleThread(void *(*_start_func) (void *arg) = 0, void *user = 0) - { - if (_start_func) - { - start(_start_func, user); - } - } - - void start(void *(*_start_func) (void *arg), void *user) throw(std::runtime_error) - { - pthread_t m_threadHandle = 0; - pthread_attr_t attr; - int ret = pthread_attr_init(&attr); - if (ret) - { - throw std::runtime_error("Could not start thread - pthread_attr_init failure"); - } - - ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - if (ret) - { - pthread_attr_destroy(&attr); - throw std::runtime_error("Could not start thread - pthread_attr_setdetachstate failure"); - } - - ret = pthread_create(&m_threadHandle,&attr,_start_func,user); - if (ret) - { - pthread_attr_destroy(&attr); - throw std::runtime_error("Could not start thread" + std::string(ret == EAGAIN ? " [Increase the open files (ulimit -n) limit]" : "")); - } - - pthread_attr_destroy(&attr); - } -}; -#endif - -class pointer_to_thread_function -{ -public: - typedef unsigned (*func_t)(); - - inline pointer_to_thread_function(func_t f):m_function(f){} -private: - func_t m_function; -protected: - inline const unsigned operator()() { return (*m_function)(); } -}; - -class vthread_stub -{ - protected: - virtual const unsigned operator()() = 0; - virtual ~vthread_stub(){} -}; - -typedef Tthread Vthread; - -#ifdef _WIN32 -class event -{ -#pragma warning(push) -#pragma warning(disable: 4127) -#pragma warning(disable: 4100) - nocopy(event) -#pragma warning(pop) - -private: - HANDLE m_event; - -public: - event(BOOL bManualReset) throw(std::runtime_error); - ~event() throw(); - - inline operator HANDLE() const throw() { return m_event; } - void wait() throw(std::runtime_error); - void setEvent() throw(std::runtime_error); - void resetEvent() throw(std::runtime_error); -}; - -#else - -class Win32SyncObject -{ -public: - virtual void syncObjectWait() throw(std::runtime_error) = 0; - virtual bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) = 0; - virtual ~Win32SyncObject(){} -}; -typedef Win32SyncObject* Win32SyncObjectPtr; - -/// these provide basic resource mgmt for typical uses -#endif - -class conditionVariable; - -namespace AOL_namespace { -#pragma pack(push, 1) -// conflicts with headers in solaris -#ifndef _WIN32 -class mutex : public Win32SyncObject -#else -class mutex -#endif -{ - nocopy(mutex) - -private: - pthread_mutex_t m_mutex; - -public: - mutex() throw(std::runtime_error); - ~mutex() throw(); - void lock() throw(std::runtime_error); - bool timedLock(int milliseconds) throw(std::runtime_error); - void unlock() throw(std::runtime_error); - void syncObjectWait() throw(std::runtime_error) { lock(); } - bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) { return timedLock(milliseconds); } -#ifndef _WIN32 - inline operator Win32SyncObject*() throw() { return this; } -#endif - friend class ::conditionVariable; -}; -#pragma pack(pop) - -class rwLock -{ - pthread_rwlock_t m_lock; - -public: - rwLock(); - ~rwLock(); - bool tryRdLock(); - void lock(); - void rdLock(); - void unlock(); -}; - -} - -class conditionVariable -{ - nocopy(conditionVariable) - -private: - pthread_cond_t m_conditionVariable; - -public: - conditionVariable() throw(std::runtime_error); - ~conditionVariable() throw(); - void wait(AOL_namespace::mutex &m) throw(std::runtime_error); - bool timedWait(AOL_namespace::mutex &m,int milliseconds) throw(std::runtime_error); - void signal() throw(std::runtime_error); - void broadcast() throw(std::runtime_error); -}; - -#ifndef _WIN32 -class event : public Win32SyncObject -{ - nocopy(event) - -private: - conditionVariable m_conditionVariable; - AOL_namespace::mutex m_mutex; - bool m_manualReset; - bool m_signaled; - -public: - event(bool bManualReset) throw(std::runtime_error); - void wait() throw(std::runtime_error); - bool timedWait(int milliseconds) throw(std::runtime_error); - void setEvent() throw(std::runtime_error); - void resetEvent() throw(std::runtime_error); - void syncObjectWait() throw(std::runtime_error) { wait(); } - bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) { return timedWait(milliseconds); } - inline operator Win32SyncObject*() throw() { return this; } - -}; -#endif - -/* class stackLock - - Stack based mutex locker/unlocker for unwrapped Win32 mutexes. - Equivalent to CAutoLock for CCritSec objects. -*/ - -class stackLock -{ - AOL_namespace::mutex &m_m; -public: - stackLock(AOL_namespace::mutex &m) : m_m(m) - { - m_m.lock(); - } - ~stackLock() - { - m_m.unlock(); - } -}; - -class stackRWLock -{ - AOL_namespace::rwLock &m_rw; - bool m_locked; - -public: - stackRWLock(AOL_namespace::rwLock &l, bool reader = true, bool lockNow = true) : m_rw(l), m_locked(lockNow) - { - if (lockNow == false) - return; - if (reader) - m_rw.rdLock(); - else - m_rw.lock(); - } - ~stackRWLock() - { - if (m_locked) - m_rw.unlock(); - } - bool tryRdLock() - { - if (m_locked == false) - { - if (m_rw.tryRdLock()) - { - m_locked = true; - return true; - } - } - return false; - } - void lock() { if (m_locked == false) { m_rw.lock(); m_locked = true; } } - void rdLock() { if (m_locked == false) { m_rw.rdLock(); m_locked = true; } } - void unlock() { if (m_locked) { m_rw.unlock(); m_locked = false; } } - -}; - -#ifndef _WIN32 - -#define WAIT_ABANDONED (-1) -#define WAIT_TIMEOUT (0) -#define WAIT_OBJECT_0 (1) -#define INFINITE (-1) - -int WaitForSingleObject(Win32SyncObject &o,int milli_timeout) throw(); -inline int WaitForSingleObject(Win32SyncObject *o,int milli_timeout) throw() { return WaitForSingleObject(*o,milli_timeout); } -int WaitForMultipleObjects(int count,Win32SyncObjectPtr *objs,bool waitall,int milliseconds) throw(); -inline void CloseHandle(Win32SyncObject *o) { delete o; } -typedef Win32SyncObject *HANDLE; - -#endif - -inline bool _SetEvent(event &e) { bool result=false; try {e.setEvent(); result=true; }catch(...){} return result; } -inline bool _SetEvent(event *e) { return _SetEvent(*e); } -inline bool _ResetEvent(event &e) { bool result=false; try {e.resetEvent();result=true;}catch(...){} return result; } -inline bool _ResetEvent(event *e) { return _ResetEvent(*e); } - -namespace AOL_namespace -{ - template class synchronizedPrimitive - { - private: - mutable AOL_namespace::mutex m_lock; - T m_t; - - public: - synchronizedPrimitive(){} - synchronizedPrimitive(const T &t):m_t(t){} - T get() const throw() { stackLock sl(m_lock); return m_t; } - void set(const T &t) throw() { stackLock sl(m_lock); m_t = t; } - }; -} - -// thread safe sleep function -void safe_sleep(int sec, int usec = 0); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp deleted file mode 100644 index 102ee4b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#ifdef _WIN32 -#include -#include -#else -#include -#endif -#include -#include -#include -#include "uniFile.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; - -FILE* uniFile::fopen(const uniFile::filenameType &f,const char *mode) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - return _wfopen(u16.c_str(),tows(mode).c_str()); -#else - return ::fopen((const char *)f.c_str(),mode); -#endif -} - -void uniFile::unlink(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - ::DeleteFileW(u16.c_str()); -#else - ::unlink((const char *)f.c_str()); -#endif -} - -bool uniFile::fileExists(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st = {0}; - int result = _wstat(u16.c_str(),&st); - if (st.st_mode & _S_IFDIR) return 0; - return (result == 0); -#else - struct stat st; - int result = stat((const char *)f.c_str(),&st); - if (S_ISDIR(st.st_mode)) return 0; - return (result == 0); -#endif -} - -size_t uniFile::fileSize(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st; - if (_wstat(u16.c_str(),&st) == -1) return 0; - return st.st_size; -#else - struct stat st; - if (stat((const char *)f.c_str(),&st) == -1) return 0; - return st.st_size; -#endif -} - -time_t uniFile::fileTime(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st; - if (_wstat(u16.c_str(),&st) == -1) return 0; - return st.st_mtime; -#else - struct stat st; - if (stat((const char *)f.c_str(),&st) == -1) return 0; - return st.st_mtime; -#endif -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h deleted file mode 100644 index b90d59c2..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#ifndef uniFile_H_ -#define uniFile_H_ - -#include "uniString.h" -#include - -// functions that help bridge the difference between -// unicode file handling on various platforms - -namespace uniFile -{ - // posix uses utf8 for unicode filenames. Msft uses utf16. To avoid lots - // of platform conditional code, we will standardize on utf8 and convert - // as necessary on Msft platforms. This should be okay since file opens are - // not a high speed inner loop type of operation - typedef uniString::utf8 filenameType; - - //typedef enum { OPENFILE_READ = 1,OPENFILE_WRITE = 2,OPENFILE_BINARY=4 } OpenFile_t; - //FILE* fopen(const filenameType &f,int open_file_type) throw(); - - FILE* fopen(const filenameType &f, const char *mode) throw(); - void unlink(const filenameType &f) throw(); - bool fileExists(const filenameType &f) throw(); - size_t fileSize(const filenameType &f) throw(); - time_t fileTime(const filenameType &f) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp deleted file mode 100644 index 317a1015..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp +++ /dev/null @@ -1,786 +0,0 @@ -#include "uniString.h" -#include -#include -#include - -using namespace std; -using namespace uniString; - -/*****************************************************************/ -//////////////// various helping funcs ///////////////////////// - -// helper function that throws exceptions -static void throwBadUTF8Code(utf8::value_type v, int position) throw(badUnicodeData) -{ - ostringstream o; - o << "Bad UTF-8 code (" << hex << (int)v << ") at position " << position; - throw uniString::badUnicodeData(o.str()); -} - -static void throwBadUTF16Code(utf16::value_type v, int position) throw(badUnicodeData) -{ - ostringstream o; - o << "Bad UTF-16 code (" << hex << (int)v << ") at position " << position; - throw uniString::badUnicodeData(o.str()); -} - -bool utf8::isValid(bool allowIncompleteEndingSequence) const throw() -{ - int position = 0; - for (utf8::const_iterator i = begin(); i != end(); ++i, ++position) - { - utf8::value_type v8 = (*i); - if (v8 & 0x80) - { - // count number of follow up bytes - utf8::value_type follow_up_mask = 0xc0; - utf8::value_type leading_value_mask = 0x3f; - int follow_up_bytes = 0; - - while ((v8 & follow_up_mask) == follow_up_mask) - { - if (follow_up_mask == 0xff) - { - return false; - } - - ++follow_up_bytes; - follow_up_mask = (follow_up_mask >> 1) | 0x80; - leading_value_mask = leading_value_mask >> 1; - } - - // we should always have follow up bytes since 0x80 is illegal - if (!follow_up_bytes) - { - return false; - } - - utf32::value_type v = v8 & leading_value_mask; - while(follow_up_bytes--) - { - ++i; - ++position; - if (i == end()) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - return false; - } - } - v8 = *i; - if ((v8 & 0xc0) != 0x80) // follow ups must begin with 10xxxxxx - { - return false; - } - v = (v << 6) | (v8 & 0x3f); - } - } - } - return true; -} - -// convert utf8 to utf32 -/* - u32 - utf32 string to set - ibegin,iend - template iterators for the beginning and end of the UTF-8 bitstream - allowIncompleteEndingSequence - if true then we just ignore missing values at the very end - of the bitstream. Otherwise we throw an exception. -*/ - -template -static void Utf8ToUtf32(utf32 &u32, ITER ibegin, ITER iend, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - // use temp so an exception leaves this string in tact - utf32 newValue; - int position = 0; - - for (ITER i = ibegin; i != iend; ++i,++position) - { - utf8::value_type v8 = (*i); - if (!(v8 & 0x80)) - { - newValue.push_back(v8); - } - else - { - // count number of follow up bytes - utf8::value_type follow_up_mask = 0xc0; - utf8::value_type leading_value_mask = 0x3f; - int follow_up_bytes = 0; - - while ((v8 & follow_up_mask) == follow_up_mask) - { - if (follow_up_mask == 0xff) - { - throwBadUTF8Code(v8, position); - } - ++follow_up_bytes; - follow_up_mask = (follow_up_mask >> 1) | 0x80; - leading_value_mask = leading_value_mask >> 1; - } - - // we should always have follow up bytes since 0x80 is illegal - if (!follow_up_bytes) - { - throwBadUTF8Code(v8, position); - } - - utf32::value_type v = v8 & leading_value_mask; - while (follow_up_bytes--) - { - ++i; - ++position; - if (i == iend) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - throw badUnicodeData("Bad UTF-8 data. Ending sequence is incomplete"); - } - } - v8 = *i; - if ((v8 & 0xc0) != 0x80) // follow ups must begin with 10xxxxxx - { - throwBadUTF8Code(v8, position); - } - v = (v << 6) | (v8 & 0x3f); - } - if (v != Utf16BOM) - { - newValue.push_back(v); - } - } - } - - u32.clear(); - u32 = newValue; -} - -///////////////////// byte swap stuff for UTF-16 ////////////////////////////////////////////////////// -// endian swap of 16 bit value -static inline utf16::value_type byteSwap(utf16::value_type nValue) throw() -{ - return (((nValue>> 8)) | (nValue << 8)); -} - -#if __BYTE_ORDER == __LITTLE_ENDIAN -// push a value into a UTF-16 encoding string based on the endian of the value and what -// the machine natively stores. On entry "v" is in the native format of the machine since -// it was just converted from the 32 bit code point. -template -static void Utf16EndianPush(T &u16, utf16::value_type v, bool littleEndian) throw() -{ - if (littleEndian) - { - u16.push_back(v); - } - else - { - u16.push_back(byteSwap(v)); - } -} - -// convert a UTF-16 value to machine native value -static inline utf16::value_type unswap(utf16::value_type v, bool littleEndianData) throw() -{ - return (littleEndianData ? v : byteSwap(v)); -} -#else -template -static void Utf16EndianPush(T &u16, utf16::value_type v, bool littleEndian) throw() -{ - if (!littleEndian) - { - u16.push_back(v); - } - else - { - u16.push_back(byteSwap(v)); - } -} - -static inline utf16::value_type unswap(utf16::value_type v,bool littleEndianData) throw() -{ - return (!littleEndianData ? v : byteSwap(v)); -} -#endif -/////////////////////////////////// - -// assign UTF-32 from UTF-16 encoding -/* - u32 - utf32 string to set - ibegin,iend - iterators for UTF-16 encoding source - assumeLittleEndian - assume the UTF-16 encoding is little endian unless a BOM is detected - allowIncompleteEndingSequence - if true ignore final code point if UTF-16 sequence is incomplete, otherwise - throw an exception -*/ - -template -static void Utf16ToUtf32(utf32 &u32, ITER ibegin, ITER iend, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - bool littleEndianData = assumeLittleEndian; - - utf32 newValue; - - int position = 0; - - for (ITER i = ibegin; i != iend; ++i,++position) - { - utf16::value_type w1 = (utf16::value_type)(*i); // yes, use utf16 value even for wstring since we know it's good - if (w1 == 0xfeff) - { - littleEndianData = leSystem; - continue; - } - else if (w1 == 0xfffe) - { - littleEndianData = !leSystem; - continue; - } - - w1 = unswap(w1,littleEndianData); - if (w1 < 0xd800 || w1 > 0xdfff) - { - newValue.push_back(w1); - } - else if (w1 > 0xdbff) - { - throwBadUTF16Code(w1,position); - } - else - { - ++i; - ++position; - if (i == iend) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - throw badUnicodeData("Bad UTF-16 data. Ending sequence is incomplete"); - } - } - utf16::value_type w2 = (*i); - w2 = unswap(w2, littleEndianData); - if (w2 < 0xdc00 || w2 > 0xdfff) - { - throwBadUTF16Code(w2, position); - } - utf32::value_type v1 = w1 & 0x03ff; - utf32::value_type v2 = w2 & 0x03ff; - newValue.push_back((v1 << 10) | v2); - } - } - - u32.clear(); - u32 = newValue; -} - -template -static void Utf32CodeToUtf8(utf32::value_type v, U8 &u8) throw() -{ - if (v < 0x00000080) - { - // only allow \t, \r, \n if in 0-31 ranage - // otherwise expat in the DNAS will refuse - if (v <= 31) - { - if (v == 9 || v == 10 || v == 13) - { - u8.push_back((utf8::value_type)v); - } - } - else - { - u8.push_back((utf8::value_type)v); - } - } - else - { - utf32::value_type maxTopValue = 0x0000003f; - utf8::value_type topValueBitPattern = 0x80; - vector buf; - - // filter out the extended control characters just incase - if (v >= 0x80 && v <= 0x9F) - { - u8.push_back((utf8::value_type)0x3F); - return; - } - // and also filter this so we don't insert BOMs - else if (v == 0xFFFE || v == 0xFFFF) - { - return; - } - - while (v > maxTopValue) - { - buf.push_back(0x00000080 | (v & 0x0000003f)); - v = v >> 6; - maxTopValue = maxTopValue >> 1; - topValueBitPattern = ((topValueBitPattern >> 1) | 0x80); - } - - buf.push_back(topValueBitPattern | v); - u8.insert(u8.end(), buf.rbegin(), buf.rend()); - } -} - -template -static void Utf32ToUtf8(const utf32 &u32, U8 &u8, bool leadingBOM) throw() -{ - u8.clear(); - if (leadingBOM) - { - // we rarely want a BOM in utf-8. But I've run into template bugs where - // the utf8 constructor is accidentally getting called with true for the BOM - // this compile time flag checks for that - Utf32CodeToUtf8(Utf16BOM,u8); - } - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - Utf32CodeToUtf8(*i, u8); - } -} - -// create UTF-16 from unicode (according to rfc2781) -template -static void Utf32ToUtf16(const utf32 &u32, U16 &u16, bool leadingBOM, bool littleEndian) throw() -{ - u16.clear(); - if (leadingBOM) - { - Utf16EndianPush(u16, Utf16BOM, littleEndian); - } - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - utf32::value_type v = *i; - if (v < 0x00010000) - { - Utf16EndianPush(u16, v, littleEndian); - } - else - { - utf32::value_type vp = v - 0x00010000; - utf16::value_type w1 = 0xd800; - utf16::value_type w2 = 0xdc00; - w1 = w1 | ((vp & 0x000ffc00) >> 10); - w2 = w2 | (vp & 0x000003ff); - Utf16EndianPush(u16,w1,littleEndian); - Utf16EndianPush(u16,w2,littleEndian); - } - } -} - -utf32::utf32(const __int8 *s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + strlen((const char *)s), allowIncompleteEndingSequence); -} - -utf32::utf32(const __int8 *s, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + len, allowIncompleteEndingSequence); -} - -utf32::utf32(const std::string &s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s.begin(), s.end(), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8 &u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8.begin(), u8.end(), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8::value_type *u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + strlen((const char *)u8), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8::value_type *u8,size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + len, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16 &u16,bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16.begin(), u16.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16::value_type *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - utf16::size_type len = 0; - const utf16::value_type *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16::value_type *u16, size_t len, bool assumeLittleEndian ,bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -#ifdef _WIN32 -utf32::utf32(const std::wstring &w, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, w.begin(), w.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const wchar_t *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - size_t len = 0; - const wchar_t *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this,u16,u16+len,assumeLittleEndian,allowIncompleteEndingSequence); -} - -utf32::utf32(const wchar_t *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} -#endif - -void utf32::assign(const __int8 *s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + strlen((const char *)s), allowIncompleteEndingSequence); -} - -void utf32::assign(const __int8 *s, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + len, allowIncompleteEndingSequence); -} - -void utf32::assign(const std::string &s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s.begin(), s.end(), allowIncompleteEndingSequence); -} - -void utf32::assign(const utf8 &u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8.begin(), u8.end(), allowIncompleteEndingSequence); -} - -void utf32::assign(const utf8::value_type *u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + strlen((const char *)u8), allowIncompleteEndingSequence); -} - -void utf32::assignAsHighBitANSI(const utf8::value_type *u8) throw() -{ - if (u8) - { - while (*u8) - { - push_back(*u8); - ++u8; - } - } -} - -void utf32::assign(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + len, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16 &u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16.begin(), u16.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16::value_type *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - utf16::size_type len = 0; - const utf16::value_type *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16::value_type *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -#ifdef _WIN32 -void utf32::assign(const std::wstring &w, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, w.begin(), w.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const wchar_t *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - size_t len = 0; - const wchar_t *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const wchar_t *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} -#endif - -void utf32::assignFromLatinExtended(const std::string &s) throw() -{ - clear(); - for (string::const_iterator i = s.begin(); i != s.end(); ++i) - { - push_back((utf32::value_type)(*i)); - } -} - -void utf32::assignFromLatinExtended(const __uint8 *s) throw() -{ - clear(); - if (s) - { - while (*s) - { - push_back(*(s++)); - } - } -} - -void utf32::assignFromLatinExtended(const __uint8 *s, size_t len) throw() -{ - clear(); - if (s && len > 0) - { - while (len--) - { - push_back(*(s++)); - } - } -} - -utf8 utf32::toUtf8(bool leadingBOM) const throw() -{ - utf8 u8; - Utf32ToUtf8(*this, u8, leadingBOM); - return u8; -} - -void utf32::toUtf8(utf8 &u8, bool leadingBOM) const throw() -{ - Utf32ToUtf8(*this, u8, leadingBOM); -} - -void utf32::toUtf8(std::string &s, bool leadingBOM) const throw() -{ - Utf32ToUtf8(*this, s, leadingBOM); -} - -utf16 utf32::toUtf16(bool leadingBOM, bool littleEndian) const throw() -{ - utf16 u16; - Utf32ToUtf16(*this, u16, leadingBOM, littleEndian); - return u16; -} - -void utf32::toUtf16(utf16 &u16, bool leadingBOM, bool littleEndian) const throw() -{ - Utf32ToUtf16(*this, u16, leadingBOM, littleEndian); -} - -#ifdef _WIN32 -void utf32::toUtf16(std::wstring &w, bool leadingBOM, bool littleEndian) const throw() -{ - Utf32ToUtf16(*this, w, leadingBOM, littleEndian); -} -#endif - -namespace uniString -{ - template - class xmlEscapes: public map - { - public: - xmlEscapes() - { - static const typename T::value_type lessthan[] = - {(typename T::value_type)'&',(typename T::value_type)'l',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type greaterthan[] = - {(typename T::value_type)'&',(typename T::value_type)'g',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type ampersand[] = - {(typename T::value_type)'&',(typename T::value_type)'a',(typename T::value_type)'m',(typename T::value_type)'p',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type apostrophe[] = - {(typename T::value_type)'&',(typename T::value_type)'a',(typename T::value_type)'p',(typename T::value_type)'o',(typename T::value_type)'s',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type quote[] = - {(typename T::value_type)'&',(typename T::value_type)'q',(typename T::value_type)'u',(typename T::value_type)'o',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - - (*this)['<'] = T(lessthan); - (*this)['>'] = T(greaterthan); - (*this)['&'] = T(ampersand); - (*this)['\''] = T(apostrophe); - (*this)['"'] = T(quote); - } - }; -} - -static const uniString::xmlEscapes gUtf32XmlEscapes; -static const uniString::xmlEscapes gUtf16XmlEscapes; -static const uniString::xmlEscapes gUtf8XmlEscapes; - -template -static T xml_escape(const T &t, const uniString::xmlEscapes &m) throw() -{ - T result; - - for (typename T::const_iterator i = t.begin(); i != t.end(); ++i) - { - typename uniString::xmlEscapes::const_iterator e = m.find(*i); - if (e != m.end()) - { - result.insert(result.end(),(*e).second.begin(),(*e).second.end()); - } - else - { - result.push_back(*i); - } - } - return result; -} - -utf32 utf32::escapeXML() const throw() -{ - return xml_escape(*this, gUtf32XmlEscapes); -} - -utf16 utf16::escapeXML() const throw() -{ - return xml_escape(*this, gUtf16XmlEscapes); -} - -utf8 utf8::escapeXML() const throw() -{ - return xml_escape(*this, gUtf8XmlEscapes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void utf8::assign(const utf32 &u32, bool leadingBOM) throw() -{ - u32.toUtf8(*this, leadingBOM); -} - -void utf16::assign(const utf32 &u32, bool leadingBOM, bool littleEndian) throw() -{ - u32.toUtf16(*this, leadingBOM, littleEndian); -} - -//////////////////////////////////////////////////////////////////////////////////////////// -string utf8::toANSI(bool allowHighBitCodePoints) const throw() -{ - string result; - bool utf32MethodWorked = false; - - try - { - // convert to utf32 so we can easily remove code points - const utf32 u32(*this); - if (allowHighBitCodePoints) - { - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - result.push_back((char)*i); - } - } - else - { - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - if ((*i) <= 0x7f) - { - result.push_back((char)*i); - } - else - { - result.push_back((char)'?'); - } - } - } - utf32MethodWorked = true; - } - catch(...) - { - } - - // if the string actually has high bit ANSI values (for instance, from a badly - // formed playlist), we should still do something sensible. - if (!utf32MethodWorked) - { - result.clear(); - if (allowHighBitCodePoints) - { - for (utf8::const_iterator i = begin(); i != end(); ++i) - { - result.push_back((char)*i); - } - } - else - { - for (utf8::const_iterator i = begin(); i != end(); ++i) - { - if ((*i) <= 0x7f) - { - result.push_back((char)*i); - } - else - { - result.push_back((char)'?'); - } - } - } - } - return result; -} - -#ifdef _WIN32 -wstring utf8::toWString() const throw(badUnicodeData) -{ - utf32 u32(*this); - wstring result; - u32.toUtf16(result); - return result; -} -#endif - -int utf8::toInt() const throw() -{ - return ::atoi((*this).hideAsString().c_str()); -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h deleted file mode 100644 index 51bbbd49..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h +++ /dev/null @@ -1,354 +0,0 @@ -#pragma once -#ifndef uniString_H_ -#define uniString_H_ - -#include "intTypes.h" -#include -#include -#include - -namespace uniString -{ - // exception for bad utf8/utf16 conversions - class badUnicodeData: public std::runtime_error - { - public: - explicit badUnicodeData(const std::string &msg) : std::runtime_error(msg){} - }; - - #if __BYTE_ORDER == __LITTLE_ENDIAN - static const bool leSystem = true; - #else - static const bool leSystem = false; - #endif - - class utf8; - class utf16; - class utf32; - - template - size_t strlen(const S *s) throw() - { - if (!s) return 0; - size_t len(0); - while (*(s++)) - { - ++len; - } - return len; - } - - // string length calculator with a limit (in case the string is badly formed) - template - size_t strlen(const S *s, size_t maxamt) throw() - { - if (!s) return 0; - size_t len(0); - while (maxamt && (*s)) - { - ++s; - ++len; - --maxamt; - } - return len; - } - - template - bool is_a_number(T t) - { - return (((int)t) >= ((int)'0') && ((int)t) <= ((int)'9')); - } - - template - bool is_a_number(I ibegin,I iend) - { - for (I i = ibegin; i != iend; ++i) - { - if (!is_a_number(*i)) - { - return false; - } - } - return true; - } - - class utf16: public std::basic_string<__uint16> - { - public: - typedef std::basic_string<__uint16> base_t; - - utf16(){} - utf16(const utf16 &u16) : base_t(u16){} - explicit utf16(const utf16::value_type *u16) : base_t(u16){} - explicit utf16(const utf16::value_type *u16, utf16::size_type len) : base_t(u16, len){} - #ifdef _WIN32 - explicit utf16(const std::wstring &w) : base_t(w.begin(), w.end()){} - #endif - explicit utf16(utf16::size_type Cnt,utf16::value_type Val) : base_t(Cnt, Val){} - explicit utf16(const base_t &u16) : base_t(u16){} - - void assign(const utf32 &u32,bool leadingBOM = true, bool littleEndian = leSystem) throw(); - utf16 escapeXML() const throw(); - }; - - class utf8: public std::basic_string<__uint8> - { - public: - typedef std::basic_string<__uint8> base_t; - utf8(){} - - utf8(const utf8 &u8) : base_t(u8) {} - - utf8(const utf8::value_type *u8) : base_t(u8) {} - - explicit utf8(const utf8::value_type *u8, utf8::size_type len) : base_t(u8, len) {} - - utf8(const char *u8) : base_t((const utf8::value_type *)u8) {} - - explicit utf8(const char *u8,utf8::size_type len) : base_t((const utf8::value_type *)u8, len) {} - - utf8(const std::string &s) : base_t(s.begin(), s.end()) {} - - explicit utf8(utf8::size_type Cnt, utf8::value_type Val) : base_t(Cnt, Val) {} - - utf8(const base_t &u8) : base_t(u8) {} - - template - explicit utf8(T ibegin, T iend) : base_t(ibegin, iend) {} - - explicit utf8(const utf32 &u32, bool leadingBOM = false) - { - assign(u32, leadingBOM); - } - - void assign(const utf32 &u32, bool leadingBOM = false) throw(); - bool isValid(bool allowIncompleteEndingSequence = false) const throw(); - utf8 escapeXML() const throw(); - int toInt() const throw(); - - // sometimes we need to stuff this in a string. For example if we want to throw - // a runtime_error exception with the utf8 data. - std::string hideAsString() const throw() - { - std::string s(begin(), end()); - return s; - } - - // remove code points above 0x7f - std::string toANSI(bool allowHighBitCodePoints = false) const throw(); - // convenience function for windows - #ifdef _WIN32 - // converts to utf16 - std::wstring toWString() const throw(badUnicodeData); - #endif - - utf8 operator+(const utf8 &u8) const throw() - { - utf8 result(*this); - result.insert(result.end(), u8.begin(), u8.end()); - return result; - } - - utf8 operator+(const char *s) const throw() - { - utf8 result(*this); - result.insert(result.end(), s, s + strlen(s)); - return result; - } - - utf8 operator+(const std::string &s) const throw() - { - utf8 result(*this); - result.insert(result.end(), s.begin(), s.end()); - return result; - } - - template - utf8 operator+(T v) const throw() - { - utf8 result(*this); - result += v; - return result; - } - - template - utf8& operator+=(T v) throw() - { - base_t::operator+=(v); - return *this; - } - - utf8& operator+=(const std::string &s) throw() - { - utf8 result = (*this) + s; - *this = result; - return *this; - } - - utf8& operator+=(const char *s) throw() - { - utf8 result = (*this) + s; - *this = result; - return *this; - } - - template - bool equals(ITER ibegin, ITER iend) const throw() - { - const_iterator i1 = begin(); - ITER i2 = ibegin; - while ((i1 != end()) && (i2 != iend)) - { - if (((utf8::value_type)*i1) != ((utf8::value_type)*i2)) - { - return false; - } - ++i1; - ++i2; - } - return ((i1 == end()) && (i2 == iend)); - } - - bool operator==(const char *s) const throw() - { - return equals(s, s + strlen(s)); - } - - bool operator==(const std::string &s) const throw() - { - return equals(s.begin(), s.end()); - } - }; - - inline utf8 operator+(const char *s, const utf8 &u8) throw() - { - utf8 r(s); - r.insert(r.end(), u8.begin(), u8.end()); - return r; - } - - inline utf8 operator+(const std::string &s, const utf8 &u8) throw() - { - utf8 r(s); - r.insert(r.end(), u8.begin(), u8.end()); - return r; - } - - class utf32: public std::basic_string<__uint32> - { - public: - typedef std::basic_string<__uint32> base_t; - - utf32(){} - utf32(const utf32 &us): base_t(us){} - utf32(const utf32::value_type *u32) : base_t(u32){} - explicit utf32(const utf32::value_type *u32, utf32::size_type len) : base_t(u32, len){} - explicit utf32(utf32::size_type Cnt, utf32::value_type Val) : base_t(Cnt, Val){} - utf32(const base_t &s) : base_t(s){} - explicit utf32(utf32::const_iterator b, utf32::const_iterator e) : base_t(b, e){} - explicit utf32(utf32::const_reverse_iterator b, utf32::const_reverse_iterator e) : base_t(b, e){} - - explicit utf32(const __int8 *s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const __int8 *s, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const std::string &s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8 &u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8::value_type *u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assignAsHighBitANSI(const utf8::value_type *u8) throw(); - void assign(const __int8 *s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const __int8 *s, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const std::string &s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8 &u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8::value_type *u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - - // use this one if the source is LATIN-1 and it may contain high bit characters - void assignFromLatinExtended(const std::string &s) throw(); - void assignFromLatinExtended(const __uint8 *s) throw(); // null terminated - void assignFromLatinExtended(const __uint8 *s, size_t len) throw(); // no termination - ////////////////// - - explicit utf32(const utf16 &u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf16::value_type *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf16::value_type *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #ifdef _WIN32 - explicit utf32(const std::wstring &w, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const wchar_t *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const wchar_t *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #endif - void assign(const utf16 &u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf16::value_type *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf16::value_type *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #ifdef _WIN32 - void assign(const std::wstring &w, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const wchar_t *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const wchar_t *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #endif - utf8 toUtf8(bool leadingBOM = false) const throw(); - void toUtf8(utf8 &u8, bool leadingBOM = false) const throw(); - void toUtf8(std::string &s, bool leadingBOM = false) const throw(); - utf16 toUtf16(bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - void toUtf16(utf16 &u16, bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - #ifdef _WIN32 - void toUtf16(std::wstring &w, bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - #endif - - utf32 escapeXML() const throw(); - - utf32& operator+=(const utf32 &u32) - { - insert(end(), u32.begin(), u32.end()); - return *this; - } - - utf32 operator+(const utf32 &u32) - { - utf32 result(*this); - result += u32; - return result; - } - }; - - static const utf16::value_type Utf16BOM = 0xfeff; -} - -inline uniString::utf8 asciiToUtf8(std::string s) -{ - uniString::utf8 result; - const size_t siz = s.size(); - for (size_t i = 0; i < siz; i++) - { - int c = s[i]; - - // nothing specicial to do if 0-127 - if (c < 128 && c >= 0) - { - if (c >= 0 && c <= 31) - { - if (c == 9 || c == 10 || c == 13) - { - result.push_back((__uint8)c); - } - } - else - { - result.push_back((__uint8)c); - } - } - // otherwise we need to attempt to convert - else - { - // bump back to +ve - if (c < 128) - { - c += 256; - } - result.push_back((__uint8)(c >> 6) | 0xC0); - result.push_back((__uint8)(c & 0x3F) | 0x80); - } - } - - return result; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp deleted file mode 100644 index a667b3f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include "rezFuncs.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -void getVersionInfo(utf8 &version) throw() -{ - version = ""; - - TCHAR filename[_MAX_PATH + 1] = {0}; - DWORD junk = 0; - char *versionData = 0; - - // version information from the application resources - ::GetModuleFileName(0,filename,_MAX_PATH); - DWORD versionInfoSize = ::GetFileVersionInfoSize(filename,&junk); - versionData = new char[versionInfoSize]; - if (::GetFileVersionInfoW(filename,0,versionInfoSize,versionData)) - { - void *valPtr = 0; - UINT valSize = 0; - if (::VerQueryValue(versionData,_T("\\"), &valPtr, &valSize)) - { - const VS_FIXEDFILEINFO *ffi = reinterpret_cast(valPtr); - version = - tos(((ffi->dwProductVersionMS & 0xffff0000) >> 16)) + "." + - tos(((ffi->dwProductVersionMS & 0x0000ffff))) + "." + - tos(((ffi->dwProductVersionLS & 0xffff0000) >> 16)) + "." + - tos(((ffi->dwProductVersionLS & 0x0000ffff))); - } - } - delete [] versionData; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h deleted file mode 100644 index 3db0d496..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#ifndef rezFuncs_H_ -#define rezFuncs_H_ - -#include "unicode/uniString.h" - -void getVersionInfo(uniString::utf8 &version) throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp b/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp deleted file mode 100644 index 82a49bca..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_FlashPolicyServer.h" -#include "webNet/urlUtils.h" -#include "services/stdServiceImpl.h" -#include "global.h" -#include "bandwidth.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -protocol_FlashPolicyServer::protocol_FlashPolicyServer(const socketOps::tSOCKET s, - const uniString::utf8 &clientLogString) throw(std::exception) - : runnable(s), m_outBufferSize(0), m_clientLogString(clientLogString), - m_outBuffer(0), m_state(&protocol_FlashPolicyServer::state_Send) -{ - // flash x-domain file - m_outMsg = gOptions.getCrossDomainFile(false); - if (m_outMsg.empty()) m_outMsg = MSG_HTTP404; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::FLASH_POLICY, (m_outBufferSize = (int)m_outMsg.size())); -} - -protocol_FlashPolicyServer::~protocol_FlashPolicyServer() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_FlashPolicyServer::timeSlice() throw(std::exception) -{ - (this->*m_state)(); -} - -// send buffer text -void protocol_FlashPolicyServer::state_Send() throw(std::exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_result.done(); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h b/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h deleted file mode 100644 index 2972a08d..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#ifndef protocol_FlashPolicyServer_H_ -#define protocol_FlashPolicyServer_H_ - -#include "threadedRunner.h" -#include - -// this class takes any necessary actions indicated by an HTTP -// call with the url (typically on :843) -class protocol_FlashPolicyServer: public runnable -{ -private: - int m_outBufferSize; - const uniString::utf8& m_clientLogString; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_outMsg; - - typedef void (protocol_FlashPolicyServer::*state_t)(); - - state_t m_state; - - void state_Send() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_FlashPolicyServer"; } - -public: - protocol_FlashPolicyServer(const socketOps::tSOCKET s, const uniString::utf8 &clientLogString) throw(std::exception); - virtual ~protocol_FlashPolicyServer() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp deleted file mode 100644 index 1406cbcc..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp +++ /dev/null @@ -1,305 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_HTTPClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.HTTPClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_HTTPClient::protocol_HTTPClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const utf8 &addr, const uniString::utf8 &XFF) throw(std::exception) - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::HTTP) -{ - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - - -protocol_HTTPClient::~protocol_HTTPClient() throw() -{ - cleanup("HTTP", gOptions.HTTPClientDebug(), false, true); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_HTTPClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_HTTPClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_HTTPClient::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_HTTPClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_HTTPClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_HTTPClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0, dataType = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("HTTP", bandWidth::CLIENT_HTTP_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("HTTP", bandWidth::CLIENT_HTTP_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200; - if (!isPodcast) - { - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse += "icy-name:" + title + "\r\n" - "icy-genre:"; - if (m_streamData) - { - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - m_OKResponse += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - else - { - m_OKResponse += "Misc"; - } - - m_OKResponse += "\r\n" - "icy-br:" + tos((m_streamData ? m_streamData->streamBitrate() : read_bitrate)) + "\r\n" + - "icy-sr:" + tos((m_streamData ? m_streamData->streamSampleRate() : 0)) + "\r\n" + - (m_streamData ? (m_streamData->streamIsVBR() ? "icy-vbr:1\r\n" : "") : ""); - } - - if (m_streamData) - { - m_OKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - m_OKResponse += "icy-pub:0\r\n"; - } - else - { - m_OKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - } - - m_OKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - } - else - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - m_OKResponse += "Content-Type:" + utf8(dataType == AACP_DATA ? "audio/aacp" : "audio/mpeg") + "\r\n"; - - if (!isPodcast) - { - utf8 pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_OKResponse += "icy-pub:1\r\n"; - } - else if (pub == "never") - { - m_OKResponse += "icy-pub:0\r\n"; - } - } - else - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } -//#define USE_CHUNKED -#ifdef USE_CHUNKED - m_OKResponse += "Transfer-Encoding:chunked\r\n\r\n"; -#else - m_OKResponse += "\r\n"; -#endif - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.schedule(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("HTTP"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("HTTP", bandWidth::CLIENT_HTTP_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_HTTPClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_HTTPClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - - -void protocol_HTTPClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h deleted file mode 100644 index 3a20c999..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#ifndef protocol_HTTPClient_H_ -#define protocol_HTTPClient_H_ - -#include "protocol_shoutcastClient.h" -#include - -class streamData; - -class protocol_HTTPClient: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_HTTPClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPClient"; } - -public: - protocol_HTTPClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, - const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - virtual ~protocol_HTTPClient() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp deleted file mode 100644 index cc0479fe..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp +++ /dev/null @@ -1,462 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "protocol_HTTPSource.h" -#include "protocol_backup.h" -#include "streamData.h" -#include "global.h" -#include "base64.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "SRC" -#define DEBUG_LOG(...) do { if (gOptions.HTTPSourceDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_HTTPSource::protocol_HTTPSource (microConnection &mc, const string &firstLine) throw(exception) : - runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcAddress) -{ - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_remainder = new __uint8[BUF_SIZE * 4]; - m_remainderSize = 0; - m_denied = false; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_streamData = NULL; - m_state = &protocol_HTTPSource::state_GetLine; - m_nextState = &protocol_HTTPSource::state_AnalyzeHeaders; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // to be able to do certain things later on - // we need to determine the stream from the - // mountpoint which is in the PUT request - string request, url, protocolAndVersion; - getHTTPRequestDetails(firstLine, request, url, protocolAndVersion); - - bool htmlPage = false; - m_srcStreamID = (int)streamData::getStreamIdFromPath(url, htmlPage); - if ((m_srcStreamID > 0) && (m_srcStreamID <= INT_MAX)) - { - // update the log message for the read stream number - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort, m_srcStreamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_srcStreamID); - - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. Stream is configured as having moved."); - - m_outBuffer = MSG_STREAMMOVED; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMMOVED_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - return; - } - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(m_srcStreamID) + "). Stream ID cannot be below 1 or above 2147483647."); - - m_outBuffer = MSG_BADSTREAMID; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_BADSTREAMID_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - } -} - -protocol_HTTPSource::~protocol_HTTPSource() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "HTTP source disconnected."); - } -} - -void protocol_HTTPSource::state_AnalyzeHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - int maxHeaderLineCount = gOptions.maxHeaderLineCount(); - if ((int)m_headers.size() >= maxHeaderLineCount) - { - m_denied = true; - throwEx(m_srcLogString + "Max header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - // adjust headers for titleFormat and urlFormat - utf8 titleFormat = gOptions.titleFormat(); - utf8 urlFormat = gOptions.urlFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_headers["ice-name"] = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos,2,m_headers["ice-name"])); - } - - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_headers["ice-url"] = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_headers["ice-url"])); - } - - // dump headers to log - if (gOptions.HTTPSourceDebug()) - { - for (map::const_iterator i = m_headers.begin(); i != m_headers.end(); ++i) - { - DEBUG_LOG(m_srcLogString + "Source client header [" + (*i).first + ":" + (*i).second + "]"); - } - } - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - - if (!found && gOptions.requireStreamConfigs()) - { - m_denied = true; - throwEx(m_srcLogString + "HTTP source rejected. Stream " + - tos(m_srcStreamID) + " must be defined in config file"); - } - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int bitrate = getStreamBitrate(m_headers) * 1000, - ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMinBitrate, streamMaxBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - throwEx(m_srcLogString + "HTTP source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps."); - } - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - stream.m_backupUrl.url(), streamData::HTTP, - m_srcStreamID, m_srcPort, stream.m_maxStreamUser, - stream.m_maxStreamBitrate, stream.m_minStreamBitrate, - stream.m_allowPublicRelay, false, getStreamSamplerate(m_headers), - mapGet(m_headers, "icy-vbr", (bool)false), m_headers)); - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - m_result.run(); - return; - } - - utf8 sourceIdent = mapGet(m_headers, "user-agent", utf8()); - m_streamData->updateSourceIdent(sourceIdent); - - m_outBuffer = MSG_HTTP_VALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_HTTP_VALIDPASSWORD_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_GetStreamData; - m_result.run(); - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - if (pos == utf8::npos) - { - if (!key.empty() && ((key == "ice-name") || (key == "ice-url"))) - { - // allow through ice-name and ice-url if there is - // a titleformat and urlformat to use respectively - } - else - { - m_denied = true; - throwEx(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - - utf8 value = stripWhitespace(m_lineBuffer.substr(pos+1)); - if (key.empty() || value.empty()) - { - if (!key.empty() && value.empty()) - { - if (key == "ice-genre") - { - value = "Misc"; - } - else if (((key == "ice-name") && !gOptions.titleFormat().empty()) || - ((key == "ice-url") && !gOptions.urlFormat().empty())) - { - // allow through ice-name and ice-url if there is - // a titleformat and urlformat to use respectively - } - else if (key == "ice-url") - { - value = "http://www.shoutcast.com"; - } - } - else - { - m_denied = true; - throwEx(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - - if (!key.empty()) - { - if (key == "authorization") - { - if (!value.empty()) - { - utf8 password; - vector vauth = tokenizer(value, (utf8::value_type)' '); - // format " Basic xxxxxxxxx" - vector<__uint8> va = base64::decode((vauth.size() < 2 ? "" : vauth[1]).hideAsString().c_str()); - password.insert(password.end(), va.begin(), va.end()); - - utf8::size_type ppos = password.find((utf8)":"); - if (ppos != utf8::npos) - { - // we're looking to see if this is an updated 1.x source - // which is able to indicate the stream # for the stream - // so that we're able to support multiple 1.x sources so - // we need to parse the password and extract the parts - utf8 m_srcPassword = password; - extractPassword(m_srcPassword, m_srcUserID, m_srcStreamID); - - // as we are a v1 source then we must adhere to the master password - // instead of using a specific per stream password as in v2 streams - // though we also accept connections as sid=1 so check for that too - utf8 srcPassword = gOptions.stream_password(m_srcStreamID); - if (srcPassword.empty()) - { - srcPassword = gOptions.password(); - } - - if (m_srcPassword.empty() || (m_srcPassword != srcPassword)) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - ". " + (m_srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + m_srcPassword)); - m_outBuffer = MSG_INVALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_INVALIDPASSWORD_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - } - else - { - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - return; - } - else - { - ILOG(m_srcLogString + "HTTP source connection starting."); - } - - if (sd) - { - sd->releaseStream(); - } - } - } - else - { - // TODO need to send a valid rejection response for this - m_denied = true; - throwEx(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - - } - else - { - m_denied = true; - throwEx(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - } - m_headers[key] = value; - m_nextState = &protocol_HTTPSource::state_AnalyzeHeaders; - m_state = &protocol_HTTPSource::state_GetLine; - m_result.read(); - m_lineBuffer.clear(); - } -} - -void protocol_HTTPSource::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - throw; - } -} - -void protocol_HTTPSource::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPSource::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (getHTTPStyleHeaderLine(m_srcStreamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPSource::state_GetStreamData() throw(exception) -{ - time_t cur_time; - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while (true) - { - char buf[BUF_SIZE * 4] = {0}; - int amt = (BUF_SIZE - 1); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], (BUF_SIZE - 1), 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (80); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - throwEx (""); - } - - // update these details before we mess with anything - bandWidth::updateAmount(bandWidth::SOURCE_V1_RECV, rval); - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, bitrate, - type, buf, m_srcLogString)) - { - m_denied = true; - throwEx(m_srcLogString + "HTTP source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - - m_lastActivityTime = ::time(NULL); - } - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } -#ifdef INCLUDE_BACKUP_STREAMS - ILOG (m_srcLogString + "HTTP source disconnected - trying source backup."); - threadedRunner::scheduleRunnable (new protocol_backup(backupInfo[0], getStreamBitrate(m_headers), - fixMimeType(m_headers["content-type"]))); -#endif - } - throw; - } -} - -void protocol_HTTPSource::state_CloseConnection() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h deleted file mode 100644 index 82fe7256..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#ifndef protocol_HTTPSource_H_ -#define protocol_HTTPSource_H_ - -#include "threadedRunner.h" -#include - -class streamData; - -/* - Runnable object that handles the shoutcast source (broadcaster) - protocol -*/ - -class protocol_HTTPSource : public runnable -{ -private: - const u_short m_srcPort; - short unsigned int m_remainderSize; - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - // is a padding hole around here... - __uint8 * m_remainder; - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - uniString::utf8 m_srcUserID; - int m_srcStreamID; - int m_outBufferSize; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_lineBuffer; // received ICY header line - httpHeaderMap_t m_headers; // the received source headers - streamData *m_streamData; // associated stream object - - typedef void (protocol_HTTPSource::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_ConfirmPassword() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetLine() throw(std::exception); - void state_AnalyzeHeaders() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_GetStreamData() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPSource"; } - -public: - protocol_HTTPSource (microConnection &mc, const string &firstLine) throw(std::exception); - - virtual ~protocol_HTTPSource() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp deleted file mode 100644 index 23d7219f..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp +++ /dev/null @@ -1,4808 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_HTTPStyle.h" -#include "protocol_shoutcast1Client.h" -#include "protocol_shoutcast2Client.h" -#include "protocol_HTTPClient.h" -#include "protocol_flvClient.h" -#include "protocol_m4aClient.h" -#include "protocol_admincgi.h" -#include "base64.h" -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "webNet/urlUtils.h" -#include "file/fileUtils.h" -#include "aolxml/aolxml.h" -#include "services/stdServiceImpl.h" -#include "global.h" -#include "bandwidth.h" -#include "updater.h" -#include "metadata.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define HEAD_REQUEST (m_httpRequestInfo.m_request == HTTP_HEAD) - -size_t gFF_fix = 0; - -CacheMap_t m_xmlStatsCache, m_xmlStatisticsCache, m_jsonStatsCache, - m_jsonStatisticsCache, m_7Cache, m_PLSCache, m_M3UCache, - m_ASXCache, m_QTLCache, m_XSPFCache, m_xmlTracksCache, - m_xmlMetadataCache, m_jsonMetadataCache, m_jsonTracksCache, - m_xmlPlayedCache, m_jsonPlayedCache, m_htmlPlayedCache, - m_streamArtCache, m_playingArtCache, m_crossdomainCache; - -AOL_namespace::mutex m_xmlStatsLock, m_xmlStatisticsLock, m_jsonStatsLock, - m_jsonStatisticsLock, m_7Lock, m_PLSLock, m_M3ULock, - m_ASXLock, m_QTLLock, m_XSPFLock, m_xmlTracksLock, - m_xmlMetadataLock, m_jsonMetadataLock, m_jsonTracksLock, - m_xmlPlayedLock, m_jsonPlayedLock, m_htmlPlayedLock, - m_streamArtLock, m_playingArtLock, m_crossdomainLock; - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -const utf8 getStreamHeader(const streamData::streamID_t sid, const utf8& headerTitle) -{ - return "" - "" - "Shoutcast Server" - "" - "" - "" - "
Shoutcast " + - headerTitle + "
" - "" - "Shoutcast Server v" + addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + - "
" - "
 | 
"; -} - -const utf8 getStreamMiddlePlayingHeader(const streamData::streamID_t sid) -{ - return "" - "
 | 
"; -} - -const utf8 getStreamMiddleListenHeader(const streamData::streamID_t sid) -{ - return "" - "
 | 
"; -} - -const utf8 getStreamEndHeader(const streamData::streamID_t sid) -{ - return "
 | 
" - "
 | 
" - "
"; -} - -const bool getHideState(const streamData::streamID_t sid) -{ - const utf8 &hideStats = gOptions.getStreamHideStats(sid); - if (!hideStats.empty()) - { - return ((hideStats == "stats" || hideStats == "all")) && !(hideStats == "none"); - } - return false; -} - -#define DEBUG_LOG(...) do { if (gOptions.httpStyleDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "[HTTPSTYLE] " - -#define COMPRESS(header, body) if (m_compressed && compressData(body)) header += "Content-Encoding:gzip\r\n" - -const utf8 getNewVersionMessage(const utf8& ending) -{ - utf8 body = ""; - // display update message where applicable - updater::verInfo ver; - if (updater::getNewVersion(ver)) - { - body += "
" - "
New DNAS Version Available: " + ver.ver + "
" - "Please login or see here to find out more about the new DNAS version." - + (!ver.slimmsg.empty() ? "

" + ver.slimmsg : "") + "
" + ending; - } - return body; -} - -const utf8 getStreamPath(const size_t sid, const bool for_public) -{ - utf8 streamPath; - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - // if not empty then set to the value otherwise leave as /stream/ - if (!stream.m_urlPath.empty()) - { - // but ensure that a / is on the front if not manually specified - if (stream.m_urlPath[0] == '/') - { - streamPath = stream.m_urlPath; - } - else - { - streamPath = "/" + stream.m_urlPath; - } - - // this makes sure that if someone sets / or /stream/x/ then - // if we're asked for a 'public' url that we append the ';'. - if (for_public && (streamPath.rfind((utf8)"/") == streamPath.size() - 1)) - { - streamPath += ";"; - } - } - } - - if (streamPath.empty()) - { - if (!sid || (sid == DEFAULT_CLIENT_STREAM_ID)) - { - streamPath = (!for_public ? "/" : "/;"); - } - else - { - streamPath = "/stream/" + tos(sid) + (!for_public ? "/" : "/;"); - } - } - - return streamPath; -} - -protocol_HTTPStyle::protocol_HTTPStyle (microConnection &mc, const string &firstLine) throw(exception) : - runnable (mc), m_clientPort(mc.m_srcPort), m_clientHostName(mc.m_srcHostName), m_clientAddr(mc.m_srcAddress), m_clientLogString(dstAddrLogString(mc.m_srcHostName,mc.m_srcPort)) -{ - m_protocols = mc.m_protocols; - m_outBufferSize = 0; - m_outBuffer = NULL; - m_postRequest = 0; - m_compressed = 0; - m_postRequestLength = 0; - m_state = &protocol_HTTPStyle::state_GetLine; - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - - // Parse the first line of the HTTP transaction into it's components - // (GET/POST etc, url, query etc.) and now is done first so we can - // abort the request asap if getting bad data instead of waiting to - // process the headers and then look at the actual HTTP request... - string request, url, protocolAndVersion; - const int state = getHTTPRequestDetails(firstLine, request, url, protocolAndVersion); - if (!request.empty()) - { - if (request == "GET") - { - m_httpRequestInfo.m_request = HTTP_GET; - } - else if (request == "POST") - { - m_httpRequestInfo.m_request = HTTP_POST; - m_postRequest = 1; - } - else if (request == "HEAD") - { - m_httpRequestInfo.m_request = HTTP_HEAD; - } - else - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP405); - return; - } - } - else - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP405); - return; - } - - if ((m_httpRequestInfo.m_request == HTTP_UNKNOWN) || - (state != 3) || url.empty() || protocolAndVersion.empty() || - (protocolAndVersion.find("/") == string::npos)) - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - - // check for query data and finish up url - string::size_type pos = url.find("?"); - m_httpRequestInfo.m_url = urlUtils::unescapeString(url.substr(0, pos)); - - // provide a stripped version to speed up some of the checks - const utf8::size_type upos = m_httpRequestInfo.m_url.find(utf8("/")); - m_url = (((upos == 0) && m_httpRequestInfo.m_url.size() > 1) ? - m_httpRequestInfo.m_url.substr(upos + 1) : m_httpRequestInfo.m_url); - - // this is so we can do Icecast title updates which use - // a different path but will do a ?mode=updinfo request - if (m_url == "admin/metadata") - { - m_url = "admin.cgi"; - } - - string queryData = ""; - if (pos != string::npos) - { - queryData = url.substr(pos+1); - const vector queryTokens = tokenizer(queryData,'&'); - utf8 lastToken; - for (vector::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - // this is for a specific case when we get xml titles - // and we need it to preserve the data instead of it - // tokenising and leaving broken xml for & cases - if (!lastToken.empty() && ((*i).find("amp;") == 0)) - { - m_httpRequestInfo.m_QueryParameters[lastToken] = m_httpRequestInfo.m_QueryParameters[lastToken] + - "&" + urlUtils::unescapeString((*i)); - // we don't want to process like normal so skip - continue; - } - pos = (*i).find("="); - if (pos == string::npos) - { - m_httpRequestInfo.m_QueryParameters[(lastToken = urlUtils::unescapeString(*i))] = ""; - } - else - { - m_httpRequestInfo.m_QueryParameters[(lastToken = urlUtils::unescapeString((*i).substr(0, pos)))] = - urlUtils::unescapeString((*i).substr(pos + 1)); - } - } - } - - if (gOptions.httpStyleDebug()) - { - DLOG(m_clientLogString + "HTTP Request [" + (m_httpRequestInfo.m_request == HTTP_GET ? "GET" : - (m_httpRequestInfo.m_request == HTTP_POST ? "POST" : - (HEAD_REQUEST ? "HEAD" : "UNKNOWN"))) + "]"); - DLOG(m_clientLogString + "HTTP Url [" + m_url + "]"); - if (!queryData.empty()) DLOG(m_clientLogString + "HTTP Query [" + queryData + "]"); - pos = protocolAndVersion.find("/"); - DLOG(m_clientLogString + "HTTP Protocol [" + protocolAndVersion.substr(0, pos) + "]"); - DLOG(m_clientLogString + "HTTP Version [" + protocolAndVersion.substr(pos + 1) + "]"); - } -} - -protocol_HTTPStyle::~protocol_HTTPStyle() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_HTTPStyle::timeSlice() throw(std::exception) -{ - (this->*m_state)(); -} - -void protocol_HTTPStyle::getPNGImage(const uniString::utf8 &png) throw() -{ - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"),utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > g_upTime) || (diffTime > 31536000)) - { - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:image/png\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(g_upTime) + "\r\n" - "Content-Length:" + tos(png.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? png : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } -} - -const utf8 protocol_HTTPStyle::getClientIP(const bool streamPublic, const utf8 &publicIP) throw() -{ - // test for potentially invalid IPs or ones that will cause the playlist link generation to fail - // attempting to use the server path provided by the YP if in public mode, otherwise uses 'host' - DEBUG_LOG(m_clientLogString + "streamPublic: " + tos(streamPublic) + " " + - "publicIP: " + publicIP + " " + "hostIP: " + m_hostIP + " " + - "clientAddr: " + g_IPAddressForClients); - return (!streamPublic || publicIP.empty() ? - ((g_IPAddressForClients.find(utf8("0.")) == 0 || - // allow localhost / loopback connections through for admin access - ((!g_IPAddressForClients.empty() && g_IPAddressForClients.find(utf8("127.")) == 0)) || - g_IPAddressForClients.empty()) && !m_hostIP.empty() ? - m_hostIP : (!m_hostIP.empty() ? m_hostIP : g_IPAddressForClients)) : publicIP); -} - -const bool isCDNMaster(const streamData::streamID_t sid) -{ - if (!gOptions.cdn().empty()) - { - // check if opt-in or opt-out - bool isCDN = (gOptions.cdn() == "always" || gOptions.cdn() == "master"); - // then if manually specifed, we override - if (gOptions.read_cdn_master(sid)) - { - const int master = gOptions.cdn_master(sid); - if (master != -1) - { - isCDN = (!!master); - } - } - return isCDN; - } - return false; -} - -const bool isCDNSlave(const streamData::streamID_t sid) -{ - if (!gOptions.cdn().empty()) - { - // check if opt-in or opt-out - // for 'master' we run opt-in - bool isCDN = (gOptions.cdn() == "always"); - // then if manually specifed, we override - if (gOptions.read_cdn_slave(sid)) - { - const int slave = gOptions.cdn_slave(sid); - if (slave != -1) - { - isCDN = (!!slave); - } - } - return isCDN; - } - return false; -} - -const bool protocol_HTTPStyle::isAdminAccessAllowed(const uniString::utf8 &hostIP, const uniString::utf8 &hostName) throw() -{ - int inAdminIp = g_adminList.find(hostIP), - inAdminName = inAdminIp; - - DEBUG_LOG(m_clientLogString + "Pre-check admin access - hostIP: " + - hostIP + ", hostName: " + hostName + ", " + "inAdminIp: " + - tos(inAdminIp) + ", inAdminName: " + tos(inAdminName)); - - // 1 if found, 0 if not, -1 if empty (assume allowed) - if (inAdminIp == -1) - { - // abort and just pass through if there's no list - return true; - } - - // in a lot of cases it will work out that - // hostIP and hostName are set as the same - // so only try if there is a difference... - if (!hostName.empty() && (hostIP != hostName)) - { - inAdminName = g_adminList.find(hostName); - } - - DEBUG_LOG(m_clientLogString + "Checking admin access - hostIP: " + - hostIP + ", hostName: " + hostName + ", " + "inAdminIp: " + - tos(inAdminIp) + ", inAdminName: " + tos(inAdminName)); - - // if either check matches then we will allow the - // request as the host might map to an allowed IP - // etc. is only if both don't match then we block - return (inAdminIp || inAdminName); -} - -const bool protocol_HTTPStyle::isAccessAllowed(const streamData::streamID_t sid, const utf8 &hostAddr = "", - const bool showOutput = false) throw() -{ - if (isUserAgentOfficial(m_userAgentLowered)) - { - return true; - } - - const utf8& addr = (hostAddr.empty() ? m_clientAddr : hostAddr); - const bool inBan = g_banList.find(addr,((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0)); - const bool inRip = g_ripList.find(addr,((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0)); - const bool isCDN = isCDNMaster(sid); - bool ripOnly = (isCDN ? true : gOptions.stream_ripOnly(sid)); - - if (!gOptions.read_stream_ripOnly(sid)) - { - ripOnly = (isCDN ? true : gOptions.ripOnly()); - } - - if (gOptions.httpStyleDebug()) - { - string host = m_clientAddr.hideAsString(); - if (gOptions.nameLookups()) - { - host = m_clientAddr.hideAsString(); - string addr = host; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, host)) - { - host = addr; - } - - DEBUG_LOG(m_clientLogString + "Checking access rights - addr: " + addr + ", " + - "host: " + host + ", " + "inBan: " + tos(inBan) + ", " + "inRip: " + - tos(inRip) + ", " + "isCDN: " + tos(isCDN) + ", " + "ripOnly: " + tos(ripOnly)); - } - else - { - DEBUG_LOG(m_clientLogString + "Checking access rights - addr: " + addr + ", " + - "inBan: " + tos(inBan) + ", " + "inRip: " + tos(inRip) + ", " + - "isCDN: " + tos(isCDN) + ", " + "ripOnly: " + tos(ripOnly)); - } - } - - // check here if we're ok to try to provide the stream to the client or not - bool allowed = true; - if ((ripOnly || inBan) && (!inRip)) - { - allowed = false; - if (ripOnly) - { - // allow localhost / loopback connections through for admin access - if (!m_clientAddr.empty() && m_clientAddr.find(utf8("127.")) == 0) - { - allowed = true; - } - else - { - if (showOutput) - { - if (gOptions.nameLookups()) - { - string hostName = m_clientAddr.hideAsString(); - string addr = hostName; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - - if (hostName != addr) - { - WLOG("[" + hostName + " (" + m_clientAddr + ") sid=" + tos(sid) + "] Host not in reserved list - disconnecting."); - } - else - { - WLOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP not in reserved list - disconnecting."); - } - } - else - { - WLOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP not in reserved list - disconnecting."); - } - - m_result.schedule(1000); - } - } - } - else - { - // allow loopback address through for admin access - if (!m_clientAddr.empty() && m_clientAddr.find(utf8("127.")) == 0) - { - allowed = true; - } - else - { - utf8::size_type pos; - if (!m_referer.empty() && (pos = m_referer.rfind(utf8("/admin.cgi"))) != utf8::npos) - { - allowed = true; - } - - if (showOutput && !(m_url == "index.css")) - { - allowed = false; - if (gOptions.nameLookups()) - { - string hostName = m_clientAddr.hideAsString(); - string addr = hostName; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - - if (hostName != addr) - { - ILOG("[" + hostName + " (" + m_clientAddr + ") sid=" + tos(sid) + "] Host in banned list - disconnecting."); - } - else - { - ILOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP in banned list - disconnecting."); - } - } - else - { - ILOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP in banned list - disconnecting."); - } - - m_result.schedule(1000); - } - } - } - } - return allowed; -} - -const bool protocol_HTTPStyle::isViewingAllowed(const streamData::streamID_t sid, const utf8 &password, - const bool no_stream, bool &adminOverride, - const bool hide, bool &passworded) throw() -{ - adminOverride = false; - // when the hidestats option is enabled, still need to allow it on the admin page - if (m_referer.rfind(utf8("/admin.cgi")) != utf8::npos) - { - adminOverride = true; - } - - // do a password check if we've got a hidden page or if a password param is present - bool proceed = false; - - if ((hide == true) || (passworded == true)) - { - passworded = false; - if (!password.empty()) - { - utf8 streamPassword; - if (!no_stream) - { - streamPassword = gOptions.stream_password(sid); - if (!gOptions.read_stream_password(sid) && streamPassword.empty()) - { - streamPassword = gOptions.password(); - } - } - - utf8 streamAdminPassword = gOptions.stream_adminPassword(sid); - if (!gOptions.read_stream_adminPassword(sid) && streamAdminPassword.empty()) - { - streamAdminPassword = gOptions.adminPassword(); - } - - passworded = ((!streamPassword.empty() && (password == streamPassword)) || - (!streamAdminPassword.empty() && (password == streamAdminPassword))); - - if (hide) - { - proceed = passworded; - } - } - } - - return proceed; -} - -const bool protocol_HTTPStyle::findBaseStream(bool& no_sid, streamData::streamID_t& sid) -{ - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid) - { - bool htmlPage = false; - streamData::streamID_t found_sid = streamData::getStreamIdFromPath(m_httpRequestInfo.m_url, htmlPage); - if (found_sid > 0) - { - sid = found_sid; - no_sid = false; - } - - streamData::streamID_t lastSID = 0; - if (!found_sid && streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - sid = lastSID; - return true; - } - } - return false; -} - -const bool protocol_HTTPStyle::getCachedResponse(cacheItem *item, AOL_namespace::mutex &lock, const int limit) -{ - utf8 response; - if (GetFromCache(item, lock, m_lastActivityTime, !!m_compressed, HEAD_REQUEST, response, limit)) - { - sendMessageAndClose(response); - return true; - } - return false; -} - -void protocol_HTTPStyle::sendCachedResponse(cacheItem *item, CacheMap_t &cache, AOL_namespace::mutex &lock, - uniString::utf8 &header, uniString::utf8 &body, - const streamData::streamID_t sid, - const bool jsonp, const bool noCompress) -{ - if (sid && !noCompress) - { - COMPRESS(header, body); - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - - const utf8 &response = (header + body); - if (!jsonp) - { - // if a callback is specified then is best to not cache - AddorUpdateCache(item, m_lastActivityTime, !!m_compressed, - header, response, cache, lock, sid); - } - sendMessageAndClose((!HEAD_REQUEST ? response : header)); -} - -// look at the HTTP intro line and headers and decide what to do next -void protocol_HTTPStyle::state_DetermineAction() throw(exception) -{ - utf8 relayHostIP, relayHostName, XFF; - - // figure out what to do next based on HTTP intro line and headers - // dump http headers to log - for (map::const_iterator i = m_httpRequestInfo.m_HTTPHeaders.begin(); i != m_httpRequestInfo.m_HTTPHeaders.end(); ++i) - { - DEBUG_LOG(m_clientLogString + "HTTP Header [" + (*i).first + ":" + (*i).second + "]"); - // grab the ip used for accessing to determine - // the ip to return in the listen action when - // destip has not been specified or is invalid - if ((*i).first == "host") - { - m_hostIP = (*i).second; - if (!m_hostIP.empty()) - { - // strip off the port from the ip though - // could just use it but want to ensure - // the correct port is used for it all - utf8::size_type pos = utf8::npos; - if ((pos = m_hostIP.find(utf8(":"))) != utf8::npos) - { - m_hostIP.resize(pos); - } - } - } - - // used specificially with the fire buuilds to be able to work around - // issues with the VIPs and what is checked against the reserved list - // -this gets the IP and also will resolve the hostname as applicable - else if ((*i).first == "icy-host") - { - relayHostIP = (*i).second; - if (gOptions.nameLookups()) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - hostName = relayHostIP.hideAsString(); - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = relayHostIP.hideAsString(); - } - relayHostName = hostName; - } - } - - else if ((*i).first == "x-forwarded-for") - { - //utf8 blah = "129.78.138.66";//", 129.78.64.103"; - // this can be in the format of client - // or client, proxy1, proxy2, etc. and - // it can be open to spoofing so we'll - // see what complaints that will arise - if (!(*i).second.empty()) - { - utf8::size_type pos = utf8::npos; - if ((pos = (*i).second.find(utf8(","))) != utf8::npos) - { - utf8 tempAddr = (*i).second.substr(0, pos); - if (!tempAddr.empty()) - { - tempAddr = stripWhitespace(tempAddr); - in_addr_t ip = inet_addr((const char *)tempAddr.c_str()); - if (ip != INADDR_NONE) - { - XFF = tempAddr; - } - } - } - else - { - utf8 tempAddr = stripWhitespace((*i).second); - if (!tempAddr.empty()) - { - in_addr_t ip = inet_addr((const char *)tempAddr.c_str()); - if (ip != INADDR_NONE) - { - XFF = tempAddr; - } - } - } - } - } - - else if ((*i).first == "referer") - { - m_referer = (*i).second; - } - - else if ((*i).first == "accept-encoding") - { - utf8 encoding = (*i).second; - if (!encoding.empty()) - { - vector encodingTokens = tokenizer(stripWhitespace(encoding), ','); - for (vector::const_iterator i = encodingTokens.begin(); i != encodingTokens.end(); ++i) - { - utf8 value = stripWhitespace(*i); - if (value == "gzip") - { - m_httpRequestInfo.m_AcceptEncoding |= ACCEPT_GZIP; - m_compressed = 1; - } - else if (value == "deflate") - { - m_httpRequestInfo.m_AcceptEncoding |= ACCEPT_DEFLATE; - } - } - } - } - } - - // attempt to work out the streamid to use, keeping a track of things, etc - // - // for b195+ we recognise the sid from the password if - // its not provided as a specific parameter on the url - streamData::streamID_t sid = mapGet(m_httpRequestInfo.m_QueryParameters, "sid", -1), realSID = sid; - // with means in b72+ to do this based on the streampath instead of by sid - utf8 sp = mapGet(m_httpRequestInfo.m_QueryParameters, "sp", (utf8)""); - bool hasMount = false; - if (sp.empty()) - { - // this allows us to support icecast based title updates and on - // reflection would have been the better naming to use vs 'sp'. - sp = mapGet(m_httpRequestInfo.m_QueryParameters, "mount", (utf8)""); - hasMount = !sp.empty(); - } - if (!sp.empty()) - { - bool htmlPage = false; - // make sure there is a / on the front so that we're - // going to be able to search for a match correctly. - if (sp.find(utf8("/")) != 0) - { - sp = "/" + sp; - } - streamData::streamID_t found_sid = streamData::getStreamIdFromPath(sp, htmlPage); - if (found_sid > 0) - { - realSID = sid = found_sid; - } - } - - bool no_sid = ((int)sid <= 0); - // check that we've got a valid sid, otherwise force assume it's sid=1 i.e. helps for just /listen.pls - sid = ((sid >= DEFAULT_CLIENT_STREAM_ID) && !(no_sid && ((int)sid <= -1)) ? sid : DEFAULT_CLIENT_STREAM_ID); - - // this will better handle user agents which could have high bit code points - // so we attempt to convert the string to a hopefully valid utf8 encoded string - string agent = string(mapGet(m_httpRequestInfo.m_HTTPHeaders, "user-agent", (utf8)"").toANSI()); - m_userAgentLowered = toLower((m_userAgent = asciiToUtf8(agent))); - - if (isUserAgentRelay(m_userAgentLowered)) - { - bool allowRelay = gOptions.stream_allowRelay(sid); - if (!gOptions.read_stream_allowRelay(sid)) - { - allowRelay = gOptions.allowRelay(); - } - - if (!allowRelay && !(m_url == "admin.cgi")) - { - ILOG(m_clientLogString + "Relay not allowed: `" + m_userAgent + "'."); - sendMessageAndClose(MSG_HTTP403); - return; - } - } - - if ((m_userAgentLowered.find(utf8("rip")) != utf8::npos) || - (m_userAgentLowered.find(utf8("copy")) != utf8::npos)) - { - if (!(m_url == "admin.cgi")) - { - ILOG(m_clientLogString + "Stream savers not allowed."); - sendMessageAndClose(MSG_HTTP403); - return; - } - } - - utf8::size_type ipos = m_url.find(utf8("images/")); - if ((ipos == 0) || (m_url == "favicon.ico")) - { - utf8 url = (ipos == 0 ? m_url.substr(7) : m_url); - if (url == "favicon.ico") - { - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"), utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > gOptions.m_favIconTime) || (diffTime > 31536000)) - { - - const int g_favIconSize = 1150; - const uniString::utf8::value_type g_favIcon[] = { - "\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x20\x00\x68\x04" - "\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x10\x00\x00\x00\x20\x00" - "\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x40\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x14\x9a\xfd\x2f\x13\x95\xfe\x54\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x98\xfd\x3d\x16\x98\xfd\xff\x15\x97" - "\xfd\xab\x11\x95\xfd\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x4c\xba\xfc\x02\x31\xa5\xfc\xa2\x1a\x9a" - "\xfd\xff\x16\x99\xfd\xea\x13\x95\xfd\x5a\x07\x7a\xfe\x01\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xb4\xfb\x05\x46\xb2" - "\xfc\xb2\x28\xa0\xfb\xff\x16\x98\xfd\xff\x15\x98\xfd\xb0\x11\x93" - "\xfd\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xb5" - "\xfd\x09\x4b\xb7\xfd\xbf\x3a\xaa\xfb\xff\x1a\x98\xfc\xff\x16\x98" - "\xfd\xed\x14\x98\xfe\x60\x08\x81\xfe\x01\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x98" - "\xfd\x21\x1e\x9e\xfd\x82\x41\xb1\xfd\xfa\x49\xb4\xfc\xff\x28\x9e" - "\xfa\xff\x16\x97\xfd\xff\x15\x98\xfd\xb6\x10\x95\xfd\x1d\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x98" - "\xfd\x48\x16\x98\xfd\xff\x19\x99\xfd\xff\x42\xb0\xfc\xff\x4d\xb7" - "\xfc\xff\x3a\xa9\xfa\xff\x1a\x97\xfb\xff\x14\x98\xf9\x8f\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x99" - "\xf9\x17\x3a\xa8\xfa\xaf\x3d\xaa\xfa\xfe\x40\xad\xfb\xff\x3d\xac" - "\xfb\xff\x4d\xb7\xfc\xff\x49\xb4\xfc\xf6\x24\x97\xf5\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x4a\xb5\xfd\x48\x4c\xb7\xfc\xd7\x1f\x97" - "\xf9\xff\x36\xa7\xfa\xff\x19\x9a\xfd\xc8\x0e\x92\xfe\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\xac\xfd\x07\x1e\x98" - "\xfa\xd6\x4c\xb6\xfc\xf1\x27\x9d\xfa\xff\x15\x97\xfd\xbe\x10\x9a" - "\xfd\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x90" - "\xfa\x8d\x4a\xb5\xfc\x1b\x4a\xb6\xfc\xa4\x29\xa0\xfb\xfd\x15\x97" - "\xfd\xb6\x10\x94\xfd\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x8e" - "\xf9\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb6\xfc\x3d\x27\xa1" - "\xfc\xce\x15\x97\xfd\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x2d\x2d\x2d\x02\x2e\x2e\x2e\x08\x0f\x8c" - "\xfa\x4a\x2a\x2a\x2a\x09\x00\x00\x00\x00\x00\x00\x00\x00\x45\xb4" - "\xf8\x04\x13\x92\xf7\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x36\x36\x29\x2f\x2f\x2f\x2d\x0e\x7f" - "\xe7\x2e\x31\x31\x31\x38\x33\x33\x33\x21\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x35\x35\x35\x33\x31\x31\x31\x50\x23\x55" - "\x85\x38\x32\x32\x32\x4d\x33\x33\x33\x21\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x2b\x2b\x2b\x02\x34\x34\x34\x4d\x35\x35" - "\x35\x60\x32\x32\x32\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xff" - "\x00\x00\xc3\xff\x00\x00\xc0\xff\x00\x00\xe0\x7f\x00\x00\xf0\x1f" - "\x00\x00\xf0\x0f\x00\x00\xf0\x0f\x00\x00\xf0\x0f\x00\x00\xfc\x0f" - "\x00\x00\xfe\x07\x00\x00\xff\x03\x00\x00\xff\x63\x00\x00\xfc\x33" - "\x00\x00\xfc\x1f\x00\x00\xfc\x1f\x00\x00\xfc\x3f\x00\x00" - }; - - const int g_favIconSizeGZ = 498; - const uniString::utf8::value_type g_favIconGZ[] = { - "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x63\x60\x60\x04\x42\x01" - "\x01\x06\x20\xa9\xc0\x90\xc1\xc2\xc0\x20\xc6\xc0\xc0\xa0\x01\xc4" - "\x40\x21\xa0\x08\x44\x1c\x04\x1c\x58\x18\x70\x02\x91\x59\x7f\xf5" - "\x85\xa7\xfe\x0b\xc1\xad\x02\x3f\x90\x98\xf1\xd7\x56\x6c\xc6\xdf" - "\xff\xa2\xd3\xff\xae\x16\x9c\xfa\x57\x9c\x54\xfd\x3e\xbb\xfe\x30" - "\x19\x2e\xfd\xb3\x48\x6a\xd6\xdf\xff\x62\x33\xff\xbe\x12\x9e\xfa" - "\x37\x8a\xbd\xea\x1f\x23\x29\x66\xb8\x6c\xf9\xcd\xea\xb6\xe9\xcf" - "\x26\x8d\x05\xbf\xff\x83\xdd\x32\xe3\xef\x06\xc1\xc9\x7f\xa5\x49" - "\x31\xc3\x6d\xeb\x5f\x4e\xef\xed\x7f\xf7\x5b\xad\xfa\xfd\x5f\x6a" - "\xc6\x1f\x90\x39\x6f\x45\x66\xfc\x4b\xe0\x68\x24\xce\x2d\xc2\x33" - "\xfe\x2a\xca\xcd\xfb\xdb\xe4\xb8\xf1\xef\x2f\xcf\x2d\x7f\xfe\x6b" - "\xcc\xfb\xf5\x5f\x6c\x3a\xd8\x2d\xdb\x04\xa6\xfe\x95\x25\xa4\x1f" - "\xa8\xce\x03\xe4\x76\xc9\x99\x7f\xff\x3b\x6d\xf8\xf3\xdf\x77\xfb" - "\x9f\xff\x56\x2b\x7f\xfd\x97\x9a\xfe\xfb\xbf\xc8\x8c\x9f\xfd\x84" - "\xf4\xab\xcd\xfc\x29\x6e\xb5\xe2\xd7\x7a\xdb\x55\xbf\xfe\x39\xac" - "\xfd\xfd\xdf\x76\xcd\x6f\xb0\x19\x40\xb7\x7c\x53\x99\xfe\x35\x87" - "\x18\x3f\x80\x80\xd7\xd6\xbf\x1e\x3e\xdb\xff\x5c\x97\x9f\xfe\xf3" - "\xbf\xd9\xf2\x5f\xff\x25\x67\xfd\x3d\xc1\x37\xe9\x1f\x0f\xb1\xfa" - "\x41\x40\x77\xcd\x5f\x76\xb9\x19\xbf\xae\xf9\x6c\xfb\xf3\x51\x7d" - "\xee\x2f\x50\xda\xd8\x27\x30\xeb\x2f\x17\x29\x66\x08\x4d\xf8\xd5" - "\xeb\xb5\xf5\x8f\xb4\xd7\xb6\x3f\x4b\x34\x17\xfc\xfe\x0b\x34\x63" - "\x9b\xc0\x94\xbf\x6c\xc4\xea\x17\xec\xfb\x09\xf7\xb3\xe7\xb6\x3f" - "\xb6\xea\x0b\xff\x9c\x03\x9a\xa1\x4a\xd0\xed\xba\xba\x4c\x7a\x7a" - "\x7a\x1c\xfc\x3d\xbf\xbc\xb4\xb4\xb4\x38\x61\xe2\xae\x5b\x7e\xb0" - "\x08\x4f\xfa\x4e\xd0\x7e\x33\x33\x33\x4d\x7d\x7d\x7d\x5d\xbe\xfa" - "\xe7\x7a\x86\x86\x86\x16\xc6\xc6\xc6\x8a\xc4\xba\x19\x04\x4c\x4d" - "\x4d\x8d\x81\xfa\x02\x94\x43\x5b\x2d\x8c\x8c\x8c\x7c\x49\xd5\xaf" - "\xad\xad\xcd\x64\x62\x62\xe2\x0b\x34\x27\x01\xa8\xdf\x01\x97\xba" - "\xf3\xff\x19\x18\x0e\x03\xf1\x01\x20\x7e\x50\xcf\xc0\xf0\x41\x1e" - "\x88\xf9\x11\xf8\x0f\x10\xff\x63\x67\x60\xf8\xcf\x0c\xc4\xc9\x40" - "\xbe\x31\x10\xcb\x43\xb1\x3d\x03\x03\x00\x34\x69\x3c\x26\x7e\x04" - "\x00\x00" - }; - - const time_t modTime = (!gOptions.m_favIconTime ? (gOptions.m_favIconTime = curTime) : gOptions.m_favIconTime); - utf8 header = "HTTP/1.0 200 OK\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos((m_compressed ? g_favIconSizeGZ : g_favIconSize)) + "\r\n" - + (m_compressed ? "Content-Encoding:gzip\r\n" : "") + - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(::time(NULL) + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(0) + "\r\n\r\n", - body = (m_compressed ? utf8(g_favIconGZ,g_favIconSizeGZ) : utf8(g_favIcon,g_favIconSize)); - - if(gOptions.faviconFile() == "") - { - } - else - { - if (gOptions.m_faviconBody.empty()) - { - body = loadLocalFile(fileUtil::getFullFilePath(gOptions.faviconFile())); - if (!body.empty()) - { - gOptions.m_faviconBodyGZ = gOptions.m_faviconBody = body; - - gOptions.m_faviconHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos(body.size()) + "\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n\r\n"; - - if (compressData(gOptions.m_faviconBodyGZ)) - { - gOptions.m_faviconHeaderGZ = "HTTP/1.0 200 OK\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos(gOptions.m_faviconBodyGZ.size()) + "\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Content-Encoding:gzip\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n\r\n"; - } - else - { - gOptions.m_faviconHeaderGZ.clear(); - } - } - else - { - body = MSG_HTTP404; - } - } - - if (!gOptions.m_faviconBody.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_faviconBodyGZ.empty()) - { - body = gOptions.m_faviconBodyGZ; - header = gOptions.m_faviconHeaderGZ; - } - else - { - body = gOptions.m_faviconBody; - header = gOptions.m_faviconHeader; - } - } - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } - return; - } - else if (url == "listen.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x16\x00\x00\x00\x0D\x08\x04\x00\x00\x00\x07\xAC\x56" - "\xE8\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC3\x00\x00\x0E" - "\xC3\x01\xC7\x6F\xA8\x64\x00\x00\x01\x2A\x49\x44\x41\x54\x28\xCF" - "\x63\xF8\xC7\x88\x05\xBA\x82\x21\xF3\x3F\xAD\x5F\x13\x9E\x4F\x7D" - "\x33\xF9\x9F\xF2\x3F\x1E\x90\x38\x03\x16\xA5\xE9\xFF\xFE\xEF\xFA" - "\xFF\xEF\xFF\x3F\x96\x4F\x3A\xC7\xF6\xA4\xBD\xBB\x76\xF7\xE3\xAD" - "\x7F\x1A\x20\xE5\x98\x8A\x3B\xFF\xFD\x9F\xF1\x9F\x01\xA4\xD8\xF0" - "\xBD\xF1\xB9\x5D\x1E\x9F\x95\x7E\x5E\xBC\xF7\x76\xDD\x3F\x41\x54" - "\xC5\xAB\xC1\xF0\x7F\x19\x50\x29\x48\xF1\xB7\xA5\xBB\xB6\x3E\xDF" - "\xF2\xEA\x76\xE4\xCF\xA0\x5F\x6F\x3F\xFE\xD3\xFE\xC7\x8F\xAC\xF8" - "\x7F\x08\x18\x32\x40\x15\x9F\x5F\xEF\xF5\xD4\xF3\xE9\x8B\x3D\xD7" - "\x3F\xF1\xFF\xBB\xF8\xE9\x6E\x1E\x9A\x62\x06\x24\xF8\xF7\xFF\xCB" - "\x15\x4F\xF6\x58\xBC\x9A\x7D\xEE\xF5\x47\xD7\xDF\x53\xBF\x3D\x6A" - "\xC0\xAB\xB8\x5E\xED\xED\xD1\xDC\x87\xA5\xF7\x5F\xEE\xF3\x79\x56" - "\x74\x8B\x80\xE2\x57\x5D\x4F\x8E\x1B\x7E\x58\x78\xE5\xF5\x17\xE7" - "\x3F\x33\x7E\x60\x28\x46\x75\xF3\x8B\xEE\xCC\x47\xC1\xCF\x5F\x1D" - "\x3B\xF3\x95\xE7\xDF\xA5\xAF\x77\x73\x51\x15\xA3\x85\xC6\x9F\xD6" - "\xB3\x2B\x5E\xEE\x7E\x71\xD1\xED\x4F\xEE\xAF\xF7\x5F\xD0\x43\x03" - "\x3D\x9C\x15\x7F\x68\x9F\x3B\x68\xF7\x51\xEB\xEB\x8D\xCB\xAF\xA7" - "\xFC\xE3\xC7\x1F\x83\xCC\x9F\x74\x4E\x1C\xCE\x7C\x71\xE3\xF2\xA7" - "\xF3\xFF\x14\xB0\xC7\x20\x6A\xDA\xE8\x7A\xD6\xFF\xAA\x0F\xA8\x94" - "\x0B\x24\x0E\x00\x69\xB1\x67\x35\x8E\x65\x16\x39\x00\x00\x00\x00" - "\x49\x45\x4E\x44\xAE\x42\x60\x82", 376); - getPNGImage(png); - } - else if (url == "history.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0F\x08\x04\x00\x00\x00\x95\x2A\x8D" - "\xFC\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x12\x00\x00\x0B" - "\x12\x01\xD2\xDD\x7E\xFC\x00\x00\x00\xA5\x49\x44\x41\x54\x18\xD3" - "\x6D\x90\xA1\x12\xC3\x20\x0C\x86\x79\x84\x49\xEC\xE4\x64\x65\xED" - "\x24\x72\x72\x76\xB2\xB2\x72\xB6\xB2\xB2\x12\x5B\x89\x9C\x9C\xED" - "\x23\x20\x79\x95\x7F\x3F\xA1\x39\x22\xC6\x77\x90\xE3\xBE\x4B\x02" - "\x71\x01\x16\x8F\x19\x4E\x57\xE0\xA5\x73\xC3\xD8\x65\xC0\x62\x18" - "\x28\xEE\x2A\x03\x36\xC3\x20\x78\x55\xBB\x21\x09\x93\xAA\x0F\x59" - "\xF1\x34\x31\xA8\x3A\x58\xE8\xC5\x5D\x63\x64\xCE\x17\x0F\x55\x91" - "\x05\x22\xB2\xC4\x84\x0B\xCF\xB5\xF7\x9A\xB8\xB3\xC4\xC4\x27\x78" - "\x16\x2D\x10\x95\x4D\xDE\x8E\xAB\x30\x57\x59\x7B\xB5\x6E\x35\x26" - "\x7E\xBA\x71\xE0\x7C\x61\xA7\xFD\xEC\xDD\xB2\x2C\x1B\x07\x35\xB2" - "\x7C\xE9\x93\xD4\x75\x70\x4C\xCB\x3F\xE1\x5C\x61\x0F\x15\x3F\x46" - "\x11\xE5\xA0\x02\x5A\xBC\xC7\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 243); - getPNGImage(png); - } - else if (url == "lock.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x08\x00\x00\x00\x0B\x08\x04\x00\x00\x00\xE8\x92\x04" - "\xAE\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC3\x00\x00\x0E" - "\xC3\x01\xC7\x6F\xA8\x64\x00\x00\x00\x81\x49\x44\x41\x54\x08\xD7" - "\x8D\xC8\x3D\x0E\x82\x40\x10\x86\xE1\xA1\xB1\xF2\xAF\x30\xA1\xE0" - "\x4A\xD6\x34\x9E\x80\xD6\x0A\xAD\x37\x14\x34\x44\xAF\xA0\xD7\xD2" - "\x1B\xD0\xC1\xEE\xB7\xCC\x30\xC3\x96\xD8\x99\xA7\x79\xF3\x92\x66" - "\x52\xA2\xF7\x09\x7A\x29\x35\xA3\xB9\x80\x7F\xC7\x5C\x73\x7D\x01" - "\xC3\x5C\x10\x57\xDF\x70\xB0\x2B\xDF\xA6\xA3\x7E\x46\xAE\x88\xDD" - "\x73\x3A\x0B\x3C\x86\x0B\x3F\xC0\x8E\x10\x6B\xB9\x0B\x80\xD0\x4A" - "\x2D\x88\xD4\xD9\xD6\x76\x76\x4A\xF6\xA9\x3A\x23\x67\x9B\x15\xF7" - "\xCF\x68\x7E\x46\x63\x14\x6C\x5C\x09\xB6\x00\x7C\x27\x7A\xE3\x33" - "\xC6\x13\x8C\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 207); - getPNGImage(png); - } - else if (url == "streamart.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0E\x08\x04\x00\x00\x00\x5E\x76\x5E" - "\x59\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x77\x49\x44\x41\x54\x18\xD3" - "\x75\x90\x3B\x01\xC0\x20\x0C\x44\x4F\x02\x16\x90\x50\x0B\xC8\xA8" - "\x85\x4A\xE8\xDA\x11\x09\x58\x40\x42\x57\x64\xC4\xCA\xEB\x40\x7F" - "\x14\x9A\x6C\x79\xB9\x24\x17\xA9\x0B\x23\x30\xA3\x51\x04\x84\x7E" - "\x20\x62\xC1\xFE\x50\x46\x92\xE1\x99\x48\x18\x85\x42\x22\x52\x55" - "\x92\x0A\x1A\xA7\x64\x43\xE0\xB9\x67\x7F\x33\x57\xE4\x3A\xB0\xF1" - "\xF2\xE1\x09\x37\x88\xCF\xD9\x19\x91\xB8\xB6\x2E\x34\x8F\x71\xD7" - "\x6C\xAD\xEC\xAD\xD5\x48\x38\x0B\x5B\xAB\xAA\xB0\x76\x97\xD7\x83" - "\x0E\xF0\x9F\x7B\xB8\x7B\x95\x61\x07\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 197); - getPNGImage(png); - } - else if (url == "playingart.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0E\x08\x04\x00\x00\x00\x5E\x76\x5E" - "\x59\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x77\x49\x44\x41\x54\x18\xD3" - "\x75\x90\x41\x15\x80\x20\x10\x44\x27\x02\x15\x88\x60\x05\x62\x58" - "\x81\x08\x5E\x3D\x12\x81\x0A\x46\xF0\x4A\x0C\xAA\x7C\x0F\x08\x28" - "\xE2\xCE\x69\xF7\xBF\x79\xB3\xBB\x92\x56\x1C\x19\x7D\x6B\x45\x08" - "\x37\x43\x19\x8F\xD0\x0C\x49\xC7\x3F\x2A\xAE\x40\x24\x91\xC8\x44" - "\x16\xEC\x9D\xCE\x4C\x09\x49\x76\x8A\x32\x3D\x6B\x54\xA9\xFD\x03" - "\x4C\x5F\x2B\xB4\xA1\xC3\x8E\x77\xFA\x96\x10\x11\xC7\x13\x9D\x6C" - "\xD4\x3B\xCD\xFB\x71\x9E\xFD\x6E\x1D\x81\xE1\x61\x89\xE2\xAE\xE0" - "\x02\xE8\xCB\x7B\xB8\xAB\x17\xF7\x85\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 197); - getPNGImage(png); - } - else if (url == "noadavail.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC1\x00\x00\x0E" - "\xC1\x01\xB8\x91\x6B\xED\x00\x00\x02\x66\x49\x44\x41\x54\x38\xCB" - "\x63\xF8\xFF\xFF\x3F\x03\x0A\x66\x60\xD0\x00\xE2\x66\x20\xDE\x0C" - "\xC4\xAF\x81\xF8\x31\x10\xAF\x07\xE2\x1A\xB0\x1C\x9A\x7A\x74\xCD" - "\x39\x40\xFC\x19\x2C\x8C\x1D\x7F\x07\xE2\x02\xEC\x06\x30\x30\x6C" - "\x87\x29\xFC\xCA\xC0\xB0\x6E\x29\xBF\x40\xC7\x82\xBE\xCA\x9B\xAB" - "\xA6\x57\x3F\x9C\x2F\x21\x32\xF9\x33\x03\xC3\x62\x24\x83\x40\x6A" - "\x59\x10\x06\x40\x6C\x06\x73\xFF\x30\x30\xBC\x2D\xF3\x70\x4A\xCF" - "\x2E\x4E\x9B\xB3\xFE\xF0\x82\x77\xDB\x4E\xCE\xFB\x94\x53\x9B\xBC" - "\x36\x30\xDA\x2B\xF6\x14\x1F\x4F\x18\x50\xCD\x73\xA8\xDA\x12\x88" - "\x01\x10\x3F\x83\x9D\xFD\x9B\x81\xE1\x3A\x88\x7E\xA8\xAD\xF2\x7A" - "\xDA\xB2\xCE\x5B\xBB\xCF\x2C\xF9\x7A\xF0\xCA\xC2\x5F\x53\xD6\x36" - "\xBF\xEA\x98\x5B\x71\x38\x3C\xCD\x2F\xEE\x36\x2B\x8B\x0F\x92\x77" - "\x34\x18\xA0\x01\x06\x12\x58\x3E\x5B\x5E\xDE\xE9\x17\x2B\xCB\x4F" - "\x10\x7F\x8F\x87\xE5\xD1\x45\xBB\xFA\x1F\x2E\x39\xD8\xF8\x21\xAD" - "\x21\xEE\x40\xF5\xB4\xEC\x4B\xA1\x39\xBE\x13\x54\x0D\x55\x95\x80" - "\xF2\xD3\xA1\x7A\x6A\x18\xA0\xA1\x0D\x72\x7A\xA0\x95\xAD\x95\xC6" - "\x4E\x37\xAB\x43\x20\xFE\x5F\x46\xC6\x7F\x3B\x0B\xFD\xDE\x77\x6C" - "\x8C\x7F\xA1\xED\xA8\x5F\xE6\x91\xE4\x98\x68\xE1\x67\x16\x2C\xAB" - "\x25\x2F\x06\x94\x87\xB9\x62\x3D\x03\x34\xAA\x40\x1C\x19\x19\x45" - "\x79\x7E\xC7\x70\xFB\xA4\x43\xD6\xCA\x30\xB1\xFF\xFB\xE2\x8C\xFE" - "\xC4\x77\x07\x5F\x30\x0D\xB3\x6C\x10\x51\x92\x52\xE7\xE4\xE3\x66" - "\x06\x8A\x8B\x40\xE5\x1F\xA3\x18\xA0\xA0\xA5\xCC\x24\xAD\x26\xC7" - "\x2B\xAC\x2C\x6B\xB3\x5C\x51\xFC\x10\xCC\x90\x93\x1E\x1A\xBF\xAB" - "\x16\x47\xBF\x0A\x28\x72\xE9\x53\x31\x51\x96\x43\x37\x00\xEE\x05" - "\x03\x3B\x23\x59\xBF\x0C\xDF\xE4\x90\xC2\xC0\x34\x2D\x4B\x6D\xD3" - "\xCD\xE9\xEE\x0F\xFF\x30\x31\x82\x0D\xB9\xAC\x2F\xF5\x25\xAD\x37" - "\xF0\x90\x55\x98\xA9\x19\x30\xB0\x3D\x91\xBD\x00\x0B\xC4\xD9\x56" - "\x1E\x56\x86\x89\x0D\xD1\x1B\x73\xA7\x26\x5D\x0B\x2F\x0F\x68\x6D" - "\x5C\x59\x76\x77\x6E\xB1\xC3\xC7\x9F\xCC\x4C\xBF\x41\x6A\xEE\x49" - "\xF1\xBF\x8C\xB7\x56\xB5\x00\xB2\xFB\x91\x03\x51\x03\x1A\x25\xFF" - "\xCF\x71\x73\x06\x7B\xA5\xBA\x96\x24\x74\x84\x9C\x4C\xEB\x8B\xB9" - "\xD1\xB0\xB6\xE8\x6B\xD9\xCA\xA4\x9F\x0D\xF9\x2E\xCF\x3F\x71\xB1" - "\xFD\x02\xA9\xF9\xC5\xC0\x70\x15\x48\xFF\x46\x44\x23\x24\x21\x15" - "\x40\x4D\x7C\xBE\x97\x8F\x2B\xDA\x22\xD0\x34\xCE\x3D\xCD\x79\x7E" - "\xE6\xEC\xF8\x77\x59\x73\xE2\x3E\x7A\xE6\xBA\xAE\x2D\xB4\x51\x2B" - "\x04\x3A\xFD\x09\x50\xCD\x3F\xD4\x84\x84\x25\x29\x7F\x02\x7A\x67" - "\x36\x1F\x77\x5B\x52\x89\xFB\xF5\xF4\x4A\xEF\xFB\x93\xC5\x04\xBA" - "\x3F\x30\x32\xCC\x80\xDA\x0C\x52\xB3\x1B\x35\x29\x43\x0C\x60\x01" - "\x9B\x0A\xF5\x0E\x9E\xCC\x54\x02\xD3\x8C\x99\x1B\xC9\xC8\xCE\x00" - "\x29\x75\xE7\x5B\x81\xE0\xCE\xEC\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 692); - getPNGImage(png); - } - else if (url == "adavail.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC2\x00\x00\x0E" - "\xC2\x01\x15\x28\x4A\x80\x00\x00\x02\xF6\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xC0\x00\x8C\x2C\xEC\x6C\x1C\xEA\x2A\xCA\x1A\x39\x33\x57" - "\x4D\x7C\xBA\x74\xEB\xE4\x37\xBA\xC6\xBA\x8D\x6C\xEC\x1C\x5A\x20" - "\x49\x06\xFC\x80\x91\x95\x95\x85\x4D\x41\x48\x40\xD4\xC7\xDC\xDC" - "\xBA\x77\xF5\xE1\x45\xDF\xB7\x9D\x5C\xF8\xC3\x3D\xD4\x7D\xA3\xA0" - "\xA0\x70\x10\x0B\x2B\x9B\x12\x50\x11\x13\x56\xAD\x4C\x8C\x4C\x3C" - "\xFC\xBC\x42\xF6\xF6\x0E\x8E\x5D\xB5\x2D\x15\xE7\x96\xEF\x98\xFD" - "\xF1\xFC\xBD\x8D\xFF\x2E\x3E\x5C\xFB\x6F\xD9\xFE\x49\x3F\xCA\xDB" - "\xF2\xAE\x5A\x39\x59\x4D\xE4\xE4\xE6\xD6\x01\x2A\x67\xC5\xB0\x9A" - "\x9D\x95\x43\xC5\xC1\xD1\xA9\x65\xDD\xEE\x45\x1F\x4E\xDE\xDA\xF8" - "\x77\xEA\xEA\xB6\xF7\xFB\x2E\x2C\xFB\x7B\xF2\xF6\xAA\x7F\xF3\x77" - "\xF5\xFD\x3A\x7A\x6B\xF9\xBF\xC5\xBB\x26\x7C\xD6\x37\xD7\x2F\x62" - "\x62\x62\x92\x44\xF3\x0E\x23\xB3\x88\x90\xB8\x5B\x65\x6D\xD9\xE1" - "\x2B\x8F\x77\xFD\xEF\x9D\x53\xF3\x40\xCD\x56\xA7\x7E\xE3\xF1\x85" - "\x5F\x76\x5E\x9A\xF6\xCB\x21\xC1\xFD\x58\xCB\x82\x92\xB7\xEB\xCE" - "\xF6\xFC\x0F\x4E\xF5\xD9\x06\x74\x85\x39\x9A\x57\x18\x99\xA5\xA5" - "\xE4\xC3\xBA\x27\xB7\xDC\xB8\xF8\x68\xFB\xFF\xEC\xAA\x94\xF3\x9C" - "\x7C\xDC\x6A\x93\xB7\xD6\xBC\x99\xBA\x27\xF9\xBB\x94\x86\x42\xA3" - "\xBA\xBD\x7A\x7D\x68\xB9\xCF\x6D\xC7\x24\x97\x73\xFC\xA2\xC2\xBE" - "\x40\x4D\xCC\x28\x41\xC0\xCF\x27\x68\x97\x92\x9B\xB4\x7B\xFD\xB9" - "\x89\xFF\xDB\xD7\xA7\x7E\x4D\xEF\xCD\xBE\x30\x75\x4F\xFD\xAF\xEE" - "\x9D\xB1\xBF\x14\xCC\xB5\x26\xB2\xB0\xB3\xF2\x73\x0B\xF1\x6A\x81" - "\x30\x33\x0B\x8B\x00\x66\xF8\x33\x32\x71\x8B\xCA\x4A\xC7\x07\x56" - "\xFA\xDE\x6D\xD9\x96\xF4\x7F\xE6\xA1\xFC\xFF\x13\xF7\xE6\xFD\xEF" - "\xD8\x99\xF2\xAF\x74\x69\xC2\x77\xBF\x1A\xBF\xDB\x52\x3A\x2A\x4D" - "\xCC\x2C\xAC\x32\x78\x23\x12\xA8\x40\x41\x44\x5D\xB1\xC1\x26\xD5" - "\xF9\x7C\xE3\xC6\x8C\x3F\xAD\xDB\x52\xFF\x35\x6D\x49\xFD\xD3\xBF" - "\x2F\xFD\x5F\xDD\xC6\x94\xFF\xC6\x5E\xC6\xF3\x59\xD9\xD8\xD5\x31" - "\xD2\x04\x1B\x3B\xBB\x98\xA0\x94\x88\x81\xB0\x8C\x98\x11\x3B\x17" - "\x87\x30\x2B\x1B\xA7\x5E\xE7\x86\xEA\x8F\x4D\x1B\x93\x7E\x9B\xC5" - "\x3A\x9E\x8A\x68\x0F\xBC\xD5\xB1\x2B\xFD\x5F\xCE\xE2\xB8\xBF\x92" - "\xCA\xD2\x09\x28\x61\xC0\xC8\xC8\xC8\xAA\xA4\xAE\x96\x97\x33\x29" - "\xFF\x7D\xC9\x9C\xA2\x2F\xDA\x96\xBA\xB9\x40\x41\xB6\xA6\xD5\xA5" - "\x6F\xEA\xD6\x26\x7E\x17\x93\x97\x2E\xD4\xB4\x56\x49\x6C\xD8\x9C" - "\xFA\xB7\x70\x65\xD2\x7F\x69\x55\x4C\x03\x58\x94\x54\x94\x53\xAB" - "\xE6\x15\xBC\x9E\xB0\xBF\xFC\x3F\x30\xB4\x0F\x2B\xEA\x69\x64\x76" - "\x6C\xA8\xFF\x5C\xB5\x36\xF1\xA7\xA6\x9B\xF1\x4A\xCF\x3C\xE7\x0D" - "\x0D\x9B\xD3\xFF\xC5\x74\x86\xBE\x14\x96\x12\x0B\x41\x8F\x05\x46" - "\x4E\x4E\x2E\x6D\x33\x6F\xCB\x59\x79\x0B\x93\x7E\x54\x6D\x48\xF9" - "\x5F\x3C\x35\xEB\x45\xE7\xD6\x9A\xBF\x15\x6B\x92\xFF\xA5\x4C\x8B" - "\xFD\x52\xB1\x2E\xED\x7F\xEE\x82\xC4\x5F\xDA\x2E\x7A\x3D\xAC\x6C" - "\x6C\x8A\x18\x61\x00\x8C\x05\x5E\x1E\x3E\x7E\x47\x2D\x1B\x9D\xBE" - "\x80\x52\xEF\x9B\x79\xF3\x53\x7E\xD4\x6D\xCC\xFE\x57\xBB\x01\xE8" - "\x6F\xA0\xC6\x60\x60\xEC\x68\xD9\xEA\xF4\x73\x70\x71\x81\x32\x15" - "\x1B\xCE\xCC\xC4\xC2\xCA\xAA\x0C\x34\xC8\x43\xD1\x40\xB5\x2F\x61" - "\x7A\xF4\xF7\xB4\x99\x71\xDF\x0D\xBD\xCD\xD6\xF3\xF2\xF3\x7B\x03" - "\xE5\x14\x88\xC8\x91\xC0\x9C\xC2\xC6\xAE\x29\x26\x2F\x99\x15\xDA" - "\x1A\xF4\x34\xB6\x27\xFC\xB5\xBC\x8E\x72\x2D\x34\xEA\x30\x00\x00" - "\xBB\x07\x15\x4B\xC6\x05\x9A\xAA\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 836); - getPNGImage(png); - } - else if (url == "adplayed.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC1\x00\x00\x0E" - "\xC1\x01\xB8\x91\x6B\xED\x00\x00\x02\x50\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xA0\x22\x60\x04\x02\x39\x31\x71\x89\xB2\xA9\x4B\x3A\x5E" - "\x29\xA8\x2A\xF4\x02\xF9\xF2\x20\x71\x62\x34\xB3\x00\x81\x86\x9A" - "\x86\x6A\x59\x62\x56\xCC\xC1\x3D\xE7\x96\xFE\xCA\xAD\x4B\xBA\xA6" - "\xA6\xA5\x5C\xCD\xCC\xCC\x4C\xD8\x10\x46\x06\x46\x31\x6D\x1D\xAD" - "\xD6\x65\x9B\xA7\xBD\xE9\x5F\xDC\xF8\xFE\xF0\xD5\x15\x7F\xE7\xED" - "\xE8\xF9\xB9\x60\x73\xD7\x3B\x79\x65\xD9\x76\x31\x31\xF1\x3A\xBC" - "\xAE\x62\x61\x61\x35\xCA\x2F\xC9\x3C\x3B\x67\x55\xE7\x6B\x31\x05" - "\xF1\xD2\x95\x87\xFA\xBF\x19\xB8\x19\xEF\xCB\x6B\x8D\x7B\xED\x13" - "\xEE\x7E\x0F\xE8\xAA\xD3\x78\x5D\x05\x34\xC0\x38\xA7\x34\xE5\x42" - "\xEF\xB2\xF2\xB7\x7A\x76\xFA\xF5\xDD\x9B\xB2\xBE\x0A\xCB\x89\x4E" - "\x37\xB1\x36\xDE\xB4\x7C\xDB\x8C\xAF\x40\x57\x7D\x84\xB9\x6A\xE1" - "\x96\xEE\x77\x4A\xEA\xF2\xE5\x40\x6D\xFC\xC8\x8E\xE0\x95\x56\x96" - "\xAE\x2D\x9C\x1D\xF5\xA9\x67\x4B\xF6\xF7\x9E\x9D\x19\x7F\x83\x4B" - "\xDD\xDE\x94\xD5\x17\xBC\x99\xB3\xB2\xF3\x9D\xA8\xBC\x78\x19\xC8" - "\x55\x86\xEE\xA6\x7B\xEB\x66\x66\x3F\x77\x8F\x70\x38\xC4\xC4\xC4" - "\xA4\x81\x6C\x00\x13\xD0\x6F\xDC\xAC\x5C\x9C\xFE\x3A\x1E\xFA\xDB" - "\x1B\x37\xA4\xFE\x4E\x68\xF1\xFB\xD6\x3C\xA5\xEC\xDF\xC4\x35\x55" - "\xBF\xF4\xEC\xF5\x27\x80\x5C\x25\xA2\x20\xDE\x2B\x2A\x2F\x1C\x2F" - "\xA3\x2D\x5B\x0B\x34\x40\x01\xAE\x9B\x95\x8D\x4D\xD7\xC4\xDD\xB4" - "\x5F\x56\x4D\x36\x91\x95\x9D\x55\xA9\x66\x59\xFA\x67\x59\x3D\xC5" - "\x65\xCE\xB1\x36\x0F\xCB\x16\xC7\xFF\xEF\xDD\x92\xF5\x13\xE4\xAA" - "\xE4\x9E\xA0\xE7\xAA\x36\xEA\x73\x98\x98\x99\x35\x51\xC2\x80\x93" - "\x8B\xD3\xBD\x70\x6A\xC6\xDB\xA8\x2A\xBF\x4B\x02\xA2\x42\x71\xD5" - "\xCB\xB3\xBF\xCA\xE8\x29\x2C\xF1\xCA\xB6\x3B\xE9\x96\xE1\xF4\x59" - "\xD7\xCB\xF0\x04\xC8\x55\xC5\x0B\x63\xBE\x34\x6E\x48\xFA\x65\x1E" - "\x60\xB8\x93\x91\x89\x49\x11\x39\x05\x49\xA9\x18\xAB\x4C\xCF\x9C" - "\x11\xF9\x31\xAB\x3B\xF1\x75\xFD\xFA\xDC\xBF\xA1\x75\x7E\xDF\x13" - "\x3B\x63\x7F\xEA\x3B\xEB\x6F\x07\xBA\xCA\x08\xE4\x2A\x39\x43\xA5" - "\x85\x01\x45\x8E\x47\x0A\x96\xC7\xFF\x65\xE3\x64\x77\x42\x89\x49" - "\x66\x16\x66\x2D\x29\x35\xC9\x2A\x87\x58\x9B\xA3\x79\x0B\x13\x7E" - "\xD9\x84\x59\x3E\x2C\x9E\x9E\xF9\x2D\xB2\xCA\xEF\x3A\xD0\x55\xF1" - "\x10\x57\x29\x2E\xF6\x2D\x70\x3C\x1E\xDB\x19\xFC\x8E\x95\x8D\xD5" - "\x1A\x5B\x52\x96\xE5\x15\xE6\x2B\x09\x6E\xF0\x7B\x25\x2C\x23\x3A" - "\x15\xE8\xAA\x45\xC8\xAE\x4A\x9A\x14\xF9\x35\x7D\x46\xD4\x27\x39" - "\x5D\xD9\x2E\xA0\x7A\x61\x82\xC9\x1B\xDD\x55\xEE\xD9\xCE\xD7\xA4" - "\xD5\xA5\xAA\x99\x98\x99\xE4\x40\x31\x47\x6C\x06\x83\xBB\x0A\x98" - "\x1E\x3A\x81\x7C\x19\x6A\xE6\x60\x06\x00\x9A\x6E\xEF\x92\x09\x7E" - "\x22\xAD\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 670); - getPNGImage(png); - } - else if (url == "v1.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x81\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\x41\x4B\x02\x51\x14\x85\xFD\x29\xFD\x8A\x16\x2D\x5A\xB4" - "\x68\xD1\x22\x08\x5A\xB4\x94\xA0\x7F\x20\xB4\x6C\x11\x11\xC1\x14" - "\x42\x84\x60\x44\x66\xB5\x08\x22\x08\xC1\xC1\xC4\xAC\x4D\x61\x46" - "\x12\x8E\x9A\x49\x9A\x59\x56\x9A\xCE\x28\x64\x24\xC4\x69\xCE\x90" - "\xC3\x3C\x67\x5C\x75\xE1\x83\xC7\xB9\xE7\x1E\xDE\x7B\xF3\xC6\xE5" - "\xEA\x2B\x49\x92\xDC\x3A\x71\x1D\xF4\x41\xCD\xED\x1A\x54\x7A\x73" - "\x48\x27\xE5\xF7\xFB\xA1\x28\x0A\x5A\xAD\x16\x7A\xC5\x35\x35\xF6" - "\xE8\xA1\xD7\x69\x58\x95\x65\xD9\x18\x78\x6C\x76\x11\xBC\x56\xB1" - "\x18\x7D\x37\xE0\x9A\x1A\x8B\x1E\x7A\x85\x10\xA6\xF6\x86\x03\xC9" - "\x26\x66\x76\xCB\x8E\xB0\x67\x09\x49\x99\x67\xE6\xD6\x58\xDB\x89" - "\x06\xA6\x03\x25\x93\x83\x94\x8A\xD3\xFB\xB6\xA0\xD1\xC3\xFA\x3B" - "\x8E\x9B\x01\x71\x9E\xAF\xD8\xF8\xC6\xD4\xD6\x83\x49\x48\xD1\xD0" - "\xE9\xFE\x20\xA6\x07\x58\x75\x42\x2F\x67\x38\xCB\x00\xE3\x92\x36" - "\x2F\xEA\x98\xF4\x17\x4C\x66\xF7\x8B\x08\x67\x34\x44\xEF\x34\x41" - "\x27\xF4\x72\x86\xB3\x46\x00\x6B\xFE\xB8\x82\x09\x5F\x5E\x60\x2F" - "\xF9\x81\x93\x9C\x66\xD3\xE9\x65\x09\x01\x9E\xA3\x32\xC6\xD7\x73" - "\x02\xC1\x44\x1D\x91\xAC\x6A\xD3\xE9\x15\x02\xB8\x9D\x8D\xF3\x57" - "\x8C\x79\x33\x02\x81\xCB\x1A\x64\xA5\x69\xD3\xE9\xB5\x1E\xC1\xB8" - "\xC4\x42\xED\x0B\xA3\xAB\x69\x13\xCF\x61\x09\x57\xA5\x36\xB2\xD5" - "\x4F\x2C\x84\xCA\x42\x8F\x5E\xEB\x25\x9A\x9F\xD1\x1B\x7B\xC1\xC8" - "\xCA\xAD\xC1\xB2\xFC\x04\x39\xDD\x44\x38\xDD\x80\xEF\xAC\x6A\xEA" - "\xF4\x08\x9F\xB1\xFF\x21\xAD\x45\x9F\x31\xBC\x74\xE3\x08\x7B\xB6" - "\x87\xE4\xF4\x94\xF3\x6F\x1D\x48\x91\x0A\xE6\x76\xF2\x06\x5C\x53" - "\x1B\xF8\x94\xFF\xFD\x33\xFD\xE7\x77\xFE\x05\xEF\x5F\x9A\xB1\x51" - "\x9D\x7F\x55\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 463); - getPNGImage(png); - } - else if (url == "v2.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\xA6\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\xBD\x2F\x83\x51\x14\xC6\xFB\xA7\xF8\x2B\x0C\x06\x83\xC1" - "\x60\x90\x48\x0C\x6C\x5D\x98\x8C\x84\x58\x31\x54\x5E\xD5\x44\x9A" - "\x26\x15\x14\x11\xB1\xF8\x88\x44\x95\x52\x22\x48\x51\x8D\xB4\x48" - "\x35\xF4\x4B\x5B\x6D\xD3\x56\x69\x4A\x0D\x7D\xBC\xCF\x8D\xDE\xF4" - "\xAD\x9A\x9C\xE4\x97\xF7\xDE\x73\x9E\x73\x72\xCF\x7D\xCF\xD5\xE9" - "\xEA\x4C\x51\x14\xBD\x8A\x4B\x05\x75\xD0\xA7\xD7\xFD\x65\x6A\xB0" - "\x49\xC5\x6B\xB5\x5A\xE1\xF7\xFB\x51\x28\x14\x50\x35\xAE\xE9\x63" - "\x8C\x1A\x6A\x1B\x25\xE7\xED\x76\xBB\x48\x08\xE7\xBE\xB0\x74\x95" - "\xC7\xD8\x7E\x4A\xC0\x35\x7D\x34\x6A\xA8\xD5\x14\x61\xD5\x6A\xB2" - "\xED\x32\x87\x9E\xE5\x48\x43\x18\xAB\x29\xE2\x95\x3D\xF3\x68\xB4" - "\x05\x77\x16\xDD\xB6\x90\xE0\xF0\xE1\x4D\xF8\x2A\x95\x0A\x7C\x89" - "\x92\xF4\x53\x43\xFB\x69\x47\xCF\x02\x2E\xF6\xF7\x94\x2D\xA3\x6B" - "\xEE\x51\x70\x1E\x2A\xC2\x7C\x92\x86\x7E\x25\x2C\x18\x77\x24\x11" - "\xCC\x7C\xCA\x38\xB5\xCC\x61\x2E\x0B\x88\x4B\x9A\x3D\xCB\xA0\xD3" - "\x1A\x14\xF4\xAF\x86\xD0\x6B\x7B\x94\xFB\xD1\xED\x18\x92\x85\xB2" - "\xDC\x53\xCB\x1C\xE6\x8A\x02\xB4\xE1\xAD\x18\x3A\x2C\x01\x0D\x8A" - "\x33\x01\x4F\xB4\x88\xDD\xBB\x57\x0C\x6D\x44\xA5\x9F\x5A\x9A\xA6" - "\xC0\xE0\x7A\x04\xED\x33\xF7\x92\xE9\x83\x04\x96\xDC\x19\x18\xF6" - "\xE2\x18\xD9\xD4\xC6\xA8\xD5\x14\xE0\x71\xCC\xC7\x49\xB4\x99\x6E" - "\x05\x46\x67\x1C\xF3\xA7\x29\x0C\xAC\x3D\x49\x5F\x2D\xD4\xD6\xB6" - "\x20\x2E\x31\x98\xFE\x40\xEB\x94\x4F\xE0\x89\xBC\xC3\x79\x9F\x87" - "\xF9\x28\xA9\x92\x10\x4C\x3A\x9E\x65\x9C\xDA\xDA\x4B\x94\xBF\xD1" - "\x74\x10\x47\x8B\xE1\x06\x16\x35\x61\xC7\x97\x85\xDD\x97\x13\x5F" - "\xB2\x7A\x91\x16\x31\x6A\x34\xBF\xB1\x7E\x90\x8C\xFB\xCF\x68\x9E" - "\xB8\x6E\x08\x63\xBF\x06\xA9\xD1\x28\x07\x5E\x4A\x50\x1C\x31\xF4" - "\x2D\x06\x04\x5C\xD3\xF7\xE7\x28\xFF\xFB\x31\xFD\xE7\x39\x7F\x03" - "\x7B\x97\xA2\x69\xD2\xB0\x90\x85\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 500); - getPNGImage(png); - } - else if (url == "relay.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\xAB\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\xCB\x4B\x02\x51\x14\xC6\xFD\x53\xFA\x2B\x5A\xB4\x68\xD1" - "\xA2\x45\x8B\x20\x68\x51\x3B\x5B\x04\xAD\x5A\x15\x41\xDB\x1E\x14" - "\x58\x08\x11\x81\x15\xBD\x89\x36\x45\x44\x98\x45\x58\x10\x45\x0F" - "\x33\x6B\x7A\x88\x54\xEA\x68\x9A\xA2\x26\x9A\x59\x0B\xBF\xE6\x3B" - "\xE4\xA0\x36\xAE\x3C\xF0\x63\xCE\xE3\x3B\x87\x7B\xEF\xDC\x6B\x32" - "\x55\x98\xC5\x62\x31\x6B\x38\x35\x50\x01\x73\x66\x53\x35\xD3\x8A" - "\x75\x1A\x6E\x9B\xCD\x06\x45\x51\x90\x4E\xA7\x51\x34\xFA\xCC\xB1" - "\x46\x0D\xB5\x46\xCD\x29\xBB\xDD\x2E\x0D\xFE\xE4\x0F\x96\xAF\x52" - "\x18\x3A\x78\x17\xE8\x33\x47\xA3\x86\xDA\xB2\x21\x9C\x5A\x6C\x5E" - "\xBC\x4C\xA2\x63\x25\x60\x08\x6B\x25\x43\xDC\xFA\x9E\xB9\x34\xDA" - "\xC2\x79\x02\xED\x8B\xAF\x50\x22\x39\x14\x0A\x05\xC9\xF1\x7B\xF7" - "\x96\x93\x3C\xA1\x86\xF6\xB7\x1D\x33\x07\x38\xB9\xBF\x97\xC4\x37" - "\xDA\xE6\x9F\x05\x36\xCC\x9D\xC5\x61\x5E\xF3\x0B\xC3\x8E\x08\x7C" - "\xF1\xBC\x5E\xA7\x96\x3D\xEC\xE5\x00\x39\xA4\xD9\xD3\x38\x5A\x6D" - "\x3E\xE1\x36\xFC\x09\xAB\x33\xAA\xC7\x83\x3B\x2A\x22\xE9\x6F\x3D" - "\xA6\x96\x3D\xEC\x95\x01\xB4\x81\x6D\x15\x2D\x33\x5E\xC1\x13\xFA" - "\x84\x3F\x91\x87\x2B\x98\x15\xF6\x1E\x3E\xD0\xBF\x15\xD4\xEB\xD4" - "\xD2\xCA\x06\xF4\x6D\x06\xD0\x3C\xF5\x28\xDC\xA8\x59\xEC\x2A\x29" - "\x8C\xEF\x87\xE5\xCB\xB8\x58\x23\xD4\x96\x0D\xE0\x72\xA6\x8F\x23" - "\x68\xB2\xDE\x0B\xD7\xC1\x0C\xC6\x1C\x21\xF1\xBB\x96\xB5\x25\x9F" - "\x44\x85\x62\x9D\xDA\xD2\x2D\xC8\x21\xFA\x62\x5F\x68\x9C\xB8\x13" - "\x5C\x81\x0C\x46\xED\xAA\x1E\xF7\x6E\x3C\x23\x9C\xCA\xEB\x31\xB5" - "\xA5\x87\xA8\xFF\x46\xEB\x61\x18\x0D\xE3\x1E\xCC\x1C\xBD\xA1\x67" - "\xD5\x27\x3E\xE9\x9C\x7D\xC2\xFA\x45\x4C\x7C\x6A\xCA\x7E\x63\xE5" - "\x45\x9A\x3C\x08\xA1\x7E\xE4\xDA\x10\xD6\xFE\x5D\x24\xA3\xAB\xEC" - "\x8D\xE6\x60\x71\xA8\xE8\x5E\xF2\x0A\xF4\x99\xAB\x7A\x95\x6B\x7E" - "\x4C\xB5\x3C\xE7\x5F\xCE\xEF\xA6\xA0\xA0\x37\x1F\x5A\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 505); - getPNGImage(png); - } - else if (url == "wa.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x0D\x49\x44\x41\x54\x38\xCB" - "\x8D\x93\x4F\x68\x92\x71\x18\xC7\x35\xA3\xFF\x86\x5B\x5B\x32\x61" - "\x0D\xC2\xEE\xC5\x08\x22\x0F\x8D\xB5\x0E\x12\x81\x04\xEE\xE0\x41" - "\x21\xA2\xD8\x24\x2A\x56\xB1\x82\xC4\x0A\x06\xC5\xD0\x75\xD8\xA2" - "\x4D\x66\x10\x48\xB0\xB6\x5D\x94\x1D\xB2\x74\x68\x2D\xDD\x41\x93" - "\x2E\xC1\xCA\x2D\x8D\x6D\x81\x98\x22\x25\x82\x7C\xF2\x7D\xB7\x44" - "\x97\x6E\xFB\xC0\x73\x7A\xDF\xCF\xF3\xFE\x9E\xEF\xEF\x79\x25\x92" - "\xCD\x61\xBD\x2A\x51\x94\xCA\x2E\xD9\x06\x2C\x7C\x5D\x20\x10\x0C" - "\x54\x36\xD1\xE9\xF5\xFA\xB4\xF1\x62\x27\x5B\xCA\x8B\x4B\x8B\x08" - "\x24\x93\x49\xDC\x6E\x37\x6A\xB5\x3A\xEE\x9D\x70\x92\x9B\x3C\x8F" - "\xF5\xB2\x62\xD3\x06\x24\x12\x09\xFE\xD1\x77\xAB\x0F\xAB\xD5\xCA" - "\xCF\x99\x07\xA4\x1F\xB7\x10\x19\x6B\x46\xD9\x28\x9B\xDE\x52\xF6" - "\x78\x3C\x18\x8D\x46\xE2\x9F\x67\x29\x4C\x74\xB1\x7A\x4D\x46\xCA" - "\x21\xE7\xA8\x72\x47\x7A\x3D\x87\xFA\xB2\xD9\x6C\xC6\xE9\x74\xC2" - "\x97\x61\x0A\xE3\x2D\xAC\xF6\x4A\x49\x0D\xEE\xE4\xF8\x11\x29\x2E" - "\x97\xAB\x56\xB0\x6B\x33\x0B\xB3\x5A\x2C\x16\xD2\x3F\x62\x10\xBC" - "\x00\x6F\x4E\xF2\xC7\x75\x82\xE2\x5B\x3D\xF1\x29\x3D\x5E\x9B\x96" - "\xAB\xDD\x67\x09\x85\x43\x55\x4D\xC4\xB4\x05\x6E\x9B\xB4\x64\x46" - "\x3A\xC9\x3C\x3C\x44\xC6\x56\x12\x7F\x2D\x81\xBF\x1D\x66\x0E\x93" - "\x1B\xDA\x4F\x7E\x40\xCA\x3D\xD3\x69\xF1\x5D\x9F\xCF\x57\x6E\x22" - "\x5E\x95\xC0\xDD\x9E\x8E\xD2\x13\x15\x84\xBA\xE0\xF7\x77\x98\x3F" - "\x47\xE1\x75\x33\xB9\xC1\x3D\x14\x47\x77\xC1\xF8\x6E\x9E\x3D\xB9" - "\xB3\xD6\xC0\xEF\xAB\x3E\xC5\xDC\xC7\x39\x9E\xDA\x1E\x71\xE3\xD2" - "\x29\xC8\x97\xB2\xF8\xA4\x25\x37\xDA\x40\x7E\x64\x1F\xBC\x92\xE3" - "\xBB\xBF\x17\xDB\x40\xBF\x28\x87\xE7\xC3\xB5\x73\x30\x18\x0C\xA5" - "\xF9\xDF\x93\x77\xB7\x93\x1D\x92\x53\x9C\x6A\x24\xEE\x50\x70\xBD" - "\xFB\x18\xC1\x60\x50\x94\xA3\xD1\x68\x4D\x59\xA1\xD1\x68\x22\xA9" - "\x6F\x01\xB2\x63\x6D\xE4\x5D\x4D\xF0\x4E\x85\xBD\xF7\x20\x2F\x5F" - "\x3C\x2F\xEF\x44\x2C\x16\xAB\x29\x4B\x04\x79\xE5\xC3\x34\x59\x47" - "\x1B\xC5\xD9\x56\x7C\xC3\x4A\x7A\x4C\x67\xF0\xFB\xFD\x65\xB9\xDE" - "\x97\x45\xFA\x75\x6A\xF2\x93\x4A\xD2\xDE\x56\xAE\xE8\x0E\x08\x8B" - "\x42\x28\x14\x62\x79\x65\x59\x94\x37\x5E\xDB\x7F\x08\xBB\x6D\xBF" - "\xD9\x80\xAA\x49\xE6\xAC\xD8\x32\xF1\xAA\x36\xA6\x5D\x8F\x48\xA9" - "\x3A\xB6\xF9\x3B\x57\xF1\x17\x81\x38\xA3\x74\x72\x00\xB9\xAF\x00" - "\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 603); - getPNGImage(png); - } - else if (url == "curl.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x4E\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xA0\x0F\x68\xF8\x7F\xE0\xC0\x81\xFF\x98\x6C\xDA\x18\xD0" - "\xF0\x1F\x53\x11\xD1\x06\x40\x24\x61\x98\x2C\x03\x28\xF2\x02\x44" - "\x02\xBB\x17\x90\x31\xDE\x30\xC0\xE6\x05\x64\x31\x4C\xEF\x51\x3B" - "\xBE\x09\xC7\x02\x59\xF1\x4D\x4F\x03\x06\xAF\x17\x88\x4A\x07\xC8" - "\x71\x8C\x8D\x8D\x2D\x1D\x00\x00\x6B\x22\xE2\xA4\xD5\xBE\x1F\x4C" - "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 156); - getPNGImage(png); - } - else if (url == "radionomy.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAB\x49\x44\x41\x54\x38\xCB" - "\x63\x60\x00\x02\xB1\xAE\x33\xAC\x40\x5C\x0A\xC4\x37\x81\xF8\x1F" - "\x10\xFF\xC7\x81\xFF\x41\xD5\x80\xD4\xB2\x32\x20\x69\xDE\x81\x47" - "\x13\x2E\xBC\x03\x6C\x08\xD4\x34\x90\xC0\x3B\x20\x0E\x03\x62\x2E" - "\x06\x1C\x00\x24\x07\x55\xF3\x0E\xAA\xA7\x94\x01\xEA\x24\x10\x27" - "\x8C\x81\x48\x00\x35\x04\xA4\xE7\x26\x03\x92\x9F\xF1\xD9\xCC\x8A" - "\xC5\x25\xE0\x30\x61\x80\xF9\x09\x8B\xA6\xC9\x40\x7C\x0B\x88\x7B" - "\x81\xF8\x2F\x10\x37\xA0\xC9\x43\xF4\xE1\x31\x60\x03\x54\xEE\x2E" - "\x10\xD7\x03\xB1\x13\xB9\x06\xD8\xE3\xF0\x16\xD1\x06\x88\x50\x6A" - "\x80\x00\xCD\x0D\xC0\x1A\x8D\x40\x7E\x22\x10\x4F\x05\x62\x36\x1C" - "\x09\x0A\x1E\x8D\x14\x27\x24\x8A\x93\x32\xB9\x99\x69\x27\x7A\x8E" - "\x24\x2B\x3B\x03\x00\xC3\xBC\x4D\xD5\xF9\xC1\xBC\x7C\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 249); - getPNGImage(png); - } - else if (url == "chrome.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x02\xE8\x49\x44\x41\x54\x78\x01\x65\x93\xDD\x6B\xD6" - "\x65\x18\xC7\x3F\xD7\xFD\xB2\xFD\x9E\x47\x63\xB3\x74\x4D\xDB\xF2" - "\x99\x21\xC5\x93\x16\x19\x61\x27\xD1\x36\xF1\xA0\x37\x09\x02\xE7" - "\xEA\xC4\x88\x75\x24\x74\xE2\x69\x41\x45\x7F\xC1\x3C\x1B\x42\x45" - "\x50\x9E\x14\x41\x74\x12\x54\xD0\x91\x06\xE9\x81\x33\x59\xE5\x66" - "\x9B\x3A\x6D\xDB\xE3\xDA\xCB\xF3\x7B\xBB\xEF\xAB\x1F\x13\x65\xD5" - "\x07\x3E\x47\xF7\x75\x7F\xBF\x07\xF7\x7D\x09\xFF\xE1\xAF\x63\x2F" - "\x8A\x49\x3A\xFB\x4D\xAD\xE3\x29\x31\x66\xB7\x46\x25\xA6\xD9\xD5" - "\xB8\x96\x9E\x0F\xED\x6C\x16\x50\x36\xE1\xE6\x5F\x19\xE6\x2E\xB1" - "\x9D\xF7\xC6\xB5\x6C\x0C\x18\x01\x06\xC4\x99\x44\x43\x24\xA6\x79" - "\x1A\xB3\x62\xBA\x3A\x3F\x13\xD7\xF3\x09\x60\xFE\x5E\x40\xB9\xB8" - "\x0A\x80\xA6\x45\x53\x6A\xFE\x14\x30\xA8\x31\x4A\x35\x8C\x18\x41" - "\xA3\xA2\x45\xA8\x57\x01\x8F\x57\x41\xEF\x57\x0E\x69\xBB\x38\x01" - "\x5C\x02\x70\xA1\xB5\xC6\xD9\x47\x7D\xEF\xD3\xBF\x15\xE3\x3E\xC6" - "\xA1\x6A\x98\xE8\xEF\x5C\x46\x75\x43\x2D\xA9\x0C\x68\x16\x24\xE6" - "\xE5\x90\xE6\x61\x3C\xA6\xF2\x06\x30\xEF\xCA\x56\xE4\xAB\xD1\x1D" - "\x63\xEE\xB3\x5B\xC3\x07\x26\x33\xA4\xA3\x04\x03\x72\xFF\x36\x42" - "\x7F\x3F\x78\xB0\xE9\x34\xE4\xB7\x37\xC2\xAC\x46\xC4\xE8\xB0\xEB" - "\x29\xC7\x80\x0F\xDD\x3B\xA7\x1B\x0F\x47\x2F\x47\x7F\x38\xD4\x45" - "\xDF\xD4\x75\xB6\xB7\x03\x3C\xF9\x04\x53\xAF\xBD\xC9\xCC\x03\x0D" - "\x30\xC2\x9E\xCE\x3F\xD8\xEF\xC6\xD9\xC2\x39\xAC\x57\xAC\x8B\x18" - "\xA3\x47\xC5\xF1\x89\xBC\xF4\xCD\x0B\x47\xC4\xF2\xB9\x51\xAD\x1F" - "\xFA\xF4\x1A\x43\x17\x1D\x7F\x9E\xFC\x88\xAF\x69\x40\x54\x00\x04" - "\x61\xA4\x39\xC5\xF3\xF7\x9D\x80\xB0\x00\x22\x68\x94\x75\x8D\x76" - "\xD4\x10\xB4\x81\x92\x44\x67\xF8\x79\xB8\x9B\xB9\x67\xF6\x72\xD6" - "\xEE\x62\xEE\xD6\x0A\x8B\x7F\xB7\x59\xAA\x9C\x5D\x58\xE1\xA7\xB9" - "\x06\xA5\x6F\x02\x01\x94\x4A\x49\x62\x30\x0D\x17\x03\x18\x5B\x19" - "\x95\x56\x5F\x8D\x8B\x87\x7B\x58\x49\x0B\x16\x56\x53\x12\x6F\x01" - "\x48\x8B\xC0\xF2\x9A\xB2\x19\x8D\x86\x50\x5A\x9C\x16\x3A\xA3\x86" - "\x54\xAD\xD4\xC5\x18\x26\x77\x2E\xB1\x2F\x2C\x53\x4E\x15\xDC\x5C" - "\x2D\x01\xA8\x77\x78\x0E\xEE\xBC\x8E\x2F\x2F\xA3\x58\x54\x85\x50" - "\xBA\x34\xE4\x7E\xC6\xC5\x54\x2F\x00\x57\xC4\xCA\x3E\xE3\x85\xC5" - "\x6C\x89\x1B\x5B\xBF\xE5\xC8\xC1\xE7\xB8\xF4\xBB\x05\x60\xFF\xC0" - "\x2A\xCF\xEE\x38\x0D\xE5\x4D\xC0\x12\x4B\x47\x91\xFA\x2B\x45\xE6" - "\x2F\xC8\xE2\x77\x7D\x1C\xBB\xD6\x7C\xD7\xD6\xE5\x03\x5B\x37\x88" - "\x03\x50\xB6\x75\x74\xD3\xE3\x76\x91\xA5\xB0\x27\xFC\xC2\xDB\xBD" - "\xE7\x48\x0C\x54\xCD\x64\x6B\x09\x59\xBB\xF3\xBD\x8D\x67\x8C\x51" - "\x28\xDB\x71\x22\x06\x19\x24\x32\x6C\x6B\x82\x78\xA1\x95\xDD\x66" - "\x21\x6D\x51\xCF\x32\xDE\xEA\xF9\x95\x44\x84\xAA\x91\x6C\x3D\x21" - "\x5D\xED\xFC\xBE\xC8\xDD\x04\x80\xCC\x7E\xF9\x08\x00\xAF\xCF\x35" - "\x9A\xD6\xCB\x29\x57\x33\x83\xAE\x26\x62\xBC\x10\x81\x97\x6B\xF3" - "\x1C\xEF\x9A\x23\x14\x96\x74\xBD\x43\xF3\xB6\xFF\xB1\xCC\xED\xBD" - "\xAF\x2C\xD3\x5F\xEC\xE5\x2E\xA3\xB3\x7D\xBD\xD6\xC9\x58\x15\x34" - "\x22\x4E\x06\x1E\xF2\x45\x72\xB2\xFB\x06\x0F\x4A\x91\xE6\x85\x9D" - "\x0E\x85\x39\x53\x96\xE6\x5F\xCB\x24\x97\x3F\x7E\x8C\xCD\xBC\x3A" - "\xB9\x5D\xB6\x74\xB9\x3E\xB5\x72\xE0\x70\x7D\x7D\xF7\xF1\xAD\xCB" - "\xC4\x28\x57\x43\x90\xF3\x2B\x2D\xF7\xBF\x75\xFE\x07\xC1\xB8\x73" - "\x8C\xE9\x85\xD9\x6A\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60" - "\x82", 801); - getPNGImage(png); - } - else if (url == "firefox.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x3C\x49\x44\x41\x54\x38\x11\x05\xC1\x4B\x68\x5C" - "\x55\x00\x80\xE1\xFF\xDC\x73\xE7\x95\x8C\x79\x4D\x26\x0E\x69\x4C" - "\x82\x8D\x49\x93\x2A\x41\x25\x89\x31\xE8\x46\x45\x22\x6E\x04\x11" - "\x45\x51\xD0\x8D\x2B\x17\x82\x10\x50\xF7\x2E\x45\x5D\xB8\x11\x5C" - "\xB6\x14\x2A\x5A\xAA\x3B\x43\x85\x28\xA8\x2D\x5A\x34\xE6\xD1\x4C" - "\x26\xCE\x8C\x93\xC7\xDC\xCC\xEB\xCE\xDC\xD7\x39\xF7\xF8\x7D\x02" - "\x00\x00\x00\xE0\xAB\xBD\x50\x96\x4E\xBD\x59\x3F\x8A\x57\x0D\x3C" - "\x08\x18\x01\x07\x29\xDB\xFA\x25\x9B\xCF\xDE\xDB\xB8\x24\x35\x00" - "\x00\x80\x00\xA8\x7F\x36\x67\xE5\xA2\x5D\xF1\xFE\xFC\xF1\x78\xAB" - "\xE3\xBF\xD7\x16\xF6\xCB\x76\x52\x5E\xC8\x24\xAC\x84\x40\x10\x46" - "\x2A\x4A\xC4\xAA\xBC\x38\x96\xB8\x92\x33\x9D\x2F\xE7\x9E\x9A\xAD" - "\x2C\x83\x01\x90\x00\xEF\x2E\x0C\x3E\xBA\x15\xAE\xBF\xBE\xE9\xCE" - "\x6E\x9C\x38\xCD\xD7\x72\xF6\xF6\x50\x26\xD1\x92\x75\x9D\xC7\xD3" - "\x31\x75\x3F\x94\xAD\x86\x3B\x9C\xE9\x36\xD6\x96\x46\x1B\xCF\x27" - "\x9E\xCC\xBB\x1F\x17\xB6\xFE\xFE\xF4\x36\xB1\x04\x78\x65\x7C\xEC" - "\x4D\xD1\xF3\x3F\x99\x32\x3B\x53\x2B\xD9\x9F\xC5\xCA\xC8\x6F\xDC" - "\x74\x57\x29\x47\x03\xB4\x83\x80\x66\xC7\x23\xAA\xB7\xB1\x3A\x81" - "\x58\x9B\x93\x63\x13\xF9\xF0\x99\xB0\x20\xF7\x3E\xBF\xB2\xBB\x6D" - "\x1B\x73\x59\xFC\xF9\x86\x9E\x1E\xC9\x34\xC4\x14\x0D\x92\x96\xA1" - "\x56\x1B\xE4\x89\xC6\x2D\xF6\xFA\x2B\xDC\xB5\x2F\x23\x23\x8D\xE8" - "\xFA\x94\xDB\x5D\xF6\xCA\x43\xAC\x3C\x9D\x1C\x08\xC7\xE5\xDB\xE6" - "\x9C\x1F\xE4\x5B\xCD\xDC\xBC\x34\xE6\x43\x23\xC4\x08\xB6\x05\x29" - "\x8B\x84\x0E\x99\x0C\xE0\x54\x8D\x51\x6E\x0F\x60\x39\x2D\x8C\x73" - "\x4E\xE8\x76\xE9\x35\x2B\x3C\xB7\x74\x4E\x7F\xA6\x9A\x08\xEB\x07" - "\x37\xEC\xC8\x63\x45\x79\x4C\x8A\x84\xC1\x28\xD0\xAE\x40\x0F\xDB" - "\x5C\xF5\xE6\xB9\xD5\x9A\xC0\x68\x07\xD5\x73\x51\x6E\x93\x38\xF4" - "\x99\x5A\x2C\xA0\xA3\x16\xBD\x60\xBA\xB0\x73\xFD\xE2\xBA\xED\xB9" - "\x0C\x11\x62\x27\x00\xE5\x41\xE3\x3F\xF8\x46\x2F\xF0\x63\xD4\x4F" - "\x37\x3E\x86\x58\x83\xD7\x80\xA0\x83\xF6\xBA\x3C\x94\x77\x18\xEE" - "\x3F\xA1\x78\x98\x4D\xEF\xB7\x06\xA7\xEC\xC0\x23\x24\x12\xB1\x25" - "\x8C\x15\x6B\x43\x9F\x84\x4B\x69\x87\xED\xB3\x32\xD9\xAC\x66\x3A" - "\xDF\xE5\x76\xA9\x9F\xC3\x33\x8F\xA4\xE9\x72\x9F\xEF\xA0\x3A\x4D" - "\x32\x7E\xA4\x17\x26\xED\xA2\x1D\xF8\xFC\x6A\x42\xEA\x16\x14\xD2" - "\x7D\x60\xA7\x0C\x6B\xE9\x0A\x0F\x4F\x9E\x12\xE9\x98\x83\x76\x92" - "\xFD\x68\x02\xD5\x4B\xF1\xC8\xCC\x39\x8F\x3F\x70\x42\xF7\xD8\xC7" - "\x2A\xC9\x5A\xAE\x19\xFF\x64\x1B\x6D\xFE\xF1\x3C\x71\xC7\xC4\xE2" - "\x05\x69\x19\x92\x02\x02\x0D\xBF\x57\x24\x9B\xD5\x01\xEE\x76\xB3" - "\x04\x96\x26\x97\x6A\xB0\x3E\xDF\x24\xD5\xD1\x9C\x15\xD3\x54\xFF" - "\x92\x55\x59\x8B\x4B\xF2\xEB\x03\x27\x7A\xF5\xFE\x9C\x1F\x45\xBC" - "\x88\x10\x49\x29\x20\x29\x21\x3F\x18\x93\xEE\x83\xA1\x74\xC8\x6A" - "\xC1\xE5\x9D\xC7\xDA\x2C\x8F\x87\x84\x65\xC1\xBF\xBB\x36\xC5\x43" - "\x79\xFD\xA5\xDC\xD1\x77\x12\xE0\xD9\xDC\x60\x31\x0E\xC4\x68\xAC" - "\xC4\x92\x41\x08\x61\x04\x69\x11\x73\x31\x1B\xB2\x9C\xF7\x59\x1C" - "\x0D\xC8\xA5\x34\xAA\x09\x5E\xDD\xC4\x61\xCB\x7C\x9F\x15\xEA\xA3" - "\x99\x1B\xB5\xA6\x04\xF8\xF6\xB4\x61\x9C\x40\xED\x0F\x18\x7B\x2C" - "\xA9\xAC\x59\xB4\xB0\xB5\x16\x28\x25\x88\x43\x81\xF2\xC1\xEB\x08" - "\x4A\x27\xC2\xEC\x54\xC3\x9B\xD7\x8A\xCE\x07\x1B\x7F\x54\x8A\x00" - "\x12\x00\xA0\x14\x04\xC1\x1D\xB7\xBB\xAD\x22\x4E\x2D\x65\xA5\x82" - "\x00\xDB\xF7\x31\xAD\x9E\xF1\x1C\x37\x3E\xAF\x36\xF5\xFE\xD6\x71" - "\x70\xED\xEA\x51\xFD\x8B\x4D\xA7\x75\x0F\x50\x00\x02\x00\x00\x00" - "\xB0\x81\xEC\x98\x4C\x14\x66\xD2\xE9\x89\x0B\xA9\x64\x2E\x30\x71" - "\x5C\x57\xCA\xA9\x06\x61\xED\x28\x0C\x6A\x80\x0B\x28\x00\x80\xFF" - "\x01\xD5\xC5\xB8\x35\x61\xCD\xB2\x5B\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 885); - getPNGImage(png); - } - else if (url == "safari.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x2E\x49\x44\x41\x54\x38\x11\x75\xC1\x4B\x4C\x1C" - "\x75\x00\x07\xE0\xDF\xBC\x67\xFE\xF3\xDA\x61\xE9\xB6\xC0\x2E\x2C" - "\x94\xA6\x65\x23\xC5\x08\x41\xD3\x18\xAD\x35\x31\x69\x6F\x26\x90" - "\xE8\x49\xAE\xE8\xD5\x0B\x37\xCA\xCD\x8B\x37\x3D\x35\x69\xDA\x98" - "\x18\x83\x89\x26\x35\x8A\x89\x31\x5A\x63\x02\xB5\x07\xB7\x40\x28" - "\xB0\xB0\x0F\xB6\xFB\x90\xD9\x07\x3B\xCC\xEC\xEE\xCC\xEC\x8E\x7B" - "\xE0\x40\x7C\x7C\x1F\x85\xFF\xB0\xB4\xB4\x34\x23\x8A\xE2\x94\xEF" - "\xFB\x1B\x2B\x2B\x2B\xDB\x14\x45\x05\xF8\x1F\x14\xFE\x21\xB5\xBF" - "\xAF\x1E\xE5\xF3\x1F\x48\x92\xF4\x11\x91\xA4\x12\x21\xA4\x1C\x00" - "\x39\xDB\xB6\x1F\xA7\x52\xA9\xC7\x73\x73\x73\x0D\x9C\x43\xE1\x9C" - "\x64\x32\x39\x2B\x8A\xC2\x72\x26\x9D\xBE\x99\x3D\xCA\x4B\xB6\xD3" - "\x42\x10\x00\x22\xCF\x42\x53\xE5\x56\x37\x08\x7E\x3D\x3C\x38\x5C" - "\x5E\xBE\x7B\x77\x1D\x67\x18\x9C\x59\x5D\x5D\x7D\x93\xE7\xB9\x07" - "\x4F\x9E\x3C\x7D\x75\xEF\xA8\xCE\xB1\x72\x1C\x46\x78\x1C\x10\x86" - "\xD0\xEC\x88\x28\x16\x4B\x6C\xCD\x7C\x31\x6E\x1E\x1F\xDF\x1A\xBF" - "\x7C\x79\x73\x6B\x6B\x2B\x83\x1E\x06\x3D\x0B\x0B\x0B\xD1\xD1\x78" - "\xFC\x5E\x2E\xFF\x62\xB2\xD0\x54\x40\x5F\xB8\x0E\x85\x84\xA1\x13" - "\x02\xC7\xE7\x01\x36\x04\x86\xD1\xE0\x75\x02\x04\xFE\x89\x61\x59" - "\x8D\x97\x66\xA6\xA7\xD7\xFE\x4C\x26\x4F\x68\xF4\xF0\x3C\xFF\x5E" - "\xB9\x5C\x9A\x35\x3D\x05\x26\x1F\xC3\x5F\xCD\x0E\x52\x0D\x07\x0D" - "\x06\xC8\x35\x5B\x28\x17\x0E\xD0\xDA\xFB\x1D\x05\xAF\x0F\x6A\x6C" - "\x0A\x7D\x46\x68\x5A\x51\xD5\xF7\xD1\x43\x87\xFB\xFA\xB4\x4E\xC7" - "\xBF\x43\xB1\x02\x32\x6D\x03\x45\x1B\xA8\x77\x00\x4F\xE0\xE0\x0B" - "\x02\x94\xC6\x21\xA2\x7F\xDC\xC7\x73\x57\x41\xC5\x67\xD1\xA0\xC2" - "\x18\x88\xC5\x21\xCB\xE4\xCE\xE2\xE2\xA2\x4E\x0F\x0F\x0F\x5F\x92" - "\x09\x19\x65\x24\x03\x99\x3A\x8D\x74\xC9\x41\xBA\xEE\xC3\xF2\x19" - "\xFC\xF4\xF3\x53\x24\x7E\xFB\x0C\xFC\xF8\xCB\x88\xCC\xDC\x80\x04" - "\xC0\x69\x71\x30\x22\x31\x70\x1C\x17\x0F\x82\x60\x90\x95\x15\x85" - "\x84\x42\x21\xA1\x4B\xB3\xE0\xDA\x5D\x0C\xD0\x2C\x22\x9A\x88\xC4" - "\x25\x82\xB1\xA1\x18\xB6\xC9\x3C\x6A\x57\xDF\xC0\x81\x45\x23\xE5" - "\x11\x04\x39\x07\xD7\x07\x55\xB8\xED\xB6\x90\xCF\xE7\x09\xED\x79" - "\x9E\xA5\x6A\x9A\xAD\x4B\x0C\xF4\xB0\x06\x4F\x31\xB0\x55\xED\x80" - "\xF7\x4E\x91\x6D\x74\x51\x9F\x78\x1B\x0D\x51\x87\x2B\x89\x90\x06" - "\xFB\x61\x0C\x18\x30\x14\x0E\xA6\x69\xDA\x99\x74\xDA\xA2\x37\x36" - "\x36\x4A\x15\xB3\xB2\x23\x50\x1E\x86\x46\x14\x1C\xC9\x32\xC6\x06" - "\x78\x24\xCD\x36\x56\x8B\x1A\x44\xA2\x62\xBF\xE2\x83\x95\x45\x30" - "\x82\x80\x5B\x93\xFD\xF0\x4F\x2B\x48\x67\xB2\xCF\x77\xF7\xF6\x0A" - "\x0C\x00\x4F\xD5\x34\x89\x61\xE8\xDB\xB7\x6F\x4C\x31\x27\xBC\x82" - "\x1A\x58\x64\x69\x03\x3E\x2B\xC1\x2A\x05\x70\xC1\x81\x0E\xF1\x18" - "\x95\x80\xF9\x58\x13\xDF\x7E\xF5\x85\xF7\xEC\xD9\xE6\xA7\xA6\x69" - "\xAE\x33\xE8\xA9\x55\xAB\xB9\x53\xDB\x9E\x10\xE0\x5F\x9B\x7B\x7D" - "\x12\x6D\xA2\xC3\x62\x05\x04\x1C\x07\xC2\xF2\x08\xE9\x2C\x66\x2E" - "\x06\x98\xBF\xE8\xE0\x87\x2F\xEF\x63\x6D\xED\xC7\xEF\x8B\xC5\xE2" - "\x27\xAE\xEB\x3A\x0C\x7A\x9A\x3D\xED\x56\x6B\x33\x93\xCD\x5E\x3B" - "\x35\x0B\xF1\x77\xAE\xF4\x53\x37\x87\x55\xBC\x72\x81\xC1\xEC\x60" - "\x17\x6F\x45\x1C\x44\xCC\x1D\x7C\xFD\xF0\x5E\xF0\xE8\xD1\x77\xBF" - "\x94\xCB\xE5\x8F\x2D\xCB\xCA\xA0\x87\xC2\x39\xB2\x2C\xC7\x75\x5D" - "\xFF\x30\x16\x8D\xBE\x9B\x48\x4C\x44\x47\x46\x46\x04\x8E\xE7\x71" - "\x6C\x9A\xEE\xCE\xEE\x6E\x3E\xB5\x9F\xFA\xA6\x54\x28\x7C\x6E\xDB" - "\x76\x1A\x67\x28\xFC\x9B\x20\x49\x52\x42\xD3\xF5\xD7\x54\x4D\x1B" - "\xE3\x38\x0E\xAE\xEB\xA6\x6B\xD5\xEA\x7A\xB5\x52\xD9\x06\xD0\xC6" - "\x39\x7F\x03\x12\xDF\x5D\xB7\xD4\xC5\x56\x33\x00\x00\x00\x00\x49" - "\x45\x4E\x44\xAE\x42\x60\x82", 871); - getPNGImage(png); - } - else if (url == "ie.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x50\x49\x44\x41\x54\x38\x11\x8D\xC1\x7B\x68\x1B" - "\x75\x00\x07\xF0\xEF\xEF\xEE\x72\x49\x2E\x97\x47\xD3\x24\xC6\x3E" - "\xB2\xDA\x9A\x59\xD9\xDC\x2B\x48\xB7\x76\xCC\xC1\xA8\x3A\x10\xB6" - "\x15\x57\x14\xDC\x40\x10\x59\xE9\x98\xFF\xC9\x90\xE1\x98\x22\x88" - "\x22\x28\x43\x68\x51\x51\xD8\x10\xCA\x5A\x51\xD9\xF0\xB1\x39\xD8" - "\xAB\xDB\x1C\x76\x63\xF6\x61\xB3\xD4\x35\x49\x93\xA6\x79\xF4\xD2" - "\xBC\x93\xBB\xDF\xFD\x0C\xAC\xC2\x10\x84\x7D\x3E\x04\x8F\x88\x95" - "\x86\xAD\x48\xFE\xEE\x67\xCA\xC2\x1A\x54\x8A\x45\xA6\xD3\x5B\x7C" - "\xCF\x75\x85\xE0\x7F\xF4\x9D\xBE\xDD\xD0\xD8\xE2\xEE\x5C\x67\x59" - "\x6C\x3E\xE8\x3E\xEB\xB3\x96\xA6\x7A\xD5\x42\xCA\x66\xD2\xB2\x77" - "\x41\xB9\x02\xA8\xBE\xC8\x74\x3A\x2C\xE0\x3F\xF6\x7F\x75\x4D\x7A" - "\x3A\xD0\xDE\xDF\xE0\x34\xBF\xE9\x37\x46\xD6\x6F\x2C\xFE\x2C\xD1" - "\x6C\x90\xBF\x24\xEC\xC4\x38\xDF\x35\x3D\x95\x90\x7E\x1D\x19\xE5" - "\x7F\x64\xAF\xF7\xED\x04\x83\x8F\xC7\x43\xFA\xBF\xBE\x2E\x6F\xEE" - "\x79\xEA\x7D\x5F\xB3\xF9\x44\xB7\x69\xA2\x2D\xB0\xFC\x85\x71\xA5" - "\x54\xE1\xC6\x9B\x8E\x60\xDE\xFB\x12\x54\xC9\xEB\xD6\x78\xE9\x45" - "\xA7\x97\x16\x7B\xE9\xD8\x5D\x59\xAC\x96\x38\x3C\xA4\x73\x4B\xC7" - "\xA1\x26\x97\xE1\xF0\x36\xF6\x9B\xD1\x1F\x3D\x89\xD9\x94\x18\x39" - "\x6B\x1A\xF8\x36\xA8\xAE\x3D\x4D\xAB\x6A\xD8\x21\x73\xF0\x7A\x4C" - "\x76\xD7\x63\xD6\x13\x47\x73\xEF\x6D\x03\x66\x63\x1C\x56\xF5\x8F" - "\x05\xFD\x4E\x1B\x06\xBA\x70\xD1\xD0\x1A\xFB\x06\x93\x19\xF7\xC4" - "\x68\xBA\xB7\xEF\xAD\x0F\xD6\xBD\x76\xAC\x49\x3A\xF0\xF7\x64\x6C" - "\x7F\xAD\x54\x9D\xB6\x5A\x78\x38\x1D\xA2\x23\x6A\xDE\xF8\x6A\xF3" - "\x4F\x17\x64\x0E\xAB\x7C\x0D\xDA\x8E\xAD\x86\x9B\x4F\xB4\x2D\x9D" - "\xC2\x9F\xEC\x59\xFD\x07\xD3\xE0\x97\x27\xCF\x3D\x3E\xB5\xB7\xFB" - "\xAA\xBC\x67\xF8\x8A\x75\xEC\xB3\x0B\x93\xD9\x64\xEE\x8C\x81\x07" - "\x64\x89\x87\x68\x16\xB7\x58\x9B\xDC\x9B\x09\xEA\x82\xF3\xE7\xF9" - "\x12\x4D\x0F\xB5\x6B\xBF\xBC\x71\xBF\xE4\xC1\xCD\x27\xDF\xD1\x0B" - "\x35\xE3\x2C\x61\x2C\x07\x80\xE0\x01\x46\x38\xE2\x12\x2D\xC6\x8E" - "\x44\x46\xC3\xED\x99\x3C\x0D\xCD\x24\x0F\x0B\xA8\x6B\xF7\xC4\x37" - "\xA8\xE9\x5B\xDB\x23\x4B\x2A\x2E\xFB\x06\xC0\x89\x76\x70\xB4\x6A" - "\x63\x8C\x88\x00\x08\xFE\x45\xA0\x97\x0B\xD5\x60\xA5\xA8\x42\xAB" - "\xD4\x74\x5D\xD3\xCA\x02\xD5\xCE\x9B\xB8\xC2\xD5\x5D\xB9\xE4\x5C" - "\xCB\x77\xB5\x43\x28\x72\xAD\xF0\xA8\x1A\x8D\xCE\xA5\x8E\x45\xEE" - "\x25\xCF\x99\x24\x51\xC0\x03\xAC\x94\x2F\xF3\x4C\x87\x50\xAE\xE8" - "\x48\x66\x35\xA8\x4A\x25\x23\x40\xCF\x78\xA0\x4C\x06\xE2\x69\xEE" - "\xAF\x2B\x5A\xA0\xAD\xB3\xA4\xBA\x74\x9B\x68\x70\x79\x6D\xCF\x87" - "\xEE\x44\xC6\xCE\xBC\x12\xC8\xA3\xEE\xE0\xE8\x84\x63\xD3\xD6\x8E" - "\xA3\x94\x13\x36\xCC\xC7\x6B\x58\x09\x65\x43\x6A\x22\x74\x5C\x40" - "\x79\xCE\xC9\x94\xC5\xE6\x16\x5A\xF8\x38\xB5\x82\x1D\x2E\x45\x1D" - "\x6C\xB0\xF1\x70\x38\x2C\x2F\xF7\xEC\x7E\xC6\xBC\x69\x7A\xE9\x7B" - "\x10\x08\xB2\x43\xDA\x27\xCA\xE6\x17\x32\x79\x5D\x28\x43\x67\x35" - "\x9D\x1C\x8F\x7E\xB2\x5B\x11\x48\x2E\x2C\xA1\x5C\x86\x5D\x54\xEE" - "\xC4\x62\xA5\x1B\x2E\x07\xB7\x5E\x96\xF8\xE7\x78\x4E\x34\xC8\x76" - "\xCB\x5E\xC9\x2E\xED\x41\x1D\x65\x84\xAC\x14\x28\xE2\xC9\x0A\xCB" - "\x2C\xE5\x47\xB2\xD1\xC4\xE7\xA8\xE3\xA0\x23\x0D\x5D\x50\x19\x2C" - "\xBE\xF8\xDB\x6B\x23\x8D\x89\x1B\x83\xD9\xE8\xC2\x48\x78\xA1\xA8" - "\xC4\x53\x35\x64\x72\x94\xA4\x73\x94\xC4\x92\x55\x16\x5E\x28\xC6" - "\x16\x23\xCA\x87\xA9\xFB\xF1\x23\xA1\x77\xB7\x2F\xA3\x8E\x50\x76" - "\x8A\x27\xE3\x43\xFB\x50\xC9\x77\x03\xEA\x1F\x84\x54\xEF\x5D\x4C" - "\xFA\xC3\x1F\xB1\x4F\xD7\xD8\x1B\x2D\x5D\x26\x93\xA1\x95\x81\xD1" - "\x72\x51\x9D\x5B\x4E\xE5\xAE\xCD\x8E\xCF\x04\x63\x43\xFD\x14\xAB" - "\x08\xEA\xF4\xE0\x01\x82\xF8\x94\x15\xB4\xC2\x03\x2C\xCF\xED\x9A" - "\xD1\xF0\x88\xFE\x01\xAA\x49\x94\xA9\xE6\x22\x1B\x06\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 905); - getPNGImage(png); - } - else if (url == "vlc.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x20\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\x4F\x48\x53\x71\x00\xC7\x3F\xBF\xF7\xDE\xDE\xDE\xB6\xE7" - "\xDE\x66\x30\x65\xFE\xEB\xCF\x92\x4A\x4A\xEC\x3F\x2E\x0B\xA2\xEC" - "\x10\x8C\x52\x30\xA3\x4B\x97\xEA\x10\x81\x78\x52\x28\x08\x3A\xD5" - "\xA9\x82\xB2\x82\x4E\x46\xC7\x0C\x22\x21\xE8\xCF\x41\xA8\x40\xC2" - "\x29\xE4\x44\x49\x62\xA6\x92\x6B\xBA\x5A\xC6\xB6\xB7\xED\x75\xC9" - "\x2E\x6B\xB6\xFA\x5E\xBF\x5F\xBE\x7C\xBE\x87\x2F\xAC\xA2\xF0\x39" - "\xED\x62\xF8\x8C\x72\x99\xFF\xD1\x83\x0E\x6F\xF5\x7C\x17\x56\xAC" - "\x1B\xAB\xFF\x58\xD9\xBA\x62\x39\xA9\x98\x91\xAF\x0D\x1E\x92\xAA" - "\xB6\x62\xF9\x1B\xB0\xD6\xEF\x6F\x2D\x96\x53\x8A\x19\xD6\x9E\xB3" - "\xA1\x58\x53\x23\x19\x33\x4B\x7A\x64\x2C\x04\x4F\xEF\x96\x4C\x70" - "\xF5\x46\x9F\xEE\xF6\x94\x1F\xB0\x84\x82\x90\x6C\xB8\x74\x77\xF0" - "\xDA\xCD\x3E\x4F\xC9\x04\x6B\xC2\xF7\x9A\xAB\x8C\xD6\x72\xBB\xDA" - "\x84\x2A\x43\xF5\xEC\xB0\x91\x1C\x7E\xD1\x02\x3C\x29\xA9\xC0\x58" - "\x8C\x84\xFC\xC3\x23\xB8\xC3\xA0\x1A\x60\xC4\x60\x76\xC1\x1E\xFA" - "\x53\x41\xC1\x84\xDB\x27\xEB\x65\xB7\x95\x3A\x22\x2B\x60\x01\x79" - "\x40\x75\x42\x59\x3E\x7D\xF8\xCE\xA9\x4D\xB6\xBF\x16\x24\x76\x75" - "\x35\xE4\xB6\xB7\x05\xB2\xC6\x5A\x72\x36\x9D\xAC\xAC\x93\x31\x6A" - "\x31\x1B\x8F\xD6\x2D\xED\xBC\xB0\x6D\xD5\x09\x1F\xEE\xB7\x7B\x07" - "\x13\x5F\xDA\x53\xCD\xDD\x7C\x2A\x77\xA2\xE6\x52\x08\x49\x90\x34" - "\x05\xC9\xCF\x09\xE4\xC8\x9B\xB6\x81\xF3\x5B\xA6\x8F\xDF\x1A\x5F" - "\x2A\x20\x88\x3E\x3C\xBD\x4F\x7B\x3D\x10\x35\x16\xA7\x2F\xD9\x1C" - "\x2E\x72\x42\x25\x6D\xF7\x92\x51\xBD\xE4\x25\x0D\x45\x73\xA0\x2E" - "\x7C\xEC\xF5\x4D\x8C\x47\x9F\xF7\xEC\x3D\x58\x40\xA0\xC5\x47\x3B" - "\x62\xCB\x79\xDD\x33\xFA\x08\x9F\x4F\x42\xDA\x10\xC4\x72\xFA\x90" - "\x64\x81\x2B\x39\x4F\xCD\xC4\x10\xE2\xFD\x63\xF1\x23\x8B\xEE\xCB" - "\xC4\x3A\x81\x97\x00\x02\x60\xEE\xD5\x15\xD9\xF5\xEE\xFA\x44\x7C" - "\x2A\x1E\x98\x99\x81\x4A\x0F\x38\x35\x50\x14\x81\xCD\x29\x90\x45" - "\x9E\x6F\x71\x98\x9C\x83\xAA\x6A\xA8\xDC\x6C\x44\xCD\x96\xDE\x40" - "\x45\x73\x8F\xA9\x00\x38\x48\x34\xDA\x95\x78\xC0\x5F\x0F\x5E\x0F" - "\xA4\x92\x20\xB2\x20\x59\x16\x92\x69\x21\x34\x28\xAB\x84\xDD\x35" - "\xE0\xA8\x00\xA1\x7D\xAD\x35\xB5\xE5\x1D\xC0\x5B\x05\x40\xCF\x0C" - "\x75\x2A\x1B\xFD\x00\xD8\xEB\x80\xEF\x2B\x87\xF8\xC5\xB8\x32\xD4" - "\x05\xE8\x80\x0C\x4A\x6A\xF0\xC4\xEF\x82\x67\xFD\x63\x93\xDE\x6C" - "\xEA\x9F\xDE\x9A\x76\x2F\x46\x00\x7E\x02\x6B\x20\xAD\x2C\x4A\xE3" - "\xCD\x0E\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 622); - getPNGImage(png); - } - else if (url == "fb2k.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x4C\x49\x44\x41\x54\x28\xCF" - "\x6D\x91\x3D\x28\xC4\x71\x1C\xC6\x9F\xDF\xEF\xDC\xFD\x4F\xE9\xF2" - "\x9A\xAB\x43\x28\x49\xC9\x62\xF0\x32\xB8\x52\x5E\xCA\x6D\xC2\x60" - "\x10\x16\x59\x44\xD8\x2E\x65\xB1\x5B\xA4\x2C\x22\xDB\x95\x41\x57" - "\x36\x2F\x25\x79\x49\x62\x21\x13\x65\x40\x4E\x49\x9D\xB7\xFB\x18" - "\x9C\xEB\x0E\x9F\xF1\xFB\xF4\x3C\xDF\x7A\x1E\x29\x89\xF1\xE7\x76" - "\xC9\x25\x49\x72\xF9\xDA\x6D\xA9\x32\x31\x39\x9D\x8B\x87\x77\xEE" - "\x26\x79\xE5\x64\xD5\xEF\xDC\x76\xAF\x18\x5F\xBA\xEE\xF1\x04\x6F" - "\x5E\x60\x66\xDF\xD6\xD9\xDA\xC9\x6D\xB8\x8B\x7B\x3B\xE4\xA4\xEC" - "\xA6\x28\xB4\x0A\x00\xC7\xB1\xA3\xC7\x04\x00\x7D\x11\xE3\x97\x49" - "\xFA\x5D\x0D\x27\x31\x7E\x71\xF9\x9C\xD5\x92\xCC\x30\x79\x15\x61" - "\xFE\xA1\x66\xCE\x14\x7C\x3F\x08\xF4\xAD\x87\x68\xE6\x3C\x25\x5D" - "\x10\xA4\x95\xE1\x4D\x5B\x26\x23\x19\x5B\x36\xB6\xDD\x86\xC8\xE7" - "\x0A\x80\x6B\x8A\x11\xCD\x84\x0F\x6C\xA5\xAC\x64\x8C\xBF\x27\xB2" - "\x86\x10\x21\x00\x7A\x11\x62\x89\xC1\xA8\x09\xC8\x48\x32\x39\x45" - "\x23\x1F\x89\x11\x84\x8B\x77\x12\x64\x23\x06\xF8\x24\x30\xF1\xD3" - "\x85\x35\x25\x53\x5B\xB0\x47\x14\x80\x4D\x76\x81\xD9\x7D\x5B\x9E" - "\x6C\x56\x92\xDB\xDD\x78\x70\x0F\xB0\xC0\x3C\x00\x67\x31\xA7\x45" - "\x9E\xF4\x2E\x9D\xC2\xFE\x87\xF8\x06\x8B\x2C\x13\xE1\xE9\xAD\x78" - "\x48\xDE\x5F\x6B\xC8\xA9\x1C\x3B\x79\x07\x38\xFD\xA8\x9E\xFE\x2B" - "\x4B\x92\xBB\x7C\xF4\x21\x1E\x7B\xAD\x1A\xCF\x0C\x4F\xC7\xFA\x3A" - "\x72\x43\xB2\xE9\xA7\x2F\x4C\x12\xCB\xB6\x7D\xA8\x6B\x13\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 410); - getPNGImage(png); - } - else if (url == "wmp.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x55\x49\x44\x41\x54\x38\xCB" - "\xD5\x93\x4B\x48\x94\x51\x14\xC7\xFF\xF7\x7E\xF7\x7B\xCC\xCB\xC7" - "\x8C\xAF\xD1\x31\xED\x81\xD1\xA6\x20\x22\x06\xAD\x45\x12\x6D\x82" - "\xA2\x08\x24\x42\xDA\xB5\x6F\x51\x50\xFB\x68\x23\x84\xBB\x96\x41" - "\x9B\xB6\x25\x84\xDA\x26\x8A\x94\x28\xA5\xA8\xA6\x30\x35\x23\xD4" - "\xC6\x79\xE9\x38\xE3\x7C\x8F\x7B\xEF\x69\x61\x46\xE3\xBA\x4D\x67" - "\x73\x76\x3F\x7E\xE7\x7F\xCE\x01\xFE\xFB\x62\x00\x70\xFD\xF1\x7C" - "\x6F\x22\xE6\x1C\x06\x10\xE3\x0C\x61\x00\xA6\x25\xB8\x30\x18\xB3" - "\x0C\x0E\xD3\x36\x85\xE0\x06\x17\x9B\x1B\x1B\x99\x8A\x62\x8B\xC2" - "\x09\x7D\xB8\x7D\xA2\xC3\x05\x00\x01\x00\xC9\x78\xE4\xF2\xD1\x7D" - "\xED\xA9\xB2\x1B\x9C\xB1\x75\xCD\x4A\xAC\xBF\x8F\xDB\xBA\xC6\xCA" - "\xD1\x3E\x7F\x2B\xDA\xED\x81\x73\xF2\x03\x65\x69\xA5\x0A\x51\x2D" - "\xB3\x39\x1F\x77\x00\x4C\xFC\x01\x70\x06\x80\x48\x8B\xD5\x99\xC6" - "\xFE\xC5\x91\x44\x48\x6F\x71\x88\x30\x60\x37\x44\x7E\xB4\x9C\xF6" - "\xBE\xF5\x5C\x2C\x49\xCD\x51\xF1\x14\x79\x41\x40\x9F\x4A\xA4\x77" - "\x46\x10\x00\x50\xA8\x2A\x35\x97\x2D\xAD\x5F\x98\xB9\x11\x0F\x1F" - "\x1F\xE6\x3C\xD4\x04\xF9\x72\x14\xE4\xCE\x21\x55\xCC\xDA\x55\xB3" - "\x3D\x5A\xE9\x18\xA8\x19\x8C\x18\xDF\x95\x01\x07\x00\x5F\x6A\x74" - "\x2F\x4F\x1C\x6B\x74\x0B\x06\x8B\x26\x21\x8E\x0C\xC1\xBA\xF2\x08" - "\xBC\x2B\x0D\xBD\xB6\x84\xD4\xE7\x87\x61\x59\xAD\x30\x02\x49\xCE" - "\xB6\x73\xAB\x03\x30\x06\x24\xCA\xF3\x9D\x14\x10\xA0\xB7\xED\x78" - "\xF3\x1E\x58\x43\xF7\x61\x0E\xDE\x84\xB3\xFA\x91\xBB\x9B\x65\x26" - "\x95\x96\xBE\xD2\xFE\xDF\x00\xF1\xBB\x13\x31\x2B\xD8\x06\x80\x76" - "\xB6\x03\xE9\x41\xE5\x97\xA1\x03\xA0\x2A\x49\x06\x80\xD2\x80\x4C" - "\x36\xDA\xBC\xCE\x80\x08\xC8\xB7\xA7\x17\xC8\x27\x90\xD2\x20\x22" - "\xC8\xAF\xD3\xD8\x1A\xBD\x84\xE0\xF9\x03\x94\x22\x07\x24\x8F\x34" - "\xF8\x96\x30\xE0\x08\x03\x51\xDB\x60\x75\x06\x04\x60\x35\xD9\x3F" - "\x9B\x6D\x4D\x9F\x4B\xCE\x3E\x75\xD4\x97\x69\x04\x6F\xC7\x00\x29" - "\x01\x26\xF0\xEE\xD0\xD5\x22\x0F\x37\x48\xF2\xD6\xA1\x88\x21\xBB" - "\xE1\xE9\x7A\x03\x30\xE6\x93\x21\x27\x07\x46\x16\x7F\x52\x53\x21" - "\x78\x3D\x06\x72\x03\xF8\x91\x94\x9E\x1A\xBC\x9B\x5B\xD9\x7B\x2A" - "\xE7\x4A\x42\xC5\x0D\x58\xAE\xB4\x69\x8C\xDF\xBB\xE5\x00\x08\x01" - "\x60\x02\x00\xB2\x0B\x99\x29\x77\x65\x2E\xCD\x80\xA9\xEF\x2D\xC3" - "\xA9\xCE\xF3\xD7\xE2\xB6\x72\xA9\x64\x36\x0B\x32\x9D\x30\xAB\x78" - "\x96\x94\x81\x59\xCC\x17\xEC\x62\x6E\x2D\x56\x5A\xCA\x30\x00\x26" - "\x80\x1A\xDB\x7D\xDB\xA9\x64\x17\x3F\x78\xF2\x6C\xBC\xB5\xB7\xAF" - "\x27\x96\x68\x6B\x73\xA2\x0D\x2D\xCC\x74\x3A\x88\xF1\xFD\x6F\x9E" - "\x3D\x79\x91\x79\x35\x3E\x59\x5E\x9E\xCF\xFF\xB3\x67\xFA\x05\xB0" - "\xB4\x12\x06\x04\xED\x6B\x1E\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 675); - getPNGImage(png); - } - else if (url == "icecast.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\xC7\x49\x44\x41\x54\x38\xCB" - "\x95\x92\x6B\x48\x93\x61\x14\xC7\x5F\x4B\x53\xBA\x78\x63\x66\x89" - "\x48\x89\x15\x95\xB7\xC4\xB4\x54\x4C\xA4\xCC\x10\xDC\xE5\xD5\xCD" - "\xCD\x4B\xD2\x74\x73\x7B\xA7\x73\xCB\xCB\x34\x35\xDC\xE6\x6D\xF3" - "\x92\xBE\x86\x69\x5E\xD2\xA6\xA9\x65\x98\x64\xA0\x29\xD2\x97\x0C" - "\xF1\x43\xA0\xF5\x41\x41\xBA\x48\x44\xA9\x88\xFA\xC5\x20\xFE\xBD" - "\x5A\x94\x5D\x2C\xFB\xC1\x03\x0F\x87\x73\xFE\xE7\xFF\x3C\xE7\x10" - "\xC4\x37\xEC\xEC\x1D\x59\xD6\x36\xF6\xE6\xC4\x06\x12\x94\xBD\xB6" - "\x11\x31\xA5\x07\x36\xC6\x76\xED\xB6\x71\x26\x36\xC3\xD6\xCE\xC1" - "\x92\xC5\x72\xDA\xB9\x76\x17\x52\x77\xEC\xE5\xC5\xD3\x63\x6C\x71" - "\xCB\x4B\x6F\x7F\xAE\x0B\x6B\xAF\xD3\x0E\xE6\x58\x12\xFF\xC2\x9E" - "\xB5\xDF\x2B\x30\x4C\xE1\x46\x95\xCE\x4C\xA8\x6A\x57\x20\x50\x0D" - "\x22\x22\x8E\x9E\x3E\xE4\xEA\x11\x4F\x6C\x05\x21\xD5\xE9\x1C\x97" - "\xD6\xF3\x5C\xAE\x7F\x01\x35\xBD\x82\xE8\xD4\x5E\x84\x73\x34\x88" - "\x4C\x6C\x78\xE5\x1B\x28\xF4\xF8\x6B\xF1\xC5\x8C\x01\x57\x85\xE1" - "\xCD\x8C\x9A\xE9\x9C\xAC\x19\x42\x6E\xC5\x38\xA2\x04\x99\x88\x52" - "\xF4\x22\x2A\xB5\x0F\x91\x97\x9A\xDF\x05\x9F\x4F\xF5\xF9\x63\xB1" - "\x88\xEA\x3C\x4C\x95\xBD\x7E\xAB\xAA\x59\x84\xC6\x30\x8A\xB2\x0A" - "\x13\x8A\x75\x85\x28\xD1\xEA\xD0\x7D\x6F\x18\x42\x49\x0D\x48\x46" - "\x84\x9D\xD4\xFA\xE1\x64\x50\xAC\xDF\x2F\x9D\x07\xBD\x52\x8D\xB3" - "\xEF\xD5\xF4\x32\xA4\x97\xDB\x61\x2C\xD2\xE2\x6E\x67\x07\x5A\xAF" - "\x57\x43\x2D\x15\xA3\xDD\x74\x1B\x55\xE5\xD5\x50\x66\xD1\x8C\x9B" - "\x07\x8C\x48\xDB\x62\xD0\x39\x2A\x74\xBD\x38\x4E\xD5\xEF\xAB\x30" - "\xCE\x7E\x5C\xB3\x4D\x15\x8E\x21\x2F\x27\x07\x49\x7C\x36\x2A\x4B" - "\xAA\xD0\xD6\xDC\x08\x89\x58\x8A\xDA\xEA\x6B\x68\x6F\xAA\x47\x7E" - "\x86\x06\x22\x49\x2D\x48\x45\x1F\xB8\x92\x8E\xE5\x80\xB3\xB2\x30" - "\x82\x2F\xEF\xEE\x11\x65\x3E\x81\x48\x3D\x00\x95\xBA\x10\xC3\x43" - "\x8F\x31\x36\xFA\x14\x94\xF2\x0A\x0C\xBA\x22\x94\xE8\xB5\x28\xC8" - "\xD1\xA0\xAD\xE5\x16\x5A\x1B\x6E\x40\x9F\x97\x8B\x70\x6E\x2E\x42" - "\x48\x03\x4E\x5F\xC8\x7A\x46\xB0\x13\x6A\xF7\x90\x29\x5D\x43\x9A" - "\x02\x1A\x0B\xF3\xF3\x98\x9B\x9B\x83\x20\x5A\x80\xF8\x58\x11\x74" - "\x45\x34\x04\x31\x72\xA4\x48\xE5\x50\x29\xD3\xC1\xE1\x70\xB0\xBC" - "\xBC\x82\xD2\xB2\x4A\x78\x9C\x8A\x1F\x77\x3B\x7A\xC6\x71\xFD\x19" - "\x64\x22\x6D\x55\x90\x9D\xBD\x60\xA2\x8D\x28\xD7\x5E\x45\x86\x2A" - "\x1D\x89\x62\x35\x63\xD3\x04\x9F\x10\x39\xBC\x03\xE2\x50\xA4\x2B" - "\x85\x97\xA7\xDF\xA7\x7A\x83\xEE\x73\x53\x4D\x15\xB8\x5C\x7E\xE8" - "\xF7\x4F\x64\xB6\xCF\x6A\x64\x64\x64\x61\x75\x75\x15\x75\x75\x75" - "\x98\x9C\x9C\x84\x48\xAC\x07\x4F\xD6\xFD\x55\x20\x58\x8E\xE3\x3E" - "\x1C\x3C\xEC\x7F\x34\x31\x35\x35\x35\xB4\xB4\xB4\x04\x83\xB1\x3C" - "\xED\xB7\x51\x5A\x5B\xDB\x99\x85\xF3\xF2\x6F\xF2\xA5\x8D\x88\xA2" - "\xEE\xFF\x24\xE0\x1D\x2C\xC3\x31\xF7\xD0\x1E\x07\x6B\x5B\x4B\x26" - "\xCF\x62\xD3\x65\xE2\x0A\xF5\xE6\xA4\xA4\xAD\x9E\x64\xC6\xF5\x43" - "\x40\x06\x4F\xFF\x18\xD3\x3E\x67\x77\x0B\x62\xAB\x90\xC9\xAD\x95" - "\xBC\x94\xAE\x75\x81\x23\x3E\x3C\xDA\xCD\xE5\xE0\x76\xE2\x7F\x60" - "\x9C\x98\x45\xF0\x8B\xCB\x4E\xF8\x91\x2D\x4C\xE7\x6D\x9B\xE5\x7D" - "\x01\xA7\x4F\x5F\xE6\xC8\x50\xBB\x4A\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 789); - getPNGImage(png); - } - else if (url == "html5.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x9F\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\xCF\x4B\x02\x41\x14\xC7\xF7\x8F\xF0\xE8\x39\xED\x26\x1D" - "\x82\x08\xAA\x83\xD0\x29\x22\x82\x2C\x28\xD1\x48\xA8\x4B\x25\x88" - "\xD4\x29\x41\x88\xF5\x10\x74\x10\xBA\xF4\xC3\x2E\x21\x44\x10\x1D" - "\xCB\x4E\x92\xE0\xC9\xE8\x90\x1E\x3A\xA5\xEE\xB8\xAE\xAB\x64\x98" - "\x85\xD9\x6B\xE7\x35\xBB\x8C\xAB\x16\xF4\xE0\x0B\xBB\xCC\x77\x3F" - "\x33\xF3\x7D\x6F\x85\xC2\xD4\x80\x45\x13\xFC\x53\x16\x81\xD6\x6F" - "\xA6\xDA\xB2\xBD\x4B\xEA\x92\x1D\xD7\x04\xBD\xB4\x97\x3C\x7E\xE0" - "\x1A\x82\xA2\x77\x8C\xD3\x38\xBC\x6E\x39\x3B\x54\x5F\x1F\x06\xD5" - "\x8D\x80\x3C\x0F\xC8\x50\x00\x89\xEE\x80\xA2\x28\x86\x54\x55\x05" - "\x73\x35\xE3\xBB\x50\x59\x44\x40\x86\x07\x24\x28\x40\x12\x37\xF1" - "\xC3\xF2\x53\x0E\xE4\xE4\x35\x28\x77\x37\xD0\xCA\xA5\x3B\xD4\xD8" - "\xF7\x81\xB2\x60\xA3\x80\x04\x0F\x88\x21\x20\xE0\x42\x40\xE9\xF2" - "\xD4\xC8\xE0\xC5\x37\xD8\xA5\xF2\x3C\x02\x62\x3C\x40\xA4\xE6\xE2" - "\xEA\xE4\xCF\x09\xB2\x0F\x40\x0E\x45\x28\x1D\x45\xE0\xFD\x2A\xDA" - "\x21\x9A\x81\x3C\x87\x00\x91\x07\x04\x70\x47\xF7\xE8\x9F\x19\xD4" - "\xFD\x23\x40\x66\x11\x10\xE0\x01\x1E\xFD\xC8\x34\x07\x5D\x24\xE2" - "\x87\xB7\x93\x6D\xD4\x57\xB3\x81\x00\x7A\x05\x69\x06\xBD\x1E\x1E" - "\xE0\xD4\x01\x72\xEA\x16\xAF\x60\xCE\x80\x56\xBB\x4A\xF0\xB9\x38" - "\x8D\x6B\x4E\x1E\xE0\x30\x00\xF7\x69\x3C\xBE\xB4\x17\xC4\x2B\xD5" - "\x83\x13\xD0\x3C\x0B\x23\xE0\xF3\x39\x8B\x00\xE6\x75\xF0\x00\xAB" - "\x01\xA0\xED\xEB\x93\x41\xEB\x31\x85\x93\xC8\xBC\x56\x81\x2F\x63" - "\x7C\xB5\x69\x94\xC2\x6B\x50\xBA\x38\x86\x8A\x36\x0F\x6D\xA5\x00" - "\x1F\xC9\x73\x68\x1C\x6C\x60\x07\xAA\x5E\xD3\x18\x73\x00\xD2\xEB" - "\x5F\xE0\xFB\x4F\x77\x67\x33\x40\x7A\x01\x42\x9A\xB2\x66\x00\x9D" - "\x7B\xD9\x65\xD3\x93\x07\xE6\x09\x09\xFD\x8A\xE5\xB1\xA2\x29\xAE" - "\xA9\xC6\x14\x67\xAD\xB6\x9A\xFD\xDF\x6D\xBF\x3E\xC4\xFD\x38\xE7" - "\x3F\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 493); - getPNGImage(png); - } - else if (url == "flash.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x15\x49\x44\x41\x54\x38\xCB" - "\x95\x93\x41\x8A\xC2\x30\x14\x40\x7F\x3D\xC1\x78\x84\x7A\x04\x0F" - "\x20\x88\x5A\xAB\xAD\x8A\xB8\x1A\x10\xC6\xEE\xDD\x09\x6E\x5C\xBA" - "\x70\xA3\xCC\xC2\xBD\x17\xF0\x04\x2E\xBD\xC0\xE0\x09\xE6\x06\x95" - "\x42\xA1\x50\x28\xFD\x93\x84\x64\xF8\x69\xD3\xA2\x81\xB7\x69\xF3" - "\xDE\x4F\x03\x05\xDF\xB2\x70\xC2\x98\x02\xE0\x8C\x30\x95\xF0\x77" - "\x7C\x8F\xC7\x18\x37\x1A\x82\x91\xC4\x65\x40\x6D\xC0\xAA\x0E\xB8" - "\xA6\x80\x06\x91\x45\xC0\x30\x5D\x0B\x28\x94\x48\xE5\xFD\x7C\x8E" - "\xBF\x8F\x07\xF2\x65\x0C\xD4\xF1\x1D\x04\x48\x17\x95\x87\x3C\xC0" - "\x8F\xE6\x15\x24\x4F\x12\xB4\x5A\x98\xE7\x39\xC6\xCF\x27\x9E\x56" - "\xAB\x92\x2C\x02\xEA\x62\x3C\x82\x7A\x76\xBB\x5C\x30\xCB\x32\xDC" - "\x76\xBB\x46\xD9\xE1\x81\x11\x11\x28\x5F\xB6\x8D\x69\x9A\x6A\x50" - "\x59\x0B\x98\xB8\x1E\x8F\x98\x24\x89\x06\x15\x15\xE0\x92\xA3\x71" - "\x16\xCD\x26\x9E\xD7\x6B\x8C\xE3\x58\xB0\xE9\x74\x4A\x53\x15\x03" - "\x53\x20\x8A\xA2\x7F\x0E\xCB\x65\xA5\xA8\x80\x61\xE1\xBB\xC2\x30" - "\xC4\x9F\xFB\x1D\x77\xBE\x5F\x12\x8B\xB2\x08\x38\x86\x8B\x71\x5E" - "\x10\xFB\x12\x70\xDE\x90\x74\xD9\x12\xC0\xA0\x66\x63\xD5\x54\x2E" - "\xF6\x24\x20\x97\xCD\xF8\x7C\x03\xF6\xBF\x41\x9B\xF1\xF1\x07\x5A" - "\x4C\x80\x8C\x91\x5C\x9B\x60\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 355); - getPNGImage(png); - } - else if (url == "rtb.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xA9\x49\x44\x41\x54\x38\xCB" - "\xAD\x53\xC1\x0D\xC4\x20\x0C\xCB\x28\x1D\x25\x4B\xF4\xDF\x51\xB2" - "\xD9\x8D\x76\x95\x53\x19\xB8\xD6\x04\xA9\x3A\x24\x4B\xB4\xC2\xC6" - "\x4E\x82\x99\x5A\x11\x91\x70\xFF\x26\xF8\xBD\x5C\x11\x9E\x04\x33" - "\x8D\x4B\xCC\x35\x79\xDF\x3F\xB6\x6D\xFD\x20\xF7\x77\xE0\x3F\xCE" - "\x3E\x6E\x1E\x09\xD8\x47\xD4\x22\x3F\x4E\x94\x6D\xE6\xAF\xE2\xB4" - "\x82\x29\xDB\xC7\x51\x0B\x00\xC9\xBD\xF2\x74\xDB\x20\x81\x8C\x7D" - "\x15\x03\x48\xEE\x78\x0B\x0E\xF7\xD6\xAD\x45\x92\x3B\xB3\x49\x47" - "\x04\x85\x47\xB1\xE4\x32\xC2\x4A\x84\x35\x19\x1D\x25\x97\x45\xAC" - "\xAA\x0D\xF2\x3D\x66\x2B\xE2\xAC\x8D\xAB\x76\xB6\x36\xAA\x41\x52" - "\x31\x9E\x83\xE6\xF3\x51\x56\x22\x74\x21\x47\xF9\x2F\x8F\xE9\xE5" - "\x73\x3E\x01\x35\x60\x01\xA4\x93\x4C\xC0\x7E\x00\x00\x00\x00\x49" - "\x45\x4E\x44\xAE\x42\x60\x82", 247); - getPNGImage(png); - } - else if (url == "ps.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xE2\x49\x44\x41\x54\x28\xCF" - "\xA5\xCE\xBF\x2B\x04\x70\x00\xC6\xE1\xEF\x24\xC2\x9D\x23\x52\x26" - "\xD9\x0D\x97\xED\x22\x31\x28\x93\x01\x65\xB0\xF8\x03\xAE\x8C\xCA" - "\x20\x75\x83\x48\xE1\xE4\x72\x49\x91\xB2\xB2\x18\x64\x40\x16\x19" - "\xAE\x48\x91\xF2\xF3\xBA\x52\x2C\x06\x0A\x3D\x46\x91\x53\xF2\xCE" - "\x4F\x6F\x9F\x10\xFE\xB2\x9C\x82\x5F\x41\x9F\x61\xEB\xEE\x8B\xA3" - "\x84\x98\x3A\x8D\x92\xC5\x9E\xDA\x55\x19\xB3\xA5\x5C\xB3\x27\x3F" - "\x82\x88\x05\xE7\x6A\x55\xD8\x2D\x06\xD2\x4E\xD5\xAA\xB1\xE8\xC7" - "\x86\x88\x79\xC7\x62\xCA\xEC\x7D\x07\x2F\x2E\x25\x44\xA4\x3D\x18" - "\x90\xF2\xFE\x09\xDE\xDC\x59\x12\xD7\xA3\x5B\xA5\x19\x37\x46\x4D" - "\xCB\x98\x95\xF3\x2A\xE4\xF5\x6A\xD0\x22\xEB\x44\x87\xA8\x94\x21" - "\x5D\x56\x1D\x19\x54\x22\x29\x6C\x8B\x6A\xB2\x2C\x6B\x44\xA7\x88" - "\x09\x05\x67\x56\xB4\xAA\xD7\xEF\x42\x08\xE1\xDA\x81\x39\xE3\x76" - "\xB4\x29\x95\x32\xA9\x5A\x5C\x46\xDE\xAD\xC7\xAF\xA9\x57\xA6\xAC" - "\xD9\x70\xE8\x59\x08\x21\xEC\xDB\x14\xFE\xBD\x0F\x28\x4D\xB1\x81" - "\xCE\x50\xD3\x95\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 304); - getPNGImage(png); - } - else if (url == "mplayer.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\x9C\x00\x00\x0E" - "\xC4\x01\x75\xF6\x84\x81\x00\x00\x01\xBE\x49\x44\x41\x54\x38\xCB" - "\xB5\x93\x4D\x6B\x13\x41\x18\xC7\x97\x7C\x0A\x6F\x82\x37\xBF\x80" - "\x57\x3F\x81\x47\xD3\x83\xD4\x80\xF5\xE2\xCB\x21\xA8\xE8\x36\xC4" - "\x22\xE9\xC1\x1C\x12\x85\xE2\x41\x44\x6D\x11\xC1\x43\x63\x5A\xA5" - "\x9A\x88\x11\x8B\x07\xA1\x07\x6F\xBE\x20\xD9\x45\x21\x31\x11\xEB" - "\xEE\xEC\xEC\xEE\x64\x13\x4C\xF7\xE7\xCE\x56\xEA\x45\xD1\x06\xFD" - "\xC3\x33\xC3\xC0\xCC\xFF\x79\x66\xE6\xF7\x18\xC6\xFF\xD4\xCB\x0D" - "\x9F\xA5\xBB\x82\xB9\x79\x87\xE9\xE3\x9B\x1C\x38\xF8\x99\x3D\xFB" - "\xFA\xEC\xDD\xDF\xE3\x71\xD3\x67\x67\xA3\xA5\x14\x4A\x0D\x79\xFD" - "\x36\x62\xE5\x61\x40\x75\xC1\xE7\xDC\xAC\xC7\x19\x53\xFE\x36\xA6" - "\x8E\x6E\x6E\x1B\x5C\xF0\x24\xEF\xC7\x5B\xEC\x56\xC3\xD1\x38\x49" - "\x3A\xC0\x38\x24\x3C\x86\x4C\x26\x31\x48\x0C\x66\x3C\x9F\x49\xF5" - "\x2A\x0C\x31\x2E\x25\x57\xD0\x3A\x3B\xEB\x73\xF5\x5A\xC8\x8D\xDB" - "\x8A\xC3\xD3\x82\xC5\x3B\x16\xF5\x7A\x9D\x76\xBB\x4D\xA7\xD3\xA1" - "\xD7\xEB\x21\xA5\xA4\xDB\xED\x62\x59\x16\x51\x14\xB1\x1A\x2A\x8C" - "\x5B\x72\xBB\x82\x13\x79\xC9\x91\x63\x82\x99\x93\x5E\x3A\x2F\x2E" - "\x3D\x21\x9F\xCF\xA7\x51\xA9\x54\x28\x14\x0A\x14\x8B\x45\x6A\xB5" - "\x1A\xA6\x69\xE2\x38\x0E\x57\x82\xF0\x1F\x18\xAC\x27\x83\x56\xA8" - "\x62\x46\xA3\x18\xE1\xC5\xA8\x41\xCC\x20\x79\x20\xD7\x75\xE9\xF7" - "\xFB\xB4\x5A\x2D\x1A\x8D\x46\xBA\x56\xC9\x97\xEB\xF2\xB5\x4E\x27" - "\xC9\x0D\xFB\x87\xC1\xDF\xE8\xAB\xB3\xC5\xEA\x5A\xC4\x9B\x77\xDF" - "\xD2\xF5\x94\x9F\x54\xA0\x33\xC5\x71\xFC\xC7\xC3\x1F\x3E\x8E\xB9" - "\x38\xEF\x72\xBF\xBE\xC1\xF2\x4A\xC4\xBD\xE5\x88\x53\x09\x02\x29" - "\x4C\xD5\x05\xC1\x83\xB5\x90\x47\xCD\x20\x8D\xE6\xD3\x80\x67\xCF" - "\xE5\x4E\xAC\xBF\x90\x98\x73\x2E\xAE\x08\xC9\x64\x32\xE4\x72\x39" - "\xCE\x97\xBE\xFC\x44\x59\x73\xAD\xF9\xD6\x9C\x6B\xDE\x35\xF7\x9A" - "\x7F\xDD\x07\xBA\x1F\xBA\x9F\x02\xAE\xDF\x74\xB0\x6C\x9F\x6C\x36" - "\x8B\x6D\xDB\x94\x2E\x0B\x76\xDD\x5C\xA5\xB2\xA0\x5C\xF5\x29\x95" - "\x3D\x26\xEA\xCE\x5F\x19\x7C\x07\xD7\xA8\xAB\xC5\x53\x48\xD2\x2A" - "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 524); - getPNGImage(png); - } - else if (url == "apple.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAD\x49\x44\x41\x54\x28\xCF" - "\x63\x60\xC0\x02\x1E\xFD\x67\xC0\x0D\x2E\xFD\x8F\xFA\x5F\x86\x4F" - "\x41\xD4\xFF\xA0\xFF\xAB\xFE\xE3\xD1\xEF\x85\x5D\xFA\xD5\xFF\x26" - "\xA0\xCE\xB0\xFF\x9B\xFE\x9F\x03\x2A\x48\xFB\x9F\xF5\x7F\x1F\xAA" - "\xB2\xAC\xFF\x6E\x40\xBB\x93\xC0\x30\x0B\x0A\x91\xA4\xCF\x81\xA5" - "\xB3\xFE\x17\x01\x61\x1E\x18\x16\xFD\xBF\x86\xAC\x60\x11\xD0\xE6" - "\x24\xA8\x14\x04\x4E\x42\xB5\x60\xDA\x7F\x3F\xB0\xBD\x08\xD8\x86" - "\xAA\xE0\x10\x50\x41\x12\x8A\x82\xB4\xFF\xA7\xFE\xA3\x84\x9C\xDB" - "\xFF\x38\xA0\x20\x32\x8C\xFB\xBF\x0B\x59\x49\x1B\x50\x20\x09\x0D" - "\xDE\x42\x56\x70\x0D\x18\x0A\x51\x40\x45\x08\xB8\x0C\x3D\xB8\xB6" - "\x01\x15\x44\xFD\xAF\x02\x06\x18\xC8\xF8\xAA\xFF\x58\xE3\xF0\xDC" - "\x7F\x58\xB8\x30\x10\x0F\x00\x5E\x29\xAA\xB1\xD7\x27\xEE\x1B\x00" - "\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 251); - getPNGImage(png); - } - else if (url == "synology.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAA\x49\x44\x41\x54\x28\xCF" - "\xB5\xD0\xCD\x4A\x02\x01\x18\x85\xE1\xEF\xFE\xAF\xC0\xBD\x84\x18" - "\x18\x22\xA1\x09\x35\x43\x19\x3A\x88\x3F\x19\x14\x49\x24\x41\xC5" - "\x40\xA6\x1B\x41\x21\x62\x9E\x16\x6D\x6A\xD1\xB4\xC9\xB3\x7E\x36" - "\xE7\x8D\xF8\x7B\x4A\xF7\x2F\xA0\x90\xDB\x94\x81\xB1\xB6\xBA\x87" - "\xDF\x41\x6A\xE7\xC9\xC8\x1C\x2B\xD7\x16\x66\xEE\x14\xE6\xFA\x76" - "\x22\xE2\x4A\xCD\xB9\xB5\x23\x5B\x03\xC7\x1A\x6E\x34\x25\x4E\x4C" - "\xF4\x45\xC4\xBB\xA5\x44\x22\x33\x96\xBA\x75\x86\x54\xC5\x0B\x86" - "\x22\xE2\xC2\xDA\x54\xD7\xAB\xAA\xCC\xB3\x0E\x4E\x1D\xC8\x2C\xF5" - "\x44\xC4\xBD\xA6\x8E\x37\x1C\x5A\x58\x19\x62\xE4\xD1\xA5\x96\xFC" - "\xAB\x43\x01\x26\x1A\xB6\x3F\x1E\x14\xDF\x43\x7D\x98\xCA\xF7\x95" - "\xBA\x1C\x7C\x02\xE6\xEF\xB0\xFE\x1C\xF5\x08\xB2\x00\x00\x00\x00" - "\x49\x45\x4E\x44\xAE\x42\x60\x82", 248); - getPNGImage(png); - } - else if (url == "roku.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x64\x49\x44\x41\x54\x28\xCF" - "\x63\x60\xA0\x0A\x68\xF8\xCF\x80\x04\x03\xFE\x2F\xF8\x8F\x43\x81" - "\x03\x5C\x51\xC3\x7F\xEC\x26\x00\x81\x16\x98\xA5\x80\x5B\xC1\x01" - "\x28\x1B\xC5\x1A\x64\x05\x0B\xA0\xEC\x03\xD8\x14\x2C\x00\xDA\xAD" - "\x00\x75\x28\x1E\x5F\x60\xB8\x00\x53\x41\x16\x4E\x05\x50\x3F\x30" - "\xE0\x56\xC0\xC0\x00\x71\x83\x01\x6E\x6F\x02\x01\x98\x1D\x8A\xEA" - "\x0B\x07\x30\x84\xF0\xB2\xA0\x3C\x8C\x00\x27\x13\x00\x00\x9C\xD5" - "\x79\xC4\xEC\xC2\x17\x58\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42" - "\x60\x82", 178); - getPNGImage(png); - } - else if (url == "itunes.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x03\x87\x49\x44\x41\x54\x38\xCB" - "\x4D\x93\x4B\x68\x5C\x65\x1C\x47\x7F\xFF\xEF\x3E\xE6\x95\x9B\x99" - "\x49\x9A\xF4\x26\xCD\x98\x4C\x93\x4E\x1E\x6D\x93\x4A\x5D\xB4\x2A" - "\x49\xB5\x69\xD0\x2A\x05\x17\x62\x0B\x85\x16\x34\x98\xB8\x51\x17" - "\x52\x15\x25\x62\xC1\x4D\x21\xB5\xB8\xA9\xD9\xA8\xC1\x85\x94\x08" - "\x52\x04\x51\x3A\xA5\xA6\x25\x09\x18\x43\x8A\xAF\xD8\x94\x32\x49" - "\x9A\x99\x49\xEA\xCC\x9D\xB9\xF3\xBE\x8F\xEF\x73\x13\xC1\xB3\x3F" - "\x67\x77\x08\x00\x88\x88\x84\x10\x00\x20\xA2\xD1\x68\x74\xE4\xC4" - "\xC8\xB9\xC7\x3A\x3A\x87\xEA\x83\xE1\x56\x22\x62\x05\x33\x97\x5C" - "\x4B\xDC\x9F\x8D\xC7\xE3\xD3\xAB\xAB\xAB\xAB\x00\xC0\x18\x63\x9C" - "\x73\x4E\x3B\xB2\x00\x80\xF1\xB1\xB1\x77\x9F\x38\x72\xEC\x22\xF3" - "\x86\x64\xBF\x16\x86\xEA\xF5\x03\x20\xD4\x6A\x35\x54\x8A\x26\x78" - "\x25\xCB\x7F\x5B\x9A\xFD\xE4\xD3\x2B\x57\x3E\xFC\x2F\x42\x00\x08" - "\x80\x98\x98\x98\x98\x6A\x8E\xEC\x1F\xAD\xB1\x3A\xEC\x6E\xEB\xB0" - "\x55\x2D\x4C\xDE\x80\x46\x8A\x22\x13\x83\x10\x76\xB5\xCC\x93\x89" - "\x84\x62\xE7\xD3\x28\x6C\xFD\x39\x73\xE1\xC2\x3B\x2F\x03\x80\x04" - "\x00\xA3\xA3\xAF\xBD\xD5\xD2\x31\xF0\x7E\xD2\x84\xAD\xE9\xED\x54" - "\x91\x7C\x32\x17\x9C\x6D\xAF\xAF\xB0\x07\x77\xE7\xE9\xAF\x5F\x7E" - "\x66\xBF\xCF\xC7\xA5\x6A\x29\x2B\x78\xB0\xC3\x12\xAE\xE8\x1F\xE8" - "\x8D\xA8\xF3\x0B\x0B\x37\x65\x5D\xD7\xF5\xFD\x03\x47\x3E\x9E\xFB" - "\x23\x0D\x7D\xDF\x01\x29\x61\x82\x85\x79\x09\x73\x5F\x7F\x86\xBC" - "\x61\xC0\xB5\x1D\x08\xCE\xE1\x58\x55\xEC\xEE\xEC\xA5\xFE\xD8\x33" - "\xEA\xF2\xE2\x12\x9E\xEC\x3D\xF4\x5E\x77\x77\xF7\xB4\x74\xE6\xCC" - "\xE9\xF1\xED\x52\xDD\x8B\xC9\xB2\xC7\xA9\x78\x1B\xA5\x6A\x40\x07" - "\xC1\xC5\xFD\xF8\x35\x54\xCD\x02\x98\x2C\xC1\x13\x0C\x41\x0D\x68" - "\x20\xC5\x0F\xA7\xE5\x71\x4A\xA6\x32\x76\x29\x97\x97\x0E\x76\xEE" - "\x2A\xC9\xAD\x7B\xA2\xCF\xFE\xB4\x5C\x40\x35\x14\x21\xB3\xE6\x85" - "\x4F\x04\xC1\x6D\x07\x6A\x43\x03\xDA\x4E\x9E\x85\xDA\xBA\x0F\x4E" - "\xA8\x1D\x52\x31\x8B\xD4\x37\x97\xB0\x59\x91\x91\xE5\x75\xCC\x58" - "\x4B\xE2\xD4\xE1\xC8\x90\x6C\xB9\x6A\xDB\xCA\x46\x0E\x1E\x45\x25" - "\xC5\x0E\xC0\x2F\x87\x21\x39\x29\x68\x91\xBD\xA8\x3B\x79\x0A\x8F" - "\x92\x40\xCE\x06\x84\x53\x86\x6D\x39\x28\x59\x2A\x52\x25\x99\x0A" - "\x1B\x65\x94\x0E\xD6\xB5\xCA\xB6\x23\x60\x94\x3D\x40\x49\x05\xAB" - "\x79\xE0\xE5\x1E\xF8\x5D\x0E\x3B\x6B\xC0\x63\x00\x39\x47\x40\x09" - "\x10\x90\xC9\x21\x9D\x33\x61\x14\x81\x94\xE1\x02\x26\xC1\xB2\x38" - "\x98\x6B\x15\x37\x43\xC1\x26\x00\x3E\xC1\xFC\x0D\xD0\x75\xA0\xB1" - "\x1E\x10\x12\x83\xAD\x01\x3E\x96\x47\x76\xF2\x4D\xDC\xFB\xE0\x2C" - "\xDC\x5A\x0D\x92\xE2\x03\x1C\x8F\xF0\x06\x1A\x41\xBC\x9A\x62\xDB" - "\xA9\xBF\x6F\xC7\xF6\x34\x00\x65\x45\xC4\xFC\x15\xB4\x5F\xFF\x08" - "\xC5\x2F\x2E\xC2\x1B\xD0\x00\x0D\x70\x96\x6E\xC0\xF8\xF1\x5B\x48" - "\x66\x06\xF5\x5A\x3D\xB8\xA5\x02\x59\x9B\x77\xB6\xEC\x42\x3E\xF3" - "\x60\x4E\xCA\x65\xD3\x1B\xCF\x0F\x8F\xBC\x3E\xBF\xA1\x7B\xFA\xA5" - "\x59\x2E\x96\x67\x88\x9B\x65\x04\x7B\x0E\xE0\xD1\xDE\x21\xD8\x52" - "\x13\x9A\xBD\x04\x2D\x12\x43\xBE\x6F\x14\x9B\xEB\x24\xEC\x95\x75" - "\xE9\xF4\xB0\x8A\x5B\x3F\x5C\x7D\x43\x32\x0B\x95\x5C\xA4\xC9\x15" - "\x7D\x87\x86\x8F\xFF\x9A\xD5\xDC\xCE\xA8\x82\x40\x57\x0F\xFD\x73" - "\xF4\x3C\x36\x4A\x41\x64\x9D\x00\xCC\xAE\x41\xA4\x9B\x8E\xE3\x61" - "\xCA\x27\xCA\x0B\xF7\xEC\xE7\x8E\x06\x24\x35\x77\xED\x72\xFC\xE6" - "\xEC\x57\x84\x1D\xC6\xC7\xC6\xBE\x34\xDA\xDF\x3E\xF7\x7D\x36\x04" - "\xD1\x15\x76\x2C\x3F\x23\xE1\x0A\x12\x42\xC0\xCD\x39\x02\x89\x82" - "\xC0\x6A\x5A\x7E\x21\x56\x45\x8C\xCD\x5C\xBF\x3C\x79\xE9\x25\x00" - "\x5C\x22\x22\x06\x40\x2C\x2E\x2E\x7E\xD7\x17\x5C\xA3\x63\xB1\xB6" - "\xA7\x4A\x5B\xB2\x62\xAE\x57\x59\x6D\xDB\x22\xB1\x55\x25\x2D\x53" - "\x64\x07\xA5\x3C\x7B\xA5\x67\xDD\xA5\xB5\xAB\x93\x9F\x4F\x4D\xBD" - "\x0A\x40\x10\x11\xA3\x9D\x9D\x99\x10\x82\x03\x40\x44\x0F\xF6\x0D" - "\x0E\x9E\x38\xDF\x10\x39\xFC\xB4\xF0\x36\xB7\x00\x8C\xA8\xB6\xBD" - "\x65\x6C\x2E\xDD\xB9\x73\xFB\xC6\x74\xE2\x61\xE6\xEE\xFF\x9D\x7F" - "\x01\x0D\x6F\xA1\x6E\xFB\xAE\xB6\x18\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 981); - getPNGImage(png); - } - else if (url == "warn.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x88\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\xCD\x4A\x02\x51\x18\x86\xA7\x24\xA2\x02\x47\xAC\x4C\x8C" - "\x68\x51\x37\x90\xAB\xDA\x55\x77\x90\x17\x50\x0B\x6F\xC1\xBA\x81" - "\x7E\xD6\x25\xD4\xA2\x85\x9B\xA0\x56\x6D\x2A\xC2\x28\xA2\xA0\xB0" - "\x06\x8C\x74\x61\x90\x41\x18\x92\x3F\xD8\x8F\x24\xF8\x33\xE3\xBC" - "\x7D\xE7\x8C\x33\x5A\x69\x69\x07\x1E\xCE\x7B\xDE\x73\xBE\xF7\xFB" - "\x66\x31\x82\xD0\x60\x25\xFD\xD6\xF1\xA2\x34\x08\x06\xD3\x42\xAB" - "\x8B\x15\x96\xDE\x56\x88\x65\x1E\xD2\x52\x31\xEB\x98\xBF\x72\x00" - "\xD8\xE6\xE4\x03\x8E\xD6\xA6\xC8\x5D\xD8\x79\x77\x3D\x80\x4D\xC1" - "\xBC\xA6\xBB\xBF\x9F\xD9\x00\xC5\xC7\x0A\x38\x2A\xE9\xEC\xB9\xAD" - "\xB9\x29\x32\x27\x7D\x28\xA6\x17\xA0\x16\xBC\xD5\x80\xC2\x1A\x79" - "\xF3\xC8\x9C\xF4\xE3\xCF\xEE\x49\x7F\x2F\xD4\x8F\x45\x62\xA9\x1A" - "\x40\x9A\x79\x74\xFF\xFB\x14\xF1\x3D\x0B\x0A\xB1\x39\x94\x5F\x3C" - "\x50\x09\x23\x80\x74\xF9\xD5\x83\x62\x6C\x16\xF1\x7D\x0B\x1A\x76" - "\x7F\xDC\x35\xA3\x9C\x70\x6B\x24\xDD\x46\x80\x7E\x66\xB0\x37\x75" - "\xA7\x88\xEE\xF4\x20\x17\x9A\x80\xF2\xE4\x82\x12\x9B\x21\x5C\xD5" - "\x00\xD2\xDC\x27\xB2\xB7\x93\xB8\xA7\xB7\x3F\xBA\x47\xB6\xBA\x20" - "\x47\xA7\xA0\x30\x1E\x18\xD3\x46\x80\xA2\xFB\x51\xCD\x67\x6F\xBF" - "\x4C\x11\xF2\x75\x22\x7D\x3A\x04\x39\x32\x56\x83\x13\xF2\x9D\xF3" - "\x9B\xA7\xF9\x89\xE3\x61\x84\xA9\xC6\xE8\x7E\xB3\xD9\x81\x52\x68" - "\x84\x18\x85\x4C\xBB\x1C\x26\x48\xEB\x13\x70\x4F\xF7\xC3\x9A\x0E" - "\x52\x0D\x9F\x42\x5A\x37\x21\x75\x64\x45\x29\x38\x40\xD8\xF9\x2E" - "\x57\x76\x23\x80\xCE\x72\xCD\x3D\x23\x71\x28\x42\xDA\x30\x41\x08" - "\x78\xDB\x91\xF2\x9B\x51\x92\xC4\x0A\x96\x1A\x5D\x87\x6B\x91\x7E" - "\x2E\x11\xCF\x07\xDD\x08\x78\xDB\xC0\x3F\xE1\x72\x55\xC0\x7F\x60" - "\xB5\x9F\x32\xEB\xC2\x92\x1E\xFA\xFF\x9A\x00\x00\x00\x00\x49\x45" - "\x4E\x44\xAE\x42\x60\x82", 470); - getPNGImage(png); - } - else if (url == "xff.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xCC\x49\x44\x41\x54\x28\xCF" - "\x63\x60\x08\x67\x68\x64\x68\x40\x83\xAD\x40\x28\xCC\x00\x05\xB5" - "\xDF\xFF\xA3\x83\xE3\xFF\x4D\xFE\x6B\xFD\xCF\xEA\xC1\xA9\xE0\xF0" - "\xFF\xD8\xFF\xEF\xFF\x5B\xFD\x77\x9E\x84\x43\xC1\xC1\xFF\x12\x40" - "\x69\xAB\xFF\x5C\xFF\x19\x8A\xB0\x2A\x40\x00\xA0\x5B\x88\x52\xD0" - "\xFC\x7F\xED\xFF\x9B\xFF\xE3\xFF\xBF\xFE\x1F\x0C\x86\x57\xFF\xA7" - "\x81\xE9\xED\x30\x05\x67\xFE\x8B\x01\x6D\xEC\xFB\xFF\xF6\x3F\xF7" - "\xFF\x3B\x40\xF8\xFD\xBF\xCC\xFF\x03\x40\xFA\x03\xC2\x8A\x98\xFF" - "\x72\xFF\xFF\x00\x15\xB0\xFE\x8F\xFE\x9F\x0A\xE4\xCB\xFC\xF7\x07" - "\xB2\xDE\xC0\x14\x3C\x07\x9A\x20\x05\x34\x10\x64\xC2\x95\xFF\xD7" - "\xC1\x0A\x76\x02\x59\xBF\x60\x0A\xC2\xFE\x97\xFF\xDF\xF1\x5F\xF1" - "\xFF\xA3\xFF\xBC\x50\xC7\xC9\xFC\xBF\x8F\xEC\xC8\x03\xFF\xBF\x81" - "\xC3\xEF\x19\x30\x88\x20\xE0\xD8\xFF\xEF\x24\x79\x93\x42\x05\x9E" - "\xE0\xC8\xC5\x05\xE3\x00\x1F\xF1\x7A\x19\x4B\x38\x03\x56\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 282); - getPNGImage(png); - } - else - { - sendMessageAndClose(MSG_HTTP404); - } - return; - } - else if (m_url == "index.css") - { - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"), utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > gOptions.m_styleCustomHeaderTime) || (diffTime > 31536000)) - { - const time_t modTime = (!gOptions.m_styleCustomHeaderTime ? (gOptions.m_styleCustomHeaderTime = curTime) : gOptions.m_styleCustomHeaderTime); - utf8 body, - header = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/css\r\n" - "Vary:Accept-Encoding\r\n" - "Cache-Control:private,max-age=31536000\r\n" - + utf8(m_compressed ? "Content-Encoding:gzip\r\n" : "") + - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n", - // v2 DNAS style - g_styleV2Str = "a:visited,a:link{color:#2762AE;text-decoration:none;}" - "a:hover{text-decoration:underline;}" - ".logo,.titlespan,.tsp,.inp,.tll,b.w,.infh{color:#DEAC2F;}" - ".logo{font-weight:bold;font-size:2.25em;letter-spacing:-0.0625em;padding-left:0.1em;}" - "textarea,input,select,body,pre,table,b.i{color:#636363;font-family:arial,helvetica;font-size:small;}" - "textarea,input,select{background-color:#F0F0F0;border:1px solid #CCCCCC;}" - ".ls,.ls td,.en,.en td,.ent,fieldset,.infb{border-collapse:collapse;border:1px solid #CCCCCC;}" - ".ls a{display: block;}" - ".tsp{background:#4C4C4C;}" - ".inp{background:#636363;}" - ".tll,.infh,.thr{background:#F0F0F0;}" - "div.thr{padding:0.4em;display:inline-block;}" - ".tnl{color:#636363;font-weight:bold;text-decoration:none;}" - ".submit{color:white;background:#2350A5;border:1px solid #CCCCCC;}" - "span.default{overflow:auto;border:1px solid #CCCCCC;color:#636363;display:block;}" - ".titlespan{padding:3px 0 2px 0;display:block;}" - "input:disabled,font.t{color:#CCCCCC;}" - "hr{border:0;background-color:#CCCCCC;height:1px;margin:0 -15px;}" - "b.e{color:red;}" - "b.d{color:green;}" - "b.u{color:blue;}" - ".infh{position:relative;top:-15px;margin:0 -15px;padding:2px 0px;border-bottom:1px solid #CCCCCC;}" - ".infb{display:inline;float:left;margin:0px 15px;padding:15px 15px 10px;}", - // v1 DNAS style - g_styleV1Str = "a:visited,a:link,b.u{color:blue;text-decoration:none;}" - "a:hover{text-decoration:underline;}" - ".logo{color:red;font-weight:bold;font-size:2.25em;letter-spacing:-0.0625em;padding-left:0.1em;}" - "textarea,input,select,body,pre,b.i{color:#eeeeee;background:black;font-family:arial,helvetica;font-size:small;}" - ".ls,.en,.ent,fieldset,.infb{border-collapse:collapse;}" - "textarea,input,select,.ent,.ls td,.en td,.infb,span.default{border:1px solid #CCCCCC;}" - ".inp,.infh{background:#000080;}" - ".ls a{display: block;}" - ".tll{background:black;}" - ".tsp{background:#000025;}" - "div.thr{padding:0.4em;display:inline-block;}" - ".thr{background:#DDDDDD;}" - ".tnl{color:black;font-weight:bold;text-decoration:none;}" - "span.default{overflow:auto;color:white;display:block;}" - ".titlespan{color:white;padding:3px 0 2px 0;display:block;}" - "input:disabled,font.t{color:#CCCCCC;}" - "hr{border:0;background-color:#CCCCCC;height:1px;margin:0 -15px;}" - "b.e{color:red;}" - "b.d{color:green;}" - "b.w{color:yellow;}" - ".infh{position:relative;top:-15px;margin:0 -15px;padding:2px 0px;border-bottom:1px solid #CCCCCC;}" - ".infb{display:inline;float:left;margin:0px 15px 10px 0px;padding:15px 15px 10px;}"; - - if (gOptions.m_styleCustomStr.empty()) - { - bool compress = !!m_compressed; - const bool v2 = (gOptions.adminCSSFile() == "v2"); - if (!v2 && !(gOptions.adminCSSFile() == "v1")) - { - body = gOptions.getIndexCSS(compress); - } - - // fallback to v2 DNAS style - if (body.empty()) - { - // force things to the default style if not found so we're not re-trying all the time - gOptions.m_styleCustomStrGZ = gOptions.m_styleCustomStr = body = (v2 ? g_styleV2Str : g_styleV1Str); - compress = true; - } - - gOptions.m_styleCustomHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/css\r\n" - "Vary:Accept-Encoding\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n"; - - if (compress && !gOptions.m_styleCustomStrGZ.empty() && compressData(gOptions.m_styleCustomStrGZ)) - { - gOptions.m_styleCustomHeaderGZ = gOptions.m_styleCustomHeader + "Content-Encoding:gzip\r\n"; - } - else - { - gOptions.m_styleCustomStrGZ.clear(); - } - } - - if (!gOptions.m_styleCustomStr.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_styleCustomStrGZ.empty()) - { - body = gOptions.m_styleCustomStrGZ; - header = gOptions.m_styleCustomHeaderGZ; - } - else - { - body = gOptions.m_styleCustomStr; - header = gOptions.m_styleCustomHeader; - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } - return; - } - - // now we do most of the processing depending on the mode the http instance has been started as - const utf8 &type = toLower(stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""))); - const int webSetupAllowed = (m_protocols & P_WEB_SETUP); - const utf8 host = (relayHostName.empty() ? m_clientHostName : relayHostName), - addr = (relayHostIP.empty() ? m_clientAddr : relayHostIP); - - if (m_protocols & P_WEB) - { - bool auth_check = false; - // make sure we unescape this so we cope with some weird clients - utf8 password = urlUtils::unescapeString(mapGet(m_httpRequestInfo.m_QueryParameters, "pass", (utf8)"").hideAsString()); - if (password.empty()) - { - // as we need the password for some of the public pages - // we'll convert any 'authorization' headers into their - // 'pass' parameter equivalent and then do all checking - // based on the password which will be cleaner overall. - const utf8 &auth = mapGet(m_httpRequestInfo.m_HTTPHeaders, "authorization", (utf8)""); - const vector &vauth = tokenizer(auth, (utf8::value_type)' '); - // format " Basic xxxxxxxxx" - const vector<__uint8> va = base64::decode((vauth.size() < 2 ? "" : vauth[1]).hideAsString().c_str()); - password.insert(password.end(), va.begin(), va.end()); - auth_check = true; - } - else - { - // we also support base64 encoded passwords - // so we need to check for them and decode - // before passing on to be fully checked. - if (password.find(utf8("YWRtaW46")) == 0) - { - vector<__uint8> va = base64::decode(password.hideAsString().c_str()); - password.clear(); - password.insert(password.end(), va.begin(), va.end()); - auth_check = true; - } - } - - // look at the password and check for the multi-1.x style support, - // extracting as needed which is likely if using the same password - // parameters for the title update handling that should be sent - utf8 dj_name; // throw-away - int alt_sid = -1; - if (extractPassword(password, dj_name, alt_sid)) - { - if (alt_sid != -1) - { - realSID = sid = alt_sid; - } - - // if this is from a converted 'authorization' header then we - // need to ensure that the user is what we allow i.e. 'admin' - // changed b611 as Icecast sources send different values so - // for those cases we'll have to allow it through so it works - if (auth_check && !hasMount && !(dj_name == "admin")) - { - password.clear(); - } - } - - if (m_url == "admin.cgi") - { - // added in 2.4.8+ the ability to restrict access to the admin - // sections based on the IP / host reported by the connection. - // this is a user request as a means to help restrict access - // to these pages and (slightly) improve security (https would - // be better but for the time being, it's this and passwords). - if (isAdminAccessAllowed(addr, host) == false) - { - // try to redirect to something (if configured) - // before failing and provide a 403 response... - const utf8 redirectUrl = gOptions.getStreamRedirectURL((no_sid ? 0 : sid), false, false, !!m_compressed, true); - sendMessageAndClose((!redirectUrl.empty() ? redirectUrl : MSG_HTTP403)); - return; - } - - // we need a password for all of the admin.cgi methods - // so no point in creating it if we know it's missing - // and return WWW-Authenticate quicker than if we did - // the checks inside of protocol_admincgi like before. - if (!password.empty()) - { - const socketOps::tSOCKET s = m_socket; - m_socket = socketOps::cINVALID_SOCKET; - - const bool zero_sid = (((int)realSID == -1) ? true : (realSID == 0)); - threadedRunner::scheduleRunnable(new protocol_admincgi(s, sid, no_sid, zero_sid, m_clientLogString, - password, m_referer, m_hostIP, m_userAgent, - m_httpRequestInfo)); - m_result.done(); - } - else - { - sendMessageAndClose(MSG_AUTHFAILURE401 + utf8(!HEAD_REQUEST ? - "UnauthorizedShoutcast " - "Administrator" : "")); - } - return; - } - else if (m_url == "index.html") - { - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid) - { - streamData::streamID_t lastSID = 0; - if (streamData::totalActiveStreams(lastSID) != (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - path_root_summary(XFF); - } - else - { - if (realSID == 0) - { - path_root_summary(XFF, true); - } - else - { - sendMessageAndClose(redirect("index.html?sid=" + tos(lastSID), !!m_compressed)); - } - } - } - else - { - path_root(sid, XFF); - } - return; - } - else if ((m_url == "7.html") || (m_url == "7")) - { - findBaseStream(no_sid, sid); - - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = false, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_7Cache[sid]; - if (getCachedResponse(item, m_7Lock)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - // 7.html format is CURRENTLISTENERS STREAMSTATUS PEAKLISTENERS MAXLISTENERS UNIQUELISTENERS BITRATE SONGTITLE - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/html;charset=utf-8\r\n" - "Cache-Control:no-cache\r\nConnection:close\r\n", - body = "" + tos(data.connectedListeners) + "," + - (extra.isConnected ? "1" : "0") + "," + tos(data.peakListeners) + - "," + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "," + - tos(data.uniqueListeners) + "," + tos(info.m_streamBitrate) + - "," + aolxml::escapeXML(info.m_currentSong) + getfooterStr(); - - sendCachedResponse(item, m_7Cache, m_7Lock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "stats") - { - findBaseStream(no_sid, sid); - - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = true, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_stats_json(sid, passworded, callback); - } - else - { - path_stats_xml(sid, passworded); - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "statistics") - { - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = true, - proceed = isViewingAllowed(sid, password, true, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_statistics_json(sid, passworded, callback); - } - else - { - path_statistics_xml(sid, passworded); - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "robots.txt") - { - utf8 header = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\nContent-Length:24\r\n\r\n", - body = "User-agent:*\r\nDisallow:/"; - - if (gOptions.robotstxtFile() == "") - { - } - else - { - if (gOptions.m_robotsTxtBody.empty()) - { - body = loadLocalFile(fileUtil::getFullFilePath(gOptions.robotstxtFile())); - if (!body.empty()) - { - gOptions.m_robotsTxtBodyGZ = gOptions.m_robotsTxtBody = body; - gOptions.m_robotsTxtHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\n" - "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - - if (compressData(gOptions.m_robotsTxtBodyGZ)) - { - gOptions.m_robotsTxtHeaderGZ = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\n" - "Content-Length:" + tos(gOptions.m_robotsTxtBodyGZ.size()) + "\r\n" - "Content-Encoding:gzip\r\n\r\n"; - } - else - { - gOptions.m_robotsTxtBodyGZ.clear(); - } - } - else - { - body = MSG_HTTP404; - } - } - - if (!gOptions.m_robotsTxtBody.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_robotsTxtBodyGZ.empty()) - { - body = gOptions.m_robotsTxtBodyGZ; - header = gOptions.m_robotsTxtHeaderGZ; - } - else - { - body = gOptions.m_robotsTxtBody; - header = gOptions.m_robotsTxtHeader; - } - } - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } - else if (m_url == "crossdomain.xml") - { - path_crossdomain(); - return; - } - else if ((m_url == "played.html") || (m_url == "played")) - { - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid && findBaseStream(no_sid, sid)) - { - sendMessageAndClose(redirect((!gOptions.getSongHistorySize(sid) ? "index.html?sid=" : "played.html?sid=") + tos(sid), !!m_compressed)); - return; - } - else - { - if (!no_sid && !gOptions.getSongHistorySize(sid)) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(sid), !!m_compressed)); - return; - } - } - - const bool json = (type == "json"), xml = (type == "xml"); - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool hide = (hideStats == "all") && !(hideStats == "none"), adminOverride = false, passworded = false, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - // only do a password check if we've got a hidden page - if ((hide == true) && !password.empty()) - { - if (proceed && !(json || xml)) - { - proceed = false; - } - } - - // if xml or json is requested then we see if we - // should provide it publically or use redirect - if (no_sid || ((hide == true) && (proceed == false))) - { - path_redirect_url(sid, no_sid, false); - } - else - { - if (!json && !xml) - { - path_played_html(sid, XFF); - } - else - { - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_played_json(sid, callback, proceed, XFF); - } - else - { - path_played_xml(sid, proceed, XFF); - } - } - } - return; - } - else if ((m_url == "home.html") || (m_url == "home")) - { - if (no_sid) - { - path_root_summary(XFF); - } - else - { - path_home(sid); - } - return; - } - else if ((m_url == "currentsong") || (m_url == "nextsong")) - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - path_track(sid, (m_url == "nextsong")); - } - return; - } - else if (m_url == "nextsongs") - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_tracks_json(sid, callback); - } - else - { - path_tracks_xml(sid); - } - } - return; - } - else if (m_url == "currentmetadata") - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if (no_sid || ((hide == true) && (adminOverride == false) && (proceed == false))) - { - path_redirect_url(sid, no_sid, true); - } - else - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_current_metadata_json(sid, callback); - } - else - { - path_current_metadata_xml(sid); - } - } - return; - } - else if ((m_url == "streamart") || (m_url == "playingart")) - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if (no_sid || ((hide == true) && (adminOverride == false) && (proceed == false))) - { - path_redirect_url(sid, no_sid, true); - } - else - { - path_art(sid, (m_url == "playingart")); - } - return; - } - else if ((m_url == "listen.pls") || (m_url == "listen")) - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_PLSCache[sid]; - if (getCachedResponse(item, m_PLSLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - int index = 1; - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - ++index; - backupServer = "File"+tos(index)+"=" + info.m_backupServer + - (!info.m_streamName.empty() ? "\nTitle"+tos(index)+"=" + info.m_streamName : "") + - "\nLength"+tos(index)+"=-1\n"; - - if (!info.m_backupServersList.empty()) - { - for (vector::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - ++index; - backupServer += "File"+tos(index)+"=" + (*b) + - (!info.m_streamName.empty() ? "\nTitle"+tos(index)+"=" + info.m_streamName : "") + - "\nLength"+tos(index)+"=-1\n"; - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:audio/x-scpls\r\nConnection:close\r\n", - body = "[playlist]\nNumberOfEntries=" + tos(index) + - "\nFile1=http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + ":" + - tos(g_portForClients) + getStreamPath(sid, true) + - ((streamData::getStreamContentType(sid) == "video/nsv") ? ";stream.nsv\n" : "\n") + - (!info.m_streamName.empty() ? "Title1=" + info.m_streamName + "\n" : "") + "Length1=-1\n" + - backupServer + "Version=2"; - - sendCachedResponse(item, m_PLSCache, m_PLSLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.m3u") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_M3UCache[sid]; - if (getCachedResponse(item, m_M3ULock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n#EXTINF:-1," + info.m_streamName + "\n" + info.m_backupServer; - if (!info.m_backupServersList.empty()) - { - for (vector::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n#EXTINF:-1," + info.m_streamName + "\n" + (*b); - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:audio/x-mpegurl\r\nConnection:close\r\n", - body = "#EXTM3U\n" - "#EXTINF:-1," + info.m_streamName + "\n" - "http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + - ":" + tos(g_portForClients) + getStreamPath(sid, true) + - (streamData::getStreamContentType(sid) == "video/nsv" ? ";stream.nsv" : "") + - backupServer; - - sendCachedResponse(item, m_M3UCache, m_M3ULock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.asx") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_ASXCache[sid]; - if (getCachedResponse(item, m_ASXLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - "\n"; - if (!info.m_backupServersList.empty()) - { - for (vector::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - "\n"; - } - } - backupServer += "\n"; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:video/x-ms-asf\r\nConnection:close\r\n", - body = "\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - "\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - "\n" + backupServer + ""; - - sendCachedResponse(item, m_ASXCache, m_ASXLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.qtl") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_QTLCache[sid]; - if (getCachedResponse(item, m_QTLLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/x-quicktimeplayer\r\nConnection:close\r\n", - body = "" - "" - ""; - - sendCachedResponse(item, m_QTLCache, m_QTLLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.xspf") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_XSPFCache[sid]; - if (getCachedResponse(item, m_XSPFLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n" + info.m_backupServer + "\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - ""; - if (!info.m_backupServersList.empty()) - { - for (vector::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n" + (*b) + "\n" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "\n" : "") + - ""; - } - } - backupServer += "\n"; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/xspf+xml\r\nConnection:close\r\n", - body = "\n" - "" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "" : "") + - "" + aolxml::escapeXML(info.m_streamURL) + "" - "" - "http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + - ":" + tos(g_portForClients) + getStreamPath(sid, true) + - (streamData::getStreamContentType(sid) == "video/nsv" ? ";stream.nsv" : "") + - "" + - (!info.m_streamName.empty() ? "" + aolxml::escapeXML(info.m_streamName) + "" : "") + - "" + backupServer + ""; - - sendCachedResponse(item, m_XSPFCache, m_XSPFLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "shoutcast.swf") - { - path_shoutcastswf(); - return; - } -#ifdef CONFIG_BUILDER - else if ((m_url == "builder") || (m_url == "setup")) -#else - else if (m_url == "setup") -#endif - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - return; - } - } - else if (webSetupAllowed) - { - if ((m_url == "runserver") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - setkill(2); - return; - } - else if ((m_url == "exit") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - setkill(1); - return; - } - else if ((m_url == "config") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - utf8 conf_file = gStartupDirectory + "sc_serv.conf"; - ILOG("[SETUP] Saving settings to `" + conf_file + "'"); - - config setupOptions; - setupOptions.load(conf_file, false); - - const vector queryTokens = tokenizer(m_httpRequestInfo.m_PostLine.toANSI(true),'&'); - for (vector::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - const utf8 entry = urlUtils::unescapeString(*i); - const string::size_type pos = entry.find(utf8("=")); - if (pos == string::npos) - { - setupOptions.setOption(entry, (utf8)""); - } - else - { - const utf8 name = entry.substr(0, pos); - const utf8 value = entry.substr(pos + 1); - setupOptions.setOption(name, value); - } - } - - if (setupOptions.rewriteConfigurationFile(true, false, true)) - { - ILOG("[SETUP] Saved settings to `" + conf_file + "'"); - } - else - { - ILOG("[SETUP] Unable to save settings to `" + conf_file + "'. Please resolve the error(s) above."); - } - - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - return; - } - else if (m_url == "configs") - { - const utf8 &query = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "query", (utf8)"")); - utf8 fn = "sc_serv.conf"; - utf8 body = ""; - - const vector queryTokens = tokenizer(query.toANSI(true),'&'); - for (vector::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - const utf8 entry = urlUtils::unescapeString(*i); - const string::size_type pos = entry.find(utf8("=")); - if (pos != string::npos) - { - const utf8 name = entry.substr(0,pos); - const utf8 value = entry.substr(pos+1); - if (name == "fn") - { - fn = value; - } - else if (name == "body") - { - body = value; - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/plain\r\n" - "Content-Disposition:attachment;filename=\""+fn+"\"\r\n"; - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#ifdef CONFIG_BUILDER - else if (m_url == "collapse.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0D\x08\x06\x00\x00\x00\x72\xEB\xE4" - "\x7C\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x00\xA3\x49\x44\x41\x54\x28\xCF" - "\xA5\x92\x3D\x0A\xC4\x20\x10\x46\x73\xA1\xDC\x2A\x37\xF3\x20\x2E" - "\xD8\xD8\x69\x65\x3A\x71\x2B\x1B\x1B\x4B\x21\x32\xEB\x27\xC9\xE0" - "\xA6\x48\xF6\x47\x78\x22\xE3\xFB\x06\x15\xA7\x65\x59\xE6\xC6\xA3" - "\xB1\x35\xE8\x82\x6D\xF7\xE6\xA9\x4D\x4A\x4A\x49\xB5\x56\xBA\x1A" - "\xD8\x87\x07\x1F\xA1\x67\x4A\x89\x3E\x19\xF0\xE0\xFF\x1E\x8A\x31" - "\x52\x29\xE5\x0D\xDC\xE3\x5C\x83\xC7\xA1\x10\x02\xE5\x9C\x99\xF1" - "\x01\xC6\x3A\x3C\x0E\xAD\xEB\xDA\xBB\xEC\x9D\x3A\xE7\x35\x80\xC7" - "\x21\x63\x0C\x79\xEF\x59\xC2\xFA\x60\xAC\xC1\xE3\x90\xD6\x9A\x9C" - "\x73\xB7\xC0\xE3\x90\x52\x8A\xAC\xB5\xB7\xC0\xFB\x2B\xA4\x84\x10" - "\xFD\xBC\x57\x01\xEC\xC3\x3B\x7E\xC4\xD7\x7F\xEF\x05\xFC\x4E\x08" - "\xFC\x0F\xA9\x38\xAE\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60" - "\x82", 241); - getPNGImage(png); - return; - } - else if (m_url == "expand.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0D\x08\x06\x00\x00\x00\x72\xEB\xE4" - "\x7C\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x00\xCC\x49\x44\x41\x54\x28\xCF" - "\x95\x92\x41\x0A\x83\x30\x10\x45\xBD\x90\xB7\xF2\x66\xDE\xC2\x55" - "\x21\x1B\xC1\x85\x6E\xD4\x85\xA0\xA6\x0D\xBA\x51\x50\x77\x42\x65" - "\x9A\x1F\x3A\x31\x6D\x51\x6A\xE0\xC9\x38\xF9\x2F\x31\x12\x2F\x08" - "\x02\x5F\x73\xD3\x3C\x35\x74\xC2\xF3\x9D\xF3\x3D\xFD\x10\x61\x18" - "\xD2\x3C\xCF\xB4\x6D\x1B\x1D\x8D\x65\x59\x08\x39\xE4\x21\x49\xA5" - "\x14\xFD\x33\x86\x61\x80\x24\x8D\x84\x97\xAB\xD2\xBD\xEF\x7B\x9A" - "\xA6\xE9\x83\x75\x5D\x7F\x7A\x5D\xD7\x59\xE9\xD1\xB6\x2D\x8D\xE3" - "\x68\x0F\x8D\x9A\x71\x7B\x4D\xD3\xEC\x52\x59\x96\x84\xDD\x00\x87" - "\xBE\x6B\x80\x9C\x95\xD2\x34\xA5\xBA\xAE\x49\x4A\x69\x70\x7F\x35" - "\xF7\x30\x9F\x65\xD9\x2E\xC5\x71\x4C\x45\x51\x18\xAA\xAA\x32\x40" - "\xE0\x9A\xE7\x92\x24\xB1\x92\x12\x42\x98\x55\x98\x3C\xCF\x2D\x6E" - "\x1F\x8B\x1F\x4A\x47\xB8\x92\x88\xA2\x88\x70\xAE\x33\xF0\x99\xC8" - "\xF1\x8D\xB8\x7C\xF7\x5E\x5E\xA8\x08\x66\xFF\x94\x63\xFE\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 282); - getPNGImage(png); - return; - } - else if (m_url == "builder") - { - uniFile::filenameType fn = gStartupDirectory + "config_builder/config_builder.html"; - size_t fileSize = uniFile::fileSize(fn); - uniFile::filenameType fn_js = gStartupDirectory + "config_builder/config_builder.js"; - size_t fileSizeJS = uniFile::fileSize(fn_js); - - utf8 header = MSG_NO_CLOSE_200, - body = "" - "" - ""\ - "Shoutcast Configuration Builder" - "" - "" - "" - // skip config_builder.js if the main setup.html cannot be found to load - + (fileSize > 0 ? utf8("") : "") + - "" - "" - "" - "" - "
Shoutcast Configuration Builder
" - "Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "" - "
" - "
 Help  |  " - " Documentation

"; - - // only process if the html and js files can be found - if (fileSize && fileSizeJS) - { - body += loadLocalFile(fn); - } - else - { - body += "
" - "
" - "
There was an error finding the files required for running the configuration builder.
" - "Check that there is a 'config_builder' folder in the same folder as the server.

" - "Click here to try loading the configuration builder files again. If this message
" - "remains, you will need to seek assistance via the help forum.

" - "
" - - "" + getfooterStr(); - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#endif - else if (m_url == "setup") - { - uniFile::filenameType fn = gStartupDirectory + "setup/setup.html"; - size_t fileSize = uniFile::fileSize(fn); - uniFile::filenameType fn_js = gStartupDirectory + "setup/setup.js"; - size_t fileSizeJS = uniFile::fileSize(fn_js); - - utf8 header = MSG_NO_CLOSE_200, - body = "" - "" - ""\ - "Shoutcast DNAS Setup" - "" - "" - // skip setup.js if the main setup.html cannot be found to load - + (fileSize > 0 ? utf8("") : "") + - "" - "" - "" - "
Shoutcast DNAS Setup
" - "Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "" - "
" - "" - "
 Help  |  " - " Documentation
"; - - // only process if the html and js files can be found - if (fileSize && fileSizeJS) - { - body += loadLocalFile(fn); - } - else - { - body += "
" - "
" - "
There was an error finding the files required for running setup.
" - "Check there is a 'setup' folder in the same folder as the server.

" - "Click here to try loading the setup files again. If this message
" - "remains, you will need to seek assistance via the help forum.

" - "
" - - "" + getfooterStr(); - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } - else - { - utf8::size_type pos; - if (((pos = m_referer.rfind(utf8("setup"))) != utf8::npos) || (m_url == "setup.txt")) - { - uniFile::filenameType fn = gStartupDirectory + "setup" + m_httpRequestInfo.m_url; - utf8 header = "HTTP/1.0 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n", - body = loadLocalFile(fn); - - if (!body.empty()) - { - utf8 mime = "text/plain"; - if ((pos = m_httpRequestInfo.m_url.rfind(utf8(".js"))) != utf8::npos) - { - mime = "text/javascript"; - } - header += "Content-Type:" + mime + "\r\n"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#ifdef CONFIG_BUILDER - else if (((pos = m_referer.rfind(utf8("/builder"))) != utf8::npos) || (m_url == "/config_builder.txt")) - { - uniFile::filenameType fn = gStartupDirectory + "config_builder" + m_httpRequestInfo.m_url; - utf8 header = "HTTP/1.0 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n", - body = loadLocalFile(fn); - - if (!body.empty()) - { - utf8 mime = "text/plain"; - if ((pos = m_url.rfind(utf8(".js"))) != utf8::npos) - { - mime = "text/javascript"; - } - if ((pos = m_url.rfind(utf8(".css"))) != utf8::npos) - { - mime = "text/css"; - } - if ((pos = m_url.rfind(utf8(".png"))) != utf8::npos) - { - mime = "image/png"; - } - header += "Content-Type:" + mime + "\r\n"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#endif - } - } - - // if we've gotten to here, try to look for the request coming from a browser - // and provide the related html page or fallback to serving up stream content - if ((m_httpRequestInfo.m_url == "/") && - // added in 2.4.8+ so we can force through based on the 'type' parameter - // which allows for url/?type=.flv to work correctly whilst we also allow - // for setting url/?type=html to force showing of the html pages provided - (type.empty() || (type == "html")) && - ((m_userAgentLowered.find(utf8("mozilla")) != utf8::npos) || - (m_userAgentLowered.find(utf8("opera")) != utf8::npos))) - { - if (webSetupAllowed) - { - // if in setup mode then force everything to the /setup page - sendMessageAndClose(redirect("setup", !!m_compressed)); - } - else - { - // if enabled then we need to block access to this page as it's not allowed to be public - path_redirect_url(sid, no_sid, false); - } - return; - } - - - // check here if we're ok to try to provide the stream to the client or not - // i.e. it's not a banned or not in the reserved ip list when that is enabled - bool htmlPage = false; - const streamData::streamID_t found_sid = streamData::getStreamIdFromPath(m_httpRequestInfo.m_url, htmlPage); - if (found_sid > 0) - { - sid = found_sid; - } - if (m_ssl) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo (sid, info, extra)) - { - if (info.m_allowSSL == 0) - { - sendMessageAndClose(MSG_HTTP403); - return; - } - } - } - - - // bit convoluted but it allows us to check 'icy-host' and then the - // client's address since it came up in testing the CDN mode that - // it didn't allow through connections which were configured by IP - // only instead of DNS - was a bug in a few builds where this checked - // for the 'host' value instead of the actual client address (oops) - // 2.4.8+ - this also looks that 'XFF' header value if provided - const bool validXFF = !metrics::metrics_verifyDestIP(gOptions, true, XFF).empty(); - if (!validXFF || (isAccessAllowed(sid, XFF) == false)) - { - if (isAccessAllowed(sid, addr) == false) - { - if (isAccessAllowed(sid, host, true) == false) - { - sendMessageAndClose(MSG_HTTP403); - return; - } - } - } - - // now process things and redirect to the relevant page found - // though if it's the direct url and it's from the SC/YP tester - // then we really need to let it through as true stream access - - // changed in 2.4.8+ to follow the 'type' parameter so it will - // be able to force a specific usage type as required be that - // sc1, sc2, flv, http, m4a or just figure it out from headers - const bool uvox_agent = ((m_userAgentLowered.find(utf8("ultravox/2.1")) != utf8::npos) && - !(!type.empty() && ((type == ".flv") || (type == "flv") || (type == ".fla") || - (type == "fla") || (type == "http") || (type == "sc1")))) || - (!type.empty() && (type == "sc2")); - const bool officialAgent = isUserAgentOfficial(m_userAgentLowered); - if ((htmlPage && !officialAgent && !uvox_agent) || (!type.empty() && (type == "html"))) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(found_sid), !!m_compressed)); - return; - } - - // try to redirect directly to the appropriate page based on the number of active streams - streamData::streamID_t lastSID = 0; - if (!found_sid && (streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID)) - { - sid = lastSID; - } - - protocol_shoutcastClient *client = 0; - - // Force v1 connection for Winamp 5.5x clients which ident with ultravox/2.1 as they do not support title updates - if ((m_protocols & P_SHOUTCAST2CLIENT) && uvox_agent && - (m_userAgentLowered.find(utf8("winampmpeg/5.5")) == utf8::npos)) - { // go for Ultravox 2.1 - client = new protocol_shoutcast2Client (*this, sid, host, addr, XFF, mapGet(m_httpRequestInfo.m_HTTPHeaders, "cdn-slave", false)); - } - - if (!client && (m_protocols & P_SHOUTCAST1CLIENT)) - { - if (!type.empty() && ((type == ".flv") || (type == "flv") || (type == ".fla") || (type == "fla"))) - { - client = new protocol_flvClient (*this, sid, host, addr, XFF); // flv - } - /*else if ((type == ".m4a") || (type == ".mp4")) - { - client = new protocol_m4aClient(s, sid, host, addr, m_clientPort, m_userAgent, XFF, m_referer, HEAD_REQUEST); // m4a - }*/ - else - { - // from 2.4.8+, we now treat 1.x listener connections differently based on the - // requirement to send 1.x-style metadata or not, which if not we can go for a - // stipped down handler which will better frame-sync the output for reliabilty - // which is trickier to do with the metadata handling, hence the split handler - const bool sendMetadata = mapGet(m_httpRequestInfo.m_HTTPHeaders, "icy-metadata", false); - - // and this is used to look for what is essentially a Shoutcast player request - // and if we see icy=http then we force providing the HTTP listener client and - // not the SC 1.x listener client as we know the player won't use that data... - const utf8 &http = toLower(stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "icy", (utf8)""))); - const bool forceHTTP = ((!http.empty() && (http == "http")) || (!type.empty() && (type == "http"))); - - if ((gOptions.getBackupLoop(sid) == 1 ? false : (!forceHTTP ? sendMetadata : false)) || - (!type.empty() && (type == "sc1"))) - { - client = new protocol_shoutcast1Client (*this, sid, host, addr, XFF); // shoutcast 1 with metadata - } - else - { - client = new protocol_HTTPClient (*this, sid, host, addr, XFF); // http (equivalent of shoutcast 1 without metadata) - } - } - } - - if (client) - { - client->m_queryParams = encodeVariables (m_httpRequestInfo.m_QueryParameters); - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - // and we only action for GET requests, not HEAD, etc - if (!officialAgent && (m_httpRequestInfo.m_request == HTTP_GET) && - // changed in #668 to skip doing auth on local clients - // as it will never provide an applicable advert group - // unless we're detecting a remote XFF value to use... - (isRemoteAddress(addr) || isRemoteAddress(XFF))) - { - DEBUG_LOG(m_clientLogString + "Starting client via auth."); - client->authForStream(); - } - else - { - DEBUG_LOG(m_clientLogString + "Starting client directly."); - threadedRunner::scheduleRunnable(client); - } - } - - m_result.done(); -} - -void protocol_HTTPStyle::state_GetLine() throw(exception) -{ - if (getHTTPStyleHeaderLine(DEFAULT_CLIENT_STREAM_ID, m_lineBuffer, m_clientLogString, m_postRequest == 2 ? m_postRequestLength : 0)) - { - m_state = m_nextState; - } -} - -// parse header line into key/value components and load into table -void protocol_HTTPStyle::state_AnalyzeHTTPHeaders() throw(exception) -{ - m_lastActivityTime = ::time(NULL); - - if ((int)m_httpRequestInfo.m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - ELOG(m_clientLogString + "Max HTTP header lines exceeded"); - sendMessageAndClose(MSG_HTTP400); - return; - } - - // since a POST will get a null line, we need to check and handle it as appropriate when stripping whitespace - if (!m_lineBuffer.empty() && ((m_postRequest == 0) || - ((m_postRequest == 1) && (m_lineBuffer[0] != '\n') && (m_lineBuffer[0] != '\r')))) - { - m_lineBuffer = stripWhitespace(m_lineBuffer); - } - - if (m_lineBuffer.empty()) - { - m_state = &protocol_HTTPStyle::state_DetermineAction; - m_result.run(); - } - else if ((m_postRequest == 1) && ((m_lineBuffer[0] == '\n') || (m_lineBuffer[0] == '\r'))) - { - m_postRequest = 2; - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - m_state = &protocol_HTTPStyle::state_GetLine; - m_result.read(); - m_result.timeoutSID(); - m_lineBuffer.clear(); - } - else - { - // find the colon that divides header lines into key/value fields - const utf8::size_type pos = m_lineBuffer.find(utf8(":")); - // however in some cases (mainly found in the fire builds), the http headers may be split - // in a manner not expected so we have to look at the last key and append if there is one - // recorded which appears to be safe to do from testing vs killing the connection as was. - bool appended = false; - if ((pos == utf8::npos) && !m_postRequest) - { - if (!m_lastKey.empty()) - { - utf8 oldValue = m_httpRequestInfo.m_HTTPHeaders[m_lastKey]; - m_httpRequestInfo.m_HTTPHeaders[m_lastKey] = oldValue + stripWhitespace(m_lineBuffer.substr(pos+1)); - DEBUG_LOG(m_clientLogString + "Appending HTTP header string to previous key [" + m_lineBuffer + "]"); - appended = true; - } - else - { - DEBUG_LOG(m_clientLogString + "Bad HTTP header string [" + m_lineBuffer + "]"); - } - } - - if (m_postRequest < 2) - { - // make sure not to re-add if we're doing a header append (see above) - if (appended == false) - { - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0,pos))); - m_lastKey = key; - // allow empty values. (for urls and what-not) - if (key.empty()) - { - ELOG(m_clientLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - utf8 val = stripWhitespace(m_lineBuffer.substr(pos+1)); - m_httpRequestInfo.m_HTTPHeaders[key] = val; - if (toLower(key) == "content-length") - { - m_postRequestLength = atoi ((char*)&val[0]); - if (m_postRequestLength < 0 || m_postRequestLength > 5000000) - { - ELOG(m_clientLogString + "Connection rejected. Content length too large [" + m_lineBuffer + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - } - } - } - else - { - m_state = &protocol_HTTPStyle::state_DetermineAction; - m_result.run(); - // copy the POST response - m_httpRequestInfo.m_PostLine = m_lineBuffer; - m_lineBuffer.clear(); - return; - } - - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - m_state = &protocol_HTTPStyle::state_GetLine; - m_result.schedule(); - m_result.timeoutSID(); - m_lineBuffer.clear(); - } -} - -void protocol_HTTPStyle::state_Close() throw(exception) -{ - m_result.done(); -} - -// send buffer text -void protocol_HTTPStyle::state_Send() throw(exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPStyle::sendMessageAndClose(const utf8 &msg) throw() -{ - m_outMsg = msg; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PUBLIC_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_HTTPStyle::state_Send; - m_nextState = &protocol_HTTPStyle::state_Close; - m_result.write(); - m_result.run(); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////// - -utf8 protocol_HTTPStyle::getPlayedBody(const streamData::streamID_t sid) -{ - utf8 body = "" - ""; - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - if (songHistory.empty()) - { - body += ""; - } - else - { - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - char buf[1024] = {0}; - struct tm lt; - time_t t = (*i).m_when; - ::localtime_s(<, &t); - snprintf(buf, sizeof(buf) - 1, "%02d:%02d:%02d", lt.tm_hour, lt.tm_min, lt.tm_sec); - body += "" + - (i == songHistory.begin() ? (streamData::isSourceConnected(sid) ? - "" : "") : "") + ""; - } - } - - body += "
Played @Song Title
No Songs Played
" + utf8(buf) + "" + getCurrentSong((*i).m_title) + "Current Song
"; - return body; -} - -// played history page -void protocol_HTTPStyle::path_played_html(const streamData::streamID_t sid, const utf8 &XFF) throw() -{ - cacheItem *item = m_htmlPlayedCache[sid]; - if (getCachedResponse(item, m_htmlPlayedLock)) - { - return; - } - - utf8 header = MSG_NO_CLOSE_200, - body = getStreamHeader(sid, "Stream History"); - - if (gOptions.getSongHistorySize(sid)) - { - body += getStreamMiddlePlayingHeader(sid); - } - - if (isAccessAllowed(sid, XFF) == true) - { - body += getStreamMiddleListenHeader(sid); - } - - body += getStreamEndHeader(sid) + getPlayedBody(sid) + getIEFlexFix() + getfooterStr(); - - sendCachedResponse(item, m_htmlPlayedCache, m_htmlPlayedLock, header, body, sid); -} - -utf8 protocol_HTTPStyle::getPlayedJSON(const streamData::streamID_t sid, utf8 &header, - const utf8 &callback, const bool allowed) throw() -{ - const bool jsonp = !callback.empty(); - header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n"; - utf8 body = (jsonp ? callback + "(" : "") + "["; - - if (allowed) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - bool first = true; - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += (!first ? utf8(",") : "") + "{\"playedat\":" + - tos((*i).m_when) + "," "\"title\":\"" + escapeJSON((*i).m_title) + "\"" - ",\"metadata\":" + getCurrentJSONMetadataBody((*i).m_metadata) + "}"; - first = false; - } - } - - return (body + "]" + (jsonp ? utf8(")") : "")); -} - -void protocol_HTTPStyle::path_played_json(const streamData::streamID_t sid, const utf8 &callback, - const bool password, const utf8 &XFF) throw() -{ - cacheItem *item = m_jsonPlayedCache[sid]; - if (getCachedResponse(item, m_jsonPlayedLock)) - { - return; - } - - const bool jsonp = !callback.empty(); - utf8 header, body = getPlayedJSON(sid, header, callback, (password || (isAccessAllowed(sid, XFF) == true))); - sendCachedResponse(item, m_jsonPlayedCache, m_jsonPlayedLock, header, body, sid, jsonp); -} - -utf8 protocol_HTTPStyle::getPlayedXML(const streamData::streamID_t sid, utf8 &header, const bool allowed) throw() -{ - header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n"; - utf8 body = "" - ""; - - if (allowed) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += "" + tos((*i).m_when) + "" - "" + aolxml::escapeXML((*i).m_title) + "" + - getCurrentXMLMetadataBody(true, (*i).m_metadata) + ""; - } - } - - return (body + ""); -} - -void protocol_HTTPStyle::path_played_xml(const streamData::streamID_t sid, - const bool password, const utf8 &XFF) throw() -{ - cacheItem *item = m_xmlPlayedCache[sid]; - if (getCachedResponse(item, m_xmlPlayedLock)) - { - return; - } - - utf8 header, body = getPlayedXML(sid, header, (password || (isAccessAllowed(sid, XFF) == true))); - sendCachedResponse(item, m_xmlPlayedCache, m_xmlPlayedLock, header, body, sid); -} - -// flash x-domain file -void protocol_HTTPStyle::path_crossdomain() throw() -{ - cacheItem *item = m_crossdomainCache[0]; - if (getCachedResponse(item, m_crossdomainLock, 86400)) // 1 day - { - return; - } - - // return either the current song or the next song to be played (if known) - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/x-cross-domain-policy\r\n", - body = gOptions.getCrossDomainFile(!!m_compressed); - - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_crossdomainStrGZ.empty()) - { - header += "Content-Encoding:gzip\r\n"; - body = gOptions.m_crossdomainStrGZ; - } - - sendCachedResponse(item, m_crossdomainCache, m_crossdomainLock, header, body); -} - -// flash swf file (assumes shoutcast.swf for ease of implementation / consistency) -void protocol_HTTPStyle::path_shoutcastswf() throw() -{ - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/x-shockwave-flash\r\n", - body = gOptions.getShoutcastSWF(!!m_compressed); - - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_shoutcastSWFStrGZ.empty()) - { - header += "Content-Encoding:gzip\r\n"; - body = gOptions.m_crossdomainStrGZ; - } - - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_HTTPStyle::path_redirect_url(const streamData::streamID_t sid, const bool no_sid, const bool isStats) throw() -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - const utf8 redirectUrl = gOptions.getStreamRedirectURL((no_sid ? 0 : sid), isStats, !info.m_streamURL.empty(), !!m_compressed); - if (redirectUrl.empty()) - { - // try to redirect directly to the appropriate page based on the number of active streams - streamData::streamID_t lastSID = 0; - if (streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(lastSID), !!m_compressed)); - } - else - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - } - } - else - { - sendMessageAndClose(redirectUrl); - } -} - -void protocol_HTTPStyle::path_root_summary(const utf8 &XFF, const bool force) throw() -{ - // if enabled then we need to block access to this page as it's not allowed to be public - if (gOptions.getStreamHideStats(0) == "all") - { - path_redirect_url(0, true, false); - } - else - { - utf8 header = MSG_NO_CLOSE_200, - body = "" - "" - ""\ - "Shoutcast Server" - "" - "" - "" - "" - "" - "
Shoutcast Streams Status
" - "Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "" - "
" - "" - "" - "
 Help  |  " - " DocumentationServer Login " - "\"Server" - "  
"; - - utf8 streamBody = ""; - size_t total = 0, known = streamData::totalStreams(); - - if (known > 0) - { - --known; // just makes it easier to know when to insert the


element - - size_t inc = 0; - streamData::streamID_t sid = 0; - do - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo((sid = streamData::enumStreams(inc)), info, extra)) - { - // increment our stream total now that we know we have one - ++total; - - utf8 tooltip = streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : - "unknown") + " kbps" + (info.m_vbr ? " (VBR)" : "") + - ", " + sampleRateStr(info.m_streamSampleRate); - - streamBody += "" - "Stream #" + tos(sid) + " " - "(Stream Login)"; - - if (isAccessAllowed(sid, XFF) == true) - { - streamBody += " " - "\"Listen"; - - streamBody += " " - "\"History""; - } - - streamBody += "" + (info.m_streamPublic && extra.ypConnected ? - "" + aolxml::escapeXML(info.m_streamName) + "" : - (info.m_streamURL.empty() ? aolxml::escapeXML(info.m_streamName) : - urlLink(info.m_streamURL, info.m_streamName))) + "" - "" + tooltip + ""; - - if (!getHideState(sid)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - streamBody += "" + tos(data.connectedListeners) + - (maxUsers > 0 ? " of " + tos(maxUsers) : "") + " listeners" + - (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? - (" (" + tos(data.uniqueListeners) + " unique)") : "") + ""; - } - - if (!info.m_currentSong.empty()) - { - streamBody += "Playing Now: " - "" + - getCurrentSong(info.m_currentSong) + ""; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - streamBody += "Playing Next: " + aolxml::escapeXML(info.m_comingSoon) + ""; - } - } - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - streamBody += streamData::getHTML5Player(sid); - } - - if (inc < known) - { - // this allows us to only add between - // blocks and not below the very last - streamBody += "
"; - } - } - ++inc; - } - while (sid); - } - - // if only 1 stream is active then behave like a v1 DNAS and show that stream's summary page - if (total == 1 && !force) - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - } - else - { - body += "" - "
" - "Available Streams: " + tos(total) + "

" + - getNewVersionMessage() + - "" - // if there are any streams then we can add them in now we have the real total and finish off the page - "" + streamBody + "
" + - getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - } -} - -// main admin page -void protocol_HTTPStyle::path_root(const streamData::streamID_t sid, const utf8 &XFF) throw() -{ - // if enabled then we need to block access to this page as it's not allowed to be public - if (gOptions.getStreamHideStats(sid) == "all") - { - path_redirect_url(sid, false, false); - } - else - { - utf8 header = MSG_NO_CLOSE_200, - body = getStreamHeader(sid, "Stream Status"); - - if (gOptions.getSongHistorySize(sid)) - { - body += getStreamMiddlePlayingHeader(sid); - } - - if (isAccessAllowed(sid, XFF) == true) - { - body += getStreamMiddleListenHeader(sid); - } - - body += getStreamEndHeader(sid) + "" - "
Current Stream " - "Information

" + getNewVersionMessage(); - - stats::statsData_t data; - stats::getStats(sid, data); - - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo(sid, info, extra)) - { - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - body += "" - "" - "" - "" - ""; - - if (data.peakListeners > 0) - { - body += ""; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "" - ""; - } - - body += ""; - - if (!info.m_streamGenre[0].empty()) - { - body += "" - ""; - } - - if (!info.m_streamURL.empty()) - { - body += "" - ""; - } - - if (!info.m_currentSong.empty()) - { - body += "" - ""; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - body += "" - ""; - } - } - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - body += streamData::getHTML5Player(sid); - } - - body += "
Listing Status: Stream is currently up " + - (info.m_streamPublic && isListable ? (!extra.ypConnected ? "" : utf8("and public")) : utf8("and private (not listed)")) + - (info.m_streamPublic && isListable ? (!extra.ypConnected ? - (extra.ypErrorCode == -1 ? "but unable to access the Directory.
Listeners are allowed and the stream will act like it is private until resolved." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "but received a Directory maintenance notification.
Listeners are allowed to connect and the stream will act like it is private." : - (!info.m_authHash.empty() ? - (extra.ypErrorCode != YP_NOT_VISIBLE ? "but is waiting on a Directory response." : "but is not visible on the internet " - "(YP error code: " + - tos(extra.ypErrorCode) + ").
Listeners are allowed and the stream will act like it is private until resolved.

" - "Resolving this issue will allow the stream to be listed in the Shoutcast Directory.") : - "but requires registration in the Shoutcast Directory.
" - "Listeners are allowed and the stream will act like it is private until resolved."))) : "") : "") + "
Stream Status: Stream is up (" + streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ") with " + - tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") + "
Listener Peak: " + - tos(data.peakListeners) + "
Avg. Play Time: " + avgTime + "
Stream Name: " + - (info.m_streamPublic && extra.ypConnected ? - "" + - aolxml::escapeXML(info.m_streamName) + "" : - aolxml::escapeXML(info.m_streamName)) + "
Stream Genre(s): " + (info.m_streamPublic && extra.ypConnected ? - "" + - aolxml::escapeXML(info.m_streamGenre[0]) + "" : - aolxml::escapeXML(info.m_streamGenre[0])) + ""; - - for (int i = 1; i < 5; i++) - { - if (!info.m_streamGenre[i].empty()) - { - body += " , " + (info.m_streamPublic && extra.ypConnected ? "" + aolxml::escapeXML(info.m_streamGenre[i]) + "" : - aolxml::escapeXML(info.m_streamGenre[i])) + ""; - } - } - - body += "
Stream Website: " + urlLink(info.m_streamURL) + "
Playing Now: " + - getCurrentSong(info.m_currentSong) + "
Playing Next: " + - aolxml::escapeXML(info.m_comingSoon) + "
"; - } - else - { - body += ""; - - if (data.peakListeners > 0) - { - body += ""; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "" - ""; - } - - body += "
Stream Status: "; - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - body += "Stream is currently down" + (data.connectedListeners > 0 ? - " with " + tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") : ".") + "
There is no " - "source connected or no stream is configured for stream #" + tos(sid); - } - else - { - body += "Stream has been moved to " + urlLink(movedUrl); - } - body += "
Listener Peak: " + - tos(data.peakListeners) + "
Avg. Play Time: " + avgTime + "
"; - } - - body += getIEFlexFix() + getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } -} - -// redirect to stream URL -void protocol_HTTPStyle::path_home(const streamData::streamID_t sid) throw() -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 streamUrl = (!info.m_streamURL.empty() ? - ((info.m_streamURL.find(utf8("://")) == utf8::npos ? "http://" : "") + - info.m_streamURL) : "http://www.shoutcast.com"); - - sendMessageAndClose(redirect(streamUrl, !!m_compressed)); -} - -void protocol_HTTPStyle::path_track(const streamData::streamID_t sid, const int mode) throw() -{ - // this is a non-compressed response as most normal titles aren't - // long enough or contain enough data sans gzip header and footer - // to make it worth trying to create a gzipped response for this. - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/plain;charset=utf-8\r\n", currentSong, comingSoon; - std::vector nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - // return either the current song or the next song to be played (if known) - utf8 body = (!mode ? (currentSong.empty() ? "" : currentSong) : - (!currentSong.empty() ? comingSoon : "")); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose(header + "\r\n"); - } -} - -void protocol_HTTPStyle::path_tracks_json(const streamData::streamID_t sid, const utf8 &callback) throw() -{ - cacheItem *item = m_jsonTracksCache[sid]; - if (getCachedResponse(item, m_jsonTracksLock)) - { - return; - } - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + "[", currentSong, comingSoon; - std::vector nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - int index = 1; - for (std::vector::const_iterator i = nextSongs.begin(); i != nextSongs.end(); ++i, index++) - { - body += (i != nextSongs.begin() ? utf8(",") : "") + - "{\"title\":\"" + escapeJSON((*i).empty() ? "" : (*i)) + "\"}"; - } - } - - body += utf8("]") + (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonTracksCache, m_jsonTracksLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_tracks_xml(const streamData::streamID_t sid) throw() -{ - cacheItem *item = m_xmlTracksCache[sid]; - if (getCachedResponse(item, m_xmlTracksLock)) - { - return; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - "", currentSong, comingSoon; - std::vector nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - int index = 1; - for (std::vector::const_iterator i = nextSongs.begin(); i != nextSongs.end(); ++i, index++) - { - body += "" + aolxml::escapeXML(*i) + ""; - } - } - - body += ""; - - sendCachedResponse(item, m_xmlTracksCache, m_xmlTracksLock, header, body, sid); -} - -uniString::utf8 protocol_HTTPStyle::getCurrentXMLMetadataBody(const bool mode, const utf8 &metadata) -{ - utf8 body = (!mode ? "" : ""); - - if (!metadata.empty()) - { - // strip out the metadata between the part - // so it'll instead go in our own part - const utf8::size_type pos1 = metadata.find(METADATA), // 10 chars - pos2 = metadata.find(E_METADATA); // 11 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - body += stripWhitespace(metadata.substr(pos1 + 10, pos2 - pos1 - 10)); - } - } - - return (body + (!mode ? "" : "")); -} - -void protocol_HTTPStyle::path_current_metadata_xml(const streamData::streamID_t sid) throw() -{ - cacheItem *item = m_xmlMetadataCache[sid]; - if (getCachedResponse(item, m_xmlMetadataLock)) - { - return; - } - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - "" + getCurrentXMLMetadataBody(false, - (!songHistory.empty() ? songHistory[0].m_metadata : "")) + - ""; - - sendCachedResponse(item, m_xmlMetadataCache, m_xmlMetadataLock, header, body, sid); -} - -uniString::utf8 protocol_HTTPStyle::getCurrentJSONMetadataBody(const utf8 &metadata) -{ - utf8 body = "{"; - - if (!metadata.empty()) - { - // strip out the metadata between the part - // so it'll instead go in our own part - const utf8::size_type pos1 = metadata.find(METADATA), // 10 chars - pos2 = metadata.find(E_METADATA); // 11 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - // take the xml metadata, create a new xml block from it - const utf8 meta = "" + - stripWhitespace(metadata.substr(pos1 + 10, pos2 - pos1 - 10)) + ""; - - // then split down into node+text to be able to output - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(meta); - if (n) - { - for (aolxml::node::const_childIterator_t i = n->childrenBegin(); i != n->childrenEnd(); ++i) - { - const utf8 node = toLower((*i)->name()); - body += (i != n->childrenBegin() ? utf8(",") : "") + - "\"" + escapeJSON(node) + - "\":" + ((*i)->childrenEmpty() ? "\"" + escapeJSON((*i)->pcdata()) + "\"" : ""); - // if we've got a child block it should be and so parse out - if (!(*i)->childrenEmpty()) - { - body += "["; - for (aolxml::node::const_childIterator_t c = (*i)->childrenBegin(); c != (*i)->childrenEnd(); ++c) - { - const utf8 nodec = toLower((*c)->name()) + (*c)->findAttributeString("seq"); - body += (c != (*i)->childrenBegin() ? utf8(",") : "") + - "{\"" + escapeJSON(nodec) + - "\":" + ((*c)->childrenEmpty() ? "\"" + escapeJSON((*c)->pcdata()) + "\"" : "") + "}"; - } - body += "]"; - } - } - } - } - catch(const exception &) - { - } - forget(n); - } - } - - return (body + "}"); -} - -void protocol_HTTPStyle::path_current_metadata_json(const streamData::streamID_t sid, const utf8 &callback) throw() -{ - cacheItem *item = m_jsonMetadataCache[sid]; - if (getCachedResponse(item, m_jsonMetadataLock)) - { - return; - } - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - getCurrentJSONMetadataBody((!songHistory.empty() ? songHistory[0].m_metadata : "")) + - (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonMetadataCache, m_jsonMetadataLock, header, body, sid, jsonp); -} - -utf8 protocol_HTTPStyle::getStatsXMLBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy) -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - if (!no_copy) - { - stats::getStats(sid, data); - } - - size_t maxUsers = gOptions.maxUser(); - - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - maxUsers = ((stream.m_maxStreamUser > 0) && (stream.m_maxStreamUser < gOptions.maxUser()) ? stream.m_maxStreamUser : gOptions.maxUser()); - } - - utf8 body = "" + tos(data.connectedListeners) + "" - "" + tos(data.peakListeners) + "" - "" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "" - "" + tos(data.uniqueListeners) + "" - "" + tos(data.avgUserListenTime) + ""; - - for (int n = 0; n < 5; n++) - { - const utf8 num = (n ? tos(n + 1) : ""); - body += "" + aolxml::escapeXML(info.m_streamGenre[n]) + ""; - } - - body += "" + aolxml::escapeXML(info.m_streamURL) + "" - "" + aolxml::escapeXML(info.m_streamName) + "" - "" + aolxml::escapeXML(info.m_currentSong.empty() ? "" : info.m_currentSong) + ""; - - if (!info.m_comingSoon.empty()) - { - body += "" + aolxml::escapeXML(info.m_comingSoon) + ""; - } - - if (!info.m_streamUser.empty()) - { - body += "" + aolxml::escapeXML(info.m_streamUser) + ""; - } - - if (!info.m_currentURL.empty()) - { - body += "" + aolxml::escapeXML(info.m_currentURL) + ""; - } - - body += "" + tos(data.totalStreamHits) + "" - "" + (extra.isConnected ? "1" : "0") + "" - "" + (extra.isBackup ? "1" : "0") + "" - "" + (extra.ypConnected ? "1" : "0") + ""; - if (!extra.ypConnected) - { - body += "" + tos(extra.ypErrorCode) + ""; - } - - // if a source is connected and we have a valid password then output this - if (proceed && extra.isConnected) - { - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr, port, hostName)) - { - srcAddr = hostName + " (" + (src) + ")"; - } - } - } - - body += "" + aolxml::escapeXML(srcAddr) + ""; - - if (!info.m_backupURL.empty()) - { - body += "" + aolxml::escapeXML(info.m_backupURL) + ""; - } - } - - body += "" + aolxml::escapeXML(getStreamPath(sid)) + "" + - (extra.isConnected ? ("" + tos(::time(NULL) - streamData::getStreamUptime(sid)) + "") : "") + - "" + tos(info.m_streamBitrate) + "" - "" + tos(info.m_streamSampleRate) + "" + - (info.m_vbr ? "1" : "") + - "" + aolxml::escapeXML(info.m_contentType) + ""; - - if (single) - { - body += "" + aolxml::escapeXML(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")"; - } - - return body; -} - -void protocol_HTTPStyle::path_stats_xml(streamData::streamID_t sid, bool proceed) throw() -{ - cacheItem *item = m_xmlStatsCache[sid]; - if (getCachedResponse(item, m_xmlStatsLock)) - { - return; - } - - stats::statsData_t data; - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - "" + getStatsXMLBody(sid, true, proceed, m_socket, data) + ""; - - sendCachedResponse(item, m_xmlStatsCache, m_xmlStatsLock, header, body, sid); -} - -void protocol_HTTPStyle::path_statistics_xml(streamData::streamID_t sid, bool proceed) throw() -{ - cacheItem *item = m_xmlStatisticsCache[sid]; - if (getCachedResponse(item, m_xmlStatisticsLock)) - { - return; - } - - // this will generate a DNAS wide statistics report making it clearer on what is / isn't going on (requested by WaveStreaming) - size_t totalConnectedListeners = 0, - totalPeakListeners = 0, - totalMoved = 0; - time_t totalAvgUserListenTime = 0; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(2); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - utf8 block = ""; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment the system wide totals - totalConnectedListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - totalAvgUserListenTime += data.avgUserListenTime; - - block += "" + getStatsXMLBody((*i), false, proceed, m_socket, data, true) + ""; - } - else - { - ++totalMoved; - } - } - - const int maxUsers = gOptions.maxUser(); - streamData::streamID_t lastSID = 0; - const utf8 main = "" - "" + tos(streamIds.size() - totalMoved) + "" - "" + tos(streamData::totalActiveStreams(lastSID)) + "" - "" + tos(totalConnectedListeners) + "" - "" + tos(totalPeakListeners) + "" - "" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "" - "" + tos(stats::getTotalUniqueListeners()) + "" - "" + tos(totalConnectedListeners > 0 ? - (totalAvgUserListenTime / totalConnectedListeners) : 0) + "" - "" + aolxml::escapeXML(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")"; - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - "" + main + block + ""; - - sendCachedResponse(item, m_xmlStatisticsCache, m_xmlStatisticsLock, header, body, sid); -} - -utf8 protocol_HTTPStyle::getStatsJSONBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy) -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - if (!no_copy) - { - stats::getStats(sid, data); - } - - size_t maxUsers = gOptions.maxUser(); - - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - maxUsers = ((stream.m_maxStreamUser > 0) && (stream.m_maxStreamUser < gOptions.maxUser()) ? stream.m_maxStreamUser : gOptions.maxUser()); - } - - utf8 body = (!single ? "\"id\":" + tos(sid) + "," : "") + - "\"currentlisteners\":" + tos(data.connectedListeners) + "," - "\"peaklisteners\":" + tos(data.peakListeners) + "," - "\"maxlisteners\":" + (maxUsers > 0 ? tos(maxUsers) : "\"unlimited\"") + "," - "\"uniquelisteners\":" + tos(data.uniqueListeners) + "," - "\"averagetime\":" + tos(data.avgUserListenTime) + ","; - - for (int n = 0; n < 5; n++) - { - const utf8 num = (n ? tos(n + 1) : ""); - body += "\"servergenre" + num + "\":\"" + aolxml::escapeXML(info.m_streamGenre[n]) + "\","; - } - - body += "\"serverurl\":\"" + escapeJSON(info.m_streamURL) + "\"," - "\"servertitle\":\"" + escapeJSON(info.m_streamName) + "\"," - "\"songtitle\":\"" + escapeJSON(info.m_currentSong.empty() ? "" : info.m_currentSong) + "\","; - - if (!info.m_comingSoon.empty()) - { - body += "\"nexttitle\":\"" + escapeJSON(info.m_comingSoon.empty() ? "" : info.m_comingSoon) + "\","; - } - - if (!info.m_streamUser.empty()) - { - body += "\"dj\":\"" + escapeJSON(info.m_streamUser) + "\","; - } - - if (!info.m_streamUser.empty()) - { - body += "\"songurl\":\"" + escapeJSON(info.m_currentURL) + "\","; - } - - body += "\"streamhits\":" + tos(data.totalStreamHits) + "," - "\"streamstatus\":" + (extra.isConnected ? "1" : "0") + "," - "\"backupstatus\":" + (extra.isBackup ? "1" : "0") + "," - "\"streamlisted\":" + (extra.ypConnected ? "1" : "0") + ","; - if (!extra.ypConnected) - { - body += "\"streamlistederror\":" + tos(extra.ypErrorCode) + ","; - } - - // if a source is connected and we have a valid password then output this - if (proceed && extra.isConnected) - { - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr, port, hostName)) - { - srcAddr = hostName + " (" + (src) + ")"; - } - } - } - - body += "\"streamsource\":\"" + escapeJSON(srcAddr) + "\","; - - if (!info.m_backupURL.empty()) - { - body += "\"streambackup\":\"" + escapeJSON(info.m_backupURL) + "\","; - } - } - - body += "\"streampath\":\"" + escapeJSON(getStreamPath(sid)) + "\"," + - (extra.isConnected ? ("\"streamuptime\":" + tos(::time(NULL) - streamData::getStreamUptime(sid)) + ",") : "") + - "\"bitrate\":\"" + tos(info.m_streamBitrate) + "\"," - "\"samplerate\":\"" + tos(info.m_streamSampleRate) + "\"," + - (info.m_vbr ? "\"vbr\":\"1\"," : "") + - "\"content\":\"" + escapeJSON(info.m_contentType) + "\""; - - if (single) - { - body += ",\"version\":\"" + escapeJSON(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")\""; - } - - return body; -} - -void protocol_HTTPStyle::path_stats_json(const streamData::streamID_t sid, const bool proceed, const utf8 &callback) throw() -{ - const bool jsonp = !callback.empty(); - cacheItem *item = m_jsonStatsCache[sid]; - if (getCachedResponse(item, m_jsonStatsLock)) - { - return; - } - - stats::statsData_t data; - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + "{" + - getStatsJSONBody(sid, true, proceed, m_socket, data) + - "}" + (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonStatsCache, m_jsonStatsLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_statistics_json(const streamData::streamID_t sid, const bool proceed, const utf8 &callback) throw() -{ - const bool jsonp = !callback.empty(); - cacheItem *item = m_jsonStatisticsCache[sid]; - if (getCachedResponse(item, m_jsonStatisticsLock)) - { - return; - } - - // this will generate a DNAS wide statistics report making it clearer on what is / isn't going on (requested by WaveStreaming) - size_t totalConnectedListeners = 0, - totalPeakListeners = 0, - totalMoved = 0; - time_t totalAvgUserListenTime = 0; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(2); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - utf8 block = ""; - bool read = false; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment the system wide totals - totalConnectedListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - totalAvgUserListenTime += data.avgUserListenTime; - - block += (read ? utf8(",") : "") + "{" + getStatsJSONBody((*i), false, proceed, m_socket, data, true) + + "}"; - read = true; - } - else - { - ++totalMoved; - } - } - - streamData::streamID_t lastSID = 0; - const size_t total = streamIds.size() - totalMoved, - activeTotal = streamData::totalActiveStreams(lastSID), - maxUser = gOptions.maxUser(); - const utf8 main = "\"totalstreams\":" + tos(total) + "," - "\"activestreams\":" + tos(activeTotal) + "," - "\"currentlisteners\":" + tos(totalConnectedListeners) + "," - "\"peaklisteners\":" + tos(totalPeakListeners) + "," - "\"maxlisteners\":" + (maxUser > 0 ? tos(maxUser) : "\"unlimited\"") + "," - "\"uniquelisteners\":" + tos(stats::getTotalUniqueListeners()) + "," - "\"averagetime\":" + tos(totalConnectedListeners > 0 ? (totalAvgUserListenTime / totalConnectedListeners) : 0) + "," - "\"version\":\"" + escapeJSON(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")\"" + - (total > 0 ? ",\"streams\":[" : ""); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - "{" + main + block + (total > 0 ? "]" : "") + "}" + - (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonStatisticsCache, m_jsonStatisticsLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_art(const streamData::streamID_t sid, int mode) throw() -{ - cacheItem *item = (!mode ? m_streamArtCache[sid] : m_playingArtCache[sid]); - if (getCachedResponse(item, (!mode ? m_streamArtLock : m_playingArtLock))) - { - return; - } - - utf8 header = "HTTP/1.0 200 OK\r\n", body; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - vector<__uint8> sc21_albumart = (mode == 0 ? sd->streamAlbumArt() : sd->streamPlayingAlbumArt()); - if (!sc21_albumart.empty()) - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - const size_t mime = (mode == 0 ? sd->streamAlbumArtMime() : sd->streamPlayingAlbumArtMime()); - // if not in the valid range then don't report the mime type in the generated response - if (mime < 4) - { - header += "Content-Type:" + mimeType[mime] + "\r\n"; - } - body += utf8(&sc21_albumart[0],sc21_albumart.size()); - } - sd->releaseStream(); - } - - sendCachedResponse(item, (!mode ? m_streamArtCache : m_playingArtCache), - (!mode ? m_streamArtLock : m_playingArtLock), header, - body, sid, false, false); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h deleted file mode 100644 index 88d04660..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h +++ /dev/null @@ -1,152 +0,0 @@ -#pragma once -#ifndef protocol_HTTPStyle_H_ -#define protocol_HTTPStyle_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "cache.h" -#include "stats.h" -#include - -/* - Runnable object that handles protocols which use the HTTP style - negotiation. Depending on the details this object will hand off - to others (actually HTTP get or maybe audio streaming) -*/ - -class protocol_HTTPStyle : public runnable -{ -friend class protocol_shoutcastClient; - -public: - enum { - ACCEPT_PLAIN = 0, - ACCEPT_GZIP = 1, - ACCEPT_DEFLATE = 2 - }; - - enum { - HTTP_UNKNOWN = -1, - HTTP_GET = 0, - HTTP_POST = 1, - HTTP_HEAD = 2 - }; - - struct HTTPRequestInfo - { - int m_request; // HTTP_GET, HTTP_POST, etc - int m_AcceptEncoding; // the received 'Accept-Encoding' values - uniString::utf8 m_url; // url portion of request, unescaped - ////////////////////////////// - httpHeaderMap_t m_QueryParameters; // unescaped - httpHeaderMap_t m_HTTPHeaders; // the received HTTP headers - uniString::utf8 m_PostLine; // received POST line - - HTTPRequestInfo() : m_request(HTTP_UNKNOWN), m_AcceptEncoding(ACCEPT_PLAIN) {} - }; - - const u_short m_clientPort; - const uniString::utf8 m_clientHostName; - const uniString::utf8 m_clientAddr; - const uniString::utf8 m_clientLogString; - -private: - microServer::AllowableProtocols_t m_protocols; - HTTPRequestInfo m_httpRequestInfo; - uniString::utf8 m_userAgent; - uniString::utf8 m_userAgentLowered; - uniString::utf8 m_referer; - uniString::utf8 m_hostIP; - uniString::utf8 m_url; - - uniString::utf8 m_outMsg; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - int m_postRequestLength; - - short m_postRequest; - short m_compressed; - - uniString::utf8 m_lastKey; // received HTTP header line key (used to cope with some weird line splits) - uniString::utf8 m_lineBuffer; // received HTTP header line - - typedef void (protocol_HTTPStyle::*state_t)(); - - state_t m_state; - state_t m_nextState; - - const bool getCachedResponse(cacheItem *item, AOL_namespace::mutex &lock, const int limit = 1); - void sendCachedResponse(cacheItem *item, CacheMap_t &cache, AOL_namespace::mutex &lock, - uniString::utf8 &header, uniString::utf8 &body, - const streamData::streamID_t sid = 0, - const bool jsonp = false, const bool noCompress = false); - - void sendMessageAndClose(const uniString::utf8 &msg) throw(); - - void state_GetLine() throw(std::exception); - void state_AnalyzeHTTPHeaders() throw(std::exception); - void state_DetermineAction() throw(std::exception); - void state_Close() throw(std::exception); - void state_Send() throw(std::exception); - - void path_redirect_url(const streamData::streamID_t sid, const bool no_sid, const bool isStats) throw(); - void path_root_summary(const uniString::utf8 &XFF, const bool force = false) throw(); - void path_root(const streamData::streamID_t sid, const uniString::utf8 &XFF) throw(); - void path_played_html(const streamData::streamID_t sid, const uniString::utf8 &XFF) throw(); - void path_played_json(const streamData::streamID_t sid, const uniString::utf8 &callback, - const bool password = true, const uniString::utf8 &XFF = "") throw(); - void path_played_xml(const streamData::streamID_t sid, const bool password = true, - const uniString::utf8 &XFF = "") throw(); - void path_home(const streamData::streamID_t sid) throw(); - void path_track(const streamData::streamID_t sid, int mode) throw(); - void path_tracks_json(const streamData::streamID_t sid, const uniString::utf8 &callback) throw(); - void path_tracks_xml(const streamData::streamID_t sid) throw(); - void path_current_metadata_xml(const streamData::streamID_t sid) throw(); - void path_current_metadata_json(const streamData::streamID_t sid, const uniString::utf8 &callback) throw(); - void path_crossdomain() throw(); - void path_shoutcastswf() throw(); - void path_stats_xml(const streamData::streamID_t sid, const bool proceed) throw(); - void path_statistics_xml(const streamData::streamID_t sid, const bool proceed) throw(); - void path_stats_json(const streamData::streamID_t sid, const bool proceed, const uniString::utf8 &callback) throw(); - void path_statistics_json(const streamData::streamID_t sid, const bool proceed, const uniString::utf8 &callback) throw(); - void path_art(const streamData::streamID_t sid, const int mode) throw(); - - const bool isViewingAllowed(const streamData::streamID_t sid, const uniString::utf8 &password, const bool no_stream, - bool &adminOverride, const bool hide, bool &passworded) throw(); - const bool isAccessAllowed(const streamData::streamID_t sid, const uniString::utf8 &hostAddr, const bool showOutput) throw(); - const bool isAdminAccessAllowed(const uniString::utf8 &hostIP, const uniString::utf8 &hostName) throw(); - const bool findBaseStream(bool& no_sid, streamData::streamID_t& sid); - const uniString::utf8 getClientIP(const bool streamPublic, const uniString::utf8 &publicIP) throw(); - void getPNGImage(const uniString::utf8 &png) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPStyle"; } - -public: - protocol_HTTPStyle (microConnection &mc, const string &firstLine) throw(std::exception); - - protocol_HTTPStyle(const socketOps::tSOCKET s, const uniString::utf8 &hostName, - const uniString::utf8 &addr, const u_short port, const string &firstLine, - const microServer::AllowableProtocols_t protocols) throw(std::exception); - virtual ~protocol_HTTPStyle() throw(); - - static uniString::utf8 getStatsXMLBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy = false); - static uniString::utf8 getStatsJSONBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy = false); - static uniString::utf8 getPlayedBody(const streamData::streamID_t sid); - - static uniString::utf8 getCurrentXMLMetadataBody(const bool mode, const uniString::utf8 &metadata); - static uniString::utf8 getCurrentJSONMetadataBody(const uniString::utf8 &metadata); - - static uniString::utf8 getPlayedJSON(const streamData::streamID_t sid, uniString::utf8 &header, - const uniString::utf8 &callback, const bool allowed) throw(); - static uniString::utf8 getPlayedXML(const streamData::streamID_t sid, uniString::utf8 &header, const bool allowed) throw(); -}; - -const uniString::utf8 getNewVersionMessage(const uniString::utf8& ending = "


"); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp deleted file mode 100644 index b0c5e136..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp +++ /dev/null @@ -1,1681 +0,0 @@ -#if 0 -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_RTMPClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "amf.h" -#include "w3cLog.h" -#include "log.h" -#include "global.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define C1_S1_C2_S2_PACKET_SIZE 1536 -#define DEFAULT_CHUNK_SIZE 128 - -#define RTMP_MSG__SET_CHUNK_SIZE 1 -#define RTMP_MSG__ABORT 2 -#define RTMP_MSG__ACKNOWLEDGEMENT 3 -#define RTMP_MSG__USER_CONTROL_MESSAGE 4 -#define RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE 5 -#define RTMP_MSG__SET_PEER_BANDWIDTH 6 -#define RTMP_MSG__AUDIO_DATA 8 -#define RTMP_MSG__VIDEO_DATA 9 -#define RTMP_MSG__DATA_AMF3 15 -#define RTMP_MSG__COMMAND_AMF3 17 -#define RTMP_MSG__DATA_AMF0 18 -#define RTMP_MSG__COMMAND_AMF0 20 - -// user control messages -#define RTMP_UCM_STREAM_BEGIN 0 -#define RTMP_UCM_STREAM_EOF 1 -#define RTMP_UCM_STREAM_DRY 2 -#define RTMP_UCM_SET_BUFFER 3 -#define RTMP_UCM_STREAM_IS_RECORDED 4 -#define RTMP_UCM_PING_REQUEST 6 -#define RTMP_UCM_PING_RESPONSE 7 -///////////////////////// - -#define RTMP_PEER_BANDWIDTH_HARD 0 -#define RTMP_PEER_BANDWIDTH_SOFT 1 -#define RTMP_PEER_BANDWIDTH_DYNAMIC 2 - -#define DEFAULT_SERVER_WINDOW 0x2625a0 //(16 * 1024) - -#define DEBUG_LOG(x) { if (gOptions.RTMPClientDebug()) DLOG((x)); } - -#ifdef _WIN32 -#define TIMEFUNC ::timeGetTime -#else -#include -static unsigned long TIMEFUNC() throw() -{ - struct timeval tp; - ::gettimeofday(&tp,NULL); - return (tp.tv_sec * 1000) + (tp.tv_usec / 1000); -} -#endif - -static void createRTMPMsg(__uint8 msgType,long timestamp,int outboundChunkSize,const __uint8 *payload,size_t payloadSize,vector<__uint8> &result, - int chunkStreamID = 2,int msgStreamID = 0); -static void createRTMPMsg(const protocol_RTMPClient::message &msg,long timestamp,int outboundChunkSize,vector<__uint8> &result); - -//void getRTMPMsgInfo(const vector<__uint8> &msg,__uint8 &msgType,int &payloadLength,long ×tamp,int &streamID,int &payloadOffset); -static size_t decode4ByteValue(const __uint8 *data,size_t offset = 0) throw(); - -static utf8 prettyPrintMessage(const protocol_RTMPClient::message &msg) throw() -{ - utf8 EOL(eol()); - - utf8 result(EOL); - result += "msg type=" + tos((int)msg.m_messageType) + EOL; - - try - { - switch(msg.m_messageType) - { - case RTMP_MSG__SET_CHUNK_SIZE: - result += "chunk size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__ABORT: - result += "chunk stream id=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__ACKNOWLEDGEMENT: - result += "sequence number=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__USER_CONTROL_MESSAGE: - break; - - case RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE: - result += "acknowledgement window size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__SET_PEER_BANDWIDTH: - result += "acknowledgement window size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - result += "limit type=" + tos(msg.m_messageData[4]) + EOL; - break; - - case RTMP_MSG__DATA_AMF0: - case RTMP_MSG__COMMAND_AMF0: - { - AMFEncoding amf0; - amf0.loadFromBitstream((const char *)&(msg.m_messageData[0]),(int)msg.m_messageData.size(),""); - result += amf0.prettyPrint(); - } - break; - - case RTMP_MSG__DATA_AMF3: - case RTMP_MSG__COMMAND_AMF3: - { - AMFEncoding amf3(3); - amf3.loadFromBitstream((const char *)&(msg.m_messageData[0]),(int)msg.m_messageData.size(),""); - result += amf3.prettyPrint(); - } - break; - } - } - catch(const exception &ex) - { - result += string("Exception: ") + ex.what() + EOL; - DEBUG_LOG(msg.packetDump()); - } - catch(...) - { - result += "Exception: " + EOL; - DEBUG_LOG(msg.packetDump()); - } - - return result; -} - -#define TEST_FILE "C:\\Documents and Settings\\nradisch\\My Documents\\programming\\shoutcast\\current\\sc_serv2\\test.aac" -FILE *fff = 0; - -utf8 protocol_RTMPClient::message::packetDump() const throw() -{ - ostringstream o; - - int x = 0; - for(std::vector<__uint8>::const_iterator i = m_messageData.begin(); i != m_messageData.end(); ++i) - { - if ((x++) % 16 == 0) o << stringUtil::eol(); - o << setw(2) << hex << (int)(*i) << " "; - } - return o.str(); -} - -protocol_RTMPClient::protocol_RTMPClient(socketOps::tSOCKET s,const utf8 &hostName,const utf8 &addr,int port,__uint8 C0)throw(exception) - :m_socket(s),m_clientHostName(hostName),m_clientAddr(addr),m_clientPort(port),m_clientLogString(dstAddrLogString(hostName,port)), - m_C0(C0), - m_S0(3), - m_inDataBuffer(0), - m_lastActivityTime(::time(0)),m_startTime(::time(0)), - m_lastInboundMessageStreamID(-1), - m_lastInboundMessageLength(-1), - m_lastInboundMessageTypeID(-1), - m_lastInboundTimestamp(-1), - m_windowSizeFromClient(-1), - m_bufferSizeFromClient(-1), - m_lastTitleTime(::time(0)), - m_bytesSentForCurrentTitle(0), - m_totalBytesSent(0), - m_objectEncodingMode(0), - m_removeClientFromStats(false), - //m_state(&protocol_RTMPClient::state_AttachToStream), - m_state(&protocol_RTMPClient::state_SendS0), - m_streamData(0) -{ -#ifdef TEST_FILE - if (fff) ::fclose(fff); - fff = 0; - fff = ::fopen(TEST_FILE,"rb"); -#endif - - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferMax = 16 * 1024; - m_inDataBuffer = new __uint8[m_inDataBufferMax]; - m_inDataBufferAmt = 0; - - // intialize s1 to all zeros - m_S1orS2.resize(C1_S1_C2_S2_PACKET_SIZE,0); - memset(&(m_S1orS2[0]),0,m_S1orS2.size()); - - // set base time - m_serverBaseTime = TIMEFUNC(); - __uint32 sbt = htonl(m_serverBaseTime); - memcpy(&(m_S1orS2[0]),&sbt,4); - - // initialize from 10 bytes of random section to random stuff. Faster than - // doing entire 1528 byte block and still valid - for(int x = 0; x < 10; ++x) - { - m_S1orS2[8+x] = rand(); - } - m_outDataPtr = &m_S0; - m_outDataSize = 1; - m_inboundChunkSize = DEFAULT_CHUNK_SIZE; - m_outboundChunkSize = DEFAULT_CHUNK_SIZE; -} - -protocol_RTMPClient::~protocol_RTMPClient() throw() -{ -#ifdef TEST_FILE - if (fff) ::fclose(fff); - fff = 0; -#endif - DEBUG_LOG(__FUNCTION__); - - try - { - /*ILOG(m_clientLogString + " SHOUTcast 1 client connection closed (" + - tos(::time(0) - m_startTime).c_str() + " seconds). " + - mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")) + - " [Bytes: " + tos(m_totalBytesSent).c_str() + "]");*/ - - if (m_removeClientFromStats) - stats::removeClient(m_streamID,this); - if (m_streamData) - { - m_streamData->abandonRTMPLimitTrigger(&m_limitTrigger); - streamData::streamClientLost(m_streamData); - m_streamData = 0; - - logW3C(); - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - - delete [] m_inDataBuffer; - m_streamData = 0; - socketOps::forgetTCPSocket(m_socket); -} - -runnable::timeSliceResult protocol_RTMPClient::timeSlice() throw(exception) -{ - size_t listenerTime = gOptions.stream_listenerTime(DEFAULT_SHOUTCAST_SOURCE_STREAM); - if(!gOptions.read_stream_listenerTime(DEFAULT_SHOUTCAST_SOURCE_STREAM)) - { - listenerTime = gOptions.listenerTime(); - } - - listenerTime *= 60; // convert to seconds - bool timesUp = (listenerTime && ((::time(0) - m_startTime) > (int)listenerTime)); - - if (m_kickNextRound || timesUp || (m_streamData && m_streamData->isDead())) - { - if (timesUp) - { ILOG(m_clientLogString + " listener time exceeded.");} - else if (m_kickNextRound) - { ILOG(m_clientLogString + " kicked");} - timeSliceResult result; - result.m_done = true; - return result; - } - - return (this->*m_state)(); -} - -////////////////////////////////////////////////////////////////////////////////// -///////////////////// Initial Handshake States ////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -runnable::timeSliceResult protocol_RTMPClient::state_Send() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - long to = sendDataBuffer(m_socket,m_outDataPtr,m_outDataSize,m_lastActivityTime,m_clientLogString); - if (to == 0) - { // done - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // some more - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_RecvFixedAmt() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - assert(m_inDataRequested <= m_inDataBufferMax); - - size_t amt_left = m_inDataRequested - m_inDataBufferAmt; - size_t amt_left2 = amt_left; - - long to = getSocketData(m_socket,m_inDataBuffer,m_inDataBufferAmt,amt_left,m_lastActivityTime,m_clientLogString); - m_inDataBufferAmt += (amt_left2 - amt_left); - - if (to == 0) - { // got data - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // wait some more - result.m_readSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_RecvMsg() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - m_inMsg.clear(); - - long to = getMsg(m_inMsg); - - if (to == 0) - { - m_state = m_nextState; - result.m_runImmediately = true; - DEBUG_LOG(string(__FUNCTION__) + " received msg" + prettyPrintMessage(m_inMsg)); - } - else - { - result.m_readSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - - return result; -} - -#define NEXT_STATE timeSliceResult result; result.m_runImmediately = true; return result; - -runnable::timeSliceResult protocol_RTMPClient::state_SendS0() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataPtr = &m_S0; - m_outDataSize = 1; - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendS1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendS1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataPtr = &m_S1orS2[0]; - m_outDataSize = m_S1orS2.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForC1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForC1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_inDataRequested = C1_S1_C2_S2_PACKET_SIZE; - m_state = &protocol_RTMPClient::state_RecvFixedAmt; - m_nextState = &protocol_RTMPClient::state_GotC1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotC1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_C1ReadTime = TIMEFUNC() - m_serverBaseTime; - m_C1.clear(); - m_C1.insert(m_C1.end(),m_inDataBuffer,m_inDataBuffer + C1_S1_C2_S2_PACKET_SIZE); - m_state = &protocol_RTMPClient::state_SendS2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendS2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_S1orS2 = m_C1; - __uint32 t = htonl(m_C1ReadTime); - memcpy(&(m_S1orS2[4]),&t,4); - m_outDataPtr = &m_S1orS2[0]; - m_outDataSize = m_S1orS2.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForC2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForC2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_inDataRequested = C1_S1_C2_S2_PACKET_SIZE; - m_state = &protocol_RTMPClient::state_RecvFixedAmt; - m_nextState = &protocol_RTMPClient::state_GotC2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotC2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_C2.clear(); - m_C2.insert(m_C2.end(),m_inDataBuffer,m_inDataBuffer + C1_S1_C2_S2_PACKET_SIZE); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForMessage() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_state = &protocol_RTMPClient::state_RecvMsg; - m_nextState = &protocol_RTMPClient::state_GotMessage; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotMessage() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - switch(m_inMsg.m_messageType) - { - case RTMP_MSG__USER_CONTROL_MESSAGE: - return handle_USER_CONTROL_message(); - - case RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE: - { - if (m_inMsg.m_messageData.size() != 4) - throwEx(m_clientLogString + " Bad payload size for Window Acknowledgement message, got " + tos(m_inMsg.m_messageData.size()) + " expected 4."); - m_windowSizeFromClient = decode4ByteValue(&(m_inMsg.m_messageData[0]),0); - - DEBUG_LOG(m_clientLogString + " WAS from client is " + tos(m_windowSizeFromClient)); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE - } - break; - - case RTMP_MSG__COMMAND_AMF0: - return handle_AMF0_message(); - - default: - throwEx(m_clientLogString + " " + __FUNCTION__ + " cannot dispatch message type " + tos((int)m_inMsg.m_messageType)); - } - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_USER_CONTROL_message() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - if (m_inMsg.m_messageData.size() < 2) - throwEx(m_clientLogString + " User control message has insufficient data."); - - __uint16 t = ntohs(*(const __uint16 *)(&m_inMsg.m_messageData[0])); - switch(t) - { - case RTMP_UCM_SET_BUFFER: - { - if (m_inMsg.m_messageData.size() < 10) - throwEx(m_clientLogString + " Set Buffer user control message has insufficient data."); - m_bufferSizeFromClient = ntohl(*(const __uint32*)&(m_inMsg.m_messageData[6])); - DEBUG_LOG(m_clientLogString + " Buffer size from client is " + tos(m_bufferSizeFromClient) + " milliseconds."); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE - } - break; - - case RTMP_UCM_STREAM_BEGIN: - //return handle_UCM_StreamBegin(); - break; - } - - throwEx(m_clientLogString + " User control message type " + tos(t) + " is not supported."); - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_UCM_StreamBegin() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_message() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - AMFEncoding amf; - amf.loadFromBitstream((const char *)&(m_inMsg.m_messageData[0]),(int)m_inMsg.m_messageData.size(),m_clientLogString); - const AMFVal &v0 = amf.getValue(0); - if (v0.getString() == "connect") - return handle_AMF0_connect(amf); - if (v0.getString() == "createStream") - return handle_AMF0_createStream(amf); - if (v0.getString() == "play") - return handle_AMF0_play(amf); - - throwEx(m_clientLogString + " " + __FUNCTION__ + " Unknown AMF0 message " + v0.getString()); - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_connect(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -// const AMFVal &v0 = amf.getValue(0); - const AMFVal &v1 = amf.getValue(1); - const AMFVal &v2 = amf.getValue(2); - - if (v1.getNumber() != 1) - throwEx(m_clientLogString + " Unexpected transaction number. Wanted 1, got " + tos(v1.getNumber())); - const AMFObject &o = v2.getObject(); - - const AMFVal *pv = o.getProperty("tcUrl"); - if (!pv) throwEx(m_clientLogString + " Connect command has no tcUrl value."); - utf8 url = pv->getString(); // use this value to create stream accessor - - pv = o.getProperty("objectEncoding"); - m_objectEncodingMode = (pv ? (int)pv->getNumber() : 0); - - m_state = &protocol_RTMPClient::state_SendConnectResponse; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_createStream(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -// const AMFVal &v0 = amf.getValue(0); - const AMFVal &v1 = amf.getValue(1); - - double transaction = v1.getNumber(); - - AMFEncoding amf0; - AMFObject obj; - amf0.appendValue(AMFVal(utf8("_result"))); // or "_error" - amf0.appendValue(AMFVal((double)transaction)); - amf0.appendValue(AMFVal()); - amf0.appendValue(AMFVal((double)1)); //1234)); /// stream ID for client - - vector<__uint8> resp; - amf0.serialize(resp,m_clientLogString); - message msg(m_inMsg); - msg.m_messageData = resp; - msg.m_messageType = RTMP_MSG__COMMAND_AMF0; - createRTMPMsg(msg,TIMEFUNC() - m_serverBaseTime,(int)m_outboundChunkSize,m_outDataBuffer); - //createRTMPMsg(RTMP_MSG__COMMAND_AMF0,m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForMessage; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_play(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - AMFEncoding amf0; - amf0.appendValue(AMFVal(utf8("onStatus"))); // or "_error" - amf0.appendValue(AMFVal(utf8("NetStream.Play.Start"))); - - vector<__uint8> resp; - amf0.serialize(resp,m_clientLogString); - long ttt = TIMEFUNC(); - - createRTMPMsg(RTMP_MSG__COMMAND_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - amf0.clear(); - amf0.appendValue(AMFVal(utf8("onHeaderData"))); - AMFEMCAArray amfA; - amfA.addProperty("protocol",new AMFVal(utf8("ICY"))); - amfA.addProperty("content-type",new AMFVal(utf8("audio/aacp"))); - amf0.appendValue(AMFVal(amfA)); - resp.clear(); - amf0.serialize(resp,m_clientLogString); - createRTMPMsg(RTMP_MSG__DATA_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendAudio; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendConnectResponse() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataBuffer.clear(); - - __uint8 data[5]; - - long ttt = TIMEFUNC(); - m_serverBaseTime = ttt; - - (*(__uint32*)data) = htonl(DEFAULT_SERVER_WINDOW); - createRTMPMsg(RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,data,4,m_outDataBuffer); - - data[4] = RTMP_PEER_BANDWIDTH_DYNAMIC; //_SOFT; - createRTMPMsg(RTMP_MSG__SET_PEER_BANDWIDTH,ttt - m_serverBaseTime,(int)m_outboundChunkSize,data,5,m_outDataBuffer); - - __uint8 streamBeginData[6] = {0,0,0,0,0,0}; - - createRTMPMsg(RTMP_MSG__USER_CONTROL_MESSAGE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,streamBeginData,6,m_outDataBuffer); - - __int32 chunkSize = htonl((int)m_outboundChunkSize); - createRTMPMsg(RTMP_MSG__SET_CHUNK_SIZE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,(const __uint8 *)&chunkSize,sizeof(chunkSize),m_outDataBuffer); - - AMFEncoding amf; //(m_objectEncodingMode > 1 ? 3 : 0); - AMFObject obj; - amf.appendValue(AMFVal(utf8("_result"))); // or "_error" - amf.appendValue(AMFVal((double)1.0)); - obj.addProperty("fmsVer",new AMFVal(utf8("FMS/3,5,3,824a"))); //new AMFVal(utf8("sc_serv " + version.first + " " + version.second))); - obj.addProperty("capabilities",new AMFVal((double)127)); //31)); // ???? - obj.addProperty("mode",new AMFVal((double)1)); - amf.appendValue(AMFVal(obj)); - obj.clearProperties(); - obj.addProperty("level",new AMFVal(utf8("status"))); - obj.addProperty("code",new AMFVal(utf8("NetConnection.Connect.Success"))); - obj.addProperty("description",new AMFVal(utf8("Connection succeeded."))); - obj.addProperty("clientid",new AMFVal((double)795525197.0)); - obj.addProperty("objectEncoding",new AMFVal((double)m_objectEncodingMode)); - AMFEMCAArray arry; - arry.addProperty("version",new AMFVal(utf8("FMS/3,5,3,824a"))); - obj.addProperty("data",new AMFVal(arry)); - - amf.appendValue(AMFVal(obj)); - vector<__uint8> resp; - amf.serialize(resp,m_clientLogString); - createRTMPMsg(RTMP_MSG__COMMAND_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForMessage; - //m_nextState = &protocol_RTMPClient::state_SendAudio; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendAudio() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -#ifdef TEST_FILE - __uint8 buffer[1024]; - buffer[0] = 0xaf; //FLV audio header - buffer[1] = 0x01; - - if (::fread(&(buffer[2]),1,1022,fff) != 1022) - throwEx("Test done!"); - - m_outDataBuffer.clear(); - createRTMPMsg(RTMP_MSG__AUDIO_DATA,TIMEFUNC() - m_serverBaseTime,(int)m_outboundChunkSize,buffer,1024,m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendAudio; - -#endif - NEXT_STATE -} - -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// - -static void encode3ByteValue(long v,__uint8 *data) throw() -{ - data[0] = (v >> 16) & 0xff; - data[1] = (v >> 8) & 0xff; - data[2] = (v & 0xff); -} - -static void encode4ByteValue(long v,__uint8 *data) throw() -{ - data[0] = (v >> 24) & 0xff; - data[1] = (v >> 16) & 0xff; - data[2] = (v >> 8) & 0xff; - data[3] = (v & 0xff); -} - -static void chunkify(int chunkStreamID,int msgStreamID,__uint8 msgTypeID,long timestamp,int outboundChunkSize,const __uint8 *data,size_t dataSize,vector<__uint8> &result) -{ - assert(chunkStreamID >= 2); - - size_t chunkCount = 1; - if (dataSize > 0) - chunkCount = ((dataSize-1) / outboundChunkSize)+1; - assert(chunkCount); - - for(size_t c = 0; c < chunkCount; ++c) - { - __uint8 header[18]; // largest possible header - __uint8 *h = header; - - // size basic header - if (chunkStreamID >=2 && chunkStreamID <= 63) - { - *(h++) = chunkStreamID; - } - else if (chunkStreamID >= 64 && chunkStreamID <= 319) - { - *(h++) = 0; - *(h++) = (chunkStreamID - 64); - } - else - { - h[0] = 1; - h[2] = ((chunkStreamID - 64) / 256); - h[1] = (chunkStreamID - 64 - (h[2] * 256)); - h+= 3; - } - - // fill in format bits and header - if (c) - { - header[0] |= 0xc0; // type 3 - } - else - { - // type zero, full header - encode3ByteValue(timestamp < 0x00ffffff ? timestamp : 0x00ffffff,h); - h += 3; - encode3ByteValue((int)dataSize,h); - h += 3; - *(h++) = msgTypeID; - encode4ByteValue(msgStreamID,h); - h += 4; - if (timestamp >= 0x00ffffff) - { - encode4ByteValue(timestamp,h); - h += 4; - } - } - - // put header into result - result.insert(result.end(),header,h); - - size_t payload_amt = min(dataSize,(size_t)outboundChunkSize); - // put payload into result - result.insert(result.end(),data,data + payload_amt); - dataSize -= payload_amt; - data += payload_amt; - } - - assert(dataSize == 0); -} - -static void createRTMPMsg(__uint8 msgType,long timestamp,int outboundChunkSize,const __uint8 *payload,size_t payloadSize,vector<__uint8> &result, - int chunkStreamID,int msgStreamID) -{ - //chunkify(chunkStreamID,msgStreamID,msgType,TIMEFUNC(),outboundChunkSize,payload,payloadSize,result); - protocol_RTMPClient::message msg; - msg.m_chunkStreamID = chunkStreamID; - msg.m_messageStreamID = msgStreamID; - msg.m_messageType = msgType; - msg.m_messageData.clear(); - msg.m_messageData.insert(msg.m_messageData.end(),payload,payload + payloadSize); - createRTMPMsg(msg,timestamp,outboundChunkSize,result); - - #if 0 - // create a buffer with the message - long t = TIMEFUNC(); - - vector<__uint8> m; - m.resize(11 + payloadSize); - - __uint8 *p = &m[0]; - memset(p,0,11); - (*(__uint32*)p) = htonl(payloadSize); - p[0] = msgType; - (*(__uint32*)(&(p[4]))) = htonl(t); - memmove(&(p[11]),payload,payloadSize); - - // chunkify - chunkify(2 /* chunk stream id */,0 /* msg stream ID */ ,msgType,t,outboundChunkSize,p,11 + payloadSize,result); - #endif -} - -static void createRTMPMsg(const protocol_RTMPClient::message &msg,long timestamp,int outboundChunkSize,vector<__uint8> &result) -{ - utf8 s = prettyPrintMessage(msg); - DEBUG_LOG(" send " + eol() + - "CSID=" + tos(msg.m_chunkStreamID) + eol() + - "MSID=" + tos(msg.m_messageStreamID) + eol() + - "Time=" + tos(timestamp) + eol() + - "MTYPE=" + tos((int)msg.m_messageType) + eol() + - "MLEN=" + tos(msg.m_messageData.size()) + eol() + - s); - chunkify(msg.m_chunkStreamID,msg.m_messageStreamID,msg.m_messageType,timestamp,outboundChunkSize,&(msg.m_messageData[0]),msg.m_messageData.size(),result); -} - -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// - -static int decode3ByteValue(const __uint8 *data,size_t offset = 0) throw() -{ - int result = 0; - result += data[offset]; - result <<= 8; - result += data[offset + 1]; - result <<= 8; - result += data[offset + 2]; - return result; -} - -static size_t decode4ByteValue(const __uint8 *data,size_t offset) throw() -{ - size_t result = 0; - result += data[offset]; - result <<= 8; - result += data[offset + 1]; - result <<= 8; - result += data[offset + 2]; - result <<= 8; - result += data[offset + 3]; - return result; -} - -#if 0 -void getRTMPMsgInfo(const vector<__uint8> &msg,__uint8 &msgType,int &payloadLength,long ×tamp,int &streamID,int &payloadOffset) -{ - assert(msg.size() >= 11); - const __uint8 *p = &msg[0]; - msgType = *(p++); - payloadLength = decode3ByteValue(p); - p+=3; - timestamp = decode4ByteValue(p); - p += 4; - streamID = decode3ByteValue(p); - p += 3; - payloadOffset = 11; -} -#endif - -// get chunk type from first byte in basic header -static int chunkType(const __uint8 *basicHeader) throw() -{ - return (((*basicHeader) & 0xc0) >> 6); -} - -static int calculateBasicChunkHeaderSize(const __uint8 *basicHeader) throw() -{ - int b = ((*basicHeader) & 0x3f); - switch(b) - { - case 0: return 2; - case 1: return 3; - } - return 1; -} - -// look at complete basic header and determine how many bytes to expect in -// the chunk header -static int calculateChunkMsgHeaderSize(const __uint8 *basicHeader) throw() -{ - switch(chunkType(basicHeader)) - { - case 0: return 11; - case 1: return 7; - case 2: return 3; - } - return 0; -} - -// calculate the complete size of a chunk header -static int calculateCompleteChunkHeaderSize(const __uint8 *basicHeader) throw() -{ - return calculateChunkMsgHeaderSize(basicHeader) + calculateBasicChunkHeaderSize(basicHeader); -} - -// look at a complete chunk header (basic and msg header) and see if we need to get -// an extended timestamp for the chunk -static bool chunkNeedsExtendedTimestamp(const __uint8 *basicHeader) throw() -{ - int f = chunkType(basicHeader); - if (f == 3) return false; - int s = calculateBasicChunkHeaderSize(basicHeader); - // timestamp is always just after the basic header - return ((basicHeader[s] == 0xff) && (basicHeader[s+1] == 0xff) && (basicHeader[s+2] == 0xff)); -} - -// get chunkstream ID from the basic header -static int getChunkStreamIDFromBasicHeader(const __uint8 *basicHeader) throw() -{ - int b = ((*basicHeader) & 0x3f); - switch(b) - { - case 0: return (basicHeader[1] + 64); - case 1: return (basicHeader[2] * 256 + basicHeader[1] + 64); - } - return b; -} - -static int calculateMessageSize(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) <= 1) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return decode3ByteValue(basicHeader + s + 3); - } - return -1; -} - -static int calculateMessageTypeID(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) <= 1) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return basicHeader[s + 6]; - } - return -1; -} - -static int calculateMessageStreamID(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) == 0) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return decode3ByteValue(basicHeader + s + 7); - } - return -1; -} - -static long calculateTimestamp(const __uint8 *basicHeader) throw() -{ - return (chunkType(basicHeader) < 3 ? decode3ByteValue(basicHeader + calculateBasicChunkHeaderSize(basicHeader)) : 0); -} - -// looks in inBuffer for a complete message. If it finds one it fills in msg and returns true. -// whether true or false, data from head of inBuffer should be removed based on amtToRemoveFromInBuffer -bool protocol_RTMPClient::chunkSequenceComplete(const __uint8 *inBuffer,size_t amtInBuffer,size_t &amtToRemoveFromInBuffer,size_t expectedChunkSize, - vector<__uint8> &msg,__uint8 &msgType,int &chunkStreamID,int &messageStreamID,const uniString::utf8 &logMsgPrefix) throw(std::exception) -{ - bool result = false; - msg.clear(); - amtToRemoveFromInBuffer = 0; - - // walk through chunks - const __uint8 *pBegin = inBuffer; - const __uint8 *pEnd = inBuffer + amtInBuffer; - const __uint8 *p = inBuffer; - - chunkStreamID = -1; - messageStreamID = -1; - int messageLength = -1; - int messageTypeID = -1; - int payloadDataSeen = 0; - int chunksConsolidated = 0; // for debugging - while(p != pEnd) - { - chunksConsolidated += 1; - - // do all calculations necessary to see if we have a complete chunk - int tmp; - - int hs = calculateCompleteChunkHeaderSize(p); - if ((p + hs) > pEnd) break; // not enough data - if (chunkNeedsExtendedTimestamp(p)) - hs += 4; - if ((p + hs) > pEnd) break; // not enough data - - // calculate timestamp - long tt = calculateTimestamp(p); - switch(chunkType(p)) - { - case 0: - m_lastInboundTimestamp = tt; - break; - - case 1: case 2: - m_lastInboundTimestamp += tt; - break; - } - - // gather and confirm chunk stream id - tmp = getChunkStreamIDFromBasicHeader(p); - if (chunkStreamID == -1) - chunkStreamID = tmp; - else if (chunkStreamID != tmp) - throwEx(logMsgPrefix + " expected chunk stream ID " + tos(chunkStreamID) + " but got " + tos(tmp) + " instead."); - - // gather and confirm message length for this chunk sequence - tmp = calculateMessageSize(p); - if ((tmp == -1) && (m_lastInboundMessageLength == -1)) throwEx(logMsgPrefix + " No message length for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageLength != -1) && (tmp != messageLength)) throwEx(logMsgPrefix + " mismatch message length for chunk with chunk stream ID " + tos(chunkStreamID) + " initially got " + tos(messageLength) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageLength = messageLength = tmp; - - tmp = calculateMessageTypeID(p); - if ((tmp == -1) && (m_lastInboundMessageTypeID == -1)) throwEx(logMsgPrefix + " No message type ID for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageTypeID != -1) && (tmp != messageTypeID)) throwEx(logMsgPrefix + " mismatch message type ID for chunk with chunk stream ID " + tos(chunkStreamID) + " initially got " + tos(messageTypeID) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageTypeID = messageTypeID = tmp; - - tmp = calculateMessageStreamID(p); - if ((tmp == -1) && (m_lastInboundMessageStreamID == -1)) throwEx(logMsgPrefix + " No message stream ID for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageStreamID != -1) && (tmp != messageStreamID)) throwEx(logMsgPrefix + " mismatch message stream ID for chunk with stream ID " + tos(chunkStreamID) + " initially got " + tos(messageStreamID) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageStreamID = messageStreamID = tmp; - - // calculate data that should be in this chunk - tmp = m_lastInboundMessageLength - payloadDataSeen; - tmp = min(tmp,(int)expectedChunkSize); - - // see if we have enough - if ((p + hs + tmp) > pEnd) - break; // nope - - // yeah we do. Copy out data - msg.insert(msg.end(),p+hs,p+hs+tmp); - payloadDataSeen += tmp; - p = p + hs + tmp; - - // are we all done? - if (payloadDataSeen == m_lastInboundMessageLength) - { - // yes - amtToRemoveFromInBuffer = p - pBegin; - DEBUG_LOG(logMsgPrefix + " recv" + stringUtil::eol() + - " CSID=" + tos(chunkStreamID) + stringUtil::eol() + - " MSID=" + tos(m_lastInboundMessageStreamID) + stringUtil::eol() + - " Time=" + tos(m_lastInboundTimestamp) + stringUtil::eol() + - " MTYPE=" + tos(m_lastInboundMessageTypeID) + stringUtil::eol() + - " LEN=" + tos(m_lastInboundMessageLength) + stringUtil::eol() + - " REMOVED=" + tos(amtToRemoveFromInBuffer)); - - msgType = m_lastInboundMessageTypeID; - messageStreamID = m_lastInboundMessageStreamID; - return true; - } - } - - return result; -} - -// return zero if get a msg, otherwise return timeout for read -long protocol_RTMPClient::getMsg(message &msg) throw(exception) -{ - size_t amt_left = m_inDataBufferMax - m_inDataBufferAmt; - size_t amt_left2 = amt_left; - - long to = getSocketData(m_socket,m_inDataBuffer,m_inDataBufferAmt,amt_left,m_lastActivityTime,m_clientLogString); - m_inDataBufferAmt += (amt_left2 - amt_left); - - size_t amtToRemoveFromInBuffer = 0; - - bool seqComplete = chunkSequenceComplete(m_inDataBuffer,m_inDataBufferAmt,amtToRemoveFromInBuffer,m_inboundChunkSize,msg.m_messageData,msg.m_messageType,msg.m_chunkStreamID,msg.m_messageStreamID,m_clientLogString); - if (amtToRemoveFromInBuffer) - { - assert(m_inDataBufferAmt >= amtToRemoveFromInBuffer); - if (m_inDataBufferAmt == amtToRemoveFromInBuffer) - { - m_inDataBufferAmt = 0; - #ifndef NDEBUG - memset(m_inDataBuffer,0,m_inDataBufferMax); - #endif - } - else - { - memmove(m_inDataBuffer,m_inDataBuffer + amtToRemoveFromInBuffer,m_inDataBufferAmt - amtToRemoveFromInBuffer); - m_inDataBufferAmt -= amtToRemoveFromInBuffer; - #ifndef NDEBUG - memset(m_inDataBuffer + m_inDataBufferAmt,0,m_inDataBufferMax - m_inDataBufferAmt); - #endif - } - } - if (seqComplete) - { - to = 0; - } - else - { - if (m_inDataBufferAmt == m_inDataBufferMax) - throwEx(m_clientLogString + " inbound data buffer exceeded"); - assert(to != 0); // ??? not sure - if (to == 0) - to = 1; - } - - return to; -} - -///////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// - -runnable::timeSliceResult protocol_RTMPClient::state_Close() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - timeSliceResult result; - result.m_done = true; - return result; -} - -void protocol_RTMPClient::logW3C() throw() -{ -} - -#if 0 -///////////////////////////////////// W3C Logging ////////////////////////////////////////////// - -static utf8 titleFromMetadata(const utf8 &md) throw() -{ - utf8 title; - - utf8::size_type p1 = utf8::npos; - utf8::size_type p2 = utf8::npos; - - p1 = md.find(utf8("itle='")); - if (p1 != utf8::npos) - { - p1 += 6; - p2 = md.find(utf8("';"),p1); - if (p2 != utf8::npos) - { - title = md.substr(p1,p2-p1); - } - } - return title; -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_RTMPClient::logW3C() throw() -{ - if (gOptions.w3cEnable()) - { - time_t t(::time(0)); - time_t durationOfTitle = t - m_lastTitleTime; - int bitrateOfTitle = (int)(durationOfTitle ? (8 * m_bytesSentForCurrentTitle) / durationOfTitle : 0); - utf8 title = titleFromMetadata(m_lastSentMetadata); - - w3cLog::log(m_clientAddr, - m_clientHostName, - m_streamID, - title, - mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")), - m_bytesSentForCurrentTitle, - durationOfTitle, - bitrateOfTitle); - - setW3CState(); - } -} - -// setup tracking variables for W3C log -void protocol_RTMPClient::setW3CState() throw() -{ - m_lastTitleTime = ::time(0); - m_bytesSentForCurrentTitle = 0; -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_RTMPClient::aquireIntroFile() throw() -{ - m_streamData->getIntroFile().getSc1Data(m_introFile); - m_introFileOffset = 0; -} - -void protocol_RTMPClient::aquireBackupFile() throw() -{ - m_streamData->getBackupFile().getSc1Data(m_backupFile); - m_backupFileOffset = 0; -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendText() throw(exception) -{ - //DLOG(__FUNCTION__); - - timeSliceResult result; - long to = sendHTTPStyleText(m_socket,m_outBuffer,m_outBufferSize,m_lastActivityTime,m_clientLogString); - if (to == 0) - { // sent - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // try again - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - assert(!m_streamData); - - m_streamID = DEFAULT_CLIENT_STREAM_ID; - utf8::size_type pos = m_HTTPRequestInfo.m_url.find(utf8("/stream/")); - if (pos != utf8::npos) - m_streamID = atoi((const char *)m_HTTPRequestInfo.m_url.substr(pos + 8).c_str()); - - map stream_configs = gOptions.getStreamConfigs(); - for(map::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if ((*i).second.m_urlPath == m_HTTPRequestInfo.m_url) - { - m_streamID = (*i).first; - break; - } - - pos = m_HTTPRequestInfo.m_url.find((*i).second.m_urlPath); - if (pos != utf8::npos && pos == 0) - { - utf8 params = m_HTTPRequestInfo.m_url.substr(pos + (*i).second.m_urlPath.size()); - if(params.find(utf8(";")) == 0 || params.find(utf8("/")) == 0 || params.find(utf8("/;")) == 0) - { - m_streamID = (*i).first; - break; - } - } - } - - m_clientLogString = dstAddrLogString(m_clientHostName,m_clientPort,m_streamID); - - utf8 user_agent = toLower(mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - - bool isSourceActive = false; - m_streamData = streamData::accessStream(m_streamID,isSourceActive); - if (!m_streamData || !isSourceActive) - { - utf8 msg_icy401 = MSG_ICY401; - msg_icy401.replace(msg_icy401.find(utf8("^")),1,gOptions.getVersionBuildStrings()); - m_outBuffer = msg_icy401.c_str(); - m_outBufferSize = strlen(m_outBuffer); - - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_Close; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - ELOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Stream not available. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - else - { - // construct the response text - if (!stats::addClient(m_streamID,this,m_clientAddr,m_clientPort,mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")),g_ripList.find(m_clientAddr))) - { - utf8 backup_server = m_streamData->streamBackupServer(); - if (backup_server.empty()) - { - utf8 msg_icy503 = MSG_ICY503; - msg_icy503.replace(msg_icy503.find(utf8("^")),1,gOptions.getVersionBuildStrings()); - m_outBuffer = msg_icy503.c_str(); - m_outBufferSize = strlen(m_outBuffer); - - ELOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Max users reached. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - else - { - m_redirectResponse = http302(backup_server); - m_outBuffer = m_redirectResponse.c_str(); - m_outBufferSize = m_redirectResponse.size(); - WLOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Max users reached. Redirecting to " + backup_server + ". " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_Close; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - } - else - { - m_removeClientFromStats = true; - m_sendMetadata = mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"icy-metadata",false); - - m_metaInterval = gOptions.metaInterval(); - if (m_metaInterval < 256) m_metaInterval = 256; // clamp - - m_ICYOKResponse = MSG_ICY200; - m_ICYOKResponse += "icy-name:" + m_streamData->streamName() + "\r\n"; - m_ICYOKResponse += "icy-genre:" + m_streamData->streamGenre() + "\r\n"; - m_ICYOKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - m_ICYOKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - - if (isUserAgentRelay(user_agent) && (!m_streamData->allowPublicRelay())) - m_ICYOKResponse += "icy-pub:0\r\n"; - else - m_ICYOKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - if (m_sendMetadata) - m_ICYOKResponse += "icy-metaint:" + tos(m_metaInterval) + "\r\n"; - m_ICYOKResponse += "icy-br:" + m_streamData->streamName() + "\r\n"; - m_ICYOKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + " sending [" + m_ICYOKResponse + "]"); - m_outBuffer = m_ICYOKResponse.c_str(); - m_outBufferSize = strlen(m_outBuffer); - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_InitiateStream; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - ILOG(m_clientLogString + " SHOUTcast 1 client connection accepted. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - } - - return result; - } - -// set read pointer to a nice distance from the write pointer. Return that distance -streamData::ringBufferAccess_t protocol_RTMPClient::resetReadPtr() throw() -{ - m_readPtr = m_streamData->getSc1ClientStartPosition(); - return m_streamData->getSc1RingBuffer().m_writePtr - m_readPtr; -} - -runnable::timeSliceResult protocol_RTMPClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - assert(m_streamData); - - m_metaIntervalCounter = 0; - resetReadPtr(); - - m_underruns = 0; - - // if we have an intro file send it, otherwise start streaming - aquireIntroFile(); - - m_state = (m_introFile.empty() ? &protocol_RTMPClient::state_Stream : &protocol_RTMPClient::state_SendIntroFile); - - setW3CState(); - - timeSliceResult result; - result.m_runImmediately = true; - return result; -} - -// construct the necessary metadata information and load into outbound buffers. -void protocol_RTMPClient::sendICYMetadata(const utf8 &md) throw() -{ - m_ICYMetadata.clear(); - m_ICYMetadata.push_back(1); // placeholder - if (md != m_lastSentMetadata) // don't sent duplicates - { - m_ICYMetadata.insert(m_ICYMetadata.end(),md.begin(),md.end()); - if (!m_lastSentMetadata.empty()) - logW3C(); - m_lastSentMetadata = md; - } - unsigned int dlen = m_ICYMetadata.size(); - if (dlen == 1) dlen = 0; - unsigned int l1=((dlen+15)&~15); - m_ICYMetadata[0] = l1/16; - unsigned int send_len = l1+1; - m_ICYMetadata.insert(m_ICYMetadata.end(),send_len - m_ICYMetadata.size(),0); - assert(m_ICYMetadata.size() == ((m_ICYMetadata[0] * 16)+1)); - m_metaIntervalCounter = 0; - - m_outBuffer = &m_ICYMetadata[0]; - m_outBufferSize = m_ICYMetadata.size(); - m_state = &protocol_RTMPClient::state_SendText; -} - -// handle state where we are sending intro files -runnable::timeSliceResult protocol_RTMPClient::state_SendIntroFile() throw(exception) -{ - assert(m_streamData); - assert(!m_introFile.empty()); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - size_t amt = m_introFile.size() - m_introFileOffset; - - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_state = &protocol_RTMPClient::state_Stream; - resetReadPtr(); - result.m_runImmediately = true; - } - else if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) // check to see if we have to send the metadata - { - sendICYMetadata("StreamTitle='';"); - - m_nextState = &protocol_RTMPClient::state_SendIntroFile; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(m_metaInterval - m_metaIntervalCounter)); - } - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - result.m_runImmediately = true; - } - else - { - int rval = ::send(m_socket,(const char *)&(m_introFile[m_introFileOffset]),amt,0); - if (rval == 0) - { - throwEx(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - m_introFileOffset += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -// handle state where we are sending backup files -runnable::timeSliceResult protocol_RTMPClient::state_SendBackupFile() throw(exception) -{ - assert(m_streamData); - assert(!m_backupFile.empty()); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - size_t amt = m_backupFile.size() - m_backupFileOffset; - - if (streamData::isSourceConnected(m_streamData)) - { - // we're done with the backup file - m_backupFile.clear(); - resetReadPtr(); - m_state = &protocol_RTMPClient::state_Stream; - - result.m_runImmediately = true; - } - else if (amt == 0) - { - // we're done with the backup file. get more data - aquireBackupFile(); - if (m_backupFile.empty()) - { // it got cleared out from under us? Try and stream - resetReadPtr(); - m_state = &protocol_RTMPClient::state_Stream; - } - - result.m_runImmediately = true; - } - else if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) // check to see if we have to send the metadata - { - sendICYMetadata("StreamTitle='';"); - - m_nextState = &protocol_RTMPClient::state_SendBackupFile; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(m_metaInterval - m_metaIntervalCounter)); - } - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - result.m_runImmediately = true; - } - else - { - int rval = ::send(m_socket,(const char *)&(m_backupFile[m_backupFileOffset]),amt,0); - if (rval == 0) - { - throwEx(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - m_backupFileOffset += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_Stream() throw(exception) -{ - assert(m_streamData); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - // check to see if we have to send the metadata - if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) - { - // send metadata - sendICYMetadata(m_streamData->getSc1Metadata(m_readPtr).m_songTitle); - - m_nextState = &protocol_RTMPClient::state_Stream; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - streamData::ringBuffer_t rb = m_streamData->getSc1RingBuffer(); - - streamData::ringBufferAccess_t amt = rb.m_writePtr - m_readPtr; - if (amt > rb.m_bufferSize) - { - // the pointers are too far apart. Underrun - m_underruns += 1; - amt = resetReadPtr(); - } - - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(streamData::ringBufferAccess_t)(m_metaInterval - m_metaIntervalCounter)); - } - - streamData::ringBufferAccess_t offset = m_readPtr & rb.m_ptrMask; - // clamp again so we don't read passed end of buffer - amt = min(amt,rb.m_bufferSize - offset); - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - // If the source has gone away, and we have a backup file, send it. - bool sendBackupFile = false; - - if (!streamData::isSourceConnected(m_streamData)) - { - aquireBackupFile(); - sendBackupFile = !m_backupFile.empty(); - } - if (sendBackupFile) - { - m_state = &protocol_RTMPClient::state_SendBackupFile; - result.m_runImmediately = true; - } - else - { - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - m_limitTrigger.clear(); - result.m_readSet.insert(m_limitTrigger.test()); - m_streamData->scheduleSc1LimitTrigger(&m_limitTrigger,m_readPtr); - } - } - else - { - int rval = ::send(m_socket,(const char *)&(rb.m_data[offset]),amt,0); - if (rval == 0) - { - throwEx(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - m_readPtr += rval; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h b/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h deleted file mode 100644 index 457bab95..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#if 0 -#ifndef protocol_RTMPClient_H_ -#define protocol_RTMPClient_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include -#include - -class streamData; - -class AMFEncoding; - -class protocol_RTMPClient: public runnable, public clientProtocol -{ -public: - class message - { - public: - int m_chunkStreamID; - int m_messageStreamID; - __uint8 m_messageType; - std::vector<__uint8> m_messageData; - - void clear() throw() { m_messageData.clear(); } - uniString::utf8 packetDump() const throw(); - }; - -private: - // the limit trigger is used when the client readPtr butts up against the write ptr. - // In this case we can't select against the socket, because it will always be ready and we'll - // end up in a CPU intenstive spin loop. Instead, we create a signal and give it to the streamData - // object with the value of our readPtr. The streamData object will signal the trigger when there - // is data available - pipeDrivenSignal m_limitTrigger; - - socketOps::tSOCKET m_socket; - const uniString::utf8 m_clientHostName; - const uniString::utf8 m_clientAddr; - const int m_clientPort; - uniString::utf8 m_clientLogString; - const __uint8 m_C0; // C0 packet sent from client. Has version number - const __uint8 m_S0; // my response - std::vector<__uint8> m_C1; // C1 packet from client - std::vector<__uint8> m_C2; // C2 packet from client - std::vector<__uint8> m_S1orS2; // S1 or S2 packet from me - - __uint8 *m_inDataBuffer; - size_t m_inDataBufferMax; // max allocated - size_t m_inDataBufferAmt; // amt in buffer - size_t m_inDataRequested; // amt we want to read for a fixed read (C1 or C2) - message m_inMsg; - - const __uint8 *m_outDataPtr; // for outgoing text lines - size_t m_outDataSize; - std::vector<__uint8> m_outDataBuffer; - - __uint32 m_serverBaseTime; // for RTMP protocol - __uint32 m_C1ReadTime; - - time_t m_lastActivityTime; - - time_t m_startTime; // when connection started, used to implement listenerTime - - // inbound state - size_t m_inboundChunkSize; - int m_lastInboundMessageStreamID; - int m_lastInboundMessageLength; - int m_lastInboundMessageTypeID; - long m_lastInboundTimestamp; - size_t m_windowSizeFromClient; - int m_bufferSizeFromClient; - - // outbound state - size_t m_outboundChunkSize; - - long getMsg(message &msg) throw(std::exception); - - //// stats for w3c logs - time_t m_lastTitleTime; // time of last title update used for w3c logs - __uint64 m_bytesSentForCurrentTitle; // bytes sent since last title change. used for w3c logs - __uint64 m_totalBytesSent; // total bytes sent whilst the connection is open - uniString::utf8 m_lastSentMetadata; // no need to send duplicates. Also used for w3C tracking - - int m_objectEncodingMode; - /////////////////////////// - - ////////// HTTP message buffer for 302 redirect -// uniString::utf8 m_redirectResponse; - ////////////////////////////////////////// - -// const protocol_HTTPStyle::HTTPRequestInfo m_HTTPRequestInfo; // the received request and headers -// uniString::utf8 m_ICYOKResponse; -// std::vector<__uint8> m_ICYMetadata; // metadata buffer - - streamData::streamID_t m_streamID; // stream ID for this connection - - streamData::ringBufferAccess_t m_readPtr; // pointer into ring buffer - int m_underruns; // client too slow - bool m_removeClientFromStats; // do we have to do a stats::removeClient - - bool m_sendMetadata; - size_t m_metaInterval; - size_t m_metaIntervalCounter; // counter for metadata updates - - std::vector<__uint8> m_introFile; - size_t m_introFileOffset; - std::vector<__uint8> m_backupFile; - size_t m_backupFileOffset; - - void aquireIntroFile() throw(); - void aquireBackupFile() throw(); - - streamData::ringBufferAccess_t resetReadPtr() throw(); // return distance between read and write pointer - void sendICYMetadata(const uniString::utf8 &md) throw(); - - void logW3C() throw(); - void setW3CState() throw(); - - typedef runnable::timeSliceResult (protocol_RTMPClient::*state_t)(); // throw(std::exception); - - state_t m_state; - state_t m_nextState; - - streamData *m_streamData; - - bool chunkSequenceComplete(const __uint8 *inBuffer,size_t amtInBuffer,size_t &amtToRemoveFromInBuffer,size_t expectedChunkSize, - std::vector<__uint8> &msg,__uint8 &msgType,int &chunkStreamID,int &messageStreamID,const uniString::utf8 &logMsgPrefix) throw(std::exception); - - runnable::timeSliceResult state_Send() throw(std::exception); - runnable::timeSliceResult state_RecvFixedAmt() throw(std::exception); - runnable::timeSliceResult state_RecvMsg() throw(std::exception); - - runnable::timeSliceResult state_WaitForC1() throw(std::exception); - runnable::timeSliceResult state_GotC1() throw(std::exception); - runnable::timeSliceResult state_WaitForC2() throw(std::exception); - runnable::timeSliceResult state_GotC2() throw(std::exception); - runnable::timeSliceResult state_SendS0() throw(std::exception); - runnable::timeSliceResult state_SendS1() throw(std::exception); - runnable::timeSliceResult state_SendS2() throw(std::exception); - - runnable::timeSliceResult state_WaitForMessage() throw(std::exception); - runnable::timeSliceResult state_GotMessage() throw(std::exception); - - runnable::timeSliceResult state_SendAudio() throw(std::exception); - - runnable::timeSliceResult handle_AMF0_message() throw(std::exception); - runnable::timeSliceResult handle_AMF0_connect(const AMFEncoding &amf) throw(std::exception); - runnable::timeSliceResult handle_AMF0_createStream(const AMFEncoding &amf) throw(std::exception); - runnable::timeSliceResult handle_AMF0_play(const AMFEncoding &amf) throw(std::exception); - - runnable::timeSliceResult handle_USER_CONTROL_message() throw(std::exception); - runnable::timeSliceResult handle_UCM_StreamBegin() throw(std::exception); - - runnable::timeSliceResult state_SendConnectResponse() throw(std::exception); - - runnable::timeSliceResult state_Close() throw(std::exception); - - virtual runnable::timeSliceResult timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_RTMPClient"; } - -public: - protocol_RTMPClient(socketOps::tSOCKET s,const uniString::utf8 &hostName,const uniString::utf8 &addr,int port, - __uint8 C0 /* initial client packet */) throw(std::exception); - virtual ~protocol_RTMPClient() throw(); -}; - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp b/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp deleted file mode 100644 index 8b4b9070..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp +++ /dev/null @@ -1,6390 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_shoutcastClient.h" -#include "protocol_admincgi.h" -#include "protocol_HTTPStyle.h" -#include "protocol_relay.h" -#include "base64.h" -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "agentList.h" -#include "uvox2Common.h" -#include "w3cLog.h" -#include "yp2.h" -#include "updater.h" -#include "aolxml/aolxml.h" -#include "webNet/urlUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include "bandwidth.h" -#include "cpucount.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -time_t last_update_check = 0; -utf8 logId, logTailId, listenerId; - -#define DEBUG_LOG(...) do { if (gOptions.httpStyleDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOG_NAME "ADMINCGI" -#define LOGNAME "[" LOG_NAME "] " - -#define HEAD_REQUEST (m_httpRequestInfo.m_request == protocol_HTTPStyle::HTTP_HEAD) -#define SHRINK (m_httpRequestInfo.m_AcceptEncoding & protocol_HTTPStyle::ACCEPT_GZIP) -#define COMPRESS(header, body) if (SHRINK && compressData(body)) header += "Content-Encoding:gzip\r\n" - -static bool sortUniqueClientDataByTime(const stats::uniqueClientData_t &a, const stats::uniqueClientData_t &b) -{ - return (a.m_connectTime < b.m_connectTime); -} - -utf8 getStreamAdminHeader(const streamData::streamID_t sid, const utf8& headerTitle, - const int refreshRequired = 0, const bool style = false) -{ - return "" - "" - "" - "Shoutcast Administrator" - "" - "" + (abs(refreshRequired) > 0 ? - "" : "") + - - (style ? "" : (utf8)"") + - - "" - "" - "" - "" - "
Shoutcast " + headerTitle + "
" - "
Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "
" - "
" - "" - "
 | 
" - "" - "
 | 
" - + (!(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty()) ? - "
Log " - "(Tailing" - " | Save)
" - "
 | 
" : "") + - /*+ utf8(info.m_radionomyID.empty() ? warningImage(false) + "  Please Register Your Authhash

" : "") +*/ - "" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
"; -} - -utf8 getServerAdminHeader(const utf8& headerTitle, const int refreshRequired = 0, - const utf8& childPage = "", const int style = 0) -{ - return "" - "" - "" - "Shoutcast Server Administrator" - "" - "" + - - (abs(refreshRequired) > 0 ? "" : "") + - - (style ? "" : (utf8)"") + - - "" - "" - "" - "" - "
Shoutcast " + headerTitle + "
" - "
Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "
" - "" - "
" - "" - "
 | 
" - "" - "
 | 
" - "
Log " - "(Tailing | " - "Save)
" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
 | 
" - "" - "
"; -} - -static utf8 formatSizeString(const __uint64 size) -{ - utf8::value_type buf[128] = {0}; - if (size < 1024) - { - snprintf((char *)buf, sizeof(buf), "%llu B", size); - } - else if(size < 1048576) - { - snprintf((char *)buf, sizeof(buf), "%.02f KiB", size/1024.0f); - } - else if(size < 1073741824) - { - snprintf((char *)buf, sizeof(buf), "%.02f MiB", size/1048576.0f); - } - else if(size < 1099511627776LL) - { - snprintf((char *)buf, sizeof(buf), "%.02f GiB", size/1073741824.0f); - } - else - { - snprintf((char *)buf, sizeof(buf), "%.02f TiB", size/1099511627776.0f); - } - return buf; -} - -utf8 getCheckedDuration(const size_t time) -{ - if (time >= 60) - { - if (time < 3600) - { - size_t min = (time / 60); - return (tos(min) + " minute" + (min != 1 ? "s" : "") + " ago"); - } - else if (time < 86400) - { - size_t hour = (time / 3600); - return (tos(hour) + " hour" + (hour != 1 ? "s" : "") + " ago"); - } - else - { - size_t week = (time / 86400); - return (tos(week) + " week" + (week != 1 ? "s" : "") + " ago"); - } - } - return "less than a minute ago"; -} - -utf8 niceURL(utf8 srcAddr) -{ - if (!srcAddr.empty()) - { - utf8::size_type pos = srcAddr.find(utf8("://")); - if (pos != utf8::npos && ((pos == 4) || (pos == 5))) - { - srcAddr = srcAddr.substr(pos + 3); - } - srcAddr = aolxml::escapeXML(srcAddr); - - // look for a /stream/x/ path and strip off the end / so the - // link goes to the admin page instead of playing the stream - if (!srcAddr.empty()) - { - utf8::size_type pos2 = srcAddr.find(utf8("/stream/")), - pos3 = srcAddr.rfind(utf8("/")); - if ((pos2 != utf8::npos) && - ((pos3 != utf8::npos) && (pos3 > pos2) && - (pos3 == srcAddr.size()-1))) - { - srcAddr = srcAddr.substr(0, pos3); - } - } - } - return srcAddr; -} - -void restartRelay(const config::streamConfig &info) throw() -{ - bool noEntry = false; - const int relayActive = (streamData::isRelayActive(info.m_streamID, noEntry) & 12); - if (!relayActive || !noEntry) - { - threadedRunner::scheduleRunnable(new protocol_relay(info)); - } -} - -void checkVersion(const time_t t) -{ - utf8 tempId; - httpHeaderMap_t queryParameters; - queryParameters["id"] = randomId(tempId); - - yp2::runAuthHashAction(tempId, yp2::VER_CHECK, "/yp2", queryParameters, - ""\ - ""\ - "" + gOptions.getVersionBuildStrings() + "/" SERV_OSNAME ""); - - last_update_check = t; -} - -utf8 getUptimeScript(const bool base = false, const bool stream = false, const time_t streamUptime = 0) -{ - // TODO need to consider improving this to better deal with leap years, etc - // used to increment the uptime value on the server admin page - return (!base ? "" : ""); -} - -const bool reloadConfig(const int force) -{ - bool m_reloadRefresh = false; - - ILOG(gOptions.logSectionName() + "Starting stream config reload from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - config newOptions; - newOptions.load(gOptions.confFile()); - vector relays; - - // to ease testing, especially on remote systems, will - // allow toggling of the debugging options for v2.1+ - ILOG(gOptions.logSectionName() + "Processing global configuration settings..."); - - if (newOptions.cdn() != gOptions.cdn()) - { - ILOG(gOptions.logSectionName() + "Changing CDN mode from " + (!gOptions.cdn().empty() ? gOptions.cdn() : "off") + - " to " + (!newOptions.cdn().empty() ? newOptions.cdn() : "off")); - try - { - gOptions.setOption(utf8("cdn"),utf8(newOptions.cdn())); - } - catch(const exception &) - { - } - } - - if (newOptions.maxUser() != gOptions.maxUser()) - { - const int old_maxUser = gOptions.maxUser(), - new_maxUser = newOptions.maxUser(); - ILOG(gOptions.logSectionName() + "Changing server maxuser from " + - (old_maxUser > 0 ? tos(old_maxUser) : "unlimited") + " to " + - (new_maxUser > 0 ? tos(new_maxUser) : "unlimited")); - gOptions.setOption(utf8("maxuser"),utf8(tos(newOptions.maxUser()))); - } - - if (newOptions.maxBitrate() != gOptions.maxBitrate()) - { - ILOG(gOptions.logSectionName() + "Changing server maxbitrate from " + - (gOptions.maxBitrate() > 0 ? tos(gOptions.maxBitrate()) + "bps" : "unlimited") + " to " + - (newOptions.maxBitrate() > 0 ? tos(newOptions.maxBitrate()) + "bps" : "unlimited")); - gOptions.setOption(utf8("maxbitrate"),utf8(tos(newOptions.maxBitrate()))); - } - - if (newOptions.minBitrate() != gOptions.minBitrate()) - { - ILOG(gOptions.logSectionName() + "Changing server minbitrate from " + - (gOptions.minBitrate() > 0 ? tos(gOptions.minBitrate()) + "bps" : "unlimited") + " to " + - (newOptions.minBitrate() > 0 ? tos(newOptions.minBitrate()) + "bps" : "unlimited")); - gOptions.setOption(utf8("minbitrate"),utf8(tos(newOptions.minBitrate()))); - } - - bool publicChanged = false; - if (newOptions.publicServer() != gOptions.publicServer()) - { - ILOG(gOptions.logSectionName() + "Changing state of publicserver - killing sources as applicable"); - gOptions.setOption(utf8("publicserver"),newOptions.publicServer()); - publicChanged = true; - } - - // update the server-wide hiding and redirection options - if (newOptions.hideStats() != gOptions.hideStats()) - { - ILOG(gOptions.logSectionName() + "Changing 'hidestats'"); - gOptions.setOption(utf8("hidestats"),utf8(newOptions.hideStats())); - } - - if (newOptions.redirectUrl() != gOptions.redirectUrl()) - { - ILOG(gOptions.logSectionName() + "Changing 'redirecturl'"); - gOptions.setOption(utf8("redirecturl"),utf8(newOptions.redirectUrl())); - } - - if (newOptions.ripOnly() != gOptions.ripOnly()) - { - ILOG(gOptions.logSectionName() + "Changing 'riponly'"); - gOptions.setOption(utf8("riponly"),utf8(tos(newOptions.ripOnly()))); - } - - if (newOptions.blockEmptyUserAgent() != gOptions.blockEmptyUserAgent()) - { - ILOG(gOptions.logSectionName() + "Changing 'blockemptyuseragent'"); - gOptions.setOption(utf8("blockemptyuseragent"),utf8(tos(newOptions.blockEmptyUserAgent()))); - } - - if (newOptions.metricsMaxQueue() != gOptions.metricsMaxQueue()) - { - ILOG(gOptions.logSectionName() + "Changing 'metricsmaxqueue'"); - gOptions.setOption(utf8("metricsmaxqueue"),utf8(tos(newOptions.metricsMaxQueue()))); - } - - metrics::metrics_apply(newOptions); - - if (newOptions.relayReconnectTime() != gOptions.relayReconnectTime()) - { - ILOG(gOptions.logSectionName() + "Changing 'relayreconnecttime'"); - gOptions.setOption(utf8("relayreconnecttime"),utf8(tos(newOptions.relayReconnectTime()))); - } - - if (newOptions.relayConnectRetries() != gOptions.relayConnectRetries()) - { - ILOG(gOptions.logSectionName() + "Changing 'relayconnectretries'"); - gOptions.setOption(utf8("relayconnectretries"),utf8(tos(newOptions.relayConnectRetries()))); - } - - if (newOptions.backupLoop() != gOptions.backupLoop()) - { - ILOG(gOptions.logSectionName() + "Changing 'backuploop'"); - gOptions.setOption(utf8("backuploop"),utf8(tos(newOptions.backupLoop()))); - } - - if (newOptions.songHistory() != gOptions.songHistory()) - { - ILOG(gOptions.logSectionName() + "Changing 'songhistory'"); - gOptions.setOption(utf8("songhistory"),utf8(tos(newOptions.songHistory()))); - } - - if (newOptions.adminFile() != gOptions.adminFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'adminfile'"); - gOptions.setOption(utf8("adminfile"),newOptions.adminFile()); - } - - if (newOptions.clacks() != gOptions.clacks()) - { - ILOG(gOptions.logSectionName() + "Changing 'clacks'"); - gOptions.setOption(utf8("clacks"),utf8(tos(newOptions.clacks()))); - } - - if (newOptions.startInactive() != gOptions.startInactive()) - { - ILOG(gOptions.logSectionName() + "Changing 'startinactive'"); - gOptions.setOption(utf8("startinactive"),utf8(tos(newOptions.startInactive()))); - } - - if (newOptions.rateLimit() != gOptions.rateLimit()) - { - ILOG(gOptions.logSectionName() + "Changing 'rateLimit'"); - gOptions.setOption(utf8("ratelimit"),utf8(tos(newOptions.rateLimit()))); - } - - if (newOptions.adTestFile() != gOptions.adTestFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile'"); - gOptions.setOption(utf8("adtestfile"),utf8(newOptions.adTestFile())); - } - - if (newOptions.adTestFile2() != gOptions.adTestFile2()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile2'"); - gOptions.setOption(utf8("adtestfile2"),utf8(newOptions.adTestFile2())); - } - - if (newOptions.adTestFile3() != gOptions.adTestFile3()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile3'"); - gOptions.setOption(utf8("adtestfile3"),utf8(newOptions.adTestFile3())); - } - - if (newOptions.adTestFile4() != gOptions.adTestFile4()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile4'"); - gOptions.setOption(utf8("adtestfile4"),utf8(newOptions.adTestFile4())); - } - - if (newOptions.adTestFileLoop() != gOptions.adTestFileLoop()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfileloop'"); - gOptions.setOption(utf8("adtestfileloop"),utf8(tos(newOptions.adTestFileLoop()))); - } - - if (newOptions.metaInterval() != gOptions.metaInterval()) - { - ILOG(gOptions.logSectionName() + "Changing 'metainterval'"); - gOptions.setOption(utf8("metainterval"),utf8(tos(newOptions.metaInterval()))); - } - - if (newOptions.useXFF() != gOptions.useXFF()) - { - ILOG(gOptions.logSectionName() + "Changing 'usexff'"); - gOptions.setOption(utf8("usexff"),utf8(tos(newOptions.useXFF()))); - } - - if (newOptions.forceShortSends() != gOptions.forceShortSends()) - { - ILOG(gOptions.logSectionName() + "Changing 'forceshortsends'"); - gOptions.setOption(utf8("forceshortsends"),utf8(tos(newOptions.forceShortSends()))); - } - - if (newOptions.adminNoWrap() != gOptions.adminNoWrap()) - { - ILOG(gOptions.logSectionName() + "Changing 'adminnowrap'"); - gOptions.setOption(utf8("adminnowrap"),utf8(tos(newOptions.adminNoWrap()))); - } - - if (newOptions.adminCSSFile() != gOptions.adminCSSFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'admincssfile'"); - gOptions.setOption(utf8("admincssfile"),utf8(newOptions.adminCSSFile())); - gOptions.m_styleCustomStr.clear(); - gOptions.m_styleCustomStrGZ.clear(); - gOptions.m_styleCustomHeaderTime = 0; - } - - if (newOptions.destIP() != gOptions.destIP()) - { - utf8 destBindAddr = metrics::metrics_verifyDestIP(newOptions, false); - ILOG(gOptions.logSectionName() + "Changing 'destip'"); - gOptions.setOption(utf8("destip"), destBindAddr); - - // if we're updating then attempt to behave like it was a new load - g_IPAddressForClients = destBindAddr; - - if (g_IPAddressForClients.empty()) - { - char s[MAXHOSTNAMELEN] = {0}; - if (!::gethostname(s,MAXHOSTNAMELEN - 1)) - { - g_IPAddressForClients = socketOps::hostNameToAddress(s,g_portForClients); - } - } - } - - if (newOptions.publicIP() != gOptions.publicIP()) - { - utf8 publicAddr = stripWhitespace(newOptions.publicIP()); - publicAddr = stripHTTPprefix(publicAddr); - ILOG(gOptions.logSectionName() + "Changing 'publicip'"); - gOptions.setOption(utf8("publicip"),publicAddr); - } - - if (newOptions.autoDumpTime() != gOptions.autoDumpTime()) - { - ILOG(gOptions.logSectionName() + "Changing 'autodumptime'"); - gOptions.setOption(utf8("autodumptime"),utf8(tos(newOptions.autoDumpTime()))); - } - - if (newOptions.nameLookups() != gOptions.nameLookups()) - { - ILOG(gOptions.logSectionName() + "Changing 'namelookups'"); - gOptions.setOption(utf8("namelookups"),utf8(tos(newOptions.nameLookups()))); - } - - // update the YP details (can do on fly without any actual updates) - bool ypChanged = false; - bool https = ((gOptions.ypAddr() == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - utf8 oldYP = (https ? "https://" : "http://") + gOptions.ypAddr() + ":" + tos(gOptions.ypPort()) + gOptions.ypPath(); - if (newOptions.ypAddr() != gOptions.ypAddr()) - { - ypChanged = true; - gOptions.setOption(utf8("ypaddr"),utf8(newOptions.ypAddr())); - } - if (newOptions.ypPort() != gOptions.ypPort()) - { - ypChanged = true; - gOptions.setOption(utf8("ypport"),utf8(tos(newOptions.ypPort()))); - } - if (newOptions.ypPath() != gOptions.ypPath()) - { - ypChanged = true; - gOptions.setOption(utf8("yppath"),utf8(newOptions.ypPath())); - } - - if (ypChanged) - { - bool https = ((newOptions.ypAddr() == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - utf8 newYP = (https ? "https://" : "http://") + newOptions.ypAddr() + ":" + tos(newOptions.ypPort()) + newOptions.ypPath(); - ILOG(gOptions.logSectionName() + "Changing YP details from " + oldYP + " to " + newYP); - } - - gOptions.setOption(utf8("yp2debug"),utf8(newOptions.yp2Debug()?"1":"0")); - gOptions.setOption(utf8("shoutcastsourcedebug"),utf8(newOptions.shoutcastSourceDebug()?"1":"0")); - gOptions.setOption(utf8("uvox2sourcedebug"),utf8(newOptions.uvox2SourceDebug()?"1":"0")); - gOptions.setOption(utf8("httpsourcedebug"),utf8(newOptions.HTTPSourceDebug()?"1":"0")); - gOptions.setOption(utf8("shoutcast1clientdebug"),utf8(newOptions.shoutcast1ClientDebug()?"1":"0")); - gOptions.setOption(utf8("shoutcast2clientdebug"),utf8(newOptions.shoutcast2ClientDebug()?"1":"0")); - gOptions.setOption(utf8("httpclientdebug"),utf8(newOptions.HTTPClientDebug()?"1":"0")); - gOptions.setOption(utf8("flvclientdebug"),utf8(newOptions.flvClientDebug()?"1":"0")); - gOptions.setOption(utf8("m4aclientdebug"),utf8(newOptions.m4aClientDebug()?"1":"0")); - gOptions.setOption(utf8("relayshoutcastdebug"),utf8(newOptions.relayShoutcastDebug()?"1":"0")); - gOptions.setOption(utf8("relayuvoxdebug"),utf8(newOptions.relayUvoxDebug()?"1":"0")); - gOptions.setOption(utf8("relaydebug"),utf8(newOptions.relayDebug()?"1":"0")); - gOptions.setOption(utf8("streamdatadebug"),utf8(newOptions.streamDataDebug()?"1":"0")); - gOptions.setOption(utf8("httpstyledebug"),utf8(newOptions.httpStyleDebug()?"1":"0")); - gOptions.setOption(utf8("statsdebug"),utf8(newOptions.statsDebug()?"1":"0")); - gOptions.setOption(utf8("microserverdebug"),utf8(newOptions.microServerDebug()?"1":"0")); - gOptions.setOption(utf8("threadrunnerdebug"),utf8(newOptions.threadRunnerDebug()?"1":"0")); - gOptions.setOption(utf8("admetricsdebug"),utf8(newOptions.adMetricsDebug()?"1":"0")); - gOptions.setOption(utf8("authdebug"),utf8(newOptions.authDebug()?"1":"0")); - - ILOG(gOptions.logSectionName() + "Processed global configuration settings."); - - // test for the source password having changed this will be - // applied in general though per stream changes are likely - // to have been set in the earlier checks before we got here - if (newOptions.password() != gOptions.password()) - { - gOptions.setOption(utf8("password"),newOptions.password()); - streamData *sd = streamData::accessStream(DEFAULT_SOURCE_STREAM); - if (sd) - { - ILOG(gOptions.logSectionName() + "Killing all stream sources due to change of relay options."); - sd->killAllSources(); - m_reloadRefresh = true; - sd->releaseStream(); - } - } - - config::streams_t new_streams, old_streams; - newOptions.getStreamConfigs(new_streams, false); - gOptions.getStreamConfigs(old_streams, false); - - config::streams_t::const_iterator iNSC = new_streams.begin(), iOSC = old_streams.begin(); - - // if no configurations found then we can just remove everything - if (new_streams.empty()) - { - // kick the source and clients as required on a removal - for (; iOSC != old_streams.end(); ++iOSC) - { - size_t streamID = (*iOSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - sd->killSource(streamID, sd); - m_reloadRefresh = true; - } - gOptions.removeStreamConfig((*iOSC).second); - } - } - - // otherwise if the same or more then we can update / add as required - else if (new_streams.size() >= old_streams.size()) - { - // if no configs specified and we're starting to add new stream configs - // then we really need to kick any existing sources otherwise it'll stay - // with the current details which will prevent a YP connection with extra - // checks in build 21+ to make sure it only works if there was a change. - if ((new_streams.size() != old_streams.size()) && - (old_streams.size() == DEFAULT_SOURCE_STREAM)) - { - // kick the source and clients as required on a complete addition - // (wouldn't have a valid config via authhash, etc so is sensible) - streamData *sd = streamData::accessStream(DEFAULT_SOURCE_STREAM); - if (sd) - { - ILOG(gOptions.logSectionName() + "Forcing stream source disconnect due to addition of stream config(s)."); - sd->killAllSources(); - m_reloadRefresh = true; - sd->releaseStream(); - } - } - - for (; iNSC != new_streams.end(); ++iNSC) - { - config::streams_t::const_iterator iOSC2 = old_streams.find((*iNSC).first); - if (iOSC2 != old_streams.end()) - { - // update required - __uint64 updated = gOptions.updateStreamConfig(newOptions, (*iNSC).second); - size_t streamID = (*iNSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - // otherwise do an in-place update as long as it is applicable - bool isRelay = sd->isRelayStream(streamID); - if (publicChanged || force || - (!force && (updated & RELAY_URL || updated & SOURCE_PWD || - updated & PUBLIC_SRV || (updated & ALLOW_RELAY && isRelay) || - (updated & ALLOW_PUBLIC_RELAY && isRelay) || updated & CIPHER_KEY || - updated & INTRO_FILE || updated & BACKUP_FILE || - updated & BACKUP_URL || updated & MOVED_URL))) - { - sd->killSource(streamID); - m_reloadRefresh = true; - - if (!(*iNSC).second.m_relayUrl.url().empty() && - !sd->isSourceConnected(streamID) && - gOptions.stream_movedUrl(streamID).empty()) - { - relays.push_back((*iNSC).second); - } - } - // otherwise do an in-place update as long as it is applicable - else - { - sd->streamUpdate(streamID, (*iNSC).second.m_authHash, (*iNSC).second.m_maxStreamUser, - (*iNSC).second.m_maxStreamBitrate, (*iNSC).second.m_minStreamBitrate); - } - - // refresh the played history size as needed - if (updated & SONG_HIST) - { - sd->updateSongHistorySize(); - } - - if (updated & ARTWORK_FILE) - { - if (gOptions.read_stream_artworkFile(streamID)) - { - gOptions.m_artworkBody[streamID] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile(streamID)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - else - { - gOptions.m_artworkBody[streamID].clear(); - sd->clearCachedArtwork(0); - } - } - sd->releaseStream(); - } - // otherwise if no proper update or a relay was added / is known and not connected then bump it - else - { - // force flag a source relay kick if this is called - bool noEntry = false; - if ((streamData::isRelayActive(streamID, noEntry) & 12)) - { - // if there is a relay attempt and no new one - // then we need to signal it to abort trying - if ((*iNSC).second.m_relayUrl.url().empty()) - { - streamData::setRelayActiveFlags (streamID, noEntry, 2); - } - // otherwise we need update the relay url - // which the attempt is trying to join to - // which is done by the relay handling. - } - - if (((*iOSC2).second.m_relayUrl.url() != (*iNSC).second.m_relayUrl.url() || - (updated & MOVED_URL)) && !(*iNSC).second.m_relayUrl.url().empty()) - { - relays.push_back((*iNSC).second); - m_reloadRefresh = true; - } - } - } - else - { - // addition required - // no need to do anything else as there shouldn't be anything connected on this at the time - gOptions.addStreamConfig(newOptions, (*iNSC).second); - m_reloadRefresh = true; - - // only attempt to start a relay url if added and a relay url exists - if (!(*iNSC).second.m_relayUrl.url().empty()) - { - relays.push_back((*iNSC).second); - } - } - } - } - - // otherwise if there are fewer stream configurations then we can update / remove as required - else - { - for (; iOSC != old_streams.end(); ++iOSC) - { - config::streams_t::const_iterator iOSC2 = new_streams.find((*iOSC).first); - if (iOSC2 != new_streams.end()) - { - // update required - __uint64 updated = gOptions.updateStreamConfig(newOptions, (*iOSC2).second); - size_t streamID = (*iOSC2).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - // check what has been updated and kick the source as applicable - bool isRelay = sd->isRelayStream(streamID); - if (publicChanged || force || - (!force && (updated & RELAY_URL || updated & SOURCE_PWD || - updated & PUBLIC_SRV || (updated & ALLOW_RELAY && isRelay) || - (updated & ALLOW_PUBLIC_RELAY && isRelay) || updated & CIPHER_KEY || - updated & INTRO_FILE || updated & BACKUP_FILE || - updated & BACKUP_URL || updated & MOVED_URL))) - { - sd->killSource(streamID); - m_reloadRefresh = true; - - if (!(*iOSC2).second.m_relayUrl.url().empty() && - !sd->isSourceConnected(streamID) && - gOptions.stream_movedUrl(streamID).empty()) - { - relays.push_back((*iOSC2).second); - } - } - // otherwise do an in-place update as long as it is applicable - else - { - sd->streamUpdate(streamID, (*iOSC2).second.m_authHash, (*iOSC2).second.m_maxStreamUser, - (*iOSC2).second.m_maxStreamBitrate, (*iOSC2).second.m_minStreamBitrate); - } - - // refresh the played history size as needed - if (updated & SONG_HIST) - { - sd->updateSongHistorySize(); - } - - if (updated & ARTWORK_FILE) - { - if (gOptions.read_stream_artworkFile(streamID)) - { - gOptions.m_artworkBody[streamID] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile(streamID)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - else - { - gOptions.m_artworkBody[streamID].clear(); - sd->clearCachedArtwork(0); - } - } - sd->releaseStream(); - } - } - else - { - // kick the source and clients as required on a removal - size_t streamID = (*iOSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - sd->killSource(streamID, sd); - m_reloadRefresh = true; - } - // removal required - gOptions.removeStreamConfig((*iOSC).second); - } - } - } - - // test for the require stream configs having changed - // only need to kick streams not known if enabled - if (newOptions.requireStreamConfigs() != gOptions.requireStreamConfigs()) - { - gOptions.setOption(utf8("requirestreamconfigs"),utf8(newOptions.requireStreamConfigs()?"1":"0")); - if (newOptions.requireStreamConfigs()) - { - size_t inc = 0; - size_t sid; - do - { - sid = streamData::enumStreams(inc); - config::streams_t streams; - gOptions.getStreamConfigs(streams, false); - - config::streams_t::const_iterator ics = streams.find(sid); - if (ics == streams.end()) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ILOG(gOptions.logSectionName() + "Killing source for stream #" + tos(sid) + " as it is not in the known stream config(s).", LOG_NAME, sid); - sd->killSource(sid, sd); - m_reloadRefresh = true; - } - } - ++inc; - } - while (sid); - } - } - - // finally we refresh the passwords so they're correct after any changes - config::streams_t streams; - gOptions.getStreamConfigs(streams, false); - gOptions.setupPasswords(streams); - - // if a force was done then we really need to restart any relays - if (force) - { - // schedule relays - vector relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for_each(relayList.begin(),relayList.end(),restartRelay); - } - } - // otherwise only attempt to restart any which were added, changed, etc - else - { - if (!relays.empty()) - { - for_each(relays.begin(),relays.end(),restartRelay); - } - } - - ILOG(gOptions.logSectionName() + "Completed stream config reload from `" + fileUtil::getFullFilePath(gOptions.confFile())); - return m_reloadRefresh; -} - -void reloadBanLists() -{ - // load up ban file - int loaded = g_banList.load(gOptions.banFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up ban file - if (gOptions.read_stream_banFile((*i).first)) - { - ++count; - if (g_banList.load(gOptions.stream_banFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[BAN] No banned lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[BAN] Reloaded all banned list(s)."); - } - else - { - ILOG("[BAN] Partially reloaded banned list(s) - check error messages above."); - } - } -} - -void reloadRipLists() -{ - // load up rip file - int loaded = g_ripList.load(gOptions.ripFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up rip file - if (gOptions.read_stream_ripFile((*i).first)) - { - ++count; - if (g_ripList.load(gOptions.stream_ripFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[RIP] No reserved lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[RIP] Reloaded all reserved list(s)."); - } - else - { - ILOG("[RIP] Partially reloaded reserved list(s) - check error messages above."); - } - } -} - -void reloadAdminAccessList() -{ - // load up admin access file - g_adminList.load(gOptions.adminFile()); - ILOG("[ADMINCGI] Reloaded admin access list."); -} - -void reloadAgentLists() -{ - // load up agent file - int loaded = g_agentList.load(gOptions.agentFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up agent file - if (gOptions.read_stream_agentFile((*i).first)) - { - ++count; - if (g_agentList.load(gOptions.stream_agentFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[AGENT] No user agent lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[AGENT] Reloaded all user agent list(s)."); - } - else - { - ILOG("[AGENT] Partially reloaded user agent list(s) - check error messages above."); - } - } -} - -void printUpdateMessage() -{ - // display update message where applicable - updater::verInfo ver; - if (updater::getNewVersion(ver)) - { - ULOG(string(YP2_LOGNAME) + "A new DNAS version is now available: " + ver.ver); - ULOG(string(YP2_LOGNAME) + "The suggested download for your setup is: " + ver.url); - ULOG(string(YP2_LOGNAME) + "See " + ver.log + " for more information about this update and alternative download links"); - } -} - -utf8 warningImage(const bool right = true) -{ - return utf8(right ? " " : "") + ""; -} - -utf8 baseImage(const utf8& image, const utf8& title, const bool left = false, const bool prefix = true) -{ - return (prefix ? " " : (utf8)"") + ""; -} - -#define xffImage() baseImage("xff", "XFF", true) -#define mplayerImage() baseImage("mplayer", "MPlayer Client") -#define psImage() baseImage("ps", "PlayStation Client") -#define radioToolboxImage() baseImage("rtb", "Radio Toolbox Monitor / Player") -#define v1Image() baseImage("v1", "v1 Client") -#define v2Image() baseImage("v2", "v2 Client") -#define relayImage() baseImage("relay", "Relay Connection", false, false) -#define html5Image() baseImage("html5", "HTTP / HTML5 Client") -#define flashImage() baseImage("flash", "Flash Client") -#define icecastImage() baseImage("icecast", "Icecast Client / Relay") -#define vlcImage() baseImage("vlc", "VLC Client") -#define waImage() baseImage("wa", "Winamp Client") -#define scImage() baseImage("", "Shoutcast Client / Relay") -#define iOSImage() baseImage("", "iOS Client") -#define curlImage() baseImage("curl", "cURL / libcurl Based Client") -#define radionomyImage() baseImage("radionomy", "Radionomy Stats Collector") -#define fb2kImage() baseImage("fb2k", "Foobar2000 Client") -#define rokuImage() baseImage("roku", "Roku Streaming Player") -#define WiiMCImage() baseImage("v1", "Wii Media Centre Player") -#define synologyImage() baseImage("synology", "Audio Station (Synology) Player") -#define appleImage() baseImage("apple", "Apple Device / OS / Client") -#define iTunesImage() baseImage("itunes", "iTunes Client") -#define wmpImage() baseImage("wmp", "Windows Media Player Client") -#define chromeImage() baseImage("chrome", "Chrome Web Browser") -#define safariImage() baseImage("safari", "Safari Web Browser") -#define ieImage() baseImage("ie", "Internet Explorer Web Browser") -#define firefoxImage() baseImage("firefox", "Firefox Web Browser") - -utf8 advertImage(const streamData::streamID_t sid, const int group, const size_t count) -{ - if (streamData::knownAdvertGroup(sid, group)) - { - if (count > 0) - { - return baseImage("adplayed", (tos(count) + " Advert Breaks Have Been Played\nAdvert Group: " + tos(group)), false, false); - } - return baseImage("adavail", ("Waiting For First Advert Break To Play\nAdvert Group: " + tos(group)), false, false); - } - if (count > 0) - { - return baseImage("", (tos(count) + " Advert Breaks Have Been Played\nNo Applicable " - "Adverts Currently Available\nAdvert Group: " + tos(group)), false, false); - } - - return baseImage("noadavail", ("No Applicable Adverts Available\nAdvert Group: " + tos(group)), false, false); -} - -utf8 getClientImage(const streamData::source_t type) -{ - return ((type & streamData::RADIONOMY) ? radionomyImage() : - ((type & streamData::FLV) ? flashImage() : - ((type & streamData::CURL_TOOL) ? curlImage() : - ((type & streamData::HTTP) ? html5Image() : - //((type & streamData::M4A) ? m4aImage() : - ((type & streamData::SHOUTCAST2) ? ((type & streamData::RELAY) ? scImage() : waImage()) : - ((type & streamData::ICECAST) ? icecastImage() : - ((type & streamData::VLC) ? vlcImage() : - ((type & streamData::WINAMP) ? waImage() : - ((type & streamData::APPLE) ? appleImage() : - ((type & streamData::ITUNES) ? iTunesImage() : - ((type & streamData::WMP) ? wmpImage() : - ((type & streamData::ROKU) ? rokuImage() : - ((type & streamData::WIIMC) ? WiiMCImage() : - ((type & streamData::SYNOLOGY) ? synologyImage() : - ((type & streamData::CHROME) ? chromeImage() : - ((type & streamData::SAFARI) ? safariImage() : - ((type & streamData::IE) ? ieImage() : - ((type & streamData::FIREFOX) ? firefoxImage() : - ((type & streamData::MPLAYER) ? mplayerImage() : - ((type & streamData::PS) ? psImage() : - ((type & streamData::RADIO_TOOLBOX) ? radioToolboxImage() : - ((type & streamData::HTML5) ? html5Image() : - ((type & streamData::WARNING) ? warningImage() : - ((type & streamData::SC_IRADIO) ? iOSImage() : - ((type & streamData::FB2K) ? fb2kImage() : v1Image() - ))))))))))))))))))))))))) + - ((type & streamData::RELAY) ? relayImage() : ""); -} - -/* - Handles all HTTP requests to admin.cgi -*/ - -protocol_admincgi::protocol_admincgi(const socketOps::tSOCKET s, const streamData::streamID_t sid, const bool no_sid, - const bool zero_sid, const utf8 &clientLogString, - const uniString::utf8 &password, const uniString::utf8 &referer, - const uniString::utf8 &hostIP, const uniString::utf8 &userAgent, - const protocol_HTTPStyle::HTTPRequestInfo &httpRequestInfo) throw(std::exception) - : runnable(s), m_noSID(no_sid), m_zeroSID(zero_sid), - m_saveLogFile(0), m_clientLogString(clientLogString), - m_httpRequestInfo(httpRequestInfo), m_password(password), - m_referer(referer), m_hostIP(hostIP), m_userAgent(userAgent), - m_sid(sid), m_state(&protocol_admincgi::state_ConfirmPassword), - m_nextState(0), m_outBuffer(0), m_outBufferSize(0), - m_tailLogFile(false), lastChar(-1), inMsg(false), - first(false), m_logFile(0) -{ - memset(&m_stream, 0, sizeof(m_stream)); - - // check for updates weekly from the last update - // so we're taking into account manual checks... - if ((m_lastActivityTime - last_update_check) > 604800) - { - checkVersion(m_lastActivityTime); - } - - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); -} - -protocol_admincgi::~protocol_admincgi() throw() -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - socketOps::forgetTCPSocket(m_socket); - if (m_logFile) - { - ::fclose(m_logFile); - m_logFile = 0; - } -} - -void protocol_admincgi::timeSlice() throw(exception) -{ - (this->*m_state)(); -} - -void protocol_admincgi::state_Close() throw(exception) -{ - m_result.done(); -} - -// send buffer text -void protocol_admincgi::state_Send() throw(exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_state = m_nextState; - } -} - -void protocol_admincgi::sendMessageAndClose(const utf8 &msg) throw() -{ - m_outMsg = msg; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_Close; - m_result.write(); - m_result.run(); -} - -/// update the metatdata in the shoutcast ring buffer -void protocol_admincgi::state_UpdateMetadata() throw(exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(m_sid, info, extra); - - utf8 titleMsg, urlMsg, djMsg, nextMsg; - - if (!m_updinfoSong.empty()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - if (!m_updinfoSong.isValid()) - { - m_updinfoSong = asciiToUtf8(m_updinfoSong.toANSI(true)); - } - - if (streamData::validateTitle(m_updinfoSong)) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Title updated [" + m_updinfoSong + "]"); - } - else - { - WLOG("Title update rejected - value not allowed: " + m_updinfoSong, LOG_NAME, m_sid); - m_updinfoSong = info.m_currentSong; - } - } - else - { - if (!info.m_currentSong.empty()) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Title cleared"); - } - } - - if (!m_updinfoURL.empty()) - { - urlMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Song url updated [" + m_updinfoURL + "]"); - } - else - { - if (!info.m_currentURL.empty()) - { - // TODO if there's a custom image then indicate using it or do not show this - urlMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Song url cleared"); - } - } - - if (!m_updinfoDJ.empty()) - { - djMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] DJ name updated [" + m_updinfoDJ + "]"); - } - else - { - if (!info.m_streamUser.empty()) - { - djMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] DJ name cleared"); - } - } - - if (!m_updinfoNext.empty()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - if (!m_updinfoNext.isValid()) - { - m_updinfoNext = asciiToUtf8(m_updinfoNext.toANSI(true)); - } - - if (streamData::validateTitle(m_updinfoNext)) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Next title updated [" + m_updinfoNext + "]"); - } - else - { - WLOG("[ADMINCGI sid=" + tos(m_sid) + "] Next title update rejected - value not allowed: " + m_updinfoNext); - m_updinfoNext = info.m_comingSoon; - } - } - else - { - if (!info.m_comingSoon.empty()) - { - nextMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Next title cleared"); - } - } - - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - utf8 sourceIdent = (!m_userAgent.empty() ? m_userAgent : utf8("Legacy / Unknown")); - sd->updateSourceIdent(sourceIdent, sd->isRelayStream(m_sid)); - sd->addSc1MetadataAtCurrentPosition(LOGNAME, m_updinfoSong, m_updinfoURL, m_updinfoNext); - sd->updateStreamUser(m_updinfoDJ); - // this will call streamData::releaseStream(..) - streamData::streamClientLost(LOGNAME, sd, m_sid); - - // we'll output any earlier generated messages now that we've sent - // the details to be used as otherwise they were being reported as - // ok which if there was an issue (e.g. bad sid#) was confusing - if (!titleMsg.empty()) - { - ILOG(titleMsg, LOG_NAME, m_sid); - } - if (!nextMsg.empty()) - { - ILOG(nextMsg, LOG_NAME, m_sid); - } - if (!urlMsg.empty()) - { - ILOG(urlMsg, LOG_NAME, m_sid); - } - if (!djMsg.empty()) - { - ILOG(djMsg, LOG_NAME, m_sid); - } - } - else - { - WLOG("[ADMINCGI sid=" + tos(m_sid) + "] Metadata update rejected as the stream does not exist", LOG_NAME, m_sid); - } - - m_updinfoSong.clear(); - m_updinfoURL.clear(); - m_updinfoDJ.clear(); - - sendMessageAndClose(MSG_200); -} - -/// update the metatdata in the shoutcast ring buffer -void protocol_admincgi::state_UpdateXMLMetadata() throw(exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - if (!m_updinfoSong.empty()) - { - ILOG("XML title update [" + m_updinfoSong + "]", LOG_NAME, m_sid); - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - vector<__uint8> assembledData; - assembledData.insert(assembledData.end(), m_updinfoSong.begin(), m_updinfoSong.end()); - utf8 sourceIdent = (!m_userAgent.empty() ? m_userAgent : utf8("Legacy / Unknown")); - sd->updateSourceIdent(sourceIdent); - sd->addUvoxMetadataAtCurrentPosition(MSG_METADATA_XML_NEW, assembledData); - // this will call streamData::releaseStream(..) - streamData::streamClientLost(LOGNAME, sd, m_sid); - } - else - { - WLOG("XML title update rejected as stream #" + tos(m_sid) + " does not exist", LOG_NAME, m_sid); - } - m_updinfoSong.clear(); - m_updinfoURL.clear(); - } - - sendMessageAndClose(MSG_200); -} - -void protocol_admincgi::state_ConfirmPassword() throw(std::exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - // this will see if we've been refered from the base admin.cgi and will allow through - // if the password / auth matches with the key admin account so the page is useable. - utf8::size_type pos; - if ((pos = m_referer.rfind(utf8("admin.cgi"))) != utf8::npos) - { - m_referer = m_referer.substr(pos); - } - - const utf8& mode = mapGet(m_httpRequestInfo.m_QueryParameters, "mode", (utf8)""); - const bool updinfo = (mode == "updinfo"); - const bool viewxml = (mode == "viewxml"); - const bool viewjson = (mode == "viewjson"); - const bool _register = (mode == "register"); - - // on the root admin summary page we can only allow referer admin through if looking at the stats - const bool adminRefer = (m_referer.find(utf8("admin.cgi")) == 0 || m_referer.find(utf8("admin.cgi?sid=0")) == 0); - int okReferer = (adminRefer && (viewxml || viewjson || _register)); - - // on the root admin summary page we can check if it's an authhash action and allow - // through if things match up + also allow updinfo (not ideal but maintains legacy) - if ((!okReferer && ((mode == "manualauthhash") || _register)) || updinfo) - { - if (!m_referer.empty()) - { - okReferer = (m_referer.find(utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=")) != utf8::npos); - } - } - - DEBUG_LOG(LOGNAME "Referrer status: " + tos(okReferer)); - - // fixed in Build 18 to revert to the master passwords if there's nothing for the stream - utf8 streamPassword = gOptions.stream_password(m_sid); - if (!gOptions.read_stream_password(m_sid) && streamPassword.empty()) - { - streamPassword = gOptions.password(); - } - - utf8 streamAdminPassword = gOptions.stream_adminPassword(m_sid); - if (!gOptions.read_stream_adminPassword(m_sid) && streamAdminPassword.empty()) - { - streamAdminPassword = gOptions.adminPassword(); - } - - // this is so we can allow source password connections access to the - // mode=viewxml&page=1 (/stats) and mode=viewxml&page=4 (/played) so - // we maintain compatibility with 1.x DNAS which only had these ones - int page = 0; - bool compat_mode = false; - if (viewxml || viewjson) - { - page = mapGet(m_httpRequestInfo.m_QueryParameters, "page", (int)page); - // this will act like /stats or / played (or both - // if page=0)so as to better emulate the 1.x DNAS - if ((page == 0) || (page == 1) || (page == 4)) - { - compat_mode = true; - } - } - - bool proceed = (((!streamPassword.empty() && (updinfo || compat_mode) && (m_password == streamPassword)) || - (!streamAdminPassword.empty() && (m_password == streamAdminPassword)) || - (!gOptions.adminPassword().empty() && (m_password == gOptions.adminPassword())))); - - DEBUG_LOG(LOGNAME "Password status: " + tos(proceed)); - - if (proceed) - { - const streamData::streamID_t this_sid = (m_zeroSID || m_noSID ? 0 : m_sid); - const utf8& p1 = mapGet(m_httpRequestInfo.m_QueryParameters, mode, (utf8)""); - DEBUG_LOG(LOGNAME "Requested mode: " + (!mode.empty() ? mode : "Not Specified")); - if (updinfo) - { - m_updinfoSong = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "song", (utf8)"")); - m_updinfoURL = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "url", (utf8)"")); - m_updinfoDJ = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "dj", (utf8)"")); - m_updinfoNext = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "next", (utf8)"")); - m_state = ((m_updinfoSong.find(utf8("streamUpdate(m_sid, (utf8)"", sd->streamMaxUser(), - sd->streamMaxBitrate(), sd->streamMinBitrate()); - sd->releaseStream(); - } - } - } - else - { - connected = true; - - // sanity checks to ensure that we're not re-adding when there is one, etc - streamData::streamInfo info; - streamData::extraInfo extra; - if (!streamData::getStreamInfo(m_sid, info, extra)) - { - info.m_authHash = gOptions.stream_authHash(m_sid); - } - - if (connected == true || extra.isRelay) - { - mode_register(m_sid, info); - } - } - - if (connected == false) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid), SHRINK)); - } - } - } - else if (mode == "listeners") - { - mode_listeners(this_sid); - } - else if (mode == "kicksrc") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - // kick source off system - streamData::killStreamSource(m_sid); - - if (!m_referer.empty()) - { - utf8 check = ("admin.cgi?sid=" + tos(m_sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0"), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "kickdst" && (!p1.empty())) - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - mode_kickdst(m_sid, p1); - } - } - else if (mode == "viewban") - { - mode_viewban(this_sid); - } - else if (mode == "bandst" && (!p1.empty())) - { - const int mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (int)255); - mode_ban(this_sid, p1, mask); - } - else if (mode == "banip") - { - const utf8 &ip1 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip1", (utf8)""), - &ip2 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip2", (utf8)""), - &ip3 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip3", (utf8)""), - &ip4 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip4", (utf8)""), - &mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (utf8)""); - if (ip1.empty() || ip2.empty() || ip3.empty() || ip4.empty() || mask.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban")) && - (m_referer != utf8("admin.cgi?mode=viewban"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "" - "Shoutcast Server" - "Invalid resource" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_ban(this_sid, (ip1 + "." + ip2 + "." + ip3 + "." + ip4), strtol((const char *)mask.c_str(),0,10)); - } - } - else if (mode == "unbandst") - { - const utf8 &ip = mapGet(m_httpRequestInfo.m_QueryParameters, "bandst", (utf8)""), - &mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (utf8)""); - if (ip.empty() || mask.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban")) && - (m_referer != utf8("admin.cgi?mode=viewban"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "" - "Shoutcast Server" - "Invalid resource" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_unban(this_sid, ip, strtol((const char *)mask.c_str(), 0, 10)); - } - } - else if (mode == "viewrip") - { - mode_viewrip(this_sid); - } - else if (mode == "ripip") - { - const utf8 &ip1 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip1", (utf8)""), - &ip2 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip2", (utf8)""), - &ip3 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip3", (utf8)""), - &ip4 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip4", (utf8)""); - if (ip1.empty() || ip2.empty() || ip3.empty() || ip4.empty()) - { - // see if we've got a host add attempt and handle as appropriately - if (m_hostIP.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip")) && - (m_referer != utf8("admin.cgi?mode=viewrip"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "" - "Shoutcast Server" - "Invalid resource" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, m_hostIP, raw); - } - } - else - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, (ip1 + "." + ip2 + "." + ip3 + "." + ip4), raw); - } - } - else if (mode == "unripdst") - { - const utf8 &ip = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdst", (utf8)""), - &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - if (!isAddress(ip)) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip")) && - (m_referer != utf8("admin.cgi?mode=viewrip"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "" - "Shoutcast Server" - "Invalid resource" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_unrip(this_sid, ip, raw); - } - } - else if (mode == "ripdst" && (!p1.empty())) - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, p1, raw); - } - else if (mode == "viewagent") - { - mode_viewagent(this_sid); - } - else if (mode == "unagent") - { - const utf8 &agent = mapGet(m_httpRequestInfo.m_QueryParameters, "agent", (utf8)""); - if (agent.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewagent")) && - (m_referer != utf8("admin.cgi?mode=viewagent"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "" - "Shoutcast Server" - "Invalid resource" : "")); - } - else - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewagent", SHRINK)); - } - } - else - { - mode_unagent(this_sid, agent); - } - } - else if (mode == "agent") - { - const utf8 &agent = mapGet(m_httpRequestInfo.m_QueryParameters, "agent", (utf8)""); - mode_agent(this_sid, agent); - } - else if (mode == "resetxml") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - stats::resetStats(m_sid); - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "clearcache") - { - // TODO consider clearing out the intro / backup files as ell as part of this... - - // clear out all cached resource copies - gOptions.m_crossdomainStr.clear(); - gOptions.m_crossdomainStrGZ.clear(); - gOptions.m_shoutcastSWFStr.clear(); - gOptions.m_shoutcastSWFStrGZ.clear(); - gOptions.m_robotsTxtBody.clear(); - gOptions.m_robotsTxtBodyGZ.clear(); - - gOptions.m_faviconBody.clear(); - gOptions.m_faviconBodyGZ.clear(); - gOptions.m_favIconTime = 0; - - gOptions.m_styleCustomStr.clear(); - gOptions.m_styleCustomStrGZ.clear(); - gOptions.m_styleCustomHeaderTime = 0; - - DeleteAllCaches(); - - last_update_check = 0; - - ILOG(LOGNAME "Cleared resource cache(s)."); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "bannedlist") - { - reloadBanLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "reservelist") - { - reloadRipLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "adminlist") - { - reloadAdminAccessList(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "useragentlist") - { - reloadAgentLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "reload") - { - const int force = mapGet(m_httpRequestInfo.m_QueryParameters, "force", (int)0); - if (adminRefer) - { - sendMessageAndClose(redirect((reloadConfig(force) == true ? "admin.cgi?sid=0&refresh=3" : "admin.cgi?sid=0"), SHRINK)); - } - else - { - reloadConfig(force); - sendMessageAndClose(MSG_200); - } - } - else if (mode == "viewlog") - { - if (m_noSID) - { - const utf8 &server = mapGet(m_httpRequestInfo.m_QueryParameters, "server", (utf8)""); - if (!server.empty() && ((server == logId) || (server == logTailId))) - { - mode_viewlog(m_sid, (p1 == "tail"), (p1 == "save"), true); - } - else - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - } - else - { - mode_viewlog(m_sid, (p1 == "tail"), (p1 == "save"), false); - } - } - else if (mode == "history") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - const bool json = (type == "json"), xml = (type == "xml"); - if (!json && !xml) - { - mode_history(m_sid); - } - else - { - utf8 header, body; - if (json) - { - const utf8& callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - body = protocol_HTTPStyle::getPlayedJSON(m_sid, header, callback, true); - } - else - { - body = protocol_HTTPStyle::getPlayedXML(m_sid, header, true); - } - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - } - } - else if (mode == "art") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - mode_art(m_sid, (p1 == "playing")); - } - } - else if (mode == "manualauthhash") - { - bool handled = false; - const utf8 &authhash = mapGet(m_httpRequestInfo.m_QueryParameters, "authhash", (utf8)""); - // make sure that we're only allow valid values - if (authhash.empty() || yp2::isValidAuthhash(authhash)) - { - bool idHandled = false; - if (gOptions.editConfigFileEntry(m_sid, gOptions.confFile(), authhash, "", - true, handled, idHandled, true) == false) - { - handled = false; - } - - // changed in b69 to force the change through even if there is a config saving issue - // as there are cases where the authhash is gone but only updating on success would - // end up in the inability to start things over again e.g. with CentroCast v3 quirks - gOptions.setOption(utf8("streamauthhash_" + tos(m_sid)), authhash); - } - - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - if (sd->isSourceConnected(m_sid)) - { - utf8 oldAuthhash = sd->streamAuthhash(); - sd->streamUpdate(m_sid, authhash, sd->streamMaxUser(), - sd->streamMaxBitrate(), sd->streamMinBitrate()); - - ILOG(gOptions.logSectionName() + "Changed authhash for stream #" + - tos(m_sid) + " to " + (authhash.empty() ? "empty" : authhash) + - " [was " + (oldAuthhash.empty() ? "empty" : oldAuthhash) + "]"); - } - sd->releaseStream(); - } - - // now attempt to update internal states as appropriate if all went ok - if (handled == true) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Content-Length:5\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n\r\n200\r\n"); - } - else - { - utf8 message = "Error saving changes to the configuration file.
" - "Check that you have write access and the
" - "specified configuration file still exists.

" - "The requested authhash change was applied."; - utf8 header = "HTTP/1.1 667\r\n" - "Content-Type:text/plain\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n"; - COMPRESS(header, message); - header += "Content-Length:" + tos(message.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? message : "")); - } - } - else if (mode == "rotate") - { - const utf8 &files = mapGet(m_httpRequestInfo.m_QueryParameters, "files", (utf8)""), - &rotateType = (!(files == "log" || files == "w3c") ? "all " : (files == "log" ? "": "W3C ")); - ILOG(LOGNAME "Rotating " + rotateType + "log file(s)"); - - if ((files == "log") || (files == "")) - { - ROTATE; - printUpdateMessage(); - if (m_logFile) - { - ::fclose(m_logFile); - m_logFile = 0; - } - } - - // and now rotate the w3c logs (going upto the configured number of old copies to be like the log rotate) - rotatew3cFiles(files); - - ILOG(LOGNAME "Rotated " + rotateType + "log file(s) [PID: " + tos(getpid()) + "]"); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "startrelay") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - // only attempt a source relay connection if it is not signaled - // as active or pending to prevent multiple attempts being run. - bool noEntry = false, active = (streamData::isRelayActive(m_sid, noEntry) == 1); - if (!active) - { - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, m_sid)) - { - restartRelay(stream); - } - } - - if (!m_referer.empty()) - { - utf8 check = ("admin.cgi?sid=" + tos(m_sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0") + - (!active ? "&refresh=3" : ""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "startrelays") - { - bool refresh = false; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (!(*i).second.m_relayUrl.url().empty() && !streamData::isSourceConnected((*i).first)) - { - // only attempt a source relay connection if it is not signaled - // as active or pending to prevent multiple attempts being run. - bool noEntry = false, active = (streamData::isRelayActive((*i).first, noEntry) == 1); - if (!active) - { - ILOG(gOptions.logSectionName() + "Starting source for stream #" + tos((*i).first) + "."); - restartRelay((*i).second); - refresh = true; - } - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi?sid=0" + (refresh ? "&refresh=3" : (utf8)""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "kicksources") - { - bool refresh = false; - streamData::streamIDs_t streamIds = streamData::getStreamIds(true); - if (!streamIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - // kick source off system - streamData::killStreamSource((*i)); - refresh = true; - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi?sid=0" + (refresh ? "&refresh=1" : (utf8)""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if(mode == "bandwidth") - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - const bool json = (type == "json"), xml = (type == "xml"); - - if (!json && !xml) - { - const int refresh = mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0); - mode_bandwidth_html(refresh); - } - else - { - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - mode_bandwidth_json(callback); - } - else - { - mode_bandwidth_xml(); - } - } - } - else if (mode == "ypstatus") - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - if ((type == "json")) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - mode_ypstatus_json(callback); - } - else - { - mode_ypstatus_xml(); - } - } - else if (mode == "sources") - { - mode_sources(m_hostIP); - } - else if (mode == "adgroups") - { - mode_adgroups(); - } - else if (mode == "debug") - { - const utf8 &option = mapGet(m_httpRequestInfo.m_QueryParameters, "option", (utf8)""); - if (!option.empty() && !adminRefer) - { - // prevent direct access to being able to edit this - // and force a redirection to the non-param version - sendMessageAndClose(redirect("admin.cgi?mode=debug", SHRINK)); - return; - } - - const utf8 &on_off = mapGet(m_httpRequestInfo.m_QueryParameters, "on", (utf8)""); - mode_debug(option, (on_off == "true"), adminRefer); - } - else if (mode == "help") - { - mode_help(); - } - else if (mode == "config") - { - mode_config(); - } -#if 0 - else if (mode == "logs") - { - mode_logs(result); - } -#endif - else if (mode == "version") - { - // only allow from the admin page to avoid possible spamming sttempts - if (adminRefer) - { - checkVersion(m_lastActivityTime); - sendMessageAndClose(redirect("admin.cgi?sid=0&refresh=-3", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - if (m_noSID) - { - // do a sanity check so that we're only accessing this with the true adminpassword - if (m_zeroSID) - { - mode_summary(mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0)); - } - // not matching the master password so show the simple summary - else - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - } - else - { - const int refresh = mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0); - mode_none(m_sid, refresh); - } - } - } - else - { - sendMessageAndClose(MSG_AUTHFAILURE401 + utf8(!HEAD_REQUEST ? - "UnauthorizedShoutcast " - "Administrator" : "")); - } -} - -void protocol_admincgi::state_SendFileHeader() throw(std::exception) -{ - if ((!m_saveLogFile && SHRINK) && - compressDataStart(m_logFileBodyPrefix, &m_stream, (Bytef*)"sc_serv.log\0", false)) - { - m_logFileHeader += "Content-Encoding:gzip\r\n"; - } - m_logFileHeader += "\r\n"; - - m_outMsg = m_logFileHeader + (!m_saveLogFile ? tohex(m_logFileBodyPrefix.size()) + "\r\n" + m_logFileBodyPrefix + "\r\n" : ""); - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileContents; - m_result.write(); - - if (m_tailLogFile) - { - m_result.read(fileno(m_logFile)); - } -} - -void protocol_admincgi::state_SendFileFooter() throw(std::exception) -{ - if (SHRINK) - { - compressDataCont(m_logFileBodyFooter, &m_stream); - } - m_logFileBodyFooter = tohex(m_logFileBodyFooter.size()) + "\r\n" + m_logFileBodyFooter + "\r\n"; - m_outBuffer = m_logFileBodyFooter.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_logFileBodyFooter.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileEnd; - m_result.write(); -} - -void protocol_admincgi::state_SendFileEnd() throw(std::exception) -{ - strncpy((char*)&(m_logFileBuffer[0]), "0\r\n\r\n", 1024); - m_outBuffer = &(m_logFileBuffer[0]); - m_outBufferSize = 5; - m_nextState = &protocol_admincgi::state_Close; - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, m_outBufferSize); - compressDataEnd(&m_stream); - - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_Close; - m_result.write(); -} - -// this will only be receiving an already converted -// string so no need to do the commented part again -utf8 protocol_admincgi::escapeText(const std::vector &s) throw() -{ - utf8 result; - result.resize(0); - bool inHead = false; - int headCount = 0; - const size_t amt = s.size(); - - for (size_t x = 0; x < amt; ++x) - { - if ((s[x] == '*') && (((x + 1) < amt) && (s[x + 1] == '*'))) - { - inHead = true; - } - else if (s[x] == '\n') - { - if (!inHead) - { - if ((((x + 1) < amt) && isdigit(s[x + 1]))) - { - if (inMsg) - { - result += "
"; - } - result += "\n"; - inMsg = false; - } - else - { - if (((x + 1) == amt)) - { - if (inMsg) - { - result += "
"; - } - result += "\n"; - inMsg = false; - } - else - { - result += "\n\t\t\t"; - } - } - } - else - { - ++headCount; - } - } - else if ((s[x] == 'D') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "D"; - inMsg = true; - } - else if ((s[x] == 'E') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "E"; - inMsg = true; - } - else if ((s[x] == 'W') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "W"; - inMsg = true; - } - else if ((s[x] == 'U') && - (((x > 0) && (s[x-1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "U"; - inMsg = true; - } - else if ((s[x] == 'I') && - (((x > 0) && (s[x-1] == '\t')) || - (!x && (lastChar == '\t')))) - { - if (!inHead) - { - result += "I"; - inMsg = true; - } - } - else - { - if (!inHead) - { - if (s[x] == '<') - { - result += "<"; - } - else if (s[x] == '>') - { - result += ">"; - } - else if (s[x] == '&') - { - result += "&"; - } - else if (s[x] == '\'') - { - result += "'"; - } - else if (s[x] == '"') - { - result += """; - } - else - { - result += s[x]; - } - } - else - { - if (inHead && (headCount > 3) && (s[x] == '\t')) - { - inHead = false; - headCount = 0; - x += 5; - } - } - } - if (!s[x]) - { - break; - } - } - - lastChar = s[amt - 1]; - return result; -} - -void protocol_admincgi::state_SendFileContents() throw(std::exception) -{ - m_logFileBuffer.clear(); - m_logFileBuffer.resize(SEND_SIZE); - const size_t amt = fread(&(m_logFileBuffer[0]), 1, (SEND_SIZE - 1), m_logFile); - if (amt > 0) - { - static utf8 out; - out.clear(); - - if (!m_saveLogFile) - { - m_logFileBuffer.resize(amt); - out = escapeText(m_logFileBuffer); - } - else - { - out = utf8(&(m_logFileBuffer[0]), amt); - } - - if (!out.empty()) - { - if (m_saveLogFile || (SHRINK)) - { - if (m_saveLogFile == 1) - { - if (compressDataStart(out, &m_stream, (Bytef*)m_logFileName.c_str())) - { - m_saveLogFile = 2; - } - } - else - { - compressDataCont(out, &m_stream); - } - } - out = tohex(out.size()) + "\r\n" + out + "\r\n"; - m_outBuffer = out.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)out.size())); - m_nextState = &protocol_admincgi::state_SendFileContents; - } - else - { - m_nextState = (m_saveLogFile ? &protocol_admincgi::state_SendFileEnd : &protocol_admincgi::state_SendFileFooter); - } - - m_state = &protocol_admincgi::state_Send; - m_result.write(); - - if (m_tailLogFile) - { - m_result.timeout(1); - m_result.read(fileno(m_logFile)); - } - } - else if (ferror(m_logFile) || !m_logFile) - { - m_state = &protocol_admincgi::state_Close; - m_result.run(); - } - else if (feof(m_logFile) && (!m_tailLogFile)) - { - if (m_saveLogFile) - { - static utf8 out; - out.clear(); - compressDataFinish(out, &m_stream); - out = tohex(out.size()) + "\r\n" + out + "\r\n"; - m_outBuffer = out.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)out.size())); - - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileEnd; - } - else - { - m_state = &protocol_admincgi::state_SendFileFooter; - } - - m_result.write(); - m_result.run(); - } - else - { - m_result.timeout(10); - } -} - -// display log -void protocol_admincgi::mode_viewlog(const streamData::streamID_t sid, const bool tail, const bool save, const bool server) throw() -{ - if (!save) - { - utf8 headerTitle = utf8(utf8("Server Log") + (tail ? " (Tailing)":"")); - m_logFileHeader = MSG_NO_CLOSE_200; - - m_logFileBodyPrefix += (server ? getServerAdminHeader(headerTitle) : - getStreamAdminHeader(sid, headerTitle)) + getUptimeScript() + - (tail ? "
Showing log output from the current log " - "position and onwards. Click here to view the complete log output or here " - "to save the complete log output. When tailing the log output, there may be " - "a delay before any new log output will appear and it may also stop updating if " - "there is no log activity depending on configured timeouts. Reload the page if this " - "should happens.
" : "") + getIEFlexFix() + - "
";
-
-		// doing to just make sure that the end of the output should be correct
-		m_logFileBodyFooter = "\n
" + getfooterStr(); - m_tailLogFile = tail; - - if (server || !(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - const utf8 &file = mapGet(m_httpRequestInfo.m_QueryParameters, "file", gOptions.realLogFile()); - - m_logFile = uniFile::fopen(file, "r"); - if (m_logFile) - { - m_logFileName = fileUtil::stripPath(file); - m_logFileName.push_back('\0'); - - if (m_tailLogFile) - { - ::fseek(m_logFile, 0, SEEK_END); - } - } - } - else - { - utf8 body = m_logFileBodyPrefix + "Viewing Not Allowed With Current Permissions" + m_logFileBodyFooter; - COMPRESS(m_logFileHeader, body); - m_logFileHeader += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(m_logFileHeader + (!HEAD_REQUEST ? body : "")); - return; - } - - if (!m_logFile) - { - utf8 body = m_logFileBodyPrefix + "Log File Not Found (" + - stripWhitespace(errMessage()) + ")" + - m_logFileBodyFooter; - COMPRESS(m_logFileHeader, body); - m_logFileHeader += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(m_logFileHeader + (!HEAD_REQUEST ? body : "")); - } - else - { - m_logFileHeader += "Transfer-Encoding:chunked\r\n"; - m_state = &protocol_admincgi::state_SendFileHeader; - m_result.run(); - } - } - else - { - if (server || !(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - const utf8 &file = mapGet(m_httpRequestInfo.m_QueryParameters, "file", gOptions.realLogFile()); - - m_logFile = uniFile::fopen(file, "r"); - if (m_logFile) - { - m_logFileName = fileUtil::stripPath(file); - m_logFileHeader = "HTTP/1.1 200 OK\r\n" - "Content-Type:application/x-gzip-compressed\r\n" - "Content-Disposition:attachment;filename=\"" + - m_logFileName + ".gz\"\r\n"; - m_saveLogFile = true; - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - return; - } - - if (!m_logFile) - { - sendMessageAndClose(MSG_HTTP404); - } - else - { - m_logFileHeader += "Transfer-Encoding:chunked\r\n"; - m_state = &protocol_admincgi::state_SendFileHeader; - m_result.run(); - } - } -} - -// shown played history (as is also shown on the public pages if enabled) -void protocol_admincgi::mode_history(const streamData::streamID_t sid) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getStreamAdminHeader(sid, "Stream History") + - "
" + - protocol_HTTPStyle::getPlayedBody(sid) + "
" + - getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// remove an IP from the rip list -void protocol_admincgi::mode_unrip(const streamData::streamID_t sid, const utf8 &ripAddr, const utf8 &rawIpAddr) throw() -{ - utf8 msg; - try - { - size_t stream_ID = ((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0); - if (isAddress(ripAddr)) - { - bool ret = g_ripList.remove(ripAddr,stream_ID,false), usingRaw = false; - if (!ret && !rawIpAddr.empty()) - { - ret = g_ripList.remove(rawIpAddr,stream_ID,false); - if (ret) usingRaw = true; - } - if (ret) - { - ILOG("[RIP] Removed `" + (!usingRaw ? ripAddr : rawIpAddr) + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - - if (gOptions.saveRipListOnExit()) - { - if (stream_ID && gOptions.read_stream_ripFile(stream_ID) && !gOptions.stream_ripFile(stream_ID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(stream_ID),stream_ID); - } - else - { - g_ripList.save(gOptions.ripFile(),0); - } - } - - stats::updateRipClients(stream_ID, (!usingRaw ? ripAddr : rawIpAddr), false); - } - else - { - ILOG("[RIP] Unable to remove `" + ripAddr + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - } - else - { - ILOG("[RIP] `" + ripAddr + "' is not a valid value. Skipping removing from the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewrip") ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP / hostname to the rip list -void protocol_admincgi::mode_rip(const streamData::streamID_t sid, const utf8 &ripAddr, const utf8 &rawIpAddr) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0); - if (isAddress(ripAddr)) - { - if (!g_ripList.find(ripAddr,stream_ID)) - { - bool added = g_ripList.add(ripAddr,stream_ID, true), usingRaw = false; - if (!added && !rawIpAddr.empty()) - { - if (g_ripList.add(rawIpAddr,stream_ID, false)) - { - usingRaw = true; - } - } - - ILOG("[RIP] Added `" + (!usingRaw ? ripAddr : rawIpAddr) + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - - if (gOptions.saveRipListOnExit()) - { - if (stream_ID && gOptions.read_stream_ripFile(stream_ID) && !gOptions.stream_ripFile(stream_ID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(stream_ID),stream_ID); - } - else - { - g_ripList.save(gOptions.ripFile(),0); - } - } - stats::updateRipClients(stream_ID, (!usingRaw ? ripAddr : rawIpAddr), true); - } - else - { - ILOG("[RIP] `" + ripAddr + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - } - else - { - ILOG("[RIP] `" + ripAddr + "' is not a valid value. Skipping adding to the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewrip") ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// show rip list -void protocol_admincgi::mode_viewrip(const streamData::streamID_t sid) throw() -{ - vector rip_list; - g_ripList.get(rip_list,((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Reserved List" : "Stream Reserved List"), - body = (!sid ? getServerAdminHeader(headerTitle) : getStreamAdminHeader(sid, headerTitle)) + - "" - "" - "" - "" - "
"; - - if (rip_list.empty()) - { - body += " No Reserved Entries
"; - } - else - { - body += " Reserved Entry List:
    "; - for (vector::const_iterator i = rip_list.begin(); i != rip_list.end(); ++i) - { - body += "
  1. " + aolxml::escapeXML((*i).m_numericIP) + "" + - (!(*i).m_hostIP.empty() ? " (" + aolxml::escapeXML((*i).m_hostIP) + ")" : "") + - " - remove"; - } - body += "
"; - } - - body += - "

" - "" - "" - "" - "" - "" - "" - "" - "" - "
Reserve Connection Slot by IP
" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Enter the IP address:
(example: 127.0.0.1)
" - "" - "" - "." - "." - "." - "" - "
" - " 
" - "
" - "

" - "" - "" - "" - "" - "" - "" - "" - "" - "
Reserve Connection Slot by Host
" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Enter the hostname:
(example: my.example.com)
" - "" - "" - "" - "
" - " 
" - "
" - "
" + - getUptimeScript() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// show ban lists -void protocol_admincgi::mode_viewban(const streamData::streamID_t sid) throw() -{ - vector ban_list; - g_banList.get(ban_list,((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Ban List" : "Stream Ban List"), - body = (!sid ? getServerAdminHeader(headerTitle) : getStreamAdminHeader(sid, headerTitle)) + - "" - "" - "" - "" - "
"; - - if (ban_list.empty()) - { - body += " No Banned Entries
"; - } - else - { - body += " Ban Entry List:
    "; - for (vector::const_iterator i = ban_list.begin(); i != ban_list.end(); ++i) - { - body += "
  1. " + aolxml::escapeXML((*i).m_numericIP) + "" + - (!(*i).m_comment.empty() ? " : " + aolxml::escapeXML((*i).m_comment) + "" : "") + - " - " + ((*i).m_mask == 255 ? "Single IP" : "Subnet") + " ban - " - "remove"; - } - body += "
"; - } - - body += - "

" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Ban a Single IP
" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Enter the IP address:
(example: 127.0.0.1)
" - "" - "" - "." - "." - "." - "" - "
" - " 
" - "
" - "

" - "" - "" - "" - "" - "" - "" - "" - "" - "
Ban an Entire Subnet
" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Enter the Subnet address:
(example: 255.255.255)
" - "" - "" - "." - "." - ".0-255" - "" - "
" - " 
" - "
" - "
" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// remove an IP and mask from the ban list -void protocol_admincgi::mode_unban(const streamData::streamID_t sid, const utf8 &banAddr, const int banMask) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0); - if (isAddress(banAddr)) - { - if (g_banList.remove(banAddr,banMask,stream_ID,false)) - { - ILOG("[BAN] Removed `" + banAddr + "/" + tos(banMask) + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - - if (gOptions.saveBanListOnExit()) - { - if (stream_ID && gOptions.read_stream_banFile(stream_ID) && !gOptions.stream_banFile(stream_ID).empty()) - { - g_banList.save(gOptions.stream_banFile(stream_ID),stream_ID); - } - else - { - g_banList.save(gOptions.banFile(),0); - } - } - } - else - { - ILOG("[BAN] Unable to remove `" + banAddr + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - } - else - { - ILOG("[BAN] `" + banAddr + "' is not a valid value. Skipping removing from the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewban"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewban") ? "" : "&mode=viewban"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP and mask to the ban list -void protocol_admincgi::mode_ban(const streamData::streamID_t sid, const utf8 &banAddrs, const int banMask) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0); - if (!g_banList.find(banAddrs,banMask,stream_ID)) - { - g_banList.add(banAddrs,banMask,"",stream_ID); - ILOG("[BAN] Added `" + banAddrs + "/" + tos(banMask) + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - - if (gOptions.saveBanListOnExit()) - { - if (stream_ID && gOptions.read_stream_banFile(stream_ID) && !gOptions.stream_banFile(stream_ID).empty()) - { - g_banList.save(gOptions.stream_banFile(stream_ID),stream_ID); - } - else - { - g_banList.save(gOptions.banFile(),0); - } - } - } - else - { - ILOG("[BAN] `" + banAddrs + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewban"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewban") ? "" : "&mode=viewban"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - // additionally when a ban happens then we attempt to kick the client(s) at the same time - const utf8 &p1 = mapGet(m_httpRequestInfo.m_QueryParameters, "kickdst", (utf8)""); - if (!p1.empty()) - { - // split out multiple clients to kick (split by a ,) - std::vector addrs = tokenizer(p1, ','); - for (vector::const_iterator i = addrs.begin(); i != addrs.end(); ++i) - { - if ((*i).find(utf8(".")) == utf8::npos) - { - stats::kickClient(sid, atoi((*i).hideAsString().c_str())); - } - else - { - stats::kickClient(sid, (*i)); - } - } - } - - sendMessageAndClose(msg); -} - -// remove an agent from the agent list -void protocol_admincgi::mode_unagent(const streamData::streamID_t sid, const utf8 &agent) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0); - bool ret = g_agentList.remove(agent,stream_ID,false); - if (!ret && !agent.empty()) - { - ret = g_agentList.remove(agent,stream_ID,false); - } - if (ret) - { - ILOG("[AGENT] Removed `" + agent + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - - if (gOptions.saveAgentListOnExit()) - { - if (stream_ID && gOptions.read_stream_agentFile(stream_ID) && !gOptions.stream_agentFile(stream_ID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(stream_ID),stream_ID); - } - else - { - g_agentList.save(gOptions.agentFile(),0); - } - } - } - else - { - ILOG("[AGENT] Unable to remove `" + agent + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewagent") ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP / hostname to the user agent list -void protocol_admincgi::mode_agent(const streamData::streamID_t sid, const utf8 &agent) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0); - if (!g_agentList.find(agent,stream_ID)) - { - if (g_agentList.add(agent, stream_ID, true)) - { - ILOG("[AGENT] Added `" + agent + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - - stats::kickClientList_t kick_data; - stats::getClientDataForKicking(stream_ID, kick_data); - for (stats::kickClientList_t::const_iterator i = kick_data.begin(); i != kick_data.end(); ++i) - { - if (!(*i)->m_kicked && ((*i)->m_userAgent == agent)) - { - stats::kickClient(sid, (*i)->m_unique); - } - delete (*i); - } - - if (gOptions.saveAgentListOnExit()) - { - if (stream_ID && gOptions.read_stream_agentFile(stream_ID) && !gOptions.stream_agentFile(stream_ID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(stream_ID),stream_ID); - } - else - { - g_agentList.save(gOptions.agentFile(),0); - } - } - } - else - { - ILOG("[AGENT] `" + agent + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewagent") ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// show agent list -void protocol_admincgi::mode_viewagent(const streamData::streamID_t sid) throw() -{ - vector agent_list; - g_agentList.get(agent_list,((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Blocked User Agent List" : - "Stream Blocked User Agent List"), - body = (!sid ? getServerAdminHeader(headerTitle, 0, "", 2) : getStreamAdminHeader(sid, headerTitle, 0, true)) + - "" - "" - "" - "" - "
"; - - if (agent_list.empty()) - { - body += " No Blocked User Agents
"; - } - else - { - body += " Blocked User Agent List:
    "; - for (vector::const_iterator i = agent_list.begin(); i != agent_list.end(); ++i) - { - const streamData::source_t clientType = ((streamData::source_t)streamData::UNKNOWN); - body += "
  1. " + getClientImage(streamData::getClientType(clientType, stringUtil::toLower((*i).m_agent))) + - " " + aolxml::escapeXML((*i).m_agent) + " - remove"; - } - body += "
"; - } - - body += - "

" - "" - "" - "" - "" - "" - "" - "" - "" - "
Block User Agent
" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Enter the user agent:
(example: streamripper)
" - "" - "" - "" - "
" - " 
" - "
" - "
" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// kick client(s) -void protocol_admincgi::mode_kickdst(const streamData::streamID_t sid, const utf8 &kickAddrs) throw() -{ - bool refresh = false; - if (kickAddrs == "all") - { - // check if this is set to kick all - refresh = stats::kickAllClients(sid); - } - else if (kickAddrs == "duplicates") - { - // check if this is set to kick all - // duplicates (doing oldest first). - refresh = stats::kickDuplicateClients(sid); - } - else - { - // split out multiple clients to kick (split by a ,) - std::vector addrs = tokenizer(kickAddrs,','); - for (vector::const_iterator i = addrs.begin(); i != addrs.end(); ++i) - { - if ((*i).find(utf8(".")) == utf8::npos) - { - stats::kickClient(sid, atoi((*i).hideAsString().c_str())); - } - else - { - stats::kickClient(sid,(*i)); - } - } - } - - if (!m_referer.empty()) - { - const utf8 check = ("admin.cgi?sid=" + tos(sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0") + (refresh ? "&refresh=1" : ""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } -} - -void protocol_admincgi::mode_art(const streamData::streamID_t sid, const int mode) throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\n", body; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - vector<__uint8> sc21_albumart = (mode == 0 ? sd->streamAlbumArt() : sd->streamPlayingAlbumArt()); - if (!sc21_albumart.empty()) - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - const size_t mime = (mode == 0 ? sd->streamAlbumArtMime() : sd->streamPlayingAlbumArtMime()); - // if not in the valid range then don't report the mime type in the generated response - if (mime < 4) - { - header += "Content-Type:" + mimeType[mime] + "\r\n"; - } - body += utf8(&sc21_albumart[0],sc21_albumart.size()); - } - sd->releaseStream(); - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_register(const streamData::streamID_t sid, const streamData::streamInfo &info) throw() -{ - // construct a temp id for this action - utf8 tempId = ""; - randomId(tempId); - - bool loaded = false; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - int addFailIgnore = 0, errorCode = 0; - loaded = sd->YP2_addSuccessful(addFailIgnore, errorCode); - sd->releaseStream(); - } - - utf8 header = "HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Cache-Control:no-cache\r\n", - authhash = (!info.m_authHash.empty() ? info.m_authHash.substr(0, 36) : (utf8)""), - body = getStreamAdminHeader(sid, "Stream Authhash") + "
" - "
" - - "
" - - "
" - "
" - "
Information
" - "This page allows you to enter or amend the authhash to be used for this stream." - "



Authhash information is now managed online. " - "Login " - "to create an authhash or update the details of an existing authhash." - - "



The same authhash should be used for all stream instances of a station " - "(e.g. 128kbps MP3 and 64kbps AAC streams for 'Super Awesome Radio').

This also includes all DNAS " - "providing the stream(s) for a station to ensure the correct listing of all stream instances." - - // TODO need to have a link to the account page... - "



If you remove an authhash by mistake then you can either recover it from your " - "Shoutcast account or you will need " - "to contact support directly for " - "assistance.

" - - // TODO need to consider customising some of this ?? or just above ?? - "
" - "
" - "" - - "" - "" - "" - "" - "" - "" - "" - "" - "
" + utf8(!authhash.empty() && - loaded && (info.m_streamSampleRate > 0) && info.m_radionomyID.empty() ? - warningImage(false) + "  Please Register Your Authhash

" : "") + - - "
" - "
" - "The authhash currently configured for this stream is " + authhash + "


" - "To change the authhash, enter it below and click 'Save'." : - "Create Authhash\">" - "An authhash needs to be created for this stream.


" - "If you have just created an authhash via your " - "account " - "or have an existing one for the stream, please enter it below and click 'Save'.") + - - "

Authhash:

" - "  " - "  " - "
" - "
" - "
" - "
" - - "" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_listeners(const streamData::streamID_t sid) throw() -{ - utf8 header = MSG_NO_CLOSE_200, body; - // just to make sure we came from an appropriate page - const utf8 &server = mapGet(m_httpRequestInfo.m_QueryParameters, "server", (utf8)""), - &check = ("admin.cgi?sid=" + tos(sid)); - const bool nowrap = mapGet(m_httpRequestInfo.m_QueryParameters, "nw", (bool)gOptions.adminNoWrap()); - const int fh = mapGet(m_httpRequestInfo.m_QueryParameters, "fh", (int)0); - if ((sid > 0) && (m_referer.find(check) == 0) && !server.empty() && (listenerId == server)) - { - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - if (!client_data.empty()) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - utf8 clientsBody = "
" - "" - "" - "" - "" - "" + utf8(!info.m_radionomyID.empty() ? - "" : "") + - (data.connectedListeners != data.uniqueListeners ? "" : (utf8)"") + - "" - ""; - - const time_t t = ::time(NULL); - size_t rowCount = 0; - // if we have non-unique clients then we need to process the list differently so as to group - // them together and then re-sort the output by client listener duration on the first match - // otherwise we revert the code back to the original un-grouped method to not waste resources - if (data.connectedListeners != data.uniqueListeners) - { - map unique_clients; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - // if set to kicked then no need to show those (since they may re-appear if in-progress) - if (!(*i)->m_kicked) - { - stats::uniqueClientData_t client; - const bool localhost = ((*i)->m_ipAddr.find(utf8("127.")) == 0); - - // look for existing instances and append the new details to the existing details - const map::const_iterator im = unique_clients.find((*i)->m_ipAddr); - if (im != unique_clients.end()) - { - client = (*im).second; - client.m_userAgent += "m_ripClient || localhost ? utf8(" style=\"font-style:italic;\"") : "") + ">"; - client.m_unique += ","; - ++client.m_total; - } - else - { - client.m_connectTime = (*i)->m_startTime; - client.m_ipAddr = (*i)->m_ipAddr; - client.m_hostName = (*i)->m_hostName; - client.m_XFF = (*i)->m_XFF; - client.m_total = 1; - } - - const int slave = ((*i)->m_clientType & streamData::SC_CDN_SLAVE); - client.m_userAgent += ""; - if ((*i)->m_ripClient) - { - client.m_ripAddr = true; - } - - const time_t connected = (t - (*i)->m_startTime); - utf8 timer = timeString(connected, true), timerTip; - if (timer.empty()) - { - timer = "Starting..."; - } - else - { - timerTip = timeString(connected); - } - - client.m_userAgent += "" + aolxml::escapeXML(timer) + ""; - client.m_unique = (*i)->m_ipAddr; - if (!info.m_radionomyID.empty()) - { - client.m_userAgent += "" + (((*i)->m_group > 0) || - (*i)->m_triggers ? advertImage(sid, (*i)->m_group, (*i)->m_triggers) : - "
N/A
") + ""; - } - client.m_userAgent += "m_unique) + "\">Kick" + - (client.m_total == 1 ? "" : "") + "" + ((*i)->m_userAgent.empty() || ((*i)->m_userAgent == EMPTY_AGENT) ? "N/A" : - "m_userAgent) + "\">Block") + ""; - - unique_clients[(*i)->m_ipAddr] = client; - } - - delete (*i); - } - - // take the map and convert to a vector so we can then re-sort the list back into longest to least duration - vector clients; - for (map::const_iterator i = unique_clients.begin(); i != unique_clients.end(); ++i) - { - clients.push_back((*i).second); - } - - std::sort(clients.begin(), clients.end(), sortUniqueClientDataByTime); - - // and now we dump the generated list - for (vector::const_iterator i = clients.begin(); i != clients.end(); ++i) - { - const utf8 host = ((*i).m_hostName != (*i).m_ipAddr ? aolxml::escapeXML((*i).m_hostName) + " (" + (*i).m_ipAddr + ")" : (*i).m_ipAddr); - const bool localhost = ((*i).m_ipAddr.find(utf8("127.")) == 0); - - // if we have a multiple client block then re-process so the relevant parts can - // be listed individually with adjustment of some of the visual styles as needed - utf8 multiBlock = (*i).m_userAgent; - uniString::utf8::size_type tpos = multiBlock.find(utf8(" 1 ? "")); - if (tpos != uniString::utf8::npos) - { - const bool hasHostName = ((*i).m_hostName != (*i).m_ipAddr); - utf8 endBlock = " 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : (utf8)"") + ">" + - (!localhost ? "Ban" : "N/A") + " 1 ? " rowspan=\"" + - tos((*i).m_total) + "\"" : (utf8)"") + ">" + (!localhost ? "Ban " : "N/A") + "" - " 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : (utf8)"") + ">" + - (!localhost ? "" + ((*i).m_ripAddr ? "Remove" : "Add") + "" : "N/A") + ""; - - multiBlock.replace(tpos, 6, utf8(((*i).m_total > 1 ? - "
" + - endBlock : "" + endBlock))); - } - - rowCount += (*i).m_total; - clientsBody += "" - " 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : "") + ">" + - (gOptions.useXFF() && !(*i).m_XFF.empty() ? xffImage() + " " : "") + host + "" + multiBlock; - } - } - else - { - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - // if set to kicked then no need to show those (since they may re-appear if in-progress) - if (!(*i)->m_kicked) - { - const time_t connected = (::time(NULL) - (*i)->m_startTime); - utf8 timer = timeString(connected, true), timerTip; - if (timer.empty()) - { - timer = "Starting..."; - } - else - { - timerTip = timeString(connected); - } - - const utf8 host = ((*i)->m_hostName != (*i)->m_ipAddr ? aolxml::escapeXML((*i)->m_hostName) + - " (" + (*i)->m_ipAddr + ")" : (*i)->m_ipAddr); - const bool localhost = ((*i)->m_ipAddr.find(utf8("127.")) == 0); - const bool hasHostName = ((*i)->m_hostName != (*i)->m_ipAddr); - - ++rowCount; - const int slave = ((*i)->m_clientType & streamData::SC_CDN_SLAVE); - clientsBody += "m_ripClient || localhost ? utf8(" style=\"font-style:italic;\"") : "") + ">" - "" + aolxml::escapeXML(timer) + ""; - - if (!info.m_radionomyID.empty()) - { - clientsBody += "" + (((*i)->m_group > 0) || - (*i)->m_triggers ? advertImage(sid, (*i)->m_group, (*i)->m_triggers) : - "
N/A
") + ""; - } - - const utf8 unique = tos((*i)->m_unique); - clientsBody += "Kick
" + ((*i)->m_userAgent.empty() || ((*i)->m_userAgent == EMPTY_AGENT) ? "N/A" : - "m_userAgent) + "\">Block") + ""; - } - - delete (*i); - } - } - - if (rowCount > 0) - { - if (rowCount > 1) - { - clientsBody += ""; - } - - // only output the table if we actually had clients to show - body += clientsBody + "
Current Listeners
Listener Address
(Host Address)
User AgentConnected
Duration
" + baseImage("adavail", "Advert Status", false, false) + "Kick
Client
Kick
IP
Ban
IP
Ban
Subnet
Reserve
Listener
Block
User Agent
" + (((*i)->m_clientType & streamData::RADIONOMY) ? - "Radionomy Stats Collector" : (!nowrap ? addWBR((*i)->m_userAgent) : "
" + - aolxml::escapeXML((*i)->m_userAgent)) + "
") + "
" + - getClientImage((*i)->m_clientType) + "
Kickm_XFF.empty() ? "title=\"XFF: " + - aolxml::escapeXML((*i)->m_XFF) + "\">" + xffImage() + " " : ">") + host + "m_XFF.empty() ? "title=\"XFF: " + aolxml::escapeXML((*i)->m_XFF) + "\" " : "") + - "style=\"" + (!nowrap ? "" : "white-space:nowrap;") + "\"" + utf8(slave ? " class=\"thr\"" : - "") + ">" + (((*i)->m_clientType & streamData::RADIONOMY) ? "Radionomy Stats Collector" : - (!nowrap ? addWBR((*i)->m_userAgent) : "
" + - aolxml::escapeXML((*i)->m_userAgent)) + "
") + "
" + - getClientImage((*i)->m_clientType) + "
" + "
" + - (!localhost ? "m_ipAddr) + "&banmsk=255" + "&kickdst=" + unique + - "\">Ban" : "N/A") + "" + (!localhost ? "m_ipAddr) + "&banmsk=0" - "&kickdst=" + unique + "\">Ban " : "N/A") + "" + (!localhost ? - "" + ((*i)->m_ripClient ? - "Remove" : "Add") + "" : "N/A") + "
Kick Duplicates" - "" + timeString(data.avgUserListenTime, true) + "Kick All
"; - } - } - } - else - { - body = "
The current " - "listener list could not be loaded.
Click here to reload this page. If this issue " - "
persists, try logging out and back in again.
"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -const utf8 protocol_admincgi::getClientIP(const bool streamPublic, const utf8 &publicIP) throw() -{ - // test for potentially invalid IPs or ones that will cause the playlist link generation to fail - // attempting to use the server path provided by the YP if in public mode, otherwise uses 'host' - return (!streamPublic || publicIP.empty() ? - ((g_IPAddressForClients.find(utf8("0.")) == 0 || - // allow localhost / loopback connections through for admin access - ((!g_IPAddressForClients.empty() && g_IPAddressForClients.find(utf8("127.")) == 0)) || - g_IPAddressForClients.empty()) && !m_hostIP.empty() ? - m_hostIP : (!m_hostIP.empty() ? m_hostIP : g_IPAddressForClients)) : publicIP); -} - -void protocol_admincgi::mode_none(const streamData::streamID_t sid, const int refreshRequired) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getStreamAdminHeader(sid, "Stream Status & Listeners", refreshRequired); - - time_t streamUptime = 0; - bool hasListeners = false, isConnected = false; - - if (refreshRequired > 0) - { - body += "
" - "
" - "
Waiting " + tos(refreshRequired) + " second" + ((refreshRequired > 1) ? "s" : (utf8)"") + - " for any configuration changes to take effect.
" - "If not automatically redirected or do not want to wait, " - "click here." - "

"; - } - else - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - isConnected = extra.isConnected; - hasListeners = (data.connectedListeners > 0); - - // this is a placeholder for the listener details which we grab asynchronously for speed since #615 - body += "
" + (data.connectedListeners > 0 ? - "
Loading current " - "listener list...
" : (utf8)"") + "
Current Stream Information
"; - - utf8 detailsBody = ""; - bool showing = false; - if (!(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - utf8 log = gOptions.realLogFile(); - utf8::size_type pos = log.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - log = log.substr(pos + 1); - } - - utf8 conf = gOptions.confFile(); - pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - // trim down the file paths shown to make things less cluttered on hosted setups - // places the full path in the 'title' so it can still be found if required, etc - detailsBody += "Log file: " + aolxml::escapeXML(fileUtil::stripPath(log)) + "
" - "Configuration file: " + aolxml::escapeXML(fileUtil::stripPath(conf)) + "
"; - - showing = true; - } - - utf8 introFile = gOptions.stream_introFile(sid); - if (!gOptions.read_stream_introFile(sid)) - { - introFile = gOptions.introFile(); - } - - utf8 backupFile = gOptions.stream_backupFile(sid); - if (!gOptions.read_stream_backupFile(sid)) - { - backupFile = gOptions.backupFile(); - } - - utf8 backupTitle = gOptions.stream_backupTitle(sid); - if (!gOptions.read_stream_backupTitle(sid)) - { - backupTitle = gOptions.backupTitle(); - } - - streamData *sd = streamData::accessStream(sid); - detailsBody += utf8(showing ? "


" : "") + "Intro file is getIntroFile().gotData()) ? (!introFile.empty() ? - fileUtil::getFullFilePath(introFile) : (utf8)"") : (utf8)"") + "\">" + - aolxml::escapeXML((!introFile.empty() || (sd && sd->getIntroFile().gotData()) ? (!introFile.empty() ? - fileUtil::stripPath(introFile) : "from source") : "empty")) + "
Backup file is getBackupFile().gotData())) ? (!backupFile.empty() ? - fileUtil::getFullFilePath(backupFile) : (utf8)"") : (utf8)"") + "\">" + - aolxml::escapeXML((!backupFile.empty() || (sd && sd->getBackupFile().gotData())) ? - (!backupFile.empty() ? fileUtil::stripPath(backupFile) : "from source") : "empty")) + "
"; - - if (!backupTitle.empty() && !backupFile.empty() && !extra.isConnected) - { - detailsBody += "Backup title is: " + aolxml::escapeXML(backupTitle) + "
"; - } - - detailsBody += "


Idle timeouts are " + tos(gOptions.getAutoDumpTime(sid)) + "s
"; - - if (extra.isConnected) - { - detailsBody += "


Source connection type: " + - utf8(info.m_sourceType == streamData::SHOUTCAST1 ? "v1" : - (info.m_sourceType == streamData::SHOUTCAST2 ? "v2" : "HTTP")) + - (extra.isRelay ? " relay" + (extra.isBackup ? utf8(" backup") : "") : - (extra.isBackup ? utf8(" backup") : "")) + "
Source user agent: " + - addWBR((!info.m_sourceIdent.empty() ? info.m_sourceIdent : - "Legacy / Unknown")) + """
"; - } - - if (sd) - { - detailsBody += (extra.isConnected ? "


" : "
"); - - if (sd->streamAlbumArt().empty()) - { - detailsBody += "Stream artwork not available"; - } - else - { - detailsBody += "Stream artwork availableview ]
"; - } - - detailsBody += "
"; - - if (sd->streamPlayingAlbumArt().empty()) - { - detailsBody += "Playing artwork not available"; - } - else - { - detailsBody += "Playing artwork availableview ]
"; - } - - if (!info.m_currentURL.empty() && (info.m_currentURL.find(utf8("DNAS/")) == utf8::npos)) - { - detailsBody += "



Song url from source [ view ]
" - "
Note: " - "This may not be a valid url and is intended for internal use.
"; - } - - sd->releaseStream(); - } - - const utf8& message = streamData::getStreamMessage(sid); - if (!message.empty()) - { - detailsBody += "
" - "
" - "
" - "Official Message Received
" + message + ""; - } - - body += "

" - ""; - - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - body += ""; - } - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - if (extra.isConnected) - { - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - utf8 listenLink = "" + - (sd && !sd->radionomyID().empty() && sd->streamAdvertMode() ? - " " : (utf8)""); - - body += "
" - "
Stream Details
" + - detailsBody + "
" - "" - "" - "" - ""; - - if (data.peakListeners > 0) - { - body += ""; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "" - ""; - } - - body += "" + - - (info.m_streamPublic && extra.ypConnected ? "" : ""); - - if (!info.m_streamGenre[0].empty()) - { - body += "" - ""; - } - - if (!info.m_streamUser.empty()) - { - body += "" - ""; - } - - if (!info.m_streamURL.empty()) - { - body += "" - ""; - } - - if (!info.m_currentSong.empty()) - { - body += "" - ""; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - body += "" - ""; - } - } - - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = niceURL(extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr,port,hostName)) - { - srcAddr = hostName + " (" + niceURL(src) + ")"; - } - } - } - - body += "" - "" - ""; - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - body += streamData::getHTML5Player(sid); - } - - body += "
" + getNewVersionMessage() + "
Listing Status: Stream is currently up " + - (info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : utf8("and public") + listenLink) : utf8("and private (not listed)") + listenLink) + - (info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - string(info.m_authHash.empty() ? "but requires registration in the Shoutcast Directory.
" : - "but not listed due to an invalid authhash.
") + - - (info.m_authHash.empty() ? "Listeners are allowed and the stream will act like it is private until resolved." - "

To create an authhash you will need to register the stream with us.
If you already have an existing authhash " - "then you can enter it here.

" : - "Listeners are allowed and the stream will act like it is private until resolved.") : - (extra.ypErrorCode == 200 ? "waiting on a Directory response." : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "unable to access the Directory.
Listeners are allowed and the stream will act like it is private until resolved." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "received a Directory maintenance notification: " + tos(extra.ypErrorCode) + - "
Listeners will be allowed though the stream will not be listed in the Directory." : - "received Directory error code: " + tos(extra.ypErrorCode) + "
" + - (extra.ypConnected != 2 ? "" : - "during a listing update. The stream may no longer appear.") + - "
Check the server log and / or contact the server administrator.")))) : "") : "") + "
Stream Status: Stream is up (" + streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ") with " + - tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") + "
Listener Peak: " + - tos(data.peakListeners) + "
Avg. Play Time: " + avgTime + "
Stream Name: " + - (info.m_streamPublic && extra.ypConnected ? "" + aolxml::escapeXML(info.m_streamName) + "" : - aolxml::escapeXML(info.m_streamName)) + "
" - " ID: "+info.m_stationID+"
Stream Genre(s): " + (info.m_streamPublic && extra.ypConnected ? - "" + - aolxml::escapeXML(info.m_streamGenre[0]) + "" : - aolxml::escapeXML(info.m_streamGenre[0])) + ""; - - for (int i = 1; i < 5; i++) - { - if (!info.m_streamGenre[i].empty()) - { - body += " , " + (info.m_streamPublic && extra.ypConnected ? "" + aolxml::escapeXML(info.m_streamGenre[i]) + "" : - aolxml::escapeXML(info.m_streamGenre[i])) + ""; - } - } - - body += "
Stream DJ: " + aolxml::escapeXML(info.m_streamUser) + "
Stream Website: " + urlLink(info.m_streamURL) + "
Playing Now: " + - getCurrentSong(info.m_currentSong) + "
Playing Next: " + - aolxml::escapeXML(info.m_comingSoon) + "
Stream Source: " + (extra.isRelay || extra.isBackup ? urlLink(srcAddr) : srcAddr) + " " + - (extra.isRelay ? "(relaying" + (extra.isBackup ? utf8(" backup") : "") + ") " : (extra.isBackup ? "(backup) " : "")) + "" - "[ " + (extra.isRelay || extra.isBackup ? "stop" : "kick") + - " ]
Stream Uptime: " + timeString((streamUptime = ::time(NULL) - streamData::getStreamUptime(sid))) + "
"; - } - else - { - body += "" - "" - "" - ""; - - if (data.peakListeners > 0) - { - body += ""; - } - - utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "" - ""; - } - - // add in an option to restart a relay url... - if (!gOptions.stream_relayURL(sid).empty() && movedUrl.empty()) - { - // strip down the source address for display output - utf8 srcAddr = niceURL(gOptions.stream_relayURL(sid)); - - // make sure we're not exposing the option to try re-connecting to a pending source relay - bool noEntry = false; - if (!(streamData::isRelayActive(sid, noEntry) == 1)) - { - body += ""; - } - else - { - body += ""; - } - } - - body += "
" + getNewVersionMessage("
") + "
Stream Status: "; - - if (movedUrl.empty()) - { - body += "Stream is currently down" + (data.connectedListeners > 0 ? - " with " + tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") : ".") + "
There is no " - "source connected or no stream is configured for stream #" + tos(sid) + "."; - } - else - { - body += "Stream has been moved to " + urlLink(movedUrl) + "
No source connections will be allowed for this stream."; - } - body += "
Listener Peak: " + - tos(data.peakListeners) + "
Avg. Play Time: " + avgTime + "

Start Relay:

" + urlLink(srcAddr) + " " - "[ start relay ]

Starting Relay:

Connection pending to " + - urlLink(srcAddr) + " [ abort ]
"; - } - - body += "
"; - } - - // for a refresh, we'll show a countdown so it's obvious that something is happening - if (refreshRequired) - { - body += ""; - } - - body += getUptimeScript(false, isConnected, streamUptime) + getIEFlexFix() + - getHTML5Remover() + (!refreshRequired && hasListeners ? - getStreamListeners(sid, mapGet(m_httpRequestInfo.m_QueryParameters, "nw", (bool)gOptions.adminNoWrap()), - mapGet(m_httpRequestInfo.m_QueryParameters, "fh", (int)0)) : "") + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -utf8 getCDNMessage(const bool master, const bool slave) -{ - if (slave && !master) - { - return "Configured as a CDN slave
Authhash inheritance enabled from master"; - } - else if (master && !slave) - { - return "Configured as a CDN master
Authhash inheritance enabled for slaves"; - } - return "Configured as a CDN intermediary
Authhash inheritance enabled both ways"; -} - -utf8 getBadAuthhashMessage(const streamData::streamID_t sid, const utf8 &authHash) -{ - return "
" - "Invalid Authhash Detected   

" - "Clear Authhash" - "  |  Manage Authhash
"; -} - -void protocol_admincgi::mode_summary(const int refreshRequired) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - streams = "", - body = getServerAdminHeader("Server Summary", refreshRequired); - - size_t totalListeners = 0, - totalPeakListeners = 0, - streamTotal = 0, - movedTotal = 0; - map streamBlocks; - - if (refreshRequired == 0) - { - size_t inc = 0, sid = DEFAULT_SOURCE_STREAM; - do - { - utf8 streamBody = ""; - sid = streamData::enumStreams(inc); - - // check if we have an active source and valid sid before attempting to add - if (sid >= DEFAULT_SOURCE_STREAM) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo(sid, info, extra)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody2 = ""; - const bool slave = isCDNSlave(sid); - const bool master = isCDNMaster(sid); - if (master || slave) - { - streamBody2 += "
" + - getCDNMessage(master, slave) + "


"; - } - - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - if (!isListable) - { - streamBody2 += "
" + - (info.m_uvoxDataType == OGG_DATA ? "OGG Vorbis based streams are not fully supported
and will not" : - utf8("NSV based streams are no longer able
to ")) + - " be listed in the Shoutcast Directory.

"; - } - /*else if (!info.m_streamPublic && gOptions.cdn().empty() && !slave && !master) - { - streamBody2 += "
" - "An authhash is not required for private streams.


"; - }*/ - - if (isListable) - { - if (info.m_authHash.empty()) - { - streamBody2 += ""; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash(info.m_authHash)) - { - streamBody2 += getBadAuthhashMessage(sid, info.m_authHash); - } - else - { - streamBody2 += "
" - + utf8((master || slave || info.m_streamPublic) && (info.m_streamSampleRate > 0) && - info.m_radionomyID.empty() && ((extra.ypErrorCode != YP_NOT_VISIBLE) && - (extra.ypErrorCode != YP_AUTH_ISSUE_CODE) && (extra.ypErrorCode != -1)) ? - warningImage(false) + "  Please Register Your Authhash

" : "") + - "Update Authhash  | " - " Manage Authhash
"; - } - } - } - else - { - streamBody2 += ""; - } - streamBody2 += ""; - - streamData *sd = streamData::accessStream(sid); - - streamBody += "" + - (sd && !sd->radionomyID().empty() && sd->streamAdvertMode() ? - " " : (utf8)"") + - "Stream #" + tos(sid) + " " - "(Stream Login)" + - " " + - (sd && !sd->streamAlbumArt().empty() ? " " - "\"View" : "") + - (sd && !sd->streamPlayingAlbumArt().empty() ? " " - "\"View" : "") + - - "" + - (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA) ? - streamData::getHTML5Player(sid) : "") + streamBody2; - - utf8 content = streamData::getContentType(info); - if (!info.m_streamUser.empty()) - { - content = info.m_streamUser + " - " + content; - } - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - const utf8 listeners = (data.connectedListeners ? (tos(data.connectedListeners) + - (data.connectedListeners != data.uniqueListeners ? - (" (" + tos(data.uniqueListeners) + " unique)") : "")) : "0") + - (maxUsers > 0 ? " of " + tos(maxUsers) : " (unlimited)"); - - const utf8 listenLink = ""; - - streamBody += "" + - (info.m_streamPublic && extra.ypConnected ? "" + aolxml::escapeXML(info.m_streamName) + "" : - aolxml::escapeXML(info.m_streamName)) + " (" + content + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ")" + - - (!info.m_currentSong.empty() ? "Playing: " - "" + - aolxml::escapeXML(info.m_currentSong) + "" + - (!info.m_comingSoon.empty() ? "Coming: " - "" + - aolxml::escapeXML(info.m_comingSoon) + "" : "") : "") + - - "" - "
" - "
Listeners: " + listeners + "" + - (data.peakListeners > 0 ? "
Peak: " + tos(data.peakListeners) + "" : "") + - (data.connectedListeners > 0 ? " [ kick all ]" : "") + - "
   Status: " + - string(info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : string("Public
" - - "")) + - - (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - " Not Listed - " + string(info.m_authHash.empty() ? "Empty" : "Invalid") + " Authhash" : - (extra.ypErrorCode == 200 ? " Waiting on a Directory response" : - (extra.ypErrorCode == -1 ? "Unable to access the Directory.
Check the server log for more details.
The stream will behave like it is private." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "Directory is down for maintenance: " + - tos(extra.ypErrorCode) + "
Listeners are allowed, stream will not be listed" : - (extra.ypErrorCode == YP_AUTH_ISSUE_CODE ? " Please contact support as there is an issue with the authhash" : " Directory returned error code: " + tos(extra.ypErrorCode) + "
" + - (extra.ypConnected != 2 ? "" : "during a listing update. The stream may not
appear in the Directory due to the error. The
server will attempt to re-list the stream.")))))) : "") : - "Private") + "
   Source: " + - utf8(info.m_sourceType == streamData::SHOUTCAST1 ? "v1" : - (info.m_sourceType == streamData::SHOUTCAST2 ? "v2" : "HTTP")) + - (extra.isRelay ? " relay" + (extra.isBackup ? utf8(" backup") : "") : - (extra.isBackup ? " backup" : "")) + "" + (extra.isRelay || extra.isBackup ? "stop" : "kick") + - " ]
" - - "" - "
" - "Summary  |  " - - "  |  " - - "History  |  " - "Metadata  |  " - "Statistics " - "
"; - - if (sd) - { - sd->releaseStream(); - } - - const utf8& message = streamData::getStreamMessage(sid); - if (!message.empty()) - { - streamBody += "" - "

" - "
" - "Official Message Received
" + message + "
"; - } - - streamBlocks[sid] = streamBody; - } - } - ++inc; - } - while (sid); - - // now we check through for any known but inactive relays and then get them listed as well - vector relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for (vector::const_iterator i = relayList.begin(); i != relayList.end(); ++i) - { - sid = (*i).m_streamID; - const bool exists = !(*i).m_relayUrl.url().empty(); - if (exists && !streamData::isSourceConnected(sid)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - utf8 listeners, content, streamBody2, - streamBody = "" - "Stream #" + tos(sid) + " " - "(Stream Login)"; - - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - const bool slave = isCDNSlave(sid); - const bool master = isCDNMaster(sid); - if (master || slave) - { - streamBody2 = "
" + - getCDNMessage(master, slave) + "


"; - } - else - { - if ((*i).m_authHash.empty()) - { - streamBody2 += ""; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash((*i).m_authHash)) - { - streamBody2 += getBadAuthhashMessage(sid, info.m_authHash); - } - else - { - streamBody2 += "
" - + utf8((master || slave || info.m_streamPublic) && (info.m_streamSampleRate > 0) && - info.m_radionomyID.empty() && ((extra.ypErrorCode != YP_NOT_VISIBLE) && - (extra.ypErrorCode != YP_AUTH_ISSUE_CODE) && (extra.ypErrorCode != -1)) ? - warningImage(false) + "  Please Register Your Authhash

" : "") + - "Update Authhash  | " - " Manage Authhash
"; - } - } - - if (!streamBody2.empty()) - { - streamBody2 += "
"; - } - } - } - else - { - streamBody2 = "This stream is configured as having been moved or retired.
" - "No source connections will be allowed for this stream.

" - "All client connections received will be redirected to:
" + - urlLink(movedUrl) + "
"; - ++movedTotal; - } - - if (!streamBody2.empty()) - { - streamBody += "" + streamBody2 + ""; - } - - // strip down the source address for display output - const utf8 srcAddr = niceURL(gOptions.stream_relayURL(sid)); - if (movedUrl.empty()) - { - bool noEntry = false; - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - streamBody += "" - "Status: " + string(info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : string("Public")) + - (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - " Not Listed - " + string(info.m_authHash.empty() ? "Empty" : "Invalid") + " Authhash" : - (extra.ypErrorCode == 200 ? " Waiting on a Directory response" : - (extra.ypErrorCode == -1 ? "Unable to access the Directory.
Check the error server for more details.
The stream will behave like it is private." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "Directory is down for maintenance: " + - tos(extra.ypErrorCode) + "
Listeners are allowed, stream will not be listed" : - (extra.ypErrorCode == YP_AUTH_ISSUE_CODE ? " Please contact support as there is an issue with the authhash" : " Directory returned " - "error code: " + tos(extra.ypErrorCode) + "
" + - (extra.ypConnected != 2 ? "" : "during a listing update. The stream may not
appear in the Directory due to the error. The
server will attempt to re-list the stream.")))))) : "") : - "Private") + "
   " - "
" + (data.connectedListeners > 0 ? "" - "" : "") + - "
" - "Source: " + (!(streamData::isRelayActive(sid, noEntry) == 1) ? - "Inactive relaystart relay ]
Using: " + urlLink(srcAddr) + "" : - "Connection pending to " + urlLink(srcAddr) + "" - " [ abort ]") + - - // if it's an inactive stream then we also want to show any remaining connections - "
Listeners: " + - tos(data.connectedListeners) + "" + (data.peakListeners > 0 ? "  |  Peak: " + - tos(data.peakListeners) + "" : "") + " [ kick all ]" + "
"; - } - streamBlocks[sid] = streamBody; - } - } - } - - // now we check through for any known but in-active sources & then get them listed as well - // new to build 70 but for fire builds makes it easier to see if a feed stream is inactive - config::streams_t stream_configs; - gOptions.getStreamConfigs(stream_configs); - if (!stream_configs.empty()) - { - for (config::streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if (streamBlocks.find((*i).first) == streamBlocks.end()) - { - stats::statsData_t data; - stats::getStats((*i).first, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody = "" - "Stream #" + tos((*i).first) + " " - "(Stream Login)", - streamBody2; - - const utf8 movedUrl = gOptions.stream_movedUrl((*i).first); - if (movedUrl.empty()) - { - utf8 authhash = (*i).second.m_authHash; - if (authhash.empty()) - { - authhash = gOptions.stream_authHash((*i).first); - } - - if (authhash.empty()) - { - streamBody2 += ""; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash(authhash)) - { - streamBody2 += getBadAuthhashMessage((*i).first, authhash); - } - else - { - streamBody2 += "
" - // TODO if the stream is not active then we don't know the admode - // status and so it's easier to not show the warning until - // we've got something that will allow us to check authhash. - //+ utf8(info.m_radionomyID.empty() ? warningImage(false) + "  Please Register Your Authhash

" : "") + - "Update Authhash" - "  | Manage Authhash
"; - } - } - - if (!streamBody2.empty()) - { - streamBody2 += "
"; - } - streamBody2 += "This stream is configured but has no source connected." + - (data.connectedListeners > 0 ? "
Listeners: " - "" + tos(data.connectedListeners) + "" + (data.peakListeners > 0 ? "  |  " - "Peak: " + tos(data.peakListeners) + "" : "") + " [ kick all ]" + "
" : ""); - } - else - { - streamBody2 += "This stream is configured as having been moved or retired.
" - "No source connections will be allowed for this stream.

" - "All client connections received will be redirected to:
" + - urlLink(movedUrl) + "
"; - ++movedTotal; - } - - if (!streamBody2.empty()) - { - streamBody += "" + streamBody2 + ""; - } - - streamBlocks[(*i).first] = streamBody; - } - } - } - - // this will now do a final check for any listeners which are on - // an un-confiured stream but are being provided a 'backupfile'. - const streamData::streamIDs_t activeIds = stats::getActiveStreamIds(); - if (!activeIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = activeIds.begin(); i != activeIds.end(); ++i) - { - if (streamBlocks.find((*i)) == streamBlocks.end()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody = "" - "Stream #" + tos((*i)) + " " - "(Stream Login)", - streamBody2; - streamBody2 += "This stream is not configured and has no source connected." + - (data.connectedListeners > 0 ? "
Listeners: " - "" + tos(data.connectedListeners) + "" + (data.peakListeners > 0 ? "  |  " - "Peak: " + tos(data.peakListeners) + "" : "") + " [ kick all ]" + "
" : ""); - - if (!streamBody2.empty()) - { - streamBody += "" + streamBody2 + ""; - } - - streamBlocks[(*i)] = streamBody; - } - } - } - - // now build up the output since if we've factored in inactive relay connections - // then we could otherwise be showing the streams in an out of order manner - for (map::const_iterator i = streamBlocks.begin(); i != streamBlocks.end(); ++i) - { - if (!(*i).second.empty()) - { - if (streamTotal > 0) - { - streams += "


"; - } - streams += (*i).second; - ++streamTotal; - } - } - - // output a refresh option if there were no active streams found - if (!streamTotal) - { - if (isPostSetup() && isPostSetup() <= 2) - { - streams += "" - "
" - "Setup Successfully Completed
" - "No stream sources are currently connected.
" - "To find newly connected sources, click here."; - setPostSetup(isPostSetup() + 1); - } - else - { - streams += "No stream sources are currently connected.
" - "To find newly connected sources, click here.

"; - } - } - else - { - setPostSetup(0); - } - } - else if (refreshRequired > 0) - { - streams += "" - "Waiting " + tos(refreshRequired) + " second" + ((refreshRequired > 1) ? "s" : (utf8)"") + - " for any configuration changes to take effect.
" - "If not automatically redirected or do not want to wait, " - "click here.

"; - } - else if (refreshRequired < 0) - { - streams += "" - "Waiting " + tos(abs(refreshRequired)) + " second" + ((abs(refreshRequired) > 1) ? "s" : (utf8)"") + - " whilst checking for any DNAS updates.
If not automatically redirected or do not want to wait, " - "click here.

"; - } - - utf8 log = gOptions.realLogFile(); - utf8::size_type pos = log.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - log = log.substr(pos + 1); - } - - utf8 conf = gOptions.confFile(); - pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - const bool requires = gOptions.requireStreamConfigs(); - body += "" - "
" - "Available Streams: " + tos(streamTotal - movedTotal) + - "   |   " - "Server Listeners: " + tos(totalListeners) + - "   |   " - "Peak Server Listeners: " + tos(totalPeakListeners) + - "   |   " - "Unique Listeners: " + tos(stats::getTotalUniqueListeners()) + - "
" - - "
" - "
" - ""; - } - - body += "
" - - "" - "
" - "
Server Management
" - "Rotate Log File(s):" - " [ All ]" - "  [ Log ]" - "  [ W3C ]" - "

" - - // trim down the file paths shown to make things less cluttered on hosted setups - // places the full path in the 'title' so it can still be found if required, etc - "Log File: " + aolxml::escapeXML(fileUtil::stripPath(log)) + "

" - "Configuration File: " + aolxml::escapeXML(fileUtil::stripPath(conf)) + "
" - "[ View ]" - "  [ Update ]" - "  [ Forced ]" - - "



Source Connection Details:" - " [ View ]
" + - - (requires ? "
Note: Only pre-configured streams are " - "allowed to connect / be run on this server.
" : "") + - - "
Advert Group Details:" - " [ View ]
" - - "


Stream Configuration(s):" - " [ JSON ]" - "  [ XML ]
" - - "
View Stream Statistics:" - " [ JSON ]" - "  [ XML ]
" - - "


Manage Stream Source(s):
" - "[ Start Relays ]" - "  [ Kick / Stop All ]
" - - "


Reload Banned List(s):" - " [ Update ]
" - - "
Reload Reserved List(s):" - " [ Update ]
" - - "
Reload User Agent List(s):" - " [ Update ]
" - - "
Reload Admin Access List:" - " [ Update ]
" - - "
Clear Resource / Page Cache:" - " [ Clear ]
" - - "


Debugging Options:
" - "[ Enable All ]" - "  [ Disable All ]" - "  [ Edit ]" - - "



New DNAS Release: [ Check ]
" - "Last checked: " + getCheckedDuration((size_t)(m_lastActivityTime - last_update_check)) + "" - "
"; - - // display update message where applicable - updater::verInfo ver; - utf8 update_msg; - if (updater::getNewVersion(ver)) - { - update_msg += "
" - "
" - "
New DNAS Version Available
A new version of the DNAS is now available:" - " " + ver.ver + "

" + - (!ver.url.empty() ? - ((ver.downloaded && !ver.fn.empty()) ? "The new version has been automatically downloaded to:

" + aolxml::escapeXML(ver.fn) + "

" - "Please install this update as soon as possible, thank you.

" - "Specific changes for this version can be found here." - : - "Click here to download the new version of the DNAS.

" - "Please install this update as soon as possible, thank you.

" - "Specific changes for this version can be found here.") : "") + - (!ver.message.empty() ? "
" + ver.message : - (!ver.log.empty() ? "
For more details of the changes in this version see " + - "here." : "")) + "



" + - update_msg + streams + "
" + - "" + - getIEFlexFix() + getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_html(const int refreshRequired) throw() -{ - const __uint64 all = bandWidth::getAmount(bandWidth::ALL), - sent = bandWidth::getAmount(bandWidth::ALL_SENT), - recv = bandWidth::getAmount(bandWidth::ALL_RECV); - const time_t running = (::time(NULL) - g_upTime); - - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Bandwidth Usage", refreshRequired, "&mode=bandwidth&refresh=" + tos(abs(refreshRequired)), 1) + - "" - "
" - "Total: " + formatSizeString(all) + (all > 0 ? " (~" + formatSizeString((all / running) * 86400) + " / day)" : "") + "" - "   |   " - "Sent: " + formatSizeString(sent) + (sent > 0 ? " (~" + formatSizeString((sent / running) * 86400) + " / day)" : "") + "" - "   |   " - "Received: " + formatSizeString(recv) + (recv > 0 ? " (~" + formatSizeString((recv / running) * 86400) + " / day)" : "") + "" - "

" - - "" - - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -#if 0 - "" - "" -#endif - "" - - "" - "" - "" - "" - "" - "" - "" - - "" - "" - "" - "" - "" - "" - "" - - "" - "" - "" - "" - "" - "" - "" - "" - "" - - "" - "" - "" - "" - "" - "" - "" - - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - - "
 Total Client Data Sent" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "
v2 Client(s)" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "
v1 Client(s)" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "
HTTP Client(s)" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "
FLV Client(s)" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + "
M4A Client(s)" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + "
 
 Total Source Data Received" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "
v2 Source(s)" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "
v1 Source(s)" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + "
 
 Total Source Data Sent" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "
v2 Source(s)" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "
v1 Source(s)" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V1_SENT)) + "
 
 Total Relay Data Received" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_RELAY_RECV)) + "
Handshaking" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "
v2 Relay(s)" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "
v1 Relay(s)" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + "
 
 Total Web Page, XML and Resoures  " + formatSizeString(bandWidth::getAmount(bandWidth::ALL_WEB)) + "
Public (e.g. /stats or index.html)" + formatSizeString(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "
Private (e.g. /admin.cgi pages)" + formatSizeString(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + "
 
 Total Other Data" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "
Flash Policy Server" + formatSizeString(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "
v2 Relay(s) Sent" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "
YP Sent" + formatSizeString(bandWidth::getAmount(bandWidth::YP_SENT)) + "
YP Received" + formatSizeString(bandWidth::getAmount(bandWidth::YP_RECV)) + "
Listener Authentication and Metrics" + formatSizeString(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "
Advert Retrieval" + formatSizeString(bandWidth::getAmount(bandWidth::ADVERTS)) + "
" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_xml() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - "" - - "" + tos(bandWidth::getAmount(bandWidth::ALL)) + "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_RECV)) + "" - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + "" -#if 0 - "" + tos(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + "" -#endif - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + "" - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_SENT)) + "" - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_RELAY_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + "" - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_WEB)) + "" - "" + tos(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "" - "" + tos(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + "" - "" - - "" - "" + tos(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "" - "" + tos(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "" - "" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::YP_SENT)) + "" - "" + tos(bandWidth::getAmount(bandWidth::YP_RECV)) + "" - "" + tos(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "" - "" + tos(bandWidth::getAmount(bandWidth::ADVERTS)) + "" - "" - ""; - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_json(const uniString::utf8& callback) throw() -{ - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - "{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL)) + "," - "\"sent\":" + tos(bandWidth::getAmount(bandWidth::ALL_SENT)) + "," - "\"recv\":" + tos(bandWidth::getAmount(bandWidth::ALL_RECV)) + "," - "\"time\":" + tos((::time(NULL) - g_upTime)) + "," - "\"clientsent\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "," - "\"http\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "," - "\"flv\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + -#if 0 - "," - "\"m4a\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + -#endif - "},\"sourcerecv\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + - "},\"sourcesent\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + - "},\"relayrecv\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "," - "\"misc\":" + tos(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + - "},\"webpages\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_WEB)) + "," - "\"public\":" + tos(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "," - "\"private\":" + tos(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + - "},\"other\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "," - "\"flash\":" + tos(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "," - "\"relaysentv2\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "," - "\"ypsent\":" + tos(bandWidth::getAmount(bandWidth::YP_SENT)) + "," + - "\"yprecv\":" + tos(bandWidth::getAmount(bandWidth::YP_RECV)) + "," + - "\"auth_metrics\":" + tos(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "," + - "\"adverts\":" + tos(bandWidth::getAmount(bandWidth::ADVERTS)) + - "}}" + (jsonp ? utf8(")") : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_ypstatus_xml() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = "" - ""; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo((*i), info, extra); - - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - body += "" + - (!extra.isConnected ? "NOSOURCE" : - (info.m_streamPublic ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - (info.m_authHash.empty() ? "EMPTY_AUTHHASH" : "INVALID_AUTHHASH") : - (extra.ypErrorCode == 200 ? "WAITING" : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "YP_NOT_FOUND" : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "YP_MAINTENANCE" : - "ERROR" + tos(extra.ypErrorCode) + "")))) : - "PUBLIC" + info.m_stationID + "") : - "PRIVATE")) + ""; - } - else - { - body += "MOVED"; - } - } - - body += ""; - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_ypstatus_json(const uniString::utf8& callback) throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n"; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - const bool jsonp = !callback.empty(); - utf8 body = (jsonp ? callback + "(" : "") + "{" + - (!streamIds.empty() ? "\"streams\":[" : ""); - - bool read = false; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo((*i), info, extra); - - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - body += (read ? utf8(",") : "") + - "{" - "\"id\":" + tos((*i)) + "," + - (!extra.isConnected ? "\"status\":\"" + escapeJSON("nosource") + "\"" : - (info.m_streamPublic ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - (info.m_authHash.empty() ? "\"status\":\"" + escapeJSON("empty_authhash") + "\"" : - "\"status\":\"" + escapeJSON("invalid_authhash") + "\"") : - (extra.ypErrorCode == 200 ? "\"status\":\"" + escapeJSON("waiting") + "\"" : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "\"status\":\"" + escapeJSON("yp_not_found") + "\"" : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "\"status\":\"" + escapeJSON("yp_maintenance") + "\"" : - "\"status\":\"" + escapeJSON("error") + "\",\"code\":" + tos(extra.ypErrorCode))))) : - "\"status\":\"" + escapeJSON("public") + "\",\"stnid\":" + info.m_stationID) : - "\"status\":\"" + escapeJSON("private") + "\"")) + "}"; - } - else - { - body += (read ? utf8(",") : "") + "{\"id\":" + tos((*i)) + "," - "\"status\":\"" + escapeJSON("moved") + "\"}"; - } - read = true; - } - - body += (!streamIds.empty() ? utf8("]") : "") + "}" + (jsonp ? utf8(")") : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_viewxml(const streamData::streamID_t sid, int page, - const bool iponly, const bool ipcount) throw() -{ - // abort as there's nothing generated for this now - if (page == 2) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n\r\n"); - return; - } - - if ((page > 6) || (page < 0)) - { - page = 0; - } - - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = ""; - - if (page < 2) - { - stats::statsData_t data; - body += protocol_HTTPStyle::getStatsXMLBody(sid, true, true, m_socket, data); - } - - if ((page == 0) || (page == 3)) - { - time_t t = ::time(NULL); - body += ""; - - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - map ip_counts; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - const utf8& host = ((*i)->m_hostName != (*i)->m_ipAddr ? (*i)->m_hostName : (*i)->m_ipAddr); - - if (!ipcount) - { - if (!iponly) - { - body += "" - "" + aolxml::escapeXML(host) + "" - "" + aolxml::escapeXML((*i)->m_userAgent) + "" - "" + tos(t - (*i)->m_startTime) + "" - "" + tos((*i)->m_unique) + "" - "" + tos((*i)->m_clientType) + "" - "" + aolxml::escapeXML((*i)->m_referer) + "" - "" + aolxml::escapeXML((*i)->m_XFF) + "" - "" + tos((*i)->m_group) + "" - "" + tos((*i)->m_triggers) + "" - ""; - } - else - { - body += "" - "" + aolxml::escapeXML(host) + "" - ""; - } - } - else - { - ++ip_counts[host]; - } - - delete (*i); - } - - if (ipcount) - { - for (map::const_iterator i = ip_counts.begin(); i != ip_counts.end(); ++i) - { - body += "" - "" + aolxml::escapeXML((*i).first) + "" - "" + tos((*i).second) + "" - ""; - } - } - - body += ""; - } - - if ((page == 0) || (page == 4) || (page == 5)) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - // only provide this as an option feature so as not to bloat the main xml stats unnecessarily - if (!(page == 5)) - { - body += ""; - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += "" + tos((*i).m_when) + "" - "" + aolxml::escapeXML((*i).m_title) + "" + - protocol_HTTPStyle::getCurrentXMLMetadataBody(true, (*i).m_metadata) + ""; - } - body += ""; - } - else - { - body += protocol_HTTPStyle::getCurrentXMLMetadataBody(false, (!songHistory.empty() ? songHistory[0].m_metadata : "")); - } - } - - if (page == 6) - { - const int maxUsers = gOptions.maxUser(); - body += "" - "" + tos(gOptions.requireStreamConfigs()) + "" - "" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "" - "" + tos(gOptions.minBitrate()) + "" - "" + tos(gOptions.maxBitrate()) + "" - ""; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - utf8 block = ""; - size_t moved = 0; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - utf8 streamTag = ((*i).second.m_streamID > 1 ? "/stream/" + tos((*i).second.m_streamID) + "/" : "/"); - if (!(*i).second.m_urlPath.empty()) - { - streamTag = (*i).second.m_urlPath; - } - - const utf8& authhash = (*i).second.m_authHash; - block += "" - "" + aolxml::escapeXML(authhash.empty() ? "EMPTY" : !yp2::isValidAuthhash(authhash) ? "INVALID" : authhash) + "" - "" + aolxml::escapeXML(streamTag) + "" - "" + aolxml::escapeXML((*i).second.m_relayUrl.url()) + "" - "" + aolxml::escapeXML((*i).second.m_backupUrl.url()) + "" - "" + ((*i).second.m_maxStreamUser > 0 && (*i).second.m_maxStreamUser < gOptions.maxUser() ? tos((*i).second.m_maxStreamUser) : "SERVERMAXLISTENERS") + "" - "" + ((*i).second.m_minStreamBitrate > 0 ? tos((*i).second.m_minStreamBitrate) : "SERVERMINBITRATE") + "" - "" + ((*i).second.m_maxStreamBitrate > 0 ? tos((*i).second.m_maxStreamBitrate) : "SERVERMAXBITRATE") + "" - "" + aolxml::escapeXML((*i).second.m_publicServer) + "" - "" + tos((*i).second.m_allowRelay) + "" - "" + tos((*i).second.m_allowPublicRelay) + "" - ""; - } - else - { - ++moved; - } - } - - body += tos((streams.size() - moved)) + "" + block + ""; - } - - body += ""; - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_viewjson(const streamData::streamID_t sid, int page, - const bool iponly, const bool ipcount, - const uniString::utf8& callback) throw() -{ - // abort as there's nothing generated for this now - if (page == 2) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n\r\n"); - return; - } - - if (page > 6 || page < 0) - { - page = 0; - } - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + (page < 2 ? "{" : ""); - - if (page < 2) - { - stats::statsData_t data; - body += protocol_HTTPStyle::getStatsJSONBody(sid, true, true, m_socket, data); - } - - if ((page == 0) || (page == 3)) - { - time_t t = ::time(NULL); - body += (!page ? utf8(",\"listeners\":[") : "["); - - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - map ip_counts; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - const utf8& host = ((*i)->m_hostName != (*i)->m_ipAddr ? (*i)->m_hostName : (*i)->m_ipAddr); - - if (!ipcount) - { - if (!iponly) - { - body += (i != client_data.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON(host) + "\"," - "\"useragent\":\"" + escapeJSON((*i)->m_userAgent) + "\"," - "\"connecttime\":" + tos(t - (*i)->m_startTime) + "," - "\"uid\":" + tos((*i)->m_unique) + "," - "\"type\":" + tos((*i)->m_clientType) + "," - "\"referer\":\"" + escapeJSON((*i)->m_referer) + "\"," - "\"xff\":\"" + escapeJSON((*i)->m_XFF) + "\"," - "\"grid\":" + tos((*i)->m_group) + "," - "\"triggers\":" + tos((*i)->m_triggers) + "" - "}"; - } - else - { - body += (i != client_data.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON(host) + "\"" - "}"; - } - } - else - { - ++ip_counts[host]; - } - - delete (*i); - } - - if (ipcount) - { - for (map::const_iterator i = ip_counts.begin(); i != ip_counts.end(); ++i) - { - body += (i != ip_counts.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON((*i).first) + "\"," - "\"total\":" + tos((*i).second) + "" - "}"; - } - } - - body += "]"; - } - - if ((page == 0) || (page == 4) || (page == 5)) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - // only provide this as an option feature so as not to bloat the main xml stats unnecessarily - if (!(page == 5)) - { - bool first = true; - body += (!page ? utf8(",\"songs\":[") : "["); - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += (!first ? utf8(",") : "") + "{\"playedat\":" + - tos((*i).m_when) + "," "\"title\":\"" + - escapeJSON((*i).m_title) + "\",\"metadata\":" + - protocol_HTTPStyle::getCurrentJSONMetadataBody((*i).m_metadata) + "}"; - first = false; - } - body += "]"; - } - else - { - body += protocol_HTTPStyle::getCurrentJSONMetadataBody((!songHistory.empty() ? songHistory[0].m_metadata : "")); - } - } - - if (page == 6) - { - const int maxUsers = gOptions.maxUser(); - body += "{" - "\"requireconfigs\":" + tos(gOptions.requireStreamConfigs()) + "," - "\"maxlisteners\":" + (maxUsers > 0 ? tos(maxUsers) : "\"unlimited\"") + "," - "\"minbitrate\":" + tos(gOptions.minBitrate()) + "," - "\"maxbitrate\":" + tos(gOptions.maxBitrate()) + ","; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - bool read = false; - utf8 block = ""; - size_t moved = 0; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - utf8 streamTag = ((*i).second.m_streamID > 1 ? "/stream/" + tos((*i).second.m_streamID) + "/" : "/"); - if (!(*i).second.m_urlPath.empty()) - { - streamTag = (*i).second.m_urlPath; - } - - utf8 authhash = (*i).second.m_authHash; - block += (read ? utf8(",") : "") + - "{" - "\"id\":" + tos((*i).second.m_streamID) + "," - "\"authhash\":\"" + escapeJSON(authhash.empty() ? "empty" : !yp2::isValidAuthhash(authhash) ? "invalid" : authhash) + "\"," - "\"path\":\"" + escapeJSON(streamTag) + "\"," - "\"relayurl\":\"" + escapeJSON((*i).second.m_relayUrl.url()) + "\"," - "\"backupurl\":\"" + escapeJSON((*i).second.m_backupUrl.url()) + "\"," - "\"maxlisteners\":\"" + escapeJSON(((*i).second.m_maxStreamUser > 0) && ((*i).second.m_maxStreamUser < gOptions.maxUser()) ? tos((*i).second.m_maxStreamUser) : escapeJSON("maxlisteners")) + "\"," - "\"minbitrate\":\"" + escapeJSON((*i).second.m_minStreamBitrate > 0 ? tos((*i).second.m_minStreamBitrate) : escapeJSON("minbitrate")) + "\"," - "\"maxbitrate\":\"" + escapeJSON((*i).second.m_maxStreamBitrate > 0 ? tos((*i).second.m_maxStreamBitrate) : escapeJSON("maxbitrate")) + "\"," - "\"public\":\"" + escapeJSON((*i).second.m_publicServer) + "\"," - "\"allowrelay\":\"" + tos((*i).second.m_allowRelay) + "\"," - "\"publicrelay\":\"" + tos((*i).second.m_allowPublicRelay) + "\"" - "}"; - read = true; - } - else - { - ++moved; - } - } - const size_t total = (streams.size() - moved); - body += "\"total\":\"" + tos(total) + "\"" + - (total > 0 ? ",\"streams\":[" : "") + block + - (total > 0 ? utf8("]") : "") + "}"; - } - - body += (page < 2 ? utf8("}") : "") + (jsonp ? ")" : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_sources(const uniString::utf8& host) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Source Connection Details") + - "" - "
" + - utf8(gOptions.requireStreamConfigs() ? "Sources are only able to connect on the configured streams shown" : - "Sources are able to connect on any \"Stream ID\" (using the appropriate details)") + - "
" - "

" - - "
" - "
Information
" - "Here are the login details to enter in your chosen source software so it can then be used to connect to the server.

" - "Note: Names of options in the source software may vary from those shown.

" - - "* This may not be correct and is a best guess from the current connection.



" - "The 'Legacy Password' is for use with legacy sources (which are sources that are not able to directly specify the " - "desired stream number).

This allows for use of any Shoutcast compatible source on any of the currently configured streams.

" - "If connecting a legacy source to stream #1, the 'Password' value can be used.



" - "The example JSON-P response uses callback=func which can be changed to a custom value as required for usage.



" - - "For further information on connecting sources to the server, as well as ensuring that all of the required ports have been opened, " - "see this wiki page.

"; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - utf8 ids = ""; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - ids += (i != streams.begin() ? ", ": "") + tos((*i).second.m_streamID); - - // skip over moved streams as they cannot be used, though we include the - // streamid above (whether or not that'll confuse people i do not know). - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - int maxbitrate = ((*i).second.m_maxStreamBitrate > 0 ? (*i).second.m_maxStreamBitrate : gOptions.maxBitrate()), - minbitrate = ((*i).second.m_minStreamBitrate > 0 ? (*i).second.m_minStreamBitrate : gOptions.minBitrate()); - - // test for being a relay which is active - if so then we need to not show - // direct source login details as they will not be able to connect anyway - bool noEntry = false, isRelay = (*i).second.m_relayUrl.isSet(); - if (isRelay && streamData::isRelayActive((*i).second.m_streamID, noEntry)) - { - body += "
" - "
" - "Stream #" + tos((*i).second.m_streamID) + "
" - "This stream has been configured for use as a relay which is currently active.

" - "Any source connections attempted will be blocked whilst the relay is active.

" - "Password: " + aolxml::escapeXML((*i).second.m_password) + "
" - "Source: " + urlLink(niceURL((*i).second.m_relayUrl.url())) + "
" + - (!(*i).second.m_backupUrl.url().empty() ? "Backup Source: " + - urlLink(niceURL((*i).second.m_backupUrl.url())) + "
" : ""); - } - // otherwise show direct source login details for specific as well as generic stream - // logins (even if configured to be a relay as long as it is inactive at the time) - else - { - body += "
" - "
Stream #" + tos((*i).second.m_streamID) + "
" + - (isRelay ? "Note: Configured as a relay to use:
" + - niceURL((*i).second.m_relayUrl.url()) + "

" : "") + - "Stream ID: " + tos((*i).second.m_streamID) + "
" - "Server Address: " + (!host.empty() ? host : "") + " (*)
" - "Source Port: " + tos(gOptions.portBase()) + "

" + - "Password: " + aolxml::escapeXML((*i).second.m_password) + "
" + - ((*i).second.m_streamID > 1 && (g_legacyPort > 0) ? "Legacy Password: " + - aolxml::escapeXML((*i).second.m_password) + ":#" + tos((*i).second.m_streamID) + "

" : "
") + - "Min Bitrate Allowed: " + (!minbitrate ? "Unlimited" : tos(minbitrate / 1000) + " kbps") + "
" - "Max Bitrate Allowed: " + (!maxbitrate ? "Unlimited" : tos(maxbitrate / 1000) + " kbps") + "

" - "Protocol Mode: " + ((g_legacyPort > 0) ? "v2, v1" : "v2") + "
"; - } - - const utf8 address = "http://" + ((!host.empty() ? host : "") + ":" + tos(gOptions.portBase())), - params = "?sid=" + tos((*i).second.m_streamID) + "&pass=" + aolxml::escapeXML((*i).second.m_password); - body += "


Listener Playlist(s):
" - "PLS,  " - "M3U,  " - "ASX,  " - "XSPF,  " - "QTL" - - "

Direct Stream URL(s):
" - "" - " FLV,  " - "" - " HTTP,  " - "" - " 1.x,  " - "" - " 2.x" - - "

History:
" - "XML,  " - "JSON,  " - "JSON-P" - - "

Stream Statistics:
" - "XML,  " - "JSON,  " - "JSON-P
"; - } - } - - if (!gOptions.requireStreamConfigs()) - { - const int minbitrate = gOptions.minBitrate(), maxbitrate = gOptions.maxBitrate(); - body += "
" - "
All" + (!ids.empty() ? " Other" : (utf8)"") + " Streams
" - "Stream ID: <any value" + (!ids.empty() ? " other than " + ids : "") + ">
" - "Server Address: " + aolxml::escapeXML(!host.empty() ? host : "") + " (*)
" - "Server Port: " + tos(gOptions.portBase()) + "

" + - "Password: " + aolxml::escapeXML(gOptions.password()) + "
" + - ((g_legacyPort > 0) ? "Legacy Password: " + aolxml::escapeXML(gOptions.password()) + ":#xx

" : "
") + - "Min Bitrate Allowed: " + (!minbitrate ? "Unlimited" : tos(minbitrate / 1000) + " kbps") + "
" - "Max Bitrate Allowed: " + (!maxbitrate ? "Unlimited" : tos(maxbitrate / 1000) + " kbps") + "

" - "Protocol Mode: " + ((g_legacyPort > 0) ? "v2, v1" : "v2") + "
"; - - const utf8 address = "http://" + ((!host.empty() ? host : "") + ":" + tos(gOptions.portBase())), - params = "?sid=xx&pass=" + aolxml::escapeXML(gOptions.password()); - body += "


Listener Playlist(s):
" - "PLS,  " - "M3U,  " - "ASX,  " - "XSPF,  " - "QTL" - - "

History:
" - "XML,  " - "JSON,  " - "JSON-P" - - "

Stream Statistics:
" - "XML,  " - "JSON,  " - "JSON-P" - "

Note: Replace the 'xx' in 'sid=xx' in all of the example links " - "and in the 'Legacy Password' with the stream number.
"; - } - - body += "
" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_adgroups() throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Advert Group Details") + - "

" - "" - "
" - "
" - "
" - "
Information
" - "Here you can see which active stream(s) have adverts enabled and their status of obtaining the advert details." - "

This can help to see if a listener should be receiving adverts or not by " - "checking for the listener's group id with the group ids shown for the required stream.

" - - "
" - ""; - - const streamData::streamIDs_t streamIds = streamData::getStreamIds(); - if (!streamIds.empty()) - { - body += "" - ""; - - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData *sd = streamData::accessStream((*i)); - if (sd) - { - if (sd->isSourceConnected((*i))) - { - body += "" - ""; - } - sd->releaseStream(); - } - } - } - else - { - body += ""; - } - body += "
Stream #Advert Group(s)
" + tos((*i)) + "" + - sd->getAdvertGroup() + "
There are no active streams.
" + - getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_debug(const uniString::utf8& option, const int on_off, const bool adminRefer) throw() -{ - struct debug_options { - utf8 option; - utf8 desc; - utf8 msg; - bool value; - }; - debug_options debug[] = { - {"Listener Connections", "", ""}, - {"shoutcast1clientdebug", "Shoutcast 1.x Listener Connections", "Used to diagnose connection issues with listener connections using the legacy Shoutcast 1.x protocol" - "
(e.g. HTTP connections indicating they support icy-metadata).", gOptions.shoutcast1ClientDebug()}, - {"shoutcast2clientdebug", "Shoutcast 2.x Listener Connections", "Used to diagnose connection issues with listener connections using the Shoutcast 2.x protocol.", gOptions.shoutcast2ClientDebug()}, - {"httpclientdebug", "HTTP Listener Connections", "Used to diagnose connection issues with listener connections using the HTTP protocol.", gOptions.HTTPClientDebug()}, - {"flvclientdebug", "FLV Listener Connections", "Used to diagnose connection issues with listener connections using the FLV encapsulation.", gOptions.flvClientDebug()}, -#if 0 - {"m4aclientdebug", "M4A Listener Connections", "Used to diagnose connection issues with listener connections using the M4A encapsulation.", gOptions.m4aClientDebug()}, -#endif - {"Direct Source Connections", "", ""}, - {"shoutcastsourcedebug", "Shoutcast 1.x Source Connections", "Used to diagnose connection issues with source connections using the legacy Shoutcast 1.x protocol.", gOptions.shoutcastSourceDebug()}, - {"uvox2sourcedebug", "Shoutcast 2.x Source Connections", "Used to diagnose connection issues with source connections using the Shoutcast 2.x protocol.", gOptions.uvox2SourceDebug()}, - {"httpsourcedebug", "HTTP Source Connections", "Used to diagnose connection issues with source connections using HTTP PUT protocol (e.g. Icecast sources).", gOptions.HTTPSourceDebug()}, - {"Relay Source Connections", "", ""}, - {"relayshoutcastdebug", "Shoutcast 1.x Relay Connections", "Used to diagnose connection issues with relay connections using the legacy Shoutcast 1.x protocol.", gOptions.relayShoutcastDebug()}, - {"relayuvoxdebug", "Shoutcast 2.x Relay Connections", "Used to diagnose connection issues with relay connections using the Shoutcast 2.x protocol.", gOptions.relayUvoxDebug()}, - {"relaydebug", "Common Relay Handling", "Used to diagnose issues with general relay handling when a relay connection begins (non-protcool specific).", gOptions.relayDebug()}, - {"HTTP Connections", "", ""}, - {"httpstyledebug", "HTTP Requests", "Used to inspect HTTP requests made to the server (e.g. listener or statistic requests).", gOptions.httpStyleDebug()}, - {"webclientdebug", "HTTP Connections", "Used to inspect and diagnose issues with HTTP connections issued by the server.", gOptions.webClientDebug()}, - {"Shoutcast Services", "", ""}, - {"admetricsdebug", "Advert & Metrics Handling", "Used to inspect and diagnose issues with the advert and metric activity for client connections.", gOptions.adMetricsDebug()}, - {"yp2debug", "YP / Directory Connections", "Used to diagnose failures to connect to the Directory servers or to be listed.", gOptions.yp2Debug()}, -#if defined(_DEBUG) || defined(DEBUG) - // this is not enabled as we don't really want to promote the existence of this - {"authdebug", "Listener Auth Handling", "Used to diagnose issues with the client auth handling when clients connect to the stream.", gOptions.authDebug()}, -#endif - {"Miscellaneous", "", ""}, - {"streamdatadebug", "Common Stream Handling", "Used to diagnose issues with general streaming code (non-protcool specific).", gOptions.streamDataDebug()}, - {"statsdebug", "Client Statistics", "Used to inspect client statistics tracked by the server.", gOptions.statsDebug()}, - {"microserverdebug", "Common Server Activity", "Used to diagnose and track common server activity.", gOptions.microServerDebug()}, - {"threadrunnerdebug", "Thread Manager", "Used to diagnose and track the processing of threads by the thread manager.", gOptions.threadRunnerDebug()}, - }; - - if (option.empty()) - { - utf8 header = "HTTP/1.1 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Content-Type:text/html;charset=utf-8\r\n", - body = getServerAdminHeader("Server Debugging Options") + - "

" - "" - "
" - "
" - "
" - "
Information
" - "Here you can find are all debugging options provided by the " - "DNAS server.

Changing the debugging options will update " - "the value saved in the DNAS server configuration file(s) as " - "needed.

Any changes are applied immediately.



" - - "
All Options

" - "" - "   " - "



" - - "
Listener Options

" - "" - "   " - "



" - - "
Source Options

" - "" - "   " - "



" - - "
Force Short Sends
[" + (gOptions.forceShortSends() ? "Enabled" : - "Disabled") + "]


This inserts delays into sending stream(s)" - "to replicate network limiting and bandwidth issues (Default: Disabled).

" - "" - "   " - "



" - - "
Rate Limiting
" - "[" + (gOptions.rateLimit() ? "Enabled" : "Disabled") + - "]


Controls the rate of output to even " - "it out and prefer sending larger blocks in one go instead of " - "doing smaller blocks more often (Default: Enabled).

" - "" - "   " - - "
"; - - for (size_t i = 0; i < sizeof(debug) / sizeof(debug[0]); i++) - { - if (!debug[i].desc.empty()) - { - body += "" "" - "
" + debug[i].msg + "

"; - } - else - { - body += (i ? "
" : (utf8)"") + "" + debug[i].option + ":

"; - } - } - - body += "
" - + getUptimeScript() + - "" + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - if (option == "all") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all debugging options"); - for (size_t i = 0; i < sizeof(debug) / sizeof(debug[0]); i++) - { - if (!debug[i].desc.empty()) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(debug[i].option, utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), debug[i].option, tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + debug[i].option + "'"); - } - } - } - } - else if (option == "listener") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all listener debugging options"); - const utf8 options[] = {"shoutcast1clientdebug", "shoutcast2clientdebug", "httpclientdebug", "flvclientdebug"/*, "m4aclientdebug"*/}; - for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(options[i], utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), options[i], tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + options[i] + "'"); - } - } - } - else if (option == "source") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all source debugging options"); - const utf8 options[] = {"shoutcastsourcedebug", "uvox2sourcedebug", "httpsourcedebug", - "relayshoutcastdebug", "relayuvoxdebug", "relaydebug"}; - for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(options[i], utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), options[i], tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + options[i] + "'"); - } - } - } - else - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " the `" + option + "' debugging options"); - - // always set even if the saving fails so we've got something working - gOptions.setOption(option, utf8(tos(on_off))); - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), option, tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + option + "'"); - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } -} - -void protocol_admincgi::mode_help() throw() -{ - utf8 libs = "Supporting Libraries:

"; - std::vector parts = tokenizer(utf8(curl_version()), ' '); - for (vector::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - utf8::size_type pos = (*i).find('/'); - if (pos != utf8::npos) - { - libs += (*i).substr(0, pos) + utf8(": ") + (*i).substr(pos + 1) + utf8(""); - } - else - { - libs += "" + (*i) + ""; - } - - - if ((*i).find((utf8)"libcurl") != utf8::npos) - { - libs += " (site)"; - } - else if ((*i).find((utf8)"OpenSSL") != utf8::npos) - { - libs += " (site)"; - } - else if ((*i).find((utf8)"zlib") != utf8::npos) - { - libs += " (site)"; - } - libs += "
"; - } - - const int cpu_count = gOptions.getCPUCount(); - const utf8 cpu = "CPU Count: " + tos(cpucount()) + " -> " + - (cpu_count == cpucount() ? "using " + utf8(cpu_count > 1 ? "all" : "the") + - " available CPU" + (cpu_count > 1 ? "s" : "") : tos(cpu_count) + - " specified to be used") + "

"; - - XML_Expat_Version expat = XML_ExpatVersionInfo(); - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Help & Documentation") + - - "

" - - "
" - "
Help
" - "If you are having issues, you should first try to contact your " - "hosting provider.

If running the DNAS server yourself (or if instructed " - "to do so), then you can use our forum " - "or you can contact " - "Shoutcast support directly (e.g. if the issue relates to an " - "account / authhash issue).

Note: If using the forum, " - "do not post any information which could be used to compromise " - "your account / authhash / etc (e.g. passwords and authhash(s)).

" - - "
" - "
Documentation
" - "Supporting documentation for using the DNAS server from setup " - "to getting statistics from the server are online.

" - "Otherwise a local copy can usually be found on the host machine at:

" - "
" + aolxml::escapeXML(gStartupDirectory) + - "

Note: The local copy is usually correct for the version being " - "used and the " - "online version will be for the most recent release.

" - - "
" - "
About
" - "Information about the DNAS server and the supporting libraries currently used.

" - "Version: " + addWBR(gOptions.getVersionBuildStrings()) + "
" - "Platform: " + SERV_OSNAME "
" - "Built: " __DATE__"

" - + libs + // libcurl, openssl, zlib - "expat: " + tos(expat.major) + "." + tos(expat.minor) + "." + tos(expat.micro) + "" - " (site)" - //#ifdef _WIN32 - //"
pthread-win32: " PTW32_VERSION_STR "-mod" - //" (site)" - //#endif - "

" - - "
Diagnostics
" + cpu + - "Current thread & runner usage:

" + - threadedRunner::getRunnabledetails() + "
" - - + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_config() throw() -{ - utf8 conf = gOptions.confFile(); - utf8::size_type pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Configuration Settings") + - "
This page shows the custom configuration settings " - "that this DNAS server is currently using. (Settings which match DNAS server defaults " - "may not be shown.)

Note #1: To change these values, you will need to edit the " - "" + - (!conf.empty() ? conf : "sc_serv.conf") + " file on your server. See here " - "for more information.

Note #2: This is not the same as the actual configuration file " - "(i.e. the structure of the configuration file(s) being used is not shown)
" + - gOptions.dumpConfigFile() + "
" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -#if 0 -void protocol_admincgi::mode_logs() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Content-Type:text/html;charset=utf-8\r\n", - headerTitle = "Server Log Management", childPage = ""; - - bool bwstyle = false; - int refreshRequired = 0; - utf8 body = s_serverAdminHeading; - - body += "

" - "" - "
" - "
" - "
" - "
Information
" - "Here you can find are all debugging options provided by the DNAS server.

Changing the debugging " - "options will update the value saved in the DNAS server configuration file(s) as needed.

" - "Any changes are applied immediately.

" - - "
"; - - utf8 logfile = gOptions.realLogFile(); - - body += "
Current log file:
"; - body += "
" + - aolxml::escapeXML(fileUtil::stripPath(logfile)) + "" - "   View" - "   Save" - "
Size: " + formatSizeString(uniFile::fileSize(logfile)) + "

"; - - utf8 rotated = fileUtil::stripSuffix(logfile) + "_*." + fileUtil::getSuffix(logfile); - body += "
Older log file(s):
"; - body += "
"; - #ifdef _WIN32 - vector fileList = fileUtil::directoryFileList(utf8(fileUtil::getFullFilePath(rotated)).toWString(), L"", true, true); - #else - vector fileList = fileUtil::directoryFileList(fileUtil::getFullFilePath(rotated), ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "
" + fileUtil::stripPath(u8f) + "" - "
   View   " - "Save

Size: " + - formatSizeString(uniFile::fileSize(u8f)) + "" - "
Last Modified: " + getRFCDate(uniFile::fileTime(u8f)) + "

"; - #else - body += "
" + fileUtil::stripPath(*i) + "   " - "Save
"; - #endif - } - } - body += "
"; -#if 0 - utf8 archived = fileUtil::stripSuffix(logfile) + "_*.gz"; - body += "
Log file (archived): "/* + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + */"

"; - body += "
"; - #ifdef _WIN32 - fileList = fileUtil::directoryFileList(utf8(fileUtil::getFullFilePath(archived)).toWString(), L"", true, true); - #else - fileList = fileUtil::directoryFileList(fileUtil::getFullFilePath(archived), ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "
" + fileUtil::stripPath(u8f) + "
"; - #else - body += "
" + fileUtil::stripPath(*i) + "
"; - #endif - } - } - body += "
"; - - body += "
"; - - utf8 w3cfile = gOptions.w3cLog(); - body += "
W3C file: " + aolxml::escapeXML(fileUtil::getFullFilePath(w3cfile)) + "

"; - utf8 archived = fileUtil::stripSuffix(w3cfile) + "_*.gz"; - body += "
W3C file (archived): " + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + "

"; - archived = fileUtil::stripSuffix(w3cfile) + "_*_w3c.gz"; - body += "
W3C file (archived 2): " + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + "

"; - body += "
"; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // w3c logging - if (gOptions.read_stream_w3cLog((*i).first)) - { - body += "
Stream W3C file: " + aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.stream_w3cLog((*i).first))) + "

"; - } - } - body += "
"; - body += "
"; - body += "
"; - #ifdef _WIN32 - fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_w3c*.log", L"", true, true); - #else - fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_w3c*.log", ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "
" + fileUtil::stripPath(u8f) + "
"; - #else - body += "
" + fileUtil::stripPath(*i) + "
"; - #endif - } - } - body += "
"; -#endif - body += "
" - + getUptimeScript() + - "" + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h b/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h deleted file mode 100644 index eeec9327..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h +++ /dev/null @@ -1,115 +0,0 @@ -#pragma once -#ifndef protocol_admincgi_H_ -#define protocol_admincgi_H_ - -#include "threadedRunner.h" -#include "protocol_HTTPStyle.h" -#include "streamData.h" - -// this class takes any necessary actions indicated by an HTTP -// call with the /admin.cgi url -class protocol_admincgi: public runnable -{ -private: - const bool m_noSID; - const bool m_zeroSID; - short m_saveLogFile; - - const uniString::utf8 m_clientLogString; - const protocol_HTTPStyle::HTTPRequestInfo m_httpRequestInfo; - const uniString::utf8 m_password; - uniString::utf8 m_referer; - const uniString::utf8 m_hostIP; - const uniString::utf8 m_userAgent; - const streamData::streamID_t m_sid; - - virtual uniString::utf8 name() const throw() { return "protocol_admincgi"; } - void timeSlice() throw(std::exception); - typedef void (protocol_admincgi::*state_t)(); - - state_t m_state; - state_t m_nextState; - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - bool m_tailLogFile; - // for log file output colouring - char lastChar; - bool inMsg; - bool first; - - uniString::utf8 m_outMsg; - uniString::utf8 m_updinfoSong; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoURL; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoDJ; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoNext; // for the updinfo so we're not re-processing after checking - - // for log file transmission - FILE* m_logFile; - uniString::utf8 m_logFileName; - uniString::utf8 m_logFileHeader; - uniString::utf8 m_logFileBodyPrefix; - uniString::utf8 m_logFileBodyFooter; - std::vector m_logFileBuffer; - z_stream m_stream; - - void state_ConfirmPassword() throw(std::exception); - void state_Send() throw(std::exception); - void state_Close() throw(std::exception); - void state_UpdateMetadata() throw(std::exception); - void state_UpdateXMLMetadata() throw(std::exception); - void state_SendFileHeader() throw(std::exception); - void state_SendFileFooter() throw(std::exception); - void state_SendFileContents() throw(std::exception); - void state_SendFileEnd() throw(std::exception); - - void sendMessageAndClose(const uniString::utf8 &msg) throw(); - - void mode_none(const streamData::streamID_t sid, const int refreshRequired) throw(); - void mode_kickdst(const streamData::streamID_t sid, const uniString::utf8 &kickAddrs) throw(); - void mode_ban(const streamData::streamID_t sid, const uniString::utf8 &banAddrs, const int banMask) throw(); - void mode_unban(const streamData::streamID_t sid, const uniString::utf8 &banAddr, const int banMask) throw(); - void mode_viewban(const streamData::streamID_t sid) throw(); - void mode_viewrip(const streamData::streamID_t sid) throw(); - void mode_rip(const streamData::streamID_t sid, const uniString::utf8 &ripAddr, const uniString::utf8 &rawIpAddr) throw(); - void mode_unrip(const streamData::streamID_t sid, const uniString::utf8 &ripAddr, const uniString::utf8 &rawIpAddr) throw(); - void mode_viewagent(const streamData::streamID_t sid) throw(); - void mode_agent(const streamData::streamID_t sid, const uniString::utf8 &agent) throw(); - void mode_unagent(const streamData::streamID_t sid, const uniString::utf8 &agent) throw(); - void mode_viewxml(const streamData::streamID_t sid, int page, const bool iponly, const bool ipcount) throw(); - void mode_viewjson(const streamData::streamID_t sid, int page, const bool iponly, const bool ipcount, const uniString::utf8& callback) throw(); - void mode_viewlog(const streamData::streamID_t sid, const bool tail, const bool save, const bool server) throw(); - void mode_art(const streamData::streamID_t sid, const int mode) throw(); - void mode_register(const streamData::streamID_t sid, const streamData::streamInfo &info) throw(); - void mode_listeners(const streamData::streamID_t sid) throw(); - void mode_summary(const int refreshRequired) throw(); - void mode_bandwidth_html(const int refreshRequired) throw(); - void mode_bandwidth_xml() throw(); - void mode_bandwidth_json(const uniString::utf8& callback) throw(); - void mode_ypstatus_xml() throw(); - void mode_ypstatus_json(const uniString::utf8& callback) throw(); - void mode_sources(const uniString::utf8& host) throw(); - void mode_adgroups() throw(); - void mode_debug(const uniString::utf8& option, const int on_off, const bool adminRefer) throw(); - void mode_logs() throw(); - void mode_history(const streamData::streamID_t sid) throw(); - void mode_help() throw(); - void mode_config() throw(); - - const uniString::utf8 getClientIP(const bool streamPublic, const uniString::utf8 &publicIP) throw(); - uniString::utf8 escapeText(const std::vector &s) throw(); - -public: - protocol_admincgi(const socketOps::tSOCKET s, const streamData::streamID_t sid, const bool no_sid, - const bool zero_sid, const uniString::utf8 &clientLogString, - const uniString::utf8 &password, const uniString::utf8 &referer, - const uniString::utf8 &hostIP, const uniString::utf8 &m_userAgent, - const protocol_HTTPStyle::HTTPRequestInfo &httpRequestInfo) throw(std::exception); - ~protocol_admincgi() throw(); -}; - -extern uniString::utf8 logId; -const uniString::utf8 randomId(uniString::utf8 &temp); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp b/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp deleted file mode 100644 index 2ebe5562..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp +++ /dev/null @@ -1,538 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_backup.h" -#include "protocol_relay_shoutcast.h" -#include "protocol_relay_uvox.h" -#include "bandwidth.h" -#include "streamData.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define LOGNAME "BACKUP" - -#define DEBUG_LOG(...) do { if (gOptions.relayDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_backup::protocol_backup(const config::streamConfig &info, const int originalBitrate, const uniString::utf8& originalMimeType) throw() - : m_originalMimeType(originalMimeType), m_outBuffer(0), - m_outBufferSize(0), m_originalBitrate(originalBitrate), m_retryCount(0), - m_backupWaitingToReconnect(false), m_backupSentConnectWait(false), - m_skip(false), m_tryRelaySource(false), m_backupReconnectStartTime(0), - m_state(&protocol_backup::state_Initial), m_nextState(0), - m_backupInfo(info), m_originalbackupInfo(info), m_redirectCount(0) -{ - m_srcPort = m_backupInfo.m_backupUrl.port(); - m_srcAddrName = m_backupInfo.m_backupUrl.server(); - m_srcURLpart = m_backupInfo.m_backupUrl.path(); - m_srcLogString = "[BACKUP " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_backupInfo.m_streamID) + "] "; - - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); -} - -protocol_backup::~protocol_backup() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_backup::timeSlice() throw(exception) -{ - // check if the DNAS has stopped or that the relay hasn't been stopped as - // otherwise this'll sit and keep making backup attempts when not needed, - // making sure that we've given the backup at least an attempt to connect - - bool serverDown = iskilled(); - bool noEntry = false, inactive = ((streamData::isRelayActive(m_backupInfo.m_streamID, noEntry) & 8) != 8); - - if (serverDown || noEntry || inactive) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ILOG (m_srcLogString + "Termination for source backup detected", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - - if (m_backupWaitingToReconnect && (::time(NULL) < m_backupReconnectStartTime)) - { - // an error occured in the past and we are waiting for the appropriate time interval before we do anything - m_result.schedule(350); - return; - } - else - { - // normal running - try - { - (this->*m_state)(); - } - catch(const exception &ex) - { - // close socket and move into waiting state for reconnect - socketOps::forgetTCPSocket(m_socket); - - // but first see if we've hit the retry limit (which can be set as zero to keep on going) - ++m_retryCount; - int retryLimit = gOptions.relayConnectRetries(); - DEBUG_LOG(m_srcLogString + __FUNCTION__ + utf8(" m_retryCount:") + tos(m_retryCount) + " retryLimit:" + tos(retryLimit) + " m_tryRelaySource: " + tos(m_tryRelaySource), LOGNAME, m_originalbackupInfo.m_streamID); - if ((retryLimit == 0) || (m_retryCount < retryLimit && retryLimit > 0)) - { - utf8 msg = ex.what(); - if (!msg.empty()) - { - ELOG(ex.what()); - } - - m_backupWaitingToReconnect = true; - m_state = &protocol_backup::state_Initial; - m_backupInfo = m_originalbackupInfo; - m_backupReconnectStartTime = ::time(NULL) + gOptions.relayReconnectTime(); - m_result.schedule (550); - } - else - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - throwEx(m_srcLogString + ex.what()); - } - } - } -} - -// parse out backupInfo object -void protocol_backup::state_Initial() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - // if m_retryCount is over 1 then pull the stream relay url from - // the config details as we could be in a re-try or having done - // a config reload and the stream relay url has then since changed - // - this primarily aids a config change for a pending relay join - if (m_retryCount > 0) - { - m_backupInfo.m_backupUrl = gOptions.stream_backupURL (m_backupInfo.m_streamID); - m_backupInfo.m_relayUrl = gOptions.stream_relayURL (m_backupInfo.m_streamID); - } - - m_srcAddrName = m_backupInfo.m_backupUrl.server(); - m_srcPort = m_backupInfo.m_backupUrl.port(); - m_srcURLpart = m_backupInfo.m_backupUrl.path(); - - m_srcLogString = "[BACKUP " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_backupInfo.m_streamID) + "] "; - - // make sure we're not trying to run a backup which is the same relay as failed - if (m_backupInfo.m_relayUrl.isSet()) - { - // check on individual parts as the general url may not be formatted the same - // as well as checking against the 'streampath' version is specified for the - // /stream/x/ alternative (am sure someone is going to try to hack on that). - if (!m_tryRelaySource && - (m_backupInfo.m_relayUrl.server() == m_srcAddrName) && - (m_backupInfo.m_relayUrl.port() == m_srcPort) && - (m_backupInfo.m_relayUrl.path() == m_srcURLpart)) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ELOG(m_srcLogString + "Backup source rejected. The backup cannot be the same as the original relay source.", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - else - { - if ((m_backupInfo.m_relayUrl.server() == m_srcAddrName) && - (m_backupInfo.m_relayUrl.port() == m_srcPort)) - { - utf8::size_type pos = (!m_srcURLpart.empty() ? m_srcURLpart.find(utf8("/stream/")) : utf8::npos); - streamData::streamID_t streamID = 0; - if (pos != utf8::npos) - { - streamID = atoi((const char *)m_srcURLpart.substr(pos + 8).c_str()); - } - - if (streamID > 0) - { - bool htmlPage = false; - if (!m_tryRelaySource && streamData::getStreamIdFromPath(m_backupInfo.m_relayUrl.path(), htmlPage) == streamID) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ELOG(m_srcLogString + "Backup source rejected. The backup cannot be the same as the original relay source.", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - } - } - } - } - - m_state = &protocol_backup::state_ResolveServer; - m_result.run(); -} - -// resolve server name to numeric address -void protocol_backup::state_ResolveServer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket == socketOps::cINVALID_SOCKET); - m_socket = socketOps::createTCPSocketTHROW(); - socketOps::setNonblock(m_socket,true); - m_srcAddrNumeric = socketOps::hostNameToAddress(m_srcAddrName.hideAsString(), m_srcPort); - if (m_srcAddrNumeric.empty()) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - m_result.done(); - return; - } - - m_state = &protocol_backup::state_Connect; - m_result.run(); -} - -// TCP connect -void protocol_backup::state_Connect() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - bool isSourceActive = false, relayRunning = false; - streamData *sd = streamData::accessStream(m_backupInfo.m_streamID, isSourceActive); - if (sd) - { - relayRunning = sd->isRelayStream(m_backupInfo.m_streamID); - sd->releaseStream(); - } - - if ((isSourceActive == false) || relayRunning) - { - if ((m_retryCount > 0) && !m_skip) - { - ILOG(m_srcLogString + "Connecting to source backup [attempt #" + tos(m_retryCount+1) + "]", LOGNAME, m_originalbackupInfo.m_streamID); - } - - m_skip = false; - socketOps::connect(m_socket, m_srcAddrNumeric, m_srcPort); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_ConnectWait; - m_result.run(); - } - else - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - m_result.done(); - } -} - -// wait for connect to complete -void protocol_backup::state_ConnectWait() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - time_t cur_time; - const int autoDumpSourceTime = detectAutoDumpTimeout (cur_time, m_originalbackupInfo.m_streamID, m_srcLogString + "Timeout trying to connect"); - - if (streamData::isSourceConnected (m_backupInfo.m_streamID)) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ILOG (m_srcLogString + "Original stream available, Abort trying to " + - (m_retryCount > 0 ? "re-" : "") + - "connect to the source backup", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - - // not pretty but the 'sent' checks allow this to work within the expected timeouts - // irrespective of being run on Windows or Linux as it could just sit and do nothing - // for a few minutes if there was no network activity on the DNAS causing there to be - // no attempt made to re-connect to the backup source (hopefully resolved in build 56) - string error; - socketOps::nonBlockConnect_t connectResult = socketOps::nonBlockingConnectWait(m_socket, error); - switch (connectResult) - { - case socketOps::NBC_ERROR: - { - throwEx(m_srcLogString + error); - break; - } - case socketOps::NBC_INPROGRESS: - { - // try again but wait a bit - m_result.schedule(100); - m_result.timeout((autoDumpSourceTime - (int)(cur_time - m_lastActivityTime))); - break; - } - case socketOps::NBC_CONNECTED: - { - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_SendGreeting; - m_result.run(); - break; - } - default: - { - ELOG(m_srcLogString + "Unknown non-blocking connect state.", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - } -} - -void protocol_backup::state_SendGreeting() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_HTTPHeaders.clear(); - m_HTTPGreetingResponse.clear(); - - string cdn; - if (isCDNSlave(m_backupInfo.m_streamID)) - { - cdn = "cdn-slave:1\r\n"; - } - - m_lineBuffer = "GET " + m_srcURLpart + " " + "HTTP/1.1\r\n" + - "Host:" + stripHTTPprefix(m_srcAddrName) + ":" + tos(m_srcPort) + "\r\n" + - "User-Agent:" + g_userAgent + " Relay" + - (!m_tryRelaySource ? " Backup" : "") + "\r\n" + - "Ultravox transport type:TCP\r\n" + - "Accept:*/*\r\n" + - "icy-metadata:1\r\n" + - cdn + - "icy-host:" + metrics::metrics_verifyDestIP(gOptions) + "\r\n\r\n"; - - DEBUG_LOG(m_srcLogString + "Sending request [" + eol() + stripWhitespace(m_lineBuffer) + eol() + "]", LOGNAME, m_originalbackupInfo.m_streamID); - m_outBuffer = &(m_lineBuffer[0]); - bandWidth::updateAmount(bandWidth::RELAY_MISC_RECV, (m_outBufferSize = (int)m_lineBuffer.size())); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_Send; - m_nextState = &protocol_backup::state_GetGreetingResponse; - - m_result.write(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); -} - -// send whatever is in outBuffer -void protocol_backup::state_Send() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (sendDataBuffer(m_backupInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - m_lineBuffer.clear(); - } -} - -void protocol_backup::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (getHTTPStyleHeaderLine(m_backupInfo.m_streamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_backup::state_GetGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_state = &protocol_backup::state_GetLine; - m_nextState = &protocol_backup::state_AnalyzeGreetingResponse; - - m_lastActivityTime = ::time(NULL); - m_result.read(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); -} - -// analyze header lines in greeting response -void protocol_backup::state_AnalyzeGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_lastActivityTime = ::time(NULL); - - if ((int)m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - ELOG (m_srcLogString + "Max HTTP header lines exceeded", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - m_state = &protocol_backup::state_DetermineProtocol; - m_result.run(); - } - else - { - if (m_HTTPGreetingResponse.empty()) - { - m_HTTPGreetingResponse = m_lineBuffer; - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - utf8 value = stripWhitespace(m_lineBuffer.substr(pos + 1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - ELOG (m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - m_HTTPHeaders[key] = value; - } - - m_state = &protocol_backup::state_GetLine; - m_nextState = &protocol_backup::state_AnalyzeGreetingResponse; - m_result.read(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); - m_lineBuffer.clear(); - } -} - -void protocol_backup::state_DetermineProtocol() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (m_HTTPGreetingResponse.empty()) - { - ELOG (m_srcLogString + "Empty greeting response", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - // parse into three fields - utf8 s = m_HTTPGreetingResponse; - - utf8::size_type pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - s = stripWhitespace(s.substr(pos)); - pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - int resultCode = utf8(s.substr(0, pos)).toInt(); - if (resultCode == 200) - { - utf8 diag; - for (httpHeaderMap_t::const_iterator i = m_HTTPHeaders.begin(); i != m_HTTPHeaders.end(); ++i) - { - diag += (*i).first + ": " + (*i).second + eol(); - } - DEBUG_LOG(m_srcLogString + "Received headers [" + eol() + stripWhitespace(diag) + eol() + "]", LOGNAME, m_originalbackupInfo.m_streamID); - - const socketOps::tSOCKET s = m_socket; - m_socket = socketOps::cINVALID_SOCKET; - - // changed order of this in build 19 so that all uvox2 is reported as misc/ultravox - // and we then base things off the user-agent containing 'Ultravox/2.1' - // we look at content-type to determine the protocol - if ((m_HTTPHeaders["content-type"] == "misc/ultravox") && - (m_HTTPHeaders["server"].find(utf8("Ultravox/2.1")) != utf8::npos)) - { - // uvox 2.1 - threadedRunner::scheduleRunnable(new protocol_relay_uvox(s, m_originalbackupInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), - m_HTTPHeaders, m_originalBitrate, m_originalMimeType, - !m_tryRelaySource)); - } - else - { - // shoutcast - threadedRunner::scheduleRunnable(new protocol_relay_shoutcast(s, m_originalbackupInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), - m_HTTPHeaders, m_originalBitrate, m_originalMimeType, - !m_tryRelaySource)); - } - - m_result.done(); - } - else if ((resultCode >= 300) && (resultCode < 400)) - { - utf8 location = m_HTTPHeaders["location"]; - - // do we maybe have a /stream/x url and gotten a /index.html?sid=# redirect? - // if so then we should attempt to access a relay on /stream/x/ (note end / ) - utf8::size_type pos = (!location.empty() ? location.find(utf8("/index.html?sid=")) : utf8::npos); - if (pos != utf8::npos) - { - streamData::streamID_t foundID = atoi((const char *)location.substr(pos + 16).c_str()); - utf8::size_type pos2 = m_backupInfo.m_backupUrl.path().find(utf8("/stream/")); - if (pos2 != utf8::npos) - { - streamData::streamID_t origID = atoi((const char *)m_backupInfo.m_backupUrl.path().substr(pos2 + 8).c_str()); - if (foundID == origID) - { - m_backupInfo.m_backupUrl = m_backupInfo.m_backupUrl.url() + "/"; - gOptions.setOption(utf8("streambackupurl_" + tos(m_originalbackupInfo.m_streamID)), - m_backupInfo.m_backupUrl.url()); - - m_skip = true; - m_state = &protocol_backup::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - WLOG(m_srcLogString + "Received an invalid redirect to `" + location + "' - trying " + m_backupInfo.m_backupUrl.url(), LOGNAME, m_originalbackupInfo.m_streamID); - return; - } - } - } - - ILOG(m_srcLogString + "Received redirect to " + location, LOGNAME, m_originalbackupInfo.m_streamID); - if (++m_redirectCount > gOptions.maxHTTPRedirects()) - { - WLOG (m_srcLogString + "Max redirects exceeded", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } - - m_skip = true; - m_backupInfo.m_backupUrl = location; - m_state = &protocol_backup::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - } - else - { - WLOG (m_srcLogString + (resultCode >= 400 ? "Source responded with error [" : "Unsupported HTTP response code [") + - m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx(""); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_backup.h b/Src/Plugins/DSP/sc_serv3/protocol_backup.h deleted file mode 100644 index 5f83bf18..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_backup.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#ifndef protocol_backup_H_ -#define protocol_backup_H_ - -#include "threadedRunner.h" - -/* - Runnable object that handles the initial part of a backup connection - which is basically the same as a relay connection bar a different name. - Makes the connection to the source and determines what type of protocol - should be used, then hands off to the particular relay protocol - (shoutcast or uvox relay) -*/ - -class protocol_backup: public runnable -{ -private: - uniString::utf8 m_srcAddrName; // server DNS name or value as specified in backupInfo - std::string m_srcAddrNumeric; // resolved numeric addr - uniString::utf8 m_srcURLpart; // server - - uniString::utf8 m_originalMimeType; // original mimetype for checking - - uniString::utf8 m_srcLogString; - httpHeaderMap_t m_HTTPHeaders; - uniString::utf8 m_HTTPGreetingResponse; // first line of response - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - const int m_originalBitrate; // original bitrate for checking - - uniString::utf8 m_lineBuffer; // in/out lines - - int m_retryCount; - bool m_backupWaitingToReconnect; - bool m_backupSentConnectWait; - bool m_skip; - bool m_tryRelaySource; - - time_t m_backupReconnectStartTime; - - typedef void (protocol_backup::*state_t)(); - - state_t m_state; - state_t m_nextState; - - config::streamConfig m_backupInfo; - const config::streamConfig m_originalbackupInfo; // used for reconnects later on - - u_short m_srcPort; // server port - short m_redirectCount; - - void state_Initial() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_SendGreeting() throw(std::exception); - void state_GetGreetingResponse() throw(std::exception); - void state_AnalyzeGreetingResponse() throw(std::exception); - void state_DetermineProtocol() throw(std::exception); - void state_Send() throw(std::exception); - void state_GetLine() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_backup"; } - -public: - protocol_backup(const config::streamConfig &info, const int originalBitrate, const uniString::utf8& originalMimeType) throw(); - virtual ~protocol_backup() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp deleted file mode 100644 index 205621e9..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_flvClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "FLV.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.flvClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_flvClient::protocol_flvClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw (std::exception) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::FLV) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - m_timestamp = 0; - m_fileOffset = 0; - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - -protocol_flvClient::~protocol_flvClient() throw() -{ - cleanup("FLV", gOptions.flvClientDebug(), false, true); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_flvClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_flvClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_flvClient::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_flvClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_flvClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_flvClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("FLV", bandWidth::CLIENT_FLV_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - - // for FLV, we can only support specific sample rates before we - // have playback / compatibility issues vs what the spec wants. - if (m_streamData) - { - const unsigned int samplerate = m_streamData->streamSampleRate(); - if ((m_streamData->streamUvoxDataType() == MP3_DATA) && - ((samplerate != 44100) && (samplerate != 22050) && (samplerate != 11025))) - { - m_outBuffer = MSG_ICY_HTTP401.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_FLV_SENT, (m_outBufferSize = MSG_ICY_HTTP401_LEN)); - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - ELOG(m_clientLogString + "FLV client connection rejected. Stream samplerate is " + - sampleRateStr(samplerate) + " which is not supported for MP3-in-FLV streaming " + - "(only 44.1 kHz, 22.05 kHz and 11.025 kHz samplerates are allowed)."); - } - - return; - } - } - - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("FLV", bandWidth::CLIENT_FLV_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200 + "Content-Type:video/x-flv\r\n"; - - if (!m_streamData) - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - if (isPodcast) - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_FLV_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("FLV"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("FLV", bandWidth::CLIENT_FLV_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_flvClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_flvClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - - -void protocol_flvClient::processFrame (int type, const unsigned char *buf, unsigned int len) -{ - bool is_mp3 = (type == MP3_DATA); - unsigned int read_samplerate = 0; - int read_bitrate = 0; - bool read_mono = true; - __uint8 asc_header[2] = {0}; - - if (len < 7) - return; - if (is_mp3) - getMP3FrameInfo ((char*)buf, &read_samplerate, &read_bitrate, &read_mono); - else - getADTSFrameInfo ((char*)buf, &read_samplerate, asc_header); - - createFLVTag (m_output, (char*)&buf [is_mp3 ? 0 : 7], len - (is_mp3 ? 0 : 7), - m_timestamp, is_mp3, read_mono, read_samplerate, read_bitrate, asc_header, m_streamID); -} - - - -void protocol_flvClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h b/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h deleted file mode 100644 index 11105bf7..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#ifndef protocol_flvClient_H_ -#define protocol_flvClient_H_ - -#include "protocol_shoutcastClient.h" -#include - -class streamData; - -class protocol_flvClient: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_flvClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - int m_timestamp; - int m_fileOffset; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_flvClient"; } - -public: - protocol_flvClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - protocol_flvClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &userAgent, - const uniString::utf8 &XFF, const uniString::utf8 &referer, - const bool headRequest) throw(std::exception); - virtual ~protocol_flvClient() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - void processFrame (int type, const unsigned char *buf, unsigned int len); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp deleted file mode 100644 index 11dad38c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp +++ /dev/null @@ -1,674 +0,0 @@ -#if 0 -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_m4aClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(x) { if (gOptions.m4aClientDebug()) DLOG((x)); } -#define AD_DEBUG_LOG(x) { if (gOptions.adMetricsDebug()) DLOG((x)); } - -protocol_m4aClient::protocol_m4aClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const utf8 &hostName, const utf8 &addr, const u_short port, - const utf8 &userAgent, const utf8 &XFF, const utf8 &referer, - const bool headRequest) throw(exception) - : protocol_shoutcastClient(s, port, streamData::M4A, hostName, - (streamID <= 0 || streamID > INT_MAX ? DEFAULT_CLIENT_STREAM_ID : streamID), - stats::getNewClientId(), userAgent, referer, addr, XFF, headRequest), - - m_state(&protocol_m4aClient::state_AttachToStream), m_nextState(0) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); -} - -protocol_m4aClient::~protocol_m4aClient() throw() -{ - cleanup("M4A", gOptions.m4aClientDebug()); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_m4aClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(result); - if (ret == 1) - { - m_state = &protocol_m4aClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - -void protocol_m4aClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_m4aClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_m4aClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("M4A", bandWidth::CLIENT_M4A_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("FLV", bandWidth::CLIENT_M4A_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200 + "Content-Type:audio/mp4\r\n"; - - if (!m_streamData) - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - if (isPodcast) - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_m4aClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_m4aClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_m4aClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("M4A"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("M4A", bandWidth::CLIENT_M4A_SENT, movedUrl, 2); - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - } -} - -void protocol_m4aClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_m4aClient::state_Stream; - } - else - { - m_state = &protocol_m4aClient::state_SendIntroFile; - } - } -} - -void protocol_m4aClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || (m_streamData && m_introFile.empty())) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_m4aClient::state_Stream : &protocol_m4aClient::state_SendIntroFile); - } - else - { - m_state = &protocol_m4aClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - -// handle state where we are sending intro files -void protocol_m4aClient::state_SendIntroFile() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetCommon(); - - time_t cur_time; - const bool debug = gOptions.m4aClientDebug(); - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - int amt = (int)(m_introFile.size() - m_introFileOffset); - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_introFile.resize(0); - m_introFileOffset = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - resetReadPtr(); - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - doM4AFrameSync(m_streamData->streamUvoxDataType(), debug, m_introFileOffset, - (const char*)&m_introFile[0], cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_introFileOffset += len; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } -} - -// handle state where we are sending backup files -void protocol_m4aClient::state_SendBackupFile() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetCommon(); - - int amt = (int)(m_backupFile.size() - m_backupFileOffset); - - if (streamData::isSourceConnected(m_streamID)) - { - if (m_streamData) - { - m_streamData->releaseStream(); - } - m_streamData = streamData::accessStream(m_streamID); - - // we're done with the backup file - m_backupFile.clear(); - m_backupFile.resize(0); - m_backupFileOffset = 0; - m_backupLoopTries = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - resetReadPtr(); - m_result.run(); - } - else if (amt == 0) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile(); - if (!m_backupFile.empty()) - { - ++m_backupLoopTries; - resetReadPtr(); - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - else - { - resetReadPtr(); - m_backupFileOffset = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - } - - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, backup_type = MP3_DATA, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if (!m_streamData) - { - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - if (!backupFile.empty()) - { - backup_type = ((backupFile.rfind((utf8)".aac") == utf8::npos) ? MP3_DATA : AACP_DATA); - } - } - - bool advert = false; - doM4AFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : backup_type), - debug, m_backupFileOffset, (const char*)&m_backupFile[0], cur_time, - (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_backupFileOffset += len; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } -} - -// handle state where we are sending advert content -void protocol_m4aClient::state_SendAdverts() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - streamData::specialFileData *ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - int amt = (ad ? (int)(ad->m_sc1Buffer.size() - m_adAccess.offset) : 0); - - while (true) - { - // DLOG ("amount remaining to be sent " + tos(amt)); - if (amt > 0) - { - break; - } - if (m_adAccess.anotherAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest)) - { - ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - amt = (ad ? (int)(ad->m_sc1Buffer.size() - m_adAccess.offset) : 0); - continue; - } - // no more adverts - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - m_adAccess.stopAdRun(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - // go to the latest point in the ring buffer. - resetReadPtr(); - m_result.run(); - m_result.timeoutSID(m_streamID); - - ILOG(m_clientLogString + "Transitioning back to stream [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(m_group) + "]"); - return; - } - - try - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - doM4AFrameSync(m_streamData->streamUvoxDataType(), (int)m_adAccess.offset, - debug, (const char*)&ad->m_sc1Buffer[0], cur_time, - m_streamData->streamBitrate(), m_streamData->streamSampleRate(), - len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_adAccess.offset += len; - - m_nextState = &protocol_m4aClient::state_SendText; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } - catch (std::runtime_error) - { - m_adAccess.stopAdRun(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - throw; - } -} - -void protocol_m4aClient::state_Stream() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - const time_t cur_time = ::time(NULL); - const bool debug = gOptions.m4aClientDebug(); - const int autoDumpTime = gOptions.getAutoDumpTime(m_streamID); // don't want this value to change during this call - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - throwEx((!m_ignoreDisconnect && debug ? - (m_clientLogString + "Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + - tos(cur_time - m_lastActivityTime) + "] )") : (utf8)"")); - } - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - const streamData::ringBuffer_t rb = (m_streamData ? m_streamData->getSc1RingBuffer() : streamData::ringBuffer_t()); - streamData::ringBufferAccess_t amt = (m_streamData ? (rb.m_writePtr - m_readPtr) : 0); - if ((amt > 0) && (amt > rb.m_data.size())) - { - // the pointers are too far apart. Underrun - resetReadPtr(&amt); - } - - std::vector<__uint8>& rem = getRemainder(); - const streamData::ringBufferAccess_t offset = (m_readPtr & rb.m_ptrMask); - // clamp again so we don't read pass the end of the buffer - // - // if we've got more in remainder than what we're wanting - // to send then we'll prioritise the remainder data first - // before trying to acquire more new data to try to send. - amt = min(amt, min((rb.m_data.size() - offset), (streamData::ringBufferAccess_t)max(0, (SEND_SIZE - rem.size())))); - - bool advert = false; - int remainder = 0, len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if ((len > 0) || !rem.empty() || !m_shortSend.empty()) - { - const std::vector<__uint8>::const_iterator pos = rb.m_data.begin(); - std::vector<__uint8>& tempBuf; - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if (!rem.empty() && ((len + rem.size()) <= (BUF_SIZE * 4))) - { - tempBuf.insert(tempBuf.end(), rem.begin(), rem.end()); - tempBuf.insert(tempBuf.end(), pos + offset, pos + (offset + len)); - len += m_remainderSize; - } - else if (len > 0) - { - tempBuf.insert(tempBuf.end(), pos + offset, pos + (offset + len)); - } - rem.clear(); - - remainder = doM4AFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA), - debug, 0, cur_time, (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), - len, frames, advert, true); - } - - // if no data then we need to just go to adverts - // otherwise we need to see what we've got and - // if we can, then transition to adverts or spin - // and wait for the current data to be sent and - // then we should be able to re-process into ads - if (m_output.empty()) - { - // this will close the stream or go to backups as needed - if (handleNoData("M4A", remainder, amt, autoDumpTime, cur_time)) - { - m_state = &protocol_m4aClient::state_SendBackupFile; - } - else - { - if (processAdvertTrigger(advert)) - { - m_state = &protocol_m4aClient::state_SendAdverts; - return; - } - - // at this point, we're in a bit of a weird state - // as we've not been able to generate / retrieve - // anything and if we don't slwo down things then - // we need to delay things to allow it to catchup - if (m_frameCount > calculateFrameLimit(cur_time)) - { - // determine things based on the 'next' second when working out - // the differential as that's how long we want to wait to run - m_result.schedule((int)((__uint64)((cur_time + 1) * 1000) - m_result.m_currentTime)); - } - else - { - // just go with an arbitrary value as we cannot - // be certain when we're going to get data next - // and we don't know the impact on playback etc - m_result.schedule(100); - } - - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.write(); - } - } - else - { - processTitleW3C(); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - - if (processAdvertTrigger(advert)) - { - m_state = &protocol_m4aClient::state_SendAdverts; - remainder = 0; - } - } - - // as we're keeping a copy of the remainder / non-sent data - // we need to move the readptr on so that it doesn't cause - // the stream to effectively stick on the same point and in - // turn then lead to resetReadPtr() being called (skipping) - m_readPtr += amt; - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - - // we only keep the remainder if - // there's no advert to provide - m_remainderSize = remainder; - } -} - -void protocol_m4aClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h b/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h deleted file mode 100644 index 8455754f..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#if 0 -#ifndef protocol_m4aClient_H_ -#define protocol_m4aClient_H_ - -#include "protocol_shoutcastClient.h" -#include - -class streamData; - -class protocol_m4aClient: public protocol_shoutcastClient -{ -private: - typedef void (protocol_m4aClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_Stream() throw(std::exception); - void state_SendIntroFile() throw(std::exception); - void state_SendIntro() throw(std::exception); - void state_SendBackupFile() throw(std::exception); - void state_SendAdverts() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_m4aClient"; } - -public: - protocol_m4aClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &userAgent, - const uniString::utf8 &XFF, const uniString::utf8 &referer) throw(std::exception); - virtual ~protocol_m4aClient() throw(); - - void return_403(void); -}; - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp deleted file mode 100644 index 6db504ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp +++ /dev/null @@ -1,544 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_relay.h" -#include "protocol_backup.h" -#include "protocol_relay_shoutcast.h" -#include "protocol_relay_uvox.h" -#include "bandwidth.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -// g_streamSourceRelayIsActive -// This is a map of sid to int, where the int is a bitmap of flags, the bits being -// 0 - registered, some runnable is working with this. -// 1 - shutdown of relay requested. -// 2 - primary relay in use -// 3 - backup runnable started - -#define LOGNAME "RELAY" -#define DEBUG_LOG(...) do { if (gOptions.relayDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_relay::protocol_relay(const config::streamConfig &info, const bool retry) throw() - : m_redirectCount(0), m_outBuffer(0), m_outBufferSize(0), m_relayWaitingToReconnect(false), - m_relaySentConnectWait(false), m_retryRelay(retry), m_skip(false), - m_backupStarted(false), m_registered(false), m_relayInfo(info), - m_originalRelayInfo(info), m_retryCount(0), m_relayReconnectStartTime(::time(NULL)), - m_state(&protocol_relay::state_Initial), m_nextState(0) -{ - streamData::setRelayActive (info.m_streamID, -1); // make sure entry exists - - m_srcPort = m_relayInfo.m_relayUrl.port(); - m_srcAddrName = m_relayInfo.m_relayUrl.server(); - m_srcURLpart = m_relayInfo.m_relayUrl.path(); - m_srcLogString = "[RELAY " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_relayInfo.m_streamID) + "] "; - - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); -} - -protocol_relay::~protocol_relay() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - socketOps::forgetTCPSocket(m_socket); - if (m_registered) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 0, 7); - } -} - -void protocol_relay::timeSlice() throw(exception) -{ - if (iskilled()) - { - m_result.done(); - return; - } - - // normal running - try - { - if (m_registered && m_relayWaitingToReconnect && (::time(NULL) < m_relayReconnectStartTime)) - { - // an error occured in the past and we are waiting for the appropriate time interval before we do anything - bool noEntry = false; - int status = streamData::isRelayActive(m_originalRelayInfo.m_streamID, noEntry); - if ((status & 2) == 0) // if no shutdown req - { - m_result.schedule(400); - return; - } - DEBUG_LOG (m_srcLogString + "relay shutdown req", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - (this->*m_state)(); - } - catch(const exception &ex) - { - // close socket and move into waiting state for reconnect - socketOps::forgetTCPSocket(m_socket); - - // but first see if we've hit the retry limit (which can be set as zero to keep on going) - ++m_retryCount; - int retryLimit = gOptions.relayConnectRetries(); - bool noEntry = false; - - DEBUG_LOG(m_srcLogString + __FUNCTION__ + utf8(" m_retryCount:") + tos(m_retryCount) + " retryLimit:" + tos(retryLimit), LOGNAME, m_originalRelayInfo.m_streamID); - int status = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 0, 4); - -#if defined(_DEBUG) || defined(DEBUG) - bool relayActive = status & 4 ? true : false; - - DLOG(m_srcLogString + __FUNCTION__ + " a: " + tos(retryLimit) + - " " + tos(m_retryCount) + " "+tos(relayActive) + " " + - tos(m_retryCount < retryLimit && retryLimit > 0) + " " + - tos(((m_retryCount < retryLimit && retryLimit > 0)) && relayActive),LOGNAME, m_originalRelayInfo.m_streamID); -#endif - - if (noEntry == false && (status & 2) == 0) // is relay still configured - { - if ((status & 8) == 0) - startBackupConnection (""); // kick backup off if present, in case of repeated failure - - utf8 msg = ex.what(); - if (!msg.empty()) - { - ELOG (ex.what(), LOGNAME, m_originalRelayInfo.m_streamID); - } - - if (retryLimit == 0 || (m_retryCount < retryLimit && retryLimit > 0)) - { - - m_relayWaitingToReconnect = true; - m_state = &protocol_relay::state_Initial; - m_relayInfo = m_originalRelayInfo; - m_relayReconnectStartTime = ::time(NULL) + gOptions.relayReconnectTime(); - m_result.schedule (550); - DLOG (m_srcLogString + "reconnect time " + tos ((long)m_relayReconnectStartTime), LOGNAME, m_originalRelayInfo.m_streamID); - return; - } - } - else - { - utf8 ss = m_srcLogString + "Abort trying to "; - if (m_retryCount > 0) - ss += "re"; - ss += "connect to the source relay"; - ILOG (ss, LOGNAME, m_originalRelayInfo.m_streamID); - } - m_result.done(); - } -} - -// parse out relayInfo object -void protocol_relay::state_Initial() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_relayInfo.m_streamID); - if (!movedUrl.empty()) - { - ELOG (m_srcLogString + "Relay connection aborted. Stream is configured as having moved.", LOGNAME, m_originalRelayInfo.m_streamID); - m_result.done(); - return; - } - - bool noEntry = false; - if (m_registered == false) - { - int state = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 1); - if (state < 0) - { - ILOG (m_srcLogString + "waiting on other relay termination", LOGNAME, m_originalRelayInfo.m_streamID); - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 2); // request shutdown of other relay - m_result.schedule (100); - return; - } - m_registered = true; - } - int state = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 4); - - if (noEntry || (state & 2) == 2) - { - ILOG (m_srcLogString + "relay shutting down", LOGNAME, m_originalRelayInfo.m_streamID); - m_result.done(); - return; - } - - // if m_retryCount is over 1 then pull the stream relay url from - // the config details as we could be in a re-try or having done - // a config reload and the stream relay url has then sinc changed - // - this primarily aids a config change for a pending relay join - if (m_retryCount > 0) - { - m_relayInfo.m_relayUrl = gOptions.stream_relayURL(m_originalRelayInfo.m_streamID); - } - m_relayWaitingToReconnect = false; - m_srcAddrName = m_relayInfo.m_relayUrl.server(); - m_srcPort = m_relayInfo.m_relayUrl.port(); - m_srcURLpart = m_relayInfo.m_relayUrl.path(); - - m_srcLogString = "[RELAY " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_relayInfo.m_streamID) + "] "; - - m_state = &protocol_relay::state_ResolveServer; - m_result.run(); -} - - -// resolve server name to numeric address -void protocol_relay::state_ResolveServer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket == socketOps::cINVALID_SOCKET); - m_socket = socketOps::createTCPSocketTHROW(); - socketOps::setNonblock(m_socket, true); - m_srcAddrNumeric = socketOps::hostNameToAddress(m_srcAddrName.hideAsString(), m_srcPort); - if (m_srcAddrNumeric.empty()) - { - ELOG (m_srcLogString + "Could not resolve host address", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - - m_state = &protocol_relay::state_Connect; - m_result.run(); -} - -// TCP connect -void protocol_relay::state_Connect() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - if (!m_skip) - { - utf8 ss = m_srcLogString; - if (m_retryCount > 0) - { - ss += "Trying to restore connection to source relay [attempt #"; - ss += tos(m_retryCount+1) + "]"; - } - else - ss += "Connecting to source relay"; - ILOG (ss, LOGNAME, m_originalRelayInfo.m_streamID); - } - - m_skip = false; - socketOps::connectTHROW (m_socket, m_srcAddrNumeric, m_srcPort); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_ConnectWait; - m_result.run(); -} - -// wait for connect to complete -void protocol_relay::state_ConnectWait() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - time_t cur_time; - const int autoDumpSourceTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout trying to connect")); - - bool noEntry = false, relayActive = ((streamData::isRelayActive(m_originalRelayInfo.m_streamID, noEntry) & 6) == 4); - if (!relayActive && !noEntry) - { - throwEx(""); - } - - string error; - socketOps::nonBlockConnect_t connectResult = socketOps::nonBlockingConnectWait(m_socket, error); - switch (connectResult) - { - case socketOps::NBC_ERROR: - { - ELOG (m_srcLogString + error, LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - break; - } - case socketOps::NBC_INPROGRESS: - { - // try again but wait a bit - m_result.schedule(100); - m_result.timeout((autoDumpSourceTime - (int)(cur_time - m_lastActivityTime))); - break; - } - case socketOps::NBC_CONNECTED: - { - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_SendGreeting; - m_result.run(); - break; - } - default: - { - ELOG (m_srcLogString + "Unknown non-blocking connect state.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - } -} - -void protocol_relay::state_SendGreeting() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_HTTPHeaders.clear(); - m_HTTPGreetingResponse.clear(); - - string cdn; - if (isCDNSlave(m_relayInfo.m_streamID)) - { - cdn = "cdn-slave:1\r\n"; - } - - m_lineBuffer = "GET " + m_srcURLpart + " " + "HTTP/1.1\r\n" + - "Host:" + stripHTTPprefix(m_srcAddrName) + ":" + tos(m_srcPort) + "\r\n" + - "User-Agent:" + g_userAgent + " Relay\r\n" + - "Ultravox transport type:TCP\r\n" + - "Accept:*/*\r\n" + - "icy-metadata:1\r\n" + - cdn + - "icy-host:" + metrics::metrics_verifyDestIP(gOptions) + "\r\n\r\n"; - - DEBUG_LOG(m_srcLogString + "Sending request [" + eol() + stripWhitespace(m_lineBuffer) + eol() + "]", LOGNAME, m_originalRelayInfo.m_streamID); - m_outBuffer = &(m_lineBuffer[0]); - bandWidth::updateAmount(bandWidth::RELAY_MISC_RECV, (m_outBufferSize = (int)m_lineBuffer.size())); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_Send; - m_nextState = &protocol_relay::state_GetGreetingResponse; - - m_result.write(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); -} - -// send whatever is in outBuffer -void protocol_relay::state_Send() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (sendDataBuffer(m_relayInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - m_lineBuffer.clear(); - } -} - -void protocol_relay::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (getHTTPStyleHeaderLine(m_relayInfo.m_streamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_relay::state_GetGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_state = &protocol_relay::state_GetLine; - m_nextState = &protocol_relay::state_AnalyzeGreetingResponse; - - m_lastActivityTime = ::time(NULL); - m_result.read(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); -} - -// analyze header lines in greeting response -void protocol_relay::state_AnalyzeGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_lastActivityTime = ::time(NULL); - - if ((int)m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - throwEx(m_srcLogString + "Max HTTP header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - m_state = &protocol_relay::state_DetermineProtocol; - m_result.run(); - } - else - { - if (m_HTTPGreetingResponse.empty()) - { - m_HTTPGreetingResponse = m_lineBuffer; - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - if (pos == utf8::npos) - { - throwEx(m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - } - - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - utf8 value = stripWhitespace(m_lineBuffer.substr(pos + 1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - throwEx(m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - } - m_HTTPHeaders[key] = value; - } - - m_state = &protocol_relay::state_GetLine; - m_nextState = &protocol_relay::state_AnalyzeGreetingResponse; - m_result.read(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); - m_lineBuffer.clear(); - } -} - -void protocol_relay::state_DetermineProtocol() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (m_HTTPGreetingResponse.empty()) - { - throwEx(m_srcLogString + "Empty greeting response"); - } - - // parse into three fields - utf8 s = m_HTTPGreetingResponse; - - utf8::size_type pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - - s = stripWhitespace(s.substr(pos)); - pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - - int resultCode = utf8(s.substr(0, pos)).toInt(); - if (resultCode == 200) - { - utf8 diag; - for (httpHeaderMap_t::const_iterator i = m_HTTPHeaders.begin(); i != m_HTTPHeaders.end(); ++i) - { - diag += (*i).first + ": " + (*i).second + eol(); - } - DEBUG_LOG(m_srcLogString + "Received headers [" + eol() + stripWhitespace(diag) + eol() + "]", LOGNAME, m_originalRelayInfo.m_streamID); - - const socketOps::tSOCKET s = m_socket; - - m_result.done(); - - // changed order of this in build 19 so that all uvox2 is reported as misc/ultravox - // and we then base things off the user-agent containing 'Ultravox/2.1' - // we look at content-type to determine the protocol - if ((m_HTTPHeaders["content-type"] == "misc/ultravox") && - (m_HTTPHeaders["server"].find(utf8("Ultravox/2.1")) != utf8::npos)) - { - // uvox 2.1 - threadedRunner::scheduleRunnable(new protocol_relay_uvox(s, m_originalRelayInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), m_HTTPHeaders)); - } - else - { - // shoutcast - threadedRunner::scheduleRunnable(new protocol_relay_shoutcast(s, m_originalRelayInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), m_HTTPHeaders)); - } - m_socket = socketOps::cINVALID_SOCKET; - m_backupStarted = false; // any backup client should terminate automatically - } - else if ((resultCode >= 300) && (resultCode < 400)) - { - utf8 location = m_HTTPHeaders["location"]; - - // do we maybe have a /stream/x url and gotten a /index.html?sid=# redirect? - // if so then we should attempt to access a relay on /stream/x/ (note end / ) - utf8::size_type pos = (!location.empty() ? location.find(utf8("/index.html?sid=")) : utf8::npos); - if (pos != utf8::npos) - { - streamData::streamID_t foundID = atoi((const char *)location.substr(pos + 16).c_str()); - utf8::size_type pos2 = m_relayInfo.m_relayUrl.path().find(utf8("/stream/")); - if (pos2 != utf8::npos) - { - streamData::streamID_t origID = atoi((const char *)m_relayInfo.m_relayUrl.path().substr(pos2 + 8).c_str()); - if (foundID == origID) - { - m_relayInfo.m_relayUrl = m_relayInfo.m_relayUrl.url() + "/"; - gOptions.setOption(utf8("streamrelayurl_"+tos(m_originalRelayInfo.m_streamID)), - m_relayInfo.m_relayUrl.url()); - - m_skip = true; - m_state = &protocol_relay::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - WLOG(m_srcLogString + "Received an invalid redirect to `" + location + "' - trying " + m_relayInfo.m_relayUrl.url(), LOGNAME, m_originalRelayInfo.m_streamID); - return; - } - } - } - - WLOG(m_srcLogString + "Received redirect to " + location, LOGNAME, m_originalRelayInfo.m_streamID); - if (++m_redirectCount > gOptions.maxHTTPRedirects()) - { - ELOG ("Max redirects exceeded", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx(""); - } - - m_skip = true; - m_relayInfo.m_relayUrl = location; - m_state = &protocol_relay::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - } - else - { - ELOG ((resultCode >= 400 ? "Source responded with error [" : "Unsupported HTTP response code [") + m_HTTPGreetingResponse + "]"); - throwEx(""); - } -} - -#ifdef INCLUDE_BACKUP_STREAMS -void protocol_relay::startBackupConnection(uniString::utf8 errorMessage) throw(exception) -{ - if (!m_relayInfo.m_backupUrl.url().empty() && m_backupStarted == false) - { - if (errorMessage.empty() == false) - ELOG(m_srcLogString + errorMessage, LOGNAME, m_originalRelayInfo.m_streamID); - // this should pass through the bitrate of the original stream but as we do not - // know what it is then we have to effectively force through to allow the backup - - bool noEntry = false; - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 8); - threadedRunner::scheduleRunnable(new protocol_backup(m_relayInfo, 0, "")); - m_backupStarted = true; - return; - } -} -#else -void protocol_relay::startBackupConnection(uniString::utf8) throw(exception) -{ -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay.h b/Src/Plugins/DSP/sc_serv3/protocol_relay.h deleted file mode 100644 index ba01c1ee..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#ifndef protocol_relay_H_ -#define protocol_relay_H_ - -#include "threadedRunner.h" - -/* - Runnable object that handles the initial part of a relay connection. - Makes the connection to the source and determines what type of protocol - should be used, then hands off to that particular protocol - (shoutcast or uvox relay) -*/ - -class protocol_relay: public runnable -{ -private: - u_short m_srcPort; // server port - short m_redirectCount; - - uniString::utf8 m_srcAddrName; // server DNS name or value as specified in relayInfo - std::string m_srcAddrNumeric; // resolved numeric addr - uniString::utf8 m_srcURLpart; // server - - uniString::utf8 m_srcLogString; - httpHeaderMap_t m_HTTPHeaders; - uniString::utf8 m_HTTPGreetingResponse; // first line of response - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - bool m_relayWaitingToReconnect; - bool m_relaySentConnectWait; - bool m_retryRelay; - bool m_skip; - bool m_backupStarted; - bool m_registered; // true if runnable is ok to start. new relay have to wait for exisitng one to drop - - uniString::utf8 m_lineBuffer; // in/out lines - - config::streamConfig m_relayInfo; - const config::streamConfig m_originalRelayInfo; // used for reconnects later on - - /// reconnects - int m_retryCount; - time_t m_relayReconnectStartTime; - - typedef void (protocol_relay::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_Initial() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_SendGreeting() throw(std::exception); - void state_GetGreetingResponse() throw(std::exception); - void state_AnalyzeGreetingResponse() throw(std::exception); - void state_DetermineProtocol() throw(std::exception); - void state_Send() throw(std::exception); - void state_GetLine() throw(std::exception); - void startBackupConnection(uniString::utf8 errorMessage) throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay"; } - -public: - protocol_relay(const config::streamConfig &info, const bool retry = false) throw(); - virtual ~protocol_relay() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp deleted file mode 100644 index 91c06f79..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp +++ /dev/null @@ -1,455 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "protocol_relay_shoutcast.h" -#include "protocol_backup.h" -#include "protocol_relay.h" -#include "streamData.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.relayShoutcastDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "RELAY" - -protocol_relay_shoutcast::protocol_relay_shoutcast(socketOps::tSOCKET s, - const config::streamConfig &originalRelayInfo, const uniString::utf8 &srcAddrName, - const uniString::utf8 &srcAddrNumeric, const int srcPort, - const uniString::utf8 &srcURLpart, httpHeaderMap_t &headers, - const int originalBitrate, const uniString::utf8& originalMimeType, const bool backup) - : runnable(s), m_originalBitrate(originalBitrate), m_originalRelayInfo(originalRelayInfo), - m_metadataInterval(mapGet(headers, "icy-metaint", (short unsigned int)0)), - m_backup(backup), m_denied(false), m_remainderSize(0), - m_remainder(new __uint8[BUF_SIZE * 4]), m_srcAddrName(srcAddrName), - m_srcAddrNumeric(srcAddrNumeric), m_srcURLpart(srcURLpart), m_streamData(0), - m_srcLogString((!backup ? "[RELAY " : "[BACKUP ") + m_srcAddrName + ":" + - tos(srcPort) + m_srcURLpart + " sid=" + - tos(originalRelayInfo.m_streamID) + "] "), - m_bytesSinceMetadata(0), m_metadataSizeByte(-1) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, originalRelayInfo.m_streamID); - bool noEntry = false; - streamData::isRelayActive (m_originalRelayInfo.m_streamID, noEntry); - - // for a backup we need to check that the mimetype matches the original source - // as otherwise there will be issues with the transition between the sources! - utf8 mimeType = fixMimeType(mapGet(headers, "content-type", utf8("audio/mpeg"))); - if (m_backup && !originalMimeType.empty() && (originalMimeType != mimeType)) - { - ELOG(m_srcLogString + "Backup source rejected. The content type does not match the original stream " - "source - detected `" + mimeType + "' instead of `" + originalMimeType + "'.", (char*)m_srcLogString.c_str(), originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - m_originalMimeType = mimeType; - - // for a backup we need to check that the bitrate matches the original source - // as otherwise there will be issues with the transition between the sources! - const int bitrate = getStreamBitrate(headers); - if (m_backup && (m_originalBitrate > 0) && (m_originalBitrate != bitrate) && (m_originalBitrate/1000 != bitrate)) - { - ELOG(m_srcLogString + "Backup source rejected. The bitrate " - "does not match the original stream source - detected " + - tos(bitrate) + " kbps instead of " + - tos(m_originalBitrate) + " kbps.", (char*)m_srcLogString.c_str(), originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - m_originalBitrate = bitrate; - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(originalRelayInfo.m_streamID, bitrate, - streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + " kbps are allowed " - "- detected " + tos(bitrate) + " kbps.", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - - bool allowPublicRelay = gOptions.stream_allowPublicRelay(m_originalRelayInfo.m_streamID); - if (!gOptions.read_stream_allowPublicRelay(m_originalRelayInfo.m_streamID)) - { - allowPublicRelay = gOptions.allowPublicRelay(); - } - headers["icy-pub"] = (allowPublicRelay ? "1" : "0"); - - /// data might be encoded in url portion, so decode. - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_originalRelayInfo.m_streamID); - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, - m_originalRelayInfo.m_relayUrl.server(), - (found ? stream.m_authHash : ""), "", - m_originalRelayInfo.m_relayUrl.url(), - m_originalRelayInfo.m_backupUrl.url(), - streamData::SHOUTCAST1, - m_originalRelayInfo.m_streamID, - m_originalRelayInfo.m_relayUrl.port(), - m_originalRelayInfo.m_maxStreamUser, - m_originalRelayInfo.m_maxStreamBitrate, - m_originalRelayInfo.m_minStreamBitrate, - m_originalRelayInfo.m_allowPublicRelay, - m_backup, getStreamSamplerate(headers), - mapGet(headers, "icy-vbr", (bool)false), headers)); - if (!m_streamData) - { - throwEx(m_srcLogString + "Could not create " + - (!m_backup ? "relay" : "backup") + " connection."); - } - - // attempt to determine the version of the source based - // on the icy-notice2 line (assuming it is provided etc) - utf8 sourceIdent = mapGet(headers, "icy-notice2", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - sourceIdent = mapGet(headers, "server", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - - ILOG(m_srcLogString + "Connected to Shoutcast 1 source " + (!m_backup ? "relay" : "backup") + ".", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_GetStreamData; -} - -void protocol_relay_shoutcast::cleanup() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (m_streamData) - { - int killed = m_streamData->isKill(); - // if this was a kill i.e. when a source re-joins then we need to keep things intact - if (!killed) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - bool remove_relay = false; - if (gOptions.stream_relayURL(m_originalRelayInfo.m_streamID).empty() && - gOptions.stream_backupURL(m_originalRelayInfo.m_streamID).empty()) - remove_relay = true; - if (remove_relay) - streamData::removeRelayStatus (m_originalRelayInfo.m_streamID); - } - else - { - m_streamData->setKill(false); - } - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); -} - -protocol_relay_shoutcast::~protocol_relay_shoutcast() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - ILOG(m_srcLogString + "Disconnected from Shoutcast 1 source " + - (!m_backup ? "relay" : "backup"), (char*)m_srcLogString.c_str(), m_originalRelayInfo.m_streamID); - cleanup(); -} - -void protocol_relay_shoutcast::timeSlice() throw(exception) -{ - const int killed = (m_streamData ? m_streamData->isKill() : 0); - - try - { - if (m_streamData && (m_streamData->isDead() || (!m_backup && killed == 1) || (m_backup && killed == 2))) - { - DLOG(m_srcLogString + "Detected termination of stream", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_Fail; - } - return (this->*m_state)(); - } - catch (const exception &ex) - { - // on error, we should get ready to retry if applicable - utf8 str = ex.what(); - if (!str.empty()) - { - ELOG(ex.what(), LOGNAME, m_originalRelayInfo.m_streamID); - } - if (m_streamData) - m_streamData->setKill (0); - m_state = &protocol_relay_shoutcast::state_Fail; - m_result.run(); - } -} - -void protocol_relay_shoutcast::state_Fail() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (!m_backup) - { - cleanup(); - threadedRunner::scheduleRunnable(new protocol_relay(m_originalRelayInfo)); - } -#ifdef INCLUDE_BACKUP_STREAMS - else - { - threadedRunner::scheduleRunnable(new protocol_backup(m_originalRelayInfo, m_originalBitrate, m_originalMimeType)); - } -#endif - m_result.done(); -} - -void protocol_relay_shoutcast::state_GetMetadata() throw(exception) -{ - time_t cur_time; - const bool debug = gOptions.relayShoutcastDebug(); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for stream data")); - - while (m_metadataSizeByte != 0) - { - char buf[BUF_SIZE] = {0}; - // don't read beyond metadata interval - int amt = (m_metadataSizeByte < 0 ? 1 : m_metadataSizeByte); - amt = min(amt, (BUF_SIZE - 1)); - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval == 0) - { - throwEx((debug ? (m_srcLogString + "Remote socket " - "closed while waiting for stream data.") : (utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx((debug ? (m_srcLogString + "Socket error " - "while waiting for stream data. " + - socketErrString(rval)) : (utf8)"")); - } - - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - } - bandWidth::updateAmount(bandWidth::RELAY_V1_RECV, rval); - m_lastActivityTime = ::time(NULL); - if (m_metadataSizeByte < 0) - { - m_metadataSizeByte = buf[0] * 16; - m_metadataBuffer.clear(); - } - else - { - m_metadataBuffer.insert(m_metadataBuffer.end(), buf, buf + rval); - m_metadataSizeByte -= rval; - } - } - - // parse and add - // this will pull StreamTitle='' and StreamUrl='' from the string - if (!m_metadataBuffer.empty()) - { - bool song = false, url = false, next = false; - utf8 songStr, urlStr, nextStr; - - // StreamTitle='' - utf8::size_type pos_start = m_metadataBuffer.find(utf8("itle='")); - if (pos_start != utf8::npos) - { - pos_start += 6; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - songStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - if (!songStr.empty() && !songStr.isValid()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - songStr = asciiToUtf8(songStr.toANSI(true)); - } - - // advance the buffer as StreamUrl=''; has to follow StreamTitle='' - m_metadataBuffer = m_metadataBuffer.substr(pos_end + 2); - song = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // StreamUrl='' - pos_start = m_metadataBuffer.find(utf8("mUrl='")); - if (pos_start != utf8::npos) - { - pos_start += 6; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - urlStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - url = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // StreamNext='' - pos_start = m_metadataBuffer.find(utf8("mNext='")); - if (pos_start != utf8::npos) - { - pos_start += 7; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - nextStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - next = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - if (!song && !url && !next) - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - if (m_streamData->addSc1MetadataAtCurrentPosition(m_srcLogString, songStr, urlStr, nextStr) & 1) - { - ILOG(m_srcLogString + "Title update [" + songStr + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - } - - // it's streaming time - m_metadataSizeByte = -1; - m_metadataBuffer.clear(); - m_bytesSinceMetadata = 0; - m_state = &protocol_relay_shoutcast::state_GetStreamData; - - m_result.run(); -} - -void protocol_relay_shoutcast::state_GetStreamData() throw(exception) -{ - time_t cur_time; - - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while ((!m_metadataInterval) || (m_bytesSinceMetadata < m_metadataInterval)) - { - char buf[BUF_SIZE * 4] = {0}; - // don't read beyond metadata interval otherwise we'll have audio glitching issues :o( - int amt = ((m_metadataInterval > 0) ? m_metadataInterval - m_bytesSinceMetadata : BUF_SIZE); - amt = min(amt, (BUF_SIZE - 1)); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], amt, 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (70); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - ILOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx (""); - } - - // update these details before we mess with anything - // else as we have read things and it's needed to - // ensure that we don't break the metadata detection - bandWidth::updateAmount(bandWidth::RELAY_V1_RECV, rval); - m_bytesSinceMetadata += rval; - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, bitrate, - type, buf, m_srcLogString)) - { - m_denied = true; - ELOG (m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Unable to sync to the stream. Please " - "check the source is valid and in a supported format.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx (""); - } - - m_lastActivityTime = ::time(NULL); - } - - if (m_metadataInterval > 0) - { - // it's metadata time! - m_metadataSizeByte = -1; - m_metadataBuffer.clear(); - m_state = &protocol_relay_shoutcast::state_GetMetadata; - } - - m_result.run(); - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector backupInfo = gOptions.getBackupUrl(m_originalRelayInfo.m_streamID); - if (!m_backup && !backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - } - } - throw; - } -} - -void protocol_relay_shoutcast::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h b/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h deleted file mode 100644 index 07872249..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#ifndef protocol_relay_shoutcast_H_ -#define protocol_relay_shoutcast_H_ - -#include "threadedRunner.h" - -class streamData; - -class protocol_relay_shoutcast: public runnable -{ - int m_originalBitrate; // original bitrate for checking - uniString::utf8 m_originalMimeType; // original mimetype for checking - const config::streamConfig m_originalRelayInfo; - - short unsigned int m_metadataInterval; // interval on source - const bool m_backup; // used to change log output depending on relay or backup usage - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - short unsigned int m_remainderSize; - __uint8 *m_remainder; - - const uniString::utf8 m_srcAddrName; - const uniString::utf8 m_srcAddrNumeric; - const uniString::utf8 m_srcURLpart; - - uniString::utf8 m_metadataBuffer; - - streamData *m_streamData; - const uniString::utf8 m_srcLogString; - - typedef void (protocol_relay_shoutcast::*state_t)(); - state_t m_state; - - int m_bytesSinceMetadata; - int m_metadataSizeByte; // metadata length indicator - - void state_GetStreamData() throw(std::exception); - void state_GetMetadata() throw(std::exception); - void state_Fail() throw(std::exception); - void state_CloseConnection() throw(std::exception); - - void cleanup(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay_shoutcast"; } - -public: - protocol_relay_shoutcast(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - httpHeaderMap_t &httpHeaders, const int originalbitrate = 0, - const uniString::utf8& originalMimeType = "", const bool backup = false); - ~protocol_relay_shoutcast() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp deleted file mode 100644 index 94dcfcd1..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp +++ /dev/null @@ -1,693 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "protocol_relay_uvox.h" -#include "protocol_backup.h" -#include "protocol_relay.h" -#include "streamData.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.relayUvoxDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "RELAY" - -protocol_relay_uvox::protocol_relay_uvox(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - const httpHeaderMap_t &httpHeaders, const int originalBitrate, - const uniString::utf8& originalMimeType, const bool backup) throw(runtime_error) - : runnable(s), m_backup(backup), m_denied(false), m_remainderSize(0), - m_remainder(new __uint8[BUF_SIZE * 4]), m_srcAddrName(srcAddrName), - m_srcAddrNumeric(srcAddrNumeric), m_srcURLpart(srcURLpart), - m_srcLogString((!backup ? "[RELAY " : "[BACKUP ") + m_srcAddrName + - ":" + tos(srcPort) + m_srcURLpart + " sid=" + - tos(originalRelayInfo.m_streamID) + "] "), - m_outData(new __uint8[MAX_MESSAGE_SIZE]), m_outBuffer(0), m_outBufferSize(0), - m_originalRelayInfo(originalRelayInfo), m_streamData(0), m_nextState(0) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - // we need to look in the response headers and figure out what's going on - - // mime type. For uvox2 there is none, for shoutcast 2 it must be there - // changed in build 22 to match new specs as there's no part in brackets now - // i.e. should just be 'misc/ultravox if it's a SC2 stream being relayed - - // fixed in build 23 so we set the mime type to the source's details - // which means older clients can connect and keeps relaying to specs - switch (strtol((const char*)mapGet(httpHeaders, "ultravox-class-type", utf8()).c_str(), 0, 16)) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - default: - { - m_configData.m_mimeType = mapGet(httpHeaders, "content-type", utf8("audio/mpeg")); - break; - } - } - - if (m_configData.m_mimeType.empty()) - { - throwEx(m_srcLogString + "No mime-type specified."); - } - - utf8 cdn_authhash; - if (mapGet(httpHeaders, "cdn-master", false)) - { - DEBUG_LOG(m_srcLogString + "CDN master response received by slave", LOGNAME, m_originalRelayInfo.m_streamID); - utf8 authhash = mapGet(httpHeaders, "cdn-token", utf8()); - authhash = XTEA_decipher(authhash.c_str(), authhash.size(), bob().c_str(), bob().size()); - if (yp2::isValidAuthhash(authhash)) - { - cdn_authhash = authhash; - } - else - { - DEBUG_LOG(m_srcLogString + "CDN master response rejected - invalid master authash provided", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // for a backup we need to check that the mimetype matches the original source - // as otherwise there will be issues with the transition between the sources! - if (m_backup && !originalMimeType.empty() && (originalMimeType != m_configData.m_mimeType)) - { - ELOG(m_srcLogString + "Backup source rejected. The content type does not match the original stream " - "source - detected `" + m_configData.m_mimeType + "' instead of `" + originalMimeType + "'.", LOGNAME, m_originalRelayInfo.m_streamID); - loadAndSendMsg("NAK:Unsupported mime type", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - utf8 p = mapGet(httpHeaders,"ultravox-max-msg",utf8()); - if (p.empty()) - { - throwEx(m_srcLogString + "Missing Ultravox-Max-Msg header"); - } - - int max_msg = p.toInt(); - if ((max_msg < 256) || (max_msg > MAX_PAYLOAD_SIZE)) - { - throwEx(m_srcLogString + "Bad Ultravox-Max-Msg value " + tos(max_msg)); - } - - p = mapGet(httpHeaders, "ultravox-samplerate", utf8("0")); - int samplerate = p.toInt(); - if (samplerate < 0) - { - throwEx(m_srcLogString + "Bad samplerate specified (" + tos(samplerate) + ")"); - } - - // this is basically a hint that should only appear - // if relaying a MP3 VBR stream from a 2.5+ DNAS... - p = mapGet(httpHeaders, "ultravox-vbr", utf8("0")); - const bool vbr = !!p.toInt(); - - m_configData.m_avgBitrate = 0; - m_configData.m_maxBitrate = 0; - p = mapGet(httpHeaders, "ultravox-avg-bitrate", utf8("0")); - m_configData.m_avgBitrate = p.toInt(); - p = mapGet(httpHeaders, "ultravox-max-bitrate", utf8("0")); - m_configData.m_maxBitrate = p.toInt(); - p = mapGet(httpHeaders, "ultravox-bitrate", utf8("0")); - - int x = p.toInt(); - if (x > 0) - { - m_configData.m_maxBitrate = m_configData.m_avgBitrate = x; - } - - if (m_configData.m_avgBitrate <= 0) - { - throwEx(m_srcLogString + "Bad avg bitrate specified (" + - tos(m_configData.m_avgBitrate) + ")"); - } - - if (m_configData.m_maxBitrate <= 0) - { - throwEx(m_srcLogString + "Bad max bitrate specified (" + - tos(m_configData.m_maxBitrate) + ")"); - } - - // for a backup we need to check that the bitrate matches the original source - // as otherwise there will be issues with the transition between the sources! - int bitrate = max(m_configData.m_avgBitrate, m_configData.m_maxBitrate); - if (m_backup && (originalBitrate > 0) && (originalBitrate != bitrate)) - { - ELOG(m_srcLogString + "Backup source rejected. The bitrate " - "does not match the original stream source - detected " + - tos(bitrate / 1000) + " kbps instead of " + - tos(originalBitrate / 1000) + " kbps."); - loadAndSendMsg("NAK:Bit Rate Error", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(originalRelayInfo.m_streamID, bitrate, - streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + " kbps are allowed " - "- detected " + tos(bitrate / 1000) + " kbps."); - loadAndSendMsg("NAK:Bit Rate Error", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - - m_configData.m_minimumBufferSize = m_configData.m_desiredBufferSize = 0; - - m_configData.m_icyName = mapGet(httpHeaders,"ultravox-title", (utf8)""); - m_configData.m_icyGenre = mapGet(httpHeaders,"ultravox-genre", utf8("Misc")); - m_configData.m_icyURL = mapGet(httpHeaders,"ultravox-url", (utf8)""); - m_configData.m_icyPub = m_originalRelayInfo.m_allowPublicRelay; - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_originalRelayInfo.m_streamID); - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, - m_originalRelayInfo.m_relayUrl.server(), - (!cdn_authhash.empty() ? cdn_authhash : - (found ? stream.m_authHash : "")), "", - m_originalRelayInfo.m_relayUrl.url(), - m_originalRelayInfo.m_backupUrl.url(), - streamData::SHOUTCAST2, - m_originalRelayInfo.m_streamID, - m_originalRelayInfo.m_relayUrl.port(), - m_originalRelayInfo.m_maxStreamUser, - m_originalRelayInfo.m_maxStreamBitrate, - m_originalRelayInfo.m_minStreamBitrate, - m_originalRelayInfo.m_allowPublicRelay, - m_backup, samplerate, vbr, m_configData)); - if (!m_streamData) - { - throwEx(m_srcLogString + "Could not create " + (!m_backup ? - "relay" : "backup") + " connection."); - } - - // attempt to determine the version of the source based - // on the icy-notice2 line (assuming it is provided etc) - utf8 sourceIdent = mapGet(httpHeaders, "icy-notice2", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - sourceIdent = mapGet(httpHeaders, "server", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - - DEBUG_LOG(m_srcLogString + "Stream configuration [" + eol() + m_configData.toLogString() + eol() + "]"); - ILOG(m_srcLogString + "Connected to Shoutcast 2 source " + (!m_backup ? "relay" : "backup") + "."); - m_state = &protocol_relay_uvox::state_GetStreamData; -} - -void protocol_relay_uvox::cleanup() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - int killed = m_streamData->isKill(); - if (!m_denied) - { - ILOG(m_srcLogString + "Disconnected from Shoutcast 2 source " + - (!m_backup ? "relay" : "backup") + - (!killed ? "." : " - original source connected.")); - } - - // if this was a kill i.e. when a source re-joins then we need to keep things intact - if (!killed) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - bool remove_relay = false; - if (gOptions.stream_relayURL(m_originalRelayInfo.m_streamID).empty() && - gOptions.stream_backupURL(m_originalRelayInfo.m_streamID).empty()) - remove_relay = true; - if (remove_relay) - streamData::removeRelayStatus (m_originalRelayInfo.m_streamID); - } - else - { - m_streamData->setKill(false); - } - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_outData); - forgetArray(m_remainder); -} - -protocol_relay_uvox::~protocol_relay_uvox() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - cleanup(); -} - -void protocol_relay_uvox::timeSlice() throw(exception) -{ - const int killed = (m_streamData ? m_streamData->isKill() : 0); - try - { - if (m_streamData && (m_streamData->isDead() || (!m_backup && killed == 1) || (m_backup && killed == 2))) - { - DLOG(m_srcLogString + "Detected termination of stream", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_uvox::state_Fail; - } - (this->*m_state)(); - } - catch (const exception &ex) - { - // on error, we should get ready to retry if applicable - utf8 str = ex.what(); - if (!str.empty()) - { - ELOG(ex.what()); - } - if (m_streamData) - m_streamData->setKill (0); - m_state = &protocol_relay_uvox::state_Fail; - m_result.run(); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////// Similar to protocol_uvox2Source from here on in /////////////////////////// - -template -void protocol_relay_uvox::loadAndSendMsg(const T &msg, int type, state_t nextState) throw() -{ - formMessage(msg, type, m_outData, m_outBufferSize); - bandWidth::updateAmount(bandWidth::RELAY_V2_SENT, m_outBufferSize); - m_outBuffer = m_outData; - m_state = &protocol_relay_uvox::state_SendBuffer; - m_nextState = nextState; -} - -// load outbound message into buffer, and establish state to transition to after send -#define SEND_AND_TRANSITION(msg, vtype, state)\ - loadAndSendMsg(msg, vtype, state);\ - m_result.write();\ - m_result.run();\ - return; - -// get next packet, without acknowledgement -#define NEXT_PACKET\ - m_inBuffer.clear();\ - m_nextState = m_state;\ - m_state = &protocol_relay_uvox::state_GetPacket;\ - m_result.read();\ - m_result.schedule();\ - m_result.timeoutSID(m_originalRelayInfo.m_streamID);\ - return; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void protocol_relay_uvox::state_GetPacket() throw(exception) -{ - time_t cur_time; - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for data")); - - while (true) - { - // calculate optimal read size - char buf[BUF_SIZE] = {0}; - int amt = MAX_MESSAGE_SIZE; - int len = (int)m_inBuffer.size(); - - if (!len) - { - amt = UV2X_HDR_SIZE; - } - else if (len >= UV2X_HDR_SIZE) - { - amt = min(MAX_MESSAGE_SIZE, (int)((ntohs(reinterpret_cast(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) - len)); - } - else - { - amt = min(MAX_MESSAGE_SIZE, (UV2X_OVERHEAD - len)); - } - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (70); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - ILOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx (""); - } - - m_lastActivityTime = ::time(NULL); - m_inBuffer.insert(m_inBuffer.end(), buf, buf + rval); - - len = (int)m_inBuffer.size(); - if ((len > 1) && (len <= UV2X_HDR_SIZE)) - { - // check for sync byte as we cannot be - // certain of good data coming in from - // the connection and so we check it - int found = -1; - for (int i = 0; i < len - 1; i++) - { - // check for sync byte - if ((buf[i] == UVOX2_SYNC_BYTE) && (buf[i + 1] == 0)) - { - found = i; - break; - } - } - - // track what we've received for the bandwidth stats - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - - if (found != -1) - { - // we need to re-sync and so need to - // clear the buffer and replace it - // according to the re-sync position - if (found > 0) - { - DEBUG_LOG(m_srcLogString + "Shoutcast 2 source relay re-synced to stream [pos: " + tos(found) + "]."); - - m_inBuffer.clear(); - - // we insert in to the start of the buffer - // what appears to be 'good' sync'd data. - m_inBuffer.insert(m_inBuffer.end(), &buf[found], &buf[found] + rval - found); - } - } - else - { - // and then we clear out the buffer which - // is ok to do since we're trying to find - // the frame (as first or next in stream) - m_inBuffer.clear(); - } - - continue; - } - else if (len > MAX_MESSAGE_SIZE) - { - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - throwEx(m_srcLogString + "UVOX packet is too large" - " [got: " + tos(len) + " bytes, max: " + - tos(MAX_MESSAGE_SIZE) + " bytes]"); - } - else if (len > UV2X_HDR_SIZE) - { - if ((int)(ntohs(reinterpret_cast(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) == len) - { - // got it - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - - m_result.run(); - m_state = m_nextState; - return; - } - } - } - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector backupInfo = gOptions.getBackupUrl(m_originalRelayInfo.m_streamID); - if (!m_backup && !backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - } - } - throw; - } -} - -void protocol_relay_uvox::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (sendDataBuffer(m_originalRelayInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -// normal streaming state -void protocol_relay_uvox::state_GetStreamData() throw(std::exception) -{ - if (!m_inBuffer.empty()) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - // if we have old uvox, then we don't know our mime-type (since old uvox 2 doesn't - // specify it, though 2.1 does). In the case that mime_type is empty, inspect the packet type and - // set it in the stream - if (m_configData.m_mimeType.empty()) - { - switch (voxMsgType) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - } - - if (!m_configData.m_mimeType.empty()) - { - m_streamData->streamSetMimeType(m_configData.m_mimeType); - } - } - - char buf[BUF_SIZE * 4] = {0}; - __uint16 amt = ntohs(voxHdr->msgLen); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - memcpy(&buf[m_remainderSize], (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))), amt); - amt += m_remainderSize; - m_remainderSize = 0; - - int br = m_streamData->streamBitrate(); - if (m_streamData->syncToStream (m_remainderSize, m_remainder, amt, br, voxMsgType, buf, m_srcLogString)) - { - m_denied = true; - throwEx(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Unable to sync to the stream. Please " - "check the source is valid and in a supported format."); - } - } - else if ((voxMsgType >= 0x3000) && (voxMsgType < 0x5000)) - { - DEBUG_LOG(m_srcLogString + "Cacheable metadata received type=0x" + tohex(voxMsgType), LOGNAME, m_originalRelayInfo.m_streamID); - const __uint16 voxPayloadSize = ntohs(voxHdr->msgLen); - if (voxPayloadSize >= UV2X_META_HDR_SIZE) // make sure there's enough data - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const uv2xMetadataHdr *metaHdr = reinterpret_cast(contents); - const __uint16 metadataID = ntohs(metaHdr->id); - const __uint16 metadataSpan = ntohs(metaHdr->span); - const __uint16 metadataIndex = ntohs(metaHdr->index) - 1; - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = voxPayloadSize - UV2X_META_HDR_SIZE; - - if ((metadataSpan <= MAX_METADATA_FRAGMENTS) && - (metadataSpan > 0) && - (metadataIndex < MAX_METADATA_FRAGMENTS) && - (metadataIndex < metadataSpan)) - { - assemblyTableIndex_t ati = makeAssemblyTableIndex(voxMsgType, metadataID); - metadataEntry_t &me = m_metadataAssemblyTable[ati]; - - if (metadataSpan != me.m_expectedFragments) // span changed, clear the entire thing - { - __uint16 expectedFragments = me.m_expectedFragments; - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to span change [" + tos(metadataSpan) + "," + tos(expectedFragments) + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - - me.m_expectedFragments = metadataSpan; - if (me.m_fragments[metadataIndex].m_isValid) // duplicate fragment, clear the entire thing - { - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to duplicate fragment", LOGNAME, m_originalRelayInfo.m_streamID); - } - - me.m_fragments[metadataIndex].m_isValid = true; - me.m_fragments[metadataIndex].m_fragment.insert(me.m_fragments[metadataIndex].m_fragment.end(), - metadataContents, metadataContents + metadataContentsSize); - - if ((++me.m_receivedFragments) == me.m_expectedFragments) - { - // assembly, send and clear - vector<__uint8> assembledData; - for (__uint16 x = 0; x < me.m_expectedFragments; ++x) - { - assembledData.insert(assembledData.end(), me.m_fragments[x].m_fragment.begin(), me.m_fragments[x].m_fragment.end()); - } - - // send - m_streamData->addUvoxMetadataAtCurrentPosition(voxMsgType,assembledData); - - if (gOptions.relayUvoxDebug()) - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan) + - " content=" + eol() + utf8(&(assembledData[0]), assembledData.size()), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - utf8 currentSong, comingSoon; - std::vector nextSongs; - m_streamData->getStreamNextSongs(m_originalRelayInfo.m_streamID, currentSong, comingSoon, nextSongs); - - if (!currentSong.empty()) - { - if (!comingSoon.empty()) - { - ILOG(m_srcLogString + "Title update [now: \"" + currentSong + "\", next: \"" + comingSoon + "\"]", LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - ILOG(m_srcLogString + "Title update [" + currentSong + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - m_streamData->resetAdvertTriggers(currentSong); - } - } - } - - // clear - m_metadataAssemblyTable.erase(ati); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + " id=" + - tos(metadataID) + " span=" + tos(metadataSpan) + " index=" + tos(metadataIndex + 1), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + - " content of packet is too small payloadsize=" + tos(voxPayloadSize), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else if ((voxMsgType >= 0x5000) && (voxMsgType < 0x7000)) - { - // pass thru metadata - DEBUG_LOG(m_srcLogString + "Pass thru metadata"); - m_streamData->writeSc21(m_inBuffer); // like data, but don't write to sc1 buffers - } - else - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_originalRelayInfo.m_streamID); - if ((voxMsgType < 0x2000) && (voxMsgType != MSG_FILE_TRANSFER_DATA)) - { - // probably have to NAK it - SEND_AND_TRANSITION("NAK:Unsupported packet type", voxMsgType, &protocol_relay_uvox::state_GetStreamData); - } - } - } - - NEXT_PACKET; -} - -void protocol_relay_uvox::state_Fail() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (!m_backup) - { - cleanup(); - threadedRunner::scheduleRunnable(new protocol_relay(m_originalRelayInfo, true)); - } -#ifdef INCLUDE_BACKUP_STREAMS - else - { - threadedRunner::scheduleRunnable(new protocol_backup(m_originalRelayInfo, max(m_configData.m_avgBitrate/1000, - m_configData.m_maxBitrate/1000), m_configData.m_mimeType)); - } -#endif - m_result.done(); -} - -void protocol_relay_uvox::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h b/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h deleted file mode 100644 index 50350e0e..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h +++ /dev/null @@ -1,108 +0,0 @@ -#pragma once -#ifndef protocol_relay_uvox_H_ -#define protocol_relay_uvox_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "uvox2Common.h" - -class protocol_relay_uvox: public runnable -{ -private: - const bool m_backup; // used to change log output depending on relay or backup usage - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - short unsigned int m_remainderSize; - __uint8 * m_remainder; - - const uniString::utf8 m_srcAddrName; - const uniString::utf8 m_srcAddrNumeric; - const uniString::utf8 m_srcURLpart; - const uniString::utf8 m_srcLogString; - - ///////////// for outgoing data ////////////////////////////// - __uint8 * m_outData; - const __uint8 * m_outBuffer; // for outgoing data lines - int m_outBufferSize; - - const config::streamConfig m_originalRelayInfo; - - ///////////// incoming data //////////////////////////////////// - std::vector<__uint8> m_inBuffer; - //////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////////// - //// data structures for assembling cached metadata - typedef std::vector<__uint8> metadataFragment_t; - struct metadataFragmentEntry_t - { - metadataFragment_t m_fragment; - bool m_isValid; - - void clear() throw() {m_isValid = false; m_fragment.clear(); } - metadataFragmentEntry_t() throw():m_isValid(false){} - }; - - typedef metadataFragmentEntry_t metadataFragmentCollection_t[MAX_METADATA_FRAGMENTS]; - #pragma pack(push, 1) - struct metadataEntry_t - { - __uint16 m_expectedFragments; - __uint16 m_receivedFragments; - metadataFragmentCollection_t m_fragments; - - void clear() throw() - { - for (int x = 0; x < MAX_METADATA_FRAGMENTS; ++x) - { - m_fragments[x].clear(); - } - m_receivedFragments = 0; - } - metadataEntry_t() throw() : m_expectedFragments(0), m_receivedFragments(0) { } - }; - #pragma pack(pop) - - typedef __uint32 assemblyTableIndex_t; - static assemblyTableIndex_t makeAssemblyTableIndex(__uint16 voxMsgType,__uint16 metadataID) throw() - { - return ((((assemblyTableIndex_t)voxMsgType) << 16) | metadataID); - } - - typedef std::map metadataAssemblyTable_t; - metadataAssemblyTable_t m_metadataAssemblyTable; - ///////////////////////////////////////////////////// - - streamData *m_streamData; - - typedef void (protocol_relay_uvox::*state_t)(); - - void state_GetPacket() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetStreamData() throw(std::exception); - void state_Fail() throw(std::exception); - void state_CloseConnection() throw(std::exception); - - state_t m_state; - state_t m_nextState; - - streamData::uvoxConfigData_t m_configData; - - void cleanup(); - - template void loadAndSendMsg(const T &msg, int type,state_t nextState) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay_uvox"; } - -public: - protocol_relay_uvox(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - const httpHeaderMap_t &httpHeaders, const int originalBitrate = 0, - const uniString::utf8& originalMimeType = "", const bool backup = false) throw(std::runtime_error); - ~protocol_relay_uvox() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp deleted file mode 100644 index c8621176..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp +++ /dev/null @@ -1,417 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_shoutcast1Client.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.shoutcast1ClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - - -protocol_shoutcast1Client::protocol_shoutcast1Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw (std::exception) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::SHOUTCAST1) -{ - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - -protocol_shoutcast1Client::~protocol_shoutcast1Client() throw() -{ - cleanup("Shoutcast 1", gOptions.shoutcast1ClientDebug()); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcast1Client::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_shoutcastClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - -void protocol_shoutcast1Client::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_shoutcast1Client::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -// find the appropriate stream and try to attach to it -void protocol_shoutcast1Client::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0, dataType = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - m_outBuffer = MSG_ICY_HTTP401.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = MSG_ICY_HTTP401_LEN)); - - if (processReject("Shoutcast 1", bandWidth::CLIENT_V1_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("Shoutcast 1", bandWidth::CLIENT_V1_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = (m_clientType == streamData::WMP ? MSG_ICY200 : MSG_ICY_HTTP200); - if (!isPodcast) - { - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse += "icy-name:" + title + "\r\n" - "icy-genre:"; - if (m_streamData) - { - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - m_OKResponse += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - else - { - m_OKResponse += "Misc"; - } - - m_OKResponse += "\r\n" - "icy-br:" + tos((m_streamData ? m_streamData->streamBitrate() : read_bitrate)) + "\r\n" + - "icy-sr:" + tos((m_streamData ? m_streamData->streamSampleRate() : 0)) + "\r\n" + - (m_streamData ? (m_streamData->streamIsVBR() ? "icy-vbr:1\r\n" : "") : ""); - } - - if (m_streamData) - { - m_OKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - m_OKResponse += "icy-pub:0\r\n"; - } - else - { - m_OKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - } - - m_OKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - } - else - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - m_OKResponse += "Content-Type:" + utf8(dataType == AACP_DATA ? "audio/aacp" : "audio/mpeg") + "\r\n"; - - if (!isPodcast) - { - //m_OKResponse += "icy-url:" + utf8("TODO") + "\r\n"; - - utf8 pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_OKResponse += "icy-pub:1\r\n"; - } - else if (pub == "never") - { - m_OKResponse += "icy-pub:0\r\n"; - } - } - else - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - // ignore setting if we've already determined we shouldn't send in-stream metadata - // otherwise for some clients where we force disable just in-case, if it explicitly - // includes a valid "icy-metadata" header, then see if we should override things... - m_OKResponse += "icy-metaint:" + tos(m_metaInterval) + "\r\n"; - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - if (!m_userAgent.empty() && toLower(m_userAgent).find(utf8("shoutcast-to-dnas message sender")) == 0) - { - utf8::size_type pos = toLower(m_userAgent).find(utf8("[message:")); - if (pos != utf8::npos) - { - utf8 message = m_userAgent.substr(pos + 9); - pos = message.rfind(utf8("]")); - if (pos != utf8::npos) - { - message = message.substr(0, pos); - } - - if ((message.find(utf8("!doctype")) != utf8::npos) || - (message.find(utf8("") ? "Message cleared." : message)); - if (m_streamData) - { - m_streamData->updateStreamMessage(m_streamID, message); - } - } - m_ignoreDisconnect = true; - } - } - else - { - // setGroup(500); // for testing - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("Shoutcast 1"); - } - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("Shoutcast 1", bandWidth::CLIENT_V1_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_shoutcast1Client::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_shoutcast1Client::state_InitiateStream() throw(exception) -{ - resetReadPtr(); - - // if it's a SHOUTcast Directory test connection then we send just the title (which will - // be a default string if nothing is available) which will still allow the connection to - // work and validate the stream exists whilst only sending the minimum of data nededed. - if (!m_userAgent.empty() && (toLower(m_userAgent) == utf8("shoutcast directory tester"))) - { - // TODO check if artwork needs to also be indicated - const utf8 metadata = fixICYMetadata((m_streamData ? m_streamData->getSc1Metadata(m_readPtr).m_songTitle : "")); - sendICYMetadata((!metadata.empty() ? metadata : "StreamTitle='';")); - m_nextState = &protocol_shoutcastClient::state_Close; - m_ignoreDisconnect = true; - } - else - { - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - } - - m_result.run(); -} - -// construct the necessary metadata information and load into outbound buffers. -void protocol_shoutcast1Client::sendICYMetadata(const utf8 &md) throw() -{ - m_ICYMetadata.clear(); - m_ICYMetadata.push_back(1); // placeholder - if (md != m_lastSentMetadata) // don't sent duplicates - { - m_ICYMetadata.insert(m_ICYMetadata.end(),md.begin(),md.end()); - if (!m_lastSentMetadata.empty()) - { - logW3C(); - } - m_lastSentMetadata = md; - } - - unsigned int dlen = (unsigned int)m_ICYMetadata.size(); - if (dlen == 1) - { - dlen = 0; - } - unsigned int l1 = ((dlen + 15) & ~15); - m_ICYMetadata[0] = l1 / 16; - unsigned int send_len = l1 + 1; - m_ICYMetadata.insert(m_ICYMetadata.end(), send_len - m_ICYMetadata.size(), 0); - //assert(m_ICYMetadata.size() == (size_t)((m_ICYMetadata[0] * 16) + 1)); - m_metaIntervalCounter = 0; - - m_outBuffer = &m_ICYMetadata[0]; - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = (int)m_ICYMetadata.size())); - m_nextState = m_state; - m_state = &protocol_shoutcastClient::state_SendText; - m_result.run(); -} - - -int protocol_shoutcast1Client::doSend(const bool debug, const time_t cur_time, const int autoDumpTime, int adjust) throw(std::runtime_error) -{ - // we are going to do a forced short-send if we - // are now needing to be trying to send metadata - int size = (int)m_output.size(); - int rval = 0; - - if ((m_metaIntervalCounter + size) > m_metaInterval) - { - adjust = (size - ((m_metaIntervalCounter + size) - m_metaInterval)); - if (adjust) - { - rval = protocol_shoutcastClient::doSend(debug, cur_time, autoDumpTime, adjust); - // DLOG ("Adjusted send ret " + tos(rval) + " for per-meta " + tos(adjust)); - } - - if (rval == adjust) - { - const utf8 metadata = (!m_streamData ? "StreamTitle='';" : - fixICYMetadata((m_streamData ? - m_streamData->getSc1Metadata(m_readPtr).m_songTitle : ""))); - - sendICYMetadata(metadata); - return rval; - } - size = adjust; - } - else - rval = protocol_shoutcastClient::doSend(debug, cur_time, autoDumpTime); - m_metaIntervalCounter += rval; - if (rval < size) - m_result.schedule(120); - - return rval; -} - - -void protocol_shoutcast1Client::return_403(void) -{ - protocol_shoutcastClient::return_403(); - setCallback (&protocol_shoutcastClient::state_SendText, &protocol_shoutcastClient::state_Close); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h deleted file mode 100644 index 970acc7e..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#ifndef protocol_shoutcast1Client_H_ -#define protocol_shoutcast1Client_H_ - -#include "protocol_shoutcastClient.h" -#include - -class streamData; - -class protocol_shoutcast1Client: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_shoutcast1Client::*state_t)(); - state_t m_state; - state_t m_nextState; - - std::vector<__uint8> m_ICYMetadata; // metadata buffer - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - void sendICYMetadata(const uniString::utf8 &md) throw(); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcast1Client"; } - -public: - protocol_shoutcast1Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - virtual ~protocol_shoutcast1Client() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - virtual int doSend(const bool debug, const time_t cur_time, const int autoDumpTime, int adjust = 0) throw(std::runtime_error); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp deleted file mode 100644 index 745f46c9..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp +++ /dev/null @@ -1,568 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "protocol_shoutcast2Client.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "metadata.h" -#include "uvox2Common.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "DST" -#define DEBUG_LOG(...) do { if (gOptions.shoutcast2ClientDebug()) DLOG(__VA_ARGS__); } while(0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) - -protocol_shoutcast2Client::protocol_shoutcast2Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr,const uniString::utf8 &XFF, const bool cdnSlave) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::SHOUTCAST2), m_cdnSlave(cdnSlave) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__, LOGNAME, streamID); - m_state = &protocol_shoutcast2Client::state_AttachToStream; - m_nextState = NULL; -} - -protocol_shoutcast2Client::~protocol_shoutcast2Client() throw() -{ - cleanup("Shoutcast 2", gOptions.shoutcast2ClientDebug(), true); -} - -///////////////////////////////////// W3C Logging ////////////////////////////////////////////// - -// create W3C entry. Entries describe the duration a client has listened to a specific -// title. the entry is generated on a title change, or when the client disconnects -void protocol_shoutcast2Client::logW3C() throw() -{ - if (gOptions.w3cEnable()) - { - vector md; - if (!m_lastMetadata.empty()) - { - // loop through packets and reassemble. Since we put this stuff in there, we don't need to do integrity checks - size_t total_data_size = m_lastMetadata.size(); - for (size_t x = 0; x < total_data_size;) - { - if ((UV2X_OVERHEAD + UV2X_META_HDR_SIZE) > (total_data_size - x)) - { - break; // out of data - } - - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_lastMetadata[x])); - const __uint8 *contents = (const __uint8 *)((&(m_lastMetadata[x])) + UV2X_HDR_SIZE); - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = ntohs(voxHdr->msgLen) - UV2X_META_HDR_SIZE; - - if ((UV2X_OVERHEAD + UV2X_META_HDR_SIZE + metadataContentsSize) > (total_data_size - x)) - { - break; // out of data - } - - md.insert(md.end(), metadataContents,metadataContents + metadataContentsSize); - x += UV2X_OVERHEAD + UV2X_META_HDR_SIZE + metadataContentsSize; - } - } - - utf8 md_s(md.begin(), md.end()); - - // do a sanity check when trying to form the metadata if a uvox 2 connection - // is attempted from an older Winamp client e.g. 5.54 - means a connection - // can be made from the client without it aborting if there's no metadata. - utf8 title; - if (!md_s.empty()) - { - title = metadata::get_song_title_from_3902(md_s); - } - - doLogW3C(title); - } -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcast2Client::timeSlice() throw(exception) -{ - int ret = doTimeSlice(true); - if (ret == 1) - { - m_state = &protocol_shoutcastClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_shoutcast2Client::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_shoutcast2Client::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_shoutcast2Client::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_shoutcast2Client::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("Shoutcast 2", bandWidth::CLIENT_V2_SENT, MSG_HTTP404, - MSG_HTTP404_LEN, &read_bitrate, 0, true)) - { - goto fall_through; - } - - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - // we use this to control the cdn mode so we'll only provide the - // headers needed if it's all enabled and the client asks for it - string cdn; - if (isCDNMaster(m_streamID) && m_cdnSlave) - { - DEBUG_LOG(m_clientLogString + "CDN slave request received by master", LOGNAME, m_streamID); - utf8 authhash = (m_streamData ? m_streamData->streamAuthhash() : ""); - if (yp2::isValidAuthhash(authhash)) - { - utf8 key = XTEA_encipher(authhash.c_str(), authhash.size(), bob().c_str(), bob().size()); - cdn = "cdn-master:1\r\n" - "cdn-token:" + key.hideAsString() + "\r\n"; - m_clientType = ((streamData::source_t)(m_clientType | streamData::SC_CDN_SLAVE)); - } - else - { - DEBUG_LOG(m_clientLogString + "CDN slave request not sent - invalid authhash provided", LOGNAME, m_streamID); - } - } - - const int add = processAdd("FLV", bandWidth::CLIENT_V2_SENT, - MSG_HTTP404, MSG_HTTP404_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - else - { - utf8 pub = "0", genre = ""; - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - if (!isPodcast) - { - pub = (m_streamData ? tos(m_streamData->streamPublic()) : "1"); - if (m_streamData) - { - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - pub = "0"; - } - - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - genre += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - // if running from a backup file then no need to set the states - else - { - pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - pub = "1"; - } - else if (pub == "never") - { - pub = "0"; - } - } - } - else - { - // TODO how do we handle podcasts for 2.x - // as we should somehow swap to 1.x - } - - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse = MSG_UVOX_HTTP200 + - "icy-pub:" + pub + "\r\n" + cdn + - "Ultravox-SID:" + tos(m_streamID) + "\r\n" + - "Ultravox-Bitrate:" + tos(m_streamData ? m_streamData->streamAvgBitrate() : (read_bitrate * 1000)) + "\r\n" + - "Ultravox-Samplerate:" + tos(m_streamData ? m_streamData->streamSampleRate() : 0) + "\r\n" + - "Ultravox-Title:" + title + "\r\n" + - "Ultravox-Genre:" + genre + "\r\n" + - "Ultravox-URL:" + (m_streamData ? m_streamData->streamURL() : (utf8)""/*"TODO"*/) + "\r\n" + - "Ultravox-Max-Msg:" + tos(MAX_PAYLOAD_SIZE) + "\r\n" + - "Ultravox-Class-Type:" + tohex(m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA) + "\r\n" + - (m_streamData && m_streamData->streamIsVBR() ? "Ultravox-VBR:1\r\n" : "") + - (gOptions.clacks() ? "X-Clacks-Overhead:GNU Terry Pratchett\r\n\r\n" : "\r\n"); - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcast2Client::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcast2Client::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("Shoutcast 2"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("Shoutcast 2", bandWidth::CLIENT_V2_SENT, movedUrl, 2); - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - } -} - -void protocol_shoutcast2Client::state_SendCachedMetadata() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - bool playingAlbumArt = false; - - // send intro file if we have it - acquireIntroFile(true); - - // see if there's any albumart and attempt to send stream and then playing or whatever is present - m_cachedMetadata = (m_streamData ? m_streamData->getSc21StreamAlbumArt(0xFFFFFFFF) : streamData::uvoxMetadata_t()); - if (m_cachedMetadata.empty()) - { - m_cachedMetadata = m_streamData->getSc21PlayingAlbumArt(m_readPtr); - playingAlbumArt = true; - } - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = (playingAlbumArt == false ? &protocol_shoutcast2Client::state_SendCachedStreamAlbumArt : &protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt); - } - } -} - -void protocol_shoutcast2Client::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(true); - - m_cachedMetadata = (m_streamData ? m_streamData->getSc21Metadata(m_readPtr) : streamData::uvoxMetadata_t()); - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntro); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = &protocol_shoutcast2Client::state_SendCachedMetadata; - } - - m_result.run(); -} - -void protocol_shoutcast2Client::state_SendCachedStreamAlbumArt() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__ + "sending stream albumart: " + tos(m_outBufferSize) + - " bytes, mime type: " + tos(m_streamData->streamAlbumArtMime())); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - // if all went ok then look to send the playing album art if it is present otherwise do intro / stream data - m_cachedMetadata = m_streamData->getSc21PlayingAlbumArt(m_readPtr); - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = &protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt; - } - } -} - -void protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__ + "sending playing albumart: " + tos(m_outBufferSize) + - " bytes, mime type: " + tos(m_streamData->streamPlayingAlbumArtMime())); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } -} - - -void protocol_shoutcast2Client::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; -} - - -const int protocol_shoutcast2Client::doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& inbuf, - const time_t /*cur_time */, const int, const unsigned int, - int &frames, bool &advert, - bool fill_remainder) throw() -{ - bool mp3; - int end = 0; - - if (streamData::isAllowedType(type, mp3)) - { - int last = min (len, (int)(inbuf.size() - offset)); - const unsigned char *buf; - - if (m_remainder.empty () || offset < last) - { - buf = &inbuf [offset]; - // DLOG ("last " + tos(last) + ", off " + tos(offset)); - } - else - { - const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - size_t cc = min (inbuf.size(), (size_t)len); - - cc = min (cc, (size_t)4096); - if (cc > m_remainder.size()) - cc -= m_remainder.size(); - if (cc < 1 || cc > inbuf.size()) - { - ILOG ("sync2, cc is " + tos (cc)); - abort(); - } - m_remainder.insert (m_remainder.end(), inbuf.begin(), inbuf.begin() + cc); - - buf = &m_remainder [0]; - last = min (len, (int)m_remainder.size()); - fill_remainder = false; - // DLOG ("merged remainder, now " + tos (last) + ", added " + tos(cc)); - } - if (last > 8) - { - int last_size = 0; - //double fps_limit = m_fps*2; - - fill_remainder = false; - - for (int i = 0; (i < last-8) && !iskilled();) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(buf[i])); - const int msgLen = ntohs(voxHdr->msgLen); - const int found = ((voxHdr->sync == UVOX2_SYNC_BYTE) && - (msgLen > UV2X_OVERHEAD) && - (msgLen <= MAX_PAYLOAD_SIZE) ? (msgLen + UV2X_OVERHEAD) : 0); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0)) // && (found <= len)) - { - if (!frames) - { - end = i; - protocol_shoutcastClient::createFrameRate(mp3, (m_streamData ? m_streamData->streamSampleRate() : 0)); - } - - i += (last_size = found); - // only count valid full-size frames - if (i <= last) - { - //const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - - m_output.insert(m_output.end(), buf+end, buf+end+last_size); - end += last_size; - - // we only want to count audio frames and not metadata - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - ++frames; - } - // DLOG ("frame " + tos(m_frameCount+frames) + " (" + tos(found) + ") last " + tos(last) + " end " + tos(end) + " i " + tos(i)); - } - else - { - // DLOG ("EOB, " + tos (i) + ", " + tos(offset) + ", " + tos(inbuf.size())); - if (m_remainder.empty()) - { - if (i+offset > inbuf.size()) - fill_remainder = true; - } - else if (end + offset < inbuf.size()) - fill_remainder = true; - break; - } - } - else - { - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if (i < (len - 8) && ((buf[i]) == 'S') && ((buf[i+1]) == 'C')) - { - if (!memcmp(&buf[i], "SCAdvert", 8)) - { - if (frames == 0) - { - // DLOG ("Found SCAdvert"); - advert = true; - end += 8; - m_remainder.clear(); - } - break; - } - } - else - { - // if we found something but there is not enough - // data in the read buffer then we'll abort asap - if ((found > 0) && (found > len)) - { - break; - } - - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "]", LOGNAME, m_streamID); - } - } - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - ++i; - } - } - } - else - fill_remainder = true; - if (m_remainder.empty() == false && frames) - m_remainder.clear(); - if (fill_remainder) - { - const int remainder = (last - end); - if (remainder > 0) - m_remainder.insert(m_remainder.end(), buf + end, buf + (end + remainder)); - } - } - return (len - end); -} - - -void protocol_shoutcast2Client::setIntro (vector<__uint8> &buf, int uvoxDataType) -{ - m_introFile.clear(); - if (buf.empty()) - return; - streamData::convertRawToUvox (m_introFile, buf, uvoxDataType, 0, 0); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h deleted file mode 100644 index ec89e127..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once -#ifndef protocol_shoutcast2Client_H_ -#define protocol_shoutcast2Client_H_ - -#include "protocol_shoutcastClient.h" -#include - -class streamData; - -class protocol_shoutcast2Client: public protocol_shoutcastClient -{ -private: - typedef void (protocol_shoutcast2Client::*state_t)(); - state_t m_state; - state_t m_nextState; - - /// w3c logging - streamData::uvoxMetadata_t m_lastMetadata; // used for w3C tracking - ///////////////////// - - streamData::uvoxMetadata_t m_cachedMetadata; // cached metadata that must be sent at connect time - - const bool m_cdnSlave; // based on the connection header - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendCachedMetadata() throw(std::exception); - void state_SendCachedStreamAlbumArt() throw(std::exception); - void state_SendCachedPlayingAlbumArt() throw(std::exception); - - void logW3C() throw(); - const int doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, const bool fill_remainder = false) throw(); - - virtual void timeSlice() throw(std::exception); - virtual void setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcast2Client"; } - -public: - protocol_shoutcast2Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID,const uniString::utf8 &hostName, const uniString::utf8 &addr,const uniString::utf8 &XFF, const bool cdnSlave); - virtual ~protocol_shoutcast2Client() throw(); - - virtual void setIntro(vector<__uint8> &v, int uvoxDataType); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp deleted file mode 100644 index 97b0427c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp +++ /dev/null @@ -1,1917 +0,0 @@ -#ifdef _WIN32 -#include -#ifndef MSG_DONTWAIT -#define MSG_DONTWAIT 0 -#endif -#endif -#include -#include "protocol_shoutcastClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "metrics.h" -#include "auth.h" -#include "yp2.h" -#include "FLV.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "DST" -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) - -protocol_shoutcastClient::protocol_shoutcastClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, const streamData::source_t clientType) - - : runnable (hs), m_streamID(streamID <= 0 || streamID > INT_MAX ? DEFAULT_CLIENT_STREAM_ID : streamID), - m_unique(stats::getNewClientId()), m_adAccess(clientType == streamData::SHOUTCAST2) -{ - m_newListener = m_timerStart = (time_t)0; - m_timerFrames = m_frameLimit = m_frameCount = 0; - m_fps = 0.0; - m_bytesSentForCurrentTitle = m_totalBytesSent = 0; - m_metaIntervalCounter = m_backupLoopTries = m_outBufferSize = 0; - m_backupFileOffset = m_introFileOffset = 0; - m_readPtr = 0; - m_outBuffer = NULL; - m_streamData = NULL; - m_kickNextRound = m_ignoreDisconnect = false; - m_lagOffset = 0; - setGroup (m_unique); - - m_headRequest = (hs.m_httpRequestInfo.m_request == protocol_HTTPStyle::HTTP_HEAD); - m_clientType = streamData::getClientType (clientType, stringUtil::toLower (hs.m_userAgent)); // double toLower work ?? - m_removeClientFromStats = (isUserAgentOfficial (stringUtil::toLower (hs.m_userAgent)) == false); - - if (gOptions.useXFF() && !XFF.empty() && metrics::metrics_verifyDestIP (gOptions, true, XFF).empty() == false) - m_clientAddr = XFF; - else - m_clientAddr = clientAddr; - m_clientLogString = dstAddrLogString (hostName, hs.m_clientPort, XFF, streamID); - - m_clientHostName = hostName; - - m_metaInterval = gOptions.getMetaInterval (streamID); - m_userAgent = hs.m_userAgent; - m_referer = hs.m_referer; - m_XFF = XFF; - m_startTime = m_lastTitleTime = ::time(NULL); -} - - -// setup tracking variables for W3C log -void protocol_shoutcastClient::setW3CState() throw() -{ - m_lastTitleTime = ::time(NULL); - m_bytesSentForCurrentTitle = 0; -} - -int protocol_shoutcastClient::detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error) -{ - const int autoDumpTime = gOptions.getAutoDumpTime(streamID); - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - if (m_ignoreDisconnect == false) - DLOG (msg, LOGNAME, streamID); - throwEx(""); - } - return autoDumpTime; -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcastClient::acquireIntroFile(const bool sc2) throw() -{ - // if we've already loaded something then we won't keep - // trying to re-acquire it for speed and consistency - // whilst this specific client is connected at the time - if (m_streamData && m_introFile.empty()) - { - if (!sc2) - { - m_streamData->getIntroFile().getSc1Data(m_introFile); - } - else - { - m_streamData->getIntroFile().getSc2Data(m_introFile); - } - } - - m_introFileOffset = 0; -} - -int protocol_shoutcastClient::acquireBackupFile(int *dataType, const bool sc2) throw() -{ - int read_bitrate = 0; - // if we've already loaded something then we won't keep - // trying to re-acquire it for speed and consistency - // whilst this specific client is connected at the time - if (m_backupFile.empty()) - { - if (m_streamData) - { - if (!sc2) - { - m_streamData->getBackupFile().getSc1Data(m_backupFile); - } - else - { - m_streamData->getBackupFile().getSc2Data(m_backupFile); - } - - m_streamData->streamSampleRate(); - } - else - { - // for when there is no stream, we'll manually load the - // file and try to do what we can to get it running... - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - - if (!backupFile.empty()) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - int streamBitrate = gOptions.stream_maxBitrate(m_streamID); - if (!gOptions.read_stream_maxBitrate(m_streamID) || !streamBitrate) - { - streamBitrate = gOptions.maxBitrate(); - } - if (streamBitrate) - { - streamBitrate /= 1000; - } - - unsigned int read_samplerate = 0; - const int type = ((toLower(backupFile).rfind(utf8(".aac")) == (backupFile.size() - 4)) ? AACP_DATA : MP3_DATA); - streamData::specialFileData loadBackupFile((backuploop == 1 ? "podcast" : "backup")); - read_bitrate = loadBackupFile.loadFromFile(backupFile, streamBitrate, type, read_samplerate, m_clientLogString); - if (!sc2) - { - loadBackupFile.getSc1Data(m_backupFile); - } - else - { - loadBackupFile.getSc2Data(m_backupFile); - } - if (dataType) - { - *dataType = type; - createFrameRate ((type==MP3_DATA), loadBackupFile.m_samplerate); - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFile.clear(); - } - } - } - } - - m_backupFileOffset = 0; - - return read_bitrate; -} - -const int protocol_shoutcastClient::doTimeSlice(const bool sc2) throw(exception) -{ - int listenerTime = (int)gOptions.stream_listenerTime(m_streamID); - if (!gOptions.read_stream_listenerTime(m_streamID)) - { - listenerTime = (int)gOptions.listenerTime(); - } - - listenerTime *= 60; // convert to seconds - const bool timesUp = listenerTime && ((::time(NULL) - m_startTime) > listenerTime); - if (m_kickNextRound || timesUp || (m_streamData && m_streamData->isDead() && m_backupFile.empty())) - { - if (timesUp) - { - ILOG(m_clientLogString + "Listener time exceeded.", LOGNAME, m_streamID); - } - else if (m_kickNextRound) - { - ILOG(m_clientLogString + "Kicked [Agent: `" + m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - } - else - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile(0, sc2); - if (!m_backupFile.empty()) - { - ++m_backupLoopTries; - m_lastActivityTime = ::time(NULL); - return 1; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - } - - m_result.done(); - return 2; - } - - return 0; -} - -const bool protocol_shoutcastClient::sendText() throw(exception) -{ - return sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString); -} - -void protocol_shoutcastClient::resetCommon() throw() -{ - if (m_newListener == 0) - { - time_t now = ::time (NULL); - if (m_removeClientFromStats && m_streamData && m_streamData->streamPublic()) - { - if (m_startTime + 3 < now) - { - metrics::metrics_listener_new(*this); - m_streamData->advertGroups.attachGroupQueue (this->m_adAccess); - m_newListener = now; - } - } - else - m_newListener = now; - } - if (m_streamData) - m_adAccess.changedGroup (m_streamData->advertGroups); -} - -// set read pointer to a nice distance from the write pointer. Return that distance -const streamData::ringBufferAccess_t protocol_shoutcastClient::resetReadPtr(std::vector<__uint8>& data, const bool sc2) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DLOG(m_clientLogString + __FUNCTION__); -#endif - - // we also reset the remainder handling as - // by this point, it's unlikely that it's - // worth trying to keep up and so we reset - m_remainder.clear(); - - m_lagOffset = 0; - if (m_streamData) - { - m_readPtr = m_streamData->getClientStartPosition(sc2); - streamData::ringBufferAccess_t amt = 0; - return m_streamData->getStreamData(amt, m_readPtr, data, 0, sc2); - } - else - { - m_readPtr = 0; - return 0; - } -} - -void protocol_shoutcastClient::resetReadPtr(const bool sc2) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DLOG(m_clientLogString + __FUNCTION__); -#endif - - // we also reset the remainder handling as - // by this point, it's unlikely that it's - // worth trying to keep up and so we reset - m_remainder.clear(); - - if (m_streamData == NULL) - { - m_readPtr = 0; - return; - } - m_lagOffset = 0; - if (m_adAccess.inAdvertMode ()) - { - const streamData::adTrigger *t = m_adAccess.getCurrentTrigger(); - streamData::ringBufferAccess_t ptr; - - if (t) - ptr = sc2 ? t->m_returnPtrSC2 : t->m_returnPtrSC1; - else - { - ptr = sc2 ? m_streamData->advertGroups.m_returnPtrSC2 : m_streamData->advertGroups.m_returnPtrSC1; - if (!ptr) - ptr = (sc2 ? m_streamData->m_sc21_packet_starts : m_streamData->m_sc1_packet_starts).back(); - } - streamData::ringBufferAccess_t lag = ((sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr); - - if (lag < (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data.size()) - m_lagOffset = (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr; - else - { - ptr = (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr; - m_lagOffset = 0; - } - - m_readPtr = m_streamData->getClientStartPosition (ptr, sc2); - // DLOG ("lag offset is " + tos (m_lagOffset) + " readptr " + tos (m_readPtr)); - } - else if (m_totalBytesSent > 30000) - { - std::deque &starts = (sc2 ? m_streamData->m_sc21_packet_starts : m_streamData->m_sc1_packet_starts); - if (starts.size()) - m_readPtr = m_streamData->getClientStartPosition (starts.back(), sc2); - else - m_readPtr = 0; - } - else - m_readPtr = m_streamData->getClientStartPosition(sc2); -} - - -void protocol_shoutcastClient::resetReadPtr (streamData::ringBufferAccess_t ptr, bool sc2) throw() -{ - m_readPtr = (m_streamData ? m_streamData->getClientStartPosition (ptr, sc2) : 0); - m_lagOffset = 0; -} - - -const __uint64 protocol_shoutcastClient::calculateFrameLimit(const time_t cur_time) -{ - // to allow for a burst on joining the stream for listener pre-buffering - // and stuff, we're trying to give an ~5sec of data before we rate limit - // without such handling then a number of listeners stutter at the start - if (gOptions.rateLimit()) - { - time_t conn; - - if (m_timerStart) - { - conn = (cur_time ? cur_time : ::time(NULL)) - m_timerStart; - float fps = conn > 0 ? ((m_timerFrames) / (float)conn) : 0; - //DLOG ("ad rate values are " + tos (conn) + " TF " + tos((long)m_timerFrames)); - if (fps > m_fps) - { - //DLOG ("rate in calc is " + tos (fps)); - return 0; // cause a stall - } - } - } - // just to make sure something is returned then we'll - // take the current number of frames and adjust by the - // intended rate. much better than returning zero rate - return (__uint64)(m_frameCount + m_fps); -} - -void protocol_shoutcastClient::updateFrameCount(const int frames, const time_t) -{ - if (m_timerStart) - m_timerFrames += frames; - m_frameCount += frames; -} - -const bool protocol_shoutcastClient::calculateDelay(const int autoDumpTime) -{ - bool delayed = false; - const double diff = ((m_frameCount * 1.0) / (max((time_t)1, (m_lastActivityTime - m_startTime))) - m_fps); - if (diff >= 0.0) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - // determine things based on the 'next' second when working out - // the differential as that's how long we want to wait to run - m_result.schedule((int)(m_result.m_currentTime - (__uint64)(m_lastActivityTime * 1000))); - delayed = true; - } - - m_result.write(); - if (autoDumpTime != -1) - { - m_result.timeout(autoDumpTime); - } - else - { - m_result.timeoutSID(m_streamID); - } - return delayed; -} - - -int protocol_shoutcastClient::doSend(const bool debug, const time_t cur_time, - const int autoDumpTime, int adjust) throw(runtime_error) -{ - int l = (adjust ? adjust : (int)m_output.size()), rval = -1; - if (l == 0) return 0; - if (l > 0) - { - if (!gOptions.forceShortSends()) - { - rval = send ((const char*)&m_output[0], l, 0); - } - else - { - static unsigned int v = 0; - if (((++v) % 7) == 0) - { - char ch = 0; - rval = ::recv(m_socket, &ch, 1, MSG_DONTWAIT | MSG_PEEK); - l = 1; - } - else - { - rval = send ((const char*)&m_output[0], l, 0); - } - } - } - if (rval > 0) - { - m_totalBytesSent += rval; - if (rval < l) - m_result.timeout (0,100); - else - m_result.timeout (0,10); - return rval; - } - - if (rval == 0) - { - if (!m_ignoreDisconnect && debug) - ELOG (m_clientLogString + "Remote socket closed while sending data.", LOGNAME, m_streamID); - throwEx(""); - } - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - if (debug && ( -#ifdef _WIN32 - (rval == WSAECONNABORTED) || (rval == WSAECONNRESET) -#else - (rval == ECONNABORTED) || (rval == ECONNRESET) || (rval == EPIPE) -#endif - )) - DLOG (m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval), LOGNAME, m_streamID); - throwEx(""); - } - - m_result.schedule(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - - rval = 0; - } - return rval; -} - -void protocol_shoutcastClient::checkListenerIsValid(const bool debug) throw(std::runtime_error) -{ - char ch = 0; - int rval = ::recv(m_socket, &ch, 1, MSG_DONTWAIT | MSG_PEEK); - if (rval == 0) - { - throwEx((!m_ignoreDisconnect && debug ? (m_clientLogString + - "Remote socket closed while sending data.") : (utf8)"")); - } - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx((debug ? ((( - #ifdef _WIN32 - (rval == WSAECONNABORTED) || (rval == WSAECONNRESET) - #else - (rval == ECONNABORTED) || (rval == ECONNRESET) || (rval == EPIPE) - #endif - ) ? (utf8)"" : m_clientLogString + - "Socket error while waiting to send data. " + - socketErrString(rval))) : (utf8)"")); - } - } -} - -const utf8 protocol_shoutcastClient::getContainer() const -{ - return ((m_clientType & streamData::FLV) ? "video/x-flv" : - ((m_clientType & streamData::M4A) ? "audio/mp4" : - ((m_clientType & streamData::SHOUTCAST2) ? "misc/ultravox" : ""))); -} - -void protocol_shoutcastClient::authForStream(streamData *_sd) -{ - streamData *sd = (_sd ? _sd : streamData::accessStream(m_streamID)); - if (sd) - { - if (!sd->radionomyID().empty() && sd->streamAdvertMode()) - { - httpHeaderMap_t vars; - auth::auth_info *info = new auth::auth_info(); - const streamData::streamInfo &stream = sd->getInfo(); - - vars["action"] = "listener_add"; - vars["tstamp"] = tos(::time(NULL)); - vars["host"] = sd->streamPublicIP(); - vars["radionomyid"] = vars["ref"] = sd->radionomyID(); - vars["id"] = tos(m_unique); - vars["ip"] = m_clientAddr; - vars["srvid"] = stream.m_serverID; - if (m_queryParams.empty()) - vars["mount"] = getStreamPath (m_streamID); - else - vars["mount"] = getStreamPath (m_streamID) + "?" + m_queryParams; - - vars["agent"] = m_userAgent; - vars["referer"] = m_referer; - vars["bitrate"] = tos(sd->streamBitrate()); - vars["codec"] = sd->streamContentType(); - vars["contr"] = getContainer(); - info->m_dataType = sd->streamUvoxDataType(); - if (!_sd) - { - sd->releaseStream(); - } - - info->post = encodeVariables(vars); - info->client = this; - info->sid = m_streamID; - - if (_sd) - { - info->delayed_auth = true; - info->group = 0; - } - auth::schedule(info); - return; - } - - if (!_sd) - { - sd->releaseStream(); - } - } - - if (!_sd) - { - // if we need to auth after the listener - // joined the stream due to DNAS / stream - // start-up then we don't want to re-add - threadedRunner::scheduleRunnable(this); - } -} - -void protocol_shoutcastClient::return_403() -{ - m_outBuffer = (const utf8::value_type*)"HTTP/1.1 403 Forbidden\r\n" - "Connection:close\r\n\r\n"; - m_outBufferSize = 44; - m_lastActivityTime = ::time(NULL); -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_shoutcastClient::doLogW3C(const utf8 &title) throw() -{ - if (gOptions.w3cEnable()) - { - time_t durationOfTitle = (::time(NULL) - m_lastTitleTime); - w3cLog::log(m_streamID, m_clientAddr, m_clientHostName, title, - m_userAgent, m_bytesSentForCurrentTitle, durationOfTitle, - (int)(durationOfTitle ? (8 * m_bytesSentForCurrentTitle) / durationOfTitle : 0)); - - setW3CState(); - } -} - -#if 0 -const bool protocol_shoutcastClient::handleNoData(const utf8 &logString, const int remainder, - const streamData::ringBufferAccess_t amt, - const int autoDumpTime, const time_t cur_time, - const bool sc2) -{ - // nothing in the source - // if the source has gone away, and we have a backup file, send it. - bool sendBackupFile = false, ret = false; - if (!streamData::isSourceConnected(m_streamID)) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - acquireBackupFile(0, sc2); - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFile.clear(); - } - sendBackupFile = !m_backupFile.empty(); - - if (sendBackupFile && backuploop && (m_backupLoopTries > backuploop)) - { - // clear trying to play the backup - sendBackupFile = false; - m_backupFile.clear(); - } - } - else - { - // if we're here then we'll have tried to do something - // but are very likely are not able to due to being at - // the frame rate limit or we're not able to send yet - // but we need to move the readPtr on if anything was - // read was well as then making sure that we maintain - // the remainder otherwise we can gltich on playback. - if (amt > 0) - { - m_readPtr += amt; - } - - if (!remainder) - { - m_remainder.clear(); - } - - // if we're starting and we're not able to correctly - // sync to the stream then this will abort otherwise - // we can potentially sit and spin which isn't good. - if (!m_frameCount && (remainder > 0) && (remainder == (int)amt)) - { - m_ignoreDisconnect = true; - ELOG(m_clientLogString + logString + " client connection closed. Unable to sync to the stream (" + - tos(::time(NULL) - m_startTime).c_str() + " seconds)" + " Agent: `" + m_userAgent + "', UID: " + - tos(m_unique) + ", GRID: " + tos(getGroup()) + " [amt=" + tos(amt) + ", rem=" + tos(remainder) + "]"); - m_result.done(); // state_Close - m_result.write(); - m_result.timeout(autoDumpTime); - } - } - - if (sendBackupFile) - { - // we also reset the remainder handling as - // there is no need to send the remainder. - m_remainder.clear(); - // this is to clear up things with the stream - // as we can otherwise be in a weird state if - // the source then later returns and we have - // a listener still present via backup mode. - if (m_streamData) - { - m_streamData->releaseStream(); - m_streamData = 0; - } - ++m_backupLoopTries; - ret = true; // state_SendBackupFile - m_result.run(); - } - else - { - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.read(m_limitTrigger.test()); - if (m_streamData) - { - m_streamData->scheduleLimitTrigger(&m_limitTrigger, m_readPtr, sc2); - } - else - { - m_result.done(); // state_Close - m_result.write(); - m_result.timeout(autoDumpTime); - } - } - - return ret; -} -#endif - -void protocol_shoutcastClient::createFrameRate(const bool mp3, const int samplerate) -{ - // now we have some stream data we can create - // a fps for this which we'll assume standard - // rates if not all of the info is available. - // this is mainly for AAC where we assume a - // 44.1kHz samplerate (~43.06 fps) as default - if (!m_fps) - { - m_fps = (mp3 ? 1000.0 / 26 : ((1.0 / (1024.0 / (samplerate > 0 ? samplerate : 44100))))); - } -} - -void protocol_shoutcastClient::setupWorkingBuffer(const std::vector<__uint8>& data, std::vector<__uint8>& tempBuf, int& len) throw() -{ - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if (!m_remainder.empty() && ((len + m_remainder.size()) <= (BUF_SIZE * 4))) - { - tempBuf = m_remainder; - tempBuf.insert(tempBuf.end(), data.begin(), data.end()); - len += (int)m_remainder.size(); - } - else if (len > 0) - { - tempBuf = data; - } - m_remainder.clear(); -} - -#if 0 -const int protocol_shoutcastClient::doUvoxFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, int &frames, bool &advert, - const bool fill_remainder) throw() -{ - bool mp3; - if (streamData::isAllowedType(type, mp3)) - { - if (!m_shortSend.empty()) - { - m_output.insert(m_output.end(), m_shortSend.begin(), m_shortSend.end()); - m_shortSend.clear(); - - if (!fill_remainder) - { - // for intro / backup / advert then it's - // better to just send what was left and - // then look at processing new when this - // is empty else it'll duplicate output. - return 0; - } - } - - int end = 0; - if ((len > 8) && !buf.empty()) - { - int last_size = 0; - for (int i = 0; (i < (len - 8)) && !iskilled();) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(buf[i + offset])); - const int msgLen = ntohs(voxHdr->msgLen); - const int found = ((voxHdr->sync == UVOX2_SYNC_BYTE) && - (msgLen > UV2X_OVERHEAD) && - (msgLen <= MAX_PAYLOAD_SIZE) ? (msgLen + UV2X_OVERHEAD) : 0); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0) && (found <= len)) - { - if (!frames) - { - end = (i + offset); - protocol_shoutcastClient::createFrameRate(mp3, (m_streamData ? m_streamData->streamSampleRate() : 0)); - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= len) - { - if (advert) - { - // skip over the advert trigger - end += 8; - } - - const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_output.insert(m_output.end(), pos + end, pos + (end + last_size)); - end += last_size; - - // we only want to count audio frames and not metadata - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - ++frames; - } - - // we use this to help clamp to the desired frame - // rate as well as not sending anything else asap - if (advert || (gOptions.rateLimit() ? (frames > m_fps) || - ((m_frameCount + frames) > calculateFrameLimit(cur_time)) : 0)) - { - break; - } - } - } - else - { - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if ((i <= len + 8) && ((buf[i + offset]) == 'S') && ((buf[i + offset + 1]) == 'C')) - { - if (!memcmp(&buf[i + offset], "SCAdvert", 8)) - { - advert = true; - i += 8; - } - else - { - ++i; - } - } - else - { - // if we found something but there is not enough - // data in the read buffer then we'll abort asap - if ((found > 0) && (found > len)) - { - break; - } - - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "]"); - } - - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - ++i; - } - } - } - } - - if (fill_remainder && !buf.empty()) - { - const int remainder = (len - end); - if (remainder > 0) - { - const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_remainder.insert(m_remainder.end(), pos + end, pos + (end + remainder)); - } - return remainder; - } - } - return 0; -} -#endif - - -const int protocol_shoutcastClient::doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& inbuf, - const time_t /*cur_time*/, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, bool fill_remainder) throw() -{ - bool mp3; - int end = 0; - bool VBR = m_streamData ? m_streamData->streamIsVBR() : false; - - if (streamData::isAllowedType(type, mp3)) - { - int last = min (len, (int)(inbuf.size() - offset)); - const unsigned char *buf; - - if (m_remainder.empty () || offset < last) - { - buf = &inbuf [offset]; - //DLOG ("last " + tos(last) + ", off " + tos(offset)); - } - else - { - // const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - size_t cc = min (inbuf.size(), (size_t)len); - - cc = min (cc, (size_t)4096); - if (cc > m_remainder.size()) - cc -= m_remainder.size(); - if (cc < 1 || cc > inbuf.size()) - { - ILOG ("sync, cc is " + tos(cc)); - abort(); - } - m_remainder.insert (m_remainder.end(), inbuf.begin(), inbuf.begin() + cc); - - buf = &m_remainder [0]; - last = min (len, (int)m_remainder.size()); - fill_remainder = false; - // DLOG ("merged remainder, len " + tos(len) + " now " + tos (last) + ", added " + tos(cc)); - } - - if (last > 8) - { - int last_size = 0; - bool report_frame_settings = m_streamData ? true : false; - - fill_remainder = false; - - for (int i = 0; (i < last-8) && !iskilled();) - { - unsigned int read_samplerate = 0; - int read_bitrate = bitrate; - //const char* f = (const char *)&(buf[(i + offset)]); - const int found = (mp3 ? getMP3FrameInfo ((char*)buf+i, &read_samplerate, &read_bitrate) : - getADTSFrameInfo ((char*)buf+i, &read_samplerate)); - - if (found > len) // do we need more - break; - if (found > 0) - { - bool bitrate_odd = (VBR || (read_bitrate == 0 || read_bitrate == bitrate)) ? false : true; - bool srate_odd = (samplerate == 0 || samplerate == read_samplerate) ? false : true; - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if (report_frame_settings && (bitrate_odd || srate_odd)) - { - utf8 msg = m_clientLogString + "Frame settings changed, could cause playback problems:"; - if (bitrate_odd) - { - msg += " bitrate " + tos(read_bitrate) + "(" + tos(bitrate) + ")"; - m_streamData->m_streamInfo.m_streamBitrate = read_bitrate; - } - if (srate_odd) - { - msg += " samplerate " + tos(read_samplerate) + "(" + tos(samplerate) + ")"; - } - WLOG (msg, LOGNAME, m_streamID); - protocol_shoutcastClient::createFrameRate(mp3, read_samplerate); - report_frame_settings = false; - } - if (!frames) - { - end = i; - protocol_shoutcastClient::createFrameRate(mp3, read_samplerate); - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= last) - { - processFrame (type, buf + end, last_size); - ++frames; - end += last_size; - if (m_output.size() > SEND_SIZE) - break; - } - else - { - // DLOG ("EOB, " + tos (i) + ", " + tos(offset) + ", " + tos(inbuf.size())); - if (m_remainder.empty()) - { - if (i+offset > inbuf.size()) - fill_remainder = true; - } - else if (end + offset < inbuf.size()) - fill_remainder = true; - break; - } - continue; - } - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if (i < (len - 8) && ((buf[i]) == 'S') && ((buf[i+1]) == 'C')) - { - if (!memcmp(&buf[i], "SCAdvert", 8)) - { - if (frames == 0) - { - // DLOG ("Found SCAdvert"); - advert = true; - end += 8; - m_remainder.clear(); - } - break; - } - } - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "], " + - tos(read_bitrate) + "(" + tos(bitrate) + "), " + - tos(read_samplerate) + "(" + tos(samplerate) + ")", LOGNAME, m_streamID); - } - // looking for what is a valid starting frame - ++i; - } - } - else - fill_remainder = true; - - if (m_remainder.empty() == false) - { - if (last < m_remainder.size()) - fill_remainder = false; - if (frames) - m_remainder.clear(); - } - if (last < (inbuf.size() - offset)) - fill_remainder = false; - - if (fill_remainder) - { - const int remainder = (last - end); - if (remainder > 0) - m_remainder.insert(m_remainder.end(), buf + end, buf + (end + remainder)); - } - } - return (len - end); -} - - -void protocol_shoutcastClient::processFrame (int, const unsigned char *buf, unsigned int len) -{ - //#define USE_CHUNKED -#ifdef USE_CHUNKED - const utf8 chunked_start (tohex(len) + "\r\n"), chunked_end("\r\n"); - m_output->insert (m_output->end(), chunked_start.begin(), chunked_start.end()); -#endif - //const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_output.insert (m_output.end(), buf, buf + len); -#ifdef USE_CHUNKED - m_output.insert (m_output.end(), chunked_end.begin(), chunked_end.end()); -#endif -} - - -const int protocol_shoutcastClient::addClient() -{ - size_t stream_id = (gOptions.read_stream_ripFile(m_streamID) && !gOptions.stream_ripFile(m_streamID).empty()) ? m_streamID : 0; - - return stats::addClient (m_streamID, m_clientHostName, m_clientAddr, m_userAgent, - g_ripList.find (m_clientAddr, stream_id), m_unique, this); -} - - -void protocol_shoutcastClient::reportNewListener(const utf8 &logString) -{ - if (!logString.empty() && gOptions.logClients()) - { - if (m_removeClientFromStats) - { - // setGroup (500); - // ILOG(m_clientLogString + logString + " client connection accepted. User-Agent: `" + - // m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()), LOGNAME, m_streamID); - utf8 s = m_clientLogString + logString + " client connection accepted. User-Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()); - ILOG (s, LOGNAME, m_streamID); - } - else - { - m_ignoreDisconnect = true; - } - } -} - -void protocol_shoutcastClient::reportStopListener() -{ - if (m_removeClientFromStats && m_streamData && m_streamData->streamPublic()) - { - metrics::metrics_listener_drop(*this); - } -} - -const bool protocol_shoutcastClient::processAdvertTrigger(const bool advert) -{ - if (advert && m_streamData) - { - // check if we've got an advert trigger and if the stream is either - // public or it is private but the DNAS is running in any CDN mode. - if ((m_streamData->m_streamInfo.m_streamPublic || - (!gOptions.cdn().empty())) && - // if a CDN slave then we're ok to send the stream but we don't - // want to be sending the adverts to it as those should instead - // be actioned on the slave's ->listener handling and not here. - !isCDNSlave(m_streamID)) - { - // DLOG ("in trigger with g " + tos(m_group)); - if ((getGroup() > 0) || m_streamData->m_adTest) - { - if (m_adAccess.haveAdverts(m_streamID, m_streamData->advertGroups, m_readPtr)) - { - time_t now = ::time(NULL); - ILOG(m_clientLogString + "Transitioning to advert(s) [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - m_lastActivityTime = now; - stats::updateTriggers(m_streamID, m_unique); - m_adAccess.total_processed = 0; - m_adAccess.start_time = now; - m_remainder.clear(); - m_result.schedule(60); - m_result.timeoutSID(m_streamID); - return true; - } - else - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(m_streamID) + "] Advert trigger detected - no advert(s) available " - "[Agent: `" + m_userAgent + "', UID: " + tos(m_unique) + ", Group: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - } - } - } - } - return false; -} - -const utf8 protocol_shoutcastClient::fixICYMetadata(utf8 metadata) -{ - // we use this to provide a nicer title to clients when the advert update occurs - // for detected relays, we will skip over the filtering so it will be relayed on - if (!metadata.empty() && !(((streamData::source_t)(m_clientType & streamData::RELAY))) && - !metadata.find(utf8("StreamTitle='Advert:")) && !metadata.find(utf8("StreamTitle='Advert!"))) - { - // got a first matching block - metadata = metadata.replace(13, 7, (utf8)""); - - // look for an end block - utf8::size_type pos = metadata.find(utf8("Advert:")); - if (pos != utf8::npos) - { - metadata = metadata.replace(pos, 7, (utf8)""); - } - metadata = stripWhitespace(metadata); - } - return metadata; -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_shoutcastClient::logW3C() throw() -{ - utf8 title; - if (!m_lastSentMetadata.empty()) - { - utf8::size_type p1 = m_lastSentMetadata.find(utf8("itle='")); - if (p1 != utf8::npos) - { - p1 += 6; - utf8::size_type p2 = m_lastSentMetadata.find(utf8("';"),p1); - if (p2 != utf8::npos) - { - title = m_lastSentMetadata.substr(p1, p2 - p1); - } - } - } - doLogW3C(title); -} - -void protocol_shoutcastClient::processTitleW3C() throw() -{ - if (gOptions.w3cEnable()) // put inside this if block, because this can slow us down a bit - { - if (m_metaIntervalCounter >= m_metaInterval) - { - m_metaIntervalCounter = 0; - const utf8 metadata = fixICYMetadata((m_streamData ? m_streamData->getSc1Metadata(m_readPtr).m_songTitle : "")); - if (m_lastSentMetadata != metadata) - { - logW3C(); - m_lastSentMetadata = metadata; - } - } - } -} - -void protocol_shoutcastClient::streamMovedOrRejected(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &serverUrl, const int mode) throw() -{ - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - if (!mode) - { - m_outBuffer = MSG_HTTP503; - bandWidth::updateAmount(type, (m_outBufferSize = MSG_HTTP503_LEN)); - } - else - { - const utf8::size_type check = (!serverUrl.empty() ? serverUrl.find(utf8("://")) : 0); - if (check == utf8::npos) - { - m_OKResponse = http302("http://" + serverUrl); - } - else - { - m_OKResponse = http302(serverUrl); - } - - m_OKResponse = http302(serverUrl); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = (int)m_OKResponse.size())); - } - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - switch (mode) - { - case 0: - { - ELOG(m_clientLogString + logString + " client connection " - "rejected. Max users reached. Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - case 1: - { - WLOG(m_clientLogString + logString + " client connection rejected. Max users " - "reached. Redirecting to " + serverUrl + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - case 2: - { - WLOG(m_clientLogString + logString + " client connection rejected. Stream has " - "moved. Redirecting to " + serverUrl + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - } - } - - m_result.run(); - m_result.write(); - m_result.timeoutSID(m_streamID); -} - -void protocol_shoutcastClient::cleanup(const utf8 &logString, const bool debug, const bool , const bool altLog) throw(exception) -{ - if (debug) - { - DLOG(m_clientLogString + logString + " " + __FUNCTION__, LOGNAME, m_streamID); - } - - try - { - if (gOptions.logClients() && !m_ignoreDisconnect) - { - ILOG(m_clientLogString + logString + " client connection closed (" + - tos(::time(NULL) - m_startTime).c_str() + " seconds)" + " [Bytes: " + - tos(m_totalBytesSent).c_str() + "] Agent: `" + m_userAgent + - "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()), LOGNAME, m_streamID); - } - - if (m_removeClientFromStats) - { - stats::removeClient(m_streamID, m_unique); - // create W3C entry. Entries describe the duration a client has listened to a specific title. - // the entry is generated on a title change, or when the client disconnects - if (!altLog) - { - logW3C(); - } - else - { - doLogW3C(); - } - } - - if (m_streamData) - { - releaseAdvert(); - m_streamData->advertGroups.detachGroupQueue (m_adAccess); - - reportStopListener(); - - m_streamData->releaseStream(); - m_streamData = 0; - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - } -} - -const int protocol_shoutcastClient::processAdd(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &msg, const int msgLen, const utf8 &movedUrl, - const utf8 &serverUrl) throw() -{ - // if we've got a HEAD request then we need to just force things through - const int add = (!m_headRequest ? addClient() : 1); - if (add != 1) - { - if (!add) - { - utf8 backup_server = (m_streamData ? m_streamData->streamBackupServer() : ""); - if (backup_server.empty()) - { - streamMovedOrRejected(logString, type, movedUrl, 0); - } - else - { - streamMovedOrRejected(logString, type, serverUrl, 1); - } - } - else - { - m_outBuffer = msg.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = msgLen)); - - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - const bool missing = (add == -1); - ELOG(m_clientLogString + logString + " client connection rejected. " - "Client connection " + (missing ? "missing a" : "from a banned") + - " user-agent" + (missing ? "." : ": `" + m_userAgent + "'"), LOGNAME, m_streamID); - } - } - } - return add; -} - -const bool protocol_shoutcastClient::processReject(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &msg, const int msgLen, int *read_bitrate, - int *dataType, const bool sc2) throw() -{ - m_outBuffer = msg.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = msgLen)); - - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - if (gOptions.logClients()) - { - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (m_removeClientFromStats) - { - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - *read_bitrate = acquireBackupFile(dataType, sc2); - if (!m_backupFile.empty()) - { - m_ignoreDisconnect = false; - return true;//goto fall_through; - } - else - { - ELOG(m_clientLogString + logString + " client connection rejected. " + - (!iskilled() ? "Stream not available as there is no source connected" : - "Server is shutting down") + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected(logString, type, movedUrl, 2); - } - } - } - return false; -} - - -void protocol_shoutcastClient::state_SendIntroFile() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // DLOG(m_clientLogString + __FUNCTION__); -#endif - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - resetCommon(); - - time_t cur_time; - const bool debug = gOptions.HTTPClientDebug(); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - m_timerStart = cur_time - 10; // prime the rate regulation - m_timerFrames = (__uint64)m_fps * 10; - time_t conn = ::time(NULL) - m_startTime; - if (conn >= 0 && conn < 3) - m_timerStart -= (3 - conn); - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(150); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - //DLOG ("Limited at " + tos(m_frameCount)); - - return; - } - int amt = (int)(m_introFile.size() - m_introFileOffset); - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_introFile.resize(0); - m_introFileOffset = 0; - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); - m_result.run(); - } - else if (amt > 0) - { - checkListenerIsValid(debug); - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - if (m_output.size() < 2000) - { - int rval = doFrameSync(m_streamData->streamUvoxDataType(), debug, - len, m_introFileOffset, m_introFile, - cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), frames, advert); - m_introFileOffset += (len - rval); - //DLOG ("offset now " + tos (m_introFileOffset)); - updateFrameCount(frames, cur_time); - } - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - if (rval < m_output.size()) - { - //DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.write(); - return; - } - m_output.clear(); - } - m_result.schedule(20); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - } -} - - -void protocol_shoutcastClient::state_SendIntro() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // AD_DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - setCallback (&protocol_shoutcastClient::state_Stream); - } - else - { - setCallback (&protocol_shoutcastClient::state_SendIntroFile); - } - } -} - - -void protocol_shoutcastClient::state_Stream() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - //DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - const time_t cur_time = ::time(NULL); - const bool debug = gOptions.shoutcast1ClientDebug(); - const int autoDumpTime = gOptions.getAutoDumpTime(m_streamID); // don't want this value to change during this call - int remain = autoDumpTime - (int)(cur_time - m_lastActivityTime); - - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - throwEx((!m_ignoreDisconnect && debug ? - (m_clientLogString + "Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + - tos(cur_time - m_lastActivityTime) + "] )") : (utf8)"")); - } - - bool advert = false; - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - AOL_namespace::rwLock &lock = (sc2 ? m_streamData->m_sc21StreamLock : m_streamData->m_sc1StreamLock); - - do - { - int samplerate = (m_streamData ? m_streamData->streamSampleRate() : 0); - int bitrate = (m_streamData ? m_streamData->streamBitrate() : 0); - int type = (m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA); - - m_result.timeout (remain); - if (streamData::isSourceConnected (m_streamID) == false) - { - acquireBackupFile (0, sc2); - //DLOG ("listener detected source drop, backup " + utf8(m_backupFile.size() ? "present" : "not present")); - if (m_backupFile.size()) - { - setCallback (&protocol_shoutcastClient::state_SendBackupFile); - m_timerStart = 0; - m_backupLoopTries = 1; - m_result.run(); - return; - } - if (m_streamData == NULL) - { - m_result.schedule (300); - return; - } - } - - stackRWLock sl (lock, false, false); - if (sl.tryRdLock() == false) - { - m_result.schedule (3); - return; - } - int frames = 0; - - if (m_output.size() < 2000) - { - streamData::ringBufferAccess_t lag = ((sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr); - - if (lag == 0) - { - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(333); - } - else - { - m_result.schedule(150); - } - return; - } - - const streamData::ringBufferAccess_t offset = (m_readPtr & (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_ptrMask); - - if (lag > (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data.size()) - break; // off the queue, lagging too much - - lag -= m_lagOffset; - - size_t remainder = doFrameSync (type, debug, (int)lag, (int)offset, - (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data, - cur_time, bitrate, samplerate, frames, advert, true); - - m_readPtr += (lag-remainder); - updateFrameCount (frames, cur_time); - } - // processTitleW3C(); needs looking into - - // lets jump out if there isn't much to send except in cases where an advert, as we need to - // process the transistion - if (m_output.size() < 1000 && (frames || advert == false)) - { - //DLOG ("not enough to send really"); - m_result.schedule(150); - return; - } - int rval = doSend (debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - // if we short send and don't need to transition to advert then jump out - if (advert == false) - { - m_result.schedule(80); // back off on sending too much - return; - } - } - else - m_output.clear(); - } - if (processAdvertTrigger(advert)) - { - // DLOG ("advert detected by listener"); - setCallback (&protocol_shoutcastClient::state_SendAdverts); - m_result.schedule(200); - } - else - m_result.schedule(10); - return; - } while (0); - - m_result.schedule(); - resetReadPtr (sc2); -} - - - -// handle state where we are sending backup files -void protocol_shoutcastClient::state_SendBackupFile() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - resetCommon(); - - int amt = (int)(m_backupFile.size() - m_backupFileOffset); - - if (amt == 0) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile (0, sc2); - if (m_backupFile.empty()) - { - ++m_backupLoopTries; - resetReadPtr (sc2); - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - return; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - else - { - resetReadPtr (sc2); - m_backupFileOffset = 0; - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - } - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.HTTPClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time = ::time(NULL); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - int adj = m_frameCount < 50 ? 3 : 10; - m_timerStart = cur_time - 10; // prime the rate regulation, make it on the slow side to rejoin queue - m_timerFrames = (__uint64)m_fps * adj; - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule (333); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - int len = (int)amt, backup_type = MP3_DATA, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if (!m_streamData) - { - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - if (!backupFile.empty()) - { - backup_type = ((backupFile.rfind((utf8)".aac") == utf8::npos) ? MP3_DATA : AACP_DATA); - } - } - - bool advert = false; - if (m_output.size() < 4096) - { - int rval = doFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : backup_type), - debug, len, m_backupFileOffset, m_backupFile, cur_time, - (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), frames, advert); - m_backupFileOffset += (len - rval); - updateFrameCount (frames, cur_time); - } - int rval = doSend(debug, cur_time, autoDumpTime); - - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = cur_time; - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - return; - } - m_output.clear(); - // look at moving now that a complete frame is sent - if (streamData::isSourceConnected (m_streamID)) - { - if (m_streamData) - { - m_streamData->releaseStream(); - } - m_streamData = streamData::accessStream(m_streamID); - - if (m_streamData->m_sc1_packet_starts.size() == 0) - { - m_result.schedule (100); // no data from stream, so ignore for now. - return; - } - - // we're done with the backup file - m_backupFile.clear(); - m_backupFile.resize(0); - m_backupFileOffset = 0; - m_backupLoopTries = 0; - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); - m_result.run(); - return; - } - m_result.schedule ((rval/512) + 15); - } - else - m_result.schedule(90); - } -} - - - -// handle state where we are sending advert content -void protocol_shoutcastClient::state_SendAdverts() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - //AD_DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - streamData::specialFileData *ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - while (true) - { - if (ad) - { - std::vector<__uint8> &adBuffer = (sc2 ? ad->m_sc2Buffer : ad->m_sc1Buffer); - int amt = (ad ? (int)(adBuffer.size() - m_adAccess.offset) : 0); - - if (amt > 0) - break; - } - if (m_adAccess.anotherAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest)) - { - ad = m_adAccess.getAd (m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - continue; - } - // no more adverts - m_lastActivityTime = ::time(NULL); - if (m_timerStart) - { - // add a small retry here to allow for queue priming after adverts - m_result.schedule (300); - m_result.timeoutSID(m_streamID); - m_timerStart = 0; - //DLOG ("kicking back to retry before transition"); - return; - } - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); // this should do a search for a nearest matching frame - releaseAdvert(); - m_result.schedule (); - m_result.timeoutSID(m_streamID); - - ILOG(m_clientLogString + "Transitioning back to stream [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - return; - } - - try - { - std::vector<__uint8> &adBuffer = (sc2 ? ad->m_sc2Buffer : ad->m_sc1Buffer); - int amt = (ad ? (int)(adBuffer.size() - m_adAccess.offset) : 0); - const bool debug = gOptions.HTTPClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - m_timerStart = cur_time - 8; // prime the rate regulation, make it on the slow side to rejoin queue - m_timerFrames = (__uint64)m_fps * 8; - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(333); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - // DLOG ("throttle in send adverts, count " + tos(m_frameCount)); - return; - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - if (m_output.size() < 4096) - { - int rval = doFrameSync (m_streamData->streamUvoxDataType(), debug, len, - (int)m_adAccess.offset, adBuffer, - cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), frames, advert); - int processed = len - rval; - m_adAccess.offset += processed; - m_adAccess.total_processed += processed; - updateFrameCount (frames, cur_time); - } - int rval = doSend(debug, cur_time, autoDumpTime); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - return; - } - m_output.clear(); - } - m_result.write(); - } - catch (std::runtime_error &) - { - releaseAdvert(); - throw; - } -} - - -void protocol_shoutcastClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // AD_DEBUG_LOG (m_clientLogString + __FUNCTION__); -#endif - - if (sendDataBuffer (m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - setCallback (); - } -} - -// wrapper for the StopAdRun, as we also need to kick off some listener metrics -void protocol_shoutcastClient::releaseAdvert () -{ - if (m_adAccess.inAdvertMode ()) - { - metrics::adSummary summary; - - summary.sid = m_streamID; - summary.path = getStreamPath (m_streamID); - summary.tstamp = ::time(NULL); - summary.id = m_adAccess.getCurrentTrigger()->m_id; - summary.sd = m_streamData; - metrics_adListener (*this, summary); - - m_adAccess.stopAdRun (m_streamID, m_streamData->advertGroups, false); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h deleted file mode 100644 index ab1bcb43..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h +++ /dev/null @@ -1,209 +0,0 @@ -#pragma once -#ifndef protocol_shoutcastClient_H_ -#define protocol_shoutcastClient_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "stats.h" -#include "bandwidth.h" -#include "protocol_HTTPStyle.h" - - -#pragma pack(push, 1) -class protocol_shoutcastClient: public runnable, public clientProtocol -{ -public: - friend class protocol_HTTPStyle; - - typedef void (protocol_shoutcastClient::*state_t)(); - protocol_shoutcastClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, const streamData::source_t clientType); - - protocol_shoutcastClient(const socketOps::tSOCKET socket, const u_short port, - const streamData::source_t clientType, const uniString::utf8 &hostName, - const streamData::streamID_t streamID, const size_t unique, - const uniString::utf8 &userAgent, const uniString::utf8 &referer, - const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, - const bool headRequest); - - virtual ~protocol_shoutcastClient() throw() - { - m_streamData = 0; - socketOps::forgetTCPSocket(m_socket); - } - - virtual void setIntro(vector<__uint8> &v, int uvoxDataType = MP3_DATA) { m_introFile = v; m_introFileOffset = 0; (void)uvoxDataType; } - - virtual void acquireIntroFile(const bool sc2 = false) throw(); - virtual int acquireBackupFile(int *dataType = 0, const bool sc2 = false) throw(); - - void kickNextRound() throw() { m_kickNextRound = true; } - - void setGroup(size_t group) throw() { m_adAccess.setGroup (group); } - const size_t getGroup() const throw() { return m_adAccess.getGroup(); } - - const size_t getUnique() const throw() { return m_unique; } - const streamData::source_t getClientType() const throw() { return m_clientType; } - const time_t getStartTime() const throw() { return m_startTime; } - - const uniString::utf8 getXFF() const throw() { return m_XFF; } - const uniString::utf8 getUserAgent() const throw() { return (!m_userAgent.empty() ? m_userAgent : EMPTY_AGENT); } - const uniString::utf8 getReferer() const throw() { return m_referer; } - - void return_403(); - - const streamData::ringBufferAccess_t resetReadPtr(std::vector<__uint8>& data, const bool sc2 = false) throw(); - void resetReadPtr(const bool sc2 = false) throw(); - void resetReadPtr (streamData::ringBufferAccess_t ptr, bool sc2) throw(); - - const int doTimeSlice(const bool sc2 = false) throw(std::exception); - void resetCommon() throw(); - - const bool sendText() throw(std::exception); - - void setupWorkingBuffer(const std::vector<__uint8>& data, std::vector<__uint8>& tempBuf, int& len) throw(); - - virtual void processFrame (int type, const unsigned char *buf, unsigned int len); - - const int doFLVFrameSync(const int type, const bool debug, const int offset, - const std::vector<__uint8>& buf, const time_t cur_time, - const int bitrate, const unsigned int samplerate, - int &len, int &frames, bool &advert, int ×tamp, - const bool fill_remainder = false) throw(); - - virtual const int doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, const bool fill_remainder = false) throw(); - - void createFrameRate(const bool mp3, const int samplerate); - const __uint64 calculateFrameLimit(const time_t cur_time = 0); - void updateFrameCount(const int frames, const time_t cur_time = 0); - const bool calculateDelay(const int autoDumpTime = -1); - virtual int doSend(const bool debug, const time_t cur_time, - const int autoDumpTime, int adjust = 0) throw(std::runtime_error); - void checkListenerIsValid(const bool debug) throw(std::runtime_error); - - void setW3CState() throw(); - const uniString::utf8 getContainer() const; - void authForStream(streamData *_sd = 0); - - const bool handleNoData(const uniString::utf8 &logString, const int remainder, - const streamData::ringBufferAccess_t amt, - const int autoDumpTime, const time_t cur_time, - const bool sc2 = false); - - void streamMovedOrRejected(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &serverUrl, const int mode) throw(); - - const bool processAdvertTrigger(const bool advert); - - const uniString::utf8 fixICYMetadata(uniString::utf8 metadata); - void logW3C() throw(); - void doLogW3C(const uniString::utf8 &title = "") throw(); - void processTitleW3C() throw(); - - const adGroupAccess &getAdAccess () const { return m_adAccess; } - void releaseAdvert(); - - const int processAdd(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &msg, const int msgLen, - const uniString::utf8 &movedUrl, const uniString::utf8 &serverUrl) throw(); - const bool processReject(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &msg, const int msgLen, int *read_bitrate, - int *dataType = 0, const bool sc2 = false) throw(); - - const int addClient(); - void reportNewListener(const uniString::utf8 &logString = ""); - void reportStopListener(); - - void cleanup(const uniString::utf8 &logString, const bool debug, - const bool sc2 = false, const bool altLog = false) throw(exception); - - virtual int detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error); - - virtual void state_AttachToStream() throw(exception) = 0; - virtual void state_Close() throw(std::exception) = 0; - virtual void state_InitiateStream() throw(std::exception) = 0; - virtual void state_SendText() throw(std::exception); - virtual void state_SendAdverts() throw(std::exception); - virtual void state_Stream() throw(std::exception); - virtual void state_SendBackupFile() throw(std::exception); - virtual void state_SendIntroFile() throw(std::exception); - virtual void state_SendIntro() throw(std::exception); - - virtual void setCallback (state_t callback = NULL, state_t next = NULL) = 0; - - friend class auth::authService; - friend void metrics::metrics_listener_new(const protocol_shoutcastClient &client); - friend void metrics::metrics_listener_drop(const protocol_shoutcastClient &client); - friend void stats::catchPreAddClients(const streamData::streamID_t id); - -protected: - uniString::utf8 m_clientHostName; - const streamData::streamID_t m_streamID; // stream ID for this connection - - const size_t m_unique; // clients' unique id - uniString::utf8 m_userAgent; // client's user agent string - uniString::utf8 m_referer; // client's referer string - uniString::utf8 m_queryParams; // client's query parameters - - streamData::source_t m_clientType; // stream client type - - bool m_removeClientFromStats; // do we have to do a stats::removeClient - bool m_kickNextRound; - bool m_headRequest; - bool m_ignoreDisconnect; // used to prevent the 'client connection closed (0 seconds) [Bytes: 0] Agent:' - // message if redirecting or if max limit was reached which keeps logs cleaner - - time_t m_startTime; // when connection started, used to implement listenerTime - time_t m_newListener; // when the new listener metric was sent - time_t m_timerStart; // for time regulated sending - __uint64 m_timerFrames; // amount sent during timer; - - streamData *m_streamData; - - uniString::utf8 m_clientLogString; - uniString::utf8 m_clientAddr; // client's address - uniString::utf8 m_XFF; - uniString::utf8 m_OKResponse; - - uniString::utf8 m_lastSentMetadata; // used for w3C tracking - - std::vector<__uint8> m_introFile; - int m_introFileOffset; - int m_backupFileOffset; - std::vector<__uint8> m_backupFile; - int m_backupLoopTries; - unsigned int m_lagOffset; - - adGroupAccess m_adAccess; - - //// stats for w3c logs - time_t m_lastTitleTime; // time of last title update used for w3c logs - __uint64 m_bytesSentForCurrentTitle; // bytes sent since last title change. used for w3c logs - __uint64 m_totalBytesSent; // total bytes sent whilst the connection is open - /////////////////////////// - - streamData::ringBufferAccess_t m_readPtr; // pointer into ring buffer (main playback) - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - unsigned short m_metaInterval; - unsigned short m_metaIntervalCounter; // counter for metadata updates - - double m_fps; - __uint64 m_frameLimit; // how many frames we're allowed - __uint64 m_frameCount; // how many frames we've provided - - std::vector<__uint8> m_shortSend; // used to keep a copy of the data from short sends - // which will be re-inserted into the output buffer - // before processing more audio data to the output. - std::vector<__uint8> m_remainder; - std::vector<__uint8> m_output; - -}; -#pragma pack(pop) - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp deleted file mode 100644 index b8b3ec23..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp +++ /dev/null @@ -1,439 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "protocol_shoutcastSource.h" -#include "protocol_backup.h" -#include "streamData.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.shoutcastSourceDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "SRC" - -protocol_shoutcastSource::protocol_shoutcastSource (microConnection &mc, const uniString::utf8 &password) throw (std::exception) - - : runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcAddress) -{ - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_denied = false; - m_remainder = new __uint8[BUF_SIZE * 4]; - m_remainderSize = 0; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_streamData = NULL; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // we're looking to see if this is an updated 1.x source - // which is able to indicate the stream # for the stream - // so that we're able to support multiple 1.x sources so - // we need to parse the password and extract the parts - utf8 m_srcPassword = password; - extractPassword(m_srcPassword, m_srcUserID, m_srcStreamID); - - // ensure that only valid stream id's are allowed to connect (1 -> 2147483647) - if (!m_srcStreamID || (m_srcStreamID > INT_MAX)) - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(m_srcStreamID) + "). Stream ID cannot be below 1 or above 2147483647."); - - m_outBuffer = MSG_BADSTREAMID; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_BADSTREAMID_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - return; - } - - // update the log message for the read stream number - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort, m_srcStreamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_srcStreamID); - - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. Stream is configured as having moved."); - - m_outBuffer = MSG_STREAMMOVED; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMMOVED_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - return; - } - - // as we are a v1 source then we must adhere to the master password - // instead of using a specific per stream password as in v2 streams - // though we also accept connections as sid=1 so check for that too - utf8 srcPassword = gOptions.stream_password(m_srcStreamID); - if (srcPassword.empty()) - { - srcPassword = gOptions.password(); - } - - if (m_srcPassword.empty() || (m_srcPassword != srcPassword)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - ". " + (m_srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + m_srcPassword), LOGNAME, m_srcStreamID); - m_outBuffer = MSG_INVALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_INVALIDPASSWORD_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - } - else - { - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - } - else - { - ILOG(m_srcLogString + "Shoutcast 1 source connection starting.", LOGNAME, m_srcStreamID); - m_outBuffer = MSG_VALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_VALIDPASSWORD_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_GetHeaders; - } - - if (sd) - { - sd->releaseStream(); - } - } -} - -protocol_shoutcastSource::~protocol_shoutcastSource() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "Shoutcast 1 source disconnected.", LOGNAME, m_srcStreamID); - } -} - - -void protocol_shoutcastSource::state_AnalyzeHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - int maxHeaderLineCount = gOptions.maxHeaderLineCount(); - if ((int)m_headers.size() >= maxHeaderLineCount) - { - m_denied = true; - throwEx(m_srcLogString + "Max icy header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - // adjust icy headers for titleFormat and urlFormat - utf8 titleFormat = gOptions.titleFormat(); - utf8 urlFormat = gOptions.urlFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_headers["icy-name"] = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos,2,m_headers["icy-name"])); - } - - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_headers["icy-url"] = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_headers["icy-url"])); - } - - // dump icy headers to log - if (gOptions.shoutcastSourceDebug()) - { - for (map::const_iterator i = m_headers.begin(); i != m_headers.end(); ++i) - { - DEBUG_LOG(m_srcLogString + "Source client header [" + (*i).first + ":" + (*i).second + "]"); - } - } - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - if (!found && gOptions.requireStreamConfigs()) - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 1 source rejected. Stream " + - tos(m_srcStreamID) + " must be defined in config file"); - } - - // check that these bitrates are allowed (looking at both max and average values) - const int bitrate = getStreamBitrate(m_headers) * 1000; - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - throwEx(m_srcLogString + "Shoutcast 1 source rejected. Only bitrates " + - mode + " " + tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps."); - } - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - stream.m_backupUrl.url(), streamData::SHOUTCAST1, - m_srcStreamID, m_srcPort, stream.m_maxStreamUser, - stream.m_maxStreamBitrate, stream.m_minStreamBitrate, - stream.m_allowPublicRelay, false, getStreamSamplerate(m_headers), - mapGet(m_headers, "icy-vbr", (bool)false), m_headers)); - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - m_result.run(); - return; - } - - utf8 sourceIdent = mapGet(m_headers, "user-agent", utf8()); - m_streamData->updateSourceIdent(sourceIdent); - - m_state = &protocol_shoutcastSource::state_GetStreamData; - m_result.read(); - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - if (pos == utf8::npos) - { - if (!key.empty() && ((key == "icy-name") || (key == "icy-url"))) - { - // allow through icy-name and icy-url if there is - // a titleformat and urlformat to use respectively - } - else - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - - utf8 value = stripWhitespace(m_lineBuffer.substr(pos+1)); - if (key.empty() || value.empty()) - { - if (!key.empty() && value.empty()) - { - if (key == "icy-genre") - { - value = "Misc"; - } - else if (((key == "icy-name") && !gOptions.titleFormat().empty()) || - ((key == "icy-url") && !gOptions.urlFormat().empty())) - { - // allow through icy-name and icy-url if there is - // a titleformat and urlformat to use respectively - } - else - { - if (key == "icy-url") - { - value = "http://www.shoutcast.com"; - } - else if (!((key == "icy-irc") || (key == "icy-aim") || (key == "icy-icq"))) - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - } - else - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - m_headers[key] = value; - m_nextState = &protocol_shoutcastSource::state_AnalyzeHeaders; - m_state = &protocol_shoutcastSource::state_GetLine; - m_result.read(); - m_lineBuffer.clear(); - } -} - -void protocol_shoutcastSource::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - if (m_streamData && !m_denied) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty()) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo (m_streamData->ID(), info, extra) && info.m_allowBackupURL) - { - m_denied = true; - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - ILOG (m_srcLogString + "Shoutcast 1 source disconnected - trying source backup.", LOGNAME, m_srcStreamID); - threadedRunner::scheduleRunnable(new protocol_backup(backupInfo[0], getStreamBitrate(m_headers), - fixMimeType(m_headers["content-type"]))); - } - else - WLOG ("Stream backup URL not allowed", LOGNAME, m_srcStreamID); - } - } - throw; - } -} - -void protocol_shoutcastSource::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_shoutcastSource::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (getHTTPStyleHeaderLine(m_srcStreamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_shoutcastSource::state_GetHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - m_state = &protocol_shoutcastSource::state_GetLine; - m_nextState = &protocol_shoutcastSource::state_AnalyzeHeaders; - m_result.read(); -} - -void protocol_shoutcastSource::state_GetStreamData() throw(exception) -{ -/*#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_srcLogString + __FUNCTION__); -#endif*/ - - time_t cur_time; - - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while (true) - { - char buf[BUF_SIZE * 4] = {0}; - int amt = (BUF_SIZE - 1); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], (BUF_SIZE - 1), 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule(85); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - DLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - - throwEx ((utf8)""); - } - - // update these details before we mess with anything - bandWidth::updateAmount(bandWidth::SOURCE_V1_RECV, rval); - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, - bitrate, type, buf, m_srcLogString)) - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 1 source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - - m_lastActivityTime = ::time(NULL); - m_result.schedule(25); - } -} - -void protocol_shoutcastSource::state_CloseConnection() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h deleted file mode 100644 index b9116165..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once -#ifndef protocol_shoutcastSource_H_ -#define protocol_shoutcastSource_H_ - -#include "threadedRunner.h" -#include - -class streamData; - -/* - Runnable object that handles the shoutcast source (broadcaster) - protocol -*/ - -class protocol_shoutcastSource: public runnable -{ -private: - const u_short m_srcPort; - short unsigned int m_remainderSize; - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - // is a padding hole around here... - __uint8 * m_remainder; - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - uniString::utf8 m_srcUserID; - int m_srcStreamID; - int m_outBufferSize; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_lineBuffer; // received header line - httpHeaderMap_t m_headers; // the received source headers - streamData *m_streamData; // associated stream object - - typedef void (protocol_shoutcastSource::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_ConfirmPassword() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetLine() throw(std::exception); - void state_GetHeaders() throw(std::exception); - void state_AnalyzeHeaders() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_GetStreamData() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcastSource"; } - -public: - protocol_shoutcastSource (microConnection &mc, const uniString::utf8 &password) throw(std::exception); - - protocol_shoutcastSource(const socketOps::tSOCKET s, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &password) throw(std::exception); - virtual ~protocol_shoutcastSource() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp b/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp deleted file mode 100644 index f67d9df4..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp +++ /dev/null @@ -1,1010 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include "protocol_uvox2Source.h" -#include "protocol_backup.h" -#include "uvox2Common.h" -#include "streamData.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.uvox2SourceDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "SRC" - - -protocol_uvox2Source::protocol_uvox2Source (microConnection &mc, const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(exception) - - : runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcHostName) -{ - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort); - m_outData = new __uint8 [MAX_MESSAGE_SIZE]; - m_remainder = new __uint8 [BUF_SIZE * 4]; - m_remainderSize = 0; - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_flushCachedMetadata = false; - m_specialFileBytesExpected = 0; - m_denied = false; - m_streamData = NULL; - m_loop = 0; - m_state = &protocol_uvox2Source::state_SendCrypto; - m_nextState = NULL; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - ILOG(m_srcLogString + "Shoutcast 2 source connection starting.", LOGNAME, m_srcStreamID); - - m_configData.m_maxBitrate = 0; - m_configData.m_avgBitrate = 0; - m_configData.m_desiredBufferSize = 0; - m_configData.m_minimumBufferSize = 0; - - if (sizeOfFirstPacket > MAX_MESSAGE_SIZE) - { - m_denied = true; - throw runtime_error(m_srcLogString.hideAsString() + "Initial data packet too large (" + tos(sizeOfFirstPacket) + ")"); - } - - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, sizeOfFirstPacket); - m_inBuffer.insert(m_inBuffer.end(), firstPacket, firstPacket + sizeOfFirstPacket); -} - -protocol_uvox2Source::~protocol_uvox2Source() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_outData); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "Shoutcast 2 source disconnected.", LOGNAME, m_srcStreamID); - } -} - -void protocol_uvox2Source::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } -#ifdef INCLUDE_BACKUP_STREAMS - ILOG(m_srcLogString + "Shoutcast 2 source disconnected - trying source backup.", LOGNAME, m_srcStreamID); - threadedRunner::scheduleRunnable(new protocol_backup(backupInfo[0], - max(m_configData.m_avgBitrate/1000, m_configData.m_maxBitrate/1000), - m_configData.m_mimeType)); -#endif - } - throw; - } -} - -void protocol_uvox2Source::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_uvox2Source::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_uvox2Source::state_GetPacket() throw(exception) -{ - time_t cur_time; - - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for data")); - - while (true) - { - // calculate optimal read size - char buf[BUF_SIZE] = {0}; - int amt = MAX_MESSAGE_SIZE; - int len = (int)m_inBuffer.size(); - - if (!len) - { - amt = UV2X_HDR_SIZE; - } - else if (len >= UV2X_HDR_SIZE) - { - amt = min(MAX_MESSAGE_SIZE, (int)((ntohs(reinterpret_cast(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) - len)); - } - else - { - amt = min(MAX_MESSAGE_SIZE, (UV2X_OVERHEAD - len)); - } - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval < 0) - { - m_loop = 0; - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule(75); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - - throwEx (""); - } - if (rval < amt) - m_loop = 100000; // force a stop when processed. - - m_lastActivityTime = ::time(NULL); - m_inBuffer.insert(m_inBuffer.end(), buf, buf + rval); - - len = (int)m_inBuffer.size(); - if ((len > 1) && (len <= UV2X_HDR_SIZE)) - { - // check for sync byte as we cannot be - // certain of good data coming in from - // the connection and so we check it - int found = -1; - for (int i = 0; i < len - 1; i++) - { - // check for sync byte - if ((buf[i] == UVOX2_SYNC_BYTE) && (buf[i + 1] == 0)) - { - found = i; - break; - } - } - - // track what we've received for the bandwidth stats - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, len); - - if (found != -1) - { - // we need to re-sync and so need to - // clear the buffer and replace it - // according to the re-sync position - if (found > 0) - { - DEBUG_LOG(m_srcLogString + "Shoutcast 2 source re-synced to stream [pos: " + tos(found) + "]."); - - m_inBuffer.clear(); - - // we insert in to the start of the buffer - // what appears to be 'good' sync'd data. - m_inBuffer.insert(m_inBuffer.end(), &buf[found], &buf[found] + rval - found); - } - } - else - { - // and then we clear out the buffer which - // is ok to do since we're trying to find - // the frame (as first or next in stream) - m_inBuffer.clear(); - } - - continue; - } - else if (len > MAX_MESSAGE_SIZE) - { - m_denied = true; - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, rval); - throwEx(m_srcLogString + "UVOX packet is too large" - " [got: " + tos(len) + " bytes, max: " + - tos(MAX_MESSAGE_SIZE) + " bytes]"); - } - else if (len > UV2X_HDR_SIZE) - { - if ((int)(ntohs(reinterpret_cast(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) == len) - { - // got it - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, rval); - - m_result.run(); - m_state = m_nextState; - return; - } - } - } -} - -template -void protocol_uvox2Source::loadAndSendMsg(const T &msg, int type, state_t nextState) throw() -{ - formMessage(msg, type, m_outData, m_outBufferSize); - bandWidth::updateAmount(bandWidth::SOURCE_V2_SENT, m_outBufferSize); - m_outBuffer = m_outData; - m_state = &protocol_uvox2Source::state_SendBuffer; - m_nextState = nextState; -} - -// load outbound message into buffer, and establish state to transition to after send -#define SEND_AND_TRANSITION(msg, vtype, state)\ - loadAndSendMsg(msg, vtype, state);\ - m_result.write();\ - m_result.run();\ - return; - -// get a packet and then transition to indicated state -#define GET_AND_TRANSITION(a)\ - m_inBuffer.clear();\ - m_state = &protocol_uvox2Source::state_GetPacket;\ - m_nextState = a;\ - m_result.run();\ - m_result.read();\ - m_result.timeoutSID(m_srcStreamID);\ - return; - -// send a packet then transition to closed state -#define SEND_AND_CLOSE(a, b)\ - SEND_AND_TRANSITION(a, b, &protocol_uvox2Source::state_CloseConnection) - -// get next packet, without acknowledgement -#define NEXT_PACKET\ - m_inBuffer.clear();\ - m_nextState = m_state;\ - m_state = &protocol_uvox2Source::state_GetPacket;\ - m_result.schedule();\ - m_result.timeoutSID(m_srcStreamID);\ - return; - -void protocol_uvox2Source::state_ConfirmPasswordGet() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - GET_AND_TRANSITION(&protocol_uvox2Source::state_ConfirmPassword); -} - -void protocol_uvox2Source::state_SendCrypto() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // parse the contents of the packet to get user,password,streamid etc. - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if (voxMsgType != MSG_CIPHER) - { - m_denied = true; - ELOG(m_srcLogString + "Out of sequence uvox packet. Got " + tos(voxMsgType) + " but expected " + tos(MSG_CIPHER), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Sequence Error", voxMsgType); - } - - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - if (strcmp(contents,"2.1")) - { - ELOG(m_srcLogString + "Cipher request has bad version (" + contents + ")", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Version Error", voxMsgType, &protocol_uvox2Source::state_ConfirmPasswordGet); - } - - m_cipherKey = gOptions.stream_uvoxCipherKey(m_srcStreamID); - if (!gOptions.read_stream_uvoxCipherKey(m_srcStreamID) || m_cipherKey.empty()) - { - m_cipherKey = gOptions.uvoxCipherKey(); - } - - SEND_AND_TRANSITION(("ACK:" + m_cipherKey).hideAsString(), voxMsgType, &protocol_uvox2Source::state_ConfirmPasswordGet); -} - -// get stream,userID and password out of MSG_AUTH (0x1001) packet -void protocol_uvox2Source::state_ConfirmPassword() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // parse the contents of the packet to get user,password,streamid etc. - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if (voxMsgType != MSG_AUTH) - { - m_denied = true; - ELOG(m_srcLogString + "Out of sequence uvox packet. Got " + tos(voxMsgType) + " but expected " + tos(MSG_AUTH), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Sequence Error", voxMsgType); - } - - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const char *pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No version field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - std::string srcVersion = stripWhitespace(string(contents, pos)); - if (srcVersion != "2.1") - { - m_denied = true; - ELOG(m_srcLogString + "Uvox version of type " + srcVersion + " is not accepted. Expecting 2.1", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Version Error", voxMsgType); - } - - contents = pos+1; - pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No SID field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - int sourceStreamID = atoi(string(contents, pos).c_str()); - // ensure that only valid stream id's are allowed to connect (1 -> 2147483647) - if (!sourceStreamID || (sourceStreamID > INT_MAX)) - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(sourceStreamID) + "). Stream ID cannot be below 1 or above 2147483647.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Stream ID Error", voxMsgType); - } - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(sourceStreamID); - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Stream is configured as having moved.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Deny", voxMsgType); - } - - m_srcStreamID = sourceStreamID; - - // if stream configs are required then we have an error if we didn't find one - if (gOptions.requireStreamConfigs()) - { - config::streamConfig stream; - if (!gOptions.getStreamConfig(stream, m_srcStreamID)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Stream " + tos(m_srcStreamID) + " must be defined in config file.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Stream ID Error", voxMsgType); - } - } - - contents = pos+1; - pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No UID field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - m_srcUserID = string(contents, pos); - if (!(m_srcUserID.size() % 16)) - { - m_srcUserID = XTEA_decipher(m_srcUserID.c_str(), m_srcUserID.size(), m_cipherKey.c_str(), m_cipherKey.size()); - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad username format. Size of parameters not matching specification.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - contents = pos + 1; - utf8 srcPassword = contents; - - if (!(srcPassword.size() % 16)) - { - srcPassword = XTEA_decipher(srcPassword.c_str(), srcPassword.size(), m_cipherKey.c_str(), m_cipherKey.size()); - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad password format. Size of parameters not matching specification.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - // if no stream configuration is specified then we need to fallback - utf8 password = gOptions.stream_password(m_srcStreamID); - if (!gOptions.read_stream_password(m_srcStreamID) || password.empty()) - { - password = gOptions.password(); - } - - // look at the password and check for the multi-1.x style support, - // extracting as needed so we are consistent with all other modes. - // note: we ignore the other parameters and just want 'password'. - utf8 dj_name; // throw-away (equivalent of 'm_srcUserID') - extractPassword(srcPassword, dj_name, sourceStreamID); - - if (srcPassword != password) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - " on stream #" + tos(m_srcStreamID) + ". " + (srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + srcPassword), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Deny", voxMsgType); - } - - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - sd->releaseStream(); - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Stream In Use", voxMsgType); - } - - if (sd) - { - sd->releaseStream(); - } - - m_srcLogString = srcAddrLogString(m_srcAddr, m_srcPort, m_srcStreamID); - DEBUG_LOG(m_srcLogString + "Password accepted. Stream id is " + tos(m_srcStreamID), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:2.1:Allow", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); -} - -// first part of stream configuration state, get the next packet, then process it -void protocol_uvox2Source::state_StreamConfigurationGet() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - GET_AND_TRANSITION(&protocol_uvox2Source::state_StreamConfiguration); -} - -// handle various stream configuration packets -// note: to allow real negotiation, most errors are rejected, but do not cause the connection to be shut -void protocol_uvox2Source::state_StreamConfiguration() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - switch (voxMsgType) - { - case MSG_MIME_TYPE: - { - // this is mainly to cope with legacy / incomplete uvox2.x implementations - m_configData.m_mimeType = contents; - DEBUG_LOG(m_srcLogString + "original mime type=" + m_configData.m_mimeType, LOGNAME, m_srcStreamID); - m_configData.m_mimeType = fixMimeType(m_configData.m_mimeType); - DEBUG_LOG(m_srcLogString + "mime type=" + m_configData.m_mimeType, LOGNAME, m_srcStreamID); - break; - } - case MSG_BROADCAST_SETUP: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No avg bitrate field.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - m_configData.m_avgBitrate = atoi(string(contents,pos).c_str()); - contents = pos + 1; - m_configData.m_maxBitrate = atoi(contents); - - // check that these bitrates are allowed (looking at both max and average values) - const int bitrate = max(m_configData.m_avgBitrate, m_configData.m_maxBitrate); - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Bit Rate Error", voxMsgType); - } - - DEBUG_LOG(m_srcLogString + "avg bitrate=" + tos(m_configData.m_avgBitrate) + " max bitrate=" + tos(m_configData.m_maxBitrate), LOGNAME, m_srcStreamID); - break; - } - case MSG_NEGOTIATE_BUFFER_SIZE: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No desired buffer size field.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - m_configData.m_desiredBufferSize = atoi(string(contents, pos).c_str()); - contents = pos + 1; - m_configData.m_minimumBufferSize = atoi(contents); - DEBUG_LOG(m_srcLogString + "desired buffer size=" + tos(m_configData.m_desiredBufferSize) + " min buffer size=" + tos(m_configData.m_minimumBufferSize), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:" + tos(m_configData.m_desiredBufferSize), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - case MSG_MAX_PAYLOAD_SIZE: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". Parse error.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - int max1 = atoi(string(contents, pos).c_str()); - contents = pos + 1; - int max2 = atoi(contents); - DEBUG_LOG(m_srcLogString + "max payload size 1=" + tos(max1) + " max payload size 2=" + tos(max2), LOGNAME, m_srcStreamID); - int new_max = max(max1, max2); - if ((new_max > MAX_PAYLOAD_SIZE) || (new_max < 256)) - { - ELOG(m_srcLogString + "Bad max payload size of " + tos(new_max), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Payload Size Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - - SEND_AND_TRANSITION("ACK:" + tos(MAX_PAYLOAD_SIZE), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - case MSG_ICYNAME: - { - m_configData.m_icyName = contents; - utf8 titleFormat = gOptions.titleFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_configData.m_icyName = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos, 2, m_configData.m_icyName)); - } - DEBUG_LOG(m_srcLogString + "icy-name=" + m_configData.m_icyName, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYGENRE: - { - m_configData.m_icyGenre = contents; - DEBUG_LOG(m_srcLogString + "icy-genre=" + m_configData.m_icyGenre, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYURL: - { - m_configData.m_icyURL = contents; - if (m_configData.m_icyURL.empty()) - { - m_configData.m_icyURL = "http://www.shoutcast.com"; - } - utf8 urlFormat = gOptions.urlFormat(); - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_configData.m_icyURL = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_configData.m_icyURL)); - } - DEBUG_LOG(m_srcLogString + "icy-url=" + m_configData.m_icyURL, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYPUB: - { - m_configData.m_icyPub = atoi(contents); - DEBUG_LOG(m_srcLogString + "icy-pub=" + tos(m_configData.m_icyPub), LOGNAME, m_srcStreamID); - break; - } - case MSG_STANDBY: - { - DEBUG_LOG(m_srcLogString + "Standby", LOGNAME, m_srcStreamID); - if (m_streamData) - { - SEND_AND_CLOSE("NAK:Sequence Error", voxMsgType); - } - else - { - try - { - // build the correct path for the stream clients - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - (found ? stream.m_backupUrl.url() : ""), - streamData::SHOUTCAST2, m_srcStreamID, m_srcPort, - (found ? stream.m_maxStreamUser : 0), - (found ? stream.m_maxStreamBitrate : 0), - (found ? stream.m_minStreamBitrate : 0), - (found ? stream.m_allowPublicRelay : true), - false, 0, false, m_configData)); - } - catch(const exception &ex) - { - ELOG(m_srcLogString + ex.what(), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION(string("NAK:") + ex.what(), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Stream In Use", voxMsgType); - } - else - { - if (m_flushCachedMetadata) - { - m_streamData->clearCachedMetadata(); - m_metadataAssemblyTable.clear(); - } - m_flushCachedMetadata = false; - } - } - DEBUG_LOG(m_srcLogString + "Stream configuration complete. [" + eol() + m_configData.toLogString() + eol() + "]", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:Data transfer mode", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - case MSG_FLUSH_CACHED_METADATA: - { - DEBUG_LOG(m_srcLogString + "Flush cached metadata", LOGNAME, m_srcStreamID); - m_metadataAssemblyTable.clear(); - m_flushCachedMetadata = true; - break; - } - case MSG_TERMINATE: - { - DEBUG_LOG(m_srcLogString + "Terminate", LOGNAME, m_srcStreamID); - throwEx (""); - break; - } - case MSG_LISTENER_AUTHENTICATION: // not supported, just ACK it - { - WLOG(m_srcLogString + "Listener Auth - not supported", LOGNAME, m_srcStreamID); - break; - } - default: // out of sequence - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Sequence Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - } - - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); -} - -// this is needed to allow the source to process the -// response before starting to send the stream data -void protocol_uvox2Source::state_StreamDataGet() throw(std::exception) -{ - GET_AND_TRANSITION(&protocol_uvox2Source::state_GetStreamData); -} - -// normal streaming state -void protocol_uvox2Source::state_GetStreamData() throw(std::exception) -{ - if (!m_inBuffer.empty()) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - // if we have old uvox, then we don't know our mime-type (since old uvox 2 doesn't - // specify it, though 2.1 does). In the case that mime_type is empty, inspect the packet type and - // set it in the stream - if (m_configData.m_mimeType.empty()) - { - switch (voxMsgType) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - } - - if (!m_configData.m_mimeType.empty()) - { - m_streamData->streamSetMimeType(m_configData.m_mimeType); - } - } - - __uint16 amt = ntohs(voxHdr->msgLen); - vector <__uint8> tempbuf; - const char *buf; - - // if we had anything left over then now we - // need to copy it back into the buffer - if (m_remainderSize > 0 && m_remainder) - { - tempbuf.insert (tempbuf.end(), m_remainder, m_remainder+m_remainderSize); - tempbuf.insert (tempbuf.end(), m_inBuffer.begin() + UV2X_HDR_SIZE, m_inBuffer.begin()+UV2X_HDR_SIZE+amt); - amt = (__uint16)tempbuf.size(); - buf = (char *)&tempbuf[0]; - } - else - { - // buf.insert (buf.end(), m_inBuffer.begin() + UV2X_HDR_SIZE, m_inBuffer.begin()+UV2X_HDR_SIZE+amt); - buf = (char*)&m_inBuffer [UV2X_HDR_SIZE]; - } - - m_remainderSize = 0; - - int br = m_streamData->streamBitrate(); - if (m_streamData->syncToStream (m_remainderSize, m_remainder, amt, br, - m_streamData->streamUvoxDataType(), buf, - m_srcLogString)) - { - m_denied = true; - throwEx(m_srcLogString + "Shoutcast 2 source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - if (++m_loop < 20) - { - // force several small uvox packets to read/processed for now - m_inBuffer.clear(); - m_nextState = m_state; - m_state = &protocol_uvox2Source::state_GetPacket; - m_result.run(); - return; - } - m_loop = 0; - } - else if ((voxMsgType >= 0x3000) && (voxMsgType < 0x5000)) - { - DEBUG_LOG(m_srcLogString + "Cacheable metadata received type=0x" + tohex(voxMsgType), LOGNAME, m_srcStreamID); - const __uint16 voxPayloadSize = ntohs(voxHdr->msgLen); - if (voxPayloadSize >= UV2X_META_HDR_SIZE) // make sure there's enough data - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const uv2xMetadataHdr *metaHdr = reinterpret_cast(contents); - const __uint16 metadataID = ntohs(metaHdr->id); - const __uint16 metadataSpan = ntohs(metaHdr->span); - const __uint16 metadataIndex = ntohs(metaHdr->index) - 1; - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = voxPayloadSize - UV2X_META_HDR_SIZE; - - if ((metadataSpan <= MAX_METADATA_FRAGMENTS) && - (metadataSpan > 0) && - (metadataIndex < MAX_METADATA_FRAGMENTS) && - (metadataIndex < metadataSpan)) - { - assemblyTableIndex_t ati = makeAssemblyTableIndex(voxMsgType, m_srcStreamID); - metadataEntry_t &me = m_metadataAssemblyTable[voxMsgType][ati]; - - if (metadataSpan != me.m_expectedFragments) // span changed, clear the entire thing - { - __uint16 expectedFragments = me.m_expectedFragments; - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to span change [" + tos(metadataSpan) + "," + tos(expectedFragments) + "]", LOGNAME, m_srcStreamID); - } - - me.m_expectedFragments = metadataSpan; - if (me.m_fragments[metadataIndex].m_isValid) // duplicate fragment, clear the entire thing - { - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to duplicate fragment", LOGNAME, m_srcStreamID); - } - - me.m_fragments[metadataIndex].m_isValid = true; - me.m_fragments[metadataIndex].m_fragment.insert(me.m_fragments[metadataIndex].m_fragment.end(), - metadataContents, metadataContents + metadataContentsSize); - - if ((++me.m_receivedFragments) == me.m_expectedFragments) - { - // assembly, send and clear - vector<__uint8> assembledData; - for (__uint16 x = 0; x < me.m_expectedFragments; ++x) - { - assembledData.insert(assembledData.end(), me.m_fragments[x].m_fragment.begin(), me.m_fragments[x].m_fragment.end()); - } - - // send - m_streamData->addUvoxMetadataAtCurrentPosition(voxMsgType,assembledData); - - if (gOptions.uvox2SourceDebug()) - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan) + - " content=" + eol() + utf8(&(assembledData[0]), assembledData.size()), LOGNAME, m_srcStreamID); - } - else - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan), LOGNAME, m_srcStreamID); - } - } - else - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - utf8 currentSong, comingSoon; - std::vector nextSongs; - m_streamData->getStreamNextSongs(m_srcStreamID, currentSong, comingSoon, nextSongs); - - if (!currentSong.empty()) - { - if (!comingSoon.empty()) - { - ILOG(m_srcLogString + "Title update [now: \"" + currentSong + "\", next: \"" + comingSoon + "\"]", LOGNAME, m_srcStreamID); - } - else - { - ILOG(m_srcLogString + "Title update [" + currentSong + "]", LOGNAME, m_srcStreamID); - } - m_streamData->resetAdvertTriggers(currentSong); - } - } - else - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - - __uint16 ArtType = voxMsgType & 0x0F00; - if (!assembledData.size()) - { - ILOG(m_srcLogString + ((ArtType & MSG_METADATA_PLAYING_ART) ? "Playing" : "Stream") + " artwork cleared", LOGNAME, m_srcStreamID); - m_streamData->clearCachedArtwork(((ArtType & MSG_METADATA_PLAYING_ART) ? 1 : 0)); - } - else - { - ILOG(m_srcLogString + ((ArtType & MSG_METADATA_PLAYING_ART) ? "Playing" : "Stream") + - " artwork update [mime=" + mimeType[(voxMsgType & 0x00FF)] + ", " + tos(assembledData.size()) + " bytes]", LOGNAME, m_srcStreamID); - } - } - } - - // clear - m_metadataAssemblyTable[voxMsgType].erase(ati); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + " id=" + - tos(metadataID) + " span=" + tos(metadataSpan) + " index=" + tos(metadataIndex + 1), LOGNAME, m_srcStreamID); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + - " content of packet is too small payloadsize=" + tos(voxPayloadSize), LOGNAME, m_srcStreamID); - } - } - else if ((voxMsgType >= 0x5000) && (voxMsgType < 0x7000)) - { - // pass thru metadata - DEBUG_LOG(m_srcLogString + "Pass thru metadata", LOGNAME, m_srcStreamID); - m_streamData->writeSc21(m_inBuffer); // like data, but don't write to sc1 buffers - } - else if (voxMsgType == MSG_FILE_TRANSFER_BEGIN) - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const __uint8 *pos = (const __uint8*)strstr((const char *)contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". Parse error.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - m_specialFileType = toLower(string(contents, pos)); - if ((m_specialFileType != "intro") && (m_specialFileType != "backup")) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + " Special file type (" + m_specialFileType + ") is not supported", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Type Error", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - - contents = pos + 1; - m_specialFileBytesExpected = atoi((const char *)contents); - if (m_specialFileBytesExpected > gOptions.maxSpecialFileSize()) - { - ELOG(m_srcLogString + "Bad special file size " + tos(m_specialFileBytesExpected) + ". Parse error.", LOGNAME, m_srcStreamID); - m_specialFileBytesExpected = 0; - SEND_AND_TRANSITION("NAK:Size Error",voxMsgType,&protocol_uvox2Source::state_StreamDataGet); - } - - m_specialFileBytes.clear(); - if (m_specialFileBytesExpected == 0) - { - ILOG(m_srcLogString + "Clearing " + m_specialFileType + " file.", LOGNAME, m_srcStreamID); - streamData::specialFileData &fd = (m_specialFileType == "intro" ? m_streamData->getIntroFile() : m_streamData->getBackupFile()); - fd.replaceData(m_specialFileBytes, m_streamData->streamUvoxDataType(), - m_streamData->streamBitrate(), m_streamData->streamSampleRate()); - } - else - { - ILOG(m_srcLogString + "Beginning " + m_specialFileType + " file transfer of size " + tos(m_specialFileBytesExpected) + " bytes.", LOGNAME, m_srcStreamID); - } - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - else if (voxMsgType == MSG_FILE_TRANSFER_DATA) - { - // do not NAK or ACK this packet - if (m_specialFileBytesExpected > 0) - { - int amt = ntohs(voxHdr->msgLen); - if (amt > m_specialFileBytesExpected) - { - WLOG(m_srcLogString + "Received too many bytes during special file transfer for " + m_specialFileType + ". Data will be truncated", LOGNAME, m_srcStreamID); - amt = m_specialFileBytesExpected; - } - - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - m_specialFileBytes.insert(m_specialFileBytes.end(), contents, contents + amt); - m_specialFileBytesExpected -= amt; - if (m_specialFileBytesExpected == 0) - { - streamData::specialFileData &fd = (m_specialFileType == "intro" ? m_streamData->getIntroFile() : m_streamData->getBackupFile()); - fd.replaceData(m_specialFileBytes, m_streamData->streamUvoxDataType(), - m_streamData->streamBitrate(), m_streamData->streamSampleRate()); - m_specialFileBytes.clear(); - string fileType = m_specialFileType; - fileType[0] -= ('a' - 'A'); - ILOG(m_srcLogString + fileType + " file transfer complete.", LOGNAME, m_srcStreamID); - } - } - } - else if (voxMsgType == MSG_FLUSH_CACHED_METADATA) - { - ILOG(m_srcLogString + "Flush cached metadata", LOGNAME, m_srcStreamID); - m_streamData->clearCachedMetadata(); - m_metadataAssemblyTable.clear(); - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - else if (voxMsgType == MSG_TERMINATE) - { - ILOG(m_srcLogString + "Terminate", LOGNAME, m_srcStreamID); - throwEx (""); - } - else - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_srcStreamID); - if ((voxMsgType < 0x2000) && (voxMsgType != MSG_FILE_TRANSFER_DATA)) - { - // probably have to NAK it - SEND_AND_TRANSITION("NAK:Unsupported packet type", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - } - } - - NEXT_PACKET; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h b/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h deleted file mode 100644 index 1bd7343c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once -#ifndef protocol_uvox2Source_H_ -#define protocol_uvox2Source_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "uvox2Common.h" -#include - -class streamData; - -/* - Runnable object that handles the uvox 2 and 2.1 source (broadcaster) - protocol -*/ - -class protocol_uvox2Source: public runnable -{ -private: - int m_srcStreamID; - const u_short m_srcPort; - - bool m_flushCachedMetadata; // flush cached metadata when source connects - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - - ///////////// for outgoing data ////////////////////////////// - __uint8 *m_outData; - const __uint8 *m_outBuffer; // for outgoing data lines - int m_outBufferSize; - /////////////////////////////////////////////////////////////// - - /////////// temporary storage buffer for special file transfers (uvox 0x1050) ///////////////// - int m_specialFileBytesExpected; - std::vector<__uint8> m_specialFileBytes; - std::string m_specialFileType; - - ///////////// incoming data //////////////////////////////////// - std::vector<__uint8> m_inBuffer; - //////////////////////////////////////////////////////////// - - streamData *m_streamData; // associated stream object - - ///// source information - uniString::utf8 m_srcUserID; - uniString::utf8 m_cipherKey; // for uvox 2.1 - streamData::uvoxConfigData_t m_configData; - - /////////////////////////////////////////////////////////////////////// - //// data structures for assembling cached metadata - typedef std::vector<__uint8> metadataFragment_t; - struct metadataFragmentEntry_t - { - metadataFragment_t m_fragment; - bool m_isValid; - - void clear() throw() - { - m_isValid = false; - m_fragment.clear(); - } - metadataFragmentEntry_t() throw() : m_isValid(false) {} - }; - - typedef metadataFragmentEntry_t metadataFragmentCollection_t[MAX_METADATA_FRAGMENTS]; - struct metadataEntry_t - { - metadataFragmentCollection_t m_fragments; - __uint16 m_expectedFragments; - __uint16 m_receivedFragments; - - void clear() throw() - { - for (int x = 0; x < MAX_METADATA_FRAGMENTS; ++x) - { - m_fragments[x].clear(); - } - m_receivedFragments = 0; - } - metadataEntry_t() throw() : m_expectedFragments(0), m_receivedFragments(0) {} - }; - - typedef __uint32 assemblyTableIndex_t; - static assemblyTableIndex_t makeAssemblyTableIndex(__uint16 voxMsgType,__uint16 metadataID) throw() - { - return ((((assemblyTableIndex_t)voxMsgType) << 16) | metadataID); - } - - typedef std::map metadataAssemblyTable_t; - std::map<__uint16,metadataAssemblyTable_t> m_metadataAssemblyTable; - ///////////////////////////////////////////////////// - - typedef void (protocol_uvox2Source::*state_t)(); - - state_t m_state; - state_t m_nextState; - - __uint8 *m_remainder; - short unsigned int m_remainderSize; - int m_loop; // hack until the read handler can process more than 1 packet at a time - - void state_SendBuffer() throw(std::exception); - void state_ConfirmPasswordGet() throw(std::exception); - void state_ConfirmPassword() throw(std::exception); - void state_SendCrypto() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_StreamConfiguration() throw(std::exception); - void state_StreamConfigurationGet() throw(std::exception); - void state_GetPacket() throw(std::exception); - void state_StreamDataGet() throw(std::exception); - void state_GetStreamData() throw(std::exception); - - template void loadAndSendMsg(const T &msg,int type,state_t nextState) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_uvox2Source"; } - -public: - protocol_uvox2Source (microConnection &mc, const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(exception); - - protocol_uvox2Source(const socketOps::tSOCKET s, const uniString::utf8 &addr, const u_short port, - const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(std::exception); - virtual ~protocol_uvox2Source() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/readme.txt b/Src/Plugins/DSP/sc_serv3/readme.txt deleted file mode 100644 index e7daea4d..00000000 --- a/Src/Plugins/DSP/sc_serv3/readme.txt +++ /dev/null @@ -1,89 +0,0 @@ -Building sc_serv2 ------------------ - -The build dependencies for sc_serv2 are expat and zlib and these already have a pre-built -library stored in the 'libs' folder. Otherwise everything else is built from the contents -of the sc_serv3 folder so the libs only need to be updated rarely. - -It is assumed in all cases that there is a valid gcc + g++ tool chain in place along with -all standard libraries for building tools on the platform being used. - - -Win32 / Win64 -------------- - -The MSVC 2008 project builds straight from here with it using the pre-built libraries. - -As from DNAS v2.6, additional libcurl, libssl & libcrypto .lib files are required. -External zip files can be downloaded from the Nullsoft github repo: -https://github.com/Radionomy/Nullsoft/blob/master/Shoutcast/sc_serv3/deps/win32.7z -https://github.com/Radionomy/Nullsoft/blob/master/Shoutcast/sc_serv3/deps/win64.7z - -Extract locally to Shoutcast\sc_serv3\deps - - -BSD / Mac OS X / Linux ----------------------- - -The following is only needed if there is an update of the dependency library current -setup requires building expat before you can build sc_serv2 itself (not ideal but as it -is usually a build once event on the dependencies then it isn't too much of an issue...). - -EXPAT ------ - -In most cases just running ./unix_build_expat in the aolxml folder will build it. - - -ZLIB ----- - -./configure --static && make - -May also need to set (or applicable): - - export CC="/usr/bin/gcc44" - -in order to get it using the desired version of GCC on the system used to build this. - - ------------ - -Once all of the dependencies have been built then you just need to do "(g)make release" -to get a build. The make stage accepts the following modes: - - clean - release - fire - debug - - -Building on Centos 7 (on x64) ------------------------------ -Packages to install to enable compilation - sudo yum install gcc-c++ - sudo yum install openssl-devel - sudo yum install libstdc++-static - - curl http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/libcurl-devel-7.61.1-22.el8.x86_64.rpm > libcurl-devel.rpm - sudo rpm install libcur-devel.rpm - -If the directory deps/x86_64/lib does not exists create it - mkdir -p deps/x86_64/lib -Copy the static dependencies to this directory - cp libs/Aol_XML/Linux_x86_64/libexpat.a deps/x86_64/lib/ - cp libs/zlib/Linux_x86_64/libz.a deps/x86_64/lib/ - -Notes ------ - -Building assumes that both the C and C++ compilers are correctly setup on the machine. -When doing the linux build on ubuntu 10.10 the g++ compiler was not available leading to -"error trying to exec 'cc1plus' execvp" errors during building. The fix is: - - sudo apt-get install g++ - -When doing the linux build on Centos 5.5 the g++ compiler was not available leading to -"gcc: error trying to exec 'cc1plus': execvp: No such file or directory". The fix is: - - yum install gcc-c++ diff --git a/Src/Plugins/DSP/sc_serv3/resource.h b/Src/Plugins/DSP/sc_serv3/resource.h deleted file mode 100644 index e16fd8f7..00000000 --- a/Src/Plugins/DSP/sc_serv3/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by sc_serv.rc -// -#define IDI_ICY 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/ripList.cpp b/Src/Plugins/DSP/sc_serv3/ripList.cpp deleted file mode 100644 index b7e9348f..00000000 --- a/Src/Plugins/DSP/sc_serv3/ripList.cpp +++ /dev/null @@ -1,391 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -#include -#include -#include "ripList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[RIP] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -ripList g_ripList; - -class ripList::impl -{ -private: - struct ripEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct ripEntry: public rip_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - void save(ripEntrySave entrySave) throw(exception) - { - if (m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_numericIP + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " rip file"); - } - } - } - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - ripEntry(const utf8 &numericIP, const size_t stream_ID) throw() : rip_t(numericIP, stream_ID), m_ip(stringToIP(numericIP, m_hostIP)) {} - ripEntry() throw() : m_ip(0) {} - }; - - AOL_namespace::mutex m_lock; - list m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read rip file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - ripEntry e(stripWhitespace(s),stream_ID); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list has been ignored (bad IP)"); - } - else - { - if (this->find(e.m_numericIP,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - if (count > 0) - { - ILOG(LOGNAME "Reserved " + tos(count) + " IP" + (count != 1 ? "'s" : "") + - " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "No IPs read from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " Reserved IP" + (count != 1 ? "'s" : "") + - " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn,size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " rip file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - ripEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&ripEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if (!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - ripEntry e(ipAddr, stream_ID); - if (!e.validIP()) - { - if (!soft) - { - throwEx(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - else - { - return false; - } - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const size_t stream_ID, const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for (list::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ( - (allStream || ((!allStream && ((*i).m_numericIP == ipAddr)) || ((*i).m_hostIP == ipAddr))) && - ((*i).m_stream_ID == stream_ID)) - { - m_list.erase(i); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, stream_ID, allStream, true, false); - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t stream_ID, const bool use_lock = true) throw() - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && - ((ipAddr == (*i).m_numericIP) || (ipAddr == (*i).m_hostIP))) - { - return true; - } - } - } - - return false; - } - - void get(std::vector &rl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - rl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -ripList::ripList() : m_impl(0) -{ - m_impl = new ripList::impl; -} - -ripList::~ripList() throw() -{ - forget(m_impl); -} - -bool ripList::load(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool ripList::save(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool ripList::add(const utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, stream_ID, soft); -} - -// true if removed -bool ripList::remove(const utf8 &ipAddr, const size_t stream_ID, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, stream_ID, allStream); -} - -// true if found -bool ripList::find(const utf8 &ipAddr, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, stream_ID); -} - -void ripList::get(vector &bl, const size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl, stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/ripList.h b/Src/Plugins/DSP/sc_serv3/ripList.h deleted file mode 100644 index 9ae418a2..00000000 --- a/Src/Plugins/DSP/sc_serv3/ripList.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#ifndef ripList_H_ -#define ripList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of reserved IPs -// these are remote addresses that must always be allowed in no matter what. - -class ripList -{ -private: - class impl; - impl *m_impl; - -public: - struct rip_t - { - uniString::utf8 m_numericIP; - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - size_t m_stream_ID; // used to differentiate - - rip_t(const uniString::utf8 &numericIP, const size_t stream_ID) throw() : m_numericIP(numericIP), m_stream_ID(stream_ID) {} - rip_t() throw() : m_stream_ID(0) {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &ipAddr, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - ripList(); - ~ripList() throw(); - - // for web administration reference - void get(std::vector &rl, size_t stream_ID) throw(); -}; - -extern ripList g_ripList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.rc b/Src/Plugins/DSP/sc_serv3/sc_serv.rc deleted file mode 100644 index 080ed630..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.rc +++ /dev/null @@ -1,112 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 777,21,01,2023 - PRODUCTVERSION 2,6,1,777 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Radionomy SA" - VALUE "FileDescription", "Shoutcast DNAS v2.6.1" - VALUE "FileVersion", "777, 21, 01, 2022" - VALUE "InternalName", "sc_serv.exe" - VALUE "LegalCopyright", "Copyright © 2014-2023 Radionomy SA" - VALUE "LegalTrademarks", "Shoutcast is a trademark of Radionomy SA" - VALUE "OriginalFilename", "sc_serv.exe" - VALUE "ProductName", "Shoutcast DNAS v2.6.1" - VALUE "ProductVersion", "2, 6, 1, 777" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICY ICON "icy.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj b/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj deleted file mode 100644 index 4d3d1187..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj +++ /dev/null @@ -1,393 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 17.0 - {5A93B2EA-61E0-4079-A002-06B4EA498853} - sc_serv - Win32Proj - 10.0.19041.0 - - - - Application - v142 - Unicode - true - - - Application - v142 - Unicode - false - - - Application - v142 - Unicode - true - - - Application - v142 - Unicode - false - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>17.0.32505.173 - - - $(PlatformShortName)_$(Configuration)\ - $(PlatformShortName)_$(Configuration)\ - false - false - $(IncludePath) - $(LibraryPath) - - - $(PlatformShortName)_$(Configuration)\ - $(PlatformShortName)_$(Configuration)\ - false - false - - - $(PlatformShortName)_$(Configuration)\ - $(PlatformShortName)_$(Configuration)\ - false - false - $(IncludePath) - $(LibraryPath) - - - $(PlatformShortName)_$(Configuration)\ - $(PlatformShortName)_$(Configuration)\ - false - false - - - false - true - - - false - - - Debug - x86-windows-static - - - - - false - x86-windows-static - - - - - false - x86-windows-static - Debug - - - - - false - x86-windows-static - - - - Disabled - .;nmrCommon;GeoIP\libGeoIP;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include;.\deps\win32\include;%(AdditionalIncludeDirectories) - _WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WINVER=0x0601;XML_STATIC;_DEBUG;WIN32;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - ProgramDatabase - 4290;4996;4512;4505;4244;4127;4100;4057;%(DisableSpecificWarnings) - true - $(IntDir)$(TargetName).pdb - - - crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;%(AdditionalDependencies) - true - true - Console - true - MachineX86 - %(AdditionalLibraryDirectories) - $(IntDir)$(TargetName).pdb - false - - - - - Disabled - nmrCommon;deps\win64\include;GeoIP\libGeoIP;libcurl\include;pthread-win32;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;WINVER=0x0500;ZLIB_WINAPI;CURL_STATICLIB;XML_STATIC;PTW32_STATIC_LIB;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - ProgramDatabase - 4290;4996;%(DisableSpecificWarnings) - true - $(IntDir)$(TargetName).pdb - - - crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;expat.lib;%(AdditionalDependencies) - LinkVerboseLib - $(ProjectDir)..\..\..\external_dependencies\expat\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories) - true - true - Console - true - MachineX64 - false - $(IntDir)$(TargetName).pdb - - - - - MinSpace - Size - .;nmrCommon;GeoIP\libGeoIP;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include;.\deps\win32\include;%(AdditionalIncludeDirectories) - _WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WINVER=0x0601;XML_STATIC;NDEBUG;WIN32;%(PreprocessorDefinitions) - true - true - Level3 - None - 4290;4996;4512;4505;4244;4127;4100;4057;%(DisableSpecificWarnings) - true - $(IntDir)$(TargetName).pdb - MultiThreaded - - - crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - false - Console - true - true - true - MachineX86 - $(IntDir)$(TargetName).pdb - false - true - UseLinkTimeCodeGeneration - - - - - MinSpace - Size - nmrCommon;GeoIP\libGeoIP;deps\win64\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;WINVER=0x0500;ZLIB_WINAPI;CURL_STATICLIB;XML_STATIC;PTW32_STATIC_LIB;%(PreprocessorDefinitions) - true - true - Level3 - None - 4290;4996;%(DisableSpecificWarnings) - true - $(IntDir)$(TargetName).pdb - MultiThreaded - - - false - - - crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;expat.lib;%(AdditionalDependencies) - NotSet - $(ProjectDir)..\..\..\external_dependencies\expat\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories) - false - false - Console - true - true - true - MachineX64 - false - $(IntDir)$(TargetName).pdb - UseLinkTimeCodeGeneration - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mc %(Filename)%(Extension) - - %(Filename).rc;%(Outputs) - mc %(Filename)%(Extension) - - %(Filename).rc;%(Outputs) - - - - - - - - - - \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters b/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters deleted file mode 100644 index 96d430dd..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters +++ /dev/null @@ -1,478 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - {c34a54ac-e9e7-4c8a-b9f9-9cc7758d3d21} - - - {3f82ce9b-8dc8-424a-bdde-8c342e7feb9b} - - - {fb22ca6f-a754-4d98-b944-dd2661f51e25} - - - {22dcd7de-78a0-42dc-aaee-5e0e04ac5b77} - - - {1988542f-b8aa-4c7c-8fb6-12b0e2526d28} - - - {58a554bb-7523-4c5d-9241-bd5415e2c419} - - - {91c2a3ab-9a23-4d9e-bcd6-5b0d3e510903} - - - {9ee51758-e92b-4ad9-aee0-ed69e46618d3} - - - {1ddb836e-12e8-49a1-b8c2-909481bb2c6d} - - - {737011da-050f-44ad-b3b6-5d567f7e4637} - - - {5ee15fe3-52cc-4159-923c-e836529f487a} - - - {67d8861d-7f54-4184-80dd-c9678138388c} - *.h - - - {6e00589b-88ef-4ea1-8f8b-51596a345943} - - - {a656032e-a732-4832-b3a3-0bcea8f6d791} - - - {07a48b1f-8e08-4e90-93b4-71653561b78a} - - - {d27744f0-c242-402c-95be-646dc831abea} - - - {60d7f6d7-1b1e-464a-894b-52daa21450eb} - - - {95b2a92c-2e41-4f7c-810d-a04ae787d388} - - - {8b2c078c-2c94-41bc-9132-db30125dc6d2} - - - {a969a98a-24a4-4466-95a2-829958825065} - - - {bdb6b5dd-09ef-4fd9-83b9-7ca8b40a7695} - - - {1358113b-a1a5-45ec-8c3a-69915899e621} - - - {46611830-1bd8-417e-9843-14aa9c2e3a92} - - - {d9918193-0071-4850-8917-f7ad4516fc3b} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\threading - - - nmrCommon\unicode - - - nmrCommon\unicode - - - nmrCommon\win32 - - - nmrCommon\file - - - webNet - - - webNet - - - aolxml - - - aolxml - - - flashPolicyServer - - - listener_clients - - - listener_clients - - - listener_clients - - - listener_clients - - - listener_clients - - - listener_clients - - - yp - - - geoip - - - geoip - - - geoip - - - geoip - - - updater - - - metrics - - - auth - - - aac - - - mp3 - - - flv - - - source_clients - - - source_clients - - - source_clients - - - source_clients - - - source_clients - - - source_clients - - - source_clients - - - web_ui - - - web_ui - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\services - - - nmrCommon\threading - - - nmrCommon\threading - - - nmrCommon\unicode - - - nmrCommon\unicode - - - nmrCommon\win32 - - - nmrCommon\stl - - - nmrCommon\stl - - - nmrCommon\stl - - - nmrCommon\file - - - webNet - - - webNet - - - aolxml - - - flashPolicyServer - - - listener_clients\Header Files - - - listener_clients\Header Files - - - listener_clients\Header Files - - - listener_clients\Header Files - - - listener_clients\Header Files - - - listener_clients\Header Files - - - yp - - - geoip - - - geoip - - - geoip - - - geoip - - - geoip - - - metrics - - - auth - - - aac - - - mp3 - - - flv - - - source_clients\Header Files - - - source_clients\Header Files - - - source_clients\Header Files - - - source_clients\Header Files - - - source_clients\Header Files - - - source_clients\Header Files - - - source_clients\Header Files - - - web_ui\Header Files - - - web_ui\Header Files - - - - - Resource Files - - - - - Resource Files - - - Resource Files - - - - - Resource Files - - - updater - - - \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/stats.cpp b/Src/Plugins/DSP/sc_serv3/stats.cpp deleted file mode 100644 index bfdeda21..00000000 --- a/Src/Plugins/DSP/sc_serv3/stats.cpp +++ /dev/null @@ -1,862 +0,0 @@ -#ifdef _WIN32 -#include -#endif - -#include "protocol_shoutcastClient.h" -#include "stats.h" -#include "agentList.h" -#include "services/stdServiceImpl.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_statLock; - -#define DEBUG_LOG(...) do { if (gOptions.statsDebug()) DLOG(__VA_ARGS__); } while (0) - -#define LOGNAME "[STATS] " - -const utf8 EMPTY_AGENT("**EMPTY**"); - -struct statTableEntry_t -{ - size_t m_peakListeners; - size_t m_totalStreamHits; - typedef map clientEntry_t; - clientEntry_t m_clientData; - - statTableEntry_t() : m_peakListeners(0), m_totalStreamHits(0) {} -}; - -typedef map streamStatTable_t; - -static streamStatTable_t g_streamStatTable; -static size_t g_totalClients; -static size_t g_uniqueClientId; - -const size_t stats::getNewClientId() -{ - return ++g_uniqueClientId; -} - -static bool _kickNonRipClientFromStream(const streamData::streamID_t id) throw() -{ - bool kicked = false; - - // first try our stream - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - statTableEntry_t::clientEntry_t &ce = ste.m_clientData; - - for (statTableEntry_t::clientEntry_t::iterator ci = ce.begin(); (ci != ce.end()) && (!kicked); ++ci) - { - if ((!(*ci).second->m_kicked) && (!(*ci).second->m_ripClient)) - { - (*ci).second->m_kicked = true; - if ((*ci).second->m_client) - { - (*ci).second->m_client->kickNextRound(); - } - kicked = true; - } - } - } - } - - return kicked; -} - -static bool _kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream) throw() -{ - bool kicked = _kickNonRipClientFromStream(id); - if ((!kicked) && anyStream) - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); (i != g_streamStatTable.end()) && (!kicked); ++i) - { - kicked = _kickNonRipClientFromStream((*i).first); - } - } - - return kicked; -} - -const int stats::addClient(const streamData::streamID_t id, const utf8 &hostName, - const utf8 &ipAddr, const utf8 &userAgent, const bool ripClient, - const size_t clientUnique, protocol_shoutcastClient *client) -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (isUserAgentOfficial(toLower(userAgent))) - { - return 1; - } - - statTableEntry_t &ste = g_streamStatTable[id]; - ++ste.m_totalStreamHits; - - if (ste.m_clientData.find(clientUnique) == ste.m_clientData.end()) - { - // seen this crop up a bit and seem dodgy so rejecting (may change based on usage feedback) - if (userAgent.empty() && gOptions.blockEmptyUserAgent()) - { - return -1; - } - - // this will check against a blocked 'user agent' list - // so we can give stations a means to block bad clients - // e.g. Winamp/5.0 or Bass/2.x or something like that - if (!userAgent.empty() && g_agentList.find(userAgent, ((gOptions.read_stream_agentFile(id) && !gOptions.stream_agentFile(id).empty()) ? id : 0))) - { - return -2; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(id, info, extra); - const int _maxUser = gOptions.maxUser(), - maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < _maxUser) ? info.m_streamMaxUser : _maxUser); - - const size_t num_clients = ste.m_clientData.size(); - const bool over = ((maxUsers && ((int)num_clients >= maxUsers)) || - (_maxUser && ((int)g_totalClients >= _maxUser))); - if (over && !ripClient) - { - return 0; // too many, and we are not allowed to boot anyone - } - - if (over && ripClient) // too many, and we are allowed to try to boot someone... - { - // if total reserved is already at the listener limit then nothing else to do - if (getTotalRipClients(id) < num_clients) - { - // we only allow the new listener to join as long as we can kick someone - if (!_kickRandomNonRipClient(id, true)) - { - return 0; - } - } - else - { - return 0; - } - } - - ste.m_clientData[clientUnique] = new stats::clientData_t(hostName, ipAddr, ripClient, client); - ste.m_peakListeners = max(ste.m_clientData.size(), ste.m_peakListeners); - ++g_totalClients; - - DEBUG_LOG(LOGNAME "System wide listener total now " + tos(g_totalClients)); - - return 1; - } - } - return 0; -} - - -// hacky, to maintain a count in here, should be one in sd -long stats::getUserCount (const streamData::streamID_t id) -{ - long c = 0; - if (id > 0) - { - stackLock sml(g_statLock); - statTableEntry_t &ste = g_streamStatTable[id]; - c = ste.m_clientData.size(); - } - return c; -} - - -void stats::removeClient(const streamData::streamID_t id, const size_t clientUnique) -{ - if ((id > 0) && (g_totalClients > 0)) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.find(clientUnique); - if (i != ste.m_clientData.end()) - { - delete i->second; - ste.m_clientData.erase(clientUnique); - - g_totalClients -= 1; - DEBUG_LOG(LOGNAME "System wide listener total now " + tos(g_totalClients)); - } - } - } - } -} - -// get stats. Some values, like newSessions and newConnects set a flag so that clients are only counted once. -// This is fine for touch reporting, but sometimes we want to fetch this information and, since we are not touching YP, -// do not want to set the flags indicating that things have been counted. The "resetAccumulators" flag controls this. -// Set to true for touch, false otherwise -void stats::getStats(streamData::streamID_t id, statsData_t &data, bool resetAccumulators) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - - data.peakListeners = ste.m_peakListeners; - data.totalStreamHits = ste.m_totalStreamHits; - - if (!ste.m_clientData.empty()) - { - set ipTable; - - time_t t = ::time(NULL); - data.connectedListeners = ste.m_clientData.size(); - __uint64 total_listen_time = 0; - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ++data.uniqueListeners; - } - ipTable.insert((*i).second->m_ipAddr); - } - - total_listen_time += (t - (*i).second->m_client->getStartTime()); - if (!(*i).second->m_connectCounted) - { - if (resetAccumulators) - { - (*i).second->m_connectCounted = true; - } - ++data.newConnects; - } - - if ((!(*i).second->m_fiveMinuteCumeCounted) && ((t - (*i).second->m_client->getStartTime()) > (5 * 60))) - { - if (resetAccumulators) - { - (*i).second->m_fiveMinuteCumeCounted = true; - } - ++data.newSessions; - } - } - - data.avgUserListenTime = (data.connectedListeners ? (int)(total_listen_time / data.connectedListeners) : 0); - } - } - } -} - -void stats::getFinalStats() throw() -{ - stackLock sml(g_statLock); - - size_t totalPeak = 0; - utf8 msg; - - if (!g_streamStatTable.empty()) - { - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - size_t peakListeners = (*ti).second.m_peakListeners; - totalPeak += peakListeners; - msg += (msg.size() > 0 ? ",#" : "#") + tos((*ti).first) + ":" + tos(peakListeners); - } - } - - if (totalPeak > 0) - { - msg += (!g_streamStatTable.empty() ? "," : (utf8)"") + "Total: " + tos(totalPeak); - ILOG(LOGNAME "Peak numbers: " + msg); - } -} - -const streamData::streamIDs_t stats::getActiveStreamIds() throw() -{ - stackLock sml(g_statLock); - - streamData::streamIDs_t activeIds; - - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - // we check this to make sure that we're only - // adding 'active' details and skip inactive - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - if (activeIds.find((*ti).first) == activeIds.end()) - { - activeIds.insert((*ti).first); - } - } - } - - return activeIds; -} - -const size_t stats::getTotalUniqueListeners() throw() -{ - stackLock sml(g_statLock); - - size_t uniqueListeners = 0; - - set ipTable; - - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ++uniqueListeners; - } - ipTable.insert((*i).second->m_ipAddr); - } - } - } - } - - return uniqueListeners; -} - -const size_t stats::getTotalRipClients(streamData::streamID_t id) throw() -{ - size_t uniqueListeners = 0; - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && (*i).second->m_ripClient) - { - ++uniqueListeners; - } - } - } - } - } - - return uniqueListeners; -} - -void stats::updateRipClients(const streamData::streamID_t id, const uniString::utf8& ripAddr, const bool mode) -{ - stackLock sml(g_statLock); - - if (id) - { - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).second->m_ipAddr == ripAddr)) - { - (*i).second->m_ripClient = mode; - } - } - } - } - } - else - { - for (streamStatTable_t::iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator c = ste.m_clientData.begin(); c != ste.m_clientData.end(); ++c) - { - if (!(*c).second->m_kicked && ((*c).second->m_ipAddr == ripAddr)) - { - (*c).second->m_ripClient = mode; - } - } - } - } - } -} - -void stats::resetStats(const streamData::streamID_t id) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - // reset peak and stream hits to current client connection level - ste.m_totalStreamHits = ste.m_peakListeners = ste.m_clientData.size(); - } - } -} - -void stats::updatePeak(const streamData::streamID_t id, const size_t peakListeners) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - statTableEntry_t &ste = ((ti != g_streamStatTable.end()) ? (*ti).second : g_streamStatTable[id]); - ste.m_peakListeners = max(peakListeners, ste.m_peakListeners); - } -} - -void stats::updateTriggers(const streamData::streamID_t id, const size_t unique) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).first == unique)) - { - ++(*i).second->m_triggers; - break; - } - } - } - } - } -} - -static bool sortCurrentClientDataByTime(const stats::currentClientData_t* a, const stats::currentClientData_t* b) -{ - return (a->m_startTime < b->m_startTime); -} - -// get all client data blocks for stream -void stats::getClientDataForStream(const streamData::streamID_t id, currentClientList_t &client_data) throw() -{ - stackLock sml(g_statLock); - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - currentClientData_t* client = new currentClientData_t((*i).second->m_hostName, (*i).second->m_ipAddr, - (*i).second->m_client->getXFF(), (*i).second->m_client->getUserAgent(), - (*i).second->m_client->getReferer(), (*i).second->m_triggers, - (*i).second->m_client->getUnique(), (*i).second->m_client->getStartTime(), - (*i).second->m_client->getGroup(), (*i).second->m_client->getClientType(), - (*i).second->m_fiveMinuteCumeCounted, (*i).second->m_connectCounted, - (*i).second->m_ripClient, (*i).second->m_kicked); - client_data.push_back(client); - } - } - } - } - } - else - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - const statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - currentClientData_t* client = new currentClientData_t((*i).second->m_hostName, (*i).second->m_ipAddr, - (*i).second->m_client->getXFF(), (*i).second->m_client->getUserAgent(), - (*i).second->m_client->getReferer(), (*i).second->m_triggers, - (*i).second->m_client->getUnique(), (*i).second->m_client->getStartTime(), - (*i).second->m_client->getGroup(), (*i).second->m_client->getClientType(), - (*i).second->m_fiveMinuteCumeCounted, (*i).second->m_connectCounted, - (*i).second->m_ripClient, (*i).second->m_kicked); - client_data.push_back(client); - } - } - } - } - } - - std::sort(client_data.begin(), client_data.end(), sortCurrentClientDataByTime); -} - -void stats::getClientDataForKicking(const streamData::streamID_t id, kickClientList_t &kick_data) throw() -{ - stackLock sml(g_statLock); - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - kickClientData_t* client = new kickClientData_t((*i).second->m_client->getUserAgent(), - (*i).second->m_client->getUnique(), - (*i).second->m_kicked); - kick_data.push_back(client); - } - } - } - } - } - else - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - const statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - kickClientData_t* client = new kickClientData_t((*i).second->m_client->getUserAgent(), - (*i).second->m_client->getUnique(), - (*i).second->m_kicked); - kick_data.push_back(client); - } - } - } - } - } -} - -void stats::catchPreAddClients(const streamData::streamID_t id) -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - // if we find an active listener which has m_group = -1 then - // we need to get the listener to do a listener_add request. - if (!(*i).second->m_kicked && - (*i).second->m_client->m_removeClientFromStats && - ((*i).second->m_client->getGroup() == -1)) - { - // we only want to do this once - // so we'll set it to group = 0 - // and it'll not be done again. - (*i).second->m_client->setGroup(0); - - DEBUG_LOG((*i).second->m_client->m_clientLogString + "Re-authenticating listener for adverts / metrics."); - - // using this to force an attept to check but only for non - // 'local' listener connections which won't get a group id - if ((isRemoteAddress((*i).second->m_client->m_clientAddr) || - isRemoteAddress((*i).second->m_client->m_XFF))) - { - (*i).second->m_client->authForStream((*i).second->m_client->m_streamData); - } - (*i).second->m_client->reportNewListener(); - } - } - } - } - } -} - -// set flag in client so it will bail on next round. This is safe since the client object -// cannot delete itself until calling stats::removeClient() which is protected by the g_statLock -void stats::kickClient(const streamData::streamID_t id, const size_t unique) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).first == unique)) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - } - break; - } - } - } - } - } -} - -void stats::kickClient(const streamData::streamID_t id, const uniString::utf8& ipAddr) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).second->m_ipAddr == ipAddr)) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - } - } - } - } - } - } -} - -const bool stats::kickAllClients(const streamData::streamID_t id, const bool allStreams) throw() -{ - bool kicked = false; - if ((id > 0) && !allStreams) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - else if (!id && allStreams) - { - stackLock sml(g_statLock); - - for (streamStatTable_t::iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - - return kicked; -} - -static bool sortClientDataByTime(const stats::clientData_t &a, const stats::clientData_t &b) -{ - return (a.m_client->getStartTime() < b.m_client->getStartTime()); -} - -const bool stats::kickDuplicateClients(const streamData::streamID_t id) throw() -{ - bool kicked = false; - if (id > 0) - { - stackLock sml(g_statLock); - - // we first spin through all of the connected listeners and work out - // which listener addresses have more than one connection against it - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - map ipTable; - - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ipTable[(*i).second->m_ipAddr] = 1; - } - else - { - ++ipTable[(*i).second->m_ipAddr]; - } - } - } - } - - if (!ipTable.empty()) - { - for (map::const_iterator ip = ipTable.begin(); ip != ipTable.end(); ++ip) - { - // we now only look at addresses with multiple clients - // being reported for the address which has been noted - if (ip->second > 1) - { - map agentTable; - - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && (ip->first == (*i).second->m_ipAddr)) - { - const utf8 userAgent = (*i).second->m_client->getUserAgent(); - if (agentTable.find(userAgent) == agentTable.end()) - { - agentTable[userAgent] = 1; - } - else - { - ++agentTable[userAgent]; - } - } - } - - if (!agentTable.empty()) - { - std::vector data; - for (map::const_iterator ai = agentTable.begin(); ai != agentTable.end(); ++ai) - { - // this should now just leave us with duplicate - // user-agents connected from the same address - if (ai->second > 1) - { - // now we need to process through and get the - // details needed so we can finally kick them - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && - (ip->first == (*i).second->m_ipAddr) && - (ai->first == (*i).second->m_client->getUserAgent())) - { - data.push_back(*(*i).second); - } - } - } - } - - // now we've got data, we sort by data and then - // process through the final set of data & kick - if (!data.empty()) - { - std::sort(data.begin(), data.end(), sortClientDataByTime); - // remove the newest and kick the remainder - data.pop_back(); - - for (vector::iterator i = data.begin(); i != data.end(); ++i) - { - if (!(*i).m_kicked) - { - (*i).m_kicked = true; - if ((*i).m_client) - { - (*i).m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - } - } - } - } - return kicked; -} - -const bool stats::kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - return _kickRandomNonRipClient(id, anyStream); - } - return false; -} diff --git a/Src/Plugins/DSP/sc_serv3/stats.h b/Src/Plugins/DSP/sc_serv3/stats.h deleted file mode 100644 index d902b112..00000000 --- a/Src/Plugins/DSP/sc_serv3/stats.h +++ /dev/null @@ -1,173 +0,0 @@ -#pragma once -#ifndef stats_H_ -#define stats_H_ - -#include "streamData.h" - -extern uniString::utf8 niceURL(uniString::utf8 srcAddr); - -extern const uniString::utf8 EMPTY_AGENT; - -namespace stats -{ - struct clientData_t - { - uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - uniString::utf8 m_ipAddr; - size_t m_triggers; // number of valid advert triggers done for the client - protocol_shoutcastClient* m_client; // reference to the client (mainly for kicking) - bool m_fiveMinuteCumeCounted; // already reported against 5 minute session (cm) - bool m_connectCounted; // already reported against new connects (ht) - bool m_ripClient; // client cannot be autobooted - bool m_kicked; // was ordered to be kicked and will go away soon - - clientData_t(const uniString::utf8 &hostName, const uniString::utf8 &ipAddr, - const bool ripClient, protocol_shoutcastClient* client) throw() - : m_hostName(niceURL(hostName)), m_ipAddr(niceURL(ipAddr)), - m_triggers(0), m_client(client), m_fiveMinuteCumeCounted(false), - m_connectCounted(false), m_ripClient(ripClient), m_kicked(false) {} - }; - - const size_t getNewClientId(); - - // return false if reach maxUsers for that stream or all streams. If ripClient == true, then this client MUST be added, even - // if it means we have to boot someone - const int addClient(const streamData::streamID_t id, const uniString::utf8& hostName, - const uniString::utf8 &ipAddr, const uniString::utf8 &userAgent, - const bool ripClient, const size_t clientUnique, - protocol_shoutcastClient *client); - void removeClient(const streamData::streamID_t id, const size_t clientUnique); - - struct statsData_t - { - size_t connectedListeners; // li - time_t avgUserListenTime; // alt - size_t newSessions; // cm - size_t newConnects; // ht - size_t peakListeners; - size_t uniqueListeners; - size_t totalStreamHits; // total hits against stream since start - - statsData_t() throw() : connectedListeners(0), avgUserListenTime(0), - newSessions(0), newConnects(0), peakListeners(0), - uniqueListeners(0), totalStreamHits(0) {} - }; - - // get stats. Some values, like newSessions and newConnects set a flag so that clients are only counted once. - // This is fine for touch reporting, but sometimes we want to fetch this information and, since we are not touching YP, - // do not want to set the flags indicating that things have been counted. The "resetAccumulators" flag controls this. - // Set to true for touch, false otherwise - void getStats(const streamData::streamID_t id, statsData_t &data, bool resetAccumulators = false) throw(); - - // provides log message when the DNAS is stopped of stream 'peak' values - void getFinalStats() throw(); - - // works out the total number of unique listeners even if connected to different streams - const size_t getTotalUniqueListeners() throw(); - - // works out the active stream ids so we can also catch listeners - // on non-configured streams but are being provided the backup - const streamData::streamIDs_t getActiveStreamIds() throw(); - - // get the current number of listeners on the specified stream - long getUserCount (const streamData::streamID_t id); - - // wsorks out the total number of reserved listeners on the specified stream - const size_t getTotalRipClients(const streamData::streamID_t id) throw(); - - // updates the appropriate clients (by stream) against any changes to the reserved list - void updateRipClients(const streamData::streamID_t id, const uniString::utf8& ripAddr, const bool mode); - - // only resets peakListeners and totalStreamHits currently with peakListeners set to current listeners if there are any - void resetStats(const streamData::streamID_t id) throw(); - - // used only during a YP 'add' to help restore the previous peak level (if applicable) - void updatePeak(const streamData::streamID_t id, const size_t peakListeners) throw(); - - void updateTriggers(const streamData::streamID_t id, const size_t unique) throw(); - - struct currentClientData_t - { - const uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - const uniString::utf8 m_ipAddr; - const uniString::utf8 m_XFF; - const uniString::utf8 m_userAgent; - const uniString::utf8 m_referer; - - const size_t m_triggers; // number of valid advert triggers done for the client - const size_t m_unique; // clients' unique id - - const time_t m_startTime; // when connection started, used to implement listenerTime - - const int m_group; // advert group id - const streamData::source_t m_clientType; // stream client type - - const bool m_fiveMinuteCumeCounted; // already reported against 5 minute session (cm) - const bool m_connectCounted; // already reported against new connects (ht) - const bool m_ripClient; // client cannot be autobooted - const bool m_kicked; // was ordered to be kicked and will go away soon - - currentClientData_t(const uniString::utf8 &hostName, const uniString::utf8 &ipAddr, - const uniString::utf8 &XFF, const uniString::utf8 &userAgent, - const uniString::utf8 &referer, const size_t triggers, - const size_t unique, const time_t startTime, - const int group, const streamData::source_t clientType, - const bool fiveMinuteCumeCounted, const bool connectCounted, - const bool ripClient, const bool kicked) throw() - : m_hostName(niceURL(hostName)), m_ipAddr(niceURL(ipAddr)), m_XFF(XFF), - m_userAgent(userAgent), m_referer(referer), m_triggers(triggers), - m_unique(unique), m_startTime(startTime), m_group(group), - m_clientType(clientType), m_fiveMinuteCumeCounted(fiveMinuteCumeCounted), - m_connectCounted(connectCounted), m_ripClient(ripClient), m_kicked(kicked) {} - }; - - typedef std::vector currentClientList_t; - void getClientDataForStream(const streamData::streamID_t id, currentClientList_t &client_data) throw(); - - - struct kickClientData_t - { - const uniString::utf8 m_userAgent; - const size_t m_unique; // clients' unique id - const bool m_kicked; // was ordered to be kicked and will go away soon - - kickClientData_t(const uniString::utf8 &userAgent, const size_t unique, const bool kicked) throw() - : m_userAgent(userAgent), m_unique(unique), m_kicked(kicked) {} - }; - - typedef std::vector kickClientList_t; - void getClientDataForKicking(const streamData::streamID_t id, kickClientList_t &kick_data) throw(); - - void catchPreAddClients(const streamData::streamID_t id); - - // kick client if it's still around - void kickClient(const streamData::streamID_t id, const size_t unique) throw(); - void kickClient(const streamData::streamID_t id, const uniString::utf8& ipAddr) throw(); - - // kick all clients currently connected - const bool kickAllClients(const streamData::streamID_t id, const bool allStreams = false) throw(); - - // kick all duplicate clients currently connected - // based on the older first and by the user-agent - const bool kickDuplicateClients(const streamData::streamID_t id) throw(); - - // kick a random nonRip client. return true if successful. If anyStream, then we can boot - // someone from another stream if we have to - const bool kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream = true) throw(); - - struct uniqueClientData_t - { - time_t m_connectTime; // longest connection time of group - uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - uniString::utf8 m_ipAddr; - uniString::utf8 m_XFF; - uniString::utf8 m_userAgent; // either holds a raw or processed list of user agents - uniString::utf8 m_unique; // unique id of the client - size_t m_total; // total number of clients on this - bool m_ripAddr; // if the address is reserved or not - - uniqueClientData_t() throw() : m_connectTime(0), m_total(0), m_ripAddr(false) {} - }; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/streamData.cpp b/Src/Plugins/DSP/sc_serv3/streamData.cpp deleted file mode 100644 index 6a78b00f..00000000 --- a/Src/Plugins/DSP/sc_serv3/streamData.cpp +++ /dev/null @@ -1,5666 +0,0 @@ -#ifdef _WIN32 -#include -#include -#define strncasecmp _strnicmp -#endif -#include -#include -#include -#include -#include -#include "streamData.h" -#include "metadata.h" -#include "stats.h" -#include "aolxml/aolxml.h" -#include "stl/stringUtils.h" -#include "stl/stlx.h" -#include "global.h" -#include "protocol_shoutcastClient.h" -#include "bandwidth.h" -#include "uvox2Common.h" -#include "base64.h" -#include "file/fileUtils.h" -#include "ADTSHeader.h" -#include "MP3Header.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define DEBUG_LOG(...) do { if (gOptions.streamDataDebug()) DLOG(__VA_ARGS__); } while(0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) -#define ADLOGNAME "ADVERT" -#define LOGNAME "STREAMDATA" - -/////////// statics /// - -AOL_namespace::mutex streamData::g_streamMapLock; -set streamData::g_streams; // all the streams, including those that are "dying" -map streamData::g_streamMap; -map streamData::g_streamUptime; -map streamData::g_streamReferenceCounts; -map streamData::g_streamSourceIsConnected; // is the source connected -AOL_namespace::mutex streamData::g_sourceRelayMapLock; -map streamData::g_streamSourceRelayIsActive; // is the source relay active e.g. connected or trying to connect or needs to die? -AOL_namespace::mutex streamData::g_streamSongHistoryMapLock; -map streamData::g_streamSongHistoryMap; -static AOL_namespace::mutex g_streamMessageMapLock; -static std::map g_streamMessageMap; - -// global pool related -AOL_namespace::mutex streamData::adGroups::adContentLock; -list streamData::adGroups::adContentPending; -time_t streamData::adGroups::m_nextDownloadRun; -streamData::adGroups::gpool streamData::adGroups::adData; - -#ifdef LICENCE_FREE - -int streamData::streamInfo::m_allowSSL_global = 1; -int streamData::streamInfo::m_allowAllFormats_global = 1; -int streamData::streamInfo::m_allowBackupURL_global = 1; -int streamData::streamInfo::m_allowMaxBitrate_global = 0; - -#else -// default free version settings if no licence check response -// -int streamData::streamInfo::m_allowSSL_global = 1; -int streamData::streamInfo::m_allowAllFormats_global = 1; -int streamData::streamInfo::m_allowMaxBitrate_global = 0; -int streamData::streamInfo::m_allowBackupURL_global = 1; -#endif - - -// just make sure we drop the collected adverts, helps track memory leakage -streamData::adGroups::gpool::~gpool() -{ - for (; begin() != end(); ) - { - delete begin()->second; - erase (begin()); - } -} - -#if defined(_DEBUG) || defined(DEBUG) -map streamData::g_streamSaving; -#endif - -static size_t handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream); -static size_t handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream); -int xferinfo(void *p, curl_off_t /*dltotal*/, curl_off_t /*dlnow*/, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/); - -class streamData::adGroups::adGroupsRetriever -{ -public: - stringstream ss; - CURL *m_curl; - utf8 post; - streamData::streamID_t m_sid; - char* m_curl_error; - int cleanup; - int loaded; - string last_uuid; - - adGroupsRetriever(const utf8 &url, const streamData::streamID_t sid) : m_curl(0), m_sid(sid), cleanup(0), loaded(0) - { - m_curl_error = new char[CURL_ERROR_SIZE]; - memset(m_curl_error, 0, CURL_ERROR_SIZE); - - streamData *sd = streamData::accessStream(sid); - if (sd) - { - if (!sd->radionomyID().empty() && sd->streamAdvertMode()) - { - m_curl = webClient::setupCurlDefaults(m_curl, ADLOGNAME, (url + "/?radionomyid=" + sd->radionomyID()), 0, 30L, sid); - if (m_curl) - { - const streamData::streamInfo &stream = sd->getInfo(); - - curl_easy_setopt(m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt(m_curl, CURLOPT_HEADERDATA, this); - curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); - curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &ss); - curl_easy_setopt(m_curl, CURLOPT_ERRORBUFFER, &(m_curl_error[0])); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt(m_curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt(m_curl, CURLOPT_XFERINFODATA, (long)sid); - -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - - httpHeaderMap_t vars; - vars["tstamp"] = tos(::time(NULL)); - vars["host"] = sd->streamPublicIP(); - vars["path"] = getStreamPath(sid); - vars["radionomyid"] = vars["ref"] = sd->radionomyID(); - vars["srvid"] = stream.m_serverID; - vars["bitrate"] = tos(sd->streamBitrate()); - vars["codec"] = sd->streamContentType(); - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - - post = encodeVariables(vars); - curl_easy_setopt(m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt(m_curl, CURLOPT_COPYPOSTFIELDS, post.c_str()); - last_uuid = sd->advertGroups.lastUUID; - if (last_uuid == "") - AD_DEBUG_LOG ("sending no UUID", ADLOGNAME, sid); - else - AD_DEBUG_LOG ("sending UUID " + tos(last_uuid), ADLOGNAME, sid); - cleanup = 0; - loaded = 1; - } - else - WLOG ("Unable to create link for map", LOGNAME, sid); - } - // some clients may have already connected to the stream before - // it had been publically listed, so for those we need to force - // an update of the stream's information so we have the new lot - else if (sd->m_streamInfo.m_streamPublic || !gOptions.cdn().empty()) - { - int addFailIgnore = 0, errorCode = 0; - if (sd->YP2_addSuccessful(addFailIgnore, errorCode)) - { - loaded = 2; - } - } - sd->releaseStream(); - } - } - - ~adGroupsRetriever() - { - if (m_curl) - { - // incase we're mid-processig then we don't - // want to do this otherwise things go boom - // instead we allow it to remain and it'll - // be cleaned up once the abort is actioned - if (loaded && cleanup) - { - curl_easy_cleanup(m_curl); - } - m_curl = 0; - } - - forgetArray(m_curl_error); - - loaded = cleanup = 0; - } -}; - - -static size_t handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream) -{ - int amount = (int)(size * nmemb); - size_t remain = amount; - const char *p = (const char*)ptr, *eol = (const char*)memchr (p, '\r', amount); - class streamData::adGroups::adGroupsRetriever *feed = (streamData::adGroups::adGroupsRetriever*)stream; - - if (eol == NULL) - return 0; - - remain = eol - p; - if (remain > 13 && strncasecmp (p, "bluebox-uuid:", 13) == 0) - { - p += 13; - size_t skip = strspn (p, " \t"); - remain -= (13 + skip); - p += skip; - feed->last_uuid = string (p, remain); - DEBUG_LOG ("identified uuid as :" + tos (feed->last_uuid) + ":", ADLOGNAME); - } - bandWidth::updateAmount(bandWidth::ADVERTS, amount); - return amount; -} - -static size_t handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream) -{ - stringstream *ss = (stringstream*)stream; - size_t length = size * nmemb; - if (ss) - { - ss->write((const char*)ptr, length); - } - - bandWidth::updateAmount(bandWidth::ADVERTS, length); - return length; -} - -int xferinfo(void *p, curl_off_t /*dltotal*/, curl_off_t /*dlnow*/, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/) -{ - long sid = (long)p; - const int killed = iskilled(); - - if (killed || (sid >= 0 && !streamData::isSourceConnected((size_t)sid))) - { - WLOG("[ADVERT sid=" + tos(sid) + "] Aborting data transfer due to the " + - (killed ? "server shutting down." : "stream source disconnecting."), ADLOGNAME, sid); - return -1; - } - return 0; -} - -// assumes the g_streamMapLock is set. Creates a stream based on the config data, installs it into -// the necessary tables and returns the result -streamData* streamData::_createNewStream(const streamSetup& setup) throw(exception) -{ - if (setup.m_sid > 0) - { - streamData *result = new streamData(setup); - if (result) - { - g_streamMap[setup.m_sid] = result; - g_streams.insert(result); - g_streamUptime[setup.m_sid] = ::time(NULL); - g_streamReferenceCounts[result] = 1; - g_streamSourceIsConnected[result] = true; - DEBUG_LOG(setup.m_logString + "Creating new stream for ID " + tos(setup.m_sid), LOGNAME, setup.m_sid); - return result; - } - else - { - DEBUG_LOG(setup.m_logString + "Failed to create new stream for ID " + tos(setup.m_sid)); - } - } - return 0; -} - -/* - Create a type 1 (old shoutcast) stream. A number of things can happen here - 1) Sources are disabled - return NULL - 2) Stream does not exist - create a new one - 3) If the stream exists and a source is connected, return NULL - 4) If the stream exists, but the source is not connected, then check the stream configuration. - a) Compatible, return the streamData - b) Incompatible, boot clients, move stream to dead pool, create a new one -*/ -streamData* streamData::createStream(const streamSetup& setup) throw(exception) -{ - streamData *result = 0; - - if (setup.m_sid > 0) - { - stackLock sml(g_streamMapLock); - - // does the stream exist - map::const_iterator i = g_streamMap.find(setup.m_sid); - - if (i == g_streamMap.end()) - { - // case 2) The stream does not exist - result = _createNewStream(setup); - } - else // cases 3 and 4 - { - streamData *sd = (*i).second; - // data structure integrity - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - assert(g_streams.find(sd) != g_streams.end()); - assert(g_streamReferenceCounts.find(sd) != g_streamReferenceCounts.end()); - assert(g_streamReferenceCounts[sd] > 0); - - if (!g_streamSourceIsConnected[sd]) - { - // case 4 - stream exists and source is not connected - if (sd->isSourceCompatible(setup)) - { - // case 4a - streams exists and is compatible - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - else - { - if (!setup.m_backupURL.empty() && !sd->isBackupStream(setup.m_sid)) - { - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - // case 4b - source is incompatible. Move current stream to the dead pool and create a new one - else - { - DEBUG_LOG(setup.m_logString + "Source has changed. Moving old stream " + - tos(setup.m_sid) + " to dead pool and creating a new one.", LOGNAME, setup.m_sid); - // if you call die on a stream you MUST remove it from the g_streamMap - _moveStreamToDeadPool(setup.m_sid); - result = _createNewStream(setup); - } - } - } - // else, case 3 - source is connected. Do nothing and return default intializer of result (NULL) - else - { - // if we have a backup running and a non-backup trying - // to connect then we should allow it to connect to it - if (!setup.m_backup && sd->isBackupStream(setup.m_sid)) - { - // case 4xxx - source is incompatible. Move current stream to the dead pool and create a new one - sd->setKill((sd->isBackupStream(setup.m_sid) ? 2 : 1)); - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - // otherwise block the source connection from joining - // as we should not override an existing true source. - } - } - } - if (result) - result->m_startTime = ::time(NULL); - return result; -} - -////////////////////////////////////////////////////////////////////////////////////////////////// -// putting a stream, conceptually, into the dead pool requires a specific order of operations -// to avoid structure corruption. This order is different depending on the reference point -// so these calls cover the scenarios -void streamData::_moveStreamToDeadPool(streamData *sd) throw() -{ - if (sd) - { - g_streamMap.erase(sd->ID()); // do this before calling die, since die() clears objects stream ID() - g_streamUptime.erase(sd->ID()); - sd->die(); - } -} - -void streamData::removeRelayStatus(streamID_t ID) -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, ID); - #endif - stackLock sml(g_sourceRelayMapLock); - - map::iterator r = g_streamSourceRelayIsActive.find(ID); - if (r != g_streamSourceRelayIsActive.end()) - { - g_streamSourceRelayIsActive.erase(r); - } -} - - -void streamData::_moveStreamToDeadPool(map::iterator i) throw() -{ - // if you call die on a stream you MUST remove it from the g_streamMap - (*i).second->die(); - - g_streamUptime.erase((*i).second->m_ID); - g_streamMap.erase(i); -} - -bool streamData::isAllowedType(const int type) -{ - bool mp3; - return isAllowedType(type, mp3); -} - -bool streamData::isAllowedType(const int type, bool& mp3) -{ - mp3 = (type == MP3_DATA); - return (mp3 || (type == AACP_DATA) || (type == AAC_LC_DATA)); -} - -void streamData::_moveStreamToDeadPool(streamData::streamID_t id) throw() -{ - if (id > 0) - { - map::iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - _moveStreamToDeadPool(i); - } - } -} - -////////////////////////////////////////////////////////////////////////////////////////////// - -// you must hold the g_streamMapLock before calling this. increases the reference count -// on stream with indicated ID. returns stream object -streamData* streamData::_increaseReferenceCount(streamID_t id) -{ - streamData *result = 0; - - if (id > 0) - { - map::const_iterator i = g_streamMap.find(id); - - if (i != g_streamMap.end()) - { - assert((*i).second); - map::iterator ic = g_streamReferenceCounts.find((*i).second); - assert(ic != g_streamReferenceCounts.end()); - assert((*ic).second); - ++(*ic).second; - result = (*i).second; - } - } - return result; -} - -// you must hold the g_streamMapLock before calling this. Decreases the reference count -// on the stream. Returns stream object if reference count has not reached zero -void streamData::_reduceReferenceCount(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - map::iterator ic = g_streamReferenceCounts.find(sd); - - // integrity checks - assert(ic != g_streamReferenceCounts.end()); - assert(g_streams.find(sd) != g_streams.end()); - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - - /////////////////// - if (ic != g_streamReferenceCounts.end()) - { - if (--(*ic).second <= 0) - { - // clean it up - if (id) - { - g_streamMap.erase(id); - g_streamUptime.erase(id); - } - - g_streamReferenceCounts.erase(ic); - g_streamSourceIsConnected.erase(sd); - g_streams.erase(sd); - delete sd; - sd = NULL; - - if (id) - { - DEBUG_LOG (logString + "Cleaning up stream as no references remain", LOGNAME, id); - } - } - else - { - DEBUG_LOG (logString + "Stream still has " + tos((*ic).second) + " reference" + ((*ic).second > 1 ? "s" : ""), LOGNAME, id); - } - } - } -} - -void streamData::streamSourceLost(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - stackLock sml(g_streamMapLock); - - assert(g_streamSourceIsConnected[sd]); - g_streamSourceIsConnected[sd] = false; - _reduceReferenceCount(logString, sd, id); - - // if we are auto dumping our users, then move - // the stream to the dead pool immediately - bool autoDumpUsers = gOptions.stream_autoDumpUsers(id); - if (!gOptions.read_stream_autoDumpUsers(id)) - { - autoDumpUsers = gOptions.autoDumpUsers(); - } - - if (autoDumpUsers) - { - _moveStreamToDeadPool(id); - } - } - - // if there are still listeners but no sources - // then (without this) the listeners will halt - // this will force things to keep things alive - threadedRunner::wakeup(); -} - -void streamData::streamClientLost(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - stackLock sml(g_streamMapLock); - - _reduceReferenceCount(logString, sd, id); - } -} - -void streamData::streamUpdate(const streamID_t id, const uniString::utf8 &authHash, - const int streamMaxUser, const int streamMaxBitrate, - const int streamMinBitrate) throw() -{ - if (id > 0) - { - stackLock sml(g_streamMapLock); - - bool authChanged = (m_streamInfo.m_authHash != authHash); - if (authChanged && !m_streamInfo.m_authHash.empty()) - { - YP2_remove(); - } - - m_streamInfo.m_authHash = authHash; - m_streamInfo.m_streamMaxBitrate = streamMaxBitrate; - m_streamInfo.m_streamMinBitrate = streamMinBitrate; - m_streamInfo.m_streamMaxUser = streamMaxUser; - - if (authChanged && !authHash.empty()) - { - YP2_add(); - } - } -} - -void streamData::updateSourceIdent(uniString::utf8& sourceIdent, const bool relay) throw() -{ - // attempt to determine the version of the source connected - if (!sourceIdent.empty()) - { - utf8::size_type pos = sourceIdent.find(utf8("
")); - if (pos != utf8::npos) - { - sourceIdent = sourceIdent.substr(0, pos); - } - pos = sourceIdent.find(utf8("Ultravox/2.1 ")); - if (pos != utf8::npos && pos == 0) - { - sourceIdent = sourceIdent.substr(13); - } - - if (!sourceIdent.empty() && ((!relay && m_streamInfo.m_sourceType != SHOUTCAST2) || relay)) - { - if (m_streamInfo.m_sourceIdent.empty() || - (m_streamInfo.m_sourceIdent == utf8("Legacy / Unknown"))) - { - m_streamInfo.m_sourceIdent = sourceIdent; - } - } - } -} - -// Client wants access to the stream. returns null if stream does not exist -// this one is only called by protocol_admincgi in order to allow metadata updates -// from sc_trans. Actual client connects should use the accessStream(streamID_t,bool) -// call, to allow consideration for whether the stream is is actually connected, or -// to allow rejection if yp2 has not returned stream information yet. -streamData* streamData::accessStream(streamID_t id) throw() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, id); - #endif - - if (id > 0) - { - try - { - if (g_streamMapLock.timedLock(3000)) - { - streamData *sd = _increaseReferenceCount(id); - g_streamMapLock.unlock(); - return sd; - } - } - catch (const exception &ex) - { - WLOG(utf8("Failed to acquire lock(1): ") + ex.what(), LOGNAME, id); - } - } - return 0; -} - -streamData* streamData::accessStream(streamID_t id, bool &isSourceActive) throw() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(utf8(__FUNCTION__) + "(2)", LOGNAME, id); - #endif - - if (id > 0) - { - try - { - if (g_streamMapLock.timedLock(3000)) - { - streamData *sd = _increaseReferenceCount(id); - if (sd) - { - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - isSourceActive = g_streamSourceIsConnected[sd]; - } - g_streamMapLock.unlock(); - return sd; - } - } - catch (const exception &ex) - { - WLOG(utf8("Failed to acquire lock(2): ") + ex.what(), LOGNAME, id); - } - } - - isSourceActive = false; - return 0; -} - -void streamData::releaseStream() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, this->ID()); - #endif - - stackLock sml(g_streamMapLock); - - _reduceReferenceCount(utf8(), this, this->ID()); -} -////////// - -bool streamData::isSourceConnected(streamData::streamID_t id) throw() -{ - if ((id > 0) && g_streamMapLock.timedLock(3000)) - { - map::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - g_streamMapLock.unlock(); - return false; - } - - const bool connected = g_streamSourceIsConnected[(*i).second]; - g_streamMapLock.unlock(); - return connected; - } - return false; -} - -// is a relay source active either from trying to connect or connected -// (which also includes backup sources to prevent multiple spawning) -int streamData::isRelayActive(streamData::streamID_t id, bool &noEntry) throw() -{ - if (id > 0) - { - stackLock sml(g_sourceRelayMapLock); - - map::const_iterator i = g_streamSourceRelayIsActive.find(id); - if (i == g_streamSourceRelayIsActive.end()) - { - noEntry = true; - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] isRelayActive: " + tos(id) + " ~0", LOGNAME, id); - #endif - return 0; - } - - try - { - // only signal active if 1 since 2 is used to signal being stopped - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] isRelayActive: " + tos(id) + " " + tos((id == (*i).first) ? (*i).second : 0), LOGNAME, id); - #endif - return ((id == (*i).first) ? (*i).second : 0); - } - catch(...) - { - } - } - return 0; -} - -int streamData::setRelayActiveFlags (streamData::streamID_t id, bool &noEntry, int flags, int mask) -{ - int state = 0; - string msg; - - if (id <= 0 || (mask == 0 && flags <= 0)) - return -1; - do - { - stackLock sml(g_sourceRelayMapLock); - - if (flags < 0) - { - map::iterator r = g_streamSourceRelayIsActive.find (id); - if (r != g_streamSourceRelayIsActive.end()) - { - state = (*r).second; - flags = state & mask; - msg = " is " + tos (state) + ", flags " + tos(flags) + "/" + tos(mask); - break; // it exists, so skip the setting (flags is nonsensical) and just possible log it - } - g_streamSourceRelayIsActive[id] = 0; // create entry in map with 0 value; - noEntry = true; - return 0; - } - int &v = g_streamSourceRelayIsActive[id]; - - if (mask == 0) - mask = flags; - flags &= mask; // only focus on the requested bits. - if ((v & mask) == flags) - { - state = v; - break; // already set as this, so return -1 - } - msg = " was " + tos (v) + ", flags " + tos(flags) + "/" + tos(mask); - v = (v & ~mask) | (flags & mask); - state = v; - flags = ~state; // invalidate the last test as we have done the change. - - } while (0); - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] RelayActiveFlags: " + tos(id) + " " + tos(state) + msg, LOGNAME, id); -#endif - noEntry = false; - if ((state & mask) == flags) - return -1; - return state; -} - -void streamData::setRelayActive(streamData::streamID_t id, int state) throw() -{ - int p; - do - { - if (id <= 0) - return; - - stackLock sml(g_sourceRelayMapLock); - - if (state < 0) - { - map::iterator r = g_streamSourceRelayIsActive.find (id); - if (r != g_streamSourceRelayIsActive.end()) - { - p = state = (*r).second; - break; // it exists, so skip setting it and just report it - } - state = 0; // create entry in map with 0 value; - } - p = g_streamSourceRelayIsActive[id] = state; - } while (0); - -#if defined(_DEBUG) || defined(DEBUG) - string msg = " was " + tos (p); - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] setRelayActive: " + tos(id) + " " + tos(state) + msg, LOGNAME, id); -#endif -} - -/////////// are used in main() to facilitate an orderly shutdown that sends the -/////////// necessary remsrv to YP -// send die signal to all streams -void streamData::killAllSources() throw() -{ - stackLock sml(g_streamMapLock); - - // if you call die on a stream you must remove it from the g_streamMap - for_each(g_streams.begin(),g_streams.end(),mem_fun(&streamData::die)); - g_streamMap.clear(); -} - -// total of all streamData objects, including those that are dying -size_t streamData::totalStreams() throw() -{ - if (g_streamMapLock.timedLock(3000)) - { - const size_t total = g_streams.size(); - g_streamMapLock.unlock(); - return total; - } - - return 0; -} - -size_t streamData::totalActiveStreams(size_t &lastSID) throw() -{ - size_t total = 0; - if (totalStreams() > 0) - { - size_t inc = 0; - size_t sid = 0; - do - { - streamInfo info; - extraInfo extra; - sid = enumStreams(inc); - if (getStreamInfo(sid, info, extra)) - { - ++total; - lastSID = sid; - } - ++inc; - } - while (sid); - } - return total; -} - -// enumerate the available number of streams actually present -size_t streamData::enumStreams(const size_t index) throw() -{ - stackLock sml(g_streamMapLock); - - if (index < g_streamMap.size()) - { - map::const_iterator i = g_streamMap.begin(); - size_t inc = 0; - while (inc < index) - { - ++inc; - ++i; - } - return (*i).second->ID(); - } - return 0; -} - -// enumerate the available number of streams to get the stream ids -streamData::streamIDs_t streamData::getStreamIds(const int mode) throw() -{ - streamIDs_t streamIds; - if (totalStreams() > 0) - { - size_t inc = 0; - size_t sid = 0; - do - { - sid = streamData::enumStreams(inc); - ++inc; - if (sid) - { - streamIds.insert(sid); - } - } - while (sid); - } - - if (mode) - { - // now we check through for any known but inactive relays - // and then get them included for being kicked as well - vector relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for (vector::const_iterator i = relayList.begin(); i != relayList.end(); ++i) - { - streamIds.insert((*i).m_streamID); - } - } - - if (mode == 2) - { - // this will now do a final check for any listeners which are on - // an un-confiured stream but are being provided a 'backupfile'. - streamData::streamIDs_t activeIds = stats::getActiveStreamIds(); - if (!activeIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = activeIds.begin(); i != activeIds.end(); ++i) - { - streamIds.insert((*i)); - } - } - } - } - - return streamIds; -} - -void streamData::killStreamSource(const streamID_t id) throw() -{ - if (id > 0) - { - // handle relays / backups a bit differently from normal streams - // since if it's not been able to connect or is backup mode then - // the normal 'isSourceConnected' will not be able to kill it. - if ((!gOptions.stream_relayURL(id).empty() && gOptions.stream_movedUrl(id).empty()) || - streamData::isRelayStream(id) || streamData::isBackupStream(id)) - { - bool noEntry = false, active = ((streamData::isRelayActive(id, noEntry) & 12)); - if (active) - { - ILOG(gOptions.logSectionName() + "Kicking source for stream #" + tos(id) + ".", LOGNAME, id); - - // kick source off system - streamData::killSource(id); - } - } - else if (streamData::isSourceConnected(id)) - { - ILOG(gOptions.logSectionName() + "Kicking source for stream #" + tos(id) + ".", LOGNAME, id); - - // kick source off system - streamData::killSource(id); - } - } -} - -// used by web interface to dump a specific source -void streamData::killSource(const streamID_t id, streamData *sd) throw() -{ - if ((id > 0) && g_streamMapLock.timedLock(3000)) - { - if (sd) - { - g_streamSourceIsConnected[sd] = false; - _reduceReferenceCount(utf8(), sd, sd->ID()); - } - - // force flag a source relay kick if this is called - bool noEntry = false; - if ((isRelayActive(id, noEntry) & 12)) - { - setRelayActiveFlags (id, noEntry, 2); - } - _moveStreamToDeadPool(id); - - g_streamMapLock.unlock(); - } -} - -// you must remove this streamData object from the g_streamMap immediately before or after calling -// this, otherwise you'll corrupt the static structures. -// Reason: die will cause the streamData to be removed from g_streams, but since die() causes ID() to return zero, -// it will not get removed from g_streamMap -void streamData::die() throw() -{ - if (!m_dead) - { - stackLock sml(m_stateLock); - _YP2_remove(); - m_dead = 1; - } -} - -///////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////// -utf8 streamData::getStreamContentType(const streamID_t id) throw() -{ - if (id > 0) - { - stackLock sml(g_streamMapLock); - - map::const_iterator i = g_streamMap.find(id); - return (i == g_streamMap.end() ? (utf8)"" : (*i).second->streamContentType()); - } - return ""; -} - -const bool streamData::updateSourceSampleRate(unsigned int& samplerate, const unsigned int read_samplerate) throw() -{ - // we do some extra checking so we make sure we're got - // consecutive frames that are at the same samplerate - // otherwise we can end up with the checking spinning - //DLOG ("samp " + tos(samplerate) + " read " + tos(read_samplerate) + " last" + tos(m_lastStreamSampleRate)); - if (read_samplerate > 0) - { - if ((m_lastStreamSampleRate == 0) || - (m_lastStreamSampleRate == read_samplerate)) - { - // we've got something that matches - m_streamInfo.m_streamSampleRate = samplerate = read_samplerate; - m_lastStreamSampleRate = read_samplerate; - return true; - } - } - return false; -} - -bool streamData::isRelayStream(const streamID_t id) throw() -{ - bool result = false; - if (id > 0) - { - stackLock sml(g_streamMapLock); - - map::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - result = !(*i).second->m_streamInfo.m_relayURL.empty(); - } - } - return result; -} - -bool streamData::isBackupStream(const streamID_t id) throw() -{ - bool result = false; - if (id > 0) - { - map::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - // check if there is a backup specified and also if we've been set as being a running backup - result = (!(*i).second->m_streamInfo.m_backupURL.empty() && (*i).second->m_streamInfo.m_backup); - } - } - return result; -} - -bool streamData::getStreamInfo(const streamID_t id, streamInfo &info, extraInfo &extra) throw() -{ - if (id > 0) - { - extra.ypConnected = 0; - - stackLock sml(g_streamMapLock); - map::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - extra.ypErrorCode = 200; - extra.isConnected = false; - extra.isRelay = false; - extra.isBackup = false; - } - else - { - assert(g_streams.find((*i).second) != g_streams.end()); - assert(g_streamSourceIsConnected.find((*i).second) != g_streamSourceIsConnected.end()); - - info = (*i).second->m_streamInfo; - extra.isConnected = g_streamSourceIsConnected[(*i).second]; - extra.isRelay = !(*i).second->m_streamInfo.m_relayURL.empty(); - extra.isBackup = (!(*i).second->m_streamInfo.m_backupURL.empty() && (*i).second->m_streamInfo.m_backup); - - extra.ypErrorCode = info.m_ypResponseCode; - extra.ypConnected = ((*i).second->m_streamInfo.m_streamPublic && (info.m_ypResponseCode == 200)); - - } - } - else - { - extra.ypConnected = 0; - extra.ypErrorCode = 200; - extra.isConnected = false; - extra.isRelay = false; - extra.isBackup = false; - } - - return extra.isConnected; -} - -void streamData::getStreamSongHistory(const streamID_t id, streamHistory_t& songHistory) throw() -{ - if (id > 0) - { - stackLock sml(g_streamSongHistoryMapLock); - map::const_iterator i = g_streamSongHistoryMap.find(id); - if (i != g_streamSongHistoryMap.end()) - { - songHistory = (*i).second; - } - } -} - -bool streamData::getStreamNextSongs(const streamID_t id, uniString::utf8& currentSong, - uniString::utf8& comingSoon, - vector& nextSongs) throw() -{ - bool isConnected = false; - if (id > 0) - { - stackLock sml(g_streamMapLock); - map::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - assert(g_streamSourceIsConnected.find((*i).second) != g_streamSourceIsConnected.end()); - isConnected = g_streamSourceIsConnected[(*i).second]; - currentSong = (*i).second->m_streamInfo.m_currentSong; - comingSoon = (*i).second->m_streamInfo.m_comingSoon; - nextSongs = (*i).second->m_streamInfo.m_nextSongs; - } - } - return isConnected; -} - -utf8 streamData::getContentType(const streamData::streamInfo &info) throw() -{ - utf8 content; - if (info.m_uvoxDataType == MP3_DATA) - { - content = "MP3"; - } - else if (info.m_uvoxDataType == AACP_DATA || info.m_uvoxDataType == AAC_LC_DATA) - { - content = "HE-AAC"; - } - else if (info.m_uvoxDataType == OGG_DATA) - { - content = "OGG Vorbis"; - } - else - { - content = aolxml::escapeXML(!info.m_contentType.empty() ? info.m_contentType : "unknown"); - if (content == "video/nsv") - { - content = "NSV"; - } - } - return content; -} - -//////////////////////////////////////////////////////////////////////////////////////////////// -/*********************************************************************************************/ -//////////////////////////////////////////////////////////////////////////////////////////////// - -// file names for intro and backup files can have %d in them which should be replace by the bitrate -static uniFile::filenameType parseSpecialName(const uniFile::filenameType &rootName, const size_t bitrate) throw() -{ - uniFile::filenameType result = rootName; - if (!result.empty()) - { - uniFile::filenameType::size_type pos = result.find(uniFile::filenameType("%d")); - if (pos != uniFile::filenameType::npos) - { - result.replace(pos,2,uniFile::filenameType(tos(bitrate))); - } - } - return result; -} - - -int streamData::convertRawToUvox (vector<__uint8> &sc2buffer, const vector<__uint8> &buf, - const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw() -{ - __uint64 frameCount = 0; - int last_size = 0, end = 0; - const int len = (int)buf.size(); - const bool mp3 = (uvoxDataType == MP3_DATA); - - for (int i = 0; (i < (len - 8)) && !iskilled();) - { - unsigned int read_samplerate = 0; - __uint8 asc_header[2] = {0}; - int read_bitrate = 0; - const int found = (mp3 ? getMP3FrameInfo((const char*)&(buf[i]), &read_samplerate, &read_bitrate) : - getADTSFrameInfo((const char*)&(buf[i]), &read_samplerate, asc_header)); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0) && (mp3 && bitrate ? (read_bitrate == bitrate) : 1) && - (!mp3 || !samplerate || (samplerate == read_samplerate))) - { - if (!frameCount) - { - end = i; - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= len) - { - formMessage(&buf[end], last_size, uvoxDataType, sc2buffer); - end += last_size; - ++frameCount; - } - else - { - break; - } - } - else - { - ++i; - } - } - return frameCount; -} - - -// take raw file data and build sc1 and sc2 data buffers -void streamData::specialFileData::updateUvoxData (const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw() -{ - const vector<__uint8> &buf = m_sc1Buffer; - - m_sc2Buffer.clear(); - if (buf.size() > 0) // can't take subscript of data[0] if siz==0 - { - int frames = convertRawToUvox (m_sc2Buffer, buf, uvoxDataType, bitrate, samplerate); - if (frames) - m_samplerate = samplerate; - m_missing = (frames ? false : true); - m_lastUsed = ::time(NULL); - } -} - -// replace data with collection of uvox packets with given data type -void streamData::specialFileData::replaceData(const vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw() -{ - stackLock sml(m_lock); - - m_sc1Buffer = data; - - updateUvoxData (uvoxDataType, bitrate, samplerate); -} - - -void streamData::specialFileData::release (specialFileData *f) -{ - AD_DEBUG_LOG ("[STREAMDATA] content release " + f->m_description + ", count was " + tos (f->m_refcount)); - if (f->m_refcount > 1) - { - --f->m_refcount; - f->m_lastUsed = ::time (NULL); - return; - } - delete f; -} - - -int streamData::specialFileData::verifyData (const utf8 &logString) -{ - // attempt to strip out any tags from the file - // to increase client connection reliability - - size_t siz = m_sc1Buffer.size(); - // check for ID3v2.x tag - if (siz > 3 && - (m_sc1Buffer[0] == 'I') && - (m_sc1Buffer[1] == 'D') && - (m_sc1Buffer[2] == '3')) - { - int id3len = make28BitValue(&m_sc1Buffer[6]) + 10; - m_sc1Buffer.erase (m_sc1Buffer.begin(), m_sc1Buffer.begin()+id3len); - siz = m_sc1Buffer.size(); - } - - // check for ID3v1.x tag - if (siz > 128 && - (m_sc1Buffer[siz-128] == 'T') && - (m_sc1Buffer[siz-127] == 'A') && - (m_sc1Buffer[siz-126] == 'G')) - { - m_sc1Buffer.resize(siz -= 128); - } - - // check for Lyrics3 tag - if (siz > 20 && - (m_sc1Buffer[siz-9] == 'L') && - (m_sc1Buffer[siz-8] == 'Y') && - (m_sc1Buffer[siz-7] == 'R') && - (m_sc1Buffer[siz-6] == 'I') && - (m_sc1Buffer[siz-5] == 'C') && - (m_sc1Buffer[siz-4] == 'S') && - (m_sc1Buffer[siz-3] == '2') && - (m_sc1Buffer[siz-2] == '0') && - (m_sc1Buffer[siz-1] == '0')) - { - size_t length = 9; - while (length < siz - 10) - { - if ((m_sc1Buffer[siz-length] == 'L') && - (m_sc1Buffer[siz-length+1] == 'Y') && - (m_sc1Buffer[siz-length+2] == 'R') && - (m_sc1Buffer[siz-length+3] == 'I') && - (m_sc1Buffer[siz-length+4] == 'C') && - (m_sc1Buffer[siz-length+5] == 'S') && - (m_sc1Buffer[siz-length+6] == 'B') && - (m_sc1Buffer[siz-length+7] == 'E') && - (m_sc1Buffer[siz-length+8] == 'G') && - (m_sc1Buffer[siz-length+9] == 'I') && - (m_sc1Buffer[siz-length+10] == 'N')) - { - m_sc1Buffer.resize(siz -= length); - break; - } - ++length; - } - } - - // check for Ape tag - if (siz > 8) - { - size_t pos = 0; - while (pos < siz - 8) - { - if (siz > 32 && - (m_sc1Buffer[pos] == 'A') && - (m_sc1Buffer[pos+1] == 'P') && - (m_sc1Buffer[pos+2] == 'E') && - (m_sc1Buffer[pos+3] == 'T') && - (m_sc1Buffer[pos+4] == 'A') && - (m_sc1Buffer[pos+5] == 'G') && - (m_sc1Buffer[pos+6] == 'E') && - (m_sc1Buffer[pos+7] == 'X')) - { - struct HeaderData - { - __uint32 version; - __uint32 size; - __uint32 items; - __uint32 flags; - }; - HeaderData *header = (HeaderData*)&(m_sc1Buffer[pos+8]); - int size = header->size; - int flags = header->flags; - - enum - { - FLAG_HEADER_HAS_HEADER = (1 << 31), - FLAG_HEADER_NO_FOOTER = (1 << 30), - FLAG_HEADER_IS_HEADER = (1 << 29) - }; - - if (!!(flags & FLAG_HEADER_IS_HEADER) && !(flags & FLAG_HEADER_NO_FOOTER)) - { - size += 32; - } - if (!(flags & FLAG_HEADER_IS_HEADER) && !!(flags & FLAG_HEADER_HAS_HEADER)) - { - size += 32; - } - m_sc1Buffer.resize(siz -= size); - break; - } - ++pos; - } - } - int len = (int)m_sc1Buffer.size(); - if (len > 4) - { - parserInfo *parser = NULL; - unsigned syncFrames = 0; - - getFrameInfo (parser, syncFrames, (unsigned char*)&(m_sc1Buffer[0]), len, 0); - if (parser) - { - utf8 msg = logString; - - if (parser->m_reduce) - m_sc1Buffer.resize (len - parser->m_reduce); - msg += " Loaded "; - msg += m_description; - msg += ", "; - msg += tos(m_sc1Buffer.size()); - msg += " bytes, "; - msg += parser->m_description; - if (parser->m_duration < 1) - { - msg += " (frames "; - msg += tos(parser->m_frameCount); - msg += ")"; - } - m_bitrate = parser->m_bitrate; - m_samplerate = parser->m_samplerate; - m_duration = parser->m_duration; - DEBUG_LOG (msg, LOGNAME); - updateUvoxData (parser->getUvoxType(), parser->m_bitrate, parser->m_samplerate); - delete parser; - return 0; - } - if (m_description.empty() == false) - WLOG (logString + " Trouble parsing " + m_description); - - } - m_sc1Buffer.clear(); - return -1; -} - - -int streamData::cleanFileData(uniFile::filenameType fn, vector<__uint8> &buffer, size_t siz, - const int bitrate, const unsigned int samplerate, - const int /*uvoxDataType*/, const utf8& logString, - const utf8& /*description*/, unsigned int &read_samplerate) -{ - // attempt to strip out any tags from the file - // to increase client connection reliability - - // check for ID3v2.x tag - if (siz > 3 && - (buffer[0] == 'I') && - (buffer[1] == 'D') && - (buffer[2] == '3')) - { - int id3len = make28BitValue(&buffer[6]) + 10; - buffer.erase (buffer.begin(), buffer.begin()+id3len); - siz = buffer.size(); - } - - // check for ID3v1.x tag - if (siz > 128 && - (buffer[siz-128] == 'T') && - (buffer[siz-127] == 'A') && - (buffer[siz-126] == 'G')) - { - buffer.resize(siz -= 128); - } - - // check for Lyrics3 tag - if (siz > 20 && - (buffer[siz-9] == 'L') && - (buffer[siz-8] == 'Y') && - (buffer[siz-7] == 'R') && - (buffer[siz-6] == 'I') && - (buffer[siz-5] == 'C') && - (buffer[siz-4] == 'S') && - (buffer[siz-3] == '2') && - (buffer[siz-2] == '0') && - (buffer[siz-1] == '0')) - { - size_t length = 9; - while (length < siz - 10) - { - if ((buffer[siz-length] == 'L') && - (buffer[siz-length+1] == 'Y') && - (buffer[siz-length+2] == 'R') && - (buffer[siz-length+3] == 'I') && - (buffer[siz-length+4] == 'C') && - (buffer[siz-length+5] == 'S') && - (buffer[siz-length+6] == 'B') && - (buffer[siz-length+7] == 'E') && - (buffer[siz-length+8] == 'G') && - (buffer[siz-length+9] == 'I') && - (buffer[siz-length+10] == 'N')) - { - buffer.resize(siz -= length); - break; - } - ++length; - } - } - - // check for Ape tag - if (siz > 8) - { - size_t pos = 0; - while (pos < siz - 8) - { - if (siz > 32 && - (buffer[pos] == 'A') && - (buffer[pos+1] == 'P') && - (buffer[pos+2] == 'E') && - (buffer[pos+3] == 'T') && - (buffer[pos+4] == 'A') && - (buffer[pos+5] == 'G') && - (buffer[pos+6] == 'E') && - (buffer[pos+7] == 'X')) - { - struct HeaderData - { - __uint32 version; - __uint32 size; - __uint32 items; - __uint32 flags; - }; - HeaderData *header = (HeaderData*)&(buffer[pos+8]); - int size = header->size; - int flags = header->flags; - - enum - { - FLAG_HEADER_HAS_HEADER = (1 << 31), - FLAG_HEADER_NO_FOOTER = (1 << 30), - FLAG_HEADER_IS_HEADER = (1 << 29) - }; - - if (!!(flags & FLAG_HEADER_IS_HEADER) && !(flags & FLAG_HEADER_NO_FOOTER)) - { - size += 32; - } - if (!(flags & FLAG_HEADER_IS_HEADER) && !!(flags & FLAG_HEADER_HAS_HEADER)) - { - size += 32; - } - buffer.resize(siz -= size); - break; - } - ++pos; - } - } - - int read_bitrate = 0; - do - { - int len = (int)buffer.size();//, start = 0, end = 0; - if (len > 4) - { - parserInfo *parser = NULL; - unsigned syncFrames = 0; - getFrameInfo (parser, syncFrames, (unsigned char*)&(buffer[0]), len, 0); - if (parser) - { - read_bitrate = parser->m_bitrate; - read_samplerate = parser->m_samplerate; - int ok = true; - utf8 msg = logString; - - if (((read_bitrate == bitrate) || !bitrate) && - ((read_samplerate == samplerate) || !samplerate)) - msg += " Loaded "; - else - { - msg += " Mismatched "; - ok = false; - } - msg += fn; - msg += ", "; - msg += tos(buffer.size()); - msg += " bytes, "; - msg += parser->m_description; - if (parser->m_duration < 1) - { - msg += " (frames "; - msg += tos(parser->m_frameCount); - msg += ")"; - } - delete parser; - if (ok) - { - DEBUG_LOG (msg, LOGNAME); - break; - } - WLOG (msg, LOGNAME); - } - else if (fn.empty() == false) - WLOG (logString + " Trouble parsing " + fn); - } - buffer.clear(); - - } while (0); - - return read_bitrate; -} - -int streamData::specialFileData::loadFromFile(const uniFile::filenameType &name, const int bitrate, - const int /*uvoxDataType*/, const unsigned int samplerate, - const utf8& logString) throw() -{ - stackLock sml(m_lock); - - m_sc1Buffer.clear(); - m_sc2Buffer.clear(); - vector<__uint8> &buffer = m_sc1Buffer; - int read_bitrate = 0; - - uniFile::filenameType fn = parseSpecialName(name, bitrate); - if (!fn.empty()) - { - // KH, fopen etc can take some time if you are dealing with many files at once, in icecast - // I used the lower level open/seek/tell calls in the end. library allocates buffers. - // - FILE *f = uniFile::fopen(fn,"rb"); - if (f) - { - if (!::fseek(f, 0, SEEK_END)) - { - int maxSpecialFileSize = gOptions.maxSpecialFileSize(); - size_t siz = ::ftell(f); - if ((siz > 0) && ((int)siz <= maxSpecialFileSize)) - { - ::fseek(f, 0, SEEK_SET); - buffer.resize (siz); - if (::fread(&(buffer[0]), 1, siz, f) != siz) - { - ELOG(logString + " Error reading " + m_description + " file `" + fn + "'"); - } - else - { - unsigned int read_samplerate = 0; - size_t original_size = buffer.size(); - - verifyData (""); - read_bitrate = m_bitrate; - read_samplerate = m_samplerate; - if (buffer.size() > 0) - { - ILOG(logString + " Loaded " + m_description + " file `" + fn + "' (" + tos(original_size) + " bytes" + - (original_size != buffer.size() ? " - processed down to " + tos(buffer.size()) + " bytes" : "") + ")"); - } - else - { - WLOG(logString + "Skipped " + m_description + " file `" + fn + - "' as it is incompatible with the current stream format. Expected " + - tos(bitrate) + " kbps, got " + (read_bitrate > 0 ? tos(read_bitrate) : "unknown") + - " kbps. Expected " + sampleRateStr(samplerate) + ", got " + sampleRateStr(read_samplerate) + "."); - } - } - } - else - { - ELOG(logString + m_description + " " + fn + " has bad size (" + tos(siz) + ")."); - } - } - else - { - ELOG(logString + "Could not seek to end of " + m_description + " file `" + fn + "'"); - } - ::fclose(f); - } - else - { - ELOG(logString + "Could not open " + m_description + " file `" + - fn + "' (" + errMessage().hideAsString() + ")"); - } - } - return read_bitrate; -} - -void streamData::_setupBuffers(const utf8& logString, const bool re_init) throw() -{ - // load intro and backup files - size_t stream_ID = ID(); - utf8 introFile = gOptions.stream_introFile(stream_ID); - if (!gOptions.read_stream_introFile(stream_ID)) - { - introFile = gOptions.introFile(); - } - - m_introFile.loadFromFile(introFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - - utf8 backupFile = gOptions.stream_backupFile(stream_ID); - if (!gOptions.read_stream_backupFile(stream_ID)) - { - backupFile = gOptions.backupFile(); - } - - m_backupFile.loadFromFile(backupFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - -#if 0 - utf8 adTestFile = gOptions.stream_adTestFile(stream_ID); - if (!gOptions.read_stream_adTestFile(stream_ID)) - { - adTestFile = gOptions.adTestFile(); - } - - m_adTestFile.loadFromFile(adTestFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile2 = gOptions.stream_adTestFile2(stream_ID); - if (!gOptions.read_stream_adTestFile2(stream_ID)) - { - adTestFile2 = gOptions.adTestFile2(); - } - - m_adTestFile2.loadFromFile(adTestFile2, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile3 = gOptions.stream_adTestFile3(stream_ID); - if (!gOptions.read_stream_adTestFile3(stream_ID)) - { - adTestFile3 = gOptions.adTestFile3(); - } - - m_adTestFile3.loadFromFile(adTestFile3, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile4 = gOptions.stream_adTestFile4(stream_ID); - if (!gOptions.read_stream_adTestFile4(stream_ID)) - { - adTestFile4 = gOptions.adTestFile4(); - } - - m_adTestFile4.loadFromFile(adTestFile4, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); -#endif - ///////////////////////////////////////////// - - // determine configuration of ring buffer - size_t requestedSize = gOptions.fixedBufferSize(); - - if ((gOptions.bufferType() == 1) && (m_streamInfo.m_streamBitrate > 0)) - { - DEBUG_LOG(logString + "Calculating buffer size from time (" + - tos(m_streamInfo.m_streamBitrate) + " kbps for " + - tos(gOptions.adaptiveBufferSize()) + "s)", LOGNAME, stream_ID); - requestedSize = (size_t)((gOptions.adaptiveBufferSize() * m_streamInfo.m_streamBitrate * 1024) / 8); - } - - size_t bufferHardLimit = gOptions.bufferHardLimit(); - requestedSize = min(requestedSize, bufferHardLimit); - - DEBUG_LOG(logString + "Requested fixed size of " + tos(requestedSize), LOGNAME, stream_ID); - // make sure it's a power of two - size_t powerOfTwo = 1; - while (true) - { - size_t n = powerOfTwo * 2; - if (n >= requestedSize) - { - requestedSize = n; - break; - } - else - { - powerOfTwo = n; - } - } - - if (re_init) - { - DEBUG_LOG(logString + "Re-initialising buffers", LOGNAME, stream_ID); - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - } - - DEBUG_LOG(logString + "Using buffer size of " + tos(requestedSize), LOGNAME, stream_ID); - m_sc1_ring_buffer.m_data.resize(requestedSize); - m_sc21_ring_buffer.m_data.resize(requestedSize); - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - m_sc1_ring_buffer.m_ptrMask = m_sc21_ring_buffer.m_ptrMask = (requestedSize - 1); -} - -uniString::utf8 streamData::getYPStreamTitle() throw() -{ - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - const sc1MetadataAndExtensionInfo md = getSc1Metadata(0xFFFFFFFF); - if (!md.m_songTitle.empty()) - { - const utf8::size_type pos1 = md.m_songTitle.find(utf8("StreamTitle='")), - pos2 = (pos1 == utf8::npos ? utf8::npos : md.m_songTitle.find(utf8("';"),pos1+13)); - - utf8 metadata = stripWhitespace((pos1 == utf8::npos) || (pos2 == utf8::npos) ? (utf8)"" : md.m_songTitle.substr(pos1+13,pos2-pos1-13)); - // we use this to provide a nicer title to the YP when the advert update occurs - int remove_size = 7; - utf8::size_type pos = metadata.find(utf8("Advert:")); - if (pos != 0) - { - pos = metadata.find(utf8("Advert!")); - } - - if (!metadata.empty() && (pos == 0)) - { - // got a first matching block - metadata = metadata.replace(0, remove_size, (utf8)""); - - // look for an end block - pos = metadata.find(utf8("Advert!")); - if (pos == utf8::npos) - { - remove_size = 7; - pos = metadata.find(utf8("Advert:")); - } - else - { - remove_size = 12; - } - - if (pos != utf8::npos) - { - metadata = metadata.replace(pos, remove_size, (utf8)""); - } - - metadata = stripWhitespace(metadata); - } - - return metadata; - } - return (utf8)""; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////// YP2 Messaging /////////////////////////////////////////////////////////////////////////////// -void streamData::_YP2_add() throw() // yp2 -{ - // only allow formats that we support - if (isAllowedType(m_streamInfo.m_uvoxDataType) && - (m_streamInfo.m_avgBitrate > 0) && - (m_streamInfo.m_streamSampleRate > 0)) - { - if ((!m_dead) && m_ID && m_streamInfo.m_streamPublic) - { -#if 0 - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - const sc1MetadataAndExtensionInfo md = getSc1Metadata(0xFFFFFFFF); - const utf8 songTitle = getYPStreamTitle(); - - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic, - !m_sc21AlbumArtData[0].empty(), !m_sc21AlbumArtData[1].empty()); - - info.bitrate = m_streamInfo.m_avgBitrate; - info.samplerate = m_streamInfo.m_streamSampleRate; - info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - info.mimeType = m_streamInfo.m_contentType; - info.relayURL = m_streamInfo.m_relayURL; - info.songMetadataForYP2 = (!md.m_songMetadataForYP2.empty() ? stripWhitespace(md.m_songMetadataForYP2) : - (!songTitle.empty() ? "" + aolxml::escapeXML(songTitle) + "" : "")); - info.sourceIdent = m_streamInfo.m_sourceIdent; - info.sourceUser = m_streamInfo.m_streamUser; - - m_yp2SessionKey = yp2::add(info, m_creating); -#endif - if (m_yp2SessionKey != yp2::INVALID_SESSION_KEY) - { - m_lastTouchTitle.clear(); - } - - if (!m_maxYPInterval) - { - m_maxYPInterval = gOptions.ypReportInterval(); - } - } - } -} - -void streamData::YP2_add() throw() // yp2 -{ - stackLock sml(m_stateLock); - - _YP2_add(); -} - -// check status and update stream info -void streamData::YP2_updateInfo(const yp2::stationInfo &info) throw() -{ - stackLock sml(m_stateLock); - int maxbitrate = info.m_allowMaxBitrate > 0 ? info.m_allowMaxBitrate : m_streamInfo.m_allowMaxBitrate_global; - int allformats = info.m_allowAllFormats < 0 ? m_streamInfo.m_allowAllFormats_global : info.m_allowAllFormats; - - m_streamInfo.m_streamName = info.m_streamTitle; - m_streamInfo.m_radionomyID = info.m_radionomyID; -#if 0 - for (int i = 0; i < 5; i++) - { - m_streamInfo.m_streamGenre[i] = info.m_streamGenre[i]; - } - m_streamInfo.m_streamURL = info.m_broadcasterURL; - m_streamInfo.m_backupServer = info.m_backupServer; - m_streamInfo.m_backupServersList = info.m_backupServersList; - m_streamInfo.m_publicIP = info.m_publicIP; -#endif - if (m_streamInfo.m_ypResponseCode == 0) - metrics::metrics_stream_up (m_ID, m_streamInfo.m_radionomyID, info.m_serverID, gOptions.publicIP(), getStartTime()); - - m_streamInfo.m_advertMode = info.m_advertMode; - m_streamInfo.m_ypResponseCode = info.m_responseCode; - - // use global default if per-stream settings not provided - m_streamInfo.m_allowSSL = info.m_allowSSL < 0 ? m_streamInfo.m_allowSSL_global : info.m_allowSSL; - m_streamInfo.m_allowAllFormats = allformats; - m_streamInfo.m_allowMaxBitrate = maxbitrate; - m_streamInfo.m_allowBackupURL = info.m_allowBackupURL < 0 ? m_streamInfo.m_allowBackupURL_global : info.m_allowBackupURL; - m_streamInfo.m_stationID = info.m_stationID; - m_streamInfo.m_serverID = info.m_serverID; - advertGroups.setType (info.m_advertType); - - if (gOptions.adMetricsDebug()) - { - string s = "using licence attribs, bitrate "; - if (m_streamInfo.m_allowMaxBitrate) - s += tos (m_streamInfo.m_allowMaxBitrate); - else - s += "unrestricted"; - s += ", fmts "; - s += tos (m_streamInfo.m_allowAllFormats); - s += ", ssl "; - s += tos (m_streamInfo.m_allowSSL); - s += ", backup "; - s += tos (m_streamInfo.m_allowBackupURL); - s += ", ad "; - s += tos (m_streamInfo.m_advertMode); - if (m_streamInfo.m_advertMode == 1) - { - s += ", ad mode "; - s += info.m_advertType.hideAsString(); - if (advertGroups.m_type == ADVERT_MAP_PAUSE) // maybe magic as well - { - size_t min_buf = m_streamInfo.m_streamBitrate * 1000 * 300 / 8; // 5 minutes - size_t powerOfTwo = 1; - while (true) - { - size_t n = powerOfTwo * 2; - if (n >= min_buf) - { - min_buf = n; - break; - } - else - { - powerOfTwo = n; - } - } - - if (min_buf > m_sc1_ring_buffer.m_data.size()) - { - m_sc1_ring_buffer.m_data.resize (min_buf); - m_sc21_ring_buffer.m_data.resize(min_buf); - m_sc1_ring_buffer.m_ptrMask = m_sc21_ring_buffer.m_ptrMask = (min_buf - 1); - s += ", resized buffer to "; - s += tos (min_buf); - } - } - } - DLOG (s, LOGNAME, m_ID); - } -} - -bool streamData::YP2_addSuccessful(int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(m_stateLock); - - yp2::addState_t result = yp2::addStatus(m_yp2SessionKey, addFailIgnore, errorCode); - return (!addFailIgnore ? (result == yp2::ADD_SUCCEEDED) : true); -} - -void streamData::_YP2_remove() throw() -{ - if ((!m_dead) && m_ID && m_streamInfo.m_streamPublic) - { -#if 0 - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic); - - info.streamStartTime = m_startTime; - info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - - yp2::remove(info); -#endif - pushMetricsYP(); - metrics::metrics_stream_down (m_ID, m_streamInfo.m_radionomyID, - m_streamInfo.m_serverID, gOptions.publicIP(), m_startTime); - } -} - -void streamData::YP2_remove() throw() -{ - stackLock sml(m_stateLock); - - _YP2_remove(); -} - -#if 0 -inline void streamData::YP2_update() throw() -{ - m_stateLock.lock(); - - time_t t = ::time(NULL), elapsed = (t - m_lastYPTime); - if (((m_streamInfo.m_streamPublic || !gOptions.cdn().empty()) && (!m_dead) && m_ID && - // make sure we're looking at min and max intervals to ensure we send updates - // even when playing long mixes otherwise we can potentially drop off the YP. - // - // 2.4.8 we now have a fixed min-interval but if there's been no YP add yet - // then we have a 2sec minimum which is a bit more response whilst allowing - // for failed sources / relay connections to do things so we don't YP spam - (elapsed >= (m_yp2SessionKey ? 10 : 2) || elapsed >= m_maxYPInterval))) - { - // make sure we're added - if (m_yp2SessionKey == 0) - { - _YP2_add(); - } - - if (m_yp2SessionKey) - { - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - m_stateLock.unlock(); - const uniString::utf8 songTitle = getYPStreamTitle(); - - // its touch time - if ((songTitle != m_lastTouchTitle) || (elapsed >= m_maxYPInterval)) - { - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic, - !m_sc21AlbumArtData[0].empty(), !m_sc21AlbumArtData[1].empty()); - - stats::statsData_t data; - stats::getStats(m_ID, data, true); - - info.numListeners = data.connectedListeners; // li - info.avgUserListenTime = data.avgUserListenTime; // alt - info.numberOfClientsConnectedMoreThanFiveMinutes = data.newSessions; // cm - info.numberOfClientConnectsSinceLastUpdate = data.newConnects; // ht - info.numUniqueListeners = data.uniqueListeners; - - const ringBufferAccess_t startPos = getClientStartPosition(); - const sc1MetadataAndExtensionInfo md = getSc1Metadata((!startPos ? 0xFFFFFFFF : startPos)); - - //info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - info.songMetadataForYP2 = (!md.m_songMetadataForYP2.empty() ? stripWhitespace(md.m_songMetadataForYP2) : - "" + aolxml::escapeXML(songTitle) + ""); - info.sourceIdent = m_streamInfo.m_sourceIdent; - info.sourceUser = m_streamInfo.m_streamUser; - info.bitrate = m_streamInfo.m_avgBitrate; - info.samplerate = m_streamInfo.m_streamSampleRate; - info.mimeType = m_streamInfo.m_contentType; - info.relayURL = m_streamInfo.m_relayURL; - - m_stateLock.lock(); - yp2::updateResult ur = yp2::update(info); - - m_maxYPInterval = ur.m_maxYPInterval; - if (ur.m_requestQueued) - { - m_lastYPTime = t; - m_lastTouchTitle = songTitle; - } - m_stateLock.unlock(); - } - return; - } - } - m_stateLock.unlock(); -} -#endif - -int streamData::YP_SrvID(const streamID_t id) throw() -{ - if (id > 0) - { - map::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - return 0; - } - return yp2::getSrvID((*i).second->m_yp2SessionKey); - } - return 0; -} - -int streamData::YP_StnID(const streamID_t id) throw() -{ - if (id > 0) - { - map::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - return 0; - } - return yp2::getStnID((*i).second->m_yp2SessionKey); - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -streamData::streamData(const streamSetup& setup) throw() - : m_ID(setup.m_sid), m_nextYPPush(::time(NULL)+10), - m_maxYPInterval(gOptions.ypReportInterval()), - m_yp2SessionKey(111), m_creating(0), - m_kill(0), m_dead(0), m_adTest(0), m_insertAdvert(false), - m_lastStreamSampleRate(setup.m_sampleRate), - m_lastStreamBitrate(0), m_syncFrameCount(0), - m_introFile("intro"), m_backupFile("backup"), - m_adTestFile("test advert"), m_adTestFile2("test advert"), - m_adTestFile3("test advert"), m_adTestFile4("test advert"), - advertGroups(this), m_parser(NULL) -{ - sourceReconnect(setup); - _setupBuffers(srcAddrLogString(setup.m_srcAddr, setup.m_srcPort, setup.m_sid)); -} - -streamData::~streamData() throw() -{ - DEBUG_LOG("[STREAMDATA sid=" + tos(m_ID) + "] " + __FUNCTION__, LOGNAME, m_ID); - - //YP2_remove(); - - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - delete m_parser; -} - -// sc1 style. Return false if stream is already connected -void streamData::sourceReconnect(const streamSetup& setup) throw() -{ - stackLock sml(m_stateLock); - - const bool uvox = (setup.m_sourceType == SHOUTCAST2), - native = (setup.m_sourceType != HTTP); - - m_streamInfo.m_backup = setup.m_backup; - m_streamInfo.m_streamUser = setup.m_streamUser; - m_streamInfo.m_allowPublicRelay = setup.m_allowPublicRelay; - m_streamInfo.m_streamMaxBitrate = setup.m_maxStreamBitrate; - m_streamInfo.m_streamMinBitrate = setup.m_minStreamBitrate; - m_streamInfo.m_streamMaxUser = setup.m_maxStreamUser; - m_streamInfo.m_streamSampleRate = setup.m_sampleRate; - m_streamInfo.m_authHash = setup.m_authHash; - m_streamInfo.m_vbr = setup.m_vbr; - - m_streamInfo.m_srcAddr = setup.m_srcAddr; - m_streamInfo.m_srcPort = setup.m_srcPort; - - m_streamInfo.m_relayURL = setup.m_relayURL; - m_streamInfo.m_backupURL = setup.m_backupURL; - - if (!uvox) - { - m_streamInfo.m_streamName = mapGet(setup.m_headers, (native ? "icy-name" : "ice-name"), (utf8)""); - m_streamInfo.m_streamGenre[0] = mapGet(setup.m_headers, (native ? "icy-genre" : "ice-genre"), utf8("Misc")); - } - else - { - m_streamInfo.m_streamName = setup.m_config.m_icyName; - m_streamInfo.m_streamGenre[0] = setup.m_config.m_icyGenre; - } - - for (int i = 1; i < 5; i++) - { - m_streamInfo.m_streamGenre[i].clear(); - } - - if (!uvox) - { - m_streamInfo.m_streamBitrate = getStreamBitrate(setup.m_headers); - m_streamInfo.m_streamSampleRate = getStreamSamplerate(setup.m_headers); - m_streamInfo.m_streamURL = mapGet(setup.m_headers, (native ? "icy-url" : "ice-url"), (utf8)"http://www.shoutcast.com"); - // sanity handling to map things to something which the YP2 will definitely like - m_streamInfo.m_contentType = fixMimeType(mapGet(setup.m_headers, "content-type", utf8("audio/mpeg"))); - m_streamInfo.m_streamPublic = mapGet(setup.m_headers, (native ? "icy-pub" : "ice-pub"), false); - } - else - { - m_streamInfo.m_streamBitrate = (setup.m_config.m_avgBitrate / 1000); - m_streamInfo.m_streamURL = setup.m_config.m_icyURL; - m_streamInfo.m_contentType = setup.m_config.m_mimeType; - m_streamInfo.m_streamPublic = (setup.m_config.m_icyPub ? true : false); - } - - // see if there's a per-stream option else revert to master - utf8 pub = toLower(gOptions.stream_publicServer(setup.m_sid)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_streamInfo.m_streamPublic = true; - } - else if (pub == "never") - { - m_streamInfo.m_streamPublic = false; - } - - m_streamInfo.m_sourceType = setup.m_sourceType; - - if (!uvox) - { - m_streamInfo.m_avgBitrate = m_streamInfo.m_minBitrate = - m_streamInfo.m_maxBitrate = (m_streamInfo.m_streamBitrate * 1000); - } - else - { - m_streamInfo.m_avgBitrate = setup.m_config.m_avgBitrate; - m_streamInfo.m_minBitrate = m_streamInfo.m_maxBitrate = setup.m_config.m_maxBitrate; - } - - if ((m_streamInfo.m_contentType == "audio/ogg" || m_streamInfo.m_contentType == "application/ogg")) - { - m_streamInfo.m_uvoxDataType = OGG_DATA; - m_streamInfo.m_vbr = true; - } - else if ((m_streamInfo.m_contentType == "audio/aac") || (m_streamInfo.m_contentType == "audio/aacp")) - { - m_streamInfo.m_uvoxDataType = AACP_DATA; - } - else - { - m_streamInfo.m_uvoxDataType = MP3_DATA; - } - - // uvox codes for intro and backup files will be wrong if contentType is empty. This is only a problem - // if we are using vanilla uvox 2 which does not send a mime type (uvox 2.1 does, however) - if (m_streamInfo.m_contentType.empty()) - { - WLOG("Content type of stream " + tos(m_ID) + " is empty. Intro and backup files may not work.", LOGNAME, m_ID); - } - - g_streamUptime[m_ID] = ::time(NULL); - delete m_parser; - m_parser = NULL; -} - - -MP3_FrameInfo *streamData::detectMP3 (unsigned int &failureThresh, const unsigned char *buf, unsigned int buflen, unsigned chk) -{ - unsigned loop = chk ? chk : 10000, remain = buflen, frames = 0; - MP3_FrameInfo info, *parser = NULL; - const unsigned char *p = buf; - __uint64 samples = 0; - - if (buflen < 3000) // get sufficient data to check, saves failing part way through - return NULL; - int len = getMP3FrameInfo (p, buflen, info); - // check a few frames to see about consistency - while (len > 0) - { - //DLOG ("loop is " + tos(loop)); - len = info.verifyFrame (p, remain); - if (len <= 0 || len > remain) - break; - samples += info.m_samples; - frames++; - p += len; - remain -= len; - loop--; - // DLOG("Detecting frames, loop " + tos(loop) + ", remain " + tos(remain)); - } - if (samples > 1000) - { - failureThresh += 100; - parser = new MP3_FrameInfo (buf, buflen); - parser->m_inUse = true; - parser->m_description += info.getVersionName(); - parser->m_description += " layer "; - parser->m_description += info.getLayerName(); - parser->m_description += (info.m_mono ? " mono" : " stereo"); - if (chk == 0 && loop && samples && info.m_samplerate) - { - parser->m_frameCount = frames; - parser->m_duration = ((float)samples / info.m_samplerate); - parser->m_description += " duration "; - parser->m_description += tos (parser->m_duration); - parser->m_description += "s"; - } - if (remain && chk == 0 && loop) - { - parser->m_description += ", reduced size by "; - parser->m_description += tos (remain); - parser->m_reduce = remain; - } - } - return parser; -} - -static unsigned long getMSB4 (unsigned long v) -{ - unsigned long m = v; - int c = 0; - - for (; m > 15; c++, m >>= 1) - ; - DEBUG_LOG ("bitrate estimate mark " + tos(m)); - if (m == 0xF) // binary 1111 is not a normal bit pattern, adjust to 1000 - m = 0x10; - if (m == 0xB) // binary 1011 is not a normal bit pattern, adjust to 1100 - m = 0xC; - return c ? m << c : m; -} - -AAC_FrameInfo *streamData::detectAAC (unsigned int &failureThresh, const unsigned char *buf, unsigned int buflen, unsigned chk) -{ - unsigned int loop = chk ? chk : 10000, remain = buflen; - int bytes = 0; - float fcount = 0; - AAC_FrameInfo info, *parser = NULL; - const unsigned char *p = buf; - - if (buflen < 8000) // get sufficient data to check, saves failing part way through - return 0; - int len = getAACFrameInfo (p, buflen, info); - - // check a few frames to see about consistency - while (len > 0) - { - len = info.verifyFrame (p, remain); - if (len == 0 || len > remain) // short - break; - if (len < 0) // failed to match - break; - p += len; - remain -= len; - bytes += (len - 7); // drop the adts frame header - fcount += info.m_blocks; - loop--; - // DLOG("Detecting frames, loop " + tos(loop) + ", remain " + tos(remain)); - } - if (bytes > 1000) - { - parser = new AAC_FrameInfo (buf, buflen); - failureThresh += 100; - parser->m_inUse = true; - info.m_description += stringUtil::tos (info.m_samplerate); - info.m_description += "hz"; - - // increase the average a small amount, just to help rounding, we do tuncate later - int r = (int)((bytes * 1.028 / fcount) * (parser->m_samplerate / 1000.0)) * 8; - - parser->m_bitrate = getMSB4 ((r/1024)); - parser->m_frameCount = fcount; - - parser->m_description += info.getVersionName(); - parser->m_description += ", "; - parser->m_description += info.getAOT(); - parser->m_description += " ("; - parser->m_description += stringUtil::tos (info.m_aot); - parser->m_description += "), "; - parser->m_description += stringUtil::tos (info.m_samplerate); - parser->m_description += "hz, estimated "; - parser->m_description += tos (parser->m_bitrate); - parser->m_description += " kbps"; - if (remain && chk == 0 && loop) - { - parser->m_description += ", reduced size by "; - parser->m_description += tos (remain); - parser->m_reduce = remain; - } - } - return parser; -} - - -int streamData::getFrameInfo (parserInfo *&parser, unsigned &failureThresh, const unsigned char *buf, unsigned int len, unsigned chk) -{ - int ret = 0, loop = 100; - do - { - loop--; - if (parser && parser->m_inUse) - { - ret = parser->verifyFrame (buf, len); - if (ret >= 0) - break; - delete parser; - parser = NULL; - } - if (len < 3000) - return 0; - parser = detectMP3 (failureThresh, buf, len, chk); - if (parser) - continue; - parser = detectAAC (failureThresh, buf, len, chk); - if (parser) - continue; - return len < 12000 ? 0 : -1; - } while (loop); - - // maybe ID3 check? - if (failureThresh > 0) - --failureThresh; - return ret; -} - - -const bool streamData::syncToStream(short unsigned int& remainderSize, __uint8 *remainder, - int amt, int& bitrate, const int type, const char *buf, - const utf8& logString) -{ - unsigned int samplerate = m_streamInfo.m_streamSampleRate; - bool mp3; - if (streamData::isAllowedType(type, mp3)) - { - int end = 0; - - //DLOG ("process block of " + tos (amt)); - for (int i = 0; (i < (amt - 8)) && !iskilled();) - { - unsigned int read_samplerate = 0; - int read_bitrate = 0; - const unsigned char* f = (const unsigned char *)&(buf[i]); - int remain = amt - i; - int restart = m_parser == NULL ? 1 : 0; - - int found = getFrameInfo (m_parser, m_syncFrameCount, f, remain); - - if (found > remain || found == 0) - { - end = i; - // DLOG ("Need more data for " + tos(found) + " , remaining " + tos(remain)); - break; - } - // DLOG ("frame size return " + tos (found)); - - if (m_parser) - { - if (restart) - { - utf8 msg = logString; - - msg += "stream detected "; - msg += m_parser->m_description; - ILOG (msg, LOGNAME, ID()); - } - read_samplerate = m_parser->m_samplerate; - read_bitrate = m_parser->m_bitrate; - } - - // DLOG ("FME: frame size is " + tos (found)); - if (found > 0) - { - if (m_streamInfo.m_streamSampleRate == 0 && read_samplerate) - { - m_streamInfo.m_streamSampleRate = (samplerate = read_samplerate); - } - if (m_streamInfo.m_streamBitrate == 0) - { - // update everything as we'll have no bitrate if we're calling this... - if (read_bitrate == 0 && bitrate > 0) - m_streamInfo.m_streamBitrate = bitrate; - else - m_streamInfo.m_streamBitrate = (bitrate = read_bitrate); - m_streamInfo.m_avgBitrate = m_streamInfo.m_minBitrate = - m_streamInfo.m_maxBitrate = (bitrate * 1000); - - DEBUG_LOG ("No bitrate info provided, assuming stream settings at " + tos(bitrate) + "k", LOGNAME, ID()); - - // we need to kick things back into shape at this point... - _setupBuffers(logString, true); - - _YP2_add(); - } - if (read_bitrate && m_streamInfo.m_streamBitrate && m_streamInfo.m_vbr == false) - { - if (m_lastStreamBitrate) - { - if (m_lastStreamBitrate != read_bitrate) - { - m_streamInfo.m_vbr = true; - DEBUG_LOG ("Detected bitrate change (vBR) from " + tos (m_streamInfo.m_streamBitrate) + " to " + tos (read_bitrate), LOGNAME, ID()); - } - else - { - if (read_bitrate != m_streamInfo.m_streamBitrate) - { - utf8 msg = "expected bitrate of "; - msg += tos (m_streamInfo.m_streamBitrate); - msg += "k, actually found "; - msg += tos(read_bitrate); - msg += "k, will assume that"; - ILOG (msg, LOGNAME, ID()); - m_streamInfo.m_streamBitrate = read_bitrate; - } - } - } - else - m_lastStreamBitrate = read_bitrate; - } -#if defined(_DEBUG) || defined(DEBUG) - writeSc1((const __uint8 *)&buf[end], found, ID()); -#else - writeSc1((const __uint8 *)&buf[end], found); -#endif - end += found; - i += found; - } - else - { - m_syncFrameCount += 50; - if (m_syncFrameCount > 700) // threshold before dropping stream - return true; - - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - const void *p = memchr (f+1, 255, remain-1); - if (p) - { - i = (int)((unsigned char*)p - (unsigned char*)buf); - DEBUG_LOG ("FMK: found marker, searching from " + tos(i) + " in len " + tos(amt) + ", sync " + tos(m_syncFrameCount), LOGNAME, ID()); - } - else - { - end = i = amt; - DEBUG_LOG ("FMK: skipping to end " + tos (i), LOGNAME, ID()); - } - } - } - - amt = (amt - end); - // DLOG ("EOB: remainder " + tos (remainderSize) + ", end " + tos(end) + ", amt " + tos(amt)); - if ((amt > 0)) // && (samplerate > 0)) - { - memcpy(&(remainder[remainderSize]), &buf[end], amt); - remainderSize += amt; - } - } - - return false; -} - -utf8 streamData::getHTML5Player(const size_t sid) throw() -{ - return ""; -} - -utf8 streamData::getStreamMessage(const size_t sid) throw() -{ - stackLock sml(g_streamMessageMapLock); - - map::const_iterator i = g_streamMessageMap.find(sid); - if (i != g_streamMessageMap.end()) - { - return (*i).second; - } - return ""; -} - -void streamData::updateStreamMessage(const size_t sid, const uniString::utf8& message) throw() -{ - stackLock sml(g_streamMessageMapLock); - - if (message.empty() || (message == "")) - { - map::iterator i = g_streamMessageMap.find(sid); - if (i != g_streamMessageMap.end()) - { - (*i).second.clear(); - } - } - else - { - g_streamMessageMap[sid] = message; - } -} - -const bool streamData::isSourceCompatible(const streamSetup& setup) const throw() -{ - stackLock sml(m_stateLock); - - if (setup.m_sourceType == SHOUTCAST2) - { - if (m_streamInfo.m_contentType != setup.m_config.m_mimeType) - { - return false; - } - - if (m_streamInfo.m_avgBitrate != setup.m_config.m_avgBitrate) - { - return false; - } - if (m_streamInfo.m_maxBitrate != setup.m_config.m_maxBitrate) - { - return false; - } - if (m_streamInfo.m_minBitrate != setup.m_config.m_maxBitrate) - { - return false; - } - return true; - } - else - { - if (m_streamInfo.m_sourceType == SHOUTCAST2) - { - return false; - } - if (m_streamInfo.m_contentType != mapGet(setup.m_headers, "content-type", utf8("audio/mpeg"))) - { - return false; - } - if (!m_streamInfo.m_streamBitrate || (m_streamInfo.m_streamBitrate != getStreamBitrate(setup.m_headers))) - { - return false; - } - return true; - } -} - -// write data into a ring buffer. if packet_starts is provided, then add an entry to it (and also clean it up as necessary) -static void writeToRingBuffer(const __uint8 *data, int amt, AOL_namespace::rwLock &bufferLock, - streamData::ringBuffer_t &buffer, - deque *packet_starts = 0) throw() -{ - stackRWLock sl (bufferLock, false); - if (packet_starts) - { - - const streamData::ringBufferAccess_t ptr = buffer.m_writePtr, - bottom = (ptr - buffer.m_data.size()); // warning this could wrap - - // add new entry - packet_starts->push_back(buffer.m_writePtr); - - // cleanup old ones - int remove_count = 0; - for (deque < streamData::ringBufferAccess_t>::const_iterator i = packet_starts->begin(); i != packet_starts->end(); ++i) - { - streamData::ringBufferAccess_t v = (*i); - // edge case, ptr has rolled over, therefore bottom > ptr - if (bottom > ptr) - { - if ((v < bottom) && (v > ptr)) - { - ++remove_count; - } - else - { - break; - } - } - else - { - // normal case - if ((v < bottom) || (v > ptr)) // note: (v > ptr) probably not necessary, but can't hurt - { - ++remove_count; - } - else - { - break; - } - } - } - while ((remove_count--) > 0) - { - packet_starts->pop_front(); - } - } - - size_t remain = amt; - - while (remain > 0) - { - // get masked ring offset - const streamData::ringBufferAccess_t o = (buffer.m_writePtr & buffer.m_ptrMask); - // don't write beyond end of buffer - const size_t amt_to_write = min (remain, (buffer.m_data.size() - o)); - - memcpy(&(buffer.m_data[o]), data, amt_to_write); - // advance pointers - data += amt_to_write; - remain -= amt_to_write; - buffer.m_writePtr += amt_to_write; - } -} - -// data is shoutcast1 format WITH NO METADATA. Insert into the two ring buffers -#if defined(_DEBUG) || defined(DEBUG) -void streamData::writeSc1(const __uint8 *data, const int amt, const streamID_t) -#else -void streamData::writeSc1(const __uint8 *data, const int amt) -#endif -{ - time_t now = ::time(NULL); - if (m_insertAdvert) - { - adTrigger *t = advertGroups.triggers.empty() ? NULL : advertGroups.triggers.front(); - if (t && t->m_playedAt == (time_t)0) - { - writeToRingBuffer((const __uint8*)"SCAdvert", 8, m_sc1StreamLock, m_sc1_ring_buffer); - writeToRingBuffer((const __uint8*)"SCAdvert", 8, m_sc21StreamLock, m_sc21_ring_buffer); - t->m_startPosSC1 = m_sc1_ring_buffer.m_writePtr; - t->m_startPosSC2 = m_sc21_ring_buffer.m_writePtr; - t->m_returnPtrSC1 = m_sc1_ring_buffer.m_writePtr; - t->m_returnPtrSC2 = m_sc21_ring_buffer.m_writePtr; - t->m_type = advertGroups.m_type; - - if (t->m_type == ADVERT_MAP_FIXED || t->m_type == ADVERT_MAP_FLEX) // overlay - { - t->m_returnPtrSC1 += advertGroups.overlaySize (t); - t->m_returnPtrSC2 += advertGroups.overlaySize (t, true); - DLOG ("overlay of ads, returning to " + tos(t->m_returnPtrSC1), LOGNAME, m_ID); - } - else - { - DLOG ("insert of ads, returning to " + tos(t->m_returnPtrSC1), LOGNAME, m_ID); - } - t->m_playedAt = time(NULL); - t->m_duration = m_duration; - - metrics::adSummary summary; - summary.id = t->m_id; - summary.sid = ID(); - summary.path = getStreamPath (ID()); - summary.tstamp = now; - summary.count = stats::getUserCount (ID()); - summary.sd = this; - - metrics::metrics_advert_started (summary); - } - m_insertAdvert = false; - } - - long uptime = now - streamData::getStreamUptime(ID()); - if ((uptime & 7) == 7) // check for some things every 8 seconds - { - advertGroups.purge (m_sc1_ring_buffer); - - if (m_streamInfo.m_allowAllFormats == 0 && m_parser && m_parser->getUvoxType() != MP3_DATA) - { - WLOG ("Format is not MP3, where only MP3 is allowed", "Licence", ID()); - throwEx(""); - } - if (m_streamInfo.m_allowMaxBitrate && m_streamInfo.m_avgBitrate) - { - int avg = m_streamInfo.m_avgBitrate/1000; - if (avg > (m_streamInfo.m_allowMaxBitrate + 5)) - { - string msg = "Dropping as bitrate needs to be " + tos (m_streamInfo.m_allowMaxBitrate) + "k or less, currently " + tos (avg) +"k"; - WLOG (msg, "Licence", ID()); - throwEx(""); - } - } - } - - // sc1 - if (amt > 0) - { - int len = amt; - // put into the sc1 buffer - writeToRingBuffer(data, len, m_sc1StreamLock, m_sc1_ring_buffer, &m_sc1_packet_starts); -#if 0 - // TODO would be nice to have this as a more formal thing for debugging and / or backup - if (!g_streamSaving[id]) - { - g_streamSaving[id] = uniFile::fopen("D:\\Dev\\git_radionomy\\SHOUTcast\\sc_serv3\\test_" + tos(id) + (m_streamInfo.m_uvoxDataType == MP3_DATA ? ".mp3" : ".aac"), "wb"); - } - if (g_streamSaving[id]) - { - fwrite(data, 1, amt, g_streamSaving[id]); - } - stackLock sml(m_sc1LimitTriggerLock); - for_each(m_sc1LimitTriggers.begin(), m_sc1LimitTriggers.end(), mem_fun(&pipeDrivenSignal::set)); -#endif - } - // sc1 - - // sc21 - m_sc21MetadataLock.lock(); - uvoxMetadata_t md = m_sc21MetadataToPutInline; - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - // const bool trigger = ((amt > 0) || (!md.empty())); - - if (!md.empty()) - { - writeToRingBuffer((const __uint8*)&md[0], (int)md.size(), m_sc21StreamLock, m_sc21_ring_buffer); - } - - int len = amt; - while (len > 0) - { - __uint8 uvoxBuffer[MAX_MESSAGE_SIZE] = {0}; - int left_over = formMessage(data, len, m_streamInfo.m_uvoxDataType, uvoxBuffer); - writeToRingBuffer((const __uint8*)uvoxBuffer, len - left_over + UV2X_OVERHEAD, - m_sc21StreamLock, m_sc21_ring_buffer, &m_sc21_packet_starts); - data += (len - left_over); - len = left_over; - } -#if 0 - if (trigger) - { - stackLock sml(m_sc21LimitTriggerLock); - for_each(m_sc21LimitTriggers.begin(), m_sc21LimitTriggers.end(), - mem_fun(&pipeDrivenSignal::set)); - } - // sc21 - YP2_update(); -#endif - checkForAdverts(); - pushMetricsYP (false); -} - -void streamData::writeSc21(const vector<__uint8> &data) throw() -{ - if (data.empty()) - { - return; - } - - m_sc21MetadataLock.lock(); - uvoxMetadata_t md = m_sc21MetadataToPutInline; - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - if (!md.empty()) - { - writeToRingBuffer((const __uint8*)&md[0], (int)md.size(), - m_sc21StreamLock, m_sc21_ring_buffer); - } - - writeToRingBuffer(&(data[0]), (int)data.size(), m_sc21StreamLock, - m_sc21_ring_buffer, &m_sc21_packet_starts); -#if 0 - stackLock sml(m_sc21LimitTriggerLock); - for_each(m_sc21LimitTriggers.begin(), m_sc21LimitTriggers.end(), - mem_fun(&pipeDrivenSignal::set)); -#endif -} - -static streamData::ringBufferAccess_t _getClientStartPosition (const streamData::ringBuffer_t &/*buffer*/, - deque &packet_starts, - AOL_namespace::rwLock &streamLock, - streamData::ringBufferAccess_t ptr = 0) throw() -{ - stackRWLock sl (streamLock); - - const deque::size_type packet_count = packet_starts.size(); - if (packet_count < 6) - { - return 0; - } - - streamData::ringBufferAccess_t avail_range = (packet_starts.back() - packet_starts.front()); - - if (ptr == 0) - { - streamData::ringBufferAccess_t avg = avail_range / packet_count; - size_t pkts = avg ? (256000/avg) : 0; // target about 250k burst - if (pkts) - { - if (pkts + 6 > packet_count) - pkts = packet_count - 6; - return packet_starts [packet_count - pkts]; - } - return packet_starts.front(); - } - deque::reverse_iterator r = packet_starts.rbegin(), t = r; - if (*r < ptr && (ptr - *r) > 60000) - ILOG ("[ADVERT] Expected transition point still to come, returning early", ADLOGNAME); - for (; r != packet_starts.rend(); ++r) - { - if (*r < ptr) - break; - t = r; - } - // DLOG("start pos, returning " + tos ((long)*t)); - return *t; -} - -const streamData::ringBufferAccess_t streamData::getClientStartPosition(const bool sc2) throw() -{ - return _getClientStartPosition((!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1_packet_starts : m_sc21_packet_starts), - (!sc2 ? m_sc1StreamLock : m_sc21StreamLock)); -} - - -streamData::ringBufferAccess_t streamData::getClientStartPosition (ringBufferAccess_t ptr, bool sc2) throw() -{ - return _getClientStartPosition((!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1_packet_starts : m_sc21_packet_starts), - (!sc2 ? m_sc1StreamLock : m_sc21StreamLock), ptr); -} - - -const int streamData::getStreamData(streamData::ringBufferAccess_t& amt, const streamData::ringBufferAccess_t& readPtr, - vector<__uint8>& data, const size_t remSize, const bool sc2) throw() /* for readers only */ -{ - stackRWLock sl ((!sc2 ? m_sc1StreamLock : m_sc21StreamLock)); - - const streamData::ringBuffer_t& buffer = (!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer); - - amt = (buffer.m_writePtr - readPtr); - if ((amt > 0) && (amt > buffer.m_data.size())) - { - // the pointers are too far apart - underrun - // make the listener handler process a reset - return -1; - } - - const streamData::ringBufferAccess_t offset = (readPtr & buffer.m_ptrMask); - // clamp again so we don't read pass the end of the buffer - // - // if we've got more in remainder than what we're wanting - // to send then we'll prioritise the remainder data first - // before trying to acquire more new data to try to send. - amt = min(amt, min((buffer.m_data.size() - offset), - (streamData::ringBufferAccess_t)max(0, (SEND_SIZE - (int)remSize)))); - - int len = (int)amt; - if (len > 0) - { - const vector<__uint8>::const_iterator pos = buffer.m_data.begin(); - data.insert(data.end(), pos + offset, pos + (offset + len)); - } - - return len; -} - -#if 0 -void streamData::abandonLimitTrigger(pipeDrivenSignal *t, const bool sc2) throw() -{ - if (!sc2) - { - stackLock sml(m_sc1LimitTriggerLock); - m_sc1LimitTriggers.erase(t); - } - else - { - stackLock sml(m_sc21LimitTriggerLock); - m_sc21LimitTriggers.erase(t); - } -} - -void streamData::_scheduleLimitTrigger(pipeDrivenSignal *t, const ringBufferAccess_t readPtr, - AOL_namespace::mutex &streamLock, const ringBuffer_t &ringBuffer, - AOL_namespace::mutex &triggerSetLock, - set*> &triggerSet) throw() -{ - bool add_to_set = true; - - streamLock.lock(); - if (ringBuffer.m_writePtr > readPtr) - { - t->set(); - add_to_set = false; - } - streamLock.unlock(); - - stackLock sml(triggerSetLock); - if (add_to_set) - { - triggerSet.insert(t); - } - else - { - triggerSet.erase(t); - } -} - -void streamData::scheduleLimitTrigger(pipeDrivenSignal *t, - const ringBufferAccess_t readPtr, const bool sc2) throw() -{ - _scheduleLimitTrigger(t, readPtr, (!sc2 ? m_sc1StreamLock : m_sc21StreamLock), - (!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1LimitTriggerLock : m_sc21LimitTriggerLock), - (!sc2 ? m_sc1LimitTriggers : m_sc21LimitTriggers)); -} -#endif - -// find the metadata entry that is <= to ptr. -template -typename T::value_type::second_type _getMetadata(const T &metadataTable, AOL_namespace::mutex &metadataLock, - const streamData::ringBufferAccess_t ptr) throw() -{ - stackLock sml(metadataLock); - - typename T::value_type::second_type result; - - if (metadataTable.empty()) - { - return result; - } - streamData::ringBufferAccess_t old_entry = metadataTable.front().first; // "oldest" entry - streamData::ringBufferAccess_t new_entry = metadataTable.back().first; // "newest" entry - - if (old_entry <= new_entry) - { - // normal case. older entries have lower pointers than later ones - for (typename T::const_iterator i = metadataTable.begin(); i != metadataTable.end(); ++i) - { - if ((*i).first <= ptr) - { - result = (*i).second; - } - else - { - break; - } - } - } - else - { - // wrap case - typename T::const_iterator i = metadataTable.begin(); - - if (ptr >= old_entry) // "upper half" - { - for (; i != metadataTable.end(); ++i) - { - if (((*i).first <= ptr) && ((*i).first >= old_entry)) - { - result = (*i).second; - } - else - { - break; - } - } - } - else if (ptr > new_entry) // in "gap" - { - result = metadataTable.back().second; - } - else // lower half - { - for (; i != metadataTable.end(); ++i) // skip entries in "upper half" - { - if ((*i).first < old_entry) - { - break; - } - } - for (; i != metadataTable.end(); ++i) - { - if ((*i).first <= ptr) - { - result = (*i).second; - } - else - { - break; - } - } - } - } - return result; -} - -streamData::sc1MetadataAndExtensionInfo streamData::getSc1Metadata(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc1MetadataTable, m_sc1MetadataLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21Metadata(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21MetadataTable, m_sc21MetadataLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21StreamAlbumArt(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21StreamAlbumArtTable, m_sc21StreamAlbumArtLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21PlayingAlbumArt(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21PlayingAlbumArtTable, m_sc21PlayingAlbumArtLock, ptr); -} - -// remove stale metadata entries by looking for those that are beyond the bottom of the ring buffer. -// HOWEVER, always keep the bottom one so that clients who enter will have some metadata to work with -template -static void _cleanupMetadataEntries(METATABLE &metadataTable, - const streamData::ringBufferAccess_t ptr, - const streamData::ringBufferAccess_t siz) -{ - streamData::ringBufferAccess_t bottom = ptr - siz; // warning this could wrap - int remove_count = -1; // always leave bottom entry - for (typename METATABLE::const_iterator i = metadataTable.begin(); i != metadataTable.end(); ++i) - { - streamData::ringBufferAccess_t v = (*i).first; - // edge case, ptr has rolled over, therefore bottom > ptr - if (bottom > ptr) - { - if ((v < bottom) && (v > ptr)) - { - ++remove_count; - } - else - { - break; - } - } - else - { - // normal case - if ((v < bottom) || (v > ptr)) // note: (v > ptr) probably not necessary, but can't hurt - { - ++remove_count; - } - else - { - break; - } - } - } - - while ((remove_count--) > 0) - { - metadataTable.pop_front(); - } -} - -template -static void _addMetadata(AOL_namespace::rwLock &streamLock, const streamData::ringBuffer_t &ringBuffer, - AOL_namespace::mutex &metadataLock, METADATA &metadataTable, const MT &md) throw() -{ - // get current position and size of ring buffer - streamLock.lock(); - const streamData::ringBufferAccess_t ptr = ringBuffer.m_writePtr, - siz = ringBuffer.m_data.size(); - streamLock.unlock(); - - // put entry in table - metadataLock.lock(); - metadataTable.push_back(make_pair(ptr, md)); - - // remove any stale entries - _cleanupMetadataEntries(metadataTable, ptr, siz); - metadataLock.unlock(); -} - -bool streamData::validateTitle(uniString::utf8 &m_updinfoSong) throw() -{ - bool allowed = true; - - m_updinfoSong = stripWhitespace(m_updinfoSong); - if (!m_updinfoSong.empty()) - { - // work on lowercase comparison as well as doing a check to see if - // after removing white space + punctuation we have a valid title. - uniString::utf8 m_checkUpdinfoSong = toLower(m_updinfoSong); - - // exclude weird title updates from being accepted - // as no point in giving junk to the user later on - if (m_checkUpdinfoSong.find((utf8)"!doctype") != utf8::npos || - m_checkUpdinfoSong.find((utf8)" &data) throw() -{ - // convert uvox metadata to sc21, sc2 and sc1 - utf8 sc21_metadata_s; - vector<__uint8> sc21_albumart_data; - bool albumart = false; - - sc1MetadataAndExtensionInfo sc1_metadata_and_extension_info; - - if (voxMsgType == MSG_METADATA_XML_NEW) // new shoutcast 2 - { - sc21_metadata_s.insert(sc21_metadata_s.end(), data.begin(), data.end()); - utf8 meta(sc21_metadata_s.begin(), sc21_metadata_s.end()); - - // attempt to get the encoder from the metadata i.e. used to identify the source - try - { - m_streamInfo.m_comingSoon.clear(); - m_streamInfo.m_nextSongs.clear(); - m_streamInfo.m_sourceIdent = metadata::get_XX_from_3902("TENC", meta, m_streamInfo.m_sourceIdent); - m_streamInfo.m_nextSongs = metadata::get_nextsongs_from_3902(meta, m_streamInfo.m_nextSongs); - - // these allow for updating of information from a source when a DJ - // is connected e.g. to sc_trans but is not setup to be listed or - // is just sending through a DJ name update for admin tracking, etc - m_streamInfo.m_streamUser = metadata::get_XX_from_3902("DJ", meta, m_streamInfo.m_streamUser); - - int addFailIgnore = 0, errorCode = 0; - if (!m_streamInfo.m_streamPublic || YP2_addSuccessful(addFailIgnore, errorCode)) - { - if (!m_streamInfo.m_streamPublic || addFailIgnore) - { - // only update the stream name from metadata if public or pending a YP update - m_streamInfo.m_streamName = metadata::get_XX_from_3902("TRSN", meta, m_streamInfo.m_streamName); - } - } - } - catch (const exception &ex) - { - ELOG(ex.what()); - // abort nicely if there was an error - return 0; - } - - // attempt to get the next song from the extended information from the metadata - utf8 m_checkComingSoon = metadata::get_XX_from_3902("extension/soon", meta, m_streamInfo.m_comingSoon); - if (!m_checkComingSoon.empty()) - { - if (validateTitle(m_checkComingSoon)) - { - m_streamInfo.m_comingSoon = m_checkComingSoon; - } - else - { - if (!(m_checkComingSoon.find((utf8)"nextsong") != utf8::npos && m_checkComingSoon.find((utf8)"sctrans2next") != utf8::npos)) - { - WLOG("[ADMINCGI sid=" + tos(ID()) + "] Coming soon title rejected - value not allowed: " + m_checkComingSoon, LOGNAME, ID()); - } - m_streamInfo.m_comingSoon.clear(); - } - } - else - { - if (!m_streamInfo.m_comingSoon.empty()) - { - m_streamInfo.m_comingSoon.clear(); - WLOG("[ADMINCGI sid=" + tos(ID()) + "] Coming soon title cleared", LOGNAME, ID()); - } - } - - // clip out any extension data - utf8::size_type pos1 = sc21_metadata_s.find(utf8("")), // 11 chars - pos2 = sc21_metadata_s.find(utf8("")); // 12 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - // got it, clip it out - sc1_metadata_and_extension_info.m_songMetadataForYP2 = - #ifdef XML_DEBUG - "\t" + - #endif - stripWhitespace(sc21_metadata_s.substr(pos1 + 11, pos2 + 12 - pos1 - 11 - 12)); - } - - try - { - utf8 m_checkSongTitle = metadata::convert_3902_to_shoutcast1(sc21_metadata_s, ID()); - if (sc1_metadata_and_extension_info.m_songTitle != m_checkSongTitle) - { - sc1_metadata_and_extension_info.m_songTitle = m_checkSongTitle; - } - } - catch (const exception &ex) - { - ELOG(string("3902 => Shoutcast 1 metadata conversion error. ") + ex.what() + " 3902=" + eol() + sc21_metadata_s, LOGNAME, ID()); - } - - // if we get a title update, if we've not added then do so as we - // changed adding to the YP to wait a while in 2.1+ so that titles - // can be obtained to ensure the listing is showing all information - // - // 2.4.8 disable this as it's causing quick add / removes to the YP - // which is ok if the stream is ok, but if there's issues, it's not - // and that's then also causing lots of METRICS_RESET_URL messages. - /*if (m_yp2SessionKey == 0) - { - _YP2_add(); - }*/ - } - // handling albumart as required for station and stream artwork - else - { - __uint16 aaMsgType = (voxMsgType & 0xF000); - if (aaMsgType & MSG_METADATA_ALBUMART) - { - sc21_albumart_data.insert(sc21_albumart_data.end(), data.begin(), data.end()); - albumart = true; - } - } - - int ret = 0; - // filter things so we're only doing what is needed at the time - if (albumart == false) - { - uvoxMetadata_t sc21_metadata; - - // ultravox 2.1 style xml - try - { - createMetadataPackets(&sc21_metadata_s[0], (int)sc21_metadata_s.size(), MSG_METADATA_XML_NEW, sc21_metadata); - } - catch (const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - if (!sc1_metadata_and_extension_info.m_songTitle.empty()) - { - _addMetadata(m_sc1StreamLock, m_sc1_ring_buffer, m_sc1MetadataLock, m_sc1MetadataTable, sc1_metadata_and_extension_info); - } - if (!sc21_metadata.empty()) - { - _addMetadata(m_sc21StreamLock, m_sc21_ring_buffer, m_sc21MetadataLock, m_sc21MetadataTable, sc21_metadata); - - m_sc21MetadataLock.lock(); - m_sc21MetadataToPutInline = sc21_metadata; - m_sc21MetadataLock.unlock(); - } - - // maintain history - g_streamSongHistoryMapLock.lock(); - - // attempting to use the pre-filled title information based on forum request so - // that 'artist - album - title' from sc_trans appears in the history (not client) - utf8 metadata(sc21_metadata_s.begin(), sc21_metadata_s.end()); - const vector m_nextSong = metadata::get_nextsongs_from_3902(metadata, m_streamInfo.m_nextSongs, true); - const vector::const_iterator nextSong = m_nextSong.begin(); - - utf8 m_checkSongHistory = (((nextSong != m_nextSong.end()) && !(*nextSong).empty()) ? - (*nextSong) : metadata::get_song_title_from_3902(metadata)); - if (validateTitle(m_checkSongHistory)) - { - map::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - if ((*i).second.empty() || ((*i).second.front().m_title != m_checkSongHistory)) - { - (*i).second.push_front(songHistoryInfo(m_checkSongHistory, metadata)); - } - } - else - { - g_streamSongHistoryMap[ID()].push_front(songHistoryInfo(m_checkSongHistory, metadata)); - } - } - - // do conversions as needed to cope with funky v1 titles from relays for example - map::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - if (!(*i).second.empty()) - { - utf8 m_checkCurrentSong = metadata::toFixedString((*i).second.front().m_title); - if (validateTitle(m_checkCurrentSong)) - { - if (m_streamInfo.m_currentSong != m_checkCurrentSong) - { - m_streamInfo.m_currentSong = m_checkCurrentSong; - } - } - } - - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } - g_streamSongHistoryMapLock.unlock(); - - resetAdvertTriggers(m_streamInfo.m_currentSong); - } - else - { - uvoxMetadata_t sc21_albumart; - - // ultravox 2.1 style albumart - try - { - if (!sc21_albumart_data.empty()) - { - createMetadataPackets(&sc21_albumart_data[0], (int)sc21_albumart_data.size(), voxMsgType, sc21_albumart); - } - else - { - // indicates we need to clear the cached data - } - } - catch (const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - // store a copy of the raw image file and mime type - // so it's easier to display on the admin pages, etc - __uint16 ArtType = voxMsgType & 0x0F00; - if (ArtType & MSG_METADATA_PLAYING_ART) - { - m_sc21AlbumArtData[1] = sc21_albumart_data; - m_sc21AlbumArtMime[1] = (voxMsgType & 0x00FF); - } - else - { - m_sc21AlbumArtData[0] = sc21_albumart_data; - m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - } - - if (!sc21_albumart.empty()) - { - // uvox metadata must also be injected into the stream itself - if (ArtType & MSG_METADATA_PLAYING_ART) - { - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtToPutInline = sc21_albumart; - m_sc21PlayingAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21PlayingAlbumArtLock, - m_sc21PlayingAlbumArtTable, - sc21_albumart); - - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - "DNAS/playingart?sid=" + tos(ID()), - m_streamInfo.m_comingSoon); - - // due to how things work, it's easier to do it all this way and - // then directly insert as if it's pass-through but keep a copy - writeToRingBuffer((const __uint8*)&sc21_albumart[0], - (int)sc21_albumart.size(), - m_sc21StreamLock, m_sc21_ring_buffer); - } - else - { - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtToPutInline = sc21_albumart; - m_sc21StreamAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21StreamAlbumArtLock, - m_sc21StreamAlbumArtTable, - sc21_albumart); - - // if we've got playing artwork then we should skip updating this as it's preferred for the client - // to provide playing artwork first and then the stream branding so it shows playing on joining - if (m_sc21AlbumArtData[1].empty()) - { - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - "DNAS/streamart?sid=" + tos(ID()), - m_streamInfo.m_comingSoon); - } - } - } - else - { - // TODO make sure this is specified if a custom streamart is provided and nothing from the stream - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - (!m_sc21AlbumArtData[0].empty() ? "DNAS/streamart?sid=" + tos(ID()) : ""), - m_streamInfo.m_comingSoon); - } - } - return ret; -} - -void streamData::updateSongHistorySize() throw() -{ - // maintain history - stackLock sml(g_streamSongHistoryMapLock); - - map::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } -} - -void streamData::updateStreamUser(const uniString::utf8& streamUser) -{ - m_streamInfo.m_streamUser = streamUser; -} - -void streamData::resetStreamAuthhash() -{ - m_streamInfo.m_authHash.clear(); - _YP2_add(); -} - -void streamData::resetAdvertTriggers(const uniString::utf8& m_updinfoSong) -{ - if (m_updinfoSong.empty()) - return; - - unsigned d = 120; // default - const char *p = (const char *)&m_updinfoSong[0]; - char s[2] = ""; - int matched = sscanf (p, "Advert%1[!:-]", s); - - if (matched == 1) - { - if (s[0] == '-') - { - char pattern[6]; - matched = ::sscanf (p+7, "%4[0-9]%1[!:]", pattern, s); - if (matched == 2) - { - d = atoi (pattern); - if (d < 1 || d > 999) - d = 120; - } - else - p = NULL; - } - if (p) p = strchr (p+6, s[0]); - if (p) - { - p++; - //::memmove (tag, p, strlen (p)+1); ?? - AD_DEBUG_LOG("[ADVERT sid=" + tos(ID()) + "] " + "Advert trigger detected.", LOGNAME, ID()); - m_insertAdvert = true; - } - } - m_duration = d; - pushMetricsYP(); -} - -int streamData::addSc1MetadataAtCurrentPosition(const utf8 &logString, const utf8 &sc1_metadata_raw, - const utf8 &sc1_url_raw, const utf8 &sc1_next_raw) throw() -{ - const utf8 m_oldCurrentSong = m_streamInfo.m_currentSong; - const utf8 m_oldCurrentURL = m_streamInfo.m_currentURL; - const utf8 m_oldComingSoon = m_streamInfo.m_comingSoon; - - // maintain history - m_stateLock.lock(); - - m_streamInfo.m_currentSong = sc1_metadata_raw; - m_streamInfo.m_comingSoon = sc1_next_raw; - - if (!sc1_url_raw.empty()) - { - m_streamInfo.m_currentURL = sc1_url_raw; - } - else - { - // this allows us to force artwork through for all of the clients when - // it's not provided by the connected source on the first title update - if (m_sc21AlbumArtData[0].empty() && (!gOptions.m_artworkBody[m_ID].empty() || !gOptions.m_artworkBody[0].empty())) - { - vector<__uint8> sc21_albumart_data; - if (!gOptions.m_artworkBody[m_ID].empty()) - { - sc21_albumart_data.insert(sc21_albumart_data.end(), gOptions.m_artworkBody[m_ID].begin(), gOptions.m_artworkBody[m_ID].end()); - } - else - { - sc21_albumart_data.insert(sc21_albumart_data.end(), gOptions.m_artworkBody[0].begin(), gOptions.m_artworkBody[0].end()); - } - - int voxMsgType = 0x4000; - uvoxMetadata_t sc21_albumart; - if (!sc21_albumart_data.empty()) - { - // try to find the correct mime-type to give the clients a hint - utf8::size_type pos = gOptions.artworkFile().rfind((utf8)"."); - if (pos != utf8::npos) - { - utf8 ext = gOptions.artworkFile().substr(pos + 1, gOptions.artworkFile().size()); - if ((ext == "jpeg") || (ext == "jpg")) - { - voxMsgType = 0x4000; - } - else if (ext == "png") - { - voxMsgType = 0x4001; - } - else if (ext == "bmp") - { - voxMsgType = 0x4002; - } - else if (ext == "gif") - { - voxMsgType = 0x4003; - } - } - - createMetadataPackets(&sc21_albumart_data[0], (int)sc21_albumart_data.size(), voxMsgType, sc21_albumart); - } - - m_sc21AlbumArtData[0] = sc21_albumart_data; - m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtToPutInline = sc21_albumart; - m_sc21StreamAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21StreamAlbumArtLock, - m_sc21StreamAlbumArtTable, - sc21_albumart); - - m_streamInfo.m_currentURL = "DNAS/streamart?sid=" + tos(ID()); - } - else - { - m_streamInfo.m_currentURL.clear(); - } - } - - // changed in 2.4 so it will allow repeated 'Advert:xx' - // update through since it's needed for advert triggers - // changed in 2.4.8+ so we can provide a 'test' case - bool sameTitle = (m_oldCurrentSong == m_streamInfo.m_currentSong), - sameUrl = (m_oldCurrentURL == m_streamInfo.m_currentURL), - sameNext = (m_oldComingSoon == m_streamInfo.m_comingSoon); - if ((sameTitle && sameUrl && sameNext && - ((m_streamInfo.m_currentSong.find ((utf8)"Advert:") != 0) && - (m_streamInfo.m_currentSong.find ((utf8)"Test Advert:") != 0)))) - { - // if the same then we might as well skip as it won't add anything - // other than filling the song history list with deemed duplicates - m_stateLock.unlock(); - return 0; - } - - DEBUG_LOG(logString + "title: " + tos(sameTitle) + " - url: " + tos(sameUrl) + " - next: " + tos(sameNext), LOGNAME, ID()); - - // convert sc1 metadata to sc21 metadata - utf8 sc21_metadata_s = metadata::toXML_fromFilename(m_streamInfo.m_currentSong, m_streamInfo.m_currentURL, "%N"); - - g_streamSongHistoryMapLock.lock(); - map::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - (*i).second.push_front(songHistoryInfo(m_streamInfo.m_currentSong, sc21_metadata_s)); - - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } - else - { - g_streamSongHistoryMap[ID()].push_front(songHistoryInfo(m_streamInfo.m_currentSong, sc21_metadata_s));; - } - g_streamSongHistoryMapLock.unlock(); - - resetAdvertTriggers(m_streamInfo.m_currentSong); - - m_stateLock.unlock(); - - sc1MetadataAndExtensionInfo sc1_metadata_and_extension_info; - sc1_metadata_and_extension_info.m_songTitle = "StreamTitle='" + m_streamInfo.m_currentSong + "';"; - - if (!m_streamInfo.m_comingSoon.empty()) - { - // added in 2.5 (dunno if any client will use it or not) - sc1_metadata_and_extension_info.m_songTitle += "StreamNext='" + m_streamInfo.m_comingSoon + "';"; - } - - if (!m_streamInfo.m_currentURL.empty()) - { - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - else - { - if (!m_sc21AlbumArtData[1].empty()) - { - m_streamInfo.m_currentURL = "DNAS/playingart?sid=" + tos(ID()); - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - else - { - // **** TODO **** - - // this allows us to force artwork through for all of the clients when - // it's not provided by the connected source on the first title update - if (m_sc21AlbumArtData[0].empty() && !gOptions.m_artworkBody[0].empty()) - { - m_sc21AlbumArtData[0] = vector<__uint8>(&gOptions.m_artworkBody[0][0], &gOptions.m_artworkBody[0][gOptions.m_artworkBody[0].size()]); - // TODO - //m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - } - - if (!m_sc21AlbumArtData[0].empty()) - { - m_streamInfo.m_currentURL = "DNAS/streamart?sid=" + tos(ID()); - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - } - } - - uvoxMetadata_t sc21_metadata; - try - { - createMetadataPackets(&sc21_metadata_s[0], (int)sc21_metadata_s.size(), MSG_METADATA_XML_NEW, sc21_metadata); - } - catch(const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - if (!sc1_metadata_and_extension_info.m_songTitle.empty()) - { - _addMetadata(m_sc1StreamLock, m_sc1_ring_buffer, m_sc1MetadataLock, m_sc1MetadataTable, sc1_metadata_and_extension_info); - } - - if (!sc21_metadata.empty()) - { - _addMetadata(m_sc21StreamLock, m_sc21_ring_buffer, m_sc21MetadataLock, m_sc21MetadataTable, sc21_metadata); - } - - // uvox metadata must also be injected into the stream itself - if (!sc21_metadata.empty()) - { - m_sc21MetadataLock.lock(); - m_sc21MetadataToPutInline = sc21_metadata; - m_sc21MetadataLock.unlock(); - } - - return (!sameTitle ? 1 : 0) | (!sameUrl ? 2 : 0) | (!sameNext ? 4 : 0); -} - - -void streamData::pushMetricsYP (bool force) -{ - if (m_dead || m_ID <= 0 || m_streamInfo.m_streamPublic == false) - return; - time_t now = ::time(NULL); - if (force == false && m_nextYPPush > now) - return; - - if (m_parser) - { - metrics::metaInfo meta; - - meta.m_sid = m_ID; - meta.m_audience = -1; - meta.m_private = m_streamInfo.m_streamPublic ? false : true; - meta.m_maxListeners = (m_streamInfo.m_streamMaxUser > 0) ? m_streamInfo.m_streamMaxUser : gOptions.maxUser(); - meta.m_song = m_streamInfo.m_currentSong; - meta.m_format = m_streamInfo.m_contentType; - meta.m_bitrate = m_streamInfo.m_streamBitrate; - meta.m_samplerate = m_streamInfo.m_streamSampleRate; - meta.m_agent = m_streamInfo.m_sourceIdent; - meta.m_publicIP = m_streamInfo.m_publicIP; - meta.m_sourceIP = m_streamInfo.m_srcAddr; - meta.m_version = m_parser->getVersionName(); - metrics::updateMeta (meta); - m_nextYPPush = now + 600; // make it at most 10 mins. - } - else - m_nextYPPush = now + 20; // no data currently retry again in 20 seconds -} - - -void streamData::clearCachedMetadata() throw() -{ - m_sc1MetadataLock.lock(); - m_sc1MetadataTable.clear(); - m_sc1MetadataLock.unlock(); - - m_sc21MetadataLock.lock(); - m_sc21MetadataTable.clear(); - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtTable.clear(); - m_sc21StreamAlbumArtToPutInline.clear(); - m_sc21StreamAlbumArtLock.unlock(); - - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtTable.clear(); - m_sc21PlayingAlbumArtToPutInline.clear(); - m_sc21PlayingAlbumArtLock.unlock(); - - m_sc21AlbumArtData[0].clear(); - m_sc21AlbumArtData[1].clear(); - - m_sc21AlbumArtMime[0] = 0; - m_sc21AlbumArtMime[1] = 0; -} - -void streamData::clearCachedArtwork(const size_t index) throw() -{ - if (!index) - { - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtTable.clear(); - m_sc21StreamAlbumArtToPutInline.clear(); - m_sc21StreamAlbumArtLock.unlock(); - } - else - { - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtTable.clear(); - m_sc21PlayingAlbumArtToPutInline.clear(); - m_sc21PlayingAlbumArtLock.unlock(); - } - - m_sc21AlbumArtData[index].clear(); - m_sc21AlbumArtMime[index] = 0; - - addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - (!m_sc21AlbumArtData[1].empty() ? "DNAS/playingart?sid=" + tos(ID()) : - !m_sc21AlbumArtData[0].empty() ? "DNAS/streamart?sid=" + tos(ID()) : ""), - m_streamInfo.m_comingSoon); -} - -streamData::streamID_t streamData::getStreamIdFromPath(const uniString::utf8 &url, bool& htmlPage) throw() -{ - // look for an exact match against / which is sid=1 since if - // we've gotten to here then it's unlikely to be non-client. - if ((url == utf8("/")) || (url == utf8("/;")) || url.empty()) - { - return DEFAULT_CLIENT_STREAM_ID; - } - - streamData::streamID_t sid = DEFAULT_CLIENT_STREAM_ID; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - if (!streams.empty()) - { - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // look for an exact match against the streampath - if ((*i).second.m_urlPath == url) - { - sid = (*i).first; - break; - } - else - { - // otheriwse look for a streampath with additional paramters on it - // and then attempt to match things back - // e.g. /bob;stream.mp3 or /bob/;stream.mp3 - // note: /bob/bob checking doesn't want to work... - if ((url.find((utf8)";") != utf8::npos) || (url.find((utf8)"/;") != utf8::npos)/* || - (url.find(utf8("/")) != utf8::npos && url.find(utf8("/")) != 0)*/) - { - utf8 param_free = url.substr(0, (*i).second.m_urlPath.size()); - if (!param_free.empty() && (*i).second.m_urlPath == param_free) - { - // we need to treat '/stream' as a special - // case and skip it and action it later on - if (!(param_free == "/stream")) - { - sid = (*i).first; - break; - } - } - } - } - - // otherwise look for the streampath and common values - // which are appended to the end of the path e.g. /; - if (!(*i).second.m_urlPath.empty()) - { - utf8 stream("/stream"); - utf8::size_type pos = url.find((*i).second.m_urlPath), - pos2 = url.find(stream); - - if ((pos != utf8::npos) && (pos == 0) && - // this helps to check for setting /stream as a streampath and it - // causing all streams to be provided as if that stream instead - // of the actually requested / expected stream since it's special - ((pos2 == 0) && ((*i).second.m_urlPath != stream))) - { - utf8 params = url.substr(pos + (*i).second.m_urlPath.size()); - if (!params.empty()) - { - if ((params.find(utf8(";")) == 0) || (params.find(utf8("/")) == 0) || (params.find(utf8("/;")) == 0)) - { - sid = (*i).first; - break; - } - } - } - } - - // and if that fails then we instead base it on /stream/x/ - utf8::size_type pos = url.find((utf8)"/stream/"); - if (pos != utf8::npos) - { - utf8 stream_id = url.substr(8); - // look for the raw stream url and if it's not exact then treat as a stream request - if (!stream_id.empty() && - (stream_id.find((utf8)"/") == utf8::npos) && - (stream_id.find((utf8)";") == utf8::npos)) - { - htmlPage = true; - } - sid = atoi((const char *)stream_id.c_str()); - } - } - } - else - { - // and if that fails then we instead base it on /stream/x/ - utf8::size_type pos = url.find((utf8)"/stream/"); - if (pos != utf8::npos) - { - utf8 stream_id = url.substr(8); - // look for the raw stream url and if it's not exact then treat as a stream request - if (!stream_id.empty() && - (stream_id.find((utf8)"/") == utf8::npos) && - (stream_id.find((utf8)";") == utf8::npos)) - { - htmlPage = true; - } - sid = atoi((const char *)stream_id.c_str()); - } - } - - return sid; -} - -//streamData::streamID_t streamData::getStreamUptime(streamID_t id) throw() -time_t streamData::getStreamUptime(streamID_t ID) throw() -{ - stackLock sml(g_streamMapLock); - - return g_streamUptime[ID]; -} - -streamData::source_t streamData::getClientType(streamData::source_t clientType, const uniString::utf8& userAgent) -{ - if (!userAgent.empty()) - { - if (isUserAgentRelay(userAgent)) - { - clientType = ((streamData::source_t)(clientType | streamData::RELAY)); - } - if ((userAgent.find((utf8)"winampmpeg/") == 0) || (userAgent.find((utf8)"wafa/") == 0)) - { - // this is a specical case and is unlikely to be any 'real' 5.09 - if (userAgent.find(utf8("winampmpeg/5.09")) == utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::WINAMP)); - } - else - { - clientType = ((streamData::source_t)(clientType | streamData::RADIONOMY)); - } - } - if (userAgent.find((utf8)"curl/7.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::CURL_TOOL)); - } - if (userAgent.find((utf8)"sc_iradio/1.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::SC_IRADIO)); - } - if (userAgent.find((utf8)"icecast ") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ICECAST | streamData::RELAY)); - } - if (userAgent.find((utf8)"foobar2000/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::FB2K)); - } - if ((userAgent.find((utf8)"vlc/") == 0) || - (userAgent.find((utf8)" libvlc/") != utf8::npos)) - { - clientType = ((streamData::source_t)(clientType | streamData::VLC)); - } - if ((userAgent.find((utf8)"windows-media-player/") == 0) || - (userAgent.find((utf8)"nsplayer/") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WMP)); - } - if (userAgent.find((utf8)"roku/dvp") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ROKU)); - } - if (userAgent.find((utf8)"wiimc/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::WIIMC)); - } - if (userAgent.find((utf8)"audiostation/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::SYNOLOGY)); - } - if (userAgent.find((utf8)"itunes/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ITUNES)); - } - if ((userAgent.find((utf8)"mplayer/") == 0) || - (userAgent.find((utf8)"mplayer ") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::MPLAYER)); - } - if (userAgent.find((utf8)"applecoremedia/1.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::APPLE)); - } - if (userAgent.find((utf8)"psp-internetradioplayer/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::PS)); - } - if (userAgent.find((utf8)"radio toolbox/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::RADIO_TOOLBOX)); - } - - // rough stream ripper identification - if ((userAgent.find((utf8)"rma/1.0 (compatible; realmedia)") == 0) || - (userAgent.find((utf8)"nullsoft winamp3 version 3.0 (compatible)") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WARNING)); - } - - // rough browser identification - if (userAgent.find((utf8)"mozilla/5.0") == 0) - { - if (userAgent.find((utf8)"trident/") != utf8::npos) // IE - { - clientType = ((streamData::source_t)(clientType | streamData::IE)); - } - else if (userAgent.find((utf8)"chrome/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::CHROME)); - } - else if (userAgent.find((utf8)"safari/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::SAFARI)); - } - else if (userAgent.find((utf8)"firefox/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::FIREFOX)); - } - } - } - return clientType; -} - -streamData::source_t streamData::getClientTypeCompat(streamData::source_t clientType, const uniString::utf8& userAgent) -{ - if (!userAgent.empty()) - { - if ((userAgent.find((utf8)"windows-media-player/") == 0) || - (userAgent.find((utf8)"nsplayer/") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WMP)); - } - if (userAgent.find((utf8)"roku/dvp") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ROKU)); - } - } - return clientType; -} - -// Advert related code. -typedef pair idGroup; - -void streamData::adEntry::flush(metrics::adSummary &summary) -{ - if (ad && (summary.sendRest || upper)) - { - summary.count = (int)upper; - summary.name = ad->m_description.c_str(); - summary.failed = ad->m_failed; - summary.missing = ad->m_missing; - - metrics::metrics_advert_stats(summary); - summary.sendRest = true; - } - upper = 0; -} - - -streamData::adEntry::adEntry (specialFileData *d) -{ - upper = 0; - ad = d; - if (d) - { - ++d->m_refcount; - d->m_lastUsed = ::time (NULL); - AD_DEBUG_LOG ("[STREAMDATA] content new, " + d->m_description + " now has " + tos (d->m_refcount)); - } -} - - -streamData::adEntry::adEntry (const adEntry &e) -{ - upper = 0; - ad = e.ad; - ++(e.ad->m_refcount); - e.ad->m_lastUsed = ::time (NULL); - AD_DEBUG_LOG ("[STREAMDATA] content copy, " + e.ad->m_description + " now has " + tos (e.ad->m_refcount)); -} - - -streamData::adGroup::adGroup (adGroup &prev, adTrigger &trig) -{ - m_totalSizeSC1 = m_totalSizeSC2 = 0; - m_trigger = &trig; - - std::deque ::iterator it = prev.ads.begin(); - for (; it != prev.ads.end(); ++it) - { - specialFileData *f = it->ad; - ads.push_back (adEntry (f)); - } -} - - -void streamData::adGroup::appendAdvert(streamData::specialFileData &s) -{ - ads.push_back (adEntry (&s)); - m_totalSizeSC1 += s.m_sc1Buffer.size(); - m_totalSizeSC2 += s.m_sc2Buffer.size(); -} - -void streamData::adGroup::flushCounts(metrics::adSummary &summary) -{ - summary.sendRest = false; - summary.tstamp = m_trigger->m_playedAt; - for (std::deque::iterator it = ads.begin(); it != ads.end(); ++it) - { - it->flush(summary); - } -} - -streamData::adGroups::adGroups (streamData *sd) -{ - m_sd = sd; - refcount = 0; - m_recheck = 0; - nextUpdate = ::time(NULL); - m_nextDownloadRun = nextUpdate + 40; - m_type = ADVERT_MAP_FIXED; - skippedAds = 0; - retriever = NULL; -} - - -streamData::adGroups::~adGroups() -{ - while (triggers.empty() == false) // pop each on the triggers list and run release on it - { - adTrigger *trig = *triggers.begin(); - triggers.pop_front(); - releaseTrigger (trig); - } - if (retriever) - { - delete retriever; - retriever = NULL; - } -} - - -void streamData::adGroups::setType (const uniString::utf8 &s) -{ - if (s == "flex") - m_type = ADVERT_MAP_FLEX; - else if (s == "pause") - m_type = ADVERT_MAP_PAUSE; - else - m_type = ADVERT_MAP_FIXED; -} - - -#if 0 -streamData::adGroup *streamData::adGroups::insertAdTestFile(const streamData::streamID_t sid, streamData *sd) -{ - streamData::adGroup *ret = NULL; - for (int i = 0; i < 4; i++) - { - specialFileData *f = new specialFileData("test advert"); - if (f) - { - vector<__uint8> v; - sd->getAdTestFile(i).getSc1Data(v); - if (!v.empty()) - { - const int uvoxDataType = sd->streamUvoxDataType(); - unsigned int read_samplerate = sd->streamSampleRate(), samplerate = read_samplerate; - // if the bitrate is not known, setting -1 will reject things - // as we cannot be sure well insert ok if using '0' otherwise - const int read_bitrate = cleanFileData("", v, v.size(), sd->streamBitrate(), samplerate, uvoxDataType, - "[ADVERT sid=" + tos(sid) + "] ", "advert", read_samplerate); - - if (!v.empty()) - { - f->replaceData(v, uvoxDataType, read_bitrate, read_samplerate); - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Adding to group TEST"); - ret = addToGroup(-2, f); - } - else - { - delete f; - WLOG("[ADVERT sid=" + tos(sid) + "] Skipping test advert - " - "does not match the current stream format. Got " + - tos(read_bitrate) + " kbps, " + sampleRateStr(samplerate) + - " (stream) vs " + tos(sd ? sd->streamBitrate() : -1) + - " kbps, " + sampleRateStr(read_samplerate) + " (test advert)"); - } - } - } - } - - return ret; -} -#endif - -bool streamData::adGroups::attachGroupQueue (adGroupAccess &ac) -{ - if (ac.m_groupQueue == NULL && ac.inAdvertMode() == false) - { - stackLock sml(m_lock); - - adGroupMap_t::iterator it = mapping.find (ac.group); - adGroupQueue *q; - - if (it == mapping.end()) - { - q = new adGroupQueue(); - mapping [ac.group] = q; - } - else - q = (*it).second; - q->listeners++; - ac.m_groupQueue = q; - return true; - } - return false; -} - - -void streamData::adGroups::detachGroupQueue (adGroupAccess &ac) -{ - if (ac.m_groupQueue) - { - stackLock sml(m_lock); - - adGroupQueue *q = ac.m_groupQueue; - adGroup *run = ac.cached_ref; - - q->listeners--; - AD_DEBUG_LOG ("drop from group " + tos(ac.group) + " referenced, listeners now " + tos(q->listeners), ADLOGNAME, m_sd->ID()); - if (run) - { - // admetrics - releaseTrigger (run->m_trigger); - } - ac.m_groupQueue = NULL; - ac.cached_ref = NULL; - } - else - AD_DEBUG_LOG ("no group queue referenced from listener", ADLOGNAME, m_sd->ID()); -} - -streamData::adGroup *streamData::adGroups::findGroup(adGroupAccess &ac, ringBufferAccess_t pos) -{ - adGroupQueue *q = ac.m_groupQueue; - list ::iterator it = q->queue.begin(); - - for (; it != q->queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == NULL) return NULL; // should not happen - ringBufferAccess_t tpos = g->m_trigger->getStartPos (ac.m_sc2); - - if (pos == tpos) // found it - return g; - if (pos > tpos) // past it, jump out - break; - } - return NULL; -} - -#if 0 -streamData::adGroup *streamData::adGroups::findGroup(const streamData::streamID_t sid, const int id) -{ - // PSA = -1, TEST = -2 - if (mapping && ((id > 0) || (id == -2))) - { - map::iterator search = mapping->find(id); - if (search == mapping->end()) - { - // if there's no test group, we now - streamData::adGroup *ret = NULL; - if (id == -2) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ret = insertAdTestFile(sid, sd); - sd->releaseStream(); - } - } - return ret; - } - return &search->second; - } - // if there's no mapping, we need to create one for the test case - else if (!mapping && (id == -2)) - { - streamData::adGroup *ret = NULL; - mapping = new map; - if (mapping) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ret = insertAdTestFile(sid, sd); - sd->releaseStream(); - } - } - return ret; - } - return NULL; -} -#endif - -void streamData::adGroups::purge (ringBuffer_t &buffer) -{ - if ((m_recheck & 31) == 0) - { - // drop reference when off the ring buffer, loop in case there are a few to purge - while (triggers.empty() == false) - { - adTrigger *t = triggers.back(); - if (t== NULL) - DLOG ("purge trigger NULL"); - if (t && (t->m_playedAt || triggers.size() > 1)) - { - size_t sz = buffer.m_data.size(); - //DLOG ("trig " + t->m_id + ", played " + tos((long)t->m_playedAt) + ", ret " + tos((long)t->m_returnPtrSC1) + ", wptr " + tos((long)(buffer.m_writePtr)) + ", sz " + tos(sz)); - if (buffer.m_writePtr < sz) // for early cases of stream start - break; - if (t->m_returnPtrSC1 < (buffer.m_writePtr - sz)) - { - AD_DEBUG_LOG ("trigger " + t->m_id + " reference off the ring buffer", ADLOGNAME, m_sd->ID()); - triggers.remove (t); - releaseTrigger (t); - continue; - } - } - break; - } - } - if ((m_recheck & 255) == 0) - { - // DLOG("rechecking for group purge"); - purgeGroups(); - } - ++m_recheck; -} - - -void streamData::adGroups::createNewTrigger (const string &reqID) -{ - string id; - if (reqID == "") - { - stringstream s; - s << tos(time_now_ms()); - id = s.str(); - } - else - id = reqID; - - adTrigger *trig = new adTrigger (id, m_sd->ID()); - triggers.push_front (trig); -} - - -size_t streamData::adGroups::overlaySize (adTrigger *trigger, bool sc2) -{ - int gn = 0; - - if (trigger == NULL) abort(); - if (sc2) // assume sc2 is done after sc1 - return trigger->m_maxSizeSC2; - - adGroupMap_t::iterator it = mapping.begin(); - for (gn = 0; gn < 8 && it != mapping.end(); ++gn, ++it) // check so many group queues for filled adverts - { - adGroupQueue *q = it->second; - - for (list::iterator it = q->queue.begin(); it != q->queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == trigger) - { - if (trigger->m_playedAt == 0) - { - g->recalculateTotalSize(); - } - break; - } - } - } - if (trigger->m_maxSizeSC1) - ILOG ("Trigger " + tos(trigger->m_id) + " size is " + tos(trigger->m_maxSizeSC1) + "/" + tos(trigger->m_maxSizeSC2), ADLOGNAME, m_sd->ID()); - return trigger->m_maxSizeSC1; -} - - -streamData::adGroup *streamData::adGroups::addToGroup (const string &id, const int grp, specialFileData *f) -{ - - if ((f == NULL) || !grp) - { - return NULL; - } - std::map::iterator it = mapping.find (grp); - adGroupQueue *q; - if (it == mapping.end()) - { - AD_DEBUG_LOG ("new queue " + tos(grp) + " on " + id, ADLOGNAME, m_sd->ID()); - mapping [grp] = q = new adGroupQueue(); - } - else - q = it->second; - adTrigger *cur = NULL; //, *prev = NULL; - cur = triggers.empty() ? NULL : triggers.front(); - - if (cur == NULL || cur->m_id != id) - { - //prev = cur; - createNewTrigger (id); - if (cur && cur->m_playedAt == 0) - { - triggers.remove (cur); - releaseTrigger (cur); - return addToGroup (id, grp, f); - } - } - else - if (cur->m_playedAt) - { - AD_DEBUG_LOG ("Trigger " + id + " has already started, skipping", ADLOGNAME, m_sd->ID()); - return NULL; - } - - cur = triggers.front(); - - adGroup *g = q->queue.empty() ? NULL : q->queue.front(); - - if (g && g->m_trigger != cur) - g = NULL; - if (g == NULL || g->m_trigger->m_playedAt) - { - g = new adGroup; - g->m_trigger = cur; - q->queue.push_front (g); - } - g->appendAdvert(*f); - - if (cur->m_maxSizeSC1 < g->m_totalSizeSC1) - cur->m_maxSizeSC1 = g->m_totalSizeSC1; - if (cur->m_maxSizeSC2 < g->m_totalSizeSC2) - cur->m_maxSizeSC2 = g->m_totalSizeSC2; - - return NULL; -} - -#if 0 -void streamData::adGroups::queueNewSet(const streamID_t sid, adGroups *qGroups) -{ - stackLock sml(m_lock); - if (qGroups) - { - if (queuedGroups) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Replacing queued advert set"); - delete queuedGroups; - } - queuedGroups = qGroups; - if (queuedGroups->mapping && queuedGroups->adData) - { - const size_t group_size = queuedGroups->mapping->size(), - adverts_size = queuedGroups->adData->size(); - ILOG("[ADVERT sid=" + tos(sid) + "] Updated adverts: queued " + - tos(group_size) + " group" + (group_size != 1 ? "s" : "") + ", " + - tos(adverts_size) + " advert" + (adverts_size != 1 ? "s" : "") + ", " + - tos((queuedGroups->skippedAds > 0 ? queuedGroups->skippedAds : 0)) + - " advert file" + (queuedGroups->skippedAds != 1 ? "s" : "") + " skipped," - " next update in " + tos(queuedGroups->nextUpdate - ::time(NULL)) + " seconds."); - } - } -} -#endif - -#if 0 -void streamData::adGroups::flushGroupCounts(const streamData::streamID_t sid) -{ - if (mapping.empty() == false) - { - streamData *sd = streamData::accessStream (sid); - if (sd == NULL) - return; - - if (sd->radionomyID().empty() && sd->streamAdvertMode()) - { - metrics::adSummary summary; - - summary.sid = sid; - summary.path = getStreamPath(sid); - summary.tstamp = playedAt; - summary.sd = sd; - - for (adGroupMap_t::iterator it = mapping.begin(); it != mapping.end(); ++it) - { - summary.group = (*it).first; - (*it).second->flushStats (summary); - } - } - sd->releaseStream(); - } -} -#endif - -#if 0 -// if the increase is set to false then we require the sid -void streamData::adGroups::join(const bool increase, const streamData::streamID_t sid, const bool testing) -{ - stackLock sml(m_lock); - if (increase) - { - if ((refcount == 0) && (playedAt == 0)) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Starting " + (testing ? "test " : "") + "advert run"); - playedAt = ::time(NULL); - } - ++refcount; - } - else - { - --refcount; - if (refcount == 0) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] End of " + (testing ? "test " : "") + "advert run"); - if (!testing) - { - flushGroupCounts(sid); - nextUpdate = 1; // force new download of adverts - } - playedAt = 0; - } - } -} -#endif - -streamData::adTrigger::~adTrigger () -{ - AD_DEBUG_LOG ("Trigger destroyed, " + m_id, ADLOGNAME, m_sid); -} - - -void streamData::adGroups::releaseTrigger (adTrigger *trigger) -{ - if (trigger == NULL) return; - - AD_DEBUG_LOG ("trigger " + trigger->m_id + " had count " + tos(trigger->m_inUse), ADLOGNAME, trigger->m_sid); - if (trigger->m_inUse > 1) - { - --trigger->m_inUse; - return; - } - if (trigger->m_playedAt) - flushStats (trigger); - - adGroupMap_t::iterator it = mapping.begin(); - unsigned int num = 0; - - while (it != mapping.end()) - { - size_t grp_num = it->first; - adGroupQueue *q = it->second; - - ++it; - if (q->queue.empty()) - continue; - - adGroup *g = q->queue.back(); - if (g->m_trigger == trigger) // should be true - { - q->queue.pop_back(); - AD_DEBUG_LOG ("deleting from group " + tos(grp_num) + " matching trigger " + tos(trigger->m_id), ADLOGNAME, trigger->m_sid); - delete g; - ++num; - } - else - AD_DEBUG_LOG ("trigger unexpected " + tos(g->m_trigger->m_id), ADLOGNAME, trigger->m_sid); - } - ILOG ("trigger " + tos(trigger->m_id) + " dropped with " + tos(num) + " populated groups", ADLOGNAME, trigger->m_sid); - delete trigger; -} - - -void streamData::adGroups::purgeGroups() -{ - adGroupMap_t::iterator it = mapping.begin(); - - while (it != mapping.end()) - { - size_t grp_num = it->first; - adGroupQueue *q = it->second; - - if (q->listeners == 0) - { - adGroupMap_t::iterator to_go = it; - adGroupQueue *q = to_go->second; - ++it; - AD_DEBUG_LOG ("Purging group " + tos (grp_num), ADLOGNAME, m_sd->ID()); - mapping.erase (to_go); - delete q; - continue; - } - // DLOG ("[ADVERT] purge group " + tos(grp_num) + "still has " + tos (q->listeners)); - ++it; - } -} - - -streamData::adGroupQueue::~adGroupQueue() -{ - list::iterator it = queue.begin(); - - AD_DEBUG_LOG ("[ADVERT] queue destroyed, blocks remaining " + tos(queue.size())); - for (; it != queue.end(); ++it) - { - AD_DEBUG_LOG ("[ADVERT] Deleting group"); - delete *it; - } -} - - -void streamData::adGroupQueue::flushStats (metrics::adSummary &summary, adTrigger *trigger) -{ - for (list::iterator it = queue.begin(); it != queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == trigger && g->m_trigger->m_inUse <= 1) - { - summary.id = g->m_trigger->m_id; - g->flushCounts (summary); - break; - } - } -} - - -int streamData::adGroup::recalculateTotalSize () -{ - std::deque ::iterator it = ads.begin(); - int missing = 0; - - m_totalSizeSC1 = 0; - m_totalSizeSC2 = 0; - for (;it != ads.end(); ++it) - { - adEntry &e = *it; - if (e.ad == NULL || e.ad->m_missing) - { - ++missing; - continue; - } - m_totalSizeSC1 += e.ad->m_sc1Buffer.size(); - m_totalSizeSC2 += e.ad->m_sc2Buffer.size(); - } - if (m_trigger) - { - bool updated = false; - if (m_trigger->m_maxSizeSC1 < m_totalSizeSC1) - { - m_trigger->m_maxSizeSC1 = m_totalSizeSC1; - updated = true; - } - if (m_trigger->m_maxSizeSC2 < m_totalSizeSC2) - { - m_trigger->m_maxSizeSC2 = m_totalSizeSC2; - updated = true; - } - if (updated) - AD_DEBUG_LOG ("Group size is " + tos(m_totalSizeSC1) + "/" + tos(m_totalSizeSC2), ADLOGNAME, m_trigger->m_sid); - } - return missing; -} - - -void streamData::adGroups::flushStats (adTrigger *trigger) -{ - adGroupMap_t::iterator it = mapping.begin(); - metrics::adSummary summary; - - summary.sid = m_sd->ID(); - summary.path = getStreamPath(summary.sid); - summary.sd = m_sd; - - //DLOG ("FLUSHing stats for metrics"); - for (; it != mapping.end(); ++it) - { - adGroupQueue *q = it->second; - - summary.group = (*it).first; - q->flushStats (summary, trigger); - } -} - - -streamData::adGroup *adGroupAccess::getGroup(streamData::streamID_t, streamData::adGroups &, const bool) -{ - if (cached_ref) - return cached_ref; // avoids the traversal of map - if (m_groupQueue == NULL) - return NULL; - - return cached_ref; -} - - -bool adGroupAccess::foundNextAdvert (const streamData::streamID_t sid, streamData::adGroups &/*groups*/, streamData::adGroup &g) -{ - do - { - if (idx >= (int)g.ads.size()) - break; - streamData::adEntry *e = &g.ads[idx]; - if (e == NULL || e->ad == NULL) - { - AD_DEBUG_LOG("Listener on group " + (group == -2 ? "TEST" : tos(group)) + - ", idx " + tos(idx) + ", content missing", ADLOGNAME, sid); - idx++; - continue; - } - utf8 msg = "Listener (grp "; - msg += tos (group); - msg += ", idx "; - msg += tos (idx); - msg += ", ad dura "; - msg += tos(e->ad->m_duration); - msg += ", rem "; - msg += tos(m_duration); - msg += ")"; - AD_DEBUG_LOG (msg, LOGNAME, sid); - - unsigned ad_dur = (unsigned)(e->ad->m_duration+0.5); - if (g.m_trigger->m_type == ADVERT_MAP_FIXED && ad_dur > m_duration) - { - idx++; - continue; - } - if (g.m_trigger->m_type == ADVERT_MAP_FLEX) - m_duration -= ad_dur; - ++g.ads [idx].upper; - return true; - } while (1); - return false; -} - - -bool adGroupAccess::anotherAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing) -{ - streamData::adGroup *g = getGroup(sid, groups, testing); - if ((g == NULL) || g->ads.empty()) - { - cached_ref = NULL; - return false; - } - - offset = 0; - int total = (int)g->ads.size(); - - ++idx; - if (idx < total) - { - stackLock sml(groups.m_lock); - if (foundNextAdvert (sid, groups, *g)) - { - return true; - } - } - return false; -} - -const bool adGroupAccess::inAdvertMode() const -{ - return (cached_ref) ? true : false; -} - -void adGroupAccess::setGroup (size_t id) -{ - group = id; - m_grpChanged = true; -} - -void adGroupAccess::changedGroup (streamData::adGroups &groups) -{ - if (m_grpChanged == false || inAdvertMode()) - return; - - if (m_groupQueue) - groups.detachGroupQueue (*this); - groups.attachGroupQueue (*this); - m_grpChanged = false; -} - - -bool adGroupAccess::haveAdverts(const streamData::streamID_t sid, streamData::adGroups &groups, streamData::ringBufferAccess_t pos) -{ - if (m_groupQueue == NULL) - return false; - - streamData::adGroup *g = groups.findGroup (*this, pos), *prev = cached_ref; - - if ((g == NULL) || (g->ads.size() == 0)) - { - return false; - } - idx = 0; - - cached_ref = g; - stackLock sml(groups.m_lock); - ++g->m_trigger->m_inUse; - m_duration = g->m_trigger->m_duration; - if (m_duration == 0) - m_duration = 3600; - if (prev) - groups.releaseTrigger (prev->m_trigger); - if (foundNextAdvert (sid, groups, *g)) - return true; - return false; -} - -streamData::specialFileData *adGroupAccess::getAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing) -{ - streamData::adGroup *g = getGroup(sid, groups, testing); - do - { - if (g == NULL) break; - if (idx < 0 || idx >= (int)g->ads.size()) break; - - streamData::adEntry *e = &g->ads[idx]; - return e->ad; - } while (1); - return NULL; -} - -void adGroupAccess::stopAdRun(const streamData::streamID_t, streamData::adGroups &groups, const bool) -{ - if (cached_ref) - { - if (cached_ref->m_trigger) - groups.releaseTrigger (cached_ref->m_trigger); - cached_ref = NULL; - } -} - -// routine to catch whatever conditions will trigger an advert -// -void streamData::checkForAdverts() -{ - // only fire if it's a public stream and the stream has been added to the YP - // otherwise we're not going to have the radionomyid from the authhash info. - if (!iskilled() && (m_streamInfo.m_streamPublic) && - (!m_dead) && m_ID && m_streamInfo.m_advertMode && - (m_streamInfo.m_avgBitrate > 0) && (m_streamInfo.m_streamSampleRate > 0)) - { - advertGroups.checkForNewAdverts(targetSpotUrl(), ID()); - } -} - -void streamData::adGroups::checkForNewAdverts(const uniString::utf8& url, const streamData::streamID_t sid) -{ - time_t now = ::time (NULL); - bool start_map_retrieval = false; - do - { - stackLock sml (adContentLock); - if (m_nextDownloadRun && m_nextDownloadRun <= now) - { - m_nextDownloadRun = 0; - SimpleThread (streamData::adGroups::runAdDownload, NULL); - } - - // in this case, we should just skip until things - // have been processed. when processed then we - // can step through and that will allow updates. - if (nextUpdate == 0) - { - if (retriever && retriever->cleanup) - break; - return; - } - else if (nextUpdate <= now) - { - nextUpdate = 0; // disable while this starts up - start_map_retrieval = true; - break; - } - return; - } while (0); - - if (start_map_retrieval) - { - loadGroups(url, sid); - return; - } - AD_DEBUG_LOG("Cleanup advert map thread", ADLOGNAME, sid); - delete retriever; - retriever = NULL; -} - -uniString::utf8 streamData::getAdvertGroup() -{ - if (m_streamInfo.m_advertMode) - { - utf8 groups = "Ad setup is correct, but no adverts / groups are currently assigned to this stream."; - // only fire if it's a public stream and the stream has been added to the YP - // otherwise we're not going to have the radionomyid from the authhash info. - if ((m_streamInfo.m_streamPublic) && (!m_dead) && m_ID && m_streamInfo.m_advertMode) - { - groups = advertGroups.getAdvertGroup(); - } - else - { - if (m_dead) - { - return "Ads cannot be provided without an active stream source."; - } - else - { - return "Stream is not configured properly for ads.

" - "Check that the authhash for this stream is correct, " - "and contact support if the condition persists."; - } - } - return groups; - } - - // otherwise, we have to assume that we've - // been able to get something or it's just - // not configured and so need to register. - return "This stream is not configured for adverts.

" + - utf8(m_streamInfo.m_radionomyID.empty() ? "Please register your stream for the DNAS+ service" : - "Please upgrade your stream to the DNAS+ service") + - " to enable advert support."; -} - -bool streamData::knownAdvertGroup(const streamData::streamID_t &sid, const int group) -{ - if (sid > 0) - { - map::const_iterator i = g_streamMap.find(sid); - if (i == g_streamMap.end()) - { - return false; - } - adGroups &gps = (*i).second->advertGroups; - stackLock sml (gps.m_lock); - return ((*i).second->advertGroups.findQueue (group) != NULL); - - } - return false; -} - - -streamData::adGroupQueue *streamData::adGroups::findQueue (int grp) -{ - std::map::iterator it = mapping.find (grp); - adGroupQueue *q = NULL; - if (it != mapping.end()) - q = it->second; - return q; -} - - -utf8 streamData::adGroups::getAdvertGroup() -{ - stackLock sml(m_lock); - - utf8 groups; - unsigned count = 0; - for (adGroupMap_t::const_iterator it = mapping.begin(); it != mapping.end(); ++it, ++count) - { - groups += (count ? ", " : "The following advert groups are currently in use:

") + tos((*it).first); - } - - if (count) - { - groups += ""; - } - else - groups += "Ad setup is correct, but no adverts / groups are currently assigned to this stream."; - - if (skippedAds > 0) - { - groups += "

There are adverts retrieved which do not match the current stream format.
" - "These will not be played to avoid breaking stream playback."; - } - return groups; -} - - -struct ad_dload_info -{ - stringstream ss; - int respcode; - int type; - size_t length; - - ad_dload_info() { respcode = 0; length = 0; type = 0; } -}; - - -static size_t handle_ad_dload_header (void *ptr, size_t size, size_t nmemb, void *stream) -{ - ad_dload_info *info = (ad_dload_info*)stream; - size_t length = size * nmemb; - char *s = (char*)ptr; - - do - { - if (length == 0) break; - - s [length] = 0; - - if (length > 12 && strncmp (s, "HTTP", 4) == 0) - { - unsigned int resp = 0; - char eol[5] = ""; - if (sscanf (s, "%*8s %u %4[^\r]", &resp, eol) == 2 && strcmp (eol, "OK") == 0 && resp > 99 && resp < 600) - info->respcode = resp; - break; - } - if (length > 12 && strncasecmp (s, "content-type:", 13) == 0) - { - char content[40]; - if (sscanf (s+14, " %40[^\r ]", content) == 1) - { - if (strcmp (content, "audio/aac") == 0) - info->type = AAC_LC_DATA; - else if (strcmp (content, "audio/aacp") == 0) - info->type = AACP_DATA; - else if (strcmp (content, "audio/mpeg") == 0) - info->type = MP3_DATA; - else if (strcmp (content, "application/octet-stream") == 0) - { - AD_DEBUG_LOG("[ADVERT] ad download has default mime, assuming aac"); - info->type = AACP_DATA; - } - else - { - WLOG ("[ADVERT] ad download has unexpected mime " + utf8(content)); - return 0; - } - break; - } - } - } while (0); - return length; -} - - -static size_t handle_ad_dload_body (void *ptr, size_t size, size_t nmemb, void *stream) -{ - ad_dload_info *info = (ad_dload_info*)stream; - size_t length = size * nmemb; - if (info->ss) - { - info->ss.write ((const char*)ptr, length); - info->length += length; - } - - bandWidth::updateAmount (bandWidth::ADVERTS, length); - return length; -} - - -THREAD_FUNC streamData::adGroups::runAdDownload (void* /*arg*/) -{ - int purged = 0, retry = 0, added = 0, count = 0; - CURL *curl = NULL; - ad_dload_info info; - char curl_error [CURL_ERROR_SIZE]; - - curl = webClient::setupCurlDefaults (curl, "[ADVERT] ", "", 4, 20L); - if (curl == NULL) - { - // set retry time - m_nextDownloadRun = ::time(NULL) + 25; - return NULL; - } - curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, handle_ad_dload_header); - curl_easy_setopt (curl, CURLOPT_HEADERDATA, &info); - curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, handle_ad_dload_body); - curl_easy_setopt (curl, CURLOPT_WRITEDATA, &info); - curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, &(curl_error[0])); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt (curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt (curl, CURLOPT_XFERINFODATA, (long)-1); - -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - // limit to 200 in one run and assume 6 retries is not a good sign and likely to stall things - while (count < 200 && retry < 6) - { - specialFileData *f; - if (1) - { - // grab the oldest - stackLock sml (adContentLock); - if (iskilled() || adContentPending.empty()) - break; - list::iterator it = adContentPending.begin(); - f = *it; - adContentPending.pop_front(); - } - ++count; - if (f->m_url == "") - { - ILOG ("[Advert] download requested but no url specified " + f->m_description); - specialFileData::release (f); - continue; - } - // clear old data - memset (curl_error, 0, CURL_ERROR_SIZE); - info.respcode = 0; - info.length = 0; - info.type = 0; - info.ss.str (string()); - - curl_easy_setopt (curl, CURLOPT_URL, f->m_url.c_str()); - int ret = curl_easy_perform (curl); - if (ret != CURLE_OK) - { - // assume a timeout, add to the end for checking later - if (f->m_retried < 2) - { - ++f->m_retried; - ILOG("[ADVERT] failed to get " + f->m_description + ", will retry"); - ++retry; - stackLock sml (adContentLock); - adContentPending.push_back (f); - continue; - } - ILOG ("[ADVERT] retried " + f->m_description + " several times, skipping"); - } - else if (info.respcode == 200 && info.length && info.type) - { - // ok, we have something that initially looks like something - vector<__uint8> &v = f->m_sc1Buffer; - v.reserve (info.ss.tellp()); - std::copy (std::istreambuf_iterator( info.ss ), std::istreambuf_iterator(), std::back_inserter(v)); - - //unsigned int read_samplerate = 0; - - f->verifyData("[ADVERT]"); - - // now we either have nothing left or something valid - if (v.size() > 0) - { - string e = " (" + tos (info.length); - if (info.length != v.size()) - e += " bytes, processed down to " + tos(v.size()); - - added++; - specialFileData::release (f); // from content pending not pool - ILOG("[ADVERT] Loaded advert " + f->m_description + e + " bytes), referenced " + tos(f->getRefcount())); - continue; - } - ILOG ("[ADVERT] no useful data returned for " + f->m_description + " so flag for removal"); - } else { - ELOG("[ADVERT] failed to get " + f->m_description + ", resp " + tos(info.respcode) + ", len " + tos(info.length) + ", type " + tos (info.type)); - } - f->m_failed = true; - // missing content, need to remove from pool - ++purged; - specialFileData::release (f); // from content pending - stackLock sml (adContentLock); - adData.erase (f->m_description); // drop entry from pool - specialFileData::release (f); // actually release pool reference - } - if (added || purged || retry) - ILOG("[ADVERT] downloaded " + tos(added) + ", purged " + tos(purged) + ", to be retried " + tos(retry)); - curl_easy_cleanup (curl); - - time_t expire_advert = ::time(NULL) - 5400; // adverts untouched for 90 mins are dropped - stackLock sml (adContentLock); - - unsigned expired_ads = 0; - - map::iterator it = adData.begin(); - while (it != adData.end()) - { - specialFileData *f = it->second; - map::iterator to_go = it; - ++it; - if (f->getRefcount() == 1 && f->m_lastUsed < expire_advert) - { - DLOG ("[ADVERT] ad " + f->m_description + " unused, dropping"); - adData.erase (to_go); // drop entry from pool - specialFileData::release (f); // actually release pool reference - ++expired_ads; - } - } - if (expired_ads) - ILOG("[ADVERT] " + tos(expired_ads) + " advert(s) expired from pool"); - - if (m_nextDownloadRun == 0) - m_nextDownloadRun = ::time(NULL) + ((count < 200) ? (retry ? 20 : 60) : 2); - - return NULL; -} - - -THREAD_FUNC streamData::adGroups::process(void* arg) -{ - streamData *sd = 0; - try - { - adGroupsRetriever*& m_retriever = reinterpret_cast(arg); - if (!iskilled() && m_retriever && m_retriever->loaded && m_retriever->m_curl && - streamData::isSourceConnected(m_retriever->m_sid)) - { - AD_DEBUG_LOG ("Trying to retrieve updated advert map", ADLOGNAME, m_retriever->m_sid); - memset(m_retriever->m_curl_error, 0, CURL_ERROR_SIZE); - CURL *curl = (!iskilled() ? m_retriever->m_curl : NULL); - - struct curl_slist *list = NULL; - std::string uuid; - if (m_retriever->last_uuid != "") - { - uuid = "Last-BlueBox-UUID: " + m_retriever->last_uuid; - list = curl_slist_append (list, uuid.c_str()); - curl_easy_setopt (curl, CURLOPT_HTTPHEADER, list); - } - CURLcode ret = (!iskilled() ? curl_easy_perform(curl) : CURLE_FAILED_INIT); - - if (list) - curl_slist_free_all (list); - - map skipped; - int duration = 60; // default retry interval - bool error = false; - string id; - - stringstream s; - s << tos(time_now_ms()); - id = s.str(); - - sd = streamData::accessStream (m_retriever->m_sid); - do - { - if (ret != CURLE_OK) - { - if (ret != CURLE_ABORTED_BY_CALLBACK) - { - ELOG ("Advert map retrieval failed with code: " + - tos(ret) + " [" + (m_retriever->m_curl_error[0] ? - m_retriever->m_curl_error : curl_easy_strerror(ret)) + "]", ADLOGNAME, m_retriever->m_sid); - } - else - { - curl = 0; // abort this attempt - if (sd) - { - sd->releaseStream(); - sd = 0; - } - break; - } - - // better to retry in 1 minute than wait 20 minutes for connection - // failure issues, etc especially if could not connect on startup - duration = 60; - break; - } - - string tag; - - map &fileContents = sd->advertGroups.adData; - - string line1; - while (!iskilled() && getline(m_retriever->ss, line1)) - { - line1 = stripWhitespace(line1); - if (line1.empty()) - { - error = true; - AD_DEBUG_LOG("Blank line detected for tag", ADLOGNAME, m_retriever->m_sid); - break; - } - - if (gOptions.adMetricsDebug()) - { - string outp = line1.substr (0, 40); - if (line1.length() > 40) - outp += "..."; - AD_DEBUG_LOG("Retrieved line: " + outp, ADLOGNAME, m_retriever->m_sid); - } - - stringstream line(line1); - line >> tag; - if (tag == "NextCall") - { - line >> duration; - if (duration < 5) - { - duration = 120; // filter out silly values. - } - continue; - } - if (tag == "ID") - { - line >> id; - continue; - } - if (tag == "G") - { - int group = 0; - string name; - line >> group >> name; - // add to group if name exists in map - map::const_iterator it = fileContents.find(name); - if (it != fileContents.end()) - { - specialFileData *f = it->second; - if (f->m_failed == false) - { - sd->advertGroups.addToGroup (id, group, f); - continue; - } - } - if (skipped.find(name) == skipped.end()) - { - WLOG("Missing advert ref " + name + " on group " + tos(group), ADLOGNAME, m_retriever->m_sid); - } - continue; - } - if (tag == "AdURL") - { - string name, url; - line >> name; - AD_DEBUG_LOG("Parse groups: ref " + name, ADLOGNAME, m_retriever->m_sid); - if (line.fail() || name[0] == '\0') - continue; - - line >> url; - if (url.empty() == false) - { - stackLock sml (adContentLock); - - map::const_iterator map_it = fileContents.find(name); - if (map_it != fileContents.end()) - continue; // already loaded - - std::list::iterator it = adContentPending.begin(); - - for (; it != adContentPending.end(); ++it) - { - if ((*it)->m_description == name) - { - if ((*it)->m_missing) - AD_DEBUG_LOG("found " + tos(name) + " waiting for retrieval", ADLOGNAME, m_retriever->m_sid); - break; - } - } - if (it != adContentPending.end()) - continue; // already scheduled to be downloaded - - specialFileData *f = new specialFileData (name, url); - if (f) - { - f->increaseRefcount(); // referenced now in the 2 following places - fileContents [name] = f; - adContentPending.push_back (f); - } - } - } - if (tag == "Ad") - { - bool process_file = true; - string name, b64; - line >> name; - AD_DEBUG_LOG("Parse groups: ref " + name, ADLOGNAME, m_retriever->m_sid); - if (line.fail() || name[0] == '\0') - continue; - -// we should allow for replacing an existing advert eventually - line >> b64; - stackLock sml (adContentLock); - - map::const_iterator it = fileContents.find(name); - if (it != fileContents.end()) - { - process_file = false; - } - - if (line.fail()) - { - stringstream enc; -#if 1 // one line per base64 encoded advert - if (getline(m_retriever->ss, line1) && process_file) - { - enc << line1; - } -#else // multiple lines for base64 content but terminates on blank line - while (getline (ss, line1)) - { - if (line1 == "") - { - break; // End of base64 block - } - //AD_DEBUG_LOG("[ADVERT sid=" + tos(SID) + "] Read " + tos(line1.size())); - if (process_file) - { - enc << line1; - } - } -#endif - b64 = enc.str(); - line.clear(); - } - if (!b64.empty()) - { - specialFileData *f = new specialFileData(name); - if (f) - { - vector<__uint8> v = base64::decode(b64); - size_t original_size = v.size(); - - - int uvoxDataType = (sd ? sd->streamUvoxDataType() : MP3_DATA), - bitrate = (sd ? sd->streamBitrate() : -1); - unsigned int read_samplerate = (sd ? sd->streamSampleRate() : 0), - samplerate = read_samplerate; - // if the bitrate is not known, setting -1 will reject things - // as we cannot be sure well insert ok if using '0' otherwise - int read_bitrate = cleanFileData("", v, v.size(), bitrate, samplerate, uvoxDataType, - "[ADVERT sid=" + tos(m_retriever->m_sid) + "] ", "advert", read_samplerate); - if (!v.empty()) - { - f->replaceData(v, uvoxDataType, read_bitrate, read_samplerate); - AD_DEBUG_LOG("Retrieved advert of length " + - tos(original_size) + " bytes" + (original_size != v.size() ? " (processed down to " + - tos(v.size()) + " bytes)" : ""), ADLOGNAME, m_retriever->m_sid); - fileContents [name] = f; - } - else - { - delete f; - AD_DEBUG_LOG("Skipping advert - does not match the current stream format. Got " + - tos(read_bitrate) + " kbps, " + sampleRateStr(read_samplerate) + - " vs " + tos(bitrate) + " kbps, " + sampleRateStr(samplerate), ADLOGNAME, m_retriever->m_sid); - - // this is a special case for when there is no advert - // group but we're getting generic fillers (which we - // cannot use as we don't know who it's intended for) - if (name.find("completions") == string::npos) - { - skipped[name] = true; - } - } - } - } - continue; - } - } - - // if we've got configured 'test' files then we - // add them in at this stage though we have the - // means to load them on-demand if not done now - if (!sd) - { - sd = streamData::accessStream(m_retriever->m_sid); - } - if (!skipped.empty()) - { - AD_DEBUG_LOG("Skipped " + tos(skipped.size()) + " adverts not matching the current stream format", ADLOGNAME, m_retriever->m_sid); - } - } while (iskilled()); - - if (!curl) - { - // abort as there's nothing we can do - // that won't otherwise make a crash - return 0; - } - else - { - stackLock sml (adContentLock); - sd->advertGroups.skippedAds = (!error ? (int)skipped.size() : -1); - AD_DEBUG_LOG("Advert update interval: " + tos(duration), ADLOGNAME, m_retriever->m_sid); - sd->advertGroups.nextUpdate = ::time(NULL) + duration; - sd->advertGroups.lastUUID = m_retriever->last_uuid; - time_t now = ::time(NULL); - if (m_nextDownloadRun && m_nextDownloadRun > (now + 6)) - m_nextDownloadRun = now + 4; - - m_retriever->cleanup = 1; - } - sd->releaseStream(); - sd = 0; - } - } - catch (...) - { - adGroupsRetriever*& m_retriever = reinterpret_cast(arg); - if (m_retriever) - { - m_retriever->cleanup = 1; - } - - if (sd) - { - sd->releaseStream(); - } - } - return 0; -} - -void streamData::adGroups::loadGroups(const utf8& url, const streamData::streamID_t sid) -{ - if (sid > 0) - { - stackLock sml(m_lock); - - if (retriever) - { - if (retriever->cleanup == 0) - { - AD_DEBUG_LOG("Retriever thread already in progress", ADLOGNAME, sid); - nextUpdate = ::time(NULL) + 30; // re-check every so often - return; - } - - delete retriever; - retriever = NULL; - } - - retriever = new adGroupsRetriever(url, sid); - if (retriever && (retriever->loaded == 1) && (retriever->cleanup == 0) && isSourceConnected(sid)) - { - SimpleThread(streamData::adGroups::process, retriever); - } - else - { - if (retriever) - { - // re-check every so often, but if we needed to re-pull - // the stream's information then force a quicker check - nextUpdate = ::time(NULL) + (!retriever->loaded ? 10 : 1); - delete retriever; - retriever = NULL; - } - else - { - nextUpdate = ::time(NULL) + 30; // re-check every so often - } - } - } -} - - -streamData::adTrigger::adTrigger(const string &id, streamID_t sid) -{ - m_inUse = 1; - m_sid = sid; - m_id = id; - m_type = ADVERT_MAP_FIXED; - m_playedAt = (time_t)0; - m_returnPtrSC1 = m_returnPtrSC2 = 0; - m_maxSizeSC1 = m_maxSizeSC2 = 0; -} - - -streamData::adTrigger::adTrigger(const char *id, streamID_t sid) -{ - m_inUse = 1; - m_sid = sid; - m_id = string(id); - m_playedAt = (time_t)0; - m_type = ADVERT_MAP_FIXED; - m_returnPtrSC1 = m_returnPtrSC2 = 0; - m_maxSizeSC1 = m_maxSizeSC2 = 0; -} - -streamData::ringBufferAccess_t streamData::adTrigger::getStartPos (bool sc2) -{ - return sc2 ? m_startPosSC2 : m_startPosSC1; -} - - -bool operator==(const streamData::adTrigger &lhs, const streamData::adTrigger &rhs) -{ - return (lhs.m_id == rhs.m_id); -} - diff --git a/Src/Plugins/DSP/sc_serv3/streamData.h b/Src/Plugins/DSP/sc_serv3/streamData.h deleted file mode 100644 index cbad5b29..00000000 --- a/Src/Plugins/DSP/sc_serv3/streamData.h +++ /dev/null @@ -1,906 +0,0 @@ -#pragma once -#ifndef streamData_H_ -#define streamData_H_ - -#include -#include -#include "threadedRunner.h" -#include "unicode/uniString.h" -#include "threading/thread.h" -#include "yp2.h" -#include -#include "uvox2Common.h" -#include "auth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" - -/* - This class encapsulates all the data for a stream. It also includes - static methods to manage the collection of streams -*/ -using namespace std; - -#define BUF_SIZE 16384 -#define SEND_SIZE 8192 - -class adGroupAccess; - -class streamData -{ -public: - friend class protocol_shoutcastClient; - friend class protocol_shoutcast1Client; - friend class protocol_shoutcast2Client; - friend class protocol_HTTPClient; - friend class protocol_flvClient; - friend class protocol_m4aClient; - -#if defined(_DEBUG) || defined(DEBUG) - friend class protocol_relay_uvox; - friend class protocol_relay_shoutcast; -#endif - -#define ADVERT_MAP_FIXED 0 -#define ADVERT_MAP_FLEX 1 -#define ADVERT_MAP_PAUSE 2 -#define ADVERT_MAP_MAGIC 3 - - class specialFileData; - class adEntry; - class adGroup; - - typedef enum - { - UNKNOWN = 0x0, - SHOUTCAST1 = 0x1, - SHOUTCAST2 = 0x2, - HTML5 = 0x4, - RELAY = 0x8, - WINAMP = 0x10, - ICECAST = 0x20, - VLC = 0x40, - FB2K = 0x80, - WMP = 0x100, - ITUNES = 0x200, - IE = 0x400, - CHROME = 0x800, - SAFARI = 0x1000, - FIREFOX = 0x2000, - SC_CDN_MASTER = 0x4000, - SC_CDN_SLAVE = 0x8000, - ROKU = 0x10000, - APPLE = 0x20000, - MPLAYER = 0x40000, - WARNING = 0x80000, - PS = 0x100000, - RADIO_TOOLBOX = 0x200000, - SC_IRADIO = 0x400000, - FLV = 0x800000, - M4A = 0x1000000, - HTTP = 0x2000000, - RADIONOMY = 0x4000000, - CURL_TOOL = 0x8000000, - SYNOLOGY = 0x10000000, - WIIMC = 0x20000000 - } source_t; - - typedef size_t streamID_t; - typedef std::set streamIDs_t; - typedef uintptr_t ringBufferAccess_t; // we use power of 2 and mask trick to access ring buffer - // because of this, all related variables must have same type - struct ringBuffer_t - { - std::vector<__uint8> m_data; - ringBufferAccess_t m_writePtr; - ringBufferAccess_t m_ptrMask; // must be same type as m_sc1_write_ptr - - ringBuffer_t() : m_writePtr(0), m_ptrMask(0) {} - }; - - struct songHistoryInfo - { - uniString::utf8 m_title; // general title (or is empty) - uniString::utf8 m_metadata; // full metadata (if provided) - time_t m_when; // when it was played - - explicit songHistoryInfo(const uniString::utf8 &title, const uniString::utf8 &metadata) throw() : - m_title(title), m_metadata(metadata), m_when(::time(NULL)) {} - }; - typedef std::deque streamHistory_t; - - struct extraInfo - { - int ypConnected; - int ypErrorCode; - uniString::utf8 ypErrorMsg; - uniString::utf8 ypErrorMsgExtra; - bool isConnected; - bool isRelay; - bool isBackup; - - extraInfo() : ypConnected(0), ypErrorCode(200), isConnected(false), isRelay(false), isBackup(false) {} - }; - - struct streamInfo - { - uniString::utf8 m_streamUser; - uniString::utf8 m_streamName; - uniString::utf8 m_streamGenre[5]; - uniString::utf8 m_streamLogo; - uniString::utf8 m_streamURL; - uniString::utf8 m_radionomyID; - uniString::utf8 m_contentType; - int m_streamBitrate; // in kilobits - bool m_streamPublic; - bool m_vbr; // if it's vbr content and we need to bitrate match - bool m_backup; // signals if this a backup source being used - bool m_allowPublicRelay; - int m_streamSampleRate; // in Hz - int m_avgBitrate; // in bits - int m_maxBitrate; // in bits - int m_minBitrate; // in bits - source_t m_sourceType; - //size_t m_streamPeakUser; - int m_streamMaxUser; - int m_streamMaxBitrate; - int m_streamMinBitrate; - int m_uvoxDataType; // sc2 attributes - uniString::utf8 m_relayURL; // set if we are a relay (used in reporting) - uniString::utf8 m_backupURL; // set if we have a backup url for the source - uniString::utf8 m_srcAddr; // where is the source coming from - uniString::utf8 m_backupServer; - - // for yp2 - uniString::utf8 m_authHash; - uniString::utf8 m_publicIP; // the public IP address of the DNAS if returned by the YP - uniString::utf8 m_stationID; - uniString::utf8 m_serverID; - uniString::utf8 m_authUrl; // overriden url - uniString::utf8 m_advertsUrl; // overriden url - uniString::utf8 m_audienceUrl; // overriden url - uniString::utf8 m_tuneinAirApiUrl; // overriden url - uniString::utf8 m_targetSpotUrl; // overriden url - std::vector m_backupServersList; - - uniString::utf8 m_currentURL; // used by v1 sources to set StreamUrl='%s'; in v1 metadata - uniString::utf8 m_currentSong; - uniString::utf8 m_comingSoon; - uniString::utf8 m_sourceIdent; - std::vector m_nextSongs; - - static int m_allowSSL_global; - static int m_allowAllFormats_global; - static int m_allowMaxBitrate_global; - static int m_allowBackupURL_global; - - int m_allowSSL; - int m_allowAllFormats; - int m_allowMaxBitrate; - int m_allowBackupURL; - - int m_ypResponseCode; - int m_advertMode; - u_short m_srcPort; - - streamInfo() : m_streamBitrate(0), m_streamPublic(false), m_vbr(false), m_backup(false), - m_allowPublicRelay(true), m_streamSampleRate(0), m_avgBitrate(0), - m_maxBitrate(0), m_minBitrate(0), m_sourceType(streamData::SHOUTCAST1), - m_streamMaxUser(0), m_streamMaxBitrate(0), - m_streamMinBitrate(0), m_uvoxDataType(MP3_DATA), m_authUrl(DNAS_AUTH_URL), - m_advertsUrl(METRICS_ADVERTS_URL), m_audienceUrl(METRICS_AUDIENCE_URL), - m_targetSpotUrl(TARGETSPOT_URL), - #ifdef LICENCE_FREE - m_allowSSL(1), m_allowAllFormats(1), m_allowMaxBitrate(0), m_allowBackupURL(1), - #else - m_allowSSL(1), m_allowAllFormats(1), m_allowMaxBitrate(0), m_allowBackupURL(1), - #endif - m_advertMode(0), m_srcPort(0) {} - }; - - struct uvoxConfigData_t //(uvox2 and uvox21) - { - uniString::utf8 m_mimeType; - int m_avgBitrate; // in bits - int m_maxBitrate; // in bits - // buffer size stuff is not actually used in streamData, but is here for completeness. - // note that protocol_relay_uvox does not set these (and pretty much can't anyhow) - int m_desiredBufferSize; // in kilobytes, as requested by broadcaster - int m_minimumBufferSize; // in kilobytes, as requested by broadcaster - ///////////// - int m_icyPub; - uniString::utf8 m_icyName; - uniString::utf8 m_icyGenre; - uniString::utf8 m_icyURL; - - uniString::utf8 toLogString() const throw() - { - return "mimeType=" + m_mimeType + stringUtil::eol() + - "avgBitrate=" + stringUtil::tos(m_avgBitrate) + stringUtil::eol() + - "maxBitrate=" + stringUtil::tos(m_maxBitrate) + stringUtil::eol() + - "desiredBufferSize=" + stringUtil::tos(m_desiredBufferSize) + stringUtil::eol() + - "minimumBufferSize=" + stringUtil::tos(m_minimumBufferSize) + stringUtil::eol() + - "icyName=" + m_icyName + stringUtil::eol() + - "icyGenre=" + m_icyGenre + stringUtil::eol() + - "icyURL=" + m_icyURL + stringUtil::eol() + - "icyPub=" + stringUtil::tos(m_icyPub); - } - - uvoxConfigData_t() : m_avgBitrate(0), m_maxBitrate(0), m_desiredBufferSize(0), m_minimumBufferSize(0), m_icyPub(0) {} - }; - - struct streamSetup - { - const uniString::utf8& m_logString; - const uniString::utf8& m_srcAddr; - const uniString::utf8& m_authHash; - const uniString::utf8& m_streamUser; - const uniString::utf8& m_relayURL; - const uniString::utf8& m_backupURL; - - const source_t m_sourceType; - const streamID_t m_sid; - - const int m_srcPort; - const int m_maxStreamUser; - const int m_maxStreamBitrate; - const int m_minStreamBitrate; - const bool m_allowPublicRelay; - const bool m_backup; - const unsigned int m_sampleRate; - const bool m_vbr; - - httpHeaderMap_t m_headers; - uvoxConfigData_t m_config; - - streamSetup(const uniString::utf8 &logString, const uniString::utf8 &srcAddr, - const uniString::utf8 &authHash, const uniString::utf8 &streamUser, - const uniString::utf8 &relayURL, const uniString::utf8 &backupURL, - const source_t sourceType, const streamID_t sid, const int srcPort, - const int maxStreamUser, const int maxStreamBitrate, - const int minStreamBitrate, const bool allowPublicRelay, - const bool backup, const unsigned int sampleRate, - const bool vbr, httpHeaderMap_t headers) throw() - : m_logString(logString), m_srcAddr(srcAddr), m_authHash(authHash), - m_streamUser(streamUser), m_relayURL(relayURL), m_backupURL(backupURL), - m_sourceType(sourceType), m_sid(sid), m_srcPort(srcPort), - m_maxStreamUser(maxStreamUser), m_maxStreamBitrate(maxStreamBitrate), - m_minStreamBitrate(minStreamBitrate), m_allowPublicRelay(allowPublicRelay), - m_backup(backup), m_sampleRate(sampleRate), m_vbr(vbr), m_headers(headers) {} - - streamSetup(const uniString::utf8 &logString, const uniString::utf8 &srcAddr, - const uniString::utf8 &authHash, const uniString::utf8 &streamUser, - const uniString::utf8 &relayURL, const uniString::utf8 &backupURL, - const source_t sourceType, const streamID_t sid, const int srcPort, - const int maxStreamUser, const int maxStreamBitrate, - const int minStreamBitrate, const bool allowPublicRelay, - const bool backup, const unsigned int sampleRate, - const bool vbr, uvoxConfigData_t& config) throw() - : m_logString(logString), m_srcAddr(srcAddr), m_authHash(authHash), - m_streamUser(streamUser), m_relayURL(relayURL), m_backupURL(backupURL), - m_sourceType(sourceType), m_sid(sid), m_srcPort(srcPort), - m_maxStreamUser(maxStreamUser), m_maxStreamBitrate(maxStreamBitrate), - m_minStreamBitrate(minStreamBitrate), m_allowPublicRelay(allowPublicRelay), - m_backup(backup), m_sampleRate(sampleRate), m_vbr(vbr), m_config(config) {} - }; - - typedef pair adGroupEntry; // is the strings needed here? - - class adGroups; - class specialFileData - { - friend class adEntry; - friend class adGroups; - - private: - unsigned int m_refcount; - mutable AOL_namespace::mutex m_lock; - std::vector<__uint8> m_sc1Buffer; - std::vector<__uint8> m_sc2Buffer; - void _replaceData(const std::vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw(); - - public: - const std::string m_description; - const std::string m_url; // these could be offloaded into separate object, only apply initially - int m_samplerate; - int m_bitrate; - float m_duration; - bool m_failed; - bool m_missing; - unsigned m_retried; - time_t m_lastUsed; - - explicit specialFileData(const std::string &description, const std::string &url = "") throw() : m_description(description), m_url(url) - { - m_failed = false; - m_missing = (url == "" ? false : true); - m_refcount = 1; - m_retried = 0; - m_samplerate = 0; - m_duration = 0; - m_lastUsed = (time_t)0; - } - ~specialFileData() throw() { m_lock.lock(); m_sc1Buffer.clear(); m_sc2Buffer.clear(); m_lock.unlock(); /*if (m_refcount > 1) abort();*/ } - - int loadFromFile(const uniFile::filenameType &name, const int bitrate, const int uvoxDataType, - const unsigned int samplerate, const uniString::utf8& logString) throw(); - int verifyData (const uniString::utf8& logString); - - void getSc1Data(std::vector<__uint8> &v) const throw() { stackLock sml(m_lock); v = m_sc1Buffer; } - void getSc2Data(std::vector<__uint8> &v) const throw() { stackLock sml(m_lock); v = m_sc2Buffer; } - - void updateUvoxData(const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw(); - void replaceData(const std::vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw(); - bool gotData(void) const throw() { stackLock sml(m_lock); return (!m_sc2Buffer.empty() && !m_sc1Buffer.empty()); } - unsigned int getRefcount () { return m_refcount; } - void increaseRefcount () { stackLock sml(m_lock); ++m_refcount; } - - static void release (specialFileData *f); - - friend class adGroup; - friend class protocol_shoutcastClient; - friend class protocol_shoutcast1Client; - friend class protocol_shoutcast2Client; - friend class protocol_HTTPClient; - friend class protocol_flvClient; - friend class protocol_m4aClient; - }; - - static int cleanFileData(uniFile::filenameType fn, vector<__uint8> &buffer, size_t siz, - const int bitrate, const unsigned int samplerate, - const int uvoxDataType, const uniString::utf8& logString, - const uniString::utf8& description, unsigned int &read_samplerate); - - class adTrigger; - class adGroupQueue; - - class adEntry - { - public: - size_t upper; - specialFileData *ad; - - ~adEntry() { if (ad) ad->release(ad); } - - explicit adEntry(specialFileData *d); - adEntry (const adEntry &e); - void flush(metrics::adSummary &summary); - }; - - class adGroup - { - friend class streamData::adGroups; - friend class streamData::adGroupQueue; - friend class adGroupAccess; - - adTrigger *m_trigger; - size_t m_totalSizeSC1; - size_t m_totalSizeSC2; - public: - std::deque ads; - adGroup() { m_totalSizeSC1 = m_totalSizeSC2 = 0; m_trigger = NULL; } - adGroup(adGroup &, adTrigger &); - ~adGroup() {;} - - void appendAdvert (specialFileData &d); - void flushCounts (metrics::adSummary &summary); - int recalculateTotalSize (); - }; - - class adGroupQueue - { - friend class adGroups; - void flushStats (metrics::adSummary &summary, adTrigger *); - public: - unsigned int listeners; - list queue; - - adGroupQueue() { listeners = 0; } - ~adGroupQueue(); - - }; - - class adTrigger - { - friend class adGroupQueue; - public: - unsigned long m_inUse; - long m_type; // fixed/flex etc - streamData::ringBufferAccess_t m_startPosSC1; - streamData::ringBufferAccess_t m_startPosSC2; - streamData::ringBufferAccess_t m_returnPtrSC1; - streamData::ringBufferAccess_t m_returnPtrSC2; - time_t m_playedAt; - streamID_t m_sid; - string m_id; - size_t m_maxSizeSC1; - size_t m_maxSizeSC2; - unsigned m_duration; - - adTrigger(const char *id, streamID_t sid); - adTrigger(const string &id, streamID_t sid); - ~adTrigger(); - ringBufferAccess_t getStartPos (bool sc2 = true); - friend bool operator==(const streamData::adTrigger &lhs, const streamData::adTrigger &rhs); - }; - - typedef std::map adGroupMap_t; - - class adGroups - { - friend class adGroupAccess; - - static AOL_namespace::mutex adContentLock; - // a global map with a custom destructor - static struct gpool : map - { ~gpool(); } adData; // global pool - static list adContentPending; // downloading to global pool - - static time_t m_nextDownloadRun; - - streamData *m_sd; - string lastUUID; // last update marker - unsigned m_recheck; // serial count - - adGroup *findGroup (adGroupAccess &ac, ringBufferAccess_t pos); - void flushStats (adTrigger *trigger); - public: - class adGroupsRetriever; - adGroupsRetriever *retriever; - mutable AOL_namespace::mutex m_lock; - streamData::ringBufferAccess_t m_returnPtrSC1; - streamData::ringBufferAccess_t m_returnPtrSC2; - - adGroupMap_t mapping; - std::list triggers; - - unsigned refcount; // prevent update to groups if in use - int skippedAds; // used to help track stream mis-matches - time_t nextUpdate; - long m_type; // fixed/flex etc - - adGroups (streamData *sd); - ~adGroups(); - - bool attachGroupQueue (adGroupAccess &ac); - void detachGroupQueue (adGroupAccess &ac); - - void createNewTrigger (const string &reqID); - void purge (streamData::ringBuffer_t &buffer); - void purgeGroups(); - void duplicateTrigger (const string &id); - void setType (const uniString::utf8 &s); - size_t overlaySize (adTrigger *t, bool sc2 = false); - - adGroup *addToGroup(const string &id, const int grp, specialFileData *f); - - void loadGroups(const uniString::utf8& url, const streamData::streamID_t sid); - adGroupQueue *findQueue (int grp); - void checkForNewAdverts(const uniString::utf8& url, const streamData::streamID_t sid); - uniString::utf8 getAdvertGroup(); - void queueNewSet(const streamData::streamID_t id, adGroups *newgroups); - void flushGroupCounts(const streamData::streamID_t sid); - void releaseTrigger (adTrigger *trigger); - - static THREAD_FUNC process(void* arg); - static THREAD_FUNC runAdDownload(void* arg); - }; - -private: - // streams fall into two groups. Those which are active and usable, and those which are "dead". - // dead streams are those which are going away due to a media type change or a uvox terminate stream message. - // since the clients cannot go away instantaneously, they are considered "dying" until all references counts go - // to zero. Streams that are not dying (including those without a source) are cross referenced in the g_streamMap - // table - static AOL_namespace::mutex g_streamMapLock; - static std::set g_streams; // all the streams, including those that are "dying" - static std::map g_streamMap; // maps stream IDs to stream objects (active only) - static std::map g_streamUptime; // tracks per-stream uptime (active only) - static std::map g_streamReferenceCounts; - static std::map g_streamSourceIsConnected; // is the source connected - static AOL_namespace::mutex g_sourceRelayMapLock; - static std::map g_streamSourceRelayIsActive; // is the source relay active e.g. connected or trying to connect or needs to die? - static AOL_namespace::mutex g_streamSongHistoryMapLock; - static std::map g_streamSongHistoryMap; -#if defined(_DEBUG) || defined(DEBUG) - static map g_streamSaving; -#endif - // note: the "source is connected" concept was originally in the streamData object itself.To avoid races, that - // flag must be manipulated under the g_streamMapLock. This was confusing, I've moved the flag to the set of tables - // above that clearly require that lock to be in place - - // create a new stream object with the given config data and install it in the static global tables above - static streamData* _createNewStream(const streamSetup& setup) throw(std::exception); - - static void _reduceReferenceCount(const uniString::utf8& logString, streamData* sd, const streamID_t id); - // return null if stream does not exist - static streamData* _increaseReferenceCount(const streamID_t ID); - - static void _moveStreamToDeadPool(const streamID_t ID) throw(); - static void _moveStreamToDeadPool(streamData *sd) throw(); - static void _moveStreamToDeadPool(std::map::iterator i) throw(); - -public: - static void removeRelayStatus(streamID_t ID); - - static source_t getClientType(source_t clientType, const uniString::utf8& userAgent); - static source_t getClientTypeCompat(source_t clientType, const uniString::utf8& userAgent); - - static bool isAllowedType(const int type); - static bool isAllowedType(const int type, bool& mp3); - - static int convertRawToUvox (vector<__uint8> &sc2buffer, const vector<__uint8> &buf, - const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw(); - - - // permanently stop all sources in preparation for shutdown - static void killAllSources() throw(); - static void killStreamSource(const streamID_t id) throw(); - static void killSource(const streamID_t id, streamData *sd = 0) throw(); - static streamIDs_t getStreamIds(const int mode = 0) throw(); - static size_t totalStreams() throw(); // returns total number of streamData objects including those that are dying - static size_t totalActiveStreams(size_t &lastSID) throw(); // returns total number of active streamData objects - static streamID_t enumStreams(const size_t index) throw(); // will enumerate the available streams - static streamID_t getStreamIdFromPath(const uniString::utf8 &url, bool& htmlPage) throw(); - - // Called by sources. create a stream from a type 1 (original shoutcast/http/icecast) - // source. If stream exists and is compatible then returns existing stream - // otherwise it creates a new one. Returns null if the stream already has a source - // this will fetch an existing stream for a source if it exists, or create it if it does not or the source is incompatible - static streamData* createStream(const streamSetup& setup) throw(std::exception); - ////////////////////////////////// - - // when the source goes away - static void streamSourceLost(const uniString::utf8& logString, streamData *sd, const streamID_t id); - // when a client goes away - static void streamClientLost(const uniString::utf8& logString, streamData *sd, const streamID_t id); - - // called by clients to get access to a stream. Null if stream does not exist - // isSourceActive flag is false if the source went away or if we are using yp2 and - // the yp2::add() function hasn't returned yet. - static streamData* accessStream(const streamID_t ID) throw(); - static streamData* accessStream(const streamID_t ID, bool &isSourceActive) throw(); - // ensure this is called after calling accessStream(..) otherwise we end up - // with references to the objects kept which isn't good for larger streams - void releaseStream(); - - static bool isSourceConnected(const streamID_t id) throw(); - - static int isRelayActive(const streamID_t id, bool &noEntry) throw(); - static void setRelayActive(const streamID_t id, int state) throw(); - static int setRelayActiveFlags (streamID_t id, bool &noEntry, int flags, int mask = 0); - - // get a streams content type, return empty string if not found or not set - static uniString::utf8 getStreamContentType(const streamID_t ID) throw(); - - // get all relevant info about the stream - static bool getStreamInfo(const streamID_t id, streamInfo &info, extraInfo &extra) throw(); - - static void getStreamSongHistory(const streamID_t id, streamHistory_t& songHistory) throw(); - - static bool getStreamNextSongs(const streamID_t id, uniString::utf8& currentSong, - uniString::utf8& comingSoon, - std::vector& nextSongs) throw(); - - static time_t getStreamUptime(const streamID_t ID) throw(); - - static bool validateTitle(uniString::utf8 &m_updinfoSong) throw(); - - - static uniString::utf8 getContentType(const streamData::streamInfo &info) throw(); - - //////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////// END OF STATICS ////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////// -private: - ///////////////////////////////////////////////////////////////////////////////////////// - mutable AOL_namespace::mutex m_stateLock; - streamInfo m_streamInfo; - - const streamID_t m_ID; - time_t m_startTime; // when the stream started; - //// yp reporting state - time_t m_nextYPPush; // time we should send another push if not earlier - time_t m_maxYPInterval; // max seconds between reports - uniString::utf8 m_lastTouchTitle; // last title sent via tchsrv - yp2::yp2SessionKey m_yp2SessionKey; - //// - int m_creating; // 1 if in auto-creation state and 2 if completed or was an error - int m_kill; // 1 or 2 if we need to kill ourselves i.e. when using backup sources - short m_dead; - short m_adTest; // 1 if the advert trigger is for testing only - - bool m_insertAdvert; - unsigned m_duration; // for flexbreak; - // hole - - unsigned int m_lastStreamSampleRate; // in Hz (used for tracking samplerates - // to ensure we've got a 'good' match - int m_lastStreamBitrate; // used to detect vbr streams vs cbr/cbr - unsigned m_syncFrameCount; // used to see if we're failing to sync - - //////////////////// end variables covered by state lock /////////////////////////////// - - specialFileData m_introFile; - specialFileData m_backupFile; - specialFileData m_adTestFile; - specialFileData m_adTestFile2; - specialFileData m_adTestFile3; - specialFileData m_adTestFile4; - - ////////////////////////////////////////////////////// - // shoutcast1 ring buffer - AOL_namespace::rwLock m_sc1StreamLock; - AOL_namespace::rwLock m_sc21StreamLock; - - ringBuffer_t m_sc1_ring_buffer; - ringBuffer_t m_sc21_ring_buffer; // data is uvox encoded - -public: - adGroups advertGroups; - - void checkForAdverts(); - uniString::utf8 getAdvertGroup(); - static bool knownAdvertGroup(const streamData::streamID_t &sid, const int group); - -private: - // where are the start of packets - std::deque m_sc1_packet_starts;// not really important for sc1 - std::deque m_sc21_packet_starts; - ///////////////////////////////////////////////////////////// - - // the metadata table for sc1 stores metadata changes and the point in the - // buffer where they occur. The metadata is stored in the outgoing format - // a.k.a StreamTitle=.....; - // - // we also store nextTrack and comingSoon info in this table. It's a bit of a hack, but - // the code that updates yp2 uses this table to get the track title since it is quicker - // to search than the potential binary gunk that makes up uvox data. -public: - struct sc1MetadataAndExtensionInfo - { - uniString::utf8 m_songTitle; // this is in native shoutcast 1 stream format - uniString::utf8 m_songMetadataForYP2; // xml to be inserted directly into yp2 request - }; - -private: - AOL_namespace::mutex m_sc1MetadataLock; - typedef std::deque > sc1MetadataTable_t; - sc1MetadataTable_t m_sc1MetadataTable; - - // note that metadata for uvox style streams cannot be the utf8 type directly, because the utf8 type - // does sanity checks for valid utf8 codes. The metadata could just be binary junk and we must - // accept that. Instead, we use a vector of utf8::value_type which at least makes conversion to utf8 - // classes easier -public: - typedef std::vector uvoxMetadata_t; - -private: - AOL_namespace::mutex m_sc21MetadataLock; - typedef std::deque > sc21MetadataTable_t; - sc21MetadataTable_t m_sc21MetadataTable; - uvoxMetadata_t m_sc21MetadataToPutInline; // metadata that must be put inline asap - - AOL_namespace::mutex m_sc21StreamAlbumArtLock; - AOL_namespace::mutex m_sc21PlayingAlbumArtLock; - typedef std::deque > sc21AlbumArtTable_t; - sc21AlbumArtTable_t m_sc21StreamAlbumArtTable; - uvoxMetadata_t m_sc21StreamAlbumArtToPutInline; // albumart that must be put inline asap - sc21AlbumArtTable_t m_sc21PlayingAlbumArtTable; - uvoxMetadata_t m_sc21PlayingAlbumArtToPutInline; // albumart that must be put inline asap - std::vector<__uint8> m_sc21AlbumArtData[2]; - size_t m_sc21AlbumArtMime[2]; -#if 0 - // limit triggers - AOL_namespace::mutex m_sc1LimitTriggerLock; - std::set*> m_sc1LimitTriggers; - - AOL_namespace::mutex m_sc21LimitTriggerLock; - std::set*> m_sc21LimitTriggers; - - static void _scheduleLimitTrigger(pipeDrivenSignal *t, const ringBufferAccess_t readPtr, - AOL_namespace::mutex &streamLock, const ringBuffer_t &ringBuffer, - AOL_namespace::mutex &triggerSetLock, - std::set*> &triggerSet) throw(); -#endif - void _setupBuffers(const uniString::utf8& logString, const bool re_init = false) throw(); - - const bool updateSourceSampleRate(unsigned int& samplerate, const unsigned int read_samplerate) throw(); - - void YP2_add() throw(); - void _YP2_add() throw(); - void YP2_remove() throw(); - void _YP2_remove() throw(); - void YP2_update() throw(); - - // you must remove this streamData object from the g_streamMap immediately before or after calling - // this, otherwise you'll corrupt the static structures. - // Reason: die will cause the streamData to be removed from g_streams, but since die() causes ID() to return zero, - // it will not get removed from g_streamMap - void die() throw(); - - parserInfo *m_parser; - -public: - explicit streamData(const streamSetup& setup) throw(); // create shoutcast 1 - - void streamUpdate(const streamID_t ID, const uniString::utf8 &authHash, const int streamMaxUser, - const int streamMaxBitrate, const int streamMinBitrate) throw(); - - ~streamData() throw(); - - void sourceReconnect(const streamSetup& setup) throw(); // reconnect as shoutcast 1 - - static MP3_FrameInfo *detectMP3 (unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - int detectMP3 (MP3_FrameInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - - static AAC_FrameInfo *detectAAC (unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - int detectAAC (parserInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - - static int getFrameInfo (parserInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk = 6); - - const bool syncToStream(short unsigned int& remainderSize, __uint8 *remainder, - int amt, int& bitrate, const int type, const char *buf, - const uniString::utf8& logString); - - const bool isSourceCompatible(const streamSetup& setup) const throw(); // is this configuration compatible with the existing stream - - static uniString::utf8 getHTML5Player(const size_t sid) throw(); - static uniString::utf8 getStreamMessage(const size_t sid) throw(); - static void updateStreamMessage(const size_t sid, const uniString::utf8& message) throw(); - - const streamID_t ID() const { return (m_dead ? 0 : m_ID); } - const time_t getStartTime() const { return m_startTime; } - const streamInfo &getInfo() const { return m_streamInfo; } - const uniString::utf8& streamName() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamName; } - const uniString::utf8& streamGenre() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[0]; } - const uniString::utf8& streamGenre2() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[1]; } - const uniString::utf8& streamGenre3() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[2]; } - const uniString::utf8& streamGenre4() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[3]; } - const uniString::utf8& streamGenre5() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[4]; } - const uniString::utf8& streamURL() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamURL; } - const uniString::utf8& radionomyID() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_radionomyID; } - const uniString::utf8& streamContentType() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_contentType; } - const int streamBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamBitrate; } - const bool streamPublic() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamPublic; } - const bool streamIsVBR() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_vbr; } - const bool allowPublicRelay() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_allowPublicRelay; } - const int streamSampleRate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamSampleRate; } - const int streamAvgBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_avgBitrate; } - const int streamActualMaxBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_maxBitrate; } - const int streamUvoxDataType() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_uvoxDataType; } - const uniString::utf8& streamBackupServer() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_backupServer; } - const std::vector& streamBackupServers() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_backupServersList; } - const uniString::utf8& streamPublicIP() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_publicIP; } - const uniString::utf8& streamAuthhash() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_authHash; } - const int streamMaxUser() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMaxUser; } - const int streamMaxBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMaxBitrate; } - const int streamMinBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMinBitrate; } - - const int streamAdvertMode() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_advertMode; } - const uniString::utf8& authUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_authUrl; } - const uniString::utf8& advertsUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_advertsUrl; } - const uniString::utf8& audienceUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_audienceUrl; } - const uniString::utf8& tuneinAirApiUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_tuneinAirApiUrl; } - const uniString::utf8& targetSpotUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_targetSpotUrl; } - - const std::vector<__uint8>& streamAlbumArt() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtData[0]; } - const std::vector<__uint8>& streamPlayingAlbumArt() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtData[1]; } - - const size_t streamAlbumArtMime() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtMime[0]; } - const size_t streamPlayingAlbumArtMime() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtMime[1]; } - - // streamSetMimeType is only used by uvox 2 since the determination must be delayed until the first data packet - void streamSetMimeType(const uniString::utf8 &mt) throw() { stackLock sml(m_stateLock); m_streamInfo.m_contentType = mt; } - - static bool isRelayStream(const streamID_t id) throw(); - static bool isBackupStream(const streamID_t id) throw(); - const int isDead() const throw() { stackLock sml(m_stateLock); return m_dead; } - void setKill(int kill) throw() { stackLock sml(m_stateLock); m_kill = kill; } - const int isKill() const throw() { stackLock sml(m_stateLock); return m_kill; } - - void updateSongHistorySize() throw(); - void pushMetricsYP (bool force = true); - - void updateSourceIdent(uniString::utf8& sourceIdent, const bool relay = false) throw(); - - // write data into ring buffers (sc1 and sc2) - #if defined(_DEBUG) || defined(DEBUG) - void writeSc1(const __uint8 *data, const int amt, const streamID_t id); - #else - void writeSc1(const __uint8 *data, const int amt); - #endif - void writeSc21(const std::vector<__uint8> &data) throw(); // data is exactly one uvox data packet or packet of uvox passthru metadata. - // passthru metadata is treated just like regular data, but we obviously - // can't pass it to the sc1 buffers since there is no analog for that in sc1 - - const int getStreamData(streamData::ringBufferAccess_t& amt, const streamData::ringBufferAccess_t& readPtr, - std::vector<__uint8>& data, const size_t remSize, const bool sc2 = false) throw(); /* for readers only */ - - // make sure streamData is not holding a reference to this. - void abandonLimitTrigger(pipeDrivenSignal *t, const bool sc2 = false) throw(); - void scheduleLimitTrigger(pipeDrivenSignal *t, const ringBufferAccess_t readPtr, const bool sc2 = false) throw(); - - // add shoutcast1 metadata at current position. This is just the string - int addSc1MetadataAtCurrentPosition(const uniString::utf8& logString, const uniString::utf8& sc1_metadata_raw, - const uniString::utf8& sc1_url_raw, const uniString::utf8& sc1_next_raw) throw(); - int addUvoxMetadataAtCurrentPosition(__uint16 voxMsgType,const std::vector<__uint8> &data) throw(); - - // get metadata that is appropriate for the indicated position - sc1MetadataAndExtensionInfo getSc1Metadata(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21Metadata(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21StreamAlbumArt(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21PlayingAlbumArt(const ringBufferAccess_t) throw(); - // - void clearCachedMetadata() throw(); // clear all metadata that is in caches - void clearCachedArtwork(const size_t index) throw(); // clears specific artwork - // - void resetAdvertTriggers(const uniString::utf8& m_updinfoSong); - - // get good places for a client to start - const ringBufferAccess_t getClientStartPosition(const bool sc2 = false) throw(); - ringBufferAccess_t getClientStartPosition(ringBufferAccess_t ptr, bool sc2) throw(); - - specialFileData& getIntroFile() throw() { return m_introFile; } - specialFileData& getBackupFile() throw() { return m_backupFile; } - specialFileData& getAdTestFile(const int num) throw() - { - switch (num) - { - case 1: return m_adTestFile2; - case 2: return m_adTestFile3; - case 3: return m_adTestFile4; - default: return m_adTestFile; - } - } - - static int YP_SrvID(const streamID_t id) throw(); - static int YP_StnID(const streamID_t id) throw(); - - void updateStreamUser(const uniString::utf8& streamUser); - void resetStreamAuthhash(); - - // get the current title (if there is one) for touches/updates/tunein air api/etc - uniString::utf8 getYPStreamTitle() throw(); - - void YP2_updateInfo(const yp2::stationInfo &info) throw(); - bool YP2_addSuccessful(int &addFailIgnore, int &errorCode) throw(); -}; - -// advert related - -class adGroupAccess -{ - friend class streamData::adGroups; - size_t group; - int idx; - bool m_sc2; // use until the data buffer duplication is fixed - bool m_grpChanged; - streamData::adGroup *cached_ref; - streamData::adGroupQueue *m_groupQueue; - - bool foundNextAdvert (const streamData::streamID_t sid, streamData::adGroups &groups, streamData::adGroup &g); - streamData::adGroup *getGroup(streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - -public: - size_t offset; - size_t total_processed; - time_t start_time; - unsigned m_duration; - - explicit adGroupAccess(bool sc2 = false, int id = 0) { group = id; m_sc2 = sc2; idx = 0; cached_ref = NULL; offset = 0; m_grpChanged = false; m_groupQueue = NULL; } - - void setGroup (size_t id); - size_t getGroup() const { return group; } - const bool inAdvertMode() const; - - void changedGroup (streamData::adGroups &groups); - bool haveAdverts(const streamData::streamID_t sid, streamData::adGroups &groups, streamData::ringBufferAccess_t pos); - streamData::specialFileData *getAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - bool anotherAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - void stopAdRun(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - const streamData::adTrigger *getCurrentTrigger () const { return cached_ref ? cached_ref->m_trigger : NULL; } -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp b/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp deleted file mode 100644 index c2e5d94d..00000000 --- a/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp +++ /dev/null @@ -1,1135 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "threadedRunner.h" -#include -#include "global.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "protocol_HTTPStyle.h" -#include "protocol_HTTPSource.h" -#include "protocol_shoutcastSource.h" -#include "protocol_FlashPolicyServer.h" -#include "protocol_uvox2Source.h" -#include "uvox2Common.h" -#include "banList.h" -#include "ripList.h" -#ifdef _MSC_VER -#define MSG_DONTWAIT 0 -#else -#include -#include -#ifndef EPOLLRDHUP -#define EPOLLRDHUP 0x2000 -#endif -#endif - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define LOGNAME "[THREADRUNNER] " -#define DEBUG_LOG(...) do { if (gOptions.threadRunnerDebug()) DLOG(__VA_ARGS__); } while (0) - -#ifndef SSL_OP_NO_COMPRESSION -#define SSL_OP_NO_COMPRESSION 0 -#endif - -// make standard string for logging address -inline utf8 addrLogString(const utf8 &addr, const u_short port, const utf8 &xff) throw() -{ - const bool use_xff = (gOptions.useXFF() && !xff.empty()); - return (use_xff ? xff : addr) + ":" + tos(port) + (use_xff ? " (xff)" : ""); -} - -// make standard string for logging src address -utf8 srcAddrLogString(const utf8 &addr, const u_short port, const size_t sid) throw() -{ - return "[SRC " + addrLogString(addr, port) + (sid > 0 ? " sid=" + tos(sid) : "") + "] "; -} -// make standard string for loggin dst address -utf8 dstAddrLogString(const utf8 &addr, const u_short port, const utf8 &xff, const size_t sid) throw() -{ - return "[DST " + addrLogString(addr, port, xff) + (sid > 0 ? " sid=" + tos(sid) : "") + "] "; -} -// make standard string for logging unknown address -utf8 recvAddrLogString(const utf8 &addr, const u_short port) throw() -{ - return "[RECV " + addrLogString(addr, port) + "] "; -} -// make standard string for socket error -string socketErrString(int err) throw() { return "err=" + socketOps::errMsg(err) + "(" + tos(err) + ")"; } - -static AOL_namespace::mutex sm_globalRunnerLock; -static set sm_runners; - -SSL_CTX *threadedRunner::m_sslCtx = NULL; -AOL_namespace::mutex *threadedRunner::m_sslMutexes = NULL; - -static bool cmp(threadedRunner* a, threadedRunner* b) throw() -{ - return (a->sizeOfRunList() < b->sizeOfRunList()); -} - -bool threadedRunner::scheduleRunnable(runnable *r) throw() -{ - if (r) - { - stackLock sml(sm_globalRunnerLock); - - // diagnostics. Print load - if (gOptions.threadRunnerDebug()) - { - utf8 msg = LOGNAME; - for (set::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - msg += ((i == sm_runners.begin() ? "Thread " : ", thread ") + (*i)->threadNumber() + " amt=" + tos((*i)->sizeOfRunList())); - } - DEBUG_LOG(msg); - } - - // find least busy - set::const_iterator which = min_element(sm_runners.begin(), sm_runners.end(), cmp); - if ((which != sm_runners.end()) && (*which)->addRunnable(r)) - { - return true; - } - - // didn't work... schedule anywhere - DEBUG_LOG(LOGNAME "Schedule failure, trying any thread"); - for (set::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - if ((*i)->addRunnable(r)) - { - return true; - } - } - } - return false; -} - -void threadedRunner::wakeup() throw() -{ - stackLock sml(sm_globalRunnerLock); - - for (set::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - (*i)->wakeupRunnable(); - } -} - -uniString::utf8 threadedRunner::getRunnabledetails() throw() -{ - stackLock sml(sm_globalRunnerLock); - - utf8 details; - for (set::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - details += (i != sm_runners.begin() ? "
" : (utf8)"") + "Thread #" + - (*i)->threadNumber() + ": " + tos((*i)->sizeOfRunList()) + - "
"; - - map runners; - (*i)->enumRunnables(runners); - for (map::const_iterator r = runners.begin(); r != runners.end(); ++r) - { - details += (r != runners.begin() ? "
" : "") + (*r).first + " - " + tos((*r).second); - } - details += "
"; - } - return details; -} - -threadedRunner::threadedRunner() throw() : m_stop(false), m_threadNumber((const short)(sm_runners.size() + 1)) -{ - stackLock sml(sm_globalRunnerLock); - sm_runners.insert(this); -} - -threadedRunner::~threadedRunner() throw() -{ - stackLock sml(sm_globalRunnerLock); - sm_runners.erase(this); -} - -// main loop of thread -const unsigned threadedRunner::operator()() throw() -{ - unsigned result = 1; - - try - { - m_lock.lock(); - while (!m_stop) - { - m_lock.unlock(); - - std::set readSet, writeSet; - int timeout = -1; - - // run everyone (as long as not scheduled) and get their status information, etc - set::const_iterator i = m_runList.begin(); - while (i != m_runList.end()) - { - runnable::timeSliceResult &tsr = (*i)->m_result; - __uint64 now = time_now_ms(); - - // if we're indicated as being scheduled then we - // need to skip doing anything else and look at - // checking if it's ok to process or not, etc - if (tsr.m_scheduleTime) - { - if (now < tsr.m_scheduleTime) - { - int time_diff = (int)(tsr.m_scheduleTime - now); - if (timeout == -1) - { - timeout = time_diff; - } - else - { - timeout = min(timeout, time_diff); - } - ++i; - continue; - } - else - { - // we clear this as we're reached time - // but not the rest as we want what was - // set to now be used in the processing - tsr.m_scheduleTime = 0; - } - } - - // make sure to reset otherwise it gets weird but - // we're only going to do this if we are able to - // run the runnable now (i.e. it's not scheduled) - tsr.reset(now); - - bool exception_occured = false; - try - { - (*i)->timeSlice(); - } - catch (const exception &ex) - { - exception_occured = true; - utf8 what = ex.what(); - if (!what.empty()) - { - ELOG(ex.what()); - } - } - - if (tsr.m_done || exception_occured) - { - set::const_iterator to_go = i; - DEBUG_LOG(LOGNAME "Removing " + (*i)->name() + " [done: " + tos(tsr.m_done) + ", exception: " + tos(exception_occured) + "]"); - removeRunnable(*to_go); - ++i; - m_runList.erase (to_go); - continue; - } - if (!tsr.m_runImmediately) - { - if (!tsr.m_scheduleTime) - { -update_sets: - if (tsr.m_readSet) - { - // filter out anything with an invalid socket - if ((*i)->m_socket != socketOps::cINVALID_SOCKET) - { - readSet.insert(readSet.end(), (*i)->m_socket); - } - if (tsr.m_customSocket != socketOps::cINVALID_SOCKET) - { - readSet.insert(readSet.end(), tsr.m_customSocket); - } - } - - if (tsr.m_writeSet) - { - // filter out anything with an invalid socket - if ((*i)->m_socket != socketOps::cINVALID_SOCKET) - { - writeSet.insert(writeSet.end(), (*i)->m_socket); - } - if (tsr.m_customSocket != socketOps::cINVALID_SOCKET) - { - writeSet.insert(writeSet.end(), tsr.m_customSocket); - } - } - - if (tsr.m_timeout != -1) - { - if (timeout == -1) - { - timeout = tsr.m_timeout; - } - else - { - timeout = min(timeout, tsr.m_timeout); - } - } - } - else - { - // if this is to be scheduled then we'll do a - // quick check to see if we're already after - // that time and if it isn't (which is how it - // should be) then we'll abort, else allow it - // and we get the time again to account for - // the time it's taken to process the runnable - now = time_now_ms(); - if (now < tsr.m_scheduleTime) - { - int time_diff = (int)(tsr.m_scheduleTime - now); - if (timeout == -1) - { - timeout = time_diff; - } - else - { - timeout = min(timeout, time_diff); - } - } - else - { - // we clear this as we're reached time - // but not the rest as we want what was - // set to now be used in the processing - tsr.m_scheduleTime = 0; - timeout = 50; - goto update_sets; - } - } - ++i; - } - } // for - - // delete the old guys, no lock required here, only we add to this set - int released = 0; - while (true) - { - set::const_iterator it = m_runnablesToRemove.begin(); - if (it == m_runnablesToRemove.end()) - break; - if (++released > 300) - { - timeout &= 15; // prevent a large stall but force a quick retry - break; - } - stlx::delete_fntr (*it); - m_runnablesToRemove.erase (it); - } - - readSet.insert (m_signal.test()); - if (timeout < 0) - timeout = 60000; - int n = socketOps::socketSelect(readSet, writeSet, timeout); - - m_lock.lock(); - - // add the new guys, requires lock as set can be added from elsewhere - m_runList.insert(m_runnablesToAdd.begin(), m_runnablesToAdd.end()); - m_runnablesToAdd.clear(); - - if (n > 0) - m_signal.clear(); - } - m_lock.unlock(); - result = 0; - } - catch (const exception &ex) - { - ELOG(LOGNAME + string(ex.what())); - } - catch (...) - { - ELOG(LOGNAME "Unknown exception"); - } - - // delete runnables in run list, and those that are queued to be added - m_lock.lock(); - for_each(m_runnablesToAdd.begin(), m_runnablesToAdd.end(), stlx::delete_fntr); - m_lock.unlock(); - - for_each(m_runList.begin(), m_runList.end(), stlx::delete_fntr); - - return result; -} - -const size_t threadedRunner::sizeOfRunList() throw() -{ - stackLock sml(m_lock); - const size_t result = (m_runList.size() + m_runnablesToAdd.size()); - const size_t subtr = m_runnablesToRemove.size(); - return (subtr > result ? 0 : result - subtr); -} - -const bool threadedRunner::addRunnable(runnable* r) throw() -{ - if (!r) - { - return false; - } - - stackLock sml(m_lock); - if (m_stop) - { - return false; - } - - m_runnablesToAdd.insert(r); - m_signal.set(); - DEBUG_LOG(LOGNAME "Adding " + r->name() + " to thread " + tos(m_threadNumber)); - - return true; -} - -const bool threadedRunner::removeRunnable(runnable *r) throw() -{ - if (!r) - { - return false; - } - - m_runnablesToRemove.insert(r); - m_signal.set(); - DEBUG_LOG(LOGNAME "Removing " + r->name() + " from thread " + tos(m_threadNumber)); - return true; -} - -void threadedRunner::enumRunnables(map& runners) throw() -{ - stackLock sml(m_lock); - - for (set::const_iterator i = m_runList.begin(); i != m_runList.end(); ++i) - { - const utf8::size_type pos = (*i)->name().find((utf8)"protocol_"); - if (pos != utf8::npos) - { - ++runners[(*i)->name().substr(pos + 9, (*i)->name().length())]; - } - else - { - ++runners[(*i)->name()]; - } - } -} - -void threadedRunner::wakeupRunnable() throw() -{ - if (m_lock.timedLock(1000)) - { - m_signal.set(); - m_lock.unlock(); - } -} - -void threadedRunner::stop() throw() -{ - stackLock sml(m_lock); - m_stop = true; - m_signal.set(); -} - -/////////////////////////// -#ifdef LOGNAME -#undef LOGNAME -#endif -#define LOGNAME "[MICROSERVER] " - -#ifdef DEBUG_LOG -#undef DEBUG_LOG -#endif -#define DEBUG_LOG(x) { if (gOptions.microServerDebug()) DLOG((x)); } - -microServer::microServer(const string &listenAddr, const u_short listenPort, - const AllowableProtocols_t protocols, - const ListenTypes_t types) throw(exception) - : m_protocols(protocols) -{ - try - { - m_socket = socketOps::createTCPSocketTHROW(); - #ifndef _WIN32 - { - int bflag = 1; - setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &bflag, sizeof(bflag)); - #if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) - int wait = 1; - setsockopt(m_socket, IPPROTO_TCP, TCP_DEFER_ACCEPT, &wait, sizeof(wait)); - #endif - #ifdef PLATFORM_BSD - struct accept_filter_arg af = {"dataready", ""}; - setsockopt(m_socket, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af)); - #endif - } - #endif - socketOps::bindTHROW(m_socket, listenPort, listenAddr); - socketOps::listenTHROW(m_socket); - socketOps::setNonblockTHROW(m_socket, true); - - bindMessage(types, listenPort); - } - catch (const exception &ex) - { - socketOps::forgetTCPSocket(m_socket); - string error = ex.what(); - throw runtime_error(LOGNAME "Error opening port " + tos(listenPort) + " because " + toLower(error)); - } -} - -void microServer::bindMessage(const ListenTypes_t types, const u_short listenPort) throw() -{ - string message = "Listening for connections on port "; - - if ((types & microServer::L_SOURCE) && (types & microServer::L_CLIENT)) - { - message = "Listening for source and client connections on port "; - } - else if ((types & microServer::L_FLASH)) - { - message = "Listening for flash policy server connection on port "; - } - else if ((types & microServer::L_SOURCE)) - { - message = "Listening for legacy source connections on port "; - } - else if ((types & microServer::L_SOURCE2)) - { - message = "Listening for source connections on port "; - } - else if ((types & microServer::L_CLIENT_ALT)) - { - message = "Listening for client connections on alternate port "; - } - else if ((types & microServer::L_CLIENT)) - { - message = "Listening for client connections on port "; - } - ILOG(LOGNAME + message + tos(listenPort)); -} - -void microServer::updateProtocols(AllowableProtocols_t protocols, ListenTypes_t types, const u_short listenPort) throw() -{ - m_protocols = protocols; - bindMessage(types, listenPort); -} - -microServer::~microServer() throw() -{ - string addr; - u_short port = 0; - socketOps::getsockname(m_socket, addr, port); - socketOps::forgetTCPSocket(m_socket); - if (!iskilled()) - { - ELOG(LOGNAME "Unexpected stop detected for listening for connections on port " + tos(port)); - ELOG(LOGNAME "This should not happen and prevents the DNAS from working correctly."); - ELOG(LOGNAME "DNAS restart is required. If this keeps happening, enable all debugging options and provide the logs to Shoutcast support."); - } - else - { - DEBUG_LOG(LOGNAME "Stopped listening for connections on port " + tos(port)); - } -} - -void microServer::timeSlice() throw(exception) -{ - static int repeated = 0; - - // don't allow any new connections when the server is stopping - if (!iskilled()) - { - try - { - string addr; - u_short port = 0; - - socketOps::tSOCKET newSock = socketOps::acceptTHROW(m_socket, addr, port, true); - if (newSock != socketOps::cSOCKET_ERROR) - { - socketOps::getpeername(newSock, addr, port); - - string hostName = addr; - if (gOptions.nameLookups()) - { - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - } - - socketOps::setNonblockTHROW(newSock, true); - DEBUG_LOG(LOGNAME "Connection received from " + addr + ":" + tos(port)); - threadedRunner::scheduleRunnable(new microConnection(newSock, hostName, addr, port, m_protocols)); - repeated = 0; - } - } - catch (const tagged_error &ex) - { - ELOG(ex.what()); - } - catch (const exception &ex) - { - string msg = ex.what(); - if (!msg.empty()) - { - if (msg.find("Could not call") == 0) - { - // serious error, log unless repeated and delay a retry - if ((repeated & 255) == 0) - ELOG(LOGNAME + msg); - ++repeated; - m_result.schedule (1000); - return; - } - ELOG(LOGNAME + msg); - } - } - - m_result.read(); - return; - } - - m_result.done(); -} - -/////////////////////////////////////////////////// -microConnection::microConnection(const socketOps::tSOCKET s, const string &hostName, const string &addr, - const u_short port, const microServer::AllowableProtocols_t protocols) throw() - : runnable(s), m_srcHostName(hostName), - m_srcAddress(addr), m_srcPort(port), - m_protocols(protocols) -{ -} - -microConnection::~microConnection() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void microConnection::timeSlice() throw(exception) -{ - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout(cur_time, m_lastActivityTime, (recvAddrLogString(m_srcAddress, m_srcPort) + - "Got timeout waiting for data"), gOptions.microServerDebug()); - - const int maxHeaderLineSize = gOptions.maxHeaderLineSize(); - const bool flash_policy = !!(m_protocols & P_FLASHPOLICYFILE); - bool uvox_checked = false; - runnable *runnable = NULL; - - char buf[MAX_MESSAGE_SIZE] = {0}; - // if we've got a 1.x source connection then only handle - // on a per-byte basis, for everything else, try getting - // a few bytes so we can use that as a guide on how then - // to try to process things a bit quicker than per-byte. - // int amt = (!(m_protocols & P_SHOUTCAST1SOURCE) ? UV2X_HDR_SIZE : 1); - int amt = (m_ssl) ? 1 : 4096; - ssize_t rval = 0; - - while (true) - { - if (iskilled() || (size_t)amt > sizeof(buf)) - { - m_result.done(); - return; - } - - int flags = (m_lineBuffer.size() || m_ssl) ? 0 : MSG_PEEK; // use PEEK initially as SSL requires bytes in the socket - if ((rval = recv (buf, amt, flags|MSG_DONTWAIT)) < 1) - { - if (rval == 0) - { - throwEx((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Remote socket closed while waiting for data.") : (utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Socket error while waiting for data. " + socketErrString(rval)) : (utf8)"")); - } - - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - } - - m_lineBuffer.insert (m_lineBuffer.end(), buf, buf + rval); - int lineSize = (int)m_lineBuffer.size(); - - if (lineSize > maxHeaderLineSize) - { - throwEx((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Protocol header line is too large - exceeds " + tos(maxHeaderLineSize) + - " bytes") : (utf8)"")); - } - if (m_ssl == NULL && flags && (m_lineBuffer [0] == 0x16)) // SSLv3 / TLSv1.x ? - { - if (threadedRunner::m_sslCtx == NULL) - { - throwEx((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Remote socket closed, no SSL configured.") : (utf8)"")); - } - if (lineSize < 6) - { - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - if ((m_lineBuffer [1] == 0x3) && (m_lineBuffer [5] == 0x1)) - { - DLOG ("detected ssl request, checking further"); - m_ssl = SSL_new (threadedRunner::m_sslCtx); - SSL_set_accept_state (m_ssl); - SSL_set_fd (m_ssl, (int)m_socket); - SSL_set_mode (m_ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|SSL_MODE_ENABLE_PARTIAL_WRITE); - m_lineBuffer.clear(); - continue; - } - } - utf8::size_type nl = m_lineBuffer.find ((unsigned char)'\n'); - if (nl != utf8::npos) - { - rval = lineSize = (int)nl+1; // 0 offset - if (flags) m_lineBuffer.erase (lineSize); // truncate line to maintain parsing - } - - if (flags) - ::recv (m_socket, buf, rval, MSG_DONTWAIT); // pull bytes from input, passed any PEEK requirement - - if ((lineSize > 0) && (lineSize < UV2X_HDR_SIZE) && (m_lineBuffer [lineSize - 1] != '\n')) - { - if (m_lineBuffer[0] == UVOX2_SYNC_BYTE) - { - // if it looks like it might be a uvox - // frame then grab more on the next go - amt = 3; - } - else - { - // no point in doing any of the checks - // if there is not enough data to view - // e.g. we need to see a valid newline - amt = 1; - } - - m_lastActivityTime = ::time(NULL); - continue; - } - if ((lineSize >= UV2X_HDR_SIZE) && (uvox_checked == false)) - { - // look at first uvox packet to see if we're running uvox 2 or uvox 2.1 - // NOTE: This is a protocol change. We need to add a new packet to 2.1 so request cipher key - const uv2xHdr *voxhdr = reinterpret_cast(m_lineBuffer.c_str()); - if ((voxhdr->sync == UVOX2_SYNC_BYTE) && - (ntohs(voxhdr->msgType) == (u_short)MSG_CIPHER)) - { - const int wanted = (ntohs(voxhdr->msgLen) + UV2X_OVERHEAD); - if (wanted == lineSize) - { - // we have uvox 2.1 - if (m_protocols & P_SHOUTCAST2SOURCE) // only if allowed - { - runnable = new protocol_uvox2Source (*this, (const __uint8 *)m_lineBuffer.c_str(), lineSize); - } - break; - } - amt = min(MAX_MESSAGE_SIZE, (wanted - lineSize)); - m_lastActivityTime = ::time(NULL); - continue; - } - // if we've got enough and there's no sync - // byte then there's not point to re-check. - uvox_checked = true; - } - - if ((lineSize > 0) && (m_lineBuffer[lineSize - 1] == '\n')) - { - // look at start of line, if it's a GET or POST or some standard HTTP thing, then we - // have either a web request or a client connection request. If that is missing, then - // we have to assume it's a shoutcast source, and we have just received the password. - // - // this should be enough to detect absolute and relative requests made to the server - // if there's no / for absolute paths then we'll reject the request as a bad access. - if ((m_lineBuffer.find((utf8)"GET /") == 0) || - (m_lineBuffer.find((utf8)"GET h") == 0) || - (m_lineBuffer.find((utf8)"POST /") == 0) || - (m_lineBuffer.find((utf8)"POST h") == 0) || - (m_lineBuffer.find((utf8)"HEAD /") == 0) || - (m_lineBuffer.find((utf8)"HEAD h") == 0)) - { - if (m_protocols & (P_SHOUTCAST1CLIENT | - P_SHOUTCAST2CLIENT | - P_WEB | P_WEB_SETUP)) - { - runnable = new protocol_HTTPStyle (*this, stripWhitespace(m_lineBuffer).hideAsString()); - } - break; - } - else // assume shoutcast source, and this is the password (though do some checks to sanitise) - { - // and now look for invalid HTTP requests and - // reject them as the earlier handling should - // allow valid relative and absolute requests - if (lineSize > 5) - { - if ((m_lineBuffer.find((utf8)"GET ") == 0) || - (m_lineBuffer.find((utf8)"POST ") == 0) || - (m_lineBuffer.find((utf8)"SOURCE ") == 0) || - (m_lineBuffer.find((utf8)"PUT ") == 0) || - (m_lineBuffer.find((utf8)"HEAD ") == 0)) - { - throwEx((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Invalid HTTP request detected - only valid relative and absolute paths are allowed.") : (utf8)"")); - } - } - - // if we appear to have a 'PUT' or 'SOURCE' request then we'll need to - // do some different handling in-order to get the correct details before - // we can then actually process the stream as a valid (icecast?) source - if (((m_lineBuffer.find((utf8)"SOURCE ") == 0) || - (m_lineBuffer.find((utf8)"PUT ") == 0)) && - ((m_lineBuffer.find((utf8)"HTTP/1.") != utf8::npos) || - (m_lineBuffer.find((utf8)"ICE/1.") != utf8::npos))) - { - runnable = new protocol_HTTPSource (*this, stripWhitespace(m_lineBuffer).hideAsString()); - } - else - { - runnable = new protocol_shoutcastSource (*this, stripWhitespace(m_lineBuffer)); - } - } - break; - } - if (flash_policy && (m_lineBuffer.find((utf8)"") == 0)) - { - runnable = new protocol_FlashPolicyServer (m_socket, dstAddrLogString(m_srcHostName, m_srcPort)); - break; - } - amt = 1; - m_lastActivityTime = ::time(NULL); - } // while - - if (runnable) - { - threadedRunner::scheduleRunnable (runnable); - } - m_result.done(); - return; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -// return 0 if line is ready, or a timeout in seconds for next select call if we are still waiting -// lineBuffer and lastActivityTime are updated by this call -const bool runnable::getHTTPStyleHeaderLine(const size_t sid, utf8 &lineBuffer, const utf8 &logMsgPrefix, int maxLineLength) throw(exception) -{ - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout (cur_time, m_lastActivityTime, - (logMsgPrefix + "Timeout waiting for data"), gOptions.microServerDebug(), sid); - - const int maxHeaderLineSize = maxLineLength > 0 ? maxLineLength : gOptions.maxHeaderLineSize(); - int count = 0; - bool ret = true; - - while (true) - { - int rval = 0; - char buf[2] = {0}; - if ((rval = recv(buf, 1, 0x0)) < 1) - { - if (rval == 0) - { - if (gOptions.microServerDebug()) - ELOG (logMsgPrefix + "Remote socket closed while waiting for data.", LOGNAME, sid); - throwEx((utf8)""); - } - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - if (gOptions.microServerDebug()) - ELOG (logMsgPrefix + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, sid); - throwEx((utf8)""); - } - - // if we've read something then it's likely to be from a POST response - if (lineBuffer.empty() == false) - { - ret = false; - if (count) break; - } - - // try again but wait a bit - // so we don't overload it. - m_result.schedule(30); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return false; - } - ++count; - - lineBuffer.insert (lineBuffer.end(), buf, buf + rval); - - const int lineSize = (int)lineBuffer.size(); - if (lineSize == maxLineLength) break; - if (lineSize > maxHeaderLineSize) - { - ELOG (logMsgPrefix + "Protocol header line is too large - exceeds " - + tos(maxHeaderLineSize) + " bytes", LOGNAME, sid); - throwEx ((utf8)""); - } - if ((lineSize > 0) && lineBuffer [lineSize - 1] == '\n') - { - break; - } - } - m_result.run(); - m_lastActivityTime = ::time(NULL); - return ret; -} - -// send a hunk of data out a socket - returns true if send is complete, -// outBuffer and outBufferSize should be initially set to point to the -// data and the size of the data - these values are moved and updated. -const bool runnable::sendDataBuffer(const size_t sid, const uniString::utf8::value_type *&outBuffer, - int &outBufferSize, const uniString::utf8 &logMsgPrefix) throw(std::exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(logMsgPrefix + __FUNCTION__ + " " + tos(outBufferSize)); -#endif - - if (outBufferSize > 0) // done - { - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout(cur_time, m_lastActivityTime, - (logMsgPrefix + "Timeout waiting to send data"), - gOptions.microServerDebug(), sid); - - int rval = send ((const char *)outBuffer, outBufferSize, 0); - if (rval == 0) - { - throwEx((gOptions.microServerDebug() ? (logMsgPrefix + - "Remote socket closed while sending data") : - (uniString::utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx((gOptions.microServerDebug() ? ((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? (uniString::utf8)"" : logMsgPrefix + - "Socket error while waiting to send data. " + - socketErrString(rval))) : (uniString::utf8)"")); - } - - // try again but wait a bit - // so we don't overload it. - m_result.schedule(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return false; - } - - // move pointers - outBufferSize -= rval; - outBuffer += rval; - - // update time - m_lastActivityTime = ::time(NULL); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - - if (outBufferSize == 0) // done - { - m_result.schedule(); - return true; - } - m_result.schedule (160); - return false; - } - - m_result.write(); - m_result.schedule(); - m_result.timeoutSID(sid); - return true; -} - - -runnable::runnable (runnable &r) throw() -{ - m_socket = r.m_socket; - m_ssl = r.m_ssl; - m_lastActivityTime = ::time (NULL); - // the following are handed off to this sub-protocol, so make sure they cannot affect them - r.m_socket = socketOps::cINVALID_SOCKET; - r.m_ssl = NULL; -} - - -ssize_t runnable::recv (void *buf, size_t len, int flags) -{ - if (m_ssl) - { - ssize_t bytes = SSL_read (m_ssl, buf, len); - int code = SSL_get_error (m_ssl, bytes); - // char err[128]; - - switch (code) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: - break; - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - return -1; - default: - bytes = 0; - } - return bytes; - } - return (ssize_t)::recv (m_socket, (char*)buf, len, flags); -} - - -ssize_t runnable::send(const void *buf, size_t len, int flags) -{ - if (m_ssl) - { - ssize_t bytes = SSL_write (m_ssl, buf, len); - int code = SSL_get_error (m_ssl, bytes); - // char err[128]; - - switch (code) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: - break; - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - return -1; - default: - return -1; - } - return bytes; - } - return (ssize_t)::send(m_socket, (char*)buf, len, flags); -} - -// This pick the dump time for sources, as there is no general class for that yet, unlike listeners -int runnable::detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const utf8 &msg) throw(runtime_error) -{ - const int autoDumpTime = gOptions.stream_autoDumpSourceTime(streamID); - - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - WLOG (msg, LOGNAME, streamID); - throwEx(""); - } - return autoDumpTime; -} - - -unsigned long threadedRunner::SSL_idFunction (void) -{ - return threadedRunner::getCurrentThreadID(); -} - -void threadedRunner::SSL_lockingFunction (int mode, int n, const char * /*file*/, int /*line*/) -{ - if (mode & CRYPTO_LOCK) - m_sslMutexes[n].lock(); - else - m_sslMutexes[n].unlock(); -} - - -void threadedRunner::SSL_shutdown () -{ -#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 - CRYPTO_set_id_callback (NULL); -#endif - CRYPTO_set_locking_callback (NULL); - if (m_sslCtx) - { - ::SSL_CTX_free (m_sslCtx); - m_sslCtx = NULL; - } - if (m_sslMutexes) - delete [] m_sslMutexes; - m_sslMutexes = NULL; -} - -void threadedRunner::SSL_init () -{ - SSL_load_error_strings(); - SSL_library_init (); - utf8 cert_file = gOptions.sslCertificateFile(); - utf8 key_file = gOptions.sslCertificateKeyFile(); - - do { - if (cert_file == "") break; - - CRYPTO_set_id_callback (&threadedRunner::SSL_idFunction); -#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 - CRYPTO_set_locking_callback (&threadedRunner::SSL_lockingFunction); -#endif - - m_sslMutexes = new AOL_namespace::mutex [CRYPTO_num_locks()]; - if (m_sslMutexes == NULL) - break; - - m_sslCtx = ::SSL_CTX_new (::SSLv23_server_method()); - - long ssl_opts = ::SSL_CTX_get_options (m_sslCtx); - ::SSL_CTX_set_options (m_sslCtx, ssl_opts|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_COMPRESSION); - - if (::SSL_CTX_use_certificate_chain_file (m_sslCtx, (char*)cert_file.c_str()) <= 0) - { - WLOG ("[MAIN] Invalid certificate file " + cert_file); - break; - } - - utf8 &pkfile = key_file.empty() ? cert_file : key_file; - if (::SSL_CTX_use_PrivateKey_file (m_sslCtx, (char*)pkfile.c_str(), SSL_FILETYPE_PEM) <= 0) - { - WLOG ("[MAIN] Invalid private key file " + pkfile); - break; - } - if (! SSL_CTX_check_private_key (m_sslCtx)) - { - WLOG ("[MAIN] Invalid, private key does not match public key, " + pkfile); - break; - } - ILOG ("[MAIN] SSL keys installed"); - return; - - } while (0); - if (m_sslCtx) - { - WLOG ("[MAIN] failed to set up SSL, " + utf8(::ERR_reason_error_string (::ERR_peek_last_error()))); - ::SSL_CTX_free (m_sslCtx); - m_sslCtx = NULL; - } - CRYPTO_set_id_callback (NULL); - CRYPTO_set_locking_callback (NULL); - if (m_sslMutexes) - delete [] m_sslMutexes; - m_sslMutexes = NULL; -} diff --git a/Src/Plugins/DSP/sc_serv3/threadedRunner.h b/Src/Plugins/DSP/sc_serv3/threadedRunner.h deleted file mode 100644 index 155b8983..00000000 --- a/Src/Plugins/DSP/sc_serv3/threadedRunner.h +++ /dev/null @@ -1,428 +0,0 @@ -#pragma once -#ifndef threadedRunner_H_ -#define threadedRunner_H_ - -#include "openssl/ssl.h" -#include "openssl/err.h" -#include "threading/thread.h" -#include "webNet/socketOps.h" -#include "unicode/uniString.h" -#include "stl/stringUtils.h" -#include -#include -#include -#include -#include "global.h" - -#ifdef _MSC_VER -#define ssize_t int -#endif -/* - -threadedRunner - (and everything that is related to it). - -Based my work on the webNet module and the microServer class (in sc_trans), it -seems to me that there is a generic model that underlies all of this. At the top level -is a thread which manages a pool of objects (runnables). These runnables offer up -sets of sockets which the threadRunner incorporates into a select() call. When the select -exists, the runnables associated with the sockets are called. - -This makes good sense for a server like senario, where you have connections that must -wait for read/write ability on a socket. This can, however, be extended to any object -that must wait for something. Using a pipe, you can simulate wait events that can also -offer up a socket like object. You can then create an object that fits this model that -is waiting for messages or some other type of signal. - -*/ - -// class that has a mutex's interface but does nothing -class nullLock { public: static void lock() throw(){} static void unlock() throw(){}}; - -// implements a signal based on a pipe. Access to set/clear should be locked, -// but since this class is usually included in another class that already has a lock, we -// make the lock optional by templatizing it. Pass AOL_namespace::mutex as the LOCKABLE parameter -// if you want locking, otherwise pass nullLock. -#pragma pack(push, 1) -template -class pipeDrivenSignal -{ -private: - int m_signalPipe[3]; - LOCKABLE m_lock; - -public: - pipeDrivenSignal() throw(std::exception) - { - m_signalPipe[0] = -1; - m_signalPipe[1] = -1; - m_signalPipe[2] = 0; - if (pgpipe(m_signalPipe)) - { - if (socketOps::errCode()) - { - #ifdef _WIN32 - throw std::runtime_error("[MICROSERVER] Could not create signal pipe " - "[Too many file handles have been opened, " - "code: " + stringUtil::tos(socketOps::errCode()) + - " - reason: " + socketOps::errMsg() + "]"); - #else - throw std::runtime_error("[MICROSERVER] Could not create signal pipe " - "[Increase the open files (ulimit -n) limit, " - "code: " + stringUtil::tos(socketOps::errCode()) + - " - reason: " + socketOps::errMsg() + "]"); - #endif - } - else - { - throw std::runtime_error(""); - } - } - socketOps::setNonblock (m_signalPipe[0], true); - socketOps::setNonblock (m_signalPipe[1], true); - } - - ~pipeDrivenSignal() throw() - { - if (m_signalPipe[0] != -1) - { - pipeclose(m_signalPipe[0]); - m_signalPipe[0] = -1; - } - - if (m_signalPipe[1] != -1) - { - pipeclose(m_signalPipe[1]); - m_signalPipe[1] = -1; - } - - m_signalPipe[2] = 0; - } - - // set the signal - void set() throw() - { - if (m_signalPipe[1] != -1) - { - static char buf[2] = {19, 64}; // any data will do - pipewrite(m_signalPipe[1], buf, 1); - } - } - - // clear the signal - void clear() throw() - { - if (m_signalPipe[0] != -1) - { - // clear pipe - char buf[35]; - piperead(m_signalPipe[0], buf, sizeof(buf)); - } - } - - // return file descriptor to test with select(). This is a read descriptor - const int test() const throw() - { - return m_signalPipe[0]; - } -}; -#pragma pack(pop) - -// make standard string for socket error -extern std::string socketErrString(int err) throw(); - -// abstract base for classes than can be run by the threadRunner class -class runnable -{ - friend class threadedRunner; -public: - #pragma pack(push, 1) - struct timeSliceResult - { - bool m_readSet; // read socket for poll(..) / select(..) call - bool m_writeSet; // write socket for poll(..) / select(..) call - bool m_done; // runnable is done and can be dispose - bool m_runImmediately; // must be re-run immediately - int m_timeout; // must be run after an interval of time regardless. if zero, then no timeout - // if not set (-1) then will pick an appropriate timeout to keep it ticking over - __uint64 m_scheduleTime; // time from which we're going to allow this to run. if zero thnn no scheduling - __uint64 m_currentTime; // time at which the runnable is being tried - - socketOps::tSOCKET m_customSocket; // used for providing a custom case if needed - - timeSliceResult() throw() : m_readSet(false), m_writeSet(false), m_done(false), - m_runImmediately(false), m_timeout(-1), - m_scheduleTime(0), m_currentTime(0), - m_customSocket(socketOps::cINVALID_SOCKET) {} - - ~timeSliceResult() throw() - { - reset(0); - } - - void reset(__uint64 current_ms) throw() - { - m_customSocket = socketOps::cINVALID_SOCKET; - m_readSet = false; - m_writeSet = false; - m_done = false; - m_runImmediately = false; - m_timeout = -1; - m_scheduleTime = 0; - m_currentTime = current_ms; - } - - void done() throw() - { - m_done = true; - } - - void run() throw() - { - m_runImmediately = true; - } - - void read(socketOps::tSOCKET customSocket = socketOps::cINVALID_SOCKET) throw() - { - m_readSet = true; - m_customSocket = customSocket; - } - - void write() throw() - { - m_writeSet = true; - } - - const int timeout(int sec, int ms_sec = 0) - { - m_timeout = (sec > 0 ? (sec * 1000) : 0) + - (ms_sec > 0 ? ms_sec : 0); - return sec; - } - - const int timeoutSID(const size_t sid = 1) - { - int sec = gOptions.getAutoDumpTime(sid); - m_timeout = (sec > 0 ? (sec * 1000) : 0); - return sec; - } - - const __uint64 schedule(int ms_sec = 10) - { - // get the current time and schedule on from - // there so the usage just adds the duration - return (m_scheduleTime = time_now_ms() + (ms_sec > 0 ? ms_sec : 0)); - } - }; - #pragma pack(pop) - - virtual void timeSlice() throw(std::exception) = 0; // you override this to take action - virtual uniString::utf8 name() const throw() = 0; // object name for diagnostics - - explicit runnable (runnable &r) throw(); - - explicit runnable(socketOps::tSOCKET socket = socketOps::cINVALID_SOCKET) throw() - : m_ssl(NULL), m_socket(socket), m_lastActivityTime(::time(NULL)) {} - - virtual ~runnable() throw() { if (m_ssl) { SSL_shutdown (m_ssl); SSL_free (m_ssl); } } - - // utility to read an HTTP style header line off a socket. Used in most protocols - // returns zero if lineBuffer is ready, otherwise it returns a timeout in seconds that - // should be used to wait in a select - const bool getHTTPStyleHeaderLine(const size_t sid, uniString::utf8 &lineBuffer, - const uniString::utf8 &logMsgPrefix, int maxLineLength = 0) throw(std::exception); - - // send a hunk of data out a socket - returns true if send is complete, - // outBuffer and outBufferSize should be initially set to point to the - // data and the size of the data - these values are moved and updated. - const bool sendDataBuffer(const size_t sid, const uniString::utf8::value_type *&outBuffer, - int &outBufferSize, const uniString::utf8 &logMsgPrefix) throw(std::exception); - - ssize_t send (const void *buf, size_t len, int flags = 0); - ssize_t recv (void *buf, size_t len, int flags = 0); - - virtual int detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error); - -protected: - timeSliceResult m_result; // for tracking response - SSL *m_ssl; // SSL handler - socketOps::tSOCKET m_socket; // we'll need this for read / write handling so - // is easier to hold a copy of it here than do - // it at the higher class levels - time_t m_lastActivityTime; // for tracking timeouts -}; - -#pragma pack(push, 1) -class threadedRunner : public Vthread -{ -///// static for managing collection of these guys -private: - pipeDrivenSignal m_signal; // we must add/remove runnables, or stop, or some other sort of message - bool m_stop; // if true then this thread must shut down - const short m_threadNumber; // for diagnostics only - - // list of runnables to be added or removed from this thread controller - std::set m_runnablesToAdd; - std::set m_runnablesToRemove; - std::set m_runList; // things to run - - AOL_namespace::mutex m_lock; - - friend class microConnection; - - static SSL_CTX *m_sslCtx; - static AOL_namespace::mutex *m_sslMutexes; - static unsigned long SSL_idFunction (void); - static void SSL_lockingFunction (int mode, int n, const char *file, int line); - - const unsigned operator()() throw(); - - // add new runnables to the thread. returns false if the runnable could not be queued to this thread object - // False usually means that the thread is going away and can no longer accept runnables - const bool addRunnable(runnable*) throw(); - - // these runnables will be removed at the next opportunity (does not happen immediately) - // false means the runnable was not associated with that thread - const bool removeRunnable(runnable*) throw(); - - void enumRunnables(map& runners) throw(); - - void wakeupRunnable() throw(); - -public: - threadedRunner() throw(); - virtual ~threadedRunner() throw(); - - static bool scheduleRunnable(runnable *r) throw(); - - static uniString::utf8 getRunnabledetails() throw(); - - static void wakeup() throw(); - - void stop() throw(); - const size_t sizeOfRunList() throw(); - const uniString::utf8 threadNumber() const throw() { return stringUtil::tos(m_threadNumber); } // for diagnostics only - - static bool isSSLCapable() { return m_sslCtx ? true : false; } - static void SSL_init (); - static void SSL_shutdown (); -}; -#pragma pack(pop) - -// microserver is a runnable object that implements basic server functionality. -// it listens on a socket. When a connection occurs it creates a microConnection -// object to handle it -class microServer: public runnable -{ -public: - // what stuff we will accept - typedef u_short AllowableProtocols_t; - #define P_WEB 1 - #define P_SHOUTCAST1CLIENT 2 - #define P_SHOUTCAST2CLIENT 4 - #define P_SHOUTCAST1SOURCE 8 - #define P_SHOUTCAST2SOURCE 16 - #define P_FLASHPOLICYFILE 64 - #define P_WEB_SETUP 128 - - // what stuff we will listen for - typedef enum { - L_MISC = 0, - L_CLIENT = 1, - L_SOURCE = 2, - L_FLASH = 4, - L_SOURCE2 = 8, - L_CLIENT_ALT = 16 - } ListenTypes_t; - -private: - AllowableProtocols_t m_protocols; - - void bindMessage(const ListenTypes_t types, const u_short listenPort) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "microServer"; } - -public: - microServer(const std::string &listenAddr, const u_short listenPort, const AllowableProtocols_t protocols, const ListenTypes_t types) throw(std::exception); - void updateProtocols(AllowableProtocols_t protocols, ListenTypes_t types, const u_short listenPort) throw(); - virtual ~microServer() throw(); -}; - -// this class receives a connection and starts processing it until it knows -// what to do with it. When it has figured that out, it creates a protocol object -// and forwards all commands to that object from now on. -class microConnection: public runnable -{ - friend class protocol_HTTPStyle; - friend class protocol_uvox2Source; - friend class protocol_HTTPSource; - friend class protocol_shoutcastSource; - -private: - std::string m_srcHostName; - std::string m_srcAddress; - uniString::utf8 m_lineBuffer; - const u_short m_srcPort; - const microServer::AllowableProtocols_t m_protocols; // what protocols I accept - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "microConnection"; } - -public: - microConnection(const socketOps::tSOCKET s, const std::string &hostName, - const std::string &addr, const u_short port, - const microServer::AllowableProtocols_t protocols) throw(); - virtual ~microConnection() throw(); -}; - -///////////// Utilities that are used often in related components ///////////////////////// - -// common base used for kicking clients and general bookkeeping -class clientProtocol -{ -protected: - clientProtocol() throw() {} - virtual ~clientProtocol() throw(){} - -public: - virtual void kickNextRound() throw() {} - virtual void setGroup(int /*group*/) throw() {} -}; - -// make standard string for loggin address -extern uniString::utf8 addrLogString(const uniString::utf8 &addr, const u_short port, const uniString::utf8 &xff = "") throw(); -// make standard string for logging src address -extern uniString::utf8 srcAddrLogString(const uniString::utf8 &addr, const u_short port, const size_t sid = 0) throw(); -// make standard string for loggin dst address -extern uniString::utf8 dstAddrLogString(const uniString::utf8 &addr, const u_short port, const uniString::utf8 &xff = "", const size_t sid = 0) throw(); - -// get value from map. Return default if doesn't exist -template inline T stringToType(const uniString::utf8 &s) throw(); -template<> inline uniString::utf8 stringToType(const uniString::utf8 &s) throw() { return s; } -template<> inline int stringToType(const uniString::utf8 &s) throw() { return atoi((const char *)s.c_str()); } -template<> inline u_short stringToType(const uniString::utf8 &s) throw() { return (u_short)atoi((const char *)s.c_str()); } -template<> inline std::string stringToType(const uniString::utf8 &s) throw() { return s.hideAsString(); } -template<> inline bool stringToType(const uniString::utf8 &s) throw() -{ - if (s.empty()) - { - return false; - } - uniString::utf8::value_type v = *(s.begin()); - if (v == 'f' || v == 'F' || v == 'n' || v == 'N' || v == '0') - { - return false; - } - return true; -} - -template -inline T mapGet(const httpHeaderMap_t &m, const uniString::utf8 &key, const T deflt) throw() -{ - httpHeaderMap_t::const_iterator i = m.find(key); - return (i == m.end() ? deflt : stringToType((*i).second)); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/updater.cpp b/Src/Plugins/DSP/sc_serv3/updater.cpp deleted file mode 100644 index 3833f88e..00000000 --- a/Src/Plugins/DSP/sc_serv3/updater.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "updater.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "aolxml/aolxml.h" -#include "bandwidth.h" -#include "services/stdServiceImpl.h" -#include "./versions.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_UpdaterLock; -static updater *g_Updater = 0; - -#define DEBUG_LOG(...) do { if (gOptions.yp2Debug()) DLOG(__VA_ARGS__); } while (0) - -/////////////////////////////////////////////////////////////////////////////////////////// - -void updater::updaterBandWidthSent(webClient::request r) throw() -{ - // this effectively works out the size in the same manner - // as webclient::toRequest(..) does to build the request. - size_t total = r.m_content.size() + r.m_contentType.size() + - // 'POST' or 'GET' with '?' on the front - (r.m_method == webClient::request::POST ? 4 : 3) + - 64 + r.m_addr.size() + g_userAgent.size() + - (!r.m_content.empty() ? r.m_content.size() : 0); - - for (httpHeaderMap_t::const_iterator i = r.m_queryVariables.begin(); i != r.m_queryVariables.end(); ++i) - { - if (i != r.m_queryVariables.begin()) - { - ++total; - } - total += urlUtils::escapeURI_RFC3986((*i).first).size(); - if (!(*i).second.empty()) - { - total += 1 + urlUtils::escapeURI_RFC3986((*i).second).size(); - } - } - - if (!r.m_XFF.empty()) - { - total += 18 + r.m_XFF.size(); - } - - if ((r.m_method == webClient::request::POST) && r.m_content.empty()) - { - total += 48; - } - else if (!r.m_contentType.empty()) - { - total += 15 + r.m_contentType.size(); - } - - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, total); -} - -void updater::updaterBandWidthReceived(const response r) throw() -{ - size_t total = r.m_body.size(); - - for (httpHeaderMap_t::const_iterator i = r.m_headers.begin(); i != r.m_headers.end(); ++i) - { - total += (*i).first.size() + 1 + (*i).second.size() + eol().size(); - } - - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, total); -} - -size_t updater::requestsInQueue() throw() -{ - stackLock sml(g_UpdaterLock); - - return (g_Updater ? g_Updater->queueEntries() : 0); -} - -updater::updater() throw() : webClient(UPDATER_LOGNAME) -{ - stackLock sml(g_UpdaterLock); - - g_Updater = this; - m_running = false; -} - -updater::~updater() throw() -{ - stackLock sml(g_UpdaterLock); - - g_Updater = 0; -} - -/////////// response handling ////////////// -// handle response. retry_exceptions do just that. otherwise retry occurs in yptimeout seconds - -void updater::response_updater(const request & /*q*/, const response &r) throw(exception) -{ - FILE *f = uniFile::fopen(g_Updater->m_verInfo.fn, "wb"); - if (f) - { - if (fwrite(&(r.m_body[0]),1,r.m_body.size(),f) == r.m_body.size()) - { - ILOG(UPDATER_LOGNAME "Downloaded update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.downloaded = 1; - g_Updater->m_verInfo.needsUpdating = 0; - } - else - { - ILOG(UPDATER_LOGNAME "Error saving the update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - ::fclose(f); - } - else - { - FILE *f = uniFile::fopen(g_Updater->m_verInfo.fn_alt, "wb"); - if (f) - { - if (fwrite(&(r.m_body[0]),1,r.m_body.size(),f) == r.m_body.size()) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - ILOG(UPDATER_LOGNAME "Downloaded update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.downloaded = 1; - g_Updater->m_verInfo.needsUpdating = 0; - } - else - { - ILOG(UPDATER_LOGNAME "Error saving the update to `" + g_Updater->m_verInfo.fn_alt + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.fn_alt.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - ::fclose(f); - } - else - { - ELOG(UPDATER_LOGNAME "Error creating file: " + errMessage()); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.fn_alt.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - } -} - -void updater::gotResponse(const request &q, const response &r) throw(exception) -{ - stackLock sml(m_serverMapLock); - - DEBUG_LOG(UPDATER_LOGNAME + string(__FUNCTION__) + eol() + - "Response body=[" + eol() + utf8(r.m_body.begin(),r.m_body.end()) + "]" + - eol() + "Response code=[" + tos(r.m_resultCode) + "]"); - - updaterBandWidthReceived(r); - response_updater(q, r); - m_running = false; -} - -void updater::gotFailure(const request &/*q*/) throw(std::exception) -{ - stackLock sml(g_UpdaterLock); - - DEBUG_LOG(UPDATER_LOGNAME + string(__FUNCTION__)); - m_running = false; -} - -void updater::updateVersion() throw() -{ - if (g_Updater) - { - // make sure we've got it and also an url - if (g_Updater->m_verInfo.needsUpdating && !g_Updater->m_verInfo.url.empty() && - !g_Updater->m_verInfo.fn.empty() && !g_Updater->m_verInfo.fn_alt.empty()) - { - try - { - g_Updater->pvt_downloadUpdate(); - } - catch(...) - { - } - } - } -} - -void updater::pvt_downloadUpdate() throw(exception) -{ - if (!m_running) - { - m_running = true; - ILOG(UPDATER_LOGNAME "Preparing to download update package..."); - - // build request - webClient::request r; - r.m_method = webClient::request::GET; - - config::streamConfig::urlObj downloadUrl(g_Updater->m_verInfo.url.hideAsString()); - - r.m_addr = downloadUrl.server(); - r.m_port = downloadUrl.port(); - r.m_path = downloadUrl.path(); - r.m_nonBlocking = 1; - - updaterBandWidthSent(r); - queueRequest(r); - } -} - -bool updater::getNewVersion(verInfo &ver) throw() -{ - stackLock sml(g_UpdaterLock); - - if (g_Updater) - { - // double-check that we've got things correctly - // before we provide the current update status. - bool ret = g_Updater->setNewVersion(g_Updater->m_verInfo, true); - ver = g_Updater->m_verInfo; - return ret; - } - return false; -} - -bool updater::setNewVersion(verInfo &ver, bool no_lock) throw() -{ - if (!no_lock) - { - stackLock sml(g_UpdaterLock); - } - - if (g_Updater) - { - if (g_Updater->m_verInfo.ver != ver.ver || - g_Updater->m_verInfo.url != ver.url || - g_Updater->m_verInfo.log != ver.log) - { - g_Updater->m_verInfo = ver; - - if (!g_Updater->m_verInfo.ver.empty()) - { - const std::vector newVerStr = tokenizer(g_Updater->m_verInfo.ver,'.'), - curVerStr = tokenizer(gOptions.getVersionBuildStrings(),'.'); - int newVer[] = {newVerStr[0].toInt(), newVerStr[1].toInt(), newVerStr[2].toInt(), newVerStr[3].toInt()}, - curVer[] = {curVerStr[0].toInt(), curVerStr[1].toInt(), curVerStr[2].toInt(), curVerStr[3].toInt()}; - - g_Updater->m_verInfo.needsUpdating = 0; - - // look to compare from major to minor parts of the version strings - // 2.x.x.x vs 3.x.x.x - if (newVer[0] > curVer[0]) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.x.x vs 2.2.x.x - else if ((newVer[0] == curVer[0]) && (newVer[1] > curVer[1])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.0.x vs 2.0.1.x - else if ((newVer[0] == curVer[0]) && (newVer[1] == curVer[1]) && (newVer[2] > curVer[2])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.0.29 vs 2.0.0.30 - else if ((newVer[0] == curVer[0]) && (newVer[1] == curVer[1]) && (newVer[2] == curVer[2]) && (newVer[3] > curVer[3])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - - if (g_Updater->m_verInfo.needsUpdating) - { - #ifdef _WIN32 - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"; - wchar_t m_fileName[MAX_PATH] = {0}; - uniString::utf32 u32("%temp%\\sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"); - std::wstring u16; - u32.toUtf16(u16); - ExpandEnvironmentStringsW(u16.c_str(), m_fileName, MAX_PATH); - g_Updater->m_verInfo.fn_alt = utf32(m_fileName).toUtf8(); - #else - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - g_Updater->m_verInfo.fn_alt = "/tmp/sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - #endif - - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn); - // if the main file cannot be found, look for the alternate file - if (!g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn_alt); - if (g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - } - } - } - - ULOG(string(YP2_LOGNAME) + "A new DNAS version is now available: " + g_Updater->m_verInfo.ver); - ULOG(string(YP2_LOGNAME) + "The suggested download for your setup is: " + g_Updater->m_verInfo.url); - ULOG(string(YP2_LOGNAME) + "See " + g_Updater->m_verInfo.log + " for more information about this update and alternative download links"); - - if (!g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty() && !g_Updater->m_verInfo.fn_alt.empty()) - { - g_Updater->updateVersion(); - } - } - } - else - { - std::vector newVerStr = tokenizer(g_Updater->m_verInfo.ver,'.'); - if (newVerStr.size() == 4) - { - int newVer[] = {newVerStr[0].toInt(), newVerStr[1].toInt(), newVerStr[2].toInt(), newVerStr[3].toInt()}; - - #ifdef _WIN32 - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"; - wchar_t m_fileName[MAX_PATH] = {0}; - uniString::utf32 u32("%temp%\\sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"); - std::wstring u16; - u32.toUtf16(u16); - ExpandEnvironmentStringsW(u16.c_str(), m_fileName, MAX_PATH); - g_Updater->m_verInfo.fn_alt = utf32(m_fileName).toUtf8(); - #else - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - g_Updater->m_verInfo.fn_alt = "/tmp/sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - #endif - - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn); - // if the main file cannot be found, look for the alternate file - if (!g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn_alt); - if (g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - } - } - g_Updater->m_verInfo.needsUpdating = 1; - - if (!g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty()) - { - g_Updater->updateVersion(); - } - } - } - - return (!g_Updater->m_verInfo.ver.empty() && (g_Updater->m_verInfo.needsUpdating || (g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty()))); - } - return false; -} diff --git a/Src/Plugins/DSP/sc_serv3/updater.h b/Src/Plugins/DSP/sc_serv3/updater.h deleted file mode 100644 index 26e53502..00000000 --- a/Src/Plugins/DSP/sc_serv3/updater.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once -#ifndef download_H_ -#define download_H_ - -#include "webClient.h" -#include "webNet/urlUtils.h" -#include "yp2.h" - -#define UPDATER_LOGNAME "[UPDATER] " -class updater: public webClient -{ -public: - struct verInfo - { - int needsUpdating; - int downloaded; - uniString::utf8 ver; - uniString::utf8 url; - uniString::utf8 log; - uniString::utf8 info; - uniString::utf8 message; - uniString::utf8 slimmsg; - uniFile::filenameType fn; - uniFile::filenameType fn_alt; - verInfo() : needsUpdating(0), downloaded(0) {} - }; - - updater() throw(); - ~updater() throw(); - - // used in main during shutdown to wait for request queue to clear out - static size_t requestsInQueue() throw(); - - static bool getNewVersion(verInfo &ver) throw(); - static bool setNewVersion(verInfo &ver, bool no_lock = false) throw(); - -private: - AOL_namespace::mutex m_serverMapLock; - - verInfo m_verInfo; - bool m_running; - - virtual uniString::utf8 name() const throw() { return "updater"; } - - virtual void gotResponse(const request &q, const response &r) throw(std::exception); - virtual void gotFailure(const request &q) throw(std::exception); - - static void response_updater(const request &q,const response &r) throw(std::exception); - void failure_updater(const request &q) throw(); - - static void updaterBandWidthSent(webClient::request r) throw(); - static void updaterBandWidthReceived(const response r) throw(); - - void pvt_downloadUpdate() throw(std::exception); - static void updateVersion() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp b/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp deleted file mode 100644 index a24df4f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#include -#endif - -#include -#include -#include "uvox2Common.h" -#include "stl/stringUtils.h" -#include -#include -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -// from wikipedia. Slightly modified to be 32/64 bit clean -static void XTEA_encipher(__uint32* v, __uint32* k, unsigned int num_rounds = 32) -{ - __uint32 v0 = v[0], v1 = v[1], sum = 0; - for (unsigned int i = 0; i < num_rounds; i++) - { - v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); - sum += 0x9E3779B9; - v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); - } - v[0] = v0; - v[1] = v1; -} - -static void XTEA_decipher(__uint32* v, __uint32* k, unsigned int num_rounds = 32) -{ - __uint32 v0 = v[0], v1 = v[1], sum = 0x9E3779B9 * num_rounds; - for (unsigned int i = 0; i < num_rounds; i++) - { - v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); - sum -= 0x9E3779B9; - v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); - } - v[0] = v0; - v[1] = v1; -} -///// - -static __uint32 fourCharsToLong(__uint8 *s) -{ - __uint32 l = 0; - l |= s[0]; l <<= 8; - l |= s[1]; l <<= 8; - l |= s[2]; l <<= 8; - l |= s[3]; - return l; -} - -static void longToFourChars(__uint32 l, __uint8 *r) -{ - r[3] = l & 0xff; l >>= 8; - r[2] = l & 0xff; l >>= 8; - r[1] = l & 0xff; l >>= 8; - r[0] = l & 0xff; l >>= 8; -} - -#define XTEA_KEY_PAD 0 -#define XTEA_DATA_PAD 0 - -string XTEA_encipher(const __uint8* c_data, const size_t c_data_cnt, - const __uint8* c_key, const size_t c_key_cnt) throw() -{ - vector<__uint8> key(c_key, c_key + c_key_cnt); - vector<__uint8> data(c_data, c_data + c_data_cnt); - - // key is always 128 bits - while (key.size() < 16) - { - key.push_back(XTEA_KEY_PAD); // pad key with zero - } - __uint32 k[4] = {fourCharsToLong(&key[0]), fourCharsToLong(&key[4]), - fourCharsToLong(&key[8]), fourCharsToLong(&key[12])}; - - // data is multiple of 64 bits - size_t siz = data.size(); - while (siz % 8) - { - ++siz; - data.push_back(XTEA_DATA_PAD); - } // pad data with zero - - ostringstream oss; - for (size_t x = 0; x < siz; x += 8) - { - __uint32 v[2] = {fourCharsToLong(&data[x]), fourCharsToLong(&data[x+4])}; - XTEA_encipher(v, k); - oss << setw(8) << setfill('0') << hex << v[0]; - oss << setw(8) << setfill('0') << hex << v[1]; - // hex values. uvox uses colon as seperator so - // we can't use chars for fear of collision - } - - return oss.str(); -} - -utf8 XTEA_decipher(const __uint8* c_data, const size_t c_data_cnt, - const __uint8* c_key, const size_t c_key_cnt) throw() -{ - utf8 result; - - vector<__uint8> key(c_key, c_key + c_key_cnt); - vector<__uint8> data(c_data, c_data + c_data_cnt); - - // key is always 128 bits - while (key.size() < 16) - { - key.push_back(XTEA_KEY_PAD); // pad key with zero - } - __uint32 k[4] = {fourCharsToLong(&key[0]), fourCharsToLong(&key[4]), - fourCharsToLong(&key[8]), fourCharsToLong(&key[12])}; - - // data is multiple of 16 hex digits - size_t siz = data.size(); - //assert(!(siz % 16)); // should never happen if data is good - while (siz % 16) - { - ++siz; - data.push_back('0'); - } // pad data with zero - - for (size_t x = 0; x < siz; x += 16) - { - __uint32 v[2]; - sscanf((const char *)&data[x], "%8x", &v[0]); - sscanf((const char *)&data[x+8], "%8x", &v[1]); - - XTEA_decipher(v, k); - __uint8 ur[5] = {0}; - longToFourChars(v[0], ur); - result += ur; - longToFourChars(v[1], ur); - result += ur; - } - return result; -} - -// take data and create a uvox message appended to "v". Limit by MAX_PAYLOAD_SIZE. -// return amount of data UNconsumed -int formMessage(const __uint8 *data, const int len, const int type, vector<__uint8> &v) throw(runtime_error) -{ - if (len > MAX_PAYLOAD_SIZE) - { - throw runtime_error(string(__FUNCTION__) + " message payload " + tos(len) + " is too big"); - } - - const int amt = min(len, MAX_PAYLOAD_SIZE); - uv2xHdr hdr2 = {UVOX2_SYNC_BYTE, 0, (u_short)htons(type), (u_short)htons((u_short)amt)}; - v.insert(v.end(), (const __uint8 *)(&hdr2), ((const __uint8 *)(&hdr2)) + sizeof(hdr2)); - v.insert(v.end(), data, data + amt); - v.push_back(UV2X_EOM); - return (len - amt); -} - -// similar to above, except it writes data into a buffer pointed to by v -int formMessage(const __uint8 *data, const int len, const int type, __uint8 *v) throw(runtime_error) -{ - if (len > MAX_PAYLOAD_SIZE) - { - throw runtime_error(string(__FUNCTION__) + " message payload " + tos(len) + " is too big"); - } - - const int amt = min(len, MAX_PAYLOAD_SIZE); - uv2xHdr hdr2 = {UVOX2_SYNC_BYTE, 0, (u_short)htons(type), (u_short)htons((u_short)amt)}; - memcpy(v, &hdr2, sizeof(hdr2)); - v += sizeof(hdr2); - memcpy(v, data, amt); - v += amt; - v[0] = UV2X_EOM; - return (len - amt); -} - -// load vector v up with metadata packets. -void createMetadataPackets(const __uint8 *data, const int _len, const int type, - vector<__uint8> &v, const __uint16 metadataID) throw(runtime_error) -{ - const int amtPerPacket = (MAX_PAYLOAD_SIZE - UV2X_META_HDR_SIZE); - - // subdivide and load - __uint16 total_segments = (__uint16)(_len / amtPerPacket) + ((_len % amtPerPacket) ? 1 : 0), segment = 1; - int len = _len; - while (len > 0) - { - uv2xMetadataHdr h = {(u_short)htons(metadataID), (u_short)htons(total_segments), (u_short)htons(segment)}; - const int amt = min(len, amtPerPacket); - vector<__uint8> m((const __uint8 *)&h, ((const __uint8 *)&h) + sizeof(h)); - m.insert(m.end(), data, data + amt); - formMessage(&m[0], (int)m.size(), type, v); - data += amt; - len -= amt; - ++segment; - } -} diff --git a/Src/Plugins/DSP/sc_serv3/uvox2Common.h b/Src/Plugins/DSP/sc_serv3/uvox2Common.h deleted file mode 100644 index 648a368e..00000000 --- a/Src/Plugins/DSP/sc_serv3/uvox2Common.h +++ /dev/null @@ -1,116 +0,0 @@ -#pragma once -#ifndef uvox2Common_H_ -#define uvox2Common_H_ - -#include "unicode/uniString.h" - -std::string XTEA_encipher(const __uint8* c_data, const size_t c_data_cnt, const __uint8* c_key, const size_t c_key_cnt) throw(); -uniString::utf8 XTEA_decipher(const __uint8* c_data, const size_t c_data_cnt, const __uint8* c_key, const size_t c_key_cnt) throw(); - -#pragma pack(push,1) - -struct uv2xHdr -{ // uvox2 message - __uint8 sync; - __uint8 qos; - __uint16 msgType; - __uint16 msgLen; -}; - -struct uv2xMetadataHdr -{ /* uvox 2 metadata header */ - __uint16 id; /* ID (cookie) identifying a metadata package */ - __uint16 span; /* Span of messages in the metadata package being assembled */ - __uint16 index;/* Index of the message in the metadata package being assembled */ -}; - -#pragma pack(pop) - -static const int MAX_MESSAGE_SIZE = (16 * 1024); -static const int MAX_CIPHER_KEY_SIZE = 256; - -static const char UV2X_EOM = 0; -static const int UV2X_HDR_SIZE = sizeof(uv2xHdr); -static const int UV2X_OVERHEAD = (UV2X_HDR_SIZE + 1); /* header+end_of_msg */ -static const int UV2X_META_HDR_SIZE = sizeof(uv2xMetadataHdr); -static const int MAX_PAYLOAD_SIZE = MAX_MESSAGE_SIZE - UV2X_OVERHEAD; - -#define UVOX2_SYNC_BYTE 0X5A - -static const int MSG_AUTH = 0x1001; -static const int MSG_BROADCAST_SETUP = 0x1002; -static const int MSG_NEGOTIATE_BUFFER_SIZE = 0x1003; -static const int MSG_STANDBY = 0x1004; -static const int MSG_TERMINATE = 0x1005; -static const int MSG_FLUSH_CACHED_METADATA = 0x1006; -static const int MSG_LISTENER_AUTHENTICATION= 0x1007; -static const int MSG_MAX_PAYLOAD_SIZE = 0x1008; -static const int MSG_CIPHER = 0x1009; // cipher request for uvox 2.1 -static const int MSG_MIME_TYPE = 0x1040; -static const int MSG_FILE_TRANSFER_BEGIN = 0x1050; -static const int MSG_FILE_TRANSFER_DATA = 0x1051; - -static const int MSG_BROADCAST_INTERRUPTION = 0x2001; -static const int MSG_BROADCAST_TERMINATE = 0x2002; - -static const int MSG_ICYNAME = 0x1100; -static const int MSG_ICYGENRE = 0x1101; -static const int MSG_ICYURL = 0x1102; -static const int MSG_ICYPUB = 0x1103; - -static const int MSG_METADATA_CONTENTINFO = 0x3000; -static const int MSG_METADATA_URL = 0x3001; -//static const int MSG_METADATA_XML = 0x3901; -static const int MSG_METADATA_XML_NEW = 0x3902; - -// only id the start of the album art type as it's variable -static const int MSG_METADATA_ALBUMART = 0x4000; -static const int MSG_METADATA_STATION_ART = 0x0000; -static const int MSG_METADATA_PLAYING_ART = 0x0100; -/* - 0x4 0x0xx Station logo - 0x4 0x1xx Album art - - 00 = image/jpeg - 01 = image/png - 02 = image/bmp - 03 = image/gif -*/ - -static const int MSG_METADATA_TIMEREMAINING = 0x5001; - -static const int MP3_DATA = 0x7000; -static const int VLB_DATA = 0x8000; -static const int AAC_LC_DATA = 0x8001; -static const int AACP_DATA = 0x8003; -static const int OGG_DATA = 0x8004; - -/// these are the same -static const int MAX_METADATA_SEGMENTS = 32; -#define MAX_METADATA_FRAGMENTS 32 -/////// - -static const int MAX_METADATA_TIME(300); // five minutes - -// take data and create a uvox message appended to "v". Limit by MAX_PAYLOAD_SIZE. -// return amount of data UNconsumed -int formMessage(const __uint8 *data, const int len, const int type, std::vector<__uint8> &v) throw(std::runtime_error); - -// similar to above, except it writes data into a buffer pointed to by v -int formMessage(const __uint8 *data, const int len, const int type, __uint8 *v) throw(std::runtime_error); - -// this one also returns actual full message size in msgSize -inline int formMessage(const std::string &dataIn, const int type, __uint8 *v, int &msgSize) throw(std::runtime_error) -{ - msgSize = (int)(dataIn.size() + 1); // include null - - int amt_left = formMessage((const __uint8 *)dataIn.c_str(), msgSize /* include null */, type, v); - msgSize += UV2X_OVERHEAD; - return amt_left; -} - -// load vector v up with metadata packets. -void createMetadataPackets(const __uint8 *data, const int len, const int type, - std::vector<__uint8> &v, const __uint16 metadataID = 1) throw(std::runtime_error); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/versions.h b/Src/Plugins/DSP/sc_serv3/versions.h deleted file mode 100644 index bd4fbbbc..00000000 --- a/Src/Plugins/DSP/sc_serv3/versions.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#ifndef versions_H_ -#define versions_H_ - -#define SERV_OSNAME "posix" - -#ifdef _WIN32 - #undef SERV_OSNAME - #ifndef _WIN64 - #define SERV_OSNAME "win32" - #define SERV_UPDATE_NAME "win32" - #else - #define SERV_OSNAME "win64" - #define SERV_UPDATE_NAME "win64" - #endif -#endif - -#ifdef __APPLE_CC__ - #undef SERV_OSNAME - #define SERV_OSNAME "mac" -#endif - -#ifdef PLATFORM_LINUX - #undef SERV_OSNAME - #ifndef __LP64__ - #define SERV_OSNAME "posix(linux x86)" - #define SERV_UPDATE_NAME "linux_x86" - #else - #define SERV_OSNAME "posix(linux x64)" - #define SERV_UPDATE_NAME "linux_x64" - #endif -#endif - -#ifdef PLATFORM_BSD - #undef SERV_OSNAME - #define SERV_OSNAME "posix(bsd)" - #define SERV_UPDATE_NAME "bsd" -#endif - -#ifdef PLATFORM_ARMv6 - #undef SERV_OSNAME - #define SERV_OSNAME "armv6(rpi)" - #define SERV_UPDATE_NAME "rpi" -#endif - -#ifdef PLATFORM_ARMv7 - #undef SERV_OSNAME - #define SERV_OSNAME "armv7(rpi2)" - #define SERV_UPDATE_NAME "rpi2" -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/w3cLog.cpp b/Src/Plugins/DSP/sc_serv3/w3cLog.cpp deleted file mode 100644 index a81cf7b4..00000000 --- a/Src/Plugins/DSP/sc_serv3/w3cLog.cpp +++ /dev/null @@ -1,319 +0,0 @@ -#include "w3cLog.h" -#include "webNet/urlUtils.h" -#include "threading/thread.h" -#include "global.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include - -#ifndef _WIN32 -#include -#include -#include -#include -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -std::map s_w3cFileHandle; - -static AOL_namespace::mutex s_w3cLock; - -void w3cLog::open(const uniFile::filenameType &fn, size_t streamID) throw() -{ - rotate_log(fn, streamID); - - stackLock sml(s_w3cLock); - - if (!s_w3cFileHandle[streamID]) - { - s_w3cFileHandle[streamID] = uniFile::fopen(fn,"wb"); - if (!s_w3cFileHandle[streamID]) - { - ELOG("[W3C] Could not open file " + fn + " (" + errMessage() + ")"); - } - else - { - header(s_w3cFileHandle[streamID]); - } - } -} - -void w3cLog::header(FILE *w3cFileHandle) throw() -{ - // output header like done in the v1 DNAS for tool compatibility - utf8 version = gOptions.getVersionBuildStrings(); - utf8 s = "#Software: SHOUTcast" + eol() + "#Version: " + version + eol() + - "#Fields: c-ip c-dns date time cs-uri-stem c-status cs(User-Agent) sc-bytes x-duration avgbandwidth" + eol(); - size_t amt = ::fwrite(s.c_str(), 1, s.size(), w3cFileHandle); - if (amt != s.size()) - { - ELOG("[W3C] Write error"); - } - ::fflush(w3cFileHandle); -} - -void w3cLog::close(size_t streamID) throw() -{ - stackLock sml(s_w3cLock); - - if (s_w3cFileHandle[streamID]) - { - ::fclose(s_w3cFileHandle[streamID]); - s_w3cFileHandle[streamID] = 0; - } -} - -inline uniFile::filenameType make_backup_log(const uniFile::filenameType &filename, int which) throw() -{ - // 2.4.8+ we now ensure that this is giving a 'full path' to avoid issues - return fileUtil::getFullFilePath((fileUtil::stripSuffix(filename) + "_" + - tobs(which) + "." + - fileUtil::getSuffix(filename))); -} - -uniFile::filenameType make_archive_log() throw() -{ -#ifdef _WIN32 - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - wchar_t d[100] = {0}, t[100] = {0}; - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("yyyy'_'MM'_'dd"),d,99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("HH'_'mm'_'ss"),t,99); - return tos((const wchar_t *)d) + "_" + tos((const wchar_t *)t); -#else - char buf[256] = {0}; - struct tm ttm; - time_t ttt; - ::time(&ttt); - ::strftime(buf, 255, "%Y_%m_%d_%H_%M_%S", ::localtime_r(&ttt, &ttm)); - return buf; -#endif -} - -void w3cLog::rotate_log(const uniFile::filenameType &fn, size_t streamID) throw() -{ - stackLock sml(s_w3cLock); - - if (s_w3cFileHandle[streamID]) - { - ::fclose(s_w3cFileHandle[streamID]); - s_w3cFileHandle[streamID] = 0; - } - - int numFileBackups = gOptions.logRotates(); - for (int x = numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(fn, x); - // archive the log file about to be removed into a gz file - if (x > 0 && x == gOptions.logRotates()) - { - #ifdef _WIN32 - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_" + tos(numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0, pos) + utf8("_" + make_archive_log() + "_w3c.gz")); - - HANDLE m_archive = ::CreateFileW(archive.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_archive != INVALID_HANDLE_VALUE) - { - DWORD written(0); - utf8 out; - z_stream m_stream = {0}; - - FILE* m_logFile = uniFile::fopen(dest, "rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream, (Bytef*)"sc_w3c.log\0"); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - } - } - - if (out.size() > 0) - { - compressDataFinish(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - forgetHandleInvalid(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - forgetHandleInvalid(m_archive); - uniFile::unlink(archive); - } - } - } - #else - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_" + tos(numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0, pos) + utf8("_" + make_archive_log() + "_w3c.gz")); - int m_archive = ::open(archive.hideAsString().c_str(), O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_archive != -1) - { - utf8 out; - z_stream m_stream = {0}; - FILE* m_logFile = uniFile::fopen(dest, "rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream, (Bytef*)"sc_w3c.log\0"); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::write(m_archive, out.c_str(), out.size()); - } - } - - if (out.size() > 0) - { - compressDataFinish(out, &m_stream); - } - - ::write(m_archive, out.c_str(), out.size()); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - ::close(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - ::close(m_archive); - uniFile::unlink(archive); - } - } - } - #endif - } - - uniFile::unlink(dest); - #ifdef _WIN32 - ::MoveFileW(((x - 1) ? make_backup_log(fn, (x - 1)).toWString().c_str() : fn.toWString().c_str()), dest.toWString().c_str()); - #else - ::rename(((x - 1) ? make_backup_log(fn, (x - 1)).hideAsString().c_str() : fn.hideAsString().c_str()), dest.hideAsString().c_str()); - #endif - } - - s_w3cFileHandle[streamID] = uniFile::fopen(fn,"wb"); - if (!s_w3cFileHandle[streamID]) - { - ELOG("[W3C] Could not open file " + fn); - } - else - { - header(s_w3cFileHandle[streamID]); - } -} - -void w3cLog::log(const size_t streamID, const uniString::utf8 &ipAddr, - const uniString::utf8 &hostName, const uniString::utf8 &songName, - const uniString::utf8 &userAgent, __uint64 bytesSent, - time_t timeInSeconds, int bitrate) -{ - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (isUserAgentOfficial(toLower(userAgent))) - { - return; - } - - stackLock sml(s_w3cLock); - - FILE *w3cFileHandle = s_w3cFileHandle[streamID]; - if (!w3cFileHandle && streamID) - { - w3cFileHandle = s_w3cFileHandle[0]; - } - - if (!w3cFileHandle) - { - return; - } - - static time_t last_t; - static utf8 w3c_buf; - time_t t = ::time(NULL); - if (last_t != t) - { - struct tm lt = {0}; - ::localtime_s(<, &t); - - char buf[1024] = {0}; - snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d", - (lt.tm_year % 100) + 2000, lt.tm_mon + 1, - lt.tm_mday, lt.tm_hour, lt.tm_min, lt.tm_sec); - w3c_buf = buf; - } - - // http://forums.shoutcast.com/showthread.php?t=355063 - // http://forums.shoutcast.com/showthread.php?t=358805 - utf8 s = ipAddr + " " + hostName + " " + w3c_buf + " /stream?title=" + - (songName.empty() ? utf8("Unknown") : urlUtils::escapeURI_RFC3986(songName)) + - " 200 " + urlUtils::escapeURI_RFC3986(userAgent) + " " + tos(bytesSent) + " " + - tos(timeInSeconds) + " " + tos(bitrate) + eol(); - - size_t amt = ::fwrite(s.c_str(), 1, s.size(), w3cFileHandle); - if (amt != s.size()) - { - ELOG("[W3C] Write error"); - } - ::fflush(w3cFileHandle); -} diff --git a/Src/Plugins/DSP/sc_serv3/w3cLog.h b/Src/Plugins/DSP/sc_serv3/w3cLog.h deleted file mode 100644 index 13ab6a0f..00000000 --- a/Src/Plugins/DSP/sc_serv3/w3cLog.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#ifndef w3cLog_H_ -#define w3cLog_H_ - -#include "unicode/uniString.h" -#include "unicode/uniFile.h" - -class w3cLog -{ -public: - static void open(const uniFile::filenameType &fn, const size_t streamID = 0) throw(); - static void header(FILE *w3cFileHandle) throw(); - static void close(const size_t streamID) throw(); - static void rotate_log(const uniFile::filenameType &fn, const size_t streamID = 0) throw(); - static void log(const size_t streamID, const uniString::utf8 &ipAddr, const uniString::utf8 &hostName, - const uniString::utf8 &songName, const uniString::utf8 &userAgent, __uint64 bytesSent, - time_t timeInSeconds, const int bitrate); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webClient.cpp b/Src/Plugins/DSP/sc_serv3/webClient.cpp deleted file mode 100644 index 3006d6b9..00000000 --- a/Src/Plugins/DSP/sc_serv3/webClient.cpp +++ /dev/null @@ -1,619 +0,0 @@ -#ifdef _WIN32 -#include -#endif - -#include -#include "webClient.h" -#include "webNet/urlUtils.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define DEBUG_LOG(...) do { if (gOptions.webClientDebug()) DLOG(__VA_ARGS__); } while (0) - -////////////////// utils - -static utf8 toLogString(const webClient::request &r) throw() -{ - // using this to ensure the default YP connection is via HTTPS - // though if there is a config issue then attempt to handle it - // by reverting to the pre-HTTPS mode so we can still work-ish - const bool https = ((r.m_addr == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - if (r.m_port == 80) - { - return utf8(https ? "https://" : "http://") + r.m_addr + r.m_path; - } - else - { - return utf8(https ? "https://" : "http://") + r.m_addr + ":" + tos(r.m_port) + r.m_path; - } -} - -utf8 encodeVariables(const httpHeaderMap_t &m) throw() -{ - utf8 result; - - if (!m.empty()) - { - for (httpHeaderMap_t::const_iterator i = m.begin(); i != m.end(); ++i) - { - if (i != m.begin()) - { - result += "&"; - } - result += urlUtils::escapeURI_RFC3986((*i).first) + "="; - if (!(*i).second.empty()) - { - result += urlUtils::escapeURI_RFC3986((*i).second); - } - } - } - return result; -} - -static utf8 toLogString(const httpHeaderMap_t &m) throw() -{ - utf8 result = "headers=[" + eol(); - for (httpHeaderMap_t::const_iterator i = m.begin(); i != m.end(); ++i) - { - result += " " + (*i).first + " : " + (*i).second + eol(); - } - result += "]" + eol(); - return result; -} - -static utf8 toLogString(const webClient::response &r) throw() -{ - utf8 result = "code=" + tos(r.m_resultCode) + " reason=" + r.m_resultText + eol(); - result += toLogString(r.m_headers); - result += "body=[" + eol(); - result += r.m_body + eol() + "]"; - return result; -} - -//////////////////////// - -webClient::webClient(const uniString::utf8 &logPrefix) throw() - : m_logPrefix(logPrefix), m_state(&webClient::state_Idle), - m_nextState(0), m_nonBlockingID(0), m_response() -{ - m_curl_error = new char[CURL_ERROR_SIZE]; - memset(m_curl_error, 0, CURL_ERROR_SIZE); -} - -webClient::~webClient() throw() -{ - for (curlMap_t::const_iterator i = m_curl.begin(); i != m_curl.end(); ++i) - { - if (i->second != NULL) - { - curl_easy_cleanup(i->second); - } - } - for (curlHeadersMap_t::const_iterator i = m_curl_headers.begin(); i != m_curl_headers.end(); ++i) - { - if (i->second != NULL) - { - curl_slist_free_all(i->second); - } - } - m_curl.clear(); - forgetArray(m_curl_error); -} - -/////////////////////////////////////////////////////////////////// - -void webClient::queueRequest(const request &req) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - - m_requestQueue.push(req); - m_requestSignal.set(); -} - -void webClient::timeSlice() throw(exception) -{ - try - { - if (this->m_state) - { - return (this->*m_state)(); - } - } - catch (const webClient::retry_exception &ex) - { - // increase failure counter - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - ++m_requestQueue.front().m_retryCounter; - } - m_requestQueueLock.unlock(); - - m_state = &webClient::state_Wait; - m_nextState = &webClient::state_SendRequest; - m_lastActivityTime = ::time(NULL); - m_result.timeout(gOptions.ypTimeout()); - - utf8 what = ex.what(); - WLOG(((what.find(m_logPrefix) == utf8::npos) ? m_logPrefix : "") + - what + (!what.empty() ? " - " : "") + - "Retrying in " + tos(gOptions.ypTimeout()) + " seconds."); - } - catch (const exception &ex) - { - // increase failure counter - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - ++m_requestQueue.front().m_retryCounter; - } - m_requestQueueLock.unlock(); - - m_state = &webClient::state_Wait; - m_nextState = &webClient::state_SendRequest; - m_lastActivityTime = ::time(NULL); - m_result.timeout(gOptions.ypTimeout()); - - utf8 what = ex.what(); - ELOG(((what.find(m_logPrefix) == utf8::npos) ? m_logPrefix : "") + - what + (!what.empty() ? " - " : "") + - "Restarting in " + tos(gOptions.ypTimeout()) + " seconds."); - } - catch(...) - { - ELOG(m_logPrefix + "Fatal error. Cannot recover."); - throw; - } -} - -// waiting for a request to be queued -void webClient::state_Idle() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - m_requestSignal.clear(); - if (m_requestQueue.empty()) - { - m_result.schedule(1000); - m_result.read(m_requestSignal.test()); - m_result.timeout(gOptions.ypTimeout()); - } - else - { - m_result.run(); - m_state = &webClient::state_SendRequest; - } -} - -// TODO can we instead change this to be scheduled? -void webClient::state_Wait() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - time_t t = ::time(NULL); - stackLock sml(m_requestQueueLock); - if (t < m_lastActivityTime) // rollover? - { - m_lastActivityTime = t; - } - - if (m_state != m_nextState) - { - m_state = m_nextState; - // this is needed to ensure that we'll not - // block on some of the YP async requests. - m_result.timeout(0, 10); - } - else - { - // we'll add this back to be tested for... - m_result.schedule (50); - m_result.timeout((gOptions.ypTimeout() - (int)(t - m_lastActivityTime))); - } -} - -size_t webClient::ParseReplyHeaders(void *buffer, size_t size, size_t count, FILE *stream) throw(runtime_error) -{ - webClient *client = reinterpret_cast(stream); - if (!client) - { - throwEx("ParseReplyHeaders parameter failure"); - } - - utf8 s = stripWhitespace(utf8((char*)buffer, (size * count))); - if (!s.empty()) - { - DEBUG_LOG(client->m_logPrefix + "HTTP header: " + s); - - if (client->m_response.m_resultCode == 0) // waiting for first line or something other than HTTP/1.1 100 Continue - { - utf8::size_type pos = s.find(utf8(" ")); - if (pos == utf8::npos) - { - throwEx(client->m_logPrefix + "Badly formed HTTP response [" + s + "]"); - } - s = stripWhitespace(s.substr(pos)); - pos = s.find(utf8(" ")); - if (pos == utf8::npos) - { - throwEx(client->m_logPrefix + "Badly formed HTTP response [" + s + "]"); - } - client->m_response.m_resultCode = utf8(s.substr(0,pos)).toInt(); - if (client->m_response.m_resultCode != 100) - { - s = stripWhitespace(s.substr(pos)); - client->m_response.m_resultText = s; - } - else - { - client->m_response.m_resultCode = 0; - } - } - else - { - // header lines - utf8::size_type pos = s.find(utf8(":")); - if (pos == utf8::npos) - { - throwEx(client->m_logPrefix + "Badly formed HTTP header line [" + s + "]"); - } - if ((int)client->m_response.m_headers.size() > gOptions.maxHeaderLineCount()) - { - throwEx(client->m_logPrefix + "Badly formed HTTP response. Max header lines exceeded."); - } - - utf8 key = toLower(stripWhitespace(s.substr(0,pos))); - utf8 value = stripWhitespace(s.substr(pos+1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - throwEx(client->m_logPrefix + "Bad HTTP header string [" + s + "]"); - } - client->m_response.m_headers[key] = value; - } - } - - size_t received = (size * count); - client->m_response.m_received += received; - return received; -} - -size_t webClient::GetBody(void *buffer, size_t size, size_t count, FILE *stream) -{ - webClient *client = reinterpret_cast(stream); - size_t received = (size * count); - unsigned char *arr = (unsigned char *)buffer; - - if (gOptions.webClientDebug()) - { - // skip outputting the DNAS download updates - DLOG(client->m_logPrefix + "HTTP body: " + arr); - } - client->m_requestQueueLock.lock(); - client->m_response.m_body.insert(client->m_response.m_body.end(), arr, &arr[received]); - client->m_lastActivityTime = ::time(NULL); - - client->m_response.m_received += received; - client->m_requestQueueLock.unlock(); - return received; -} - -void webClient::gotCurlRespose() -{ - this->m_nextState = &webClient::state_RequestComplete; - this->m_lastActivityTime = ::time(NULL); -} - -// will still need to set certain aspects like the error buffer or any of the header / processing options -CURL* webClient::setupCurlDefaults(CURL* oldCurl, const char *logPrefix, const utf8& requestUrl, - const int timeout, const int connnectTimeout, size_t SID) -{ - CURL *curl = (oldCurl == NULL ? curl_easy_init() : oldCurl); - if (curl) - { - if (requestUrl != utf8("")) - { - if (oldCurl) - { - curl_easy_reset(curl); - DEBUG_LOG ("Recycling curl handle for: " + requestUrl, logPrefix, SID); - } - else - { - DEBUG_LOG ("Creating new curl handle for: " + requestUrl, logPrefix, SID); - } - curl_easy_setopt(curl, CURLOPT_URL, requestUrl.hideAsString().c_str()); - } - - curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); - curl_easy_setopt(curl, CURLOPT_USERAGENT, g_userAgent.c_str()); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, (timeout == -1 ? gOptions.ypTimeout() : timeout)); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, (connnectTimeout == -1 ? 3L : connnectTimeout)); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_MAXREDIRS, gOptions.maxHTTPRedirects()); - curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); - -/*#if defined(_DEBUG) || defined(DEBUG) - if (gOptions.webClientDebug()) - { - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - } -#endif*/ - - // this is needed (mainly for the Windows builds) so things will work with SSL and also - // self-signed certificates as we appear to be using (as CURLOPT_SSL_VERIFYPEER = FALSE - // is an absolute no-no due to the man in the middle attack which it allows to succeed. - //DEBUG_LOG(logPrefix + "Certificate path: `" + gOptions.m_certPath + "'"); - if (!gOptions.m_certPath.empty()) - { - curl_easy_setopt(curl, CURLOPT_CAINFO, gOptions.m_certPath.hideAsString().c_str()); - } - else - { - WLOG ("Certificate path is invalid - cacert.pem location not known", logPrefix, SID); - } - } - return curl; -} - -// build the entire web request, and send it -void webClient::state_SendRequest() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - do - { - m_requestQueueLock.lock(); - - if (m_requestQueue.empty()) - { - // queue is empty, move to idle state - m_requestSignal.clear(); - m_state = &webClient::state_Idle; - m_requestQueueLock.unlock(); - break; - } - // construct request - request &r = m_requestQueue.front(); // leave it in the queue until request succeeds - struct curl_slist *header = m_curl_headers[r.m_sid]; - - if (r.m_retryCounter < gOptions.ypMaxRetries()) - { - m_curl_path.clear(); - m_curl_path = toLogString(r); - - if (r.m_method == webClient::request::GET && !r.m_queryVariables.empty()) - { - m_curl_path += utf8("?") + encodeVariables(r.m_queryVariables); - } - - // create or re-use the handle as needed (doing a reset to avoid some quirks with authhash vs general YP usage) - CURL* curl = setupCurlDefaults(m_curl[r.m_sid], (char *)m_logPrefix.c_str(), m_curl_path); - if (curl) - { - if (r.m_method == webClient::request::POST) - { - utf8 contentType = ""; - if (r.m_content.empty()) - { - utf8 u8 = encodeVariables(r.m_queryVariables); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, u8.size()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, &u8[0]); - } - else - { - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, r.m_content.size()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, &r.m_content[0]); - } - if (r.m_contentType.empty() == false) - { - string contentType = "Content-Type:" + r.m_contentType.hideAsString(); - header = curl_slist_append (header, contentType.c_str()); - } - } - else - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); - - utf8 m_XFF = ""; - if (!r.m_XFF.empty()) - { - m_XFF = "X-Forwarded-For:" + r.m_XFF; - header = curl_slist_append(header, m_XFF.hideAsString().c_str()); - } - - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); - - // send it, then get ready to receive the reply - m_lastActivityTime = ::time(NULL); - m_response.clear(); - r.m_content.clear(); - - DEBUG_LOG(m_logPrefix + "Request URL: " + m_curl_path); - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &this->ParseReplyHeaders); - curl_easy_setopt(curl, CURLOPT_HEADERDATA, this); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &this->GetBody); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &(m_curl_error[0])); - - if (r.m_nonBlocking) - { - m_nonBlockingID = r.m_sid; - m_curl_headers[r.m_sid] = header; - m_curl[r.m_sid] = curl; - - m_state = m_nextState = &webClient::state_Wait; - m_requestQueueLock.unlock(); - SimpleThread (webClient::process, this); - } - else - { - m_requestQueueLock.unlock(); - CURLcode ret = curl_easy_perform(curl); - m_requestQueueLock.lock(); - if (ret != CURLE_OK) - { - getCurlError(curl, ret); - } - else - { - m_state = &webClient::state_RequestComplete; - } - - if (header) - { - curl_slist_free_all(header); - m_curl_headers[r.m_sid] = NULL; - } - m_requestQueueLock.unlock(); - } - } - break; - } - ELOG(m_logPrefix + "Request [" + toLogString(r) + "] failed. Retries exceeded."); - gotFailure(r); - m_requestQueue.pop(); - m_requestQueueLock.unlock(); - } while (0); - - m_result.run(); -} - -void webClient::getCurlError(CURL* curl, const CURLcode ret) throw(exception) -{ - if (!m_requestQueue.empty()) - { - webClient::request &r = m_requestQueue.front(); - r.m_received = 0; - if (curl) - { - curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &r.m_received); - curl_easy_cleanup(curl); - } - m_curl[r.m_sid] = NULL; - - ELOG(m_logPrefix + "Request [" + toLogString(r) + "] failed, code: " + tos(ret) + - " [" + (m_curl_error[0] ? m_curl_error : curl_easy_strerror(ret)) + "]"); - gotFailure(r); - m_requestQueue.pop(); - - m_lastActivityTime = ::time(NULL); - m_state = m_nextState = &webClient::state_Idle; - } -} - -THREAD_FUNC webClient::process(void* arg) -{ - try - { - webClient* m_client = reinterpret_cast(arg); - if (m_client) - { - if (!iskilled()) - { - m_client->m_requestQueueLock.lock(); - - CURL* curl = m_client->getCurlHandle(); - m_client->m_requestQueueLock.unlock(); - - CURLcode ret = (curl ? curl_easy_perform(curl) : CURLE_READ_ERROR); - if (!iskilled()) - { - stackLock sml(m_client->m_requestQueueLock); - - if (ret != CURLE_OK) - { - m_client->getCurlError(curl, ret); - } - else - { - m_client->gotCurlRespose(); - } - - m_client->clearCurlHeader(); - } - } - } - } - catch (...) - { - } - return 0; -} - -// need to let things run in the background so sit and spin and wait... -void webClient::state_Send() throw(std::exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - SimpleThread(webClient::process, this); - - m_state = m_nextState = &webClient::state_Wait; - m_result.run(); -} - -// request complete. Issue virtual callback, pop request, then move to idle -// state and wait for next request -void webClient::state_RequestComplete() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - request &r = m_requestQueue.front(); - m_requestQueueLock.unlock(); - gotResponse(r, m_response); // could throw - - m_requestQueueLock.lock(); - m_requestQueue.pop(); - } - - m_lastActivityTime = ::time(NULL); - m_state = m_nextState = &webClient::state_Idle; - m_result.run(); - m_requestQueueLock.unlock(); -} - -// this method should be overridden. The base class here just dumps diagnostics -// throw an exception if you want to treat the result as a retryable error -void webClient::gotResponse(const request &/*q*/, const response &r) throw(exception) -{ - DEBUG_LOG(m_logPrefix + toLogString(r)); -} - -void webClient::gotFailure(const request &q) throw(exception) -{ - DEBUG_LOG(m_logPrefix + toLogString(q)); -} - -const size_t webClient::queueEntries() throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - - return !m_requestQueue.empty(); -} diff --git a/Src/Plugins/DSP/sc_serv3/webClient.h b/Src/Plugins/DSP/sc_serv3/webClient.h deleted file mode 100644 index 1a3d178a..00000000 --- a/Src/Plugins/DSP/sc_serv3/webClient.h +++ /dev/null @@ -1,153 +0,0 @@ -#pragma once -#ifndef webClient_H_ -#define webClient_H_ - -#include "threadedRunner.h" -#include "curl/curl.h" -#include - -// runnable that provides generic web client functionality to a single host -// you can subclass this to provide specific behaviour -#pragma pack(push, 1) -class webClient: public runnable -{ -public: - struct request - { - typedef enum { GET,POST } method_t; - - uniString::utf8 m_addr; - uniString::utf8 m_path; - - // content - std::vector<__uint8> m_content; - uniString::utf8 m_contentType; - - // used for the setting the 'X-Forwarded-For' header field which - // is a bit of a fiddle to allow destip to be different so the YP - // can test an alternative external IP from that it auto detects - uniString::utf8 m_XFF; - - httpHeaderMap_t m_queryVariables; - method_t m_method; - - int m_port; - size_t m_sid; - int m_retryCounter; - - int m_userData_i; - - size_t m_received; // size of data got - int m_nonBlocking; // do on an additional thread e.g. the YP add needs - // this else it blocks the YP test exists connetion - - // two random pieces of user data - unsigned m_userData_u; - void* m_userData_p; - - request() : m_path(uniString::utf8("/")), m_method(GET), m_port(80), - m_sid(0), m_retryCounter(0), m_userData_i(0), m_received(0), - m_nonBlocking(0), m_userData_u(0), m_userData_p(0) {} - }; - - struct response - { - uniString::utf8 m_resultText; - uniString::utf8 m_body; // body of response - httpHeaderMap_t m_headers; // response headers - size_t m_resultCode; // HTTP result code - size_t m_received; // size of data got - - response() : m_resultCode(0), m_received(0) {} - - void clear() throw() - { - m_resultCode = 0; - m_received = 0; - m_headers.clear(); - m_body.clear(); - m_resultText.clear(); - } - }; - - static size_t ParseReplyHeaders(void *buffer, size_t size, size_t count, FILE *stream) throw(std::runtime_error); - static size_t GetBody(void *buffer, size_t size, size_t count, FILE *stream); - - CURL* getCurlHandle(const size_t SID = 0) { return m_curl[(!SID ? m_nonBlockingID : SID)]; } - void clearCurlHeader(const size_t SID = 0) - { - size_t id = (!SID ? m_nonBlockingID : SID); - struct curl_slist *header = m_curl_headers[id]; - if (header) - { - curl_slist_free_all(header); - m_curl_headers[id] = 0; - } - } - void gotCurlRespose(); - void getCurlError(CURL* curl, const CURLcode ret) throw(std::exception); - - static CURL* setupCurlDefaults(CURL* oldCurl, const char *logPrefix, const uniString::utf8& requestUrl, - const int timeout = -1, const int connnectTimeout = -1, size_t SID = 0); - - static THREAD_FUNC process(void* arg); - -protected: - class retry_exception : public std::runtime_error - { - public: - explicit retry_exception(const uniString::utf8 &msg) : runtime_error(msg.hideAsString()){} - }; - -private: - typedef void (webClient::*state_t)(); - const uniString::utf8 m_logPrefix; - - state_t m_state; - state_t m_nextState; - - // curl specific parts - typedef std::map curlMap_t; - curlMap_t m_curl; - - size_t m_nonBlockingID; - uniString::utf8 m_curl_path; - - typedef std::map curlHeadersMap_t; - curlHeadersMap_t m_curl_headers; - - response m_response; - char* m_curl_error; - - AOL_namespace::mutex m_requestQueueLock; - std::queue m_requestQueue; - pipeDrivenSignal m_requestSignal; - - void state_Idle() throw(std::exception); - void state_Wait() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_Send() throw(std::exception); - void state_Get() throw(std::exception); - void state_SendRequest() throw(std::exception); - void state_RequestComplete() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - -protected: - explicit webClient(const uniString::utf8 &logPrefix) throw(); - virtual ~webClient() throw(); - - void queueRequest(const request &req) throw(); - // throw to treat as an error and retry entire request - virtual void gotResponse(const request &q, const response &r) throw(std::exception); // called when response is received - virtual void gotFailure(const request &q) throw(std::exception); // called when retries are exhausted - - const size_t queueEntries() throw(); -}; -#pragma pack(pop) - -uniString::utf8 encodeVariables(const httpHeaderMap_t &m) throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp b/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp deleted file mode 100644 index 59587b39..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp +++ /dev/null @@ -1,716 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include "socketOps.h" -#include -#include -#include -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; - -static std::map s_errMsgs; - -const SOCKET socketOps::cINVALID_SOCKET = INVALID_SOCKET; -const SOCKET socketOps::cSOCKET_ERROR = (SOCKET)SOCKET_ERROR; - -class win32_socket_init -{ -public: - ~win32_socket_init() { ::WSACleanup(); } - win32_socket_init() - { - WORD wVersion = MAKEWORD( 1, 1 ); - WSADATA wsaData = {0}; - - ::WSAStartup(wVersion, &wsaData); - - s_errMsgs[WSAEINTR] = "Interrupted function call: A blocking operation was interrupted by a call to WSACancelBlockingCall."; - s_errMsgs[WSAEFAULT] = "Bad address: The system detected an invalid pointer address in attempting to use a pointer argument of a call."; - s_errMsgs[WSAEINVAL] = "Invalid argument: Some invalid argument was supplied."; - s_errMsgs[WSAEMFILE] = "Too many open descriptors: No more socket descriptors are available."; - s_errMsgs[WSAEWOULDBLOCK] = "Call would block: Non-blocking call will block."; - s_errMsgs[WSAEINPROGRESS] = "Operation now in progress: A blocking operation is currently executing."; - s_errMsgs[WSAEALREADY] = "Operation already in progress: An operation was attempted on a nonblocking socket with an operation already in progress."; - s_errMsgs[WSAENOTSOCK] = "Socket operation on non socket: An operation was attempted on something that is not a socket."; - s_errMsgs[WSAEDESTADDRREQ] = "Destination address required: A required address was omitted from an operation on a socket."; - s_errMsgs[WSAEMSGSIZE] = "Message too long: A message sent on a datagram socket was larger than the internal message buffer."; - s_errMsgs[WSAEPROTOTYPE] = "The specified protocol is the wrong type for this socket."; - s_errMsgs[WSAENOPROTOOPT] = "Bad Protocol option."; - s_errMsgs[WSAEPROTONOSUPPORT] = "The specified protocol is not supported."; - s_errMsgs[WSAESOCKTNOSUPPORT] = "The specified socket type is not supported in this address family."; - s_errMsgs[WSAEOPNOTSUPP] = "Socket operation not supported."; - s_errMsgs[WSAEPFNOSUPPORT] = "Protocol family not supported."; - s_errMsgs[WSAEAFNOSUPPORT] = "The specified address family is not supported"; - s_errMsgs[WSAEADDRINUSE] = "Address already in use."; - s_errMsgs[WSAEADDRNOTAVAIL] = "Cannot assign requested address."; - s_errMsgs[WSAENETDOWN] = "A network subsystem or the associated service provider has failed"; - s_errMsgs[WSAENETUNREACH] = "Nework is unreachable."; - s_errMsgs[WSAENETRESET] = "Network dropped connection on reset."; - s_errMsgs[WSAECONNABORTED] = "Software caused connection abort."; - s_errMsgs[WSAECONNRESET] = "Connection reset by peer."; - s_errMsgs[WSAENOBUFS] = "No buffer space is available. The socket cannot be created."; - s_errMsgs[WSAEISCONN] = "Socket is already connected."; - s_errMsgs[WSAENOTCONN] = "Socket is not connected."; - s_errMsgs[WSAESHUTDOWN] = "Cannot send after socket shutdown."; - s_errMsgs[WSAETIMEDOUT] = "Connection timed out."; - s_errMsgs[WSAECONNREFUSED] = "Connection refused."; - s_errMsgs[WSAEHOSTDOWN] = "Host is down."; - s_errMsgs[WSAEHOSTUNREACH] = "No route to host."; - s_errMsgs[WSAEPROCLIM] = "Too many processes."; - } -}; - -static win32_socket_init win32_socket_init_force; - -std::string socketOps::errMsg(int errCode) throw() -{ - std::map::const_iterator i = s_errMsgs.find(errCode); - return (i == s_errMsgs.end() ? "error code " + tos(errCode) : (*i).second); -} - -int socketOps::errCode() throw() { return ::WSAGetLastError(); } - -#else - -#include -#include "socketOps.h" -#include "stl/stringUtils.h" -#include - -using namespace std; -using namespace stringUtil; - -const int socketOps::cINVALID_SOCKET = -1; -const int socketOps::cSOCKET_ERROR = -1; - -int socketOps::errCode() throw() { return errno; } - -std::string socketOps::errMsg(int errCode) throw() -{ - std::string result = "error code " + tos(errCode); - - char *e = strerror(errCode); - if (e) - { - result = e; - } - return result; -} -#endif - -std::string socketOps::endpoint::toString() const throw() -{ - return m_address + ":" + tos(m_port); -} - -socketOps::tSOCKET socketOps::createTCPSocket() throw() -{ - return ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -} - -socketOps::tSOCKET socketOps::createTCPSocketTHROW() throw(std::runtime_error) -{ - tSOCKET result = socketOps::createTCPSocket(); - if (result == socketOps::cINVALID_SOCKET) - { - throw std::runtime_error("socketOps::createTCPSocketTHROW() - Could not create socket because " + socketOps::errMsg()); - } - return result; -} - -int socketOps::setNonblock(const socketOps::tSOCKET s, bool nonBlock) throw() -{ -#ifdef _WIN32 - unsigned long i = (nonBlock ? 1 : 0); - return ioctlsocket(s, FIONBIO, &i); -#else - int flags, err; - - if ((flags = fcntl(s, F_GETFL, 0)) == socketOps::cSOCKET_ERROR) - { - return flags; - } - - if (nonBlock) - { - flags |= O_NONBLOCK; - } - else - { - flags &= ~O_NONBLOCK; - } - - if ((err = fcntl(s, F_SETFL, flags)) == socketOps::cSOCKET_ERROR) - { - return err; - } - return 0; -#endif -} - -void socketOps::setNonblockTHROW(const socketOps::tSOCKET s, const bool nonblock) throw(std::runtime_error) -{ - int err = socketOps::setNonblock(s, nonblock); - if (err == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("socketOps::setNonblockTHROW() - Could not get socket flags because " + socketOps::errMsg()); - } -} - -void socketOps::closeTCPSocket(socketOps::tSOCKET s) throw() -{ -#ifdef _WIN32 - ::shutdown(s, SD_BOTH); - ::closesocket(s); -#else - ::shutdown(s, SHUT_RDWR); - ::close(s); -#endif -} - -void socketOps::forgetTCPSocket(tSOCKET &s) throw() -{ - if (s != socketOps::cINVALID_SOCKET) - { - socketOps::closeTCPSocket(s); - s = socketOps::cINVALID_SOCKET; - } -} - -int socketOps::connect(const socketOps::tSOCKET s, const std::string &address, const u_short port) throw() -{ - unsigned long iaddr = inet_addr(address.c_str()); - struct sockaddr_in addr = {0}; - - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - memcpy(&(addr.sin_addr), &iaddr, 4); - - return ::connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr)); -} - -int socketOps::connect(tSOCKET s,const endpoint &e) throw() -{ - return socketOps::connect(s, e.m_address, e.m_port); -} - -void socketOps::connectTHROW(const socketOps::tSOCKET s, const std::string &address, const u_short port) throw(std::runtime_error) -{ - if (socketOps::connect(s, address, port) == socketOps::cSOCKET_ERROR) - { - int err = socketOps::errCode(); -#ifdef _WIN32 - if ((err == WSAEINPROGRESS) || (err == WSAEWOULDBLOCK)) -#else - if ((err == EINPROGRESS) || (err == EWOULDBLOCK) || (err == ECONNABORTED) || (err == EINTR)) -#endif - return; - - throw std::runtime_error("Could not connect to " + address + ":" + tos(port) + " because " + socketOps::errMsg()); - } -} - -void socketOps::connectTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error) -{ - if (socketOps::connect(s, e) == socketOps::cSOCKET_ERROR) - { - int err = socketOps::errCode(); -#ifdef _WIN32 - if ((err == WSAEINPROGRESS) || (err == WSAEWOULDBLOCK)) -#else - if ((err == EINPROGRESS) || (err == EWOULDBLOCK) || (err == ECONNABORTED) || (err == EINTR)) -#endif - return; - - throw std::runtime_error("Could not connect to " + e.toString() + " because " + socketOps::errMsg()); - } -} - -socketOps::nonBlockConnect_t socketOps::nonBlockingConnectWait(const socketOps::tSOCKET s, std::string &errorString) throw() -{ - try - { -#ifdef _WIN32 - // non-blocking connects suck - fd_set rset, wset, eset; - struct timeval tval; - - FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset); - FD_SET(s,&rset); - FD_SET(s,&wset); - FD_SET(s,&eset); - - tval.tv_sec = 0; - tval.tv_usec = 1; - - int n = ::select(((int)s)+1,&rset,&wset,&eset,&tval); - - // if n == 0 then we timed out, and must stay in this state - if (n == 0) - { - return socketOps::NBC_INPROGRESS; - } - - if (n < 0) // fatal select error - { - try - { - errorString = socketOps::errMsg(); - } - catch(...) - { - errorString = "Impossible connection failure. (1)"; - } - return socketOps::NBC_ERROR; - } - - // detecting when a non-blocking connect is ready (or has errored) - // is highly platform dependent. Microsoft docs specify one way, Stevens - // (2nd edition page 411) specifies another way to cover various Unix flavors - if (FD_ISSET(s,&eset)) - { - errorString = "Connection failure."; - return socketOps::NBC_ERROR; - } - else if (FD_ISSET(s,&wset)) - { - return socketOps::NBC_CONNECTED; - } - else - { - errorString = "Impossible connection failure. (2)"; - return socketOps::NBC_ERROR; - } -#else - struct pollfd check; - int val = -1; - socklen_t size = sizeof val; - check.fd = s; - check.events = POLLOUT; - switch (poll (&check, 1, 0)) - { - case 0: - { - return socketOps::NBC_INPROGRESS; - } - default: - { - if (getsockopt (s, SOL_SOCKET, SO_ERROR, (void*) &val, &size) == 0) - { - if (val == 0) - { - return socketOps::NBC_CONNECTED; - } - errno = val; - } - // fall thru - } - case -1: - { - if (errno == EINTR) - { - return socketOps::NBC_INPROGRESS; - } - throw std::runtime_error(""); - } - } -#endif - } - catch(...) - { -#ifdef _WIN32 - errorString = "Impossible connection failure. (3)"; -#else - errorString = "Connection failure."; -#endif - return socketOps::NBC_ERROR; - } -} - -socketOps::tSOCKET socketOps::bind(tSOCKET s, u_short port, const std::string &address) throw() -{ - struct sockaddr_in servaddr = {0}; - servaddr.sin_family = AF_INET; - - if (address == "") - { - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - } - else - { - unsigned long iaddr = inet_addr(address.c_str()); - memcpy(&(servaddr.sin_addr), &iaddr, 4); - } - - servaddr.sin_port = htons(port); - return ::bind(s, (const sockaddr *)&servaddr, sizeof(servaddr)); -} - -socketOps::tSOCKET socketOps::bind(tSOCKET s, const socketOps::endpoint &e) throw() -{ - return socketOps::bind(s,e.m_port,e.m_address); -} - -void socketOps::bindTHROW(tSOCKET s, u_short port, const std::string &address) throw(std::runtime_error) -{ - if (socketOps::bind(s,port,address) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not bind to " + (!address.empty() ? address + ":" : "") + tos(port) + " because " + socketOps::errMsg()); - } -} - -void socketOps::bindTHROW(tSOCKET s,const endpoint &e) throw(std::runtime_error) -{ - if (socketOps::bind(s,e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not bind to " + e.toString() + " because " + socketOps::errMsg()); - } -} - -int socketOps::accept(tSOCKET s, std::string &address, u_short &port) throw() -{ - struct sockaddr_in client_addr = {0}; -#ifdef _WIN32 - int len = sizeof(client_addr); -#else - socklen_t len = sizeof(client_addr); -#endif - - socketOps::tSOCKET sC = ::accept(s, (sockaddr*)&client_addr, &len); - if (sC != socketOps::cSOCKET_ERROR) - { - port = ntohs(client_addr.sin_port); - address = inet_ntoa(client_addr.sin_addr); - } - return (int)sC; -} - -int socketOps::accept(tSOCKET s,endpoint &e) throw() -{ - return socketOps::accept(s,e.m_address,e.m_port); -} - -int socketOps::acceptTHROW(tSOCKET s, std::string &address, u_short &port, bool nonblocking) throw(std::runtime_error) -{ - socketOps::tSOCKET sC = socketOps::accept(s, address, port); - if (sC == socketOps::cSOCKET_ERROR) - { - if (!nonblocking) - { - throw std::runtime_error(socketOps::errMsg()); - } - - int e = socketOps::errCode(); -#ifdef _WIN32 - if ((e == WSAEINPROGRESS) || (e == WSAEWOULDBLOCK)) - { - return (int)socketOps::cSOCKET_ERROR; - } -#else - if ((e == EWOULDBLOCK) || (e == ECONNABORTED) || (e == EINTR)) - { - return socketOps::cSOCKET_ERROR; - } -#endif - throw std::runtime_error("Could not call accept() on socket because " + socketOps::errMsg(e)); - } - - return (int)sC; -} - -int socketOps::acceptTHROW(tSOCKET s, endpoint &e, bool nonblocking) throw(std::runtime_error) -{ - return socketOps::acceptTHROW(s, e.m_address, e.m_port, nonblocking); -} - -void socketOps::listenTHROW(tSOCKET s, int backlog) throw(std::runtime_error) -{ - if (::listen(s, backlog) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not call listen() on socket because " + socketOps::errMsg()); - } -} - -int socketOps::getsockname(tSOCKET s, std::string &address, u_short &port) throw() -{ - sockaddr_in in4 = {0}; -#ifdef _WIN32 - int in4len = sizeof(in4); -#else - socklen_t in4len = sizeof(in4); -#endif - - int result = ::getsockname(s,(sockaddr*)&in4,&in4len); - if (result != socketOps::cSOCKET_ERROR) - { - port = ntohs(in4.sin_port); - address = inet_ntoa(in4.sin_addr); - } - return result; -} - -int socketOps::getsockname(tSOCKET s,endpoint &e) throw() -{ - return socketOps::getsockname(s, e.m_address, e.m_port); -} - -void socketOps::getsocknameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error) -{ - if (socketOps::getsockname(s, e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::getsocknameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error) -{ - if (socketOps::getsockname(s, address, port) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -int socketOps::getpeername(tSOCKET s, std::string &address, u_short &port) throw() -{ - address = ""; - port = 0; - sockaddr_in in4 = {0}; -#ifdef _WIN32 - int in4len = sizeof(in4); -#else - socklen_t in4len = sizeof(in4); -#endif - - int result = ::getpeername(s, (sockaddr*)&in4,&in4len); - if (result != socketOps::cSOCKET_ERROR) - { - port = ntohs(in4.sin_port); - address = inet_ntoa(in4.sin_addr); - } - return result; -} - -int socketOps::getpeername(tSOCKET s, endpoint &e) throw() -{ - return socketOps::getpeername(s, e.m_address, e.m_port); -} - -void socketOps::getpeernameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error) -{ - if (socketOps::getpeername(s, e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::getpeernameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error) -{ - if (socketOps::getpeername(s, address, port) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -// accepts IPv4 or IPv6 -int socketOps::addressToHostName(const std::string &address, u_short port, std::string &hostname) throw() -{ - struct addrinfo *result/*, hints = {AI_PASSIVE | AI_CANONNAME, AF_INET, SOCK_STREAM}*/; - - std::string portS = tos(port); - int err = ::getaddrinfo(address.c_str(),portS.c_str(),0,&result); - if ((!err) && result) - { - char h[NI_MAXHOST + 1] = {0}; - err = ::getnameinfo(result->ai_addr, (int)result->ai_addrlen, h, NI_MAXHOST, 0, 0, 0); - hostname = h; - ::freeaddrinfo(result); - } - return err; -} - -int socketOps::addressToHostName(const endpoint &e, std::string &hostname) throw() -{ - return socketOps::addressToHostName(e.m_address, e.m_port, hostname); -} - -void socketOps::addressToHostNameTHROW(const std::string &address, u_short port, std::string &hostname) throw(std::runtime_error) -{ - if (socketOps::addressToHostName(address, port, hostname) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::addressToHostNameTHROW(const endpoint &e, std::string &hostname) throw(std::runtime_error) -{ - socketOps::addressToHostNameTHROW(e.m_address, e.m_port, hostname); -} - -int socketOps::hostNameToAddress(std::string &address, const std::string &hostname, u_short port) throw(std::runtime_error) -{ - struct addrinfo *result, hints = {AI_PASSIVE | AI_CANONNAME, AF_INET, SOCK_STREAM}; - address = ""; - - std::string portS = tos(port); - int err = ::getaddrinfo(hostname.c_str(), (port ? portS.c_str() : 0), &hints, &result); - if ((!err) && result) - { - address = ::inet_ntoa(((sockaddr_in*)(result->ai_addr))->sin_addr); - if (!address.empty() && address.find("0.") == 0) - { - address = ""; - } - ::freeaddrinfo(result); - } - return err; -} - -std::string socketOps::hostNameToAddress(const std::string &hostname, u_short port) throw(std::runtime_error) -{ - std::string address; - hostNameToAddress(address, hostname, port); - return address; -} - -std::string socketOps::hostNameToAddressTHROW(const std::string &hostname, u_short port) throw(std::runtime_error) -{ - std::string address; - if (hostNameToAddress(address, hostname, port)) - { - throw std::runtime_error(socketOps::errMsg()); - } - return address; -} - -#ifdef _WIN32 -LPFN_WSAPOLL fnWSAPoll = NULL; -typedef unsigned long nfds_t; - -static void add_to_fd_set_fntr(const socketOps::tSOCKET s, fd_set *fdset) throw() -{ - FD_SET(s, fdset); -} -#else -#define fnWSAPoll poll -#endif - -#include -int socketOps::socketSelect(std::set &readSockets, std::set writeSockets, const int timeout) throw() -{ - //ELOG("socketSelect: " + tos(readSet.size()) + " - " + tos(writeSet.size()) + " - " + tos(timeout)); - -#ifdef _WIN32 - if (!fnWSAPoll) - { - fd_set readSet; - fd_set writeSet; - fd_set excepSet; - FD_ZERO(&readSet); - FD_ZERO(&writeSet); - FD_ZERO(&excepSet); - for_each(readSockets.begin(), readSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &readSet)); - for_each(writeSockets.begin(), writeSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &writeSet)); - for_each(readSockets.begin(), readSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &excepSet)); - for_each(writeSockets.begin(), writeSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &excepSet)); - - // as we're workig in milliseconds then we need to convert to - // provide select the timeout that is wanted as a timeval - struct timeval tm = {(timeout / 1000), ((timeout % 1000) * 1000)}; - // The Windows version ignores the first arg, no need to calculate it - return ::select(0, &readSet, &writeSet, &excepSet, &tm); - } -#endif - - size_t i = 0; - nfds_t length = (nfds_t)(readSockets.size() + writeSockets.size()); - std::vector dataSet (length); - - for (std::set::iterator it = readSockets.begin(); it != readSockets.end(); ++it) - { - dataSet[i].events = POLLIN; - dataSet[i++].fd = *it; - } - - for (std::set::iterator it = writeSockets.begin(); it != writeSockets.end(); ++it) - { - dataSet[i].events = POLLOUT; - dataSet[i++].fd = *it; - } - - return fnWSAPoll (&dataSet[0], length, timeout); -} - -#ifdef _WIN32 -/*------------------------------------------------------------------------- - * - * This is a replacement version of pipe for Win32 which allows - * returned handles to be used in select(). Note that read/write calls - * must be replaced with recv/send. - * - * - *------------------------------------------------------------------------- - */ - -int pgpipe(int handles[2]) -{ - SOCKET s = {0}; - struct sockaddr_in serv_addr = {0}; - int len = sizeof(serv_addr); - - handles[0] = handles[1] = (int)INVALID_SOCKET; - - if ((s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) - { - return -1; - } - - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(0); - serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - if (::bind(s, (SOCKADDR *)&serv_addr, len) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if (::listen(s, 1) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if (::getsockname(s, (SOCKADDR *)&serv_addr, &len) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if ((handles[1] = (int)::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) - { - ::closesocket(s); - return -1; - } - - if (::connect(handles[1], (SOCKADDR *)&serv_addr, len) == socketOps::cSOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if ((handles[0] = (int)::accept(s, (SOCKADDR *)&serv_addr, &len)) == INVALID_SOCKET) - { - ::closesocket(handles[1]); - handles[1] = (int)INVALID_SOCKET; - ::closesocket(s); - return -1; - } - - ::closesocket(s); - return 0; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h b/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h deleted file mode 100644 index 10ea2124..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h +++ /dev/null @@ -1,182 +0,0 @@ -#pragma once -#ifndef _socketOps_H_ -#define _socketOps_H_ - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif -#include -#include "stl/stringUtils.h" -#include -#include -#include -#include -#include - -using namespace std; - -/* - socketOps namespace - - Encased in this namespace is a collection of constants, types and functions - to help bridge the gap between Win32 and Unix socket implementations, and also - to simplify some socket coding. - - Since the Win32 and Unix berkeley socket implementations are extremely similar, I - felt that a collection of helper functions were of more use, and more flexible, than - full blown socket wrapper classes. -*/ - -namespace socketOps -{ -#ifdef _WIN32 - typedef SOCKET tSOCKET; - extern const SOCKET cINVALID_SOCKET; - extern const SOCKET cSOCKET_ERROR; - //#define EINPROGRESS WSAEINPROGRESS - //#define EWOULDBLOCK WSAEWOULDBLOCK - #define SOCKETOPS_WOULDBLOCK WSAEWOULDBLOCK -#else - typedef int tSOCKET; - extern const int cINVALID_SOCKET; - extern const int cSOCKET_ERROR; - #define WSAEINPROGRESS EINPROGRESS - #define WSAEWOULDBLOCK EWOULDBLOCK - #define SOCKETOPS_WOULDBLOCK EWOULDBLOCK -#endif - - // socket endpoint - struct endpoint - { - std::string m_address; - u_short m_port; - - endpoint() : m_port(0) {} - endpoint(const std::string &address, u_short port) : m_address(address), m_port(port) {} - - bool operator==(const endpoint &e) const throw() - { - return ((m_address == e.m_address) && (m_port == e.m_port)); - } - - bool operator<(const endpoint &e) const throw() - { - if (m_address < e.m_address) return true; - if (m_address > e.m_address) return false; - if (m_port < e.m_port) return true; - if (m_port > e.m_port) return false; - return false; - } - - std::string toString() const throw(); // for messages - }; - - std::string errMsg(int code) throw(); - int errCode() throw(); - inline std::string errMsg() throw() { return socketOps::errMsg(socketOps::errCode()); } - - // createTCPSocket: creates a standard TCP/IP stream socket. The "throw" version - // will throw an exception if an error occurs instead of returning cSOCKET_ERROR - tSOCKET createTCPSocket() throw(); - tSOCKET createTCPSocketTHROW() throw(std::runtime_error); - - // setNonblock: non blocking is set different under unix and windows. These calls - // hide the different. First version returns the typical cSOCKET_ERROR when - // there is a problem. Second will throw an exception instead - int setNonblock(tSOCKET s,bool nonblock) throw(); - void setNonblockTHROW(tSOCKET s,bool nonblock) throw(std::runtime_error); - - // closeTCPSocket: does a blocking shutdown() and close() - void closeTCPSocket(tSOCKET s) throw(); - void forgetTCPSocket(tSOCKET &s) throw(); // similar, but checks s first and then clear it - - // connect: connects are the same across platforms. These just simplify the calls - // addresses for these calls most be #.#.#.# - int connect(tSOCKET s, const std::string &address, u_short port) throw(); - int connect(tSOCKET s, const endpoint &e) throw(); - void connectTHROW(tSOCKET s, const std::string &address, u_short port) throw(std::runtime_error); - void connectTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error); - - // bind: binds are the same across platforms. These just simplify the calls - tSOCKET bind(tSOCKET s, u_short port, const std::string &address = "") throw(); - tSOCKET bind(tSOCKET s, const endpoint &e) throw(); - void bindTHROW(tSOCKET s, u_short port, const std::string &address = "") throw(std::runtime_error); - void bindTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error); - - // note: for non-blocking accepts, the various "errno" errors can be different - // under different OS's. If you use the calls that do not throw exception you - // will have to handle these differences yourself. If you call the ones that - // throw, I try to handle it for you. In these calls, if the nonblocking parameter - // is true, the call will return cSOCKET_ERROR if accept has nothing to do (returns - // EWOULDBLOCK or similar). If a REAL error occurs, then it throws an exception. - int accept(tSOCKET s, endpoint &e) throw(); - int accept(tSOCKET s, std::string &address, u_short &port) throw(); - int acceptTHROW(tSOCKET s, endpoint &e, bool nonblocking) throw(std::runtime_error); - int acceptTHROW(tSOCKET s, std::string &address, u_short &port, bool nonblocking) throw(std::runtime_error); - - // listen: helper func that throws an exception instead of returning an error code - void listenTHROW(tSOCKET s, int backlog = SOMAXCONN) throw(std::runtime_error); - - // waiting on a non-blocking connect call is messy. Use this call to avoid - // the muck - typedef enum { NBC_ERROR, NBC_INPROGRESS, NBC_CONNECTED } nonBlockConnect_t; - nonBlockConnect_t nonBlockingConnectWait(tSOCKET s, std::string &error) throw(); - - int socketSelect(std::set &readSockets, std::set writeSockets, const int timeout) throw(); - - int getsockname(tSOCKET s, endpoint &e) throw(); - int getsockname(tSOCKET s, std::string &address, u_short &port) throw(); - void getsocknameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error); - void getsocknameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error); - - int getpeername(tSOCKET s, endpoint &e) throw(); - int getpeername(tSOCKET s, std::string &address, u_short &port) throw(); - void getpeernameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error); - void getpeernameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error); - - int addressToHostName(const endpoint &e, std::string &hostname) throw(); - int addressToHostName(const std::string &address, u_short port, std::string &hostname) throw(); - void addressToHostNameTHROW(const endpoint &e, std::string &hostname) throw(std::runtime_error); - void addressToHostNameTHROW(const std::string &address, u_short port, std::string &hostname) throw(std::runtime_error); - - int hostNameToAddress(std::string &address, const std::string &hostname, u_short port = 0) throw(std::runtime_error); - std::string hostNameToAddress(const std::string &hostname, u_short port = 0) throw(std::runtime_error); - std::string hostNameToAddressTHROW(const std::string &hostname, u_short port = 0) throw(std::runtime_error); -} - -#ifdef _WIN32 -/*------------------------------------------------------------------------- - * - * This is a replacement version of pipe for Win32 which allows - * returned handles to be used in select(). Note that read/write calls - * must be replaced with recv/send. - * - * - *------------------------------------------------------------------------- - */ -int pgpipe(int handles[2]); -#endif - -#ifndef _WIN32 -#define pgpipe(a) pipe(a) -#define piperead(a,b,c) read(a,b,c) -#define pipewrite(a,b,c) write(a,b,c) -#define pipeclose(a) { ::shutdown(a,2); ::close(a);} -#else -#define piperead(a,b,c) recv(a,b,c,0) -#define pipewrite(a,b,c) send(a,b,c,0) -#define pipeclose(a) { ::shutdown(a,SD_BOTH); ::closesocket(a); } -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp b/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp deleted file mode 100644 index 75c0d492..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp +++ /dev/null @@ -1,240 +0,0 @@ -#include "urlUtils.h" -#include "stl/stringUtils.h" -#include -#include -#ifdef _WIN32 -#include -#define snprintf _snprintf -#define unused_attribute -#else -#include -#include -#include -#define _ASSERTE assert -#define unused_attribute __attribute__((unused)) -#endif - -using namespace std; -using namespace stringUtil; - -static string gExcluded = " <>#%\"{}|\\^[]`"; -static string gReserved = ";/?:@&=+$,"; -static string gMark = "-_.!~*'()"; -static string gDigit = "0123456789"; -static string gLowAlpha = "abcdefghijklmnopqrstuvwxyz"; -static string gHiAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static string gUnreserved_RFC3986 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~"; -static string gReserved_RFC3986 = "!*'();:@&=+$,/?%#[]"; - -template -static set setunion(const set &s1, const set &s2) -{ - set result(s1); - result.insert(s2.begin(), s2.end()); - return result; -} - -static set gSetExcluded(gExcluded.begin(), gExcluded.end()); -static set gSetReserved(gReserved.begin(), gReserved.end()); -static set gSetExcludedAndReserved(setunion(gSetExcluded, gSetReserved)); -static set gSetMark(gMark.begin(), gMark.end()); -static set gSetLowAlpha(gLowAlpha.begin(), gLowAlpha.end()); -static set gSetHiAlpha(gHiAlpha.begin(), gHiAlpha.end()); -static set gSetDigit(gDigit.begin(), gDigit.end()); -static set gSetAlpha(setunion(gSetLowAlpha, gSetHiAlpha)); -static set gSetAlphanum(setunion(gSetAlpha, gSetDigit)); -static set gSetUnreserved(setunion(gSetAlphanum, gSetMark)); -static set gSetUnreserved_RFC3986(gUnreserved_RFC3986.begin(), gUnreserved_RFC3986.end()); -static set gSetReserved_RFC3986(gReserved_RFC3986.begin(), gReserved_RFC3986.end()); - -//////////////////////////////////////////////// -////////// Escaping Funcs ////////////////////// -/////////////////////////////////////////////// - -// convert a character to its hex representation -static string escapeChar(__uint8 c) throw() -{ - char buf[8] = {0}; - int len unused_attribute = snprintf(buf, sizeof(buf), "%%%02X", (int)c); - _ASSERTE(len == 3); - return buf; -} - -// convert the char if it's in the set -static string escapeIfInSet(char c,const set &st) throw() -{ - return (st.find(c) == st.end() ? string(1, c) : escapeChar(c)); -} - -static string escapeIfNotInSet(char c, const set &st) throw() -{ - return (st.find(c) == st.end() ? escapeChar(c) : string(1, c)); -} - -template -static string escapeString(const STYPE &s, const set &st, ESC func) throw() -{ - string result; - for (typename STYPE::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += func(*i,st); - } - return result; -} - -string urlUtils::escape(const std::string &s) throw() -{ - return escapeString(s, gSetExcludedAndReserved, escapeIfInSet); -} - -string urlUtils::escapeURI_RFC3986(const uniString::utf8 &s) throw() -{ - return escapeString(s, gSetUnreserved_RFC3986, escapeIfNotInSet); -} - -///////////////////////////////////////////////////// -//////////// Unescaping funcs ////////////////////// -//////////////////////////////////////////////////// - -// convert %xx to a character -inline char unescapeSequence(const string &s) throw() -{ - _ASSERTE(s.size() == 3); - _ASSERTE(s[0] == '%' && isxdigit(s[1]) && isxdigit(s[2])); - unsigned int v = 0; - sscanf(s.c_str(), "%%%02x", &v); - return (char)v; -} - -uniString::utf8 urlUtils::unescapeString(const string &s) throw() -{ - string result; - string escTok; - int ccnt(0); - - for (string::const_iterator i = s.begin(); i != s.end(); ++i) - { - bool escChar(false); - switch (ccnt) - { - case 0: - { - escChar = ((*i) == '%'); - break; - } - case 1: - { - escChar = (isxdigit(*i) ? true : false); - break; - } - case 2: - { - escChar = (isxdigit(*i) ? true : false); - break; - } - } - - if (escChar) - { - escTok += (*i); - ++ccnt; - } - else - { - result += escTok; - ccnt = 0; - if ((*i) == '+') - { - result += " "; - } - else - { - result += (*i); - } - } - if (ccnt == 3) - { - result += unescapeSequence(escTok); - escTok = ""; - ccnt = 0; - } - } - - result += escTok; - return uniString::utf8(result); -} - -//////////////////////////////////////////// -/////////// Classes //////////////////////// -string urlUtils::urlQueryEntry::escape() const throw() -{ - string result(escapeString(m_entry.first, gSetExcludedAndReserved, escapeIfInSet)); - - if (!m_entry.second.empty()) - { - result += "=" + escapeString(m_entry.second, gSetExcludedAndReserved, escapeIfInSet); - } - - return result; -} - -urlUtils::urlQueryEntry urlUtils::urlQueryEntry::parse(const string &s) throw() -{ - urlUtils::urlQueryEntry result; - - if (!s.empty()) - { - string::size_type pos = s.find("="); - result.m_entry.first = unescapeString(s.substr(0,pos)); - result.m_entry.second = (pos == string::npos ? "" : unescapeString(s.substr(pos+1))); - } - - return result; -} - -string urlUtils::urlQuery::escape() const throw() -{ - string result; - - for (vector::const_iterator i = m_query.begin(); i != m_query.end(); ++i) - { - result += (*i).escape(); - if (i + 1 != m_query.end()) - { - result += "&"; - } - } - - return result; -} - -urlUtils::urlQuery urlUtils::urlQuery::parse(const std::string &sin) throw() -{ - urlUtils::urlQuery result; - parse(sin, result); - return result; -} - -void urlUtils::urlQuery::parse(const std::string &sin, urlQuery &q) throw() -{ - q.clear(); - string s(sin); - - while (s != "") - { - if (!s.empty()) - { - string::size_type pos = s.find("&"); - q.m_query.push_back(urlUtils::urlQueryEntry::parse(s.substr(0, pos))); - if (pos == string::npos) - { - break; - } - s = s.substr(pos + 1); - } - else - { - break; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h b/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h deleted file mode 100644 index 0dfa344e..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h +++ /dev/null @@ -1,196 +0,0 @@ -#pragma once -#ifndef _urlUtils_H_ -#define _urlUtils_H_ - -#include -#include -#include -#include -#include -#include "unicode/uniString.h" -#include "stl/stringUtils.h" - -//*************************************************************************// -/* urlUtils - - Collection of classes to help create properly escaped URLs, and to - parse out and convert escaped URLs (see RFC 2396). - - 1) Creating a properly escaped url - - Create an urlBuilder object. Add the query data to it. Call escape() to - retrieve the entire URL as a properly escaped string. - - urlBuilder ub("http",urlAuthority("127.0.0.1","80","neil%%%radisch"),"/this/is/a/test"); - ub.addQueryEntry(urlQueryEntry("full name","Neil Mark Radisch")); - ub.addQueryEntry(urlQueryEntry("flag","")); - ub.addQueryEntry(urlQueryEntry("wierd_stuff","!@#$%^&&&===\"\'*()")); - cout << ub.escape() << endl; // print escaped url to screen - - 2) Parse out query data from an escaped url - - These utilities do not parse out a complete url. They were designed - to work in conjunction with the mclib webserver utility which - takes care of parsing out everything up to the query string. As such, - the parsing here is limited to the query. - - urlQuery uq(urlQuery::parse(getEscapedQueryString())); // parse the query string - // now walk through the results and print to screen - for (urlQuery::const_iterator i = uq.begin(); i != uq.end(); ++i) - { - cout << "key = " << (*i).getKey() << endl; - cout << "value = " << (*i).getValue() << endl; - cout << endl; - } -*/ -//*************************************************************************// - -namespace urlUtils { - - class urlQueryEntry - { - std::pair m_entry; - public: - urlQueryEntry(){} - template // can be string or utf8 - urlQueryEntry(const KEY &key, const VALUE &value) - :m_entry(key, value){} - urlQueryEntry(const urlQueryEntry &uqe) - :m_entry(uqe.m_entry){} - urlQueryEntry& operator = (const urlQueryEntry &uqe) - { m_entry = uqe.m_entry; return *this; } - bool operator == (const urlQueryEntry &uqe) const throw() { return m_entry == uqe.m_entry; } - - // set with unescaped data - template // string or utf8 - void set(const KEY &key, const VALUE &value) - { m_entry = std::pair(key, value); } - - // return query as escaped string - std::string escape() const throw(); - - // parse from escaped data - static urlQueryEntry parse(const std::string &s) throw(); - - // get unescaped values - std::pair get() const throw() { return m_entry; } - uniString::utf8 getKey() const throw() { return m_entry.first; } - uniString::utf8 getValue() const throw() { return m_entry.second; } - }; - - class urlQuery - { - std::vector m_query; - public: - typedef std::vector::iterator iterator; - typedef std::vector::const_iterator const_iterator; - - urlQuery(){} - bool operator==(const urlQuery &uq) const throw() { return m_query == uq.m_query; } - - void addQueryEntry(const urlQueryEntry &uqe) { m_query.push_back(uqe); } - void addQueryEntry(const std::string &key, const std::string &value) { m_query.push_back(urlQueryEntry(key, value)); } - void addQueryEntry(const uniString::utf8 &key, const uniString::utf8 &value) { m_query.push_back(urlQueryEntry(key, value)); } - std::string escape() const throw(); - bool empty() const throw() { return m_query.empty(); } - size_t size() const throw() { return m_query.size(); } - urlQueryEntry& operator[](size_t index) { return m_query[index]; } - iterator begin() throw() { return m_query.begin(); } - iterator end() throw() { return m_query.end(); } - const_iterator begin() const throw() { return m_query.begin(); } - const_iterator end() const throw() { return m_query.end(); } - void clear() throw() { m_query.clear(); } - - static urlQuery parse(const std::string &s) throw(); - static void parse(const std::string &s, urlQuery &q) throw(); - - void parseString(const std::string &s) throw() { parse(s,*this); } - - urlQuery::const_iterator findKey(const uniString::utf8 &key) const throw() - { - for (std::vector::const_iterator i = m_query.begin(); i != m_query.end(); ++i) - { - if ((*i).getKey() == key) - return i; - } - return m_query.end(); - } - - bool hasKey(const uniString::utf8 &key) const throw() { return (findKey(key) != m_query.end()); } - - template - T keyValue(const uniString::utf8 &key,const T &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? (*i).getValue() : deflt); - } - template - T keyValue(const uniString::utf8 &key) const throw() - { - return keyValue(key,T()); - } - }; - - template<> - inline bool urlQuery::keyValue(const uniString::utf8 &key, const bool &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - if (i == m_query.end()) - { - return deflt; - } - - uniString::utf8 v = (*i).getValue(); - while (!v.empty() && stringUtil::safe_is_space(v[0])) - { - v = v.substr(1); - } - if (v.empty()) - { - return deflt; - } - return (v[0] == 't' || v[0] == 'T' || v[0] == '1' || v[0] == 'y' || v[0] == 'Y'); - } - - template<> - inline int urlQuery::keyValue(const uniString::utf8 &key, const int &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? atoi((const char *)(*i).getValue().c_str()) : deflt); - } - - template<> - inline long urlQuery::keyValue(const uniString::utf8 &key, const long &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? atol((const char *)(*i).getValue().c_str()) : deflt); - } - - template<> - inline unsigned int urlQuery::keyValue(const uniString::utf8 &key, const unsigned int &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? (unsigned int)atol((const char *)(*i).getValue().c_str()) : deflt); - } - -#ifdef _WIN32 - template<> - inline __int64 urlQuery::keyValue(const uniString::utf8 &key, const __int64 &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? _atoi64((const char *)(*i).getValue().c_str()) : deflt); - } -#endif - - template<> - inline bool urlQuery::keyValue(const uniString::utf8 &key) const throw() - { - return keyValue(key, false); - } - - std::string escape(const std::string &s) throw(); - uniString::utf8 unescapeString(const std::string &s) throw(); - std::string escapeURI_RFC3986(const uniString::utf8 &s) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/yp2.cpp b/Src/Plugins/DSP/sc_serv3/yp2.cpp deleted file mode 100644 index 8e7fd5d0..00000000 --- a/Src/Plugins/DSP/sc_serv3/yp2.cpp +++ /dev/null @@ -1,1233 +0,0 @@ -#ifdef _WIN32 -#include -#endif -#include -#include "cpucount.h" -#include "yp2.h" -#include "updater.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "aolxml/aolxml.h" -#include "bandwidth.h" -#include "streamData.h" -#include "stats.h" -#include "metadata.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_YP2Lock; -static yp2 *gYP2 = 0; -extern int auth_enabled; - -// for production we don't need to prettify the xml for the YP -#ifdef XML_DEBUG -#define EOL "\n" -#else -#define EOL "" -#endif - -#define DEBUG_LOG(...) do { if (gOptions.yp2Debug()) DLOG(__VA_ARGS__); } while (0) - -#define ADD_CMD 0 -#define REM_CMD 1 -#define UPD_CMD 2 - -#define REQUEST_KEY m_userData_u -#define REQUEST_CMD m_userData_i -#define REQUEST_USR m_userData_p - -uniString::utf8 yp2::logString(const yp2::yp2SessionKey &key) throw() { return "key=" + tos(key); } - -yp2::stationInfo::stationInfo() throw() : m_updateFrequency(gOptions.ypReportInterval()), m_advertMode(0) -{ - m_allowSSL = -1; - m_allowAllFormats = -1; - m_allowMaxBitrate = 0; - m_allowBackupURL = -1; -} - - -/////////////////////////////////////////////////////////////////////////////////////////// -void yp2::updateYPBandWidthSent(webClient::request r) throw() -{ - // this effectively works out the size in the same manner - // as webclient::toRequest(..) does to build the request. - size_t total = r.m_content.size() + r.m_contentType.size() + - // 'POST' or 'GET' with '?' on the front - (r.m_method == webClient::request::POST ? 4 : 3) + - 64 + r.m_addr.size() + g_userAgent.size() + - (!r.m_content.empty() ? r.m_content.size() : 0); - - for (httpHeaderMap_t::const_iterator i = r.m_queryVariables.begin(); i != r.m_queryVariables.end(); ++i) - { - if (i != r.m_queryVariables.begin()) - { - ++total; - } - total += urlUtils::escapeURI_RFC3986((*i).first).size(); - if (!(*i).second.empty()) - { - total += 1 + urlUtils::escapeURI_RFC3986((*i).second).size(); - } - } - - if (!r.m_XFF.empty()) - { - total += 18 + r.m_XFF.size(); - } - - if ((r.m_method == webClient::request::POST) && r.m_content.empty()) - { - total += 48; - } - else if (!r.m_contentType.empty()) - { - total += 15 + r.m_contentType.size(); - } - - bandWidth::updateAmount(bandWidth::YP_SENT, total); -} - -size_t yp2::requestsInQueue() throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->queueEntries() : 0); -} - -yp2::yp2() throw() : webClient(YP2_LOGNAME) -{ - stackLock sml(g_YP2Lock); - - gYP2 = this; - m_addFailed = false; - m_ignoreAdd = false; - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - m_sessionKeyCounter = 1; -} - -yp2::~yp2() throw() -{ - stackLock sml(g_YP2Lock); - - gYP2 = 0; -} - -void yp2::getAddUpdateBody(webClient::request& r, const ypInfo& info, const bool update) throw() -{ - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - r.m_nonBlocking = 1; - r.m_contentType = "text/xml;charset=utf-8"; - r.REQUEST_KEY = info.key; - r.REQUEST_CMD = (!update ? ADD_CMD : UPD_CMD); - r.REQUEST_USR = reinterpret_cast(info.streamPublic); - r.m_sid = (!info.sid ? DEFAULT_CLIENT_STREAM_ID : info.sid); - r.m_XFF = metrics::metrics_verifyDestIP(gOptions); - - utf8 id; - if (update) - { - yp2_server_state &yp2ss = m_serverMap[info.key]; - id = ("" + yp2ss.m_serverID.escapeXML() + ""); - } - - const utf8 xml = "" EOL\ - "" EOL\ - "" EOL\ - "" + tos(::time(NULL)) + "" EOL\ - "" EOL\ - "" + tos(g_portForClients) + "" EOL\ - "" + getStreamPath(info.sid).escapeXML() + "" EOL\ - "" + tos(r.m_sid) + "" EOL\ - "" + gOptions.m_usedAlternatePorts + "" EOL\ - "" EOL\ - + ((!info.streamPublic && !gOptions.cdn().empty()) ? "1" : "") + EOL\ - "" + tos(info.bitrate) + "" EOL\ - "" + tos(info.samplerate) + "" EOL\ - "" + tos(info.vbr) + "" EOL\ - "" + info.mimeType.escapeXML() + "" EOL\ - + (update ? id : "") + EOL\ - "" + tos(info.streamArtwork) + "" EOL\ - "" + tos(info.playingArtwork) + "" EOL\ - "" + tos(info.peakClientConnections) + "" EOL\ - "" + (info.maxClientConnections > 0 ? tos(info.maxClientConnections) : "unlimited") + "" EOL\ - "" + info.authhash.escapeXML() + "" EOL\ - "" + info.sourceUser.escapeXML() + "" EOL\ - "" + (!info.sourceIdent.empty() ? info.sourceIdent.escapeXML() : "Legacy / Unknown") + "" EOL\ - "" + gOptions.getVersionBuildStrings().c_str() + "/" SERV_OSNAME"" EOL\ - "" + tos(gOptions.getCPUCount()) + "/" + tos(cpucount()) + "" EOL\ - + (!info.relayURL.empty() ? "" + info.relayURL.escapeXML() + "" : "") + EOL\ - + (update ? "" EOL\ - "" + tos(info.numListeners) + "" EOL\ - "" + tos(info.numUniqueListeners) + "" EOL\ - "" + tos(info.avgUserListenTime) + "" EOL\ - "" + tos(info.numberOfClientsConnectedMoreThanFiveMinutes) + "" EOL\ - "" + tos(info.numberOfClientConnectsSinceLastUpdate) + "" EOL\ - "" : "") + EOL\ - + (!info.songMetadataForYP2.empty() ? METADATA + EOL + - info.songMetadataForYP2 + EOL + E_METADATA : "") + EOL\ - "" EOL""; - - r.m_content.insert(r.m_content.end(), xml.begin(), xml.end()); - updateYPBandWidthSent(r); - - if (!update) - { - yp2_server_state &yp2ss = m_serverMap[info.key]; - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " add for " + logString(info.key) + - " [" + tos(yp2ss.m_addRetries) + "]" + eol() + xml); - - ++yp2ss.m_addRetries; - yp2ss.m_addState = ADD_PENDING; - yp2ss.m_lastOperationTime = ::time(NULL); - - queueRequest((yp2ss.m_lastRequest = r)); - } - else - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " " + logString(info.key) + eol() + xml); - queueRequest(r); - } -} - -/* - It is called before each update to confirm that the connection to yp is still good. - Normally this wouldn't really be necessary, but if yp goes down, we want to re-establish - without having to restart sc_serv -*/ -yp2::yp2SessionKey yp2::pvt_add(ypInfo& info) throw(exception) -{ - if (info.key == INVALID_SESSION_KEY) - { - info.key = m_sessionKeyCounter; - while (++m_sessionKeyCounter == INVALID_SESSION_KEY) {;} - } - - stackLock sml(m_serverMapLock); - - if (gOptions.yp2Debug()) - { - // either is okay since this is called continuouslly - serverMap_t::const_iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " No entry for " + logString(info.key)); - } - } - - yp2_server_state &yp2ss = m_serverMap[info.key]; - yp2ss.m_authHash = info.authhash; - yp2ss.m_sessionKey = info.key; - yp2ss.m_streamID = info.sid; - - assert(yp2ss.m_addState != ADD_REMOVEISSUED); - - bool must_delay_add = false; - if (yp2ss.m_addState == ADD_FAILED) - { - must_delay_add = true; - - static time_t ADD_RETRY_INTERVAL(gOptions.ypTimeout()); - time_t t = ::time(NULL); - if (t < yp2ss.m_lastOperationTime) // rollover compensation - { - yp2ss.m_lastOperationTime = t; - } - if (t - yp2ss.m_lastOperationTime >= ADD_RETRY_INTERVAL) - { - must_delay_add = false; - } - } - - // if state is NONE (just created) or failed, we try again - if (((yp2ss.m_addState == ADD_NONE) || (yp2ss.m_addState == ADD_FAILED) || - (yp2ss.m_addState == UPDATE_FAILED)) && (!must_delay_add)) - { - webClient::request r; - getAddUpdateBody(r, info, false); - return info.key; - } - return INVALID_SESSION_KEY; -} - -/* - remove() is called when a stream is destroyed, and this can lead to a number of cases - that interact with add - - 1) ADD_NONE - no problem here. Nothing has been done, nothing needs to be done. just remove table entry - 2) ADD_FAILED - again no problem. remove table entry - 3) ADD_SUCCEDED - again no problem. Send remove to yp(). Response function will remove table entry - 4) ADD_PENDING - This is trouble. We cannot queue a remove() because we don't have the - serverID yet. We also don't know what will happen with the pending add. - To deal with this we transition to the ADD_REMOVEISSUED state. - If add() succeeds and finds this state, we assume that - remove() occured, and then we post the actual remove to yp. If the subsequent add fails, it must - remove the table entry -*/ -void yp2::pvt_queue_remove(const ypInfo& info) throw() -{ - if (info.key != INVALID_SESSION_KEY) - { - webClient::request r; - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - r.m_nonBlocking = 0; - r.m_contentType = "text/xml;charset=utf-8"; - r.REQUEST_KEY = info.key; - r.REQUEST_CMD = REM_CMD; - r.REQUEST_USR = reinterpret_cast(info.streamPublic); - r.m_sid = (!info.sid ? DEFAULT_CLIENT_STREAM_ID : info.sid); - - yp2_server_state &yp2ss = m_serverMap[info.key]; - assert(yp2ss.m_sessionKey == info.key); - - utf8 cdn = ((!info.streamPublic && !gOptions.cdn().empty()) ? "1" EOL : ""); - utf8 xml = "" EOL\ - "" EOL\ - "" EOL\ - "" + tos(::time(NULL)) + "" EOL\ - "" EOL\ - "" + tos(g_portForClients) + "" EOL\ - "" + getStreamPath(info.sid).escapeXML() + "" EOL\ - "" + tos(r.m_sid) + "" EOL\ - "" + gOptions.m_usedAlternatePorts + "" EOL\ - "" EOL\ - + cdn +\ - "" + yp2ss.m_serverID.escapeXML() + "" EOL\ - + (info.peakClientConnections != (size_t)-1 ? "" + tos(info.peakClientConnections) + "" : "") + EOL\ - + (info.maxClientConnections != (size_t)-1 ? "" + - (info.maxClientConnections > 0 ? tos(info.maxClientConnections) : "unlimited") + "" : "") + EOL\ - "" + info.authhash.escapeXML() + "" EOL\ - "" EOL\ - ""; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " " + logString(info.key) + eol() + xml); - - r.m_content.insert(r.m_content.end(),xml.begin(),xml.end()); - - updateYPBandWidthSent(r); - queueRequest(r); - } -} - -void yp2::pvt_remove(ypInfo& info) throw(exception) -{ - assert(info.key != INVALID_SESSION_KEY); - - stackLock sml(m_serverMapLock); - - serverMap_t::iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - throwEx("Internal error. " + logString(info.key) + - " does not exist in server map."); - } - - yp2_server_state &yp2ss = (*i).second; - - assert(yp2ss.m_authHash == info.authhash); - assert(yp2ss.m_sessionKey == info.key); - - metrics::metrics_stream_down (yp2ss.m_streamID, yp2ss.m_stationInfo.m_radionomyID, - yp2ss.m_serverID, yp2ss.m_stationInfo.m_publicIP, info.streamStartTime); - - switch (yp2ss.m_addState) - { - case ADD_NONE: - case ADD_FAILED: - case UPDATE_FAILED: - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " erasing map entry for key=" + tos(info.key)); - m_serverMap.erase(info.key); - break; - } - - case ADD_PENDING: - { - yp2ss.m_addState = ADD_REMOVEISSUED; - break; - } - - case ADD_SUCCEEDED: - { - if (yp2ss.m_serverID.empty()) - { - throwEx("Internal error. serverID for " + - logString(info.key) + " is empty."); - } - - DEBUG_LOG(YP2_LOGNAME "Sending remove for " + (*i).second.logString()); - pvt_queue_remove(info); - break; - } - - case ADD_REMOVEISSUED: - default: - { - throwEx(YP2_LOGNAME + string(__FUNCTION__) + " Internal error. Bad state"); - break; - } - } -} - -// only send an update if everything is ok (ADD_SUCCEEDED) -yp2::updateResult yp2::pvt_update(const ypInfo& info) throw(exception) -{ - assert(info.key != INVALID_SESSION_KEY); - - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - throwEx("Internal error. " + logString(info.key) + " does not exist in server map."); - } - - yp2::updateResult result; - if ((*i).second.m_addState == ADD_SUCCEEDED) - { - if ((*i).second.m_serverID.empty()) - { - throwEx("Internal error. serverID for " + logString(info.key) + " is empty."); - } - - webClient::request r; - getAddUpdateBody(r, info, true); - result.m_requestQueued = 1; - } - else - { - // tinkered this after build 10 to prevent a mass of debug spam when we have an - // add fail so we will keep a track of the previous state and if it's different - assert(m_serverMap.find(info.key) != m_serverMap.end()); - yp2_server_state &yp2ss = m_serverMap[info.key]; - assert(yp2ss.m_sessionKey == info.key); - - static time_t ADD_RETRY_INTERVAL(gOptions.ypTimeout()); - time_t t = ::time(NULL); - if (t - yp2ss.m_lastOperationTime >= ADD_RETRY_INTERVAL) - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " add still pending for " + logString(info.key) + - " [" + tos((int)(*i).second.m_addState) + "] [" + tos((*i).second.m_addRetries)+ "]"); - - webClient::request r = yp2ss.m_lastRequest; - yp2ss.m_lastOperationTime = t; - ++yp2ss.m_addRetries; - - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - - r.m_XFF = metrics::metrics_verifyDestIP(gOptions); - - yp2ss.m_addState = ADD_PENDING; - yp2ss.m_lastOperationTime = ::time(NULL); - - updateYPBandWidthSent(r); - queueRequest((yp2ss.m_lastRequest = r)); - result.m_requestQueued = 1; - return result; - } - } - - result.m_maxYPInterval = (*i).second.m_stationInfo.m_updateFrequency; - - return result; -} - -yp2::addState_t yp2::pvt_addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - bool updateFail = false; - // if the YP cannot be resolved then allow clients to connect by faking a success - if (i != m_serverMap.end() && ((*i).second.m_addState == ADD_SUCCEEDED || (*i).second.m_addState == UPDATE_FAILED)) - { - updateFail = ((*i).second.m_addState == UPDATE_FAILED); - } - // allow clients if there was a YP failure or it's down for maintenance - addFailIgnore = (updateFail ? 2 : m_addFailed || (m_errorCode == YP_MAINTENANCE_CODE)); - errorCode = m_errorCode; - - return (i != m_serverMap.end() ? (*i).second.m_addState : ADD_NONE); -} - -/////////// response handling ////////////// -// handle response. retry_exceptions do just that. otherwise retry occurs in yptimeout seconds - -// what kind of response we get is unimportant, but we will log it if it's an error -void yp2::response_remove(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - serverMap_t::const_iterator i = m_serverMap.find(key); - if (i == m_serverMap.end()) - { - throwEx("Internal error in " + string(__FUNCTION__) + - " serverMap entry missing for " + logString(key)); - } - - const yp2_server_state &yp2ss = (*i).second; - size_t streamID = yp2ss.m_streamID; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Erasing serverMap entry for " + logString(key)); - assert(m_serverMap.find(key) != m_serverMap.end()); - m_serverMap.erase(key); - - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx("Remove error. " + logString(key) + - " code=" + tos(code) + " text=" + msg); - } - else - { - int error = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (error != -1) - { - ELOG(YP2_LOGNAME "De-listing stream #" + tos(streamID) + " failed. YP2 error code is " + - tos(error) + " [" + aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)"") + "]"); - utf8 detailed = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - if (!detailed.empty()) - { - ELOG(YP2_LOGNAME + detailed); - } - } - else - { - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Stream #" + tos(streamID) + " has been removed from the Shoutcast Directory."); - } - } - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - - forget(n); -} - -void updateDetail(aolxml::node *n, string path, utf8 &original) -{ - utf8 value = aolxml::subNodeText(n, path, (utf8)""); - if (!value.empty()) - { - original = value; - DEBUG_LOG ("changing setting " + path + " to " + value); - } -} - -// we generally don't care about the result here (from a state machine standpoint), except that -// a bad serverID error means we should probably re-add ourselves. We rely on the fact that streamData -// will initiate an add before every touch if things have failed, so we enter a failed state -void yp2::response_update(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - assert(m_serverMap.find(key) != m_serverMap.end()); - yp2_server_state &yp2ss = m_serverMap[key]; - assert(yp2ss.m_sessionKey == key); - - aolxml::node *n = 0; - - try - { - // we must check our state, to avoid going berserk if we've queued up a lot of updates - // and they are failing. This will cause addState to transition to ADD_FAILED, which causes - // "add" to be reposted and state to become ADD_PENDING. In this situation we don't want our - // queued updates to fail because that will force the state to ADD_FAILED which will queue up - // even more "adds" - if (yp2ss.m_addState == yp2::ADD_SUCCEEDED) - { - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx("Update error. " + logString(key) + - " code=" + tos(code) + " msg=" + msg); - } - - int error = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (error != -1) - { - ELOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + - " failed. YP2 error code is " + tos(error) + " [" + - aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)"") + "]"); - utf8 detailed = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - if (!detailed.empty()) - { - ELOG(YP2_LOGNAME + detailed); - } - - yp2ss.m_addState = UPDATE_FAILED; - } - else - { - updateDetail(n, "/yp/resp/id", yp2ss.m_serverID); - updateDetail(n, "/yp/resp/stnid", yp2ss.m_stationID); - - yp2ss.m_stationInfo.m_updateFrequency = aolxml::subNodeText(n, "/yp/resp/updatefreq", yp2ss.m_stationInfo.m_updateFrequency); - - updateDetail(n, "/yp/resp/backupserver", yp2ss.m_stationInfo.m_backupServer); - yp2ss.m_stationInfo.m_backupServersList.clear(); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/yp/resp/backupservers/server"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator b = nodes.begin(); b != nodes.end(); ++b) - { - yp2ss.m_stationInfo.m_backupServersList.push_back((*b)->pcdata()); - } - } - else - { - yp2ss.m_stationInfo.m_backupServersList.clear(); - } - updateDetail(n, "/yp/resp/publicip", yp2ss.m_stationInfo.m_publicIP); - updateDetail(n, "/yp/resp/station/name", yp2ss.m_stationInfo.m_streamTitle); - updateDetail(n, "/yp/resp/station/genre", yp2ss.m_stationInfo.m_streamGenre[0]); - updateDetail(n, "/yp/resp/station/genre2", yp2ss.m_stationInfo.m_streamGenre[1]); - updateDetail(n, "/yp/resp/station/genre3", yp2ss.m_stationInfo.m_streamGenre[2]); - updateDetail(n, "/yp/resp/station/genre4", yp2ss.m_stationInfo.m_streamGenre[3]); - updateDetail(n, "/yp/resp/station/genre5", yp2ss.m_stationInfo.m_streamGenre[4]); - updateDetail(n, "/yp/resp/station/logo", yp2ss.m_stationInfo.m_streamLogo); - updateDetail(n, "/yp/resp/station/url", yp2ss.m_stationInfo.m_broadcasterURL); - updateDetail(n, "/yp/resp/station/callsign", yp2ss.m_stationInfo.m_radionomyID); - yp2ss.m_stationInfo.m_advertMode = aolxml::subNodeText(n, "/yp/resp/station/admode", yp2ss.m_stationInfo.m_advertMode); - yp2ss.m_stationInfo.m_allowSSL = aolxml::subNodeText(n, "/yp/resp/station/allowssl", -1); - yp2ss.m_stationInfo.m_allowMaxBitrate = aolxml::subNodeText(n, "/yp/resp/station/allowmaxbitrate", 0); - yp2ss.m_stationInfo.m_allowBackupURL = aolxml::subNodeText(n, "/yp/resp/station/allowbackupurl", -1); - yp2ss.m_stationInfo.m_allowAllFormats = aolxml::subNodeText(n, "/yp/resp/station/allowallformats", -1); - - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + " succeeded."); - } - - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - - // YP overridable urls for anything to do with metrics, adverts, etc - updateDetail(n, "/yp/resp/meu", yp2ss.m_stationInfo.m_metrics_audience_url); - updateDetail(n, "/yp/resp/adu", yp2ss.m_stationInfo.m_metrics_adverts_url); - updateDetail(n, "/yp/resp/mer", yp2ss.m_stationInfo.m_metrics_reset_url); - updateDetail(n, "/yp/resp/aut", yp2ss.m_stationInfo.m_metrics_auth_url); - updateDetail(n, "/yp/resp/air", yp2ss.m_stationInfo.m_tunein_air_api_url); - updateDetail(n, "/yp/resp/tsu", yp2ss.m_stationInfo.m_targetspot_url); - - // this will ensure that the info from the update - // is set asap as this is needed for advert mode. - streamData *sd = streamData::accessStream(yp2ss.m_streamID); - if (sd) - { - sd->YP2_updateInfo(yp2ss.m_stationInfo); - sd->releaseStream(); - } - } - } - } - catch (const exception &) - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (m_errorCode != -1) - { - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)""); - m_errorMsgExtra = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - } - else - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 400); - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/status/statustext", utf8("Generic Error")); - m_errorMsgExtra = ""; - } - - ELOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + " failed. YP2 error code is " + - tos(m_errorCode) + " [" + m_errorMsg + "]"); - if (!m_errorMsgExtra.empty()) - { - ELOG(YP2_LOGNAME + m_errorMsgExtra); - } - - yp2ss.m_addState = UPDATE_FAILED; - } - - forget(n); -} - -/* - We have a special case if state of ADD_REMOVEISSUED. The streamData object called - yp2::remove() while the add was still pending. If we fail, then it doesn't matter, but if - we succeed, we have to post the remove command to yp to make sure we clean up after ourselves -*/ -void yp2::response_add(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - serverMap_t::iterator i = m_serverMap.find(key); - if (i == m_serverMap.end()) - { - throwEx("Internal error in " + string(__FUNCTION__) + - " serverMap entry missing for " + logString(key)); - } - - yp2_server_state &yp2ss = (*i).second; - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - - if (code != 200) - { - throwEx("Add error. " + logString(key) + - " code=" + tos(code) + " text=" + msg); - } - - // success case. Again there are two scenarios. If the serverMap state is ADD_REMOVEISSUED - // then remove() was called. We need to repost the remove since yp2::remove() won't actually - // issue it when the add has not succeeded. Otherwise, life is normal - if (yp2ss.m_addState != ADD_REMOVEISSUED) - { - aolxml::subNodeTextTHROW(n, "/yp/resp/id", yp2ss.m_serverID); - aolxml::subNodeTextTHROW(n, "/yp/resp/stnid", yp2ss.m_stationID); - - yp2ss.m_stationInfo.m_updateFrequency = aolxml::subNodeText(n, "/yp/resp/updatefreq", yp2ss.m_stationInfo.m_updateFrequency); - yp2ss.m_stationInfo.m_backupServer = aolxml::subNodeText(n, "/yp/resp/backupserver", (utf8)""); - yp2ss.m_stationInfo.m_backupServersList.clear(); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n, "/yp/resp/backupservers/server"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::iterator b = nodes.begin(); b != nodes.end(); ++b) - { - yp2ss.m_stationInfo.m_backupServersList.push_back((*b)->pcdata()); - } - } - yp2ss.m_stationInfo.m_publicIP = aolxml::subNodeText(n, "/yp/resp/publicip", (utf8)""); - aolxml::subNodeTextTHROW(n, "/yp/resp/station/name", yp2ss.m_stationInfo.m_streamTitle); - aolxml::subNodeTextTHROW(n, "/yp/resp/station/genre", yp2ss.m_stationInfo.m_streamGenre[0]); - - for (int i = 1; i < 5; i++) - { - yp2ss.m_stationInfo.m_streamGenre[i] = aolxml::subNodeText(n, "/yp/resp/station/genre" + tos(i + 1), yp2ss.m_stationInfo.m_streamGenre[i]); - } - - yp2ss.m_stationInfo.m_streamLogo = aolxml::subNodeText(n, "/yp/resp/station/logo", yp2ss.m_stationInfo.m_streamLogo); - yp2ss.m_stationInfo.m_broadcasterURL = aolxml::subNodeText(n, "/yp/resp/station/url", (utf8)""); - yp2ss.m_stationInfo.m_radionomyID = aolxml::subNodeText(n, "/yp/resp/station/callsign", (utf8)""); - yp2ss.m_stationInfo.m_advertMode = aolxml::subNodeText(n, "/yp/resp/station/admode", yp2ss.m_stationInfo.m_advertMode); - yp2ss.m_stationInfo.m_allowSSL = aolxml::subNodeText(n, "/yp/resp/station/allowssl", -1); - yp2ss.m_stationInfo.m_allowMaxBitrate = aolxml::subNodeText(n, "/yp/resp/station/allowmaxbitrate", 0); - yp2ss.m_stationInfo.m_allowBackupURL = aolxml::subNodeText(n, "/yp/resp/station/allowbackupurl", -1); - yp2ss.m_stationInfo.m_allowAllFormats = aolxml::subNodeText(n, "/yp/resp/station/allowallformats", -1); - - int peak = aolxml::subNodeText(n, "/yp/resp/peak", -1); - if (peak > 0) - { - stats::updatePeak(yp2ss.m_streamID, peak); - } - - yp2ss.m_addRetries = 0; - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - - yp2ss.m_addState = ADD_SUCCEEDED; - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Stream #" + tos(yp2ss.m_streamID) + " has been added to the Shoutcast Directory."); - } - - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - - // YP overridable urls for anything to do with metrics, adverts, etc - yp2ss.m_stationInfo.m_metrics_audience_url = aolxml::subNodeText(n, "/yp/resp/meu", (utf8)METRICS_AUDIENCE_URL); - yp2ss.m_stationInfo.m_metrics_adverts_url = aolxml::subNodeText(n, "/yp/resp/adu", (utf8)METRICS_ADVERTS_URL); - yp2ss.m_stationInfo.m_metrics_reset_url = aolxml::subNodeText(n, "/yp/resp/mer", (utf8)METRICS_RESET_URL); - yp2ss.m_stationInfo.m_metrics_auth_url = aolxml::subNodeText(n, "/yp/resp/aut", (utf8)DNAS_AUTH_URL); - yp2ss.m_stationInfo.m_targetspot_url = aolxml::subNodeText(n, "/yp/resp/tsu", (utf8)TARGETSPOT_URL); - - // this will ensure that the info from the update - // is set asap as this is needed for advert mode. - // as well as only doing metrics if the stream is - // still determined to be accessible at the time. - streamData *sd = streamData::accessStream(yp2ss.m_streamID); - if (sd) - { - metrics::metrics_stream_up (yp2ss.m_streamID, yp2ss.m_stationInfo.m_radionomyID, - yp2ss.m_serverID, yp2ss.m_stationInfo.m_publicIP, sd->getStartTime()); - - sd->YP2_updateInfo(yp2ss.m_stationInfo); - sd->releaseStream(); - } - - // we use this to look at the existing listeners and if - // any have m_group = -1 then we'll 'add' them to the - // metrics since they will otherwise not be known about - stats::catchPreAddClients(yp2ss.m_streamID); - } - else - { - // we're done but have to issue the actual remove command to YP - if (!iskilled()) - { - WLOG(YP2_LOGNAME "Remove called while add was pending. Re-issuing remove. " + logString(key)); - } - yp2ss.m_serverID = aolxml::subNodeText(n, "/yp/resp/id", (utf8)""); - - ypInfo info(key, yp2ss.m_streamID, yp2ss.m_authHash); - info.peakClientConnections = (size_t)-1; - info.maxClientConnections = (size_t)-1; - pvt_queue_remove(info); - } - } - catch(const exception &ex) - { - bool missing = false; - utf8 message = ex.what(); - // skip missing xml response entries to avoid user confusion - if (message.rfind(utf8(" missing")) == utf8::npos) - { - ELOG(string(YP2_LOGNAME) + message); - } - else - { - missing = true; - } - - // if failure occurs and the state was ADD_REMOVEISSUED, we have to delete the entry from the serverMap - if (yp2ss.m_addState == ADD_REMOVEISSUED) - { - m_serverMap.erase(key); - WLOG(YP2_LOGNAME "Remove called while add was pending. Deleting serverMap entry " + logString(key)); - } - else - { - yp2ss.m_addState = ADD_FAILED; - - m_errorCode = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (m_errorCode != -1) - { - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)""); - m_errorMsgExtra = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - } - else - { - if (!missing) - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 400); - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/status/statustext", utf8("Generic Error")); - m_errorMsgExtra = ""; - } - else - { - m_errorCode = YP_AUTH_ISSUE_CODE; - m_errorMsg = "Required authhash parameter is missing, please contact support to resolve this issue"; - m_errorMsgExtra = ""; - } - } - - ELOG(YP2_LOGNAME "Stream #" + tos(yp2ss.m_streamID) + " connection attempt " + - (m_errorCode == YP_MAINTENANCE_CODE ? "ignored" : "failed") + ". YP2 error code is " + - tos(m_errorCode) + " [" + m_errorMsg + "]"); - if (!m_errorMsgExtra.empty()) - { - ELOG(YP2_LOGNAME + m_errorMsgExtra); - } - } - } - - forget(n); -} - -void yp2::gotResponse(const request &q, const response &r) throw(exception) -{ - // if we've got a response then clear the pass-through flag - gYP2->m_addFailed = false; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + logString(q.REQUEST_KEY) + - " cmd=" + tos(q.REQUEST_CMD) + eol() + - "Response body=[" + eol() + r.m_body + "]" + - eol() + "Response code=[" + tos(r.m_resultCode) + "]"); - - bandWidth::updateAmount(bandWidth::YP_RECV, r.m_received); - - switch (q.REQUEST_CMD) - { - case ADD_CMD: - { - response_add(q, r); - break; - } - case REM_CMD: - { - response_remove(q, r); - break; - } - case UPD_CMD: - { - response_update(q, r); - break; - } - case CHECK_AUTH: - { - // store the response in a sanitised format for when it is then queried - authhashMap_t::iterator i = m_authhashMap.find(q.REQUEST_KEY); - if (i != m_authhashMap.end()) - { - (*i).second.m_response = r.m_body; - (*i).second.m_status = r.m_resultCode; - DEBUG_LOG(YP2_LOGNAME + (*i).second.m_response + " " + tos((*i).second.m_status)); - } - break; - } - case VER_CHECK: - { - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]), r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx("version check error. " + logString(q.REQUEST_KEY) + - " code=" + tos(code) + " text=" + msg); - } - else - { - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - } - } - catch(const exception &) - { - } - - forget(n); - break; - { - } - - forget(n); - break; - } - default: - { - ELOG(YP2_LOGNAME "Internal error. Unknown cmd value in response (" + tos(q.REQUEST_CMD) + ")"); - break; - } - } -} - -void yp2::gotFailure(const request &q) throw(exception) -{ - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + - logString(q.REQUEST_KEY) + " cmd=" + tos(q.REQUEST_CMD)); - - bandWidth::updateAmount(bandWidth::YP_RECV, q.m_received); - - switch (q.REQUEST_CMD) - { - case ADD_CMD: - case REM_CMD: - case UPD_CMD: - { - gYP2->m_errorCode = -1; - gYP2->m_addFailed = true; - break; - } - case CHECK_AUTH: - { - // we cannot assume we got anything back in the request if it failed - // so if we've got a pending action then we need to get it cancelled - // and direct people to the log for the cause as too messy otherwise - authhashMap_t::iterator i = m_authhashMap.find(q.REQUEST_KEY); - if (i != m_authhashMap.end()) - { - (*i).second.m_response = utf8("Unable to process the request. Check the server logs for more details."); - (*i).second.m_status = 669; - DEBUG_LOG(YP2_LOGNAME + (*i).second.m_response + " " + tos((*i).second.m_status)); - } - break; - } - default: - { - ELOG(YP2_LOGNAME "Internal error. Unknown cmd value in response (" + tos(q.REQUEST_CMD) + ")"); - break; - } - } -} - -yp2::yp2SessionKey yp2::add(ypInfo& info, const int creating) throw() -{ - stackLock sml(g_YP2Lock); - - yp2SessionKey result = INVALID_SESSION_KEY; - - try - { - // abort asap if there is no authhash present - if (info.authhash.empty()) - { - if (gYP2 && !gYP2->m_ignoreAdd) - { - gYP2->m_ignoreAdd = true; - throwEx((creating == 2 ? "Manual authhash creation for stream #" + - tos(info.sid) + " is required. Aborting listing the " - "stream in the Shoutcast Directory." : "No authhash " - "specified for stream #" + tos(info.sid) + ". Aborting " - "listing the stream in the Shoutcast Directory. ")); - } - } - else if (!isValidAuthhash(info.authhash)) - { - if (gYP2 && !gYP2->m_ignoreAdd) - { - gYP2->m_ignoreAdd = true; - throwEx("Invalid authhash specified for stream #" + tos(info.sid) + - ". Aborting listing the stream in the Shoutcast Directory."); - } - } - else - { - if (gYP2) - { - gYP2->m_ignoreAdd = false; - } - } - - if (!iskilled() && gYP2 && !gYP2->m_ignoreAdd) - { - result = gYP2->pvt_add(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - return result; -} - -void yp2::remove(ypInfo& info) throw() -{ - stackLock sml(g_YP2Lock); - - try - { - if (gYP2) - { - gYP2->pvt_remove(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } -} - -yp2::updateResult yp2::update(ypInfo& info) -{ - stackLock sml(g_YP2Lock); - - yp2::updateResult result; - result.m_maxYPInterval = gOptions.ypReportInterval(); - try - { - if (gYP2) - { - result = gYP2->pvt_update(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - return result; -} - -yp2::addState_t yp2::addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_addStatus(key, addFailIgnore, errorCode) : ADD_NONE); -} - -void yp2::pvt_runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw() -{ - int actionId = tempId.toInt(); - yp2::authhashResult authhash; - authhash.m_action = action; - m_authhashMap[actionId] = authhash; - - webClient::request r; - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - // adjust the YP path if using non-standard urls so authhash ones work - r.m_path = ((gOptions.ypPath() != utf8("/yp2")) ? "/yp" : "") + urlPath; - r.m_queryVariables = queryParameters; - r.REQUEST_KEY = actionId; - r.REQUEST_CMD = action; - - if (!content.empty()) - { - r.m_content.insert(r.m_content.end(), content.begin(), content.end()); - } - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + - logString(r.REQUEST_KEY) + " cmd=" + tos(r.REQUEST_CMD)); - - updateYPBandWidthSent(r); - queueRequest(r); -} - -void yp2::runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw() -{ - stackLock sml(g_YP2Lock); - - try - { - if (gYP2 && !queryParameters.empty() && !tempId.empty()) - { - gYP2->pvt_runAuthHashAction(tempId, action, urlPath, queryParameters, content); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } -} - -bool yp2::pvt_authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, const bool remove) throw() -{ - if (!tempId.empty()) - { - size_t actionId = tempId.toInt(); - authhashMap_t::const_iterator i = m_authhashMap.find(actionId); - if (i != m_authhashMap.end()) - { - // copy to the passed structure - info = (*i).second; - // and then remove from the map - if(remove) - { - m_authhashMap.erase(actionId); - } - return true; - } - } - return false; -} - -bool yp2::authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, const bool remove) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_authHashActionStatus(tempId, info, remove) : false); -} - -bool yp2::isValidAuthhash(uniString::utf8 authhash) -{ - if (authhash.empty() || (authhash.size() != 20 && authhash.size() != 36)) - return false; - - // check the authhash only contains - int n = -1; - const char *s = (char*)authhash.c_str(); - if (sscanf (s, "%*36[a-fA-F0-9-]%n", &n) == 0 && n == 36 && s[36] == '\0') // match 36-char GUID only - return true; - if (sscanf (s, "%*20[a-zA-Z0-9]%n", &n) == 0 && n == 20 && s[20] == '\0') // match 20-char Hash only - return true; - return false; -} - -int yp2::pvt_getSrvID(yp2SessionKey key) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - return (i != m_serverMap.end() ? (*i).second.m_serverID.toInt() : 0); -} - -int yp2::getSrvID(yp2SessionKey key) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_getSrvID(key) : 0); -} - -int yp2::pvt_getStnID(yp2SessionKey key) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - return (i != m_serverMap.end() ? (*i).second.m_stationID.toInt() : 0); -} - -int yp2::getStnID(yp2SessionKey key) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_getStnID(key) : 0); -} diff --git a/Src/Plugins/DSP/sc_serv3/yp2.h b/Src/Plugins/DSP/sc_serv3/yp2.h deleted file mode 100644 index d0111d94..00000000 --- a/Src/Plugins/DSP/sc_serv3/yp2.h +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#ifndef yp2_H_ -#define yp2_H_ - -#include "webClient.h" - -/* - The operational model for yp2 is somewhat different from that of yp1. - In yp1, there is no reason for the core of sc_serv to wait for result. The - only bit of information that is truly required for correct operation is the serverID - returned by addserv in yp1. This, however, is handled internally by the code dealing with - yp1 since any subsequent yp requests cannot be cleared until the addsrv succeeds and the - serverID is obtained. - - In yp2, the actual streaming to the client cannot proceed until the addition of the server - is complete, since some information like stream title and genre must be obtained from the - database. Therefore, we need to build some sort of waiting mechanism, but one that obviously - does not block processing since the responses from yp2 may not come as fast as required for - code that blocks. - -*/ - -#define YP2_LOGNAME "[YP] " -#define YP_MAINTENANCE_CODE 503 -#define YP_AUTH_ISSUE_CODE 123 -#define YP_NOT_VISIBLE 480 -#define YP_COMMS_FAILURE -1 - -class yp2: public webClient -{ -public: - // stationInfo data gets returned from YP in response to "add" request - struct stationInfo - { - int m_updateFrequency; - int m_advertMode; - int m_allowSSL; - int m_allowAllFormats; - int m_allowMaxBitrate; - int m_allowBackupURL; - int m_responseCode; - uniString::utf8 m_stationID; - uniString::utf8 m_serverID; - uniString::utf8 m_streamTitle; - uniString::utf8 m_streamGenre[5]; - uniString::utf8 m_streamLogo; - uniString::utf8 m_radionomyID; - uniString::utf8 m_advertType; - uniString::utf8 m_advertTrigger; - uniString::utf8 m_metrics_audience_url; - uniString::utf8 m_metrics_adverts_url; - uniString::utf8 m_metrics_reset_url; - uniString::utf8 m_metrics_auth_url; - uniString::utf8 m_tunein_air_api_url; - uniString::utf8 m_targetspot_url; - uniString::utf8 m_broadcasterURL; - uniString::utf8 m_backupServer; - std::vector m_backupServersList; - uniString::utf8 m_publicIP; - - uniString::utf8 logString() const throw() - { - return "title=" + m_streamTitle + " genre=" + m_streamGenre[0] + - " genre2=" + m_streamGenre[1] + " genre3=" + m_streamGenre[2] + - " genre4=" + m_streamGenre[3] + " genre5=" + m_streamGenre[4] + - " logo=" + m_streamLogo; - } - stationInfo() throw(); - }; - - typedef unsigned yp2SessionKey; - static const yp2SessionKey INVALID_SESSION_KEY=0; - - static uniString::utf8 logString(const yp2SessionKey &key) throw(); - - enum addState_t - { - ADD_NONE = 0, - ADD_PENDING = 1, - ADD_SUCCEEDED = 2, - ADD_FAILED = 3, - ADD_REMOVEISSUED = 4, // we issued a remove - UPDATE_FAILED = 5 - }; - - struct ypInfo - { - yp2SessionKey key; - - bool streamPublic; - bool streamArtwork; - bool playingArtwork; - bool vbr; - - size_t sid; - uniString::utf8 authhash; - - int bitrate; - int samplerate; - uniString::utf8 mimeType; - uniString::utf8 relayURL; - - size_t peakClientConnections; - size_t maxClientConnections; - - size_t numListeners; // update only - size_t numUniqueListeners; // update only - time_t avgUserListenTime; // update only - time_t streamStartTime; - size_t numberOfClientsConnectedMoreThanFiveMinutes; // update only - size_t numberOfClientConnectsSinceLastUpdate; // update only - - uniString::utf8 songMetadataForYP2; - uniString::utf8 sourceIdent; - uniString::utf8 sourceUser; - - ypInfo(const yp2SessionKey _key, const size_t _sid, const uniString::utf8& _authhash, - const bool _vbr = false, const bool _streamPublic = true, - const bool _streamArtwork = false, const bool _playingArtwork = false) : - key(_key), streamPublic(_streamPublic), streamArtwork(_streamArtwork), - playingArtwork(_playingArtwork), vbr(_vbr), sid(_sid), - authhash(_authhash), bitrate(0), samplerate(0), - peakClientConnections(0), maxClientConnections(0), - numListeners(0), numUniqueListeners(0), avgUserListenTime(0), - numberOfClientsConnectedMoreThanFiveMinutes(0), - numberOfClientConnectsSinceLastUpdate(0) { streamStartTime = 0; } - }; - - typedef enum - { - CREATE_AUTH = 3, - CHECK_AUTH = 4, - UPDATE_AUTH = 5, - //REMOVE_AUTH = 6, - ALLOW_AUTH = 7, - VER_CHECK = 8 - } authMethodState_t; - - // function result from call to update - struct updateResult - { - int m_maxYPInterval; // touch interval if no title change - int m_requestQueued; // if false, then "add" has not finished so this request was ignored - - updateResult() throw() : m_maxYPInterval(0), m_requestQueued(0) {} - }; - - // structures for handling the authhash management requests - struct authhashResult - { - int m_action; // action - create, check, update, remove - int m_restart; // should we restart the stream - size_t m_status; // status code from response - uniString::utf8 m_response; // response body back from the YP request - - authhashResult() throw() : m_action(0), m_restart(0), m_status(0), m_response("") {} - }; - - typedef std::map authhashMap_t; - authhashMap_t m_authhashMap; - -private: - struct yp2_server_state - { - yp2::stationInfo m_stationInfo; - - yp2SessionKey m_sessionKey; - - addState_t m_addState; - - uniString::utf8 m_serverID; // as assigne by YP - uniString::utf8 m_stationID; // as assigne by YP - - uniString::utf8 m_authHash; // needed for reposting removes - - size_t m_streamID; - - time_t m_lastOperationTime; // for error delays - - webClient::request m_lastRequest; // keep a copy of the last request incase it needs to be resent - - size_t m_addRetries; - - yp2_server_state() : m_sessionKey(INVALID_SESSION_KEY), m_addState(ADD_NONE), m_streamID(1), m_lastOperationTime(0), m_addRetries(0) {} - explicit yp2_server_state(const yp2SessionKey &key) : m_sessionKey(key), m_addState(ADD_NONE), m_streamID(1), m_lastOperationTime(0), m_addRetries(0) {} - - uniString::utf8 logString() const throw() - { - return yp2::logString(m_sessionKey) + " state=" + stringUtil::tos((int)m_addState) + " serverId=" + m_serverID + " " + m_stationInfo.logString(); - } - }; - - yp2SessionKey m_sessionKeyCounter; - int m_errorCode; // keeps a copy of the last YP response code (good or bad) - - typedef std::map serverMap_t; - serverMap_t m_serverMap; - uniString::utf8 m_errorMsg; - uniString::utf8 m_errorMsgExtra; - - AOL_namespace::mutex m_serverMapLock; - - bool m_addFailed; - bool m_ignoreAdd; - - virtual void gotResponse(const request &q, const response &r) throw(std::exception); - virtual void gotFailure(const request &q) throw(std::exception); - - void response_add(const request &q, const response &r) throw(std::exception); - void response_remove(const request &q, const response &r) throw(std::exception); - void response_update(const request &q, const response &r) throw(std::exception); - - void getAddUpdateBody(webClient::request& r, const ypInfo& info, const bool update) throw(); - - yp2SessionKey pvt_add(ypInfo& info) throw(std::exception); - - void pvt_queue_remove(const ypInfo& info) throw(); - - void pvt_remove(ypInfo& info) throw(std::exception); - - updateResult pvt_update(const ypInfo& info) throw(std::exception); - - addState_t pvt_addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw(); - - virtual uniString::utf8 name() const throw() { return "yp2"; } - - void pvt_runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw(); - - bool pvt_authHashActionStatus(const uniString::utf8 &tempId, authhashResult &info, const bool remove) throw(); - - int pvt_getSrvID(yp2SessionKey key) throw(); - int pvt_getStnID(yp2SessionKey key) throw(); - - static void updateYPBandWidthSent(webClient::request r) throw(); - -public: - yp2() throw(); - ~yp2() throw(); - - // return new key if yp2_server_state_key == YP2_UNDEFINED_SERVER_STATE_KEY - static yp2SessionKey add(ypInfo& info, const int creating) throw(); - - // return true if add has succeeded - static addState_t addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw(); - - static void remove(ypInfo& info) throw(); - - static updateResult update(ypInfo& info); - - // used in main during shutdown to wait for request queue to clear out - static size_t requestsInQueue() throw(); - - // used for managing authhashes within the dnas - static void runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content = "") throw(); - - static bool authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, bool remove) throw(); - - static bool isValidAuthhash(uniString::utf8 authhash); - - static int getSrvID(yp2SessionKey key) throw(); - static int getStnID(yp2SessionKey key) throw(); -}; - -#endif

@WK0s{M8*a>S0%k?*rsn@MqQi4#6bT# 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. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u="sed s,\\\\\\\\,/,g" - depmode=msvisualcpp -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> "$depfile" - echo >> "$depfile" - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico b/Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico deleted file mode 100644 index ac13353bc0b17ea80bcd4492381bc96315ec3f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3062 zcmcguXH;897S{gG|Lp#Wvgyz`vYEz9&voRgfjilZ0y+^b%cJ}PAJYS7x?%erqnS1X*qx}K@cJHEL z{1ffP2Q=D;G#c%5{C4Aa1V4gLd@Ahi{QmvUrzbug#nx%JCWpJb8q?*ZJXv2|Hk{MzwuKEG!(>albITw+`|?GlJSN%q63_mSzsWAf*^j(W{L%aPhm12H zg;{b8g^Ue!Qc#9d2ITinC^604lv2XsSnu~gyDQ+_ZkE~KLe2l~Z}PFo?{Z_Y zgll^+a5Ix-Fhe1OBH*-7=?8$aMkjLT8B^*&5W#jKU3IT%z|kPMJ$=Ob&H1qdVBP@2JZ zigf%(nB^Y$8$~}1lb`}L(({Dy!YHGVi{KQ*`G(sajCDE2v-?UKVyEtH0#n`7lon)z zAVkxT+`aa_glSWi89UTozcl*_2+Q-+xNd2PJ=BT>nQ5pdqV!zL0q9yb$0Xr{GJx+er}keAnXw z_fv_t&WZd?Ap;KlLXE5~FOK%LwLL5#%qQ({EJ?#z)Mm2JMX{f$(DQUQ@A~rM%;x$k z;s#8Bl&7#q2RgnOhPxgUD)jn?IdQ3h zRyc@EHW0uiOj}8i^-yOch0s=AfTV&LssQq0e{%!}^2LcvY*8}vQ)AUR@u>k;IGD-1 zu34A?zpg-(7HlhL(@~NJLcL^goS_8>-3?`w7+~dG7gB~U=Qzu`&T|mH!;|?rdcc#v$7*y^I~r*Vm#j^v;u5lG~UXKC6-{$j1R+j zA~ABZ z!#&h)cYS&O-PvtoGyl3u9t%umS~#vrDdECjXoNe!#~gu0D@HXD-X#Qf z)f07r3~a7cz$0ZUcY1t?1k-P7#pjo{h9bB57f<4rTTdP(GU;u&%YF6d0EdICejr2C5MehX1+DP4$y6p-zlkI3iwsd3Hx^xE>0aa1WuJVubAgx}uP@BDlE_geo4@q!F8 diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk b/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk deleted file mode 100644 index 5e7abc08..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk +++ /dev/null @@ -1,14 +0,0 @@ -# fetch version number from input file and write them to STDOUT -BEGIN { - while ((getline < ARGV[1]) > 0) { - if (match ($0, /^VERSION=/)) { - split($1, t, "="); - my_ver_str = t[2]; - split(my_ver_str, v, "."); - gsub("[^0-9].*$", "", v[3]); - my_ver = v[1] "," v[2] "," v[3]; - } - } - print "GEOIP_VERSION = " my_ver ""; - print "GEOIP_VERSION_STR = " my_ver_str ""; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh b/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh deleted file mode 100644 index 6781b987..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# 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. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; 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 - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 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. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c deleted file mode 100644 index d4821c46..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c +++ /dev/null @@ -1,1965 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static geoipv6_t IPV6_NULL; - -#if !defined(_WIN32) -#include -#include -#include -#endif /* !defined(_WIN32) */ - -#include -#include -#include -#include -#include -#include /* for fstat */ -#include /* for fstat */ - -#ifdef HAVE_GETTIMEOFDAY -#include /* for gettimeofday */ -#endif - -#ifdef HAVE_STDINT_H -#include /* For uint32_t */ -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -#define COUNTRY_BEGIN 16776960 -#define LARGE_COUNTRY_BEGIN 16515072 -#define STATE_BEGIN_REV0 16700000 -#define STATE_BEGIN_REV1 16000000 -#define STRUCTURE_INFO_MAX_SIZE 20 -#define DATABASE_INFO_MAX_SIZE 100 -#define MAX_ORG_RECORD_LENGTH 300 -#define US_OFFSET 1 -#define CANADA_OFFSET 677 -#define WORLD_OFFSET 1353 -#define FIPS_RANGE 360 - -#define CHECK_ERR(err, msg) { \ - if (err != Z_OK) { \ - /*fprintf(stderr, "%s error: %d\n", msg, err);*/ \ - exit(1); \ - } \ -} - -#ifdef _WIN32 -int pread(unsigned int fd, char *buf, size_t count, int offset) -{ - if (_lseek(fd, offset, SEEK_SET) != offset) { - return -1; - } - return read(fd, buf, (unsigned int)count); -} -#endif - -const char GeoIP_country_code[254][3] = { "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW", - "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB", - "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO", - "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD", - "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR", - "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO", - "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ", - "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF", - "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT", - "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID", - "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO", - "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW", - "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT", - "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML", - "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV", - "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI", - "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF", - "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW", - "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD", - "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO", - "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH", - "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW", - "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE", - "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA", - "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE", - "BL","MF", "BQ"}; - -static const unsigned num_GeoIP_countries = (unsigned)(sizeof(GeoIP_country_code)/sizeof(GeoIP_country_code[0])); - -const char GeoIP_country_code3[254][4] = { "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW", - "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB", - "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL", - "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD", - "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI", - "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM", - "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI", - "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF", - "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM", - "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN", - "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR", - "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT", - "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU", - "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI", - "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV", - "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC", - "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF", - "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW", - "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN", - "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM", - "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA", - "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN", - "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN", - "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF", - "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY", - "BLM","MAF", "BES"}; - -const char * GeoIP_utf8_country_name[254] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Cura" "\xc3\xa7" "ao", - "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados", - "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia", - "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the", - "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica", - "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic", - "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji", - "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana", - "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala", - "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia", - "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan", - "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait", - "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania", - "Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali", - "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives", - "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua", - "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia", - "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau", - "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan", - "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname", - "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand", - "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan", - "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela", - "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa", - "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey", - "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"}; - -const char * GeoIP_country_name[254] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Cura" "\xe7" "ao", - "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados", - "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia", - "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the", - "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica", - "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic", - "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji", - "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana", - "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala", - "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia", - "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan", - "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait", - "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania", - "Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali", - "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives", - "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua", - "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia", - "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau", - "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan", - "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname", - "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand", - "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan", - "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela", - "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa", - "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey", - "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"}; - -/* Possible continent codes are AF, AS, EU, NA, OC, SA for Africa, Asia, Europe, North America, Oceania -and South America. */ - -const char GeoIP_country_continent[254][3] = { - "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA", - "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA", - "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA", - "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF", - "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA", - "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA", - "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC", - "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA", - "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA", - "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS", - "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS", - "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS", - "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU", - "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF", - "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS", - "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA", - "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC", - "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC", - "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF", - "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF", - "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS", - "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS", - "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA", - "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF", - "AF","EU","AF","--","--","--","EU","EU","EU","EU", - "NA","NA","NA" -}; - -geoipv6_t _GeoIP_lookupaddress_v6 (const char *host); - -#if defined(_WIN32) -/* http://www.mail-archive.com/users@ipv6.org/msg02107.html */ -static const char * _GeoIP_inet_ntop(int af, const void *src, char *dst, socklen_t cnt) -{ - if (af == AF_INET) - { - struct sockaddr_in in; - memset(&in, 0, sizeof(in)); - in.sin_family = AF_INET; - memcpy(&in.sin_addr, src, sizeof(struct in_addr)); - getnameinfo((struct sockaddr *)&in, sizeof(struct -sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST); - return dst; - } - else if (af == AF_INET6) - { - struct sockaddr_in6 in; - memset(&in, 0, sizeof(in)); - in.sin6_family = AF_INET6; - memcpy(&in.sin6_addr, src, sizeof(struct in_addr6)); - getnameinfo((struct sockaddr *)&in, sizeof(struct -sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST); - return dst; - } - return NULL; -} - -static int _GeoIP_inet_pton(int af, const char *src, void *dst) -{ - struct addrinfo hints, *res, *ressave; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = af; - - if (getaddrinfo(src, NULL, &hints, &res) != 0) - { - //fprintf(stderr, "Couldn't resolve host %s\n", src); - return -1; - } - - ressave = res; - - while (res) - { - memcpy(dst, res->ai_addr, res->ai_addrlen); - res = res->ai_next; - } - - freeaddrinfo(ressave); - return 0; -} -#else -static int _GeoIP_inet_pton(int af, const char *src, void *dst) { - return inet_pton(af, src, dst); -} -static const char * _GeoIP_inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { - return inet_ntop(af, src, dst, cnt); -} - -#endif /* defined(_WIN32) */ - - -int __GEOIP_V6_IS_NULL(geoipv6_t v6) { - int i; - for (i=0;i<16;i++) { - if (v6.s6_addr[i]) - return 0; - } - return 1; -} - -void __GEOIP_PREPARE_TEREDO(geoipv6_t* v6){ - int i; - if ((v6->s6_addr[0]) != 0x20) return; - if ((v6->s6_addr[1]) != 0x01) return; - if ((v6->s6_addr[2]) != 0x00) return; - if ((v6->s6_addr[3]) != 0x00) return; - - for ( i = 0; i< 12; i++) - v6->s6_addr[i] = 0; - for ( ; i < 16; i++) - v6->s6_addr[i]^=0xff; -} - -const char * GeoIPDBDescription[NUM_DB_TYPES] = { - NULL, - "GeoIP Country Edition", - "GeoIP City Edition, Rev 1", - "GeoIP Region Edition, Rev 1", - "GeoIP ISP Edition", - "GeoIP Organization Edition", - "GeoIP City Edition, Rev 0", - "GeoIP Region Edition, Rev 0", - "GeoIP Proxy Edition", - "GeoIP ASNum Edition", - "GeoIP Netspeed Edition", - "GeoIP Domain Name Edition", - "GeoIP Country V6 Edition", - "GeoIP LocationID ASCII Edition", - "GeoIP Accuracy Radius Edition", - "GeoIP City with Confidence Edition", - "GeoIP City with Confidence and Accuracy Edition", - "GeoIP Large Country Edition", - "GeoIP Large Country V6 Edition", - NULL, - "GeoIP CCM Edition", - "GeoIP ASNum V6 Edition", - "GeoIP ISP V6 Edition", - "GeoIP Organization V6 Edition", - "GeoIP Domain Name V6 Edition", - "GeoIP LocationID ASCII V6 Edition", - "GeoIP Registrar Edition", - "GeoIP Registrar V6 Edition", - "GeoIP UserType Edition", - "GeoIP UserType V6 Edition", - "GeoIP City Edition V6, Rev 1", - "GeoIP City Edition V6, Rev 0", - "GeoIP Netspeed Edition, Rev 1", - "GeoIP Netspeed Edition V6, Rev1" -}; - -char * custom_directory = NULL; - -void GeoIP_setup_custom_directory (char * dir) { - custom_directory = dir; -} - -char *_GeoIP_full_path_to(const char *file_name) { - size_t len; - char *path = malloc(sizeof(char) * 1024); - - /*if (custom_directory == NULL){ -#if !defined(_WIN32) - memset(path, 0, sizeof(char) * 1024); - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", GEOIPDATADIR, file_name); -#else - char buf[MAX_PATH], *p, *q = NULL; - memset(buf, 0, sizeof(buf)); - len = GetModuleFileNameA(GetModuleHandle(NULL), buf, sizeof(buf) - 1); - for (p = buf + len; p > buf; p--) - if (*p == '\\') - { - if (!q) - q = p; - else - *p = '/'; - } - *q = 0; - memset(path, 0, sizeof(char) * 1024); - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", buf, file_name); -#endif - } else*/ { - len = strlen(custom_directory); - if (custom_directory[len-1] != '/') { - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s",custom_directory, file_name); - } else { - snprintf(path, sizeof(char) * 1024 - 1, "%s%s", custom_directory, file_name); - } - } - return path; -} - -char ** GeoIPDBFileName = NULL; - -void _GeoIP_setup_dbfilename() { - if (NULL == GeoIPDBFileName) { - GeoIPDBFileName = malloc(sizeof(char *) * NUM_DB_TYPES); - memset(GeoIPDBFileName, 0, sizeof(char *) * NUM_DB_TYPES); - - GeoIPDBFileName[GEOIP_COUNTRY_EDITION] = _GeoIP_full_path_to("GeoIP.dat"); - GeoIPDBFileName[GEOIP_REGION_EDITION_REV0] = _GeoIP_full_path_to("GeoIPRegion.dat"); - GeoIPDBFileName[GEOIP_REGION_EDITION_REV1] = _GeoIP_full_path_to("GeoIPRegion.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV0] = _GeoIP_full_path_to("GeoIPCity.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV1] = _GeoIP_full_path_to("GeoIPCity.dat"); - GeoIPDBFileName[GEOIP_ISP_EDITION] = _GeoIP_full_path_to("GeoIPISP.dat"); - GeoIPDBFileName[GEOIP_ORG_EDITION] = _GeoIP_full_path_to("GeoIPOrg.dat"); - GeoIPDBFileName[GEOIP_PROXY_EDITION] = _GeoIP_full_path_to("GeoIPProxy.dat"); - GeoIPDBFileName[GEOIP_ASNUM_EDITION] = _GeoIP_full_path_to("GeoIPASNum.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION] = _GeoIP_full_path_to("GeoIPNetSpeed.dat"); - GeoIPDBFileName[GEOIP_DOMAIN_EDITION] = _GeoIP_full_path_to("GeoIPDomain.dat"); - GeoIPDBFileName[GEOIP_COUNTRY_EDITION_V6] = _GeoIP_full_path_to("GeoIPv6.dat"); - GeoIPDBFileName[GEOIP_LOCATIONA_EDITION] = _GeoIP_full_path_to("GeoIPLocA.dat"); - GeoIPDBFileName[GEOIP_ACCURACYRADIUS_EDITION] = _GeoIP_full_path_to("GeoIPDistance.dat"); - GeoIPDBFileName[GEOIP_CITYCONFIDENCE_EDITION] = _GeoIP_full_path_to("GeoIPCityConfidence.dat"); - GeoIPDBFileName[GEOIP_CITYCONFIDENCEDIST_EDITION] = _GeoIP_full_path_to("GeoIPCityConfidenceDist.dat"); - GeoIPDBFileName[GEOIP_LARGE_COUNTRY_EDITION] = _GeoIP_full_path_to("GeoIP.dat"); - GeoIPDBFileName[GEOIP_LARGE_COUNTRY_EDITION_V6] = _GeoIP_full_path_to("GeoIPv6.dat"); - GeoIPDBFileName[GEOIP_ASNUM_EDITION_V6] = _GeoIP_full_path_to("GeoIPASNumv6.dat"); - GeoIPDBFileName[GEOIP_ISP_EDITION_V6] = _GeoIP_full_path_to("GeoIPISPv6.dat"); - GeoIPDBFileName[GEOIP_ORG_EDITION_V6] = _GeoIP_full_path_to("GeoIPOrgv6.dat"); - GeoIPDBFileName[GEOIP_DOMAIN_EDITION_V6] = _GeoIP_full_path_to("GeoIPDomainv6.dat"); - GeoIPDBFileName[GEOIP_LOCATIONA_EDITION_V6] = _GeoIP_full_path_to("GeoIPLocAv6.dat"); - GeoIPDBFileName[GEOIP_REGISTRAR_EDITION] = _GeoIP_full_path_to("GeoIPRegistrar.dat"); - GeoIPDBFileName[GEOIP_REGISTRAR_EDITION_V6] = _GeoIP_full_path_to("GeoIPRegistrarv6.dat"); - GeoIPDBFileName[GEOIP_USERTYPE_EDITION] = _GeoIP_full_path_to("GeoIPUserType.dat"); - GeoIPDBFileName[GEOIP_USERTYPE_EDITION_V6] = _GeoIP_full_path_to("GeoIPUserTypev6.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV0_V6] = _GeoIP_full_path_to("GeoIPCityv6.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV1_V6] = _GeoIP_full_path_to("GeoIPCityv6.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1] = _GeoIP_full_path_to("GeoIPNetspeedCell.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1_V6] = _GeoIP_full_path_to("GeoIPNetseedCellv6.dat"); - } -} - -static -int _file_exists(const char *file_name) { - struct stat file_stat; - return( (stat(file_name, &file_stat) == 0) ? 1:0); -} - -char * _GeoIP_iso_8859_1__utf8(const char * iso) { - signed char c; - char k; - char * p; - char * t = (char *)iso; - int len = 0; - while ( ( c = *t++) ){ - if ( c < 0 ) - len++; - } - len += (int)(t - iso); - t = p = malloc( len ); - - if ( p ){ - while ( ( c = *iso++ ) ) { - if (c < 0 ) { - k = 0xc2; - if (c >= -64 ) - k++; - *t++ = k; - c &= ~0x40; - } - *t++ = c; - } - *t++ = 0x00; - } - return p; -} - -int GeoIP_is_private_ipnum_v4( unsigned long ipnum ){ -return ((ipnum >= 167772160U && ipnum <= 184549375U) - || (ipnum >= 2851995648U && ipnum <= 2852061183U) - || (ipnum >= 2886729728U && ipnum <= 2887778303U) - || (ipnum >= 3232235520U && ipnum <= 3232301055U) - || (ipnum >= 2130706432U && ipnum <= 2147483647U))? 1 : 0; -} - -int GeoIP_is_private_v4( const char * addr ){ - unsigned long ipnum = GeoIP_addr_to_num(addr); - return GeoIP_is_private_ipnum_v4(ipnum); -} - -int GeoIP_db_avail(int type) { - const char * filePath; - if (type < 0 || type >= NUM_DB_TYPES) { - return 0; - } - _GeoIP_setup_dbfilename(); - filePath = GeoIPDBFileName[type]; - if (NULL == filePath) { - return 0; - } - return _file_exists(filePath); -} - -static -void _setup_segments(GeoIP * gi) { - int i, j, segment_record_length; - unsigned char delim[3]; - unsigned char buf[LARGE_SEGMENT_RECORD_LENGTH]; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - - gi->databaseSegments = NULL; - - /* default to GeoIP Country Edition */ - gi->databaseType = GEOIP_COUNTRY_EDITION; - gi->record_length = STANDARD_RECORD_LENGTH; - lseek(fno, -3l, SEEK_END); - for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) { - silence = read(fno, delim, 3); - if (delim[0] == 255 && delim[1] == 255 && delim[2] == 255) { - silence = read(fno, &gi->databaseType, 1 ); - if (gi->databaseType >= 106) { - /* backwards compatibility with databases from April 2003 and earlier */ - gi->databaseType -= 105; - } - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = STATE_BEGIN_REV0; - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = STATE_BEGIN_REV1; - } else if (gi->databaseType == GEOIP_CITY_EDITION_REV0 || - gi->databaseType == GEOIP_CITY_EDITION_REV1 || - gi->databaseType == GEOIP_ORG_EDITION || - gi->databaseType == GEOIP_ORG_EDITION_V6 || - gi->databaseType == GEOIP_DOMAIN_EDITION || - gi->databaseType == GEOIP_DOMAIN_EDITION_V6 || - gi->databaseType == GEOIP_ISP_EDITION || - gi->databaseType == GEOIP_ISP_EDITION_V6 || - gi->databaseType == GEOIP_REGISTRAR_EDITION || - gi->databaseType == GEOIP_REGISTRAR_EDITION_V6 || - gi->databaseType == GEOIP_USERTYPE_EDITION || - gi->databaseType == GEOIP_USERTYPE_EDITION_V6 || - gi->databaseType == GEOIP_ASNUM_EDITION || - gi->databaseType == GEOIP_ASNUM_EDITION_V6 || - gi->databaseType == GEOIP_NETSPEED_EDITION_REV1 || - gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6 || - gi->databaseType == GEOIP_LOCATIONA_EDITION || - gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION || - gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION || - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION || - gi->databaseType == GEOIP_CITY_EDITION_REV0_V6 || - gi->databaseType == GEOIP_CITY_EDITION_REV1_V6 - - ) { - /* City/Org Editions have two segments, read offset of second segment */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = 0; - - segment_record_length = gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION ? LARGE_SEGMENT_RECORD_LENGTH : SEGMENT_RECORD_LENGTH; - - silence = read(fno, buf, segment_record_length ); - for (j = 0; j < segment_record_length; j++) { - gi->databaseSegments[0] += (buf[j] << (j * 8)); - } - - /* the record_length must be correct from here on */ - if (gi->databaseType == GEOIP_ORG_EDITION || - gi->databaseType == GEOIP_ORG_EDITION_V6 || - gi->databaseType == GEOIP_DOMAIN_EDITION || - gi->databaseType == GEOIP_DOMAIN_EDITION_V6 || - gi->databaseType == GEOIP_ISP_EDITION || - gi->databaseType == GEOIP_ISP_EDITION_V6 || - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ) - gi->record_length = ORG_RECORD_LENGTH; - - if ( gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION - || gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ) { - silence = pread(fileno(gi->GeoIPDatabase), buf, gi->record_length, gi->databaseSegments[0] * 2 * gi->record_length); - gi->dyn_seg_size = 0; - for (j = 0; j < gi->record_length; j++) { - gi->dyn_seg_size += (buf[j] << (j * 8)); - } - } - - } - break; - } else { - lseek(fno, -4l, SEEK_CUR); - } - } - if (gi->databaseType == GEOIP_COUNTRY_EDITION || - gi->databaseType == GEOIP_PROXY_EDITION || - gi->databaseType == GEOIP_NETSPEED_EDITION || - gi->databaseType == GEOIP_COUNTRY_EDITION_V6 ) { - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = COUNTRY_BEGIN; - } - else if ( gi->databaseType == GEOIP_LARGE_COUNTRY_EDITION || - gi->databaseType == GEOIP_LARGE_COUNTRY_EDITION_V6 ) { - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = LARGE_COUNTRY_BEGIN; - } - -} - -static -int _check_mtime(GeoIP *gi) { - struct stat buf; - -#if !defined(_WIN32) - struct timeval t; -#else /* !defined(_WIN32) */ - FILETIME ft; - ULONGLONG t; -#endif /* !defined(_WIN32) */ - - if (gi->flags & GEOIP_CHECK_CACHE) { - -#if !defined(_WIN32) - /* stat only has second granularity, so don't - * call it more than once a second */ - gettimeofday(&t, NULL); - if (t.tv_sec == gi->last_mtime_check){ - return 0; - } - gi->last_mtime_check = t.tv_sec; - -#else /* !defined(_WIN32) */ - - /* stat only has second granularity, so don't - call it more than once a second */ - GetSystemTimeAsFileTime(&ft); - t = FILETIME_TO_USEC(ft) / 1000 / 1000; - if (t == gi->last_mtime_check){ - return 0; - } - gi->last_mtime_check = t; - -#endif /* !defined(_WIN32) */ - - if (stat(gi->file_path, &buf) != -1) { - /* make sure that the database file is at least 60 - * seconds untouched. Otherwise we might load the - * database only partly and crash - */ - if (buf.st_mtime != gi->mtime && ( buf.st_mtime + 60 < gi->last_mtime_check ) ) { - /* GeoIP Database file updated */ - if (gi->flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE)) { - if ( gi->flags & GEOIP_MMAP_CACHE) { -#if !defined(_WIN32) - /* MMAP is only avail on UNIX */ - munmap(gi->cache, gi->size); - gi->cache = NULL; -#endif - } else { - /* reload database into memory cache */ - if ((gi->cache = (unsigned char*) realloc(gi->cache, buf.st_size)) == NULL) { - //fprintf(stderr,"Out of memory when reloading %s\n",gi->file_path); - return -1; - } - } - } - /* refresh filehandle */ - fclose(gi->GeoIPDatabase); - gi->GeoIPDatabase = fopen(gi->file_path,"rb"); - if (gi->GeoIPDatabase == NULL) { - //fprintf(stderr,"Error Opening file %s when reloading\n",gi->file_path); - return -1; - } - gi->mtime = buf.st_mtime; - gi->size = buf.st_size; - - if ( gi->flags & GEOIP_MMAP_CACHE) { -#if defined(_WIN32) - //fprintf(stderr, "GEOIP_MMAP_CACHE is not supported on WIN32\n"); - gi->cache = 0; - return -1; -#else - gi->cache = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); - if ( gi->cache == MAP_FAILED ) { - - //fprintf(stderr,"Error remapping file %s when reloading\n",gi->file_path); - - gi->cache = NULL; - return -1; - } -#endif - } else if ( gi->flags & GEOIP_MEMORY_CACHE ) { - if (pread(fileno(gi->GeoIPDatabase), gi->cache, buf.st_size, 0) != (ssize_t) buf.st_size) { - //fprintf(stderr,"Error reading file %s when reloading\n",gi->file_path); - return -1; - } - } - - if (gi->databaseSegments != NULL) { - free(gi->databaseSegments); - gi->databaseSegments = NULL; - } - _setup_segments(gi); - if (gi->databaseSegments == NULL) { - //fprintf(stderr, "Error reading file %s -- corrupt\n", gi->file_path); - return -1; - } - if (gi->flags & GEOIP_INDEX_CACHE) { - gi->index_cache = (unsigned char *) realloc(gi->index_cache, sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); - if (gi->index_cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase), gi->index_cache, - gi->databaseSegments[0] * (long)gi->record_length * 2, 0 ) != (ssize_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { - //fprintf(stderr,"Error reading file %s where reloading\n",gi->file_path); - return -1; - } - } - } - } - } - } - return 0; -} - -#define ADDR_STR_LEN (8 * 4 + 7 + 1) -unsigned int _GeoIP_seek_record_v6 (GeoIP *gi, geoipv6_t ipnum) { - int depth; - char paddr[ADDR_STR_LEN]; - unsigned int x; - unsigned char stack_buffer[2 * MAX_RECORD_LENGTH]; - const unsigned char *buf = (gi->cache == NULL) ? stack_buffer : NULL; - unsigned int offset = 0; - - const unsigned char * p; - int j; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - _check_mtime(gi); - if ( GeoIP_teredo(gi) ) - __GEOIP_PREPARE_TEREDO(&ipnum); - for (depth = 127; depth >= 0; depth--) { - if (gi->cache == NULL && gi->index_cache == NULL) { - /* read from disk */ - silence = pread(fno, stack_buffer,gi->record_length * 2, (long)gi->record_length * 2 * offset ); - } else if (gi->index_cache == NULL) { - /* simply point to record in memory */ - buf = gi->cache + (long)gi->record_length * 2 *offset; - } else { - buf = gi->index_cache + (long)gi->record_length * 2 * offset; - } - - if (GEOIP_CHKBIT_V6(depth, ipnum.s6_addr )) { - /* Take the right-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*1 + 0] << (0*8)) - + (buf[3*1 + 1] << (1*8)) - + (buf[3*1 + 2] << (2*8)); - - } else { - /* General case */ - j = gi->record_length; - p = &buf[2*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - - } else { - /* Take the left-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*0 + 0] << (0*8)) - + (buf[3*0 + 1] << (1*8)) - + (buf[3*0 + 2] << (2*8)); - } else { - /* General case */ - j = gi->record_length; - p = &buf[1*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - } - - if (x >= gi->databaseSegments[0]) { - gi->netmask = 128 - depth; - return x; - } - offset = x; - } - - /* shouldn't reach here */ - _GeoIP_inet_ntop(AF_INET6, &ipnum.s6_addr[0], paddr, ADDR_STR_LEN); - //fprintf(stderr,"Error Traversing Database for ipnum = %s - Perhaps database is corrupt?\n", paddr); - return 0; -} - -geoipv6_t -_GeoIP_addr_to_num_v6(const char *addr) -{ - geoipv6_t ipnum; - if ( 1 == _GeoIP_inet_pton(AF_INET6, addr, &ipnum.s6_addr[0] ) ) - return ipnum; - return IPV6_NULL; -} - -unsigned int _GeoIP_seek_record (GeoIP *gi, unsigned long ipnum) { - int depth; - unsigned int x; - unsigned char stack_buffer[2 * MAX_RECORD_LENGTH]; - const unsigned char *buf = (gi->cache == NULL) ? stack_buffer : NULL; - unsigned int offset = 0; - ssize_t silence; - - const unsigned char * p; - int j; - int fno = fileno(gi->GeoIPDatabase); - _check_mtime(gi); - for (depth = 31; depth >= 0; depth--) { - if (gi->cache == NULL && gi->index_cache == NULL) { - /* read from disk */ - silence = pread(fno, stack_buffer, gi->record_length * 2, gi->record_length * 2 * offset); - } else if (gi->index_cache == NULL) { - /* simply point to record in memory */ - buf = gi->cache + (long)gi->record_length * 2 *offset; - } else { - buf = gi->index_cache + (long)gi->record_length * 2 * offset; - } - - if (ipnum & (1 << depth)) { - /* Take the right-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*1 + 0] << (0*8)) - + (buf[3*1 + 1] << (1*8)) - + (buf[3*1 + 2] << (2*8)); - - } else { - /* General case */ - j = gi->record_length; - p = &buf[2*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - - } else { - /* Take the left-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*0 + 0] << (0*8)) - + (buf[3*0 + 1] << (1*8)) - + (buf[3*0 + 2] << (2*8)); - } else { - /* General case */ - j = gi->record_length; - p = &buf[1*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - } - - if (x >= gi->databaseSegments[0]) { - gi->netmask = 32 - depth; - return x; - } - offset = x; - } - /* shouldn't reach here */ - //fprintf(stderr,"Error Traversing Database for ipnum = %lu - Perhaps database is corrupt?\n",ipnum); - return 0; -} - -unsigned long -GeoIP_addr_to_num(const char *addr) -{ - unsigned int c, octet, t; - unsigned long ipnum; - int i = 3; - - octet = ipnum = 0; - while ((c = *addr++)) { - if (c == '.') { - if (octet > 255) - return 0; - ipnum <<= 8; - ipnum += octet; - i--; - octet = 0; - } else { - t = octet; - octet <<= 3; - octet += t; - octet += t; - c -= '0'; - if (c > 9) - return 0; - octet += c; - } - } - if ((octet > 255) || (i != 0)) - return 0; - ipnum <<= 8; - return ipnum + octet; -} - -GeoIP* GeoIP_open_type (int type, int flags) { - GeoIP * gi; - const char * filePath; - if (type < 0 || type >= NUM_DB_TYPES) { - printf("Invalid database type %d\n", type); - return NULL; - } - _GeoIP_setup_dbfilename(); - filePath = GeoIPDBFileName[type]; - if (filePath == NULL) { - printf("Invalid database type %d\n", type); - return NULL; - } - gi = GeoIP_open (filePath, flags); - return gi; -} - -GeoIP* GeoIP_new (int flags) { - GeoIP * gi; - _GeoIP_setup_dbfilename(); - gi = GeoIP_open (GeoIPDBFileName[GEOIP_COUNTRY_EDITION], flags); - return gi; -} - -GeoIP* GeoIP_open (const char * filename, int flags) { - struct stat buf; - GeoIP * gi; - size_t len; - - gi = (GeoIP *)malloc(sizeof(GeoIP)); - if (gi == NULL) - return NULL; - len = sizeof(char) * (strlen(filename)+1); - gi->file_path = malloc(len); - if (gi->file_path == NULL) { - free(gi); - return NULL; - } - strncpy(gi->file_path, filename, len); - gi->GeoIPDatabase = fopen(filename,"rb"); - if (gi->GeoIPDatabase == NULL) { - //fprintf(stderr,"Error Opening file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } else { - if (flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE) ) { - if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { - //fprintf(stderr,"Error stating file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } - gi->mtime = buf.st_mtime; - gi->size = buf.st_size; - - /* MMAP added my Peter Shipley */ - if ( flags & GEOIP_MMAP_CACHE ) { -#if !defined(_WIN32) - gi->cache = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); - if ( gi->cache == MAP_FAILED ) { - fprintf(stderr,"Error mmaping file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } -#endif - } else { - gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); - - if (gi->cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase),gi->cache, buf.st_size, 0) != (ssize_t) buf.st_size) { - //fprintf(stderr,"Error reading file %s\n",filename); - free(gi->cache); - free(gi->file_path); - free(gi); - return NULL; - } - } - } - } else { - if (flags & GEOIP_CHECK_CACHE) { - if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { - //fprintf(stderr,"Error stating file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } - gi->mtime = buf.st_mtime; - } - gi->cache = NULL; - } - gi->flags = flags; - gi->charset = GEOIP_CHARSET_ISO_8859_1; - gi->ext_flags = 1U << GEOIP_TEREDO_BIT; - _setup_segments(gi); - if (flags & GEOIP_INDEX_CACHE) { - gi->index_cache = (unsigned char *) malloc(sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); - if (gi->index_cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase),gi->index_cache, gi->databaseSegments[0] * (long)gi->record_length * 2, 0) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { - //fprintf(stderr,"Error reading file %s\n",filename); - free(gi->databaseSegments); - free(gi->index_cache); - free(gi); - return NULL; - } - } - } else { - gi->index_cache = NULL; - } - return gi; - } -} - -void GeoIP_delete (GeoIP *gi) { - if (gi == NULL ) - return; - if (gi->GeoIPDatabase != NULL) - fclose(gi->GeoIPDatabase); - if (gi->cache != NULL) { - if ( gi->flags & GEOIP_MMAP_CACHE ) { -#if !defined(_WIN32) - munmap(gi->cache, gi->size); -#endif - } else { - free(gi->cache); - } - gi->cache = NULL; - } - if (gi->index_cache != NULL) - free(gi->index_cache); - if (gi->file_path != NULL) - free(gi->file_path); - if (gi->databaseSegments != NULL) - free(gi->databaseSegments); - free(gi); -} - -const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return GeoIP_country_name_by_id(gi, country_id ); -} - -unsigned long _GeoIP_lookupaddress (const char *host) { - unsigned long addr = inet_addr(host); - struct hostent phe2; - struct hostent * phe = &phe2; - char *buf = NULL; -#ifdef HAVE_GETHOSTBYNAME_R - int buflength = 16384; - int herr = 0; -#endif - int result = 0; -#ifdef HAVE_GETHOSTBYNAME_R - buf = malloc(buflength); -#endif - if (addr == INADDR_NONE) { -#ifdef HAVE_GETHOSTBYNAME_R - while (1) { - /* we use gethostbyname_r here because it is thread-safe and gethostbyname is not */ -#ifdef GETHOSTBYNAME_R_RETURNS_INT - result = gethostbyname_r(host,&phe2,buf,buflength,&phe,&herr); -#else - phe = gethostbyname_r(host,&phe2,buf,buflength,&herr); -#endif - if (herr != ERANGE) - break; - if (result == 0) - break; - /* double the buffer if the buffer is too small */ - buflength = buflength * 2; - buf = realloc(buf,buflength); - } -#else - /* Some systems do not support gethostbyname_r, such as Mac OS X */ - phe = gethostbyname(host); -#endif - if (!phe || result != 0) { - free(buf); - return 0; - } -#if !defined(_WIN32) - addr = *((in_addr_t *) phe->h_addr_list[0]); -#else - addr = ((IN_ADDR *) phe->h_addr_list[0])->S_un.S_addr; -#endif - } -#ifdef HAVE_GETHOSTBYNAME_R - free(buf); -#endif - return ntohl(addr); -} - -geoipv6_t -_GeoIP_lookupaddress_v6(const char *host) -{ - geoipv6_t ipnum; - int gaierr; - struct addrinfo hints, *aifirst; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET6; - /* hints.ai_flags = AI_V4MAPPED; */ - hints.ai_socktype = SOCK_STREAM; - - if ((gaierr = getaddrinfo(host, NULL, &hints, &aifirst)) != 0) { - /* fprintf(stderr, "Err: %s (%d %s)\n", host, gaierr, gai_strerror(gaierr)); */ - return IPV6_NULL; - } - memcpy(ipnum.s6_addr, ((struct sockaddr_in6 *) aifirst->ai_addr)->sin6_addr.s6_addr, sizeof(geoipv6_t)); - freeaddrinfo(aifirst); - /* inet_pton(AF_INET6, host, ipnum.s6_addr); */ - - return ipnum; -} - -int GeoIP_id_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - int ret; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION && gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; - -} - -int GeoIP_id_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - int ret; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6 && gi->databaseType != GEOIP_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -int GeoIP_country_id_by_addr_v6 (GeoIP* gi, const char *addr) { - return GeoIP_id_by_addr_v6(gi, addr); -} - -int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr) { - return GeoIP_id_by_addr(gi, addr); -} - -int GeoIP_country_id_by_name_v6 (GeoIP* gi, const char *host) { - return GeoIP_id_by_name_v6(gi, host); -} - -int GeoIP_country_id_by_name (GeoIP* gi, const char *host) { - return GeoIP_id_by_name(gi, host); -} - -int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - int ret; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION_V6 - && gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -int GeoIP_id_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - int ret; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION && - gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && - gi->databaseType != GEOIP_PROXY_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int ret; -/* if (ipnum == 0) { - return 0; - } -*/ - if (gi->databaseType != GEOIP_COUNTRY_EDITION_V6 - && gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - - - -int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int ret; - if (ipnum == 0) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION && - gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && - gi->databaseType != GEOIP_PROXY_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -char *GeoIP_database_info (GeoIP* gi) { - int i; - unsigned char buf[3]; - char *retval; - int hasStructureInfo = 0; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - - if(gi == NULL) - return NULL; - - _check_mtime(gi); - lseek(fno, -3l, SEEK_END); - - /* first get past the database structure information */ - for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) { - silence = read(fno, buf, 3 ); - if (buf[0] == 255 && buf[1] == 255 && buf[2] == 255) { - hasStructureInfo = 1; - break; - } - lseek(fno, -4l, SEEK_CUR); - } - if (hasStructureInfo == 1) { - lseek(fno, -6l, SEEK_CUR); - } else { - /* no structure info, must be pre Sep 2002 database, go back to end */ - lseek(fno, -3l, SEEK_END); - } - - for (i = 0; i < DATABASE_INFO_MAX_SIZE; i++) { - silence = read(fno, buf, 3 ); - if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0) { - retval = malloc(sizeof(char) * (i+1)); - if (retval == NULL) { - return NULL; - } - silence = read(fno, retval, i); - retval[i] = '\0'; - return retval; - } - lseek(fno, -4l, SEEK_CUR); - } - return NULL; -} - -/* GeoIP Region Edition functions */ - -void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *region) { - unsigned int seek_region; - - /* This also writes in the terminating NULs (if you decide to - * keep them) and clear any fields that are not set. */ - memset(region, 0, sizeof(GeoIPRegion)); - - seek_region = _GeoIP_seek_record(gi, ntohl(inetaddr)); - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - seek_region -= STATE_BEGIN_REV0; - if (seek_region >= 1000) { - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - 1000)/26 + 65); - region->region[1] = (char) ((seek_region - 1000)%26 + 65); - } else { - memcpy(region->country_code, GeoIP_country_code[seek_region], 2); - } - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - seek_region -= STATE_BEGIN_REV1; - if (seek_region < US_OFFSET) { - /* Unknown */ - /* we don't need to do anything here b/c we memset region to 0 */ - } else if (seek_region < CANADA_OFFSET) { - /* USA State */ - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - US_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - US_OFFSET)%26 + 65); - } else if (seek_region < WORLD_OFFSET) { - /* Canada Province */ - region->country_code[0] = 'C'; - region->country_code[1] = 'A'; - region->region[0] = (char) ((seek_region - CANADA_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - CANADA_OFFSET)%26 + 65); - } else { - /* Not US or Canada */ - memcpy(region->country_code, GeoIP_country_code[(seek_region - WORLD_OFFSET) / FIPS_RANGE], 2); - } - } -} - -void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *region) { - unsigned int seek_region; - - /* This also writes in the terminating NULs (if you decide to - * keep them) and clear any fields that are not set. */ - memset(region, 0, sizeof(GeoIPRegion)); - - seek_region = _GeoIP_seek_record_v6(gi, inetaddr); - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - seek_region -= STATE_BEGIN_REV0; - if (seek_region >= 1000) { - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - 1000)/26 + 65); - region->region[1] = (char) ((seek_region - 1000)%26 + 65); - } else { - memcpy(region->country_code, GeoIP_country_code[seek_region], 2); - } - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - seek_region -= STATE_BEGIN_REV1; - if (seek_region < US_OFFSET) { - /* Unknown */ - /* we don't need to do anything here b/c we memset region to 0 */ - } else if (seek_region < CANADA_OFFSET) { - /* USA State */ - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - US_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - US_OFFSET)%26 + 65); - } else if (seek_region < WORLD_OFFSET) { - /* Canada Province */ - region->country_code[0] = 'C'; - region->country_code[1] = 'A'; - region->region[0] = (char) ((seek_region - CANADA_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - CANADA_OFFSET)%26 + 65); - } else { - /* Not US or Canada */ - memcpy(region->country_code, GeoIP_country_code[(seek_region - WORLD_OFFSET) / FIPS_RANGE], 2); - } - } -} - -static -GeoIPRegion * _get_region(GeoIP* gi, unsigned long ipnum) { - GeoIPRegion * region; - - region = malloc(sizeof(GeoIPRegion)); - if (region) { - GeoIP_assign_region_by_inetaddr(gi, htonl(ipnum), region); - } - return region; -} - -static -GeoIPRegion * _get_region_v6(GeoIP* gi, geoipv6_t ipnum) { - GeoIPRegion * region; - - region = malloc(sizeof(GeoIPRegion)); - if (region) { - GeoIP_assign_region_by_inetaddr_v6(gi, ipnum, region); - } - return region; -} - -GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_region_v6(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - return _get_region_v6(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_ipnum (GeoIP* gi, unsigned long ipnum) { - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - return _get_region_v6(gi, ipnum); -} - -void GeoIPRegion_delete (GeoIPRegion *gir) { - free(gir); -} - -/* GeoIP Organization, ISP and AS Number Edition private method */ -static -char *_get_name (GeoIP* gi, unsigned long ipnum) { - int seek_org; - char buf[MAX_ORG_RECORD_LENGTH]; - char * org_buf, * buf_pointer; - int record_pointer; - size_t len; - ssize_t silence; - - if (gi->databaseType != GEOIP_ORG_EDITION && - gi->databaseType != GEOIP_ISP_EDITION && - gi->databaseType != GEOIP_DOMAIN_EDITION && - gi->databaseType != GEOIP_ASNUM_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION_REV1 && - gi->databaseType != GEOIP_USERTYPE_EDITION && - gi->databaseType != GEOIP_REGISTRAR_EDITION && - gi->databaseType != GEOIP_LOCATIONA_EDITION - ) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_ORG_EDITION]); - return NULL; - } - - seek_org = _GeoIP_seek_record(gi, ipnum); - if (seek_org == gi->databaseSegments[0]) - return NULL; - - record_pointer = seek_org + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - silence = pread(fileno(gi->GeoIPDatabase), buf, MAX_ORG_RECORD_LENGTH, record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf ); - } else { - len = sizeof(char) * (strlen(buf)+1); - org_buf = malloc(len); - strncpy(org_buf, buf, len); - } - } else { - buf_pointer = (char *)(gi->cache + (long)record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf_pointer ); - } else { - len = sizeof(char) * (strlen(buf_pointer)+1); - org_buf = malloc(len); - strncpy(org_buf, buf_pointer, len); - } - } - return org_buf; -} - -char *_get_name_v6 (GeoIP* gi, geoipv6_t ipnum) { - int seek_org; - char buf[MAX_ORG_RECORD_LENGTH]; - char * org_buf, * buf_pointer; - int record_pointer; - size_t len; - ssize_t silence; - - if ( - gi->databaseType != GEOIP_ORG_EDITION_V6 && - gi->databaseType != GEOIP_ISP_EDITION_V6 && - gi->databaseType != GEOIP_DOMAIN_EDITION_V6 && - gi->databaseType != GEOIP_ASNUM_EDITION_V6 && - gi->databaseType != GEOIP_NETSPEED_EDITION_REV1_V6 && - gi->databaseType != GEOIP_USERTYPE_EDITION_V6 && - gi->databaseType != GEOIP_REGISTRAR_EDITION_V6 && - gi->databaseType != GEOIP_LOCATIONA_EDITION - ) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_ORG_EDITION]); - return NULL; - } - - seek_org = _GeoIP_seek_record_v6(gi, ipnum); - if (seek_org == gi->databaseSegments[0]) - return NULL; - - record_pointer = seek_org + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - silence = pread(fileno(gi->GeoIPDatabase), buf, MAX_ORG_RECORD_LENGTH, record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf ); - } else { - len = sizeof(char) * (strlen(buf)+1); - org_buf = malloc(len); - strncpy(org_buf, buf, len); - } - } else { - buf_pointer = (char *)(gi->cache + (long)record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf_pointer ); - } else { - len = sizeof(char) * (strlen(buf_pointer)+1); - org_buf = malloc(len); - strncpy(org_buf, buf_pointer, len); - } - } - return org_buf; -} - -char * GeoIP_num_to_addr (unsigned long ipnum) { - char *ret_str; - char *cur_str; - int octet[4]; - int num_chars_written, i; - - ret_str = malloc(sizeof(char) * 16); - cur_str = ret_str; - - for (i = 0; i<4; i++) { - octet[3 - i] = ipnum % 256; - ipnum >>= 8; - } - - for (i = 0; i<4; i++) { - num_chars_written = sprintf(cur_str, "%d", octet[i]); - cur_str += num_chars_written; - - if (i < 3) { - cur_str[0] = '.'; - cur_str++; - } - } - - return ret_str; -} - -char **GeoIP_range_by_ip (GeoIP* gi, const char *addr) { - unsigned long ipnum; - unsigned long left_seek; - unsigned long right_seek; - unsigned long mask; - int orig_netmask; - int target_value; - char **ret; - - if (addr == NULL) { - return 0; - } - - ret = malloc(sizeof(char *) * 2); - - ipnum = GeoIP_addr_to_num(addr); - target_value = _GeoIP_seek_record(gi, ipnum); - orig_netmask = GeoIP_last_netmask(gi); - mask = 0xffffffff << ( 32 - orig_netmask ); - left_seek = ipnum & mask; - right_seek = left_seek + ( 0xffffffff & ~mask ); - - while (left_seek != 0 - && target_value == _GeoIP_seek_record(gi, left_seek - 1) ) { - - /* Go to beginning of netblock defined by netmask */ - mask = 0xffffffff << ( 32 - GeoIP_last_netmask(gi) ); - left_seek = ( left_seek - 1 ) & mask; - } - ret[0] = GeoIP_num_to_addr(left_seek); - - while (right_seek != 0xffffffff - && target_value == _GeoIP_seek_record(gi, right_seek + 1) ) { - - /* Go to end of netblock defined by netmask */ - mask = 0xffffffff << ( 32 - GeoIP_last_netmask(gi) ); - right_seek = ( right_seek + 1 ) & mask; - right_seek += 0xffffffff & ~mask; - } - ret[1] = GeoIP_num_to_addr(right_seek); - - gi->netmask = orig_netmask; - - return ret; -} - -void GeoIP_range_by_ip_delete( char ** ptr ){ - if ( ptr ){ - if ( ptr[0] ) - free(ptr[0]); - if ( ptr[1] ) - free(ptr[1]); - free(ptr); - } -} - -char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum) { - return _get_name(gi,ipnum); -} - -char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - return _get_name_v6(gi,ipnum); -} - -char *GeoIP_name_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_name(gi, ipnum); -} - -char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_name_v6(gi, ipnum); -} - -char *GeoIP_name_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - if (name == NULL) { - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - return _get_name(gi, ipnum); -} - -char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - return _get_name_v6(gi, ipnum); -} - -char *GeoIP_org_by_ipnum (GeoIP* gi, unsigned long ipnum) { - return GeoIP_name_by_ipnum(gi, ipnum); -} - -char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - return GeoIP_name_by_ipnum_v6(gi, ipnum); -} - -char *GeoIP_org_by_addr (GeoIP* gi, const char *addr) { - return GeoIP_name_by_addr(gi, addr); -} - -char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr) { - return GeoIP_name_by_addr_v6(gi, addr); -} - -char *GeoIP_org_by_name (GeoIP* gi, const char *name) { - return GeoIP_name_by_name(gi, name); -} - -char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name) { - return GeoIP_name_by_name_v6(gi, name); -} - -unsigned char GeoIP_database_edition (GeoIP* gi) { - return gi->databaseType; -} - -int GeoIP_enable_teredo(GeoIP* gi, int true_false){ - unsigned int mask = ( 1U << GEOIP_TEREDO_BIT ); - int b = ( gi->ext_flags & mask ) ? 1 : 0; - gi->ext_flags &= ~mask ; - if ( true_false ) - gi->ext_flags |= true_false; - return b; -} - -int GeoIP_teredo ( GeoIP* gi ){ - unsigned int mask = ( 1U << GEOIP_TEREDO_BIT ); - return ( gi->ext_flags & mask ) ? 1 : 0; -} - -int GeoIP_charset( GeoIP* gi){ - return gi->charset; -} - -int GeoIP_set_charset( GeoIP* gi, int charset ){ - int old_charset = gi->charset; - gi->charset = charset; - return old_charset; -} - -int GeoIP_last_netmask (GeoIP* gi) { - return gi->netmask; -} - - -/** return two letter country code */ -const char* GeoIP_code_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_code[id]; -} - -/** return three letter country code */ -const char* GeoIP_code3_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_code3[id]; -} - - -/** return full name of country in utf8 or iso-8859-1 */ -const char* GeoIP_country_name_by_id(GeoIP * gi, int id) -{ - /* return NULL also even for index 0 for backward compatibility */ - if (id <= 0 || id >= (int) num_GeoIP_countries) - return NULL; - return ((gi->charset == GEOIP_CHARSET_UTF8) - ? GeoIP_utf8_country_name[id] - : GeoIP_country_name[id]); -} - -/** return full name of country in iso-8859-1 */ -const char* GeoIP_name_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_name[id]; -} - -/** return continent of country */ -const char* GeoIP_continent_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_continent[id]; -} - -/** return id by country code **/ -int GeoIP_id_by_code(const char *country) -{ - unsigned i; - - for ( i = 0; i < num_GeoIP_countries; ++i) - { - if (strcmp(country, GeoIP_country_code[i]) == 0) - return i; - } - - return 0; -} - -unsigned GeoIP_num_countries(void) -{ - return num_GeoIP_countries; -} - -/*const char * GeoIP_lib_version(void) -{ - return PACKAGE_VERSION; -}*/ - -int GeoIP_cleanup(void) -{ - int i, result = 0; - if (GeoIPDBFileName) { - - for (i = 0; i < NUM_DB_TYPES; i++) { - if (GeoIPDBFileName[i]) free(GeoIPDBFileName[i]); - } - - free(GeoIPDBFileName); - GeoIPDBFileName = NULL; - result = 1; - } - - return result; -} - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h deleted file mode 100644 index c1a2a470..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.h - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIP_H -#define GEOIP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#if !defined(_WIN32) -#include -#include -#include -#else /* !defined(_WIN32) */ -#include -#include -#include -#include -#define snprintf _snprintf -#define FILETIME_TO_USEC(ft) (((unsigned __int64) ft.dwHighDateTime << 32 | ft.dwLowDateTime) / 10) -#endif /* !defined(_WIN32) */ - -#include -#include -#include -#include /* for fstat */ -#include /* for fstat */ - -#define SEGMENT_RECORD_LENGTH 3 -#define LARGE_SEGMENT_RECORD_LENGTH 4 -#define STANDARD_RECORD_LENGTH 3 -#define ORG_RECORD_LENGTH 4 -#define MAX_RECORD_LENGTH 4 -#define NUM_DB_TYPES (33+1) - -// TODO -#ifdef _WIN32 -#include -#include -#define ssize_t int -static int pread(unsigned int fd, char *buf, size_t count, int offset); -#endif - -/* 128 bit address in network order */ -typedef struct in6_addr geoipv6_t; - -#define GEOIP_CHKBIT_V6(bit,ptr) (ptr[((127UL - bit) >> 3)] & (1UL << (~(127 - bit) & 7))) - -typedef struct GeoIPTag { - FILE *GeoIPDatabase; - char *file_path; - unsigned char *cache; - unsigned char *index_cache; - unsigned int *databaseSegments; - char databaseType; - time_t mtime; - int flags; - off_t size; - char record_length; - int charset; /* 0 iso-8859-1 1 utf8 */ - int record_iter; /* used in GeoIP_next_record */ - int netmask; /* netmask of last lookup - set using depth in _GeoIP_seek_record */ - time_t last_mtime_check; - off_t dyn_seg_size; /* currently only used by the cityconfidence database */ - unsigned int ext_flags; /* bit 0 teredo support enabled */ -} GeoIP; - - -typedef enum { - GEOIP_TEREDO_BIT = 0 -} GeoIPExtFlags; - -typedef enum { - GEOIP_CHARSET_ISO_8859_1 = 0, - GEOIP_CHARSET_UTF8 = 1 -} GeoIPCharset; - -typedef struct GeoIPRegionTag { - char country_code[3]; - char region[3]; -} GeoIPRegion; - -typedef enum { - GEOIP_STANDARD = 0, - GEOIP_MEMORY_CACHE = 1, - GEOIP_CHECK_CACHE = 2, - GEOIP_INDEX_CACHE = 4, - GEOIP_MMAP_CACHE = 8, -} GeoIPOptions; - -typedef enum { - GEOIP_COUNTRY_EDITION = 1, - GEOIP_REGION_EDITION_REV0 = 7, - GEOIP_CITY_EDITION_REV0 = 6, - GEOIP_ORG_EDITION = 5, - GEOIP_ISP_EDITION = 4, - GEOIP_CITY_EDITION_REV1 = 2, - GEOIP_REGION_EDITION_REV1 = 3, - GEOIP_PROXY_EDITION = 8, - GEOIP_ASNUM_EDITION = 9, - GEOIP_NETSPEED_EDITION = 10, - GEOIP_DOMAIN_EDITION = 11, - GEOIP_COUNTRY_EDITION_V6 = 12, - GEOIP_LOCATIONA_EDITION = 13, - GEOIP_ACCURACYRADIUS_EDITION = 14, - GEOIP_CITYCONFIDENCE_EDITION = 15, - GEOIP_CITYCONFIDENCEDIST_EDITION = 16, - GEOIP_LARGE_COUNTRY_EDITION = 17, - GEOIP_LARGE_COUNTRY_EDITION_V6 = 18, - GEOIP_CITYCONFIDENCEDIST_ISP_ORG_EDITION = 19, /* unsued, but gaps are not allowed */ - GEOIP_CCM_COUNTRY_EDITION =20, /* unsued, but gaps are not allowed */ - GEOIP_ASNUM_EDITION_V6 = 21, - GEOIP_ISP_EDITION_V6 = 22, - GEOIP_ORG_EDITION_V6 = 23, - GEOIP_DOMAIN_EDITION_V6 = 24, - GEOIP_LOCATIONA_EDITION_V6 = 25, - GEOIP_REGISTRAR_EDITION = 26, - GEOIP_REGISTRAR_EDITION_V6 = 27, - GEOIP_USERTYPE_EDITION = 28, - GEOIP_USERTYPE_EDITION_V6 = 29, - GEOIP_CITY_EDITION_REV1_V6 = 30, - GEOIP_CITY_EDITION_REV0_V6 = 31, - GEOIP_NETSPEED_EDITION_REV1 = 32, - GEOIP_NETSPEED_EDITION_REV1_V6 = 33 -} GeoIPDBTypes; - -typedef enum { - GEOIP_ANON_PROXY = 1, - GEOIP_HTTP_X_FORWARDED_FOR_PROXY = 2, - GEOIP_HTTP_CLIENT_IP_PROXY = 3, -} GeoIPProxyTypes; - -typedef enum { - GEOIP_UNKNOWN_SPEED = 0, - GEOIP_DIALUP_SPEED = 1, - GEOIP_CABLEDSL_SPEED = 2, - GEOIP_CORPORATE_SPEED = 3, -} GeoIPNetspeedValues; - -extern char **GeoIPDBFileName; -extern const char * GeoIPDBDescription[NUM_DB_TYPES]; -extern const char *GeoIPCountryDBFileName; -extern const char *GeoIPRegionDBFileName; -extern const char *GeoIPCityDBFileName; -extern const char *GeoIPOrgDBFileName; -extern const char *GeoIPISPDBFileName; -extern const char *GeoIPLocationADBFileName; -extern const char *GeoIPAccuracyRadiusFileName; -extern const char *GeoIPCityConfidenceFileName; - -/* Warning: do not use those arrays as doing so may break your - * program with newer GeoIP versions */ -extern const char GeoIP_country_code[254][3]; -extern const char GeoIP_country_code3[254][4]; -extern const char * GeoIP_country_name[254]; -extern const char * GeoIP_utf8_country_name[254]; -extern const char GeoIP_country_continent[254][3]; - -#ifdef DLL -#define GEOIP_API __declspec(dllexport) -#else -#define GEOIP_API -#endif /* DLL */ - -GEOIP_API void GeoIP_setup_custom_directory(char *dir); -GEOIP_API GeoIP* GeoIP_open_type (int type, int flags); -GEOIP_API GeoIP* GeoIP_new(int flags); -GEOIP_API GeoIP* GeoIP_open(const char * filename, int flags); -GEOIP_API int GeoIP_db_avail(int type); -GEOIP_API void GeoIP_delete(GeoIP* gi); -GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum); - -/* */ -GEOIP_API const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - -GEOIP_API const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *host); - -/* Deprecated - for backwards compatibility only */ -GEOIP_API int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_country_id_by_name (GeoIP* gi, const char *host); -GEOIP_API char *GeoIP_org_by_addr (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_org_by_name (GeoIP* gi, const char *host); -GEOIP_API char *GeoIP_org_by_ipnum (GeoIP* gi, unsigned long ipnum); - -GEOIP_API char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name); - -/* End deprecated */ - -GEOIP_API int GeoIP_id_by_addr (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_id_by_name (GeoIP* gi, const char *host); -GEOIP_API int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum); - -GEOIP_API int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_id_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - -GEOIP_API GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr); -GEOIP_API GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *host); -GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum (GeoIP *gi, unsigned long ipnum); - -GEOIP_API GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP *gi, geoipv6_t ipnum); - -/* Warning - don't call this after GeoIP_assign_region_by_inetaddr calls */ -GEOIP_API void GeoIPRegion_delete (GeoIPRegion *gir); - -GEOIP_API void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *gir); - -GEOIP_API void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *gir); - -/* Used to query GeoIP Organization, ISP and AS Number databases */ -GEOIP_API char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API char *GeoIP_name_by_addr (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_name_by_name (GeoIP* gi, const char *host); - -GEOIP_API char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name); - -/** return two letter country code */ -GEOIP_API const char* GeoIP_code_by_id(int id); - -/** return three letter country code */ -GEOIP_API const char* GeoIP_code3_by_id(int id); - -/** return full name of country in utf8 or iso-8859-1 */ -GEOIP_API const char* GeoIP_country_name_by_id(GeoIP* gi, int id); - -/** return full name of country */ -GEOIP_API const char* GeoIP_name_by_id(int id); - -/** return continent of country */ -GEOIP_API const char* GeoIP_continent_by_id(int id); - -/** return id by country code **/ -GEOIP_API int GeoIP_id_by_code(const char *country); - -/** return return number of known countries */ -GEOIP_API unsigned GeoIP_num_countries(void); - -GEOIP_API char *GeoIP_database_info (GeoIP* gi); -GEOIP_API unsigned char GeoIP_database_edition (GeoIP* gi); - -GEOIP_API int GeoIP_charset (GeoIP* gi); -GEOIP_API int GeoIP_set_charset (GeoIP* gi, int charset); -GEOIP_API int GeoIP_enable_teredo (GeoIP* gi, int true_false ); -GEOIP_API int GeoIP_teredo (GeoIP* gi ); - -GEOIP_API int GeoIP_last_netmask (GeoIP* gi); -GEOIP_API char **GeoIP_range_by_ip (GeoIP* gi, const char *addr); -GEOIP_API void GeoIP_range_by_ip_delete(char **ptr); - -/* Convert region code to region name */ -GEOIP_API const char * GeoIP_region_name_by_code(const char *country_code, const char *region_code); - -/* Get timezone from country and region code */ -GEOIP_API const char * GeoIP_time_zone_by_country_and_region(const char *country_code, const char *region_code); - -/* some v4 helper functions as of 1.4.7 exported to the public API */ -GEOIP_API unsigned long GeoIP_addr_to_num(const char *addr); -GEOIP_API char * GeoIP_num_to_addr(unsigned long ipnum); - -/* Internal function -- convert iso to utf8; return a malloced utf8 string. */ -char * _GeoIP_iso_8859_1__utf8(const char * iso); - -/* Cleans up memory used to hold file name paths. Returns 1 if successful; otherwise 0. - * */ -GEOIP_API int GeoIP_cleanup(void); - -/* Returns the library version in use. Helpful if your loading dynamically. */ -GEOIP_API const char * GeoIP_lib_version(void); - -# -#ifdef __cplusplus -} -#endif - -#endif /* GEOIP_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c deleted file mode 100644 index 8503fcb2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c +++ /dev/null @@ -1,393 +0,0 @@ - -/* - * GeoIPCity.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#if !defined(_WIN32) -#include -#include -#include /* For ntohl */ -#else -#include -#include -#endif -#include /* For uint32_t */ -#ifdef HAVE_STDINT_H -#include /* For uint32_t */ -#endif - -static -const int FULL_RECORD_LENGTH = 50; - -static const int CITYCONFIDENCE_FIXED_RECORD = 4; -static const int CITYCONFIDENCEDIST_FIXED_RECORD = 6; - - -static -GeoIPRecord * -_extract_record(GeoIP * gi, unsigned int seek_record, int *next_record_ptr) -{ - int record_pointer; - unsigned char *record_buf = NULL; - unsigned char *begin_record_buf = NULL; - GeoIPRecord *record; - int str_length = 0; - int j; - double latitude = 0, longitude = 0; - int metroarea_combo = 0; - int bytes_read = 0; - if (seek_record == gi->databaseSegments[0]) - return NULL; - - record = malloc(sizeof(GeoIPRecord)); - memset(record, 0, sizeof(GeoIPRecord)); - record->charset = gi->charset; - - if (gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION - || gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION) { - - int fixed_rec_size = gi->record_length + - ((gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION) - ? CITYCONFIDENCE_FIXED_RECORD - : CITYCONFIDENCEDIST_FIXED_RECORD); - - //allocate max rec size, even for CITYCONFIDENCE_FIXED_RECORD - //+4 is the max_record_length - // TODO - unsigned char tmp_fixed_record[6/*CITYCONFIDENCEDIST_FIXED_RECORD*/ + 4]; - int dseg = gi->databaseSegments[0] * gi->record_length * 2 + gi->record_length; -// int aligned_dseg = dseg ; - - int offset = seek_record - gi->databaseSegments[0] - 1; /* -1 b/c zero is not - * found. but the array - * start with 0 */ - record_pointer = offset * fixed_rec_size + dseg + gi->dyn_seg_size; - if (gi->cache == NULL) { - - /* read from disk */ - bytes_read = pread(fileno(gi->GeoIPDatabase), tmp_fixed_record, fixed_rec_size, record_pointer); - - if (bytes_read != fixed_rec_size) - return NULL; - - record->country_conf = tmp_fixed_record[0]; - record->region_conf = tmp_fixed_record[1]; - record->city_conf = tmp_fixed_record[2]; - record->postal_conf = tmp_fixed_record[3]; - - record->accuracy_radius = - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ? ((tmp_fixed_record[4] + (tmp_fixed_record[5] << 8)) & 0x3ff) : 0x3ff; - - int t = fixed_rec_size - gi->record_length; - - record_pointer = dseg + tmp_fixed_record[t] + - (tmp_fixed_record[t + 1] << 8) + (tmp_fixed_record[t + 2] << 16) ; - - if (gi->record_length == 4) - record_pointer += (tmp_fixed_record[t + 3] << 24); - - begin_record_buf = record_buf = malloc(sizeof(char) * FULL_RECORD_LENGTH); - - bytes_read = pread(fileno(gi->GeoIPDatabase), record_buf, FULL_RECORD_LENGTH, record_pointer); - - if (bytes_read == 0) { - /* eof or other error */ - free(begin_record_buf); - free(record); - return NULL; - } - - } - else { - record_buf = gi->cache + (long) record_pointer; - - record->country_conf = record_buf[0]; - record->region_conf = record_buf[1]; - record->city_conf = record_buf[2]; - record->postal_conf = record_buf[3]; - - record->accuracy_radius = - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ? ((record_buf[4] + (record_buf[5] << 8)) & 0x3ff) : 0x3ff; - - int t = fixed_rec_size - gi->record_length; - - record_pointer = dseg + record_buf[t] + - (record_buf[t + 1] << 8) + (record_buf[t + 2] << 16) ; - - if (gi->record_length == 4) - record_pointer += (record_buf[t + 3] << 24); - - record_buf = gi->cache + (long) record_pointer; - } - - } /* other city records */ - else { - - record->country_conf = GEOIP_UNKNOWN_CONF; - record->region_conf = GEOIP_UNKNOWN_CONF; - record->city_conf = GEOIP_UNKNOWN_CONF; - record->postal_conf = GEOIP_UNKNOWN_CONF; - record->accuracy_radius = GEOIP_UNKNOWN_ACCURACY_RADIUS; - - record_pointer = seek_record + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - begin_record_buf = record_buf = malloc(sizeof(char) * FULL_RECORD_LENGTH); - bytes_read = pread(fileno(gi->GeoIPDatabase), record_buf, FULL_RECORD_LENGTH, record_pointer); - if (bytes_read == 0) { - /* eof or other error */ - free(begin_record_buf); - free(record); - return NULL; - } - } - else { - record_buf = gi->cache + (long) record_pointer; - } - } - - /* get country */ - record->continent_code = (char *) GeoIP_country_continent[record_buf[0]]; - record->country_code = (char *) GeoIP_country_code[record_buf[0]]; - record->country_code3 = (char *) GeoIP_country_code3[record_buf[0]]; - record->country_name = (char *) GeoIP_country_name_by_id(gi, record_buf[0]); - record_buf++; - - /* get region */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - record->region = malloc(str_length + 1); - strncpy(record->region, (char *) record_buf, str_length + 1); - } - record_buf += str_length + 1; - str_length = 0; - - /* get city */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - if (gi->charset == GEOIP_CHARSET_UTF8) { - record->city = _GeoIP_iso_8859_1__utf8((const char *) record_buf); - } - else { - record->city = malloc(str_length + 1); - strncpy(record->city, (const char *) record_buf, str_length + 1); - } - } - record_buf += (str_length + 1); - str_length = 0; - - /* get postal code */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - record->postal_code = malloc(str_length + 1); - strncpy(record->postal_code, (char *) record_buf, str_length + 1); - } - record_buf += (str_length + 1); - - /* get latitude */ - for (j = 0; j < 3; ++j) - latitude += (record_buf[j] << (j * 8)); - record->latitude = latitude / 10000 - 180; - record_buf += 3; - - /* get longitude */ - for (j = 0; j < 3; ++j) - longitude += (record_buf[j] << (j * 8)); - record->longitude = longitude / 10000 - 180; - - /* - * get area code and metro code for post April 2002 databases and for US - * locations - */ - if (GEOIP_CITY_EDITION_REV1 == gi->databaseType - || GEOIP_CITYCONFIDENCE_EDITION == gi->databaseType) { - if (!strcmp(record->country_code, "US")) { - record_buf += 3; - for (j = 0; j < 3; ++j) - metroarea_combo += (record_buf[j] << (j * 8)); - record->metro_code = metroarea_combo / 1000; - record->area_code = metroarea_combo % 1000; - } - } - - if (gi->cache == NULL) - free(begin_record_buf); - - /* Used for GeoIP_next_record */ - if (next_record_ptr != NULL) - *next_record_ptr = seek_record + record_buf - begin_record_buf + 3; - - return record; -} - -static -GeoIPRecord * -_get_record(GeoIP * gi, unsigned long ipnum) -{ - unsigned int seek_record; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0 - && gi->databaseType != GEOIP_CITY_EDITION_REV1 - && gi->databaseType != GEOIP_CITYCONFIDENCE_EDITION - && gi->databaseType != GEOIP_CITYCONFIDENCEDIST_EDITION) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - - seek_record = _GeoIP_seek_record(gi, ipnum); - return _extract_record(gi, seek_record, NULL); -} - -static -GeoIPRecord * -_get_record_v6(GeoIP * gi, geoipv6_t ipnum) -{ - unsigned int seek_record; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0_V6 && - gi->databaseType != GEOIP_CITY_EDITION_REV1_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1_V6]); - return 0; - } - - seek_record = _GeoIP_seek_record_v6(gi, ipnum); - return _extract_record(gi, seek_record, NULL); -} - - - -GeoIPRecord * -GeoIP_record_by_ipnum(GeoIP * gi, unsigned long ipnum) -{ - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_ipnum_v6(GeoIP * gi, geoipv6_t ipnum) -{ - return _get_record_v6(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_addr(GeoIP * gi, const char *addr) -{ - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_addr_v6(GeoIP * gi, const char *addr) -{ - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_record_v6(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_name(GeoIP * gi, const char *name) -{ - unsigned long ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress(name); - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_name_v6(GeoIP * gi, const char *name) -{ - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - return _get_record_v6(gi, ipnum); -} - -int -GeoIP_record_id_by_addr(GeoIP * gi, const char *addr) -{ - unsigned long ipnum; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0 && - gi->databaseType != GEOIP_CITY_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _GeoIP_seek_record(gi, ipnum); -} - -int -GeoIP_record_id_by_addr_v6(GeoIP * gi, const char *addr) -{ - geoipv6_t ipnum; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0_V6 && - gi->databaseType != GEOIP_CITY_EDITION_REV1_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _GeoIP_seek_record_v6(gi, ipnum); -} - -int -GeoIP_init_record_iter(GeoIP * gi) -{ - return gi->databaseSegments[0] + 1; -} - -int -GeoIP_next_record(GeoIP * gi, GeoIPRecord ** gir, int *record_iter) -{ - if (gi->cache != NULL) { - printf("GeoIP_next_record not supported in memory cache mode\n"); - return 1; - } - *gir = _extract_record(gi, *record_iter, record_iter); - return 0; -} - -void -GeoIPRecord_delete(GeoIPRecord * gir) -{ - free(gir->region); - free(gir->city); - free(gir->postal_code); - free(gir); -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h deleted file mode 100644 index f6f8fc80..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIPCity.h - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIPCITY_H -#define GEOIPCITY_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define GEOIP_UNKNOWN_CONF ( 0x7f ) -#define GEOIP_UNKNOWN_ACCURACY_RADIUS ( 0x3ff ) - -typedef struct GeoIPRecordTag { - char *country_code; - char *country_code3; - char *country_name; - char *region; - char *city; - char *postal_code; - float latitude; - float longitude; - union { - int metro_code; /* metro_code is a alias for dma_code */ - int dma_code; - }; - int area_code; - int charset; - char *continent_code; - /* confidence factor for Country/Region/City/Postal */ - unsigned char country_conf, region_conf, city_conf, postal_conf; - int accuracy_radius; -} GeoIPRecord; - -GeoIPRecord * GeoIP_record_by_ipnum (GeoIP* gi, unsigned long ipnum); -GeoIPRecord * GeoIP_record_by_addr (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name (GeoIP* gi, const char *host); - -GeoIPRecord * GeoIP_record_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GeoIPRecord * GeoIP_record_by_addr_v6 (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name_v6 (GeoIP* gi, const char *host); - -int GeoIP_record_id_by_addr (GeoIP* gi, const char *addr); -int GeoIP_record_id_by_addr_v6 (GeoIP* gi, const char *addr); - -int GeoIP_init_record_iter (GeoIP* gi); -/* returns 0 on success, 1 on failure */ -int GeoIP_next_record (GeoIP* gi, GeoIPRecord **gir, int *record_iter); - -void GeoIPRecord_delete (GeoIPRecord *gir); - -/* NULL on failure otherwise a malloced string in utf8 */ -/* char * GeoIP_iso_8859_1__utf8(const char *); */ - -#ifdef __cplusplus -} -#endif - -#endif /* GEOIPCITY_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c deleted file mode 100644 index 008c9d93..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c +++ /dev/null @@ -1,975 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIPUpdate.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIPCity.h" -#include "GeoIP.h" -#include "GeoIPUpdate.h" -#include "GeoIP_internal.h" - -#include "global.h" -#include "md5.h" -#include -#if !defined(_WIN32) -#include -#include -#include -#include -#else -#include -//#include -#include -#endif -#include -#include -#include -//#include - - -#define BLOCK_SIZE 1024 - -/* Update DB Host & HTTP GET Request formats: - * ------------------------------------------ - * GET must support an optional HTTP Proxy. - */ -const char *GeoIPUpdateHost = "updates.maxmind.com"; -/* This is the direct, or proxy port number. */ -static int GeoIPHTTPPort = 80; -/* License-only format (OLD) */ -const char *GeoIPHTTPRequest = "GET %s%s/app/update?license_key=%s&md5=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; -/* General DB Types formats */ -const char *GeoIPHTTPRequestFilename = "GET %s%s/app/update_getfilename?product_id=%s HTTP/1.0\nHost: %s\n\n"; -const char *GeoIPHTTPRequestClientIP = "GET %s%s/app/update_getipaddr HTTP/1.0\nHost: %s\n\n"; -const char *GeoIPHTTPRequestMD5 = "GET %s%s/app/update_secure?db_md5=%s&challenge_md5=%s&user_id=%s&edition_id=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; - -/* messages */ -const char *NoCurrentDB = "%s can't be opened, proceeding to download database\n"; -const char *MD5Info = "MD5 Digest of installed database is %s\n"; -const char *SavingGzip = "Saving gzip file to %s ... "; -const char *WritingFile = "Writing uncompressed data to %s ..."; - -const char * GeoIP_get_error_message(int i) { - switch (i) { - case GEOIP_NO_NEW_UPDATES: - return "no new updates"; - case GEOIP_SUCCESS: - return "Success"; - case GEOIP_LICENSE_KEY_INVALID_ERR: - return "License Key Invalid"; - case GEOIP_DNS_ERR: - return "Unable to resolve hostname"; - case GEOIP_NON_IPV4_ERR: - return "Non - IPv4 address"; - case GEOIP_SOCKET_OPEN_ERR: - return "Error opening socket"; - case GEOIP_CONNECTION_ERR: - return "Unable to connect"; - case GEOIP_GZIP_IO_ERR: - return "Unable to write GeoIP.dat.gz file"; - case GEOIP_TEST_IO_ERR: - return "Unable to write GeoIP.dat.test file"; - case GEOIP_GZIP_READ_ERR: - return "Unable to read gzip data"; - case GEOIP_OUT_OF_MEMORY_ERR: - return "Out of memory error"; - case GEOIP_SOCKET_READ_ERR: - return "Error reading from socket, see errno"; - case GEOIP_SANITY_OPEN_ERR: - return "Sanity check GeoIP_open error"; - case GEOIP_SANITY_INFO_FAIL: - return "Sanity check database_info string failed"; - case GEOIP_SANITY_LOOKUP_FAIL: - return "Sanity check ip address lookup failed"; - case GEOIP_RENAME_ERR: - return "Rename error while installing db, check errno"; - case GEOIP_USER_ID_INVALID_ERR: - return "Invalid userID"; - case GEOIP_PRODUCT_ID_INVALID_ERR: - return "Invalid product ID or subscription expired"; - case GEOIP_INVALID_SERVER_RESPONSE: - return "Server returned something unexpected"; - default: - return "no error"; - } -} -int GeoIP_fprintf(int (*f)(FILE *, char *),FILE *fp, const char *str, ...) { - va_list ap; - int rc; - char * f_str; - int silence; - - if ( f == NULL ) - return 0; - va_start(ap, str); -#if defined(HAVE_VASPRINTF) - silence = vasprintf(&f_str, str, ap); -#elif defined (HAVE_VSNPRINTF) - f_str = malloc(4096); - if ( f_str ) - silence = vsnprintf(f_str, 4096, str, ap); -#else - f_str = malloc(4096); - if ( f_str ) - silence = vsprintf(f_str, str, ap); -#endif - va_end(ap); - if ( f_str == NULL ) - return -1; - rc = (*f)(fp, f_str); - free(f_str); - return(rc); -} - -void GeoIP_printf(void (*f)(char *), const char *str,...) { - va_list params; - char * f_str; - int silence; - if (f == NULL) - return; - va_start(params, str); -#if defined(HAVE_VASPRINTF) - silence = vasprintf(&f_str, str, params); -#elif defined (HAVE_VSNPRINTF) - f_str = malloc(4096); - if ( f_str ) - silence = vsnprintf(f_str, 4096, str, params); -#else - f_str = malloc(4096); - if ( f_str ) - silence = vsprintf(f_str, str, params); -#endif - va_end(params); - if ( f_str == NULL ) - return; - (*f)(f_str); - free(f_str); -} - -/* Support HTTP Proxy Host - * -------------------------------------------------- - * Use typical OS support for the optional HTTP Proxy. - * - * Proxy adds http://{real-hostname} to URI format strings: - * sprintf("GET %s%s/ HTTP/1.0\r\n",GeoIPProxyHTTP,GeoIPProxiedHost, ...); - */ - -/* The Protocol is usually "" OR "http://" with a proxy. */ -static char *GeoIPProxyHTTP = ""; -/* GeoIP Hostname where proxy forwards requests. */ -static char *GeoIPProxiedHost = ""; - -/* Read http_proxy env. variable & parse it. - * ----------------------------------------- - * Allow only these formats: - * "http://server.com", "http://server.com:8080" - * OR - * "server.com", "server.com:8080" - * - * A "user:password@" part will break this. - */ -short int parse_http_proxy(char **proxy_host, int *port) { - char * http_proxy; - char * port_value; - - if ((http_proxy = getenv("http_proxy"))) { - - if (! strncmp("http://", http_proxy, 7)) http_proxy += 7; - - *proxy_host = strdup(http_proxy); - if ( *proxy_host == NULL ) - return 0; /* let the other functions deal with the memory error */ - - if ((port_value = strchr(*proxy_host, ':'))) { - *port_value++ = '\0'; - *port = atoi(port_value); - } - else { - *port = 80; - } - return(1); - } - else { - return(0); - } -} - -/* Get the GeoIP host or the current HTTP Proxy host. */ -struct hostent *GeoIP_get_host_or_proxy (void) { - char * hostname = (char *) GeoIPUpdateHost; - char * proxy_host; - int proxy_port; - - /* Set Proxy from OS: Unix/Linux */ - if (parse_http_proxy(&proxy_host,&proxy_port)) { - hostname = proxy_host; - GeoIPProxyHTTP = "http://"; - GeoIPProxiedHost = (char *) GeoIPUpdateHost; - GeoIPHTTPPort = proxy_port; - } - - /* Resolve DNS host entry. */ - return(gethostbyname(hostname)); -} - -short int GeoIP_update_database (char * license_key, int verbose, void (*f)( char * )) { - struct hostent *hostlist; - int sock; - char * buf; - struct sockaddr_in sa; - int offset = 0, err; - char * request_uri; - char * compr; - unsigned long comprLen; - FILE *comp_fh, *cur_db_fh, *gi_fh; - gzFile gz_fh; - char * file_path_gz, * file_path_test; - MD5_CONTEXT context; - unsigned char buffer[1024], digest[16]; - char hex_digest[33] = "00000000000000000000000000000000\0"; - unsigned int i; - GeoIP * gi; - char * db_info; - char block[BLOCK_SIZE]; - int block_size = BLOCK_SIZE; - size_t len; - size_t written; - _GeoIP_setup_dbfilename(); - - /* get MD5 of current GeoIP database file */ - if ((cur_db_fh = fopen (GeoIPDBFileName[GEOIP_COUNTRY_EDITION], "rb")) == NULL) { - GeoIP_printf(f,"%s%s", NoCurrentDB, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - md5_init(&context); - while ((len = fread (buffer, 1, 1024, cur_db_fh)) > 0) - md5_write (&context, buffer, len); - md5_final (&context); - memcpy(digest,context.buf,16); - fclose (cur_db_fh); - for (i = 0; i < 16; i++) { - // "%02x" will write 3 chars - snprintf (&hex_digest[2*i], 3, "%02x", digest[i]); - } - GeoIP_printf(f, MD5Info, hex_digest); - } - - hostlist = GeoIP_get_host_or_proxy(); - - if (hostlist == NULL) - return GEOIP_DNS_ERR; - - if (hostlist->h_addrtype != AF_INET) - return GEOIP_NON_IPV4_ERR; - - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1){ - GeoIP_printf(f,"Connecting to MaxMind GeoIP Update server\n"); - GeoIP_printf(f, "via Host or Proxy Server: %s:%d\n", hostlist->h_name, GeoIPHTTPPort); - } - - /* Download gzip file */ - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - - request_uri = malloc(sizeof(char) * (strlen(license_key) + strlen(GeoIPHTTPRequest) - + strlen(GeoIPProxyHTTP) + strlen(GeoIPProxiedHost) + 36 + 1)); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - sprintf(request_uri,GeoIPHTTPRequest,GeoIPProxyHTTP,GeoIPProxiedHost,license_key, hex_digest); - send(sock, request_uri, strlen(request_uri),0); - free(request_uri); - - buf = malloc(sizeof(char) * block_size + 1); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Downloading gzipped GeoIP Database...\n"); - - for (;;) { - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size + 1); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - } - - buf[offset]=0; - compr = strstr(buf, "\r\n\r\n"); - if ( compr == NULL ) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - /* skip searchstr "\r\n\r\n" */ - compr += 4; - comprLen = offset + buf - compr; - - if (strstr(compr, "License Key Invalid") != NULL) { - if (verbose == 1) - GeoIP_printf(f,"Failed\n"); - free(buf); - return GEOIP_LICENSE_KEY_INVALID_ERR; - } else if (strstr(compr, "Invalid product ID or subscription expired") != NULL){ - free(buf); - return GEOIP_PRODUCT_ID_INVALID_ERR; - } else if (strstr(compr, "No new updates available") != NULL) { - free(buf); - return GEOIP_NO_NEW_UPDATES; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - /* save gzip file */ - file_path_gz = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 4)); - if (file_path_gz == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_gz,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_gz,".gz"); - if (verbose == 1) { - GeoIP_printf(f, SavingGzip, file_path_gz); - } - comp_fh = fopen(file_path_gz, "wb"); - - if(comp_fh == NULL) { - free(file_path_gz); - free(buf); - return GEOIP_GZIP_IO_ERR; - } - - written = fwrite(compr, 1, comprLen, comp_fh); - fclose(comp_fh); - free(buf); - - if ( written != comprLen ) - return GEOIP_GZIP_IO_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) - GeoIP_printf(f,"Uncompressing gzip file ... "); - - /* uncompress gzip file */ - gz_fh = gzopen(file_path_gz, "rb"); - file_path_test = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 6)); - if (file_path_test == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_test,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_test,".test"); - gi_fh = fopen(file_path_test, "wb"); - - if(gi_fh == NULL) { - free(file_path_test); - return GEOIP_TEST_IO_ERR; - } - for (;;) { - int amt; - amt = gzread(gz_fh, block, block_size); - if (amt == -1) { - free(file_path_test); - fclose(gi_fh); - gzclose(gz_fh); - return GEOIP_GZIP_READ_ERR; - } - if (amt == 0) { - break; - } - if ( fwrite(block,1,amt,gi_fh) != amt ){ - free(file_path_test); - fclose(gi_fh); - gzclose(gz_fh); - return GEOIP_GZIP_READ_ERR; - } - } - gzclose(gz_fh); - unlink(file_path_gz); - free(file_path_gz); - fclose(gi_fh); - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) { - GeoIP_printf(f, WritingFile, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } - - /* sanity check */ - gi = GeoIP_open(file_path_test, GEOIP_STANDARD); - - if (verbose == 1) - GeoIP_printf(f,"Performing santity checks ... "); - - if (gi == NULL) { - GeoIP_printf(f,"Error opening sanity check database\n"); - return GEOIP_SANITY_OPEN_ERR; - } - - /* this checks to make sure the files is complete, since info is at the end */ - /* dependent on future databases having MaxMind in info */ - if (verbose == 1) - GeoIP_printf(f,"database_info "); - db_info = GeoIP_database_info(gi); - if (db_info == NULL) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_INFO_FAIL; - } - if (strstr(db_info, "MaxMind") == NULL) { - free(db_info); - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_INFO_FAIL; - } - free(db_info); - if (verbose == 1) - GeoIP_printf(f,"PASS "); - - /* this performs an IP lookup test of a US IP address */ - if (verbose == 1) - GeoIP_printf(f,"lookup "); - if (strcmp(GeoIP_country_code_by_addr(gi,"24.24.24.24"), "US") != 0) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_LOOKUP_FAIL; - } - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"PASS\n"); - - /* install GeoIP.dat.test -> GeoIP.dat */ - err = rename(file_path_test, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - if (err != 0) { - GeoIP_printf(f,"GeoIP Install error while renaming file\n"); - return GEOIP_RENAME_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - return 0; -} - -short int GeoIP_update_database_general (char * user_id,char * license_key,char *data_base_type, int verbose,char ** client_ipaddr, void (*f)( char *)) { - struct hostent *hostlist; - int sock; - char * buf; - struct sockaddr_in sa; - int offset = 0, err; - char * request_uri; - char * compr; - unsigned long comprLen; - FILE *comp_fh, *cur_db_fh, *gi_fh; - gzFile gz_fh; - char * file_path_gz, * file_path_test; - MD5_CONTEXT context; - MD5_CONTEXT context2; - unsigned char buffer[1024], digest[16] ,digest2[16]; - char hex_digest[33] = "0000000000000000000000000000000\0"; - char hex_digest2[33] = "0000000000000000000000000000000\0"; - unsigned int i; - char *f_str; - GeoIP * gi; - char * db_info; - char *ipaddress; - char *geoipfilename; - char *tmpstr; - int dbtype; - int lookupresult = 1; - char block[BLOCK_SIZE]; - int block_size = BLOCK_SIZE; - size_t len; - size_t request_uri_len; - size_t size; - - hostlist = GeoIP_get_host_or_proxy(); - - if (hostlist == NULL) - return GEOIP_DNS_ERR; - - if (hostlist->h_addrtype != AF_INET) - return GEOIP_NON_IPV4_ERR; - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1) { - GeoIP_printf(f,"Connecting to MaxMind GeoIP server\n"); - GeoIP_printf(f, "via Host or Proxy Server: %s:%d\n", hostlist->h_name, GeoIPHTTPPort); - } - - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - request_uri = malloc(sizeof(char) * (strlen(GeoIPHTTPRequestFilename) - + strlen(GeoIPProxyHTTP) + strlen(GeoIPProxiedHost) - + strlen(data_base_type) + strlen(GeoIPUpdateHost) + 1)); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - /* get the file name from a web page using the product id */ - sprintf(request_uri,GeoIPHTTPRequestFilename,GeoIPProxyHTTP,GeoIPProxiedHost,data_base_type,GeoIPUpdateHost); - if (verbose == 1) { - GeoIP_printf(f, "sending request %s \n",request_uri); - } - send(sock, request_uri, strlen(request_uri),0); /* send the request */ - free(request_uri); - buf = malloc(sizeof(char) * (block_size+4)); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - offset = 0; - for (;;){ - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0){ - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset + block_size + 4); - } - buf[offset] = 0; - offset = 0; - tmpstr = strstr(buf, "\r\n\r\n"); - if ( tmpstr == NULL ) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - /* skip searchstr "\r\n\r\n" */ - tmpstr += 4; - if (tmpstr[0] == '.' || strchr(tmpstr, '/') != NULL || strchr(tmpstr, '\\') != NULL) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - geoipfilename = _GeoIP_full_path_to(tmpstr); - free(buf); - - /* print the database product id and the database filename */ - if (verbose == 1){ - GeoIP_printf(f, "database product id %s database file name %s \n",data_base_type,geoipfilename); - } - _GeoIP_setup_dbfilename(); - - /* get MD5 of current GeoIP database file */ - if ((cur_db_fh = fopen (geoipfilename, "rb")) == NULL) { - GeoIP_printf(f, NoCurrentDB, geoipfilename); - } else { - md5_init(&context); - while ((len = fread (buffer, 1, 1024, cur_db_fh)) > 0) - md5_write (&context, buffer, len); - md5_final (&context); - memcpy(digest,context.buf,16); - fclose (cur_db_fh); - for (i = 0; i < 16; i++) - sprintf (&hex_digest[2*i], "%02x", digest[i]); - GeoIP_printf(f, MD5Info, hex_digest ); - } - if (verbose == 1) { - GeoIP_printf(f,"MD5 sum of database %s is %s \n",geoipfilename,hex_digest); - } - if (client_ipaddr[0] == NULL) { - /* We haven't gotten our IP address yet, so let's request it */ - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - free(geoipfilename); - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1) - GeoIP_printf(f,"Connecting to MaxMind GeoIP Update server\n"); - - /* Download gzip file */ - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) { - free(geoipfilename); - return GEOIP_CONNECTION_ERR; - } - request_uri = malloc(sizeof(char) * (strlen(GeoIPHTTPRequestClientIP) - + strlen(GeoIPProxyHTTP) - + strlen(GeoIPProxiedHost) - + strlen(GeoIPUpdateHost) + 1 )); - if (request_uri == NULL) { - free(geoipfilename); - return GEOIP_OUT_OF_MEMORY_ERR; - } - - /* get client ip address from MaxMind web page */ - sprintf(request_uri,GeoIPHTTPRequestClientIP,GeoIPProxyHTTP,GeoIPProxiedHost,GeoIPUpdateHost); - send(sock, request_uri, strlen(request_uri),0); /* send the request */ - if (verbose == 1) { - GeoIP_printf(f, "sending request %s", request_uri); - } - free(request_uri); - buf = malloc(sizeof(char) * (block_size+1)); - if (buf == NULL) { - free(geoipfilename); - return GEOIP_OUT_OF_MEMORY_ERR; - } - offset = 0; - - for (;;){ - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size+1); - } - - buf[offset] = 0; - offset = 0; - ipaddress = strstr(buf, "\r\n\r\n") + 4; /* get the ip address */ - ipaddress = malloc(strlen(strstr(buf, "\r\n\r\n") + 4)+5); - strcpy(ipaddress,strstr(buf, "\r\n\r\n") + 4); - client_ipaddr[0] = ipaddress; - if (verbose == 1) { - GeoIP_printf(f, "client ip address: %s\n",ipaddress); - } - free(buf); - close(sock); - } - - ipaddress = client_ipaddr[0]; - - /* make a md5 sum of ip address and license_key and store it in hex_digest2 */ - md5_init(&context2); - md5_write (&context2, (byte *)license_key, 12);//add license key to the md5 sum - md5_write (&context2, (byte *)ipaddress, strlen(ipaddress));//add ip address to the md5 sum - md5_final (&context2); - memcpy(digest2,context2.buf,16); - for (i = 0; i < 16; i++) - snprintf (&hex_digest2[2*i], 3, "%02x", digest2[i]);// change the digest to a hex digest - if (verbose == 1) { - GeoIP_printf(f, "md5sum of ip address and license key is %s \n",hex_digest2); - } - - /* send the request using the user id,product id, - * md5 sum of the prev database and - * the md5 sum of the license_key and ip address */ - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - request_uri_len = sizeof(char) * 2036; - request_uri = malloc(request_uri_len); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - snprintf(request_uri, request_uri_len, GeoIPHTTPRequestMD5,GeoIPProxyHTTP,GeoIPProxiedHost,hex_digest,hex_digest2,user_id,data_base_type); - send(sock, request_uri, strlen(request_uri),0); - if (verbose == 1) { - GeoIP_printf(f, "sending request %s\n",request_uri); - } - - free(request_uri); - - offset = 0; - buf = malloc(sizeof(char) * block_size); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Downloading gzipped GeoIP Database...\n"); - - for (;;) { - int amt; - amt = recv(sock, &buf[offset], block_size,0); - - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - } - - compr = strstr(buf, "\r\n\r\n") + 4; - comprLen = offset + buf - compr; - - if (strstr(compr, "License Key Invalid") != NULL) { - if (verbose == 1) - GeoIP_printf(f,"Failed\n"); - free(buf); - return GEOIP_LICENSE_KEY_INVALID_ERR; - } else if (strstr(compr, "No new updates available") != NULL) { - free(buf); - GeoIP_printf(f, "%s is up to date, no updates required\n", geoipfilename); - return GEOIP_NO_NEW_UPDATES; - } else if (strstr(compr, "Invalid UserId") != NULL){ - free(buf); - return GEOIP_USER_ID_INVALID_ERR; - } else if (strstr(compr, "Invalid product ID or subscription expired") != NULL){ - free(buf); - return GEOIP_PRODUCT_ID_INVALID_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - GeoIP_printf(f, "Updating %s\n", geoipfilename); - - /* save gzip file */ - file_path_gz = malloc(sizeof(char) * (strlen(geoipfilename) + 4)); - - if (file_path_gz == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_gz,geoipfilename); - strcat(file_path_gz,".gz"); - if (verbose == 1) { - GeoIP_printf(f, SavingGzip, file_path_gz ); - } - comp_fh = fopen(file_path_gz, "wb"); - - if(comp_fh == NULL) { - free(file_path_gz); - free(buf); - return GEOIP_GZIP_IO_ERR; - } - - size = fwrite(compr, 1, comprLen, comp_fh); - fclose(comp_fh); - free(buf); - if ( size != comprLen ) { - return GEOIP_GZIP_IO_ERR; - } - - if (verbose == 1) { - GeoIP_printf(f, "download data to a gz file named %s \n",file_path_gz); - GeoIP_printf(f,"Done\n"); - GeoIP_printf(f,"Uncompressing gzip file ... "); - } - - file_path_test = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 6)); - if (file_path_test == NULL) { - free(file_path_gz); - return GEOIP_OUT_OF_MEMORY_ERR; - } - strcpy(file_path_test,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_test,".test"); - gi_fh = fopen(file_path_test, "wb"); - if(gi_fh == NULL) { - free(file_path_test); - free(file_path_gz); - return GEOIP_TEST_IO_ERR; - } - /* uncompress gzip file */ - offset = 0; - gz_fh = gzopen(file_path_gz, "rb"); - for (;;) { - int amt; - amt = gzread(gz_fh, block, block_size); - if (amt == -1) { - free(file_path_gz); - free(file_path_test); - gzclose(gz_fh); - fclose(gi_fh); - return GEOIP_GZIP_READ_ERR; - } - if (amt == 0) { - break; - } - if ( amt != fwrite(block,1,amt,gi_fh) ){ - return GEOIP_GZIP_IO_ERR; - } - } - gzclose(gz_fh); - unlink(file_path_gz); - free(file_path_gz); - fclose(gi_fh); - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) { - len = strlen(WritingFile) + strlen(geoipfilename) - 1; - f_str = malloc(len); - snprintf(f_str,len,WritingFile,geoipfilename); - free(f_str); - } - - /* sanity check */ - gi = GeoIP_open(file_path_test, GEOIP_STANDARD); - - if (verbose == 1) - GeoIP_printf(f,"Performing santity checks ... "); - - if (gi == NULL) { - GeoIP_printf(f,"Error opening sanity check database\n"); - return GEOIP_SANITY_OPEN_ERR; - } - - - /* get the database type */ - dbtype = GeoIP_database_edition(gi); - if (verbose == 1) { - GeoIP_printf(f, "Database type is %d\n",dbtype); - } - - /* this checks to make sure the files is complete, since info is at the end - dependent on future databases having MaxMind in info (ISP and Organization databases currently don't have info string */ - - if ((dbtype != GEOIP_ISP_EDITION)&& - (dbtype != GEOIP_ORG_EDITION)) { - if (verbose == 1) - GeoIP_printf(f,"database_info "); - db_info = GeoIP_database_info(gi); - if (db_info == NULL) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL null\n"); - return GEOIP_SANITY_INFO_FAIL; - } - if (strstr(db_info, "MaxMind") == NULL) { - free(db_info); - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL maxmind\n"); - return GEOIP_SANITY_INFO_FAIL; - } - free(db_info); - if (verbose == 1) - GeoIP_printf(f,"PASS "); - } - - /* this performs an IP lookup test of a US IP address */ - if (verbose == 1) - GeoIP_printf(f,"lookup "); - if (dbtype == GEOIP_NETSPEED_EDITION) { - int netspeed = GeoIP_id_by_name(gi,"24.24.24.24"); - lookupresult = 0; - if (netspeed == GEOIP_CABLEDSL_SPEED){ - lookupresult = 1; - } - } - if (dbtype == GEOIP_COUNTRY_EDITION) { - /* if data base type is country then call the function - * named GeoIP_country_code_by_addr */ - lookupresult = 1; - if (strcmp(GeoIP_country_code_by_addr(gi,"24.24.24.24"), "US") != 0) { - lookupresult = 0; - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_COUNTRY_EDITION\n"); - } - } - if (dbtype == GEOIP_REGION_EDITION_REV1) { - /* if data base type is region then call the function - * named GeoIP_region_by_addr */ - GeoIPRegion *r = GeoIP_region_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_REGION_EDITION\n"); - } - } - if (dbtype == GEOIP_CITY_EDITION_REV1) { - /* if data base type is city then call the function - * named GeoIP_record_by_addr */ - GeoIPRecord *r = GeoIP_record_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_CITY_EDITION\n"); - } - } - if ((dbtype == GEOIP_ISP_EDITION)|| - (dbtype == GEOIP_ORG_EDITION)) { - /* if data base type is isp or org then call the function - * named GeoIP_org_by_addr */ - GeoIPRecord *r = (GeoIPRecord*)GeoIP_org_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - if (dbtype == GEOIP_ISP_EDITION) { - GeoIP_printf(f,"testing GEOIP_ISP_EDITION\n"); - } - if (dbtype == GEOIP_ORG_EDITION) { - GeoIP_printf(f,"testing GEOIP_ORG_EDITION\n"); - } - } - } - if (lookupresult == 0) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_LOOKUP_FAIL; - } - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"PASS\n"); - - /* install GeoIP.dat.test -> GeoIP.dat */ - err = rename(file_path_test, geoipfilename); - if (err != 0) { - GeoIP_printf(f,"GeoIP Install error while renaming file\n"); - return GEOIP_RENAME_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - free(geoipfilename); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h deleted file mode 100644 index 7e6bbe18..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.h - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIPUPDATE_H -#define GEOIPUPDATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -typedef enum { - GEOIP_NO_NEW_UPDATES = 1, /* Database up-to-date, no action taken */ - GEOIP_SUCCESS = 0, /* Success */ - GEOIP_LICENSE_KEY_INVALID_ERR = -1, /* License Key Invalid */ - GEOIP_DNS_ERR = -11, /* Unable to resolve hostname */ - GEOIP_NON_IPV4_ERR = -12, /* Non - IPv4 address */ - GEOIP_SOCKET_OPEN_ERR = -13, /* Error opening socket */ - GEOIP_CONNECTION_ERR = -14, /* Unable to connect */ - GEOIP_GZIP_IO_ERR = -15, /* Unable to write GeoIP.dat.gz file */ - GEOIP_TEST_IO_ERR = -16, /* Unable to write GeoIP.dat.test file */ - GEOIP_GZIP_READ_ERR = -17, /* Unable to read gzip data */ - GEOIP_OUT_OF_MEMORY_ERR = -18, /* Out of memory error */ - GEOIP_SOCKET_READ_ERR = -19, /* Error reading from socket, see errno */ - GEOIP_SANITY_OPEN_ERR = -20, /* Sanity check GeoIP_open error */ - GEOIP_SANITY_INFO_FAIL = -21, /* Sanity check database_info string failed */ - GEOIP_SANITY_LOOKUP_FAIL = -22, /* Sanity check ip address lookup failed */ - GEOIP_RENAME_ERR = -23, /* Rename error while installing db, check errno */ - GEOIP_USER_ID_INVALID_ERR = -24, /* Invalid userID */ - GEOIP_PRODUCT_ID_INVALID_ERR = -25, /* Invalid product ID or subscription expired */ - GEOIP_INVALID_SERVER_RESPONSE = -26 /* Server returned invalid response */ -} GeoIPUpdateCode; - -const char * GeoIP_get_error_message(int i); - -/* Original Update Function, just for MaxMind GeoIP Country database */ - short int GeoIP_update_database (char * license_key, int verbose, void (*f)( char *)); - -/* More generalized update function that works more databases */ - short int GeoIP_update_database_general (char * user_id, char * license_key,char * data_base_type, int verbose,char ** client_ipaddr, void (*f)( char *)); - - /* experimental export */ - int GeoIP_fprintf(int (*f)(FILE *, char *),FILE *fp, const char *fmt, ...); - void GeoIP_printf(void (*f)(char *), const char *fmt, ...); - -#ifdef __cplusplus -} -#endif - -#endif /* GEOIPUPDATE_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h deleted file mode 100644 index c19870fa..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef GEOIP_INTERNAL_H -#define GEOIP_INTERNAL_H - -#include "GeoIP.h" - -GEOIP_API unsigned int _GeoIP_seek_record (GeoIP *gi, unsigned long ipnum); - -GEOIP_API unsigned int _GeoIP_seek_record_v6 (GeoIP *gi, geoipv6_t ipnum); -GEOIP_API geoipv6_t _GeoIP_addr_to_num_v6 (const char *addr); - -GEOIP_API unsigned long _GeoIP_lookupaddress (const char *host); -GEOIP_API geoipv6_t _GeoIP_lookupaddress_v6 (const char *host); -GEOIP_API int __GEOIP_V6_IS_NULL(geoipv6_t v6); - -GEOIP_API void _GeoIP_setup_dbfilename(); -GEOIP_API char *_GeoIP_full_path_to(const char *file_name); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am deleted file mode 100644 index 5fa0a903..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -lib_LTLIBRARIES = libGeoIP.la libGeoIPUpdate.la - -EXTRA_DIST = Makefile.vc md5.h global.h types.h GeoIP_internal.h - -AM_CPPFLAGS = -DGEOIPDATADIR=\"$(pkgdatadir)\" -Wall - -libGeoIP_la_SOURCES = GeoIP.c GeoIPCity.c regionName.c timeZone.c -include_HEADERS = GeoIP.h GeoIPCity.h GeoIPUpdate.h - -libGeoIPUpdate_la_SOURCES = GeoIPUpdate.c md5.c - -libGeoIP_la_LDFLAGS = -version-info @GEOIP_VERSION_INFO@ - -libGeoIPUpdate_la_LIBADD = -lz libGeoIP.la - -GeoIP.lo GeoIP.o: GeoIP.c GeoIP.h - -GeoIPCity.lo GeoIPCity.o: GeoIPCity.c GeoIP.h - -GeoIPUpdate.lo GeoIPUpdate.o: GeoIPUpdate.c GeoIPCity.h GeoIP.h - -regionName.lo regionName.o: regionName.c - -md5.lo md5.o: md5.c - -timeZone.lo timeZone.o: timeZone.c - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in deleted file mode 100644 index 5cb5c9f1..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in +++ /dev/null @@ -1,567 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = libGeoIP -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) -libGeoIP_la_LIBADD = -am_libGeoIP_la_OBJECTS = GeoIP.lo GeoIPCity.lo regionName.lo \ - timeZone.lo -libGeoIP_la_OBJECTS = $(am_libGeoIP_la_OBJECTS) -libGeoIP_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libGeoIP_la_LDFLAGS) $(LDFLAGS) -o $@ -libGeoIPUpdate_la_DEPENDENCIES = libGeoIP.la -am_libGeoIPUpdate_la_OBJECTS = GeoIPUpdate.lo md5.lo -libGeoIPUpdate_la_OBJECTS = $(am_libGeoIPUpdate_la_OBJECTS) -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(libGeoIP_la_SOURCES) $(libGeoIPUpdate_la_SOURCES) -DIST_SOURCES = $(libGeoIP_la_SOURCES) $(libGeoIPUpdate_la_SOURCES) -HEADERS = $(include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -lib_LTLIBRARIES = libGeoIP.la libGeoIPUpdate.la -EXTRA_DIST = Makefile.vc md5.h global.h types.h GeoIP_internal.h -AM_CPPFLAGS = -DGEOIPDATADIR=\"$(pkgdatadir)\" -Wall -libGeoIP_la_SOURCES = GeoIP.c GeoIPCity.c regionName.c timeZone.c -include_HEADERS = GeoIP.h GeoIPCity.h GeoIPUpdate.h -libGeoIPUpdate_la_SOURCES = GeoIPUpdate.c md5.c -libGeoIP_la_LDFLAGS = -version-info @GEOIP_VERSION_INFO@ -libGeoIPUpdate_la_LIBADD = -lz libGeoIP.la -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libGeoIP/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu libGeoIP/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libGeoIP.la: $(libGeoIP_la_OBJECTS) $(libGeoIP_la_DEPENDENCIES) - $(libGeoIP_la_LINK) -rpath $(libdir) $(libGeoIP_la_OBJECTS) $(libGeoIP_la_LIBADD) $(LIBS) -libGeoIPUpdate.la: $(libGeoIPUpdate_la_OBJECTS) $(libGeoIPUpdate_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libGeoIPUpdate_la_OBJECTS) $(libGeoIPUpdate_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIPCity.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIPUpdate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regionName.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeZone.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ - done - -uninstall-includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-includeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libLTLIBRARIES - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-includeHEADERS install-info \ - install-info-am install-libLTLIBRARIES install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES - - -GeoIP.lo GeoIP.o: GeoIP.c GeoIP.h - -GeoIPCity.lo GeoIPCity.o: GeoIPCity.c GeoIP.h - -GeoIPUpdate.lo GeoIPUpdate.o: GeoIPUpdate.c GeoIPCity.h GeoIP.h - -regionName.lo regionName.o: regionName.c - -md5.lo md5.o: md5.c - -timeZone.lo timeZone.o: timeZone.c - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc deleted file mode 100644 index 2a167319..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc +++ /dev/null @@ -1,34 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) -DGEOIPDATADIR=\"$(GEOIPDATADIR)\" - -OBJS=GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -GeoIP.lib: GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj - $(AR) -nologo $(OBJS) $(EXTRA_LIBS) /OUT:GeoIP.lib - -GeoIP.obj: GeoIP.c - $(CC1) -c GeoIP.c $(GEOIPINC) - -GeoIPCity.obj: GeoIPCity.c - $(CC1) -c GeoIPCity.c $(GEOIPINC) - -regionName.obj: regionName.c - $(CC1) -c regionName.c $(GEOIPINC) - -md5.obj: md5.c - $(CC1) -c md5.c $(GEOIPINC) - -timeZone.obj: timeZone.c - $(CC1) -c timeZone.c $(GEOIPINC) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h deleted file mode 100644 index 22c5684b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h +++ /dev/null @@ -1,32 +0,0 @@ -/* GLOBAL.H - RSAREF types and constants - */ - -/* PROTOTYPES should be set to one if and only if the compiler supports - function argument prototyping. -The following makes PROTOTYPES default to 0 if it has not already - - been defined with C compiler flags. - */ -#ifndef PROTOTYPES -#define PROTOTYPES 0 -#endif - -/* POINTER defines a generic pointer type */ -typedef unsigned char *POINTER; - -/* UINT2 defines a two byte word */ -typedef unsigned short int UINT2; - -/* UINT4 defines a four byte word */ -typedef unsigned long int UINT4; - -/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. -If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it - returns an empty list. - */ -#if PROTOTYPES -#define PROTO_LIST(list) list -#else -#define PROTO_LIST(list) () -#endif - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c deleted file mode 100644 index 4b0c237f..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c +++ /dev/null @@ -1,326 +0,0 @@ -/* md5.c - MD5 Message-Digest Algorithm - * Copyright (C) 1995, 1996, 1998, 1999, - * 2000, 2001 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * According to the definition of MD5 in RFC 1321 from April 1992. - * NOTE: This is *not* the same file as the one from glibc. - */ -/* Written by Ulrich Drepper , 1995. */ -/* Heavily modified for GnuPG by */ - -#include -#include -#include -#include - -#include "types.h" - -#ifdef WORDS_BIGENDIAN -#define BIG_ENDIAN_HOST -#endif - -//#define DIM(v) (sizeof(v)/sizeof((v)[0])) -#define wipememory2(_ptr,_set,_len) do { volatile char *_vptr=(volatile char *)(_ptr); size_t _vlen=(_len); while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } } while(0) -#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len) -#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) - -typedef struct { - u32 A,B,C,D; /* chaining variables */ - u32 nblocks; - byte buf[64]; - int count; -} MD5_CONTEXT; - - -void -md5_init( MD5_CONTEXT *ctx ) -{ - ctx->A = 0x67452301; - ctx->B = 0xefcdab89; - ctx->C = 0x98badcfe; - ctx->D = 0x10325476; - - ctx->nblocks = 0; - ctx->count = 0; -} - - - - -/* These are the four functions used in the four steps of the MD5 algorithm - and defined in the RFC 1321. The first function is a little bit optimized - (as found in Colin Plumbs public domain implementation). */ -/* #define FF(b, c, d) ((b & c) | (~b & d)) */ -#define FF(b, c, d) (d ^ (b & (c ^ d))) -#define FG(b, c, d) FF (d, b, c) -#define FH(b, c, d) (b ^ c ^ d) -#define FI(b, c, d) (c ^ (b | ~d)) - -static void -burn_stack (int bytes) -{ - char buf[128]; - - wipememory(buf,sizeof buf); - bytes -= sizeof buf; - if (bytes > 0) - burn_stack (bytes); -} - - - -/**************** - * transform n*64 bytes - */ -static void -/*transform( MD5_CONTEXT *ctx, const void *buffer, size_t len )*/ -transform( MD5_CONTEXT *ctx, byte *data ) -{ - u32 correct_words[16]; - u32 A = ctx->A; - u32 B = ctx->B; - u32 C = ctx->C; - u32 D = ctx->D; - u32 *cwp = correct_words; - -#ifdef BIG_ENDIAN_HOST - { int i; - byte *p2, *p1; - for(i=0, p1=data, p2=(byte*)correct_words; i < 16; i++, p2 += 4 ) { - p2[3] = *p1++; - p2[2] = *p1++; - p2[1] = *p1++; - p2[0] = *p1++; - } - } -#else - memcpy( correct_words, data, 64 ); -#endif - - -#define OP(a, b, c, d, s, T) \ - do \ - { \ - a += FF (b, c, d) + (*cwp++) + T; \ - a = rol(a, s); \ - a += b; \ - } \ - while (0) - - /* Before we start, one word about the strange constants. - They are defined in RFC 1321 as - - T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 - */ - - /* Round 1. */ - OP (A, B, C, D, 7, 0xd76aa478); - OP (D, A, B, C, 12, 0xe8c7b756); - OP (C, D, A, B, 17, 0x242070db); - OP (B, C, D, A, 22, 0xc1bdceee); - OP (A, B, C, D, 7, 0xf57c0faf); - OP (D, A, B, C, 12, 0x4787c62a); - OP (C, D, A, B, 17, 0xa8304613); - OP (B, C, D, A, 22, 0xfd469501); - OP (A, B, C, D, 7, 0x698098d8); - OP (D, A, B, C, 12, 0x8b44f7af); - OP (C, D, A, B, 17, 0xffff5bb1); - OP (B, C, D, A, 22, 0x895cd7be); - OP (A, B, C, D, 7, 0x6b901122); - OP (D, A, B, C, 12, 0xfd987193); - OP (C, D, A, B, 17, 0xa679438e); - OP (B, C, D, A, 22, 0x49b40821); - -#undef OP -#define OP(f, a, b, c, d, k, s, T) \ - do \ - { \ -a += f (b, c, d) + correct_words[k] + T; \ -a = rol(a, s); \ -a += b; \ - } \ - while (0) - - /* Round 2. */ - OP (FG, A, B, C, D, 1, 5, 0xf61e2562); - OP (FG, D, A, B, C, 6, 9, 0xc040b340); - OP (FG, C, D, A, B, 11, 14, 0x265e5a51); - OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); - OP (FG, A, B, C, D, 5, 5, 0xd62f105d); - OP (FG, D, A, B, C, 10, 9, 0x02441453); - OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); - OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); - OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); - OP (FG, D, A, B, C, 14, 9, 0xc33707d6); - OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); - OP (FG, B, C, D, A, 8, 20, 0x455a14ed); - OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); - OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); - OP (FG, C, D, A, B, 7, 14, 0x676f02d9); - OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); - - /* Round 3. */ - OP (FH, A, B, C, D, 5, 4, 0xfffa3942); - OP (FH, D, A, B, C, 8, 11, 0x8771f681); - OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); - OP (FH, B, C, D, A, 14, 23, 0xfde5380c); - OP (FH, A, B, C, D, 1, 4, 0xa4beea44); - OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); - OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); - OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); - OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); - OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); - OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); - OP (FH, B, C, D, A, 6, 23, 0x04881d05); - OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); - OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); - OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); - OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); - - /* Round 4. */ - OP (FI, A, B, C, D, 0, 6, 0xf4292244); - OP (FI, D, A, B, C, 7, 10, 0x432aff97); - OP (FI, C, D, A, B, 14, 15, 0xab9423a7); - OP (FI, B, C, D, A, 5, 21, 0xfc93a039); - OP (FI, A, B, C, D, 12, 6, 0x655b59c3); - OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); - OP (FI, C, D, A, B, 10, 15, 0xffeff47d); - OP (FI, B, C, D, A, 1, 21, 0x85845dd1); - OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); - OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); - OP (FI, C, D, A, B, 6, 15, 0xa3014314); - OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); - OP (FI, A, B, C, D, 4, 6, 0xf7537e82); - OP (FI, D, A, B, C, 11, 10, 0xbd3af235); - OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); - OP (FI, B, C, D, A, 9, 21, 0xeb86d391); - - /* Put checksum in context given as argument. */ - ctx->A += A; - ctx->B += B; - ctx->C += C; - ctx->D += D; -} - - - -/* The routine updates the message-digest context to - * account for the presence of each of the characters inBuf[0..inLen-1] - * in the message whose digest is being computed. - */ -void -md5_write( MD5_CONTEXT *hd, byte *inbuf, size_t inlen) -{ - if( hd->count == 64 ) { /* flush the buffer */ - transform( hd, hd->buf ); - burn_stack (80+6*sizeof(void*)); - hd->count = 0; - hd->nblocks++; - } - if( !inbuf ) - return; - if( hd->count ) { - for( ; inlen && hd->count < 64; inlen-- ) - hd->buf[hd->count++] = *inbuf++; - md5_write( hd, NULL, 0 ); - if( !inlen ) - return; - } - - while( inlen >= 64 ) { - transform( hd, inbuf ); - hd->count = 0; - hd->nblocks++; - inlen -= 64; - inbuf += 64; - } - burn_stack (80+6*sizeof(void*)); - for( ; inlen && hd->count < 64; inlen-- ) - hd->buf[hd->count++] = *inbuf++; -} -/* The routine final terminates the message-digest computation and - * ends with the desired message digest in mdContext->digest[0...15]. - * The handle is prepared for a new MD5 cycle. - * Returns 16 bytes representing the digest. - */ - -void -md5_final( MD5_CONTEXT *hd ) -{ - u32 t, msb, lsb; - byte *p; - - md5_write(hd, NULL, 0); /* flush */; - - t = hd->nblocks; - /* multiply by 64 to make a byte count */ - lsb = t << 6; - msb = t >> 26; - /* add the count */ - t = lsb; - if( (lsb += hd->count) < t ) - msb++; - /* multiply by 8 to make a bit count */ - t = lsb; - lsb <<= 3; - msb <<= 3; - msb |= t >> 29; - - if( hd->count < 56 ) { /* enough room */ - hd->buf[hd->count++] = 0x80; /* pad */ - while( hd->count < 56 ) - hd->buf[hd->count++] = 0; /* pad */ - } - else { /* need one extra block */ - hd->buf[hd->count++] = 0x80; /* pad character */ - while( hd->count < 64 ) - hd->buf[hd->count++] = 0; - md5_write(hd, NULL, 0); /* flush */; - memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ - } - /* append the 64 bit count */ - hd->buf[56] = lsb ; - hd->buf[57] = lsb >> 8; - hd->buf[58] = lsb >> 16; - hd->buf[59] = lsb >> 24; - hd->buf[60] = msb ; - hd->buf[61] = msb >> 8; - hd->buf[62] = msb >> 16; - hd->buf[63] = msb >> 24; - transform( hd, hd->buf ); - burn_stack (80+6*sizeof(void*)); - - p = hd->buf; -#ifdef BIG_ENDIAN_HOST -#define X(a) do { *p++ = hd-> a ; *p++ = hd-> a >> 8; \ - *p++ = hd-> a >> 16; *p++ = hd-> a >> 24; } while(0) -#else /* little endian */ -#define X(a) do { *(u32*)p = hd-> a ; p += 4; } while(0) -#endif - X(A); - X(B); - X(C); - X(D); -#undef X - -} - -static byte * -md5_read( MD5_CONTEXT *hd ) -{ - return hd->buf; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h deleted file mode 100644 index e1607be9..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h +++ /dev/null @@ -1,40 +0,0 @@ -/* MD5.H - header file for MD5C.C - */ - -/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. - */ - -/* MD5 context. */ - -#include "types.h" - -typedef struct { - u32 A,B,C,D; /* chaining variables */ - u32 nblocks; - byte buf[64]; - int count; -} MD5_CONTEXT; - -void md5_init( MD5_CONTEXT *ctx ); -void md5_write( MD5_CONTEXT *hd, byte *inbuf, size_t inlen); -void md5_final( MD5_CONTEXT *hd ); - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c deleted file mode 100644 index 4f90f386..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c +++ /dev/null @@ -1,12780 +0,0 @@ -#include -#include - -const char * GeoIP_region_name_by_code(const char * country_code,const char * region_code) { - const char * name = NULL; - int region_code2 = -1; - if (region_code == NULL) { return NULL; } - - if ( ((region_code[0] >= 48) && (region_code[0] < (48 + 10))) - && ((region_code[1] >= 48) && (region_code[1] < (48 + 10))) - ) { - - /* only numbers, that shorten the large switch statements */ - region_code2 = (region_code[0] - 48) * 10 + region_code[1] - 48; - } - - else if ( ( ((region_code[0] >= 65) && (region_code[0] < (65 + 26))) - || ((region_code[0] >= 48) && (region_code[0] < (48 + 10)))) - && ( ((region_code[1] >= 65) && (region_code[1] < (65 + 26))) - || ((region_code[1] >= 48) && (region_code[1] < (48 + 10)))) - ) { - - region_code2 = (region_code[0] - 48) * (65 + 26 - 48) + region_code[1] - 48 + 100; - } - - if (region_code2 == -1) {return NULL;} - - if (strcmp(country_code,"CA") == 0) { - switch (region_code2) { - case 849: - name = "Alberta"; - break; - case 893: - name = "British Columbia"; - break; - case 1365: - name = "Manitoba"; - break; - case 1408: - name = "New Brunswick"; - break; - case 1418: - name = "Newfoundland"; - break; - case 1425: - name = "Nova Scotia"; - break; - case 1427: - name = "Nunavut"; - break; - case 1463: - name = "Ontario"; - break; - case 1497: - name = "Prince Edward Island"; - break; - case 1538: - name = "Quebec"; - break; - case 1632: - name = "Saskatchewan"; - break; - case 1426: - name = "Northwest Territories"; - break; - case 1899: - name = "Yukon Territory"; - break; - } - } - if (strcmp(country_code,"US") == 0) { - switch (region_code2) { - case 848: - name = "Armed Forces Americas"; - break; - case 852: - name = "Armed Forces Europe, Middle East, & Canada"; - break; - case 858: - name = "Alaska"; - break; - case 859: - name = "Alabama"; - break; - case 863: - name = "Armed Forces Pacific"; - break; - case 865: - name = "Arkansas"; - break; - case 866: - name = "American Samoa"; - break; - case 873: - name = "Arizona"; - break; - case 934: - name = "California"; - break; - case 948: - name = "Colorado"; - break; - case 953: - name = "Connecticut"; - break; - case 979: - name = "District of Columbia"; - break; - case 981: - name = "Delaware"; - break; - case 1074: - name = "Florida"; - break; - case 1075: - name = "Federated States of Micronesia"; - break; - case 1106: - name = "Georgia"; - break; - case 1126: - name = "Guam"; - break; - case 1157: - name = "Hawaii"; - break; - case 1192: - name = "Iowa"; - break; - case 1195: - name = "Idaho"; - break; - case 1203: - name = "Illinois"; - break; - case 1205: - name = "Indiana"; - break; - case 1296: - name = "Kansas"; - break; - case 1302: - name = "Kentucky"; - break; - case 1321: - name = "Louisiana"; - break; - case 1364: - name = "Massachusetts"; - break; - case 1367: - name = "Maryland"; - break; - case 1368: - name = "Maine"; - break; - case 1371: - name = "Marshall Islands"; - break; - case 1372: - name = "Michigan"; - break; - case 1377: - name = "Minnesota"; - break; - case 1378: - name = "Missouri"; - break; - case 1379: - name = "Northern Mariana Islands"; - break; - case 1382: - name = "Mississippi"; - break; - case 1383: - name = "Montana"; - break; - case 1409: - name = "North Carolina"; - break; - case 1410: - name = "North Dakota"; - break; - case 1411: - name = "Nebraska"; - break; - case 1414: - name = "New Hampshire"; - break; - case 1416: - name = "New Jersey"; - break; - case 1419: - name = "New Mexico"; - break; - case 1428: - name = "Nevada"; - break; - case 1431: - name = "New York"; - break; - case 1457: - name = "Ohio"; - break; - case 1460: - name = "Oklahoma"; - break; - case 1467: - name = "Oregon"; - break; - case 1493: - name = "Pennsylvania"; - break; - case 1510: - name = "Puerto Rico"; - break; - case 1515: - name = "Palau"; - break; - case 1587: - name = "Rhode Island"; - break; - case 1624: - name = "South Carolina"; - break; - case 1625: - name = "South Dakota"; - break; - case 1678: - name = "Tennessee"; - break; - case 1688: - name = "Texas"; - break; - case 1727: - name = "Utah"; - break; - case 1751: - name = "Virginia"; - break; - case 1759: - name = "Virgin Islands"; - break; - case 1770: - name = "Vermont"; - break; - case 1794: - name = "Washington"; - break; - case 1815: - name = "West Virginia"; - break; - case 1802: - name = "Wisconsin"; - break; - case 1818: - name = "Wyoming"; - break; - } - } - if (strcmp(country_code,"AD") == 0) { - switch (region_code2) { - case 2: - name = "Canillo"; - break; - case 3: - name = "Encamp"; - break; - case 4: - name = "La Massana"; - break; - case 5: - name = "Ordino"; - break; - case 6: - name = "Sant Julia de Loria"; - break; - case 7: - name = "Andorra la Vella"; - break; - case 8: - name = "Escaldes-Engordany"; - break; - } - } - if (strcmp(country_code,"AE") == 0) { - switch (region_code2) { - case 1: - name = "Abu Dhabi"; - break; - case 2: - name = "Ajman"; - break; - case 3: - name = "Dubai"; - break; - case 4: - name = "Fujairah"; - break; - case 5: - name = "Ras Al Khaimah"; - break; - case 6: - name = "Sharjah"; - break; - case 7: - name = "Umm Al Quwain"; - break; - } - } - if (strcmp(country_code,"AF") == 0) { - switch (region_code2) { - case 1: - name = "Badakhshan"; - break; - case 2: - name = "Badghis"; - break; - case 3: - name = "Baghlan"; - break; - case 5: - name = "Bamian"; - break; - case 6: - name = "Farah"; - break; - case 7: - name = "Faryab"; - break; - case 8: - name = "Ghazni"; - break; - case 9: - name = "Ghowr"; - break; - case 10: - name = "Helmand"; - break; - case 11: - name = "Herat"; - break; - case 13: - name = "Kabol"; - break; - case 14: - name = "Kapisa"; - break; - case 17: - name = "Lowgar"; - break; - case 18: - name = "Nangarhar"; - break; - case 19: - name = "Nimruz"; - break; - case 23: - name = "Kandahar"; - break; - case 24: - name = "Kondoz"; - break; - case 26: - name = "Takhar"; - break; - case 27: - name = "Vardak"; - break; - case 28: - name = "Zabol"; - break; - case 29: - name = "Paktika"; - break; - case 30: - name = "Balkh"; - break; - case 31: - name = "Jowzjan"; - break; - case 32: - name = "Samangan"; - break; - case 33: - name = "Sar-e Pol"; - break; - case 34: - name = "Konar"; - break; - case 35: - name = "Laghman"; - break; - case 36: - name = "Paktia"; - break; - case 37: - name = "Khowst"; - break; - case 38: - name = "Nurestan"; - break; - case 39: - name = "Oruzgan"; - break; - case 40: - name = "Parvan"; - break; - case 41: - name = "Daykondi"; - break; - case 42: - name = "Panjshir"; - break; - } - } - if (strcmp(country_code,"AG") == 0) { - switch (region_code2) { - case 1: - name = "Barbuda"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint John"; - break; - case 5: - name = "Saint Mary"; - break; - case 6: - name = "Saint Paul"; - break; - case 7: - name = "Saint Peter"; - break; - case 8: - name = "Saint Philip"; - break; - case 9: - name = "Redonda"; - break; - } - } - if (strcmp(country_code,"AL") == 0) { - switch (region_code2) { - case 40: - name = "Berat"; - break; - case 41: - name = "Diber"; - break; - case 42: - name = "Durres"; - break; - case 43: - name = "Elbasan"; - break; - case 44: - name = "Fier"; - break; - case 45: - name = "Gjirokaster"; - break; - case 46: - name = "Korce"; - break; - case 47: - name = "Kukes"; - break; - case 48: - name = "Lezhe"; - break; - case 49: - name = "Shkoder"; - break; - case 50: - name = "Tirane"; - break; - case 51: - name = "Vlore"; - break; - } - } - if (strcmp(country_code,"AM") == 0) { - switch (region_code2) { - case 1: - name = "Aragatsotn"; - break; - case 2: - name = "Ararat"; - break; - case 3: - name = "Armavir"; - break; - case 4: - name = "Geghark'unik'"; - break; - case 5: - name = "Kotayk'"; - break; - case 6: - name = "Lorri"; - break; - case 7: - name = "Shirak"; - break; - case 8: - name = "Syunik'"; - break; - case 9: - name = "Tavush"; - break; - case 10: - name = "Vayots' Dzor"; - break; - case 11: - name = "Yerevan"; - break; - } - } - if (strcmp(country_code,"AO") == 0) { - switch (region_code2) { - case 1: - name = "Benguela"; - break; - case 2: - name = "Bie"; - break; - case 3: - name = "Cabinda"; - break; - case 4: - name = "Cuando Cubango"; - break; - case 5: - name = "Cuanza Norte"; - break; - case 6: - name = "Cuanza Sul"; - break; - case 7: - name = "Cunene"; - break; - case 8: - name = "Huambo"; - break; - case 9: - name = "Huila"; - break; - case 12: - name = "Malanje"; - break; - case 13: - name = "Namibe"; - break; - case 14: - name = "Moxico"; - break; - case 15: - name = "Uige"; - break; - case 16: - name = "Zaire"; - break; - case 17: - name = "Lunda Norte"; - break; - case 18: - name = "Lunda Sul"; - break; - case 19: - name = "Bengo"; - break; - case 20: - name = "Luanda"; - break; - } - } - if (strcmp(country_code,"AR") == 0) { - switch (region_code2) { - case 1: - name = "Buenos Aires"; - break; - case 2: - name = "Catamarca"; - break; - case 3: - name = "Chaco"; - break; - case 4: - name = "Chubut"; - break; - case 5: - name = "Cordoba"; - break; - case 6: - name = "Corrientes"; - break; - case 7: - name = "Distrito Federal"; - break; - case 8: - name = "Entre Rios"; - break; - case 9: - name = "Formosa"; - break; - case 10: - name = "Jujuy"; - break; - case 11: - name = "La Pampa"; - break; - case 12: - name = "La Rioja"; - break; - case 13: - name = "Mendoza"; - break; - case 14: - name = "Misiones"; - break; - case 15: - name = "Neuquen"; - break; - case 16: - name = "Rio Negro"; - break; - case 17: - name = "Salta"; - break; - case 18: - name = "San Juan"; - break; - case 19: - name = "San Luis"; - break; - case 20: - name = "Santa Cruz"; - break; - case 21: - name = "Santa Fe"; - break; - case 22: - name = "Santiago del Estero"; - break; - case 23: - name = "Tierra del Fuego"; - break; - case 24: - name = "Tucuman"; - break; - } - } - if (strcmp(country_code,"AT") == 0) { - switch (region_code2) { - case 1: - name = "Burgenland"; - break; - case 2: - name = "Karnten"; - break; - case 3: - name = "Niederosterreich"; - break; - case 4: - name = "Oberosterreich"; - break; - case 5: - name = "Salzburg"; - break; - case 6: - name = "Steiermark"; - break; - case 7: - name = "Tirol"; - break; - case 8: - name = "Vorarlberg"; - break; - case 9: - name = "Wien"; - break; - } - } - if (strcmp(country_code,"AU") == 0) { - switch (region_code2) { - case 1: - name = "Australian Capital Territory"; - break; - case 2: - name = "New South Wales"; - break; - case 3: - name = "Northern Territory"; - break; - case 4: - name = "Queensland"; - break; - case 5: - name = "South Australia"; - break; - case 6: - name = "Tasmania"; - break; - case 7: - name = "Victoria"; - break; - case 8: - name = "Western Australia"; - break; - } - } - if (strcmp(country_code,"AZ") == 0) { - switch (region_code2) { - case 1: - name = "Abseron"; - break; - case 2: - name = "Agcabadi"; - break; - case 3: - name = "Agdam"; - break; - case 4: - name = "Agdas"; - break; - case 5: - name = "Agstafa"; - break; - case 6: - name = "Agsu"; - break; - case 7: - name = "Ali Bayramli"; - break; - case 8: - name = "Astara"; - break; - case 9: - name = "Baki"; - break; - case 10: - name = "Balakan"; - break; - case 11: - name = "Barda"; - break; - case 12: - name = "Beylaqan"; - break; - case 13: - name = "Bilasuvar"; - break; - case 14: - name = "Cabrayil"; - break; - case 15: - name = "Calilabad"; - break; - case 16: - name = "Daskasan"; - break; - case 17: - name = "Davaci"; - break; - case 18: - name = "Fuzuli"; - break; - case 19: - name = "Gadabay"; - break; - case 20: - name = "Ganca"; - break; - case 21: - name = "Goranboy"; - break; - case 22: - name = "Goycay"; - break; - case 23: - name = "Haciqabul"; - break; - case 24: - name = "Imisli"; - break; - case 25: - name = "Ismayilli"; - break; - case 26: - name = "Kalbacar"; - break; - case 27: - name = "Kurdamir"; - break; - case 28: - name = "Lacin"; - break; - case 29: - name = "Lankaran"; - break; - case 30: - name = "Lankaran"; - break; - case 31: - name = "Lerik"; - break; - case 32: - name = "Masalli"; - break; - case 33: - name = "Mingacevir"; - break; - case 34: - name = "Naftalan"; - break; - case 35: - name = "Naxcivan"; - break; - case 36: - name = "Neftcala"; - break; - case 37: - name = "Oguz"; - break; - case 38: - name = "Qabala"; - break; - case 39: - name = "Qax"; - break; - case 40: - name = "Qazax"; - break; - case 41: - name = "Qobustan"; - break; - case 42: - name = "Quba"; - break; - case 43: - name = "Qubadli"; - break; - case 44: - name = "Qusar"; - break; - case 45: - name = "Saatli"; - break; - case 46: - name = "Sabirabad"; - break; - case 47: - name = "Saki"; - break; - case 48: - name = "Saki"; - break; - case 49: - name = "Salyan"; - break; - case 50: - name = "Samaxi"; - break; - case 51: - name = "Samkir"; - break; - case 52: - name = "Samux"; - break; - case 53: - name = "Siyazan"; - break; - case 54: - name = "Sumqayit"; - break; - case 55: - name = "Susa"; - break; - case 56: - name = "Susa"; - break; - case 57: - name = "Tartar"; - break; - case 58: - name = "Tovuz"; - break; - case 59: - name = "Ucar"; - break; - case 60: - name = "Xacmaz"; - break; - case 61: - name = "Xankandi"; - break; - case 62: - name = "Xanlar"; - break; - case 63: - name = "Xizi"; - break; - case 64: - name = "Xocali"; - break; - case 65: - name = "Xocavand"; - break; - case 66: - name = "Yardimli"; - break; - case 67: - name = "Yevlax"; - break; - case 68: - name = "Yevlax"; - break; - case 69: - name = "Zangilan"; - break; - case 70: - name = "Zaqatala"; - break; - case 71: - name = "Zardab"; - break; - } - } - if (strcmp(country_code,"BA") == 0) { - switch (region_code2) { - case 1: - name = "Federation of Bosnia and Herzegovina"; - break; - case 2: - name = "Republika Srpska"; - break; - } - } - if (strcmp(country_code,"BB") == 0) { - switch (region_code2) { - case 1: - name = "Christ Church"; - break; - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint James"; - break; - case 5: - name = "Saint John"; - break; - case 6: - name = "Saint Joseph"; - break; - case 7: - name = "Saint Lucy"; - break; - case 8: - name = "Saint Michael"; - break; - case 9: - name = "Saint Peter"; - break; - case 10: - name = "Saint Philip"; - break; - case 11: - name = "Saint Thomas"; - break; - } - } - if (strcmp(country_code,"BD") == 0) { - switch (region_code2) { - case 81: - name = "Dhaka"; - break; - case 82: - name = "Khulna"; - break; - case 83: - name = "Rajshahi"; - break; - case 84: - name = "Chittagong"; - break; - case 85: - name = "Barisal"; - break; - case 86: - name = "Sylhet"; - break; - } - } - if (strcmp(country_code,"BE") == 0) { - switch (region_code2) { - case 1: - name = "Antwerpen"; - break; - case 3: - name = "Hainaut"; - break; - case 4: - name = "Liege"; - break; - case 5: - name = "Limburg"; - break; - case 6: - name = "Luxembourg"; - break; - case 7: - name = "Namur"; - break; - case 8: - name = "Oost-Vlaanderen"; - break; - case 9: - name = "West-Vlaanderen"; - break; - case 10: - name = "Brabant Wallon"; - break; - case 11: - name = "Brussels Hoofdstedelijk Gewest"; - break; - case 12: - name = "Vlaams-Brabant"; - break; - } - } - if (strcmp(country_code,"BF") == 0) { - switch (region_code2) { - case 15: - name = "Bam"; - break; - case 19: - name = "Boulkiemde"; - break; - case 20: - name = "Ganzourgou"; - break; - case 21: - name = "Gnagna"; - break; - case 28: - name = "Kouritenga"; - break; - case 33: - name = "Oudalan"; - break; - case 34: - name = "Passore"; - break; - case 36: - name = "Sanguie"; - break; - case 40: - name = "Soum"; - break; - case 42: - name = "Tapoa"; - break; - case 44: - name = "Zoundweogo"; - break; - case 45: - name = "Bale"; - break; - case 46: - name = "Banwa"; - break; - case 47: - name = "Bazega"; - break; - case 48: - name = "Bougouriba"; - break; - case 49: - name = "Boulgou"; - break; - case 50: - name = "Gourma"; - break; - case 51: - name = "Houet"; - break; - case 52: - name = "Ioba"; - break; - case 53: - name = "Kadiogo"; - break; - case 54: - name = "Kenedougou"; - break; - case 55: - name = "Komoe"; - break; - case 56: - name = "Komondjari"; - break; - case 57: - name = "Kompienga"; - break; - case 58: - name = "Kossi"; - break; - case 59: - name = "Koulpelogo"; - break; - case 60: - name = "Kourweogo"; - break; - case 61: - name = "Leraba"; - break; - case 62: - name = "Loroum"; - break; - case 63: - name = "Mouhoun"; - break; - case 64: - name = "Namentenga"; - break; - case 65: - name = "Naouri"; - break; - case 66: - name = "Nayala"; - break; - case 67: - name = "Noumbiel"; - break; - case 68: - name = "Oubritenga"; - break; - case 69: - name = "Poni"; - break; - case 70: - name = "Sanmatenga"; - break; - case 71: - name = "Seno"; - break; - case 72: - name = "Sissili"; - break; - case 73: - name = "Sourou"; - break; - case 74: - name = "Tuy"; - break; - case 75: - name = "Yagha"; - break; - case 76: - name = "Yatenga"; - break; - case 77: - name = "Ziro"; - break; - case 78: - name = "Zondoma"; - break; - } - } - if (strcmp(country_code,"BG") == 0) { - switch (region_code2) { - case 33: - name = "Mikhaylovgrad"; - break; - case 38: - name = "Blagoevgrad"; - break; - case 39: - name = "Burgas"; - break; - case 40: - name = "Dobrich"; - break; - case 41: - name = "Gabrovo"; - break; - case 42: - name = "Grad Sofiya"; - break; - case 43: - name = "Khaskovo"; - break; - case 44: - name = "Kurdzhali"; - break; - case 45: - name = "Kyustendil"; - break; - case 46: - name = "Lovech"; - break; - case 47: - name = "Montana"; - break; - case 48: - name = "Pazardzhik"; - break; - case 49: - name = "Pernik"; - break; - case 50: - name = "Pleven"; - break; - case 51: - name = "Plovdiv"; - break; - case 52: - name = "Razgrad"; - break; - case 53: - name = "Ruse"; - break; - case 54: - name = "Shumen"; - break; - case 55: - name = "Silistra"; - break; - case 56: - name = "Sliven"; - break; - case 57: - name = "Smolyan"; - break; - case 58: - name = "Sofiya"; - break; - case 59: - name = "Stara Zagora"; - break; - case 60: - name = "Turgovishte"; - break; - case 61: - name = "Varna"; - break; - case 62: - name = "Veliko Turnovo"; - break; - case 63: - name = "Vidin"; - break; - case 64: - name = "Vratsa"; - break; - case 65: - name = "Yambol"; - break; - } - } - if (strcmp(country_code,"BH") == 0) { - switch (region_code2) { - case 1: - name = "Al Hadd"; - break; - case 2: - name = "Al Manamah"; - break; - case 5: - name = "Jidd Hafs"; - break; - case 6: - name = "Sitrah"; - break; - case 8: - name = "Al Mintaqah al Gharbiyah"; - break; - case 9: - name = "Mintaqat Juzur Hawar"; - break; - case 10: - name = "Al Mintaqah ash Shamaliyah"; - break; - case 11: - name = "Al Mintaqah al Wusta"; - break; - case 12: - name = "Madinat"; - break; - case 13: - name = "Ar Rifa"; - break; - case 14: - name = "Madinat Hamad"; - break; - case 15: - name = "Al Muharraq"; - break; - case 16: - name = "Al Asimah"; - break; - case 17: - name = "Al Janubiyah"; - break; - case 18: - name = "Ash Shamaliyah"; - break; - case 19: - name = "Al Wusta"; - break; - } - } - if (strcmp(country_code,"BI") == 0) { - switch (region_code2) { - case 2: - name = "Bujumbura"; - break; - case 9: - name = "Bubanza"; - break; - case 10: - name = "Bururi"; - break; - case 11: - name = "Cankuzo"; - break; - case 12: - name = "Cibitoke"; - break; - case 13: - name = "Gitega"; - break; - case 14: - name = "Karuzi"; - break; - case 15: - name = "Kayanza"; - break; - case 16: - name = "Kirundo"; - break; - case 17: - name = "Makamba"; - break; - case 18: - name = "Muyinga"; - break; - case 19: - name = "Ngozi"; - break; - case 20: - name = "Rutana"; - break; - case 21: - name = "Ruyigi"; - break; - case 22: - name = "Muramvya"; - break; - case 23: - name = "Mwaro"; - break; - } - } - if (strcmp(country_code,"BJ") == 0) { - switch (region_code2) { - case 7: - name = "Alibori"; - break; - case 8: - name = "Atakora"; - break; - case 9: - name = "Atlanyique"; - break; - case 10: - name = "Borgou"; - break; - case 11: - name = "Collines"; - break; - case 12: - name = "Kouffo"; - break; - case 13: - name = "Donga"; - break; - case 14: - name = "Littoral"; - break; - case 15: - name = "Mono"; - break; - case 16: - name = "Oueme"; - break; - case 17: - name = "Plateau"; - break; - case 18: - name = "Zou"; - break; - } - } - if (strcmp(country_code,"BM") == 0) { - switch (region_code2) { - case 1: - name = "Devonshire"; - break; - case 2: - name = "Hamilton"; - break; - case 3: - name = "Hamilton"; - break; - case 4: - name = "Paget"; - break; - case 5: - name = "Pembroke"; - break; - case 6: - name = "Saint George"; - break; - case 7: - name = "Saint George's"; - break; - case 8: - name = "Sandys"; - break; - case 9: - name = "Smiths"; - break; - case 10: - name = "Southampton"; - break; - case 11: - name = "Warwick"; - break; - } - } - if (strcmp(country_code,"BN") == 0) { - switch (region_code2) { - case 7: - name = "Alibori"; - break; - case 8: - name = "Belait"; - break; - case 9: - name = "Brunei and Muara"; - break; - case 10: - name = "Temburong"; - break; - case 11: - name = "Collines"; - break; - case 12: - name = "Kouffo"; - break; - case 13: - name = "Donga"; - break; - case 14: - name = "Littoral"; - break; - case 15: - name = "Tutong"; - break; - case 16: - name = "Oueme"; - break; - case 17: - name = "Plateau"; - break; - case 18: - name = "Zou"; - break; - } - } - if (strcmp(country_code,"BO") == 0) { - switch (region_code2) { - case 1: - name = "Chuquisaca"; - break; - case 2: - name = "Cochabamba"; - break; - case 3: - name = "El Beni"; - break; - case 4: - name = "La Paz"; - break; - case 5: - name = "Oruro"; - break; - case 6: - name = "Pando"; - break; - case 7: - name = "Potosi"; - break; - case 8: - name = "Santa Cruz"; - break; - case 9: - name = "Tarija"; - break; - } - } - if (strcmp(country_code,"BR") == 0) { - switch (region_code2) { - case 1: - name = "Acre"; - break; - case 2: - name = "Alagoas"; - break; - case 3: - name = "Amapa"; - break; - case 4: - name = "Amazonas"; - break; - case 5: - name = "Bahia"; - break; - case 6: - name = "Ceara"; - break; - case 7: - name = "Distrito Federal"; - break; - case 8: - name = "Espirito Santo"; - break; - case 11: - name = "Mato Grosso do Sul"; - break; - case 13: - name = "Maranhao"; - break; - case 14: - name = "Mato Grosso"; - break; - case 15: - name = "Minas Gerais"; - break; - case 16: - name = "Para"; - break; - case 17: - name = "Paraiba"; - break; - case 18: - name = "Parana"; - break; - case 20: - name = "Piaui"; - break; - case 21: - name = "Rio de Janeiro"; - break; - case 22: - name = "Rio Grande do Norte"; - break; - case 23: - name = "Rio Grande do Sul"; - break; - case 24: - name = "Rondonia"; - break; - case 25: - name = "Roraima"; - break; - case 26: - name = "Santa Catarina"; - break; - case 27: - name = "Sao Paulo"; - break; - case 28: - name = "Sergipe"; - break; - case 29: - name = "Goias"; - break; - case 30: - name = "Pernambuco"; - break; - case 31: - name = "Tocantins"; - break; - } - } - if (strcmp(country_code,"BS") == 0) { - switch (region_code2) { - case 5: - name = "Bimini"; - break; - case 6: - name = "Cat Island"; - break; - case 10: - name = "Exuma"; - break; - case 13: - name = "Inagua"; - break; - case 15: - name = "Long Island"; - break; - case 16: - name = "Mayaguana"; - break; - case 18: - name = "Ragged Island"; - break; - case 22: - name = "Harbour Island"; - break; - case 23: - name = "New Providence"; - break; - case 24: - name = "Acklins and Crooked Islands"; - break; - case 25: - name = "Freeport"; - break; - case 26: - name = "Fresh Creek"; - break; - case 27: - name = "Governor's Harbour"; - break; - case 28: - name = "Green Turtle Cay"; - break; - case 29: - name = "High Rock"; - break; - case 30: - name = "Kemps Bay"; - break; - case 31: - name = "Marsh Harbour"; - break; - case 32: - name = "Nichollstown and Berry Islands"; - break; - case 33: - name = "Rock Sound"; - break; - case 34: - name = "Sandy Point"; - break; - case 35: - name = "San Salvador and Rum Cay"; - break; - } - } - if (strcmp(country_code,"BT") == 0) { - switch (region_code2) { - case 5: - name = "Bumthang"; - break; - case 6: - name = "Chhukha"; - break; - case 7: - name = "Chirang"; - break; - case 8: - name = "Daga"; - break; - case 9: - name = "Geylegphug"; - break; - case 10: - name = "Ha"; - break; - case 11: - name = "Lhuntshi"; - break; - case 12: - name = "Mongar"; - break; - case 13: - name = "Paro"; - break; - case 14: - name = "Pemagatsel"; - break; - case 15: - name = "Punakha"; - break; - case 16: - name = "Samchi"; - break; - case 17: - name = "Samdrup"; - break; - case 18: - name = "Shemgang"; - break; - case 19: - name = "Tashigang"; - break; - case 20: - name = "Thimphu"; - break; - case 21: - name = "Tongsa"; - break; - case 22: - name = "Wangdi Phodrang"; - break; - } - } - if (strcmp(country_code,"BW") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 3: - name = "Ghanzi"; - break; - case 4: - name = "Kgalagadi"; - break; - case 5: - name = "Kgatleng"; - break; - case 6: - name = "Kweneng"; - break; - case 8: - name = "North-East"; - break; - case 9: - name = "South-East"; - break; - case 10: - name = "Southern"; - break; - case 11: - name = "North-West"; - break; - } - } - if (strcmp(country_code,"BY") == 0) { - switch (region_code2) { - case 1: - name = "Brestskaya Voblasts'"; - break; - case 2: - name = "Homyel'skaya Voblasts'"; - break; - case 3: - name = "Hrodzyenskaya Voblasts'"; - break; - case 4: - name = "Minsk"; - break; - case 5: - name = "Minskaya Voblasts'"; - break; - case 6: - name = "Mahilyowskaya Voblasts'"; - break; - case 7: - name = "Vitsyebskaya Voblasts'"; - break; - } - } - if (strcmp(country_code,"BZ") == 0) { - switch (region_code2) { - case 1: - name = "Belize"; - break; - case 2: - name = "Cayo"; - break; - case 3: - name = "Corozal"; - break; - case 4: - name = "Orange Walk"; - break; - case 5: - name = "Stann Creek"; - break; - case 6: - name = "Toledo"; - break; - } - } - if (strcmp(country_code,"CD") == 0) { - switch (region_code2) { - case 1: - name = "Bandundu"; - break; - case 2: - name = "Equateur"; - break; - case 4: - name = "Kasai-Oriental"; - break; - case 5: - name = "Katanga"; - break; - case 6: - name = "Kinshasa"; - break; - case 8: - name = "Bas-Congo"; - break; - case 9: - name = "Orientale"; - break; - case 10: - name = "Maniema"; - break; - case 11: - name = "Nord-Kivu"; - break; - case 12: - name = "Sud-Kivu"; - break; - } - } - if (strcmp(country_code,"CF") == 0) { - switch (region_code2) { - case 1: - name = "Bamingui-Bangoran"; - break; - case 2: - name = "Basse-Kotto"; - break; - case 3: - name = "Haute-Kotto"; - break; - case 4: - name = "Mambere-Kadei"; - break; - case 5: - name = "Haut-Mbomou"; - break; - case 6: - name = "Kemo"; - break; - case 7: - name = "Lobaye"; - break; - case 8: - name = "Mbomou"; - break; - case 9: - name = "Nana-Mambere"; - break; - case 11: - name = "Ouaka"; - break; - case 12: - name = "Ouham"; - break; - case 13: - name = "Ouham-Pende"; - break; - case 14: - name = "Cuvette-Ouest"; - break; - case 15: - name = "Nana-Grebizi"; - break; - case 16: - name = "Sangha-Mbaere"; - break; - case 17: - name = "Ombella-Mpoko"; - break; - case 18: - name = "Bangui"; - break; - } - } - if (strcmp(country_code,"CG") == 0) { - switch (region_code2) { - case 1: - name = "Bouenza"; - break; - case 4: - name = "Kouilou"; - break; - case 5: - name = "Lekoumou"; - break; - case 6: - name = "Likouala"; - break; - case 7: - name = "Niari"; - break; - case 8: - name = "Plateaux"; - break; - case 10: - name = "Sangha"; - break; - case 11: - name = "Pool"; - break; - case 12: - name = "Brazzaville"; - break; - case 13: - name = "Cuvette"; - break; - case 14: - name = "Cuvette-Ouest"; - break; - } - } - if (strcmp(country_code,"CH") == 0) { - switch (region_code2) { - case 1: - name = "Aargau"; - break; - case 2: - name = "Ausser-Rhoden"; - break; - case 3: - name = "Basel-Landschaft"; - break; - case 4: - name = "Basel-Stadt"; - break; - case 5: - name = "Bern"; - break; - case 6: - name = "Fribourg"; - break; - case 7: - name = "Geneve"; - break; - case 8: - name = "Glarus"; - break; - case 9: - name = "Graubunden"; - break; - case 10: - name = "Inner-Rhoden"; - break; - case 11: - name = "Luzern"; - break; - case 12: - name = "Neuchatel"; - break; - case 13: - name = "Nidwalden"; - break; - case 14: - name = "Obwalden"; - break; - case 15: - name = "Sankt Gallen"; - break; - case 16: - name = "Schaffhausen"; - break; - case 17: - name = "Schwyz"; - break; - case 18: - name = "Solothurn"; - break; - case 19: - name = "Thurgau"; - break; - case 20: - name = "Ticino"; - break; - case 21: - name = "Uri"; - break; - case 22: - name = "Valais"; - break; - case 23: - name = "Vaud"; - break; - case 24: - name = "Zug"; - break; - case 25: - name = "Zurich"; - break; - case 26: - name = "Jura"; - break; - } - } - if (strcmp(country_code,"CI") == 0) { - switch (region_code2) { - case 74: - name = "Agneby"; - break; - case 75: - name = "Bafing"; - break; - case 76: - name = "Bas-Sassandra"; - break; - case 77: - name = "Denguele"; - break; - case 78: - name = "Dix-Huit Montagnes"; - break; - case 79: - name = "Fromager"; - break; - case 80: - name = "Haut-Sassandra"; - break; - case 81: - name = "Lacs"; - break; - case 82: - name = "Lagunes"; - break; - case 83: - name = "Marahoue"; - break; - case 84: - name = "Moyen-Cavally"; - break; - case 85: - name = "Moyen-Comoe"; - break; - case 86: - name = "N'zi-Comoe"; - break; - case 87: - name = "Savanes"; - break; - case 88: - name = "Sud-Bandama"; - break; - case 89: - name = "Sud-Comoe"; - break; - case 90: - name = "Vallee du Bandama"; - break; - case 91: - name = "Worodougou"; - break; - case 92: - name = "Zanzan"; - break; - } - } - if (strcmp(country_code,"CL") == 0) { - switch (region_code2) { - case 1: - name = "Valparaiso"; - break; - case 2: - name = "Aisen del General Carlos Ibanez del Campo"; - break; - case 3: - name = "Antofagasta"; - break; - case 4: - name = "Araucania"; - break; - case 5: - name = "Atacama"; - break; - case 6: - name = "Bio-Bio"; - break; - case 7: - name = "Coquimbo"; - break; - case 8: - name = "Libertador General Bernardo O'Higgins"; - break; - case 9: - name = "Los Lagos"; - break; - case 10: - name = "Magallanes y de la Antartica Chilena"; - break; - case 11: - name = "Maule"; - break; - case 12: - name = "Region Metropolitana"; - break; - case 13: - name = "Tarapaca"; - break; - case 14: - name = "Los Lagos"; - break; - case 15: - name = "Tarapaca"; - break; - case 16: - name = "Arica y Parinacota"; - break; - case 17: - name = "Los Rios"; - break; - } - } - if (strcmp(country_code,"CM") == 0) { - switch (region_code2) { - case 4: - name = "Est"; - break; - case 5: - name = "Littoral"; - break; - case 7: - name = "Nord-Ouest"; - break; - case 8: - name = "Ouest"; - break; - case 9: - name = "Sud-Ouest"; - break; - case 10: - name = "Adamaoua"; - break; - case 11: - name = "Centre"; - break; - case 12: - name = "Extreme-Nord"; - break; - case 13: - name = "Nord"; - break; - case 14: - name = "Sud"; - break; - } - } - if (strcmp(country_code,"CN") == 0) { - switch (region_code2) { - case 1: - name = "Anhui"; - break; - case 2: - name = "Zhejiang"; - break; - case 3: - name = "Jiangxi"; - break; - case 4: - name = "Jiangsu"; - break; - case 5: - name = "Jilin"; - break; - case 6: - name = "Qinghai"; - break; - case 7: - name = "Fujian"; - break; - case 8: - name = "Heilongjiang"; - break; - case 9: - name = "Henan"; - break; - case 10: - name = "Hebei"; - break; - case 11: - name = "Hunan"; - break; - case 12: - name = "Hubei"; - break; - case 13: - name = "Xinjiang"; - break; - case 14: - name = "Xizang"; - break; - case 15: - name = "Gansu"; - break; - case 16: - name = "Guangxi"; - break; - case 18: - name = "Guizhou"; - break; - case 19: - name = "Liaoning"; - break; - case 20: - name = "Nei Mongol"; - break; - case 21: - name = "Ningxia"; - break; - case 22: - name = "Beijing"; - break; - case 23: - name = "Shanghai"; - break; - case 24: - name = "Shanxi"; - break; - case 25: - name = "Shandong"; - break; - case 26: - name = "Shaanxi"; - break; - case 28: - name = "Tianjin"; - break; - case 29: - name = "Yunnan"; - break; - case 30: - name = "Guangdong"; - break; - case 31: - name = "Hainan"; - break; - case 32: - name = "Sichuan"; - break; - case 33: - name = "Chongqing"; - break; - } - } - if (strcmp(country_code,"CO") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Antioquia"; - break; - case 3: - name = "Arauca"; - break; - case 4: - name = "Atlantico"; - break; - case 5: - name = "Bolivar Department"; - break; - case 6: - name = "Boyaca Department"; - break; - case 7: - name = "Caldas Department"; - break; - case 8: - name = "Caqueta"; - break; - case 9: - name = "Cauca"; - break; - case 10: - name = "Cesar"; - break; - case 11: - name = "Choco"; - break; - case 12: - name = "Cordoba"; - break; - case 14: - name = "Guaviare"; - break; - case 15: - name = "Guainia"; - break; - case 16: - name = "Huila"; - break; - case 17: - name = "La Guajira"; - break; - case 18: - name = "Magdalena Department"; - break; - case 19: - name = "Meta"; - break; - case 20: - name = "Narino"; - break; - case 21: - name = "Norte de Santander"; - break; - case 22: - name = "Putumayo"; - break; - case 23: - name = "Quindio"; - break; - case 24: - name = "Risaralda"; - break; - case 25: - name = "San Andres y Providencia"; - break; - case 26: - name = "Santander"; - break; - case 27: - name = "Sucre"; - break; - case 28: - name = "Tolima"; - break; - case 29: - name = "Valle del Cauca"; - break; - case 30: - name = "Vaupes"; - break; - case 31: - name = "Vichada"; - break; - case 32: - name = "Casanare"; - break; - case 33: - name = "Cundinamarca"; - break; - case 34: - name = "Distrito Especial"; - break; - case 35: - name = "Bolivar"; - break; - case 36: - name = "Boyaca"; - break; - case 37: - name = "Caldas"; - break; - case 38: - name = "Magdalena"; - break; - } - } - if (strcmp(country_code,"CR") == 0) { - switch (region_code2) { - case 1: - name = "Alajuela"; - break; - case 2: - name = "Cartago"; - break; - case 3: - name = "Guanacaste"; - break; - case 4: - name = "Heredia"; - break; - case 6: - name = "Limon"; - break; - case 7: - name = "Puntarenas"; - break; - case 8: - name = "San Jose"; - break; - } - } - if (strcmp(country_code,"CU") == 0) { - switch (region_code2) { - case 1: - name = "Pinar del Rio"; - break; - case 2: - name = "Ciudad de la Habana"; - break; - case 3: - name = "Matanzas"; - break; - case 4: - name = "Isla de la Juventud"; - break; - case 5: - name = "Camaguey"; - break; - case 7: - name = "Ciego de Avila"; - break; - case 8: - name = "Cienfuegos"; - break; - case 9: - name = "Granma"; - break; - case 10: - name = "Guantanamo"; - break; - case 11: - name = "La Habana"; - break; - case 12: - name = "Holguin"; - break; - case 13: - name = "Las Tunas"; - break; - case 14: - name = "Sancti Spiritus"; - break; - case 15: - name = "Santiago de Cuba"; - break; - case 16: - name = "Villa Clara"; - break; - } - } - if (strcmp(country_code,"CV") == 0) { - switch (region_code2) { - case 1: - name = "Boa Vista"; - break; - case 2: - name = "Brava"; - break; - case 4: - name = "Maio"; - break; - case 5: - name = "Paul"; - break; - case 7: - name = "Ribeira Grande"; - break; - case 8: - name = "Sal"; - break; - case 10: - name = "Sao Nicolau"; - break; - case 11: - name = "Sao Vicente"; - break; - case 13: - name = "Mosteiros"; - break; - case 14: - name = "Praia"; - break; - case 15: - name = "Santa Catarina"; - break; - case 16: - name = "Santa Cruz"; - break; - case 17: - name = "Sao Domingos"; - break; - case 18: - name = "Sao Filipe"; - break; - case 19: - name = "Sao Miguel"; - break; - case 20: - name = "Tarrafal"; - break; - } - } - if (strcmp(country_code,"CY") == 0) { - switch (region_code2) { - case 1: - name = "Famagusta"; - break; - case 2: - name = "Kyrenia"; - break; - case 3: - name = "Larnaca"; - break; - case 4: - name = "Nicosia"; - break; - case 5: - name = "Limassol"; - break; - case 6: - name = "Paphos"; - break; - } - } - if (strcmp(country_code,"CZ") == 0) { - switch (region_code2) { - case 52: - name = "Hlavni mesto Praha"; - break; - case 78: - name = "Jihomoravsky kraj"; - break; - case 79: - name = "Jihocesky kraj"; - break; - case 80: - name = "Vysocina"; - break; - case 81: - name = "Karlovarsky kraj"; - break; - case 82: - name = "Kralovehradecky kraj"; - break; - case 83: - name = "Liberecky kraj"; - break; - case 84: - name = "Olomoucky kraj"; - break; - case 85: - name = "Moravskoslezsky kraj"; - break; - case 86: - name = "Pardubicky kraj"; - break; - case 87: - name = "Plzensky kraj"; - break; - case 88: - name = "Stredocesky kraj"; - break; - case 89: - name = "Ustecky kraj"; - break; - case 90: - name = "Zlinsky kraj"; - break; - } - } - if (strcmp(country_code,"DE") == 0) { - switch (region_code2) { - case 1: - name = "Baden-Wurttemberg"; - break; - case 2: - name = "Bayern"; - break; - case 3: - name = "Bremen"; - break; - case 4: - name = "Hamburg"; - break; - case 5: - name = "Hessen"; - break; - case 6: - name = "Niedersachsen"; - break; - case 7: - name = "Nordrhein-Westfalen"; - break; - case 8: - name = "Rheinland-Pfalz"; - break; - case 9: - name = "Saarland"; - break; - case 10: - name = "Schleswig-Holstein"; - break; - case 11: - name = "Brandenburg"; - break; - case 12: - name = "Mecklenburg-Vorpommern"; - break; - case 13: - name = "Sachsen"; - break; - case 14: - name = "Sachsen-Anhalt"; - break; - case 15: - name = "Thuringen"; - break; - case 16: - name = "Berlin"; - break; - } - } - if (strcmp(country_code,"DJ") == 0) { - switch (region_code2) { - case 1: - name = "Ali Sabieh"; - break; - case 4: - name = "Obock"; - break; - case 5: - name = "Tadjoura"; - break; - case 6: - name = "Dikhil"; - break; - case 7: - name = "Djibouti"; - break; - case 8: - name = "Arta"; - break; - } - } - if (strcmp(country_code,"DK") == 0) { - switch (region_code2) { - case 17: - name = "Hovedstaden"; - break; - case 18: - name = "Midtjylland"; - break; - case 19: - name = "Nordjylland"; - break; - case 20: - name = "Sjelland"; - break; - case 21: - name = "Syddanmark"; - break; - } - } - if (strcmp(country_code,"DM") == 0) { - switch (region_code2) { - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint David"; - break; - case 4: - name = "Saint George"; - break; - case 5: - name = "Saint John"; - break; - case 6: - name = "Saint Joseph"; - break; - case 7: - name = "Saint Luke"; - break; - case 8: - name = "Saint Mark"; - break; - case 9: - name = "Saint Patrick"; - break; - case 10: - name = "Saint Paul"; - break; - case 11: - name = "Saint Peter"; - break; - } - } - if (strcmp(country_code,"DO") == 0) { - switch (region_code2) { - case 1: - name = "Azua"; - break; - case 2: - name = "Baoruco"; - break; - case 3: - name = "Barahona"; - break; - case 4: - name = "Dajabon"; - break; - case 5: - name = "Distrito Nacional"; - break; - case 6: - name = "Duarte"; - break; - case 8: - name = "Espaillat"; - break; - case 9: - name = "Independencia"; - break; - case 10: - name = "La Altagracia"; - break; - case 11: - name = "Elias Pina"; - break; - case 12: - name = "La Romana"; - break; - case 14: - name = "Maria Trinidad Sanchez"; - break; - case 15: - name = "Monte Cristi"; - break; - case 16: - name = "Pedernales"; - break; - case 17: - name = "Peravia"; - break; - case 18: - name = "Puerto Plata"; - break; - case 19: - name = "Salcedo"; - break; - case 20: - name = "Samana"; - break; - case 21: - name = "Sanchez Ramirez"; - break; - case 23: - name = "San Juan"; - break; - case 24: - name = "San Pedro De Macoris"; - break; - case 25: - name = "Santiago"; - break; - case 26: - name = "Santiago Rodriguez"; - break; - case 27: - name = "Valverde"; - break; - case 28: - name = "El Seibo"; - break; - case 29: - name = "Hato Mayor"; - break; - case 30: - name = "La Vega"; - break; - case 31: - name = "Monsenor Nouel"; - break; - case 32: - name = "Monte Plata"; - break; - case 33: - name = "San Cristobal"; - break; - case 34: - name = "Distrito Nacional"; - break; - case 35: - name = "Peravia"; - break; - case 36: - name = "San Jose de Ocoa"; - break; - case 37: - name = "Santo Domingo"; - break; - } - } - if (strcmp(country_code,"DZ") == 0) { - switch (region_code2) { - case 1: - name = "Alger"; - break; - case 3: - name = "Batna"; - break; - case 4: - name = "Constantine"; - break; - case 6: - name = "Medea"; - break; - case 7: - name = "Mostaganem"; - break; - case 9: - name = "Oran"; - break; - case 10: - name = "Saida"; - break; - case 12: - name = "Setif"; - break; - case 13: - name = "Tiaret"; - break; - case 14: - name = "Tizi Ouzou"; - break; - case 15: - name = "Tlemcen"; - break; - case 18: - name = "Bejaia"; - break; - case 19: - name = "Biskra"; - break; - case 20: - name = "Blida"; - break; - case 21: - name = "Bouira"; - break; - case 22: - name = "Djelfa"; - break; - case 23: - name = "Guelma"; - break; - case 24: - name = "Jijel"; - break; - case 25: - name = "Laghouat"; - break; - case 26: - name = "Mascara"; - break; - case 27: - name = "M'sila"; - break; - case 29: - name = "Oum el Bouaghi"; - break; - case 30: - name = "Sidi Bel Abbes"; - break; - case 31: - name = "Skikda"; - break; - case 33: - name = "Tebessa"; - break; - case 34: - name = "Adrar"; - break; - case 35: - name = "Ain Defla"; - break; - case 36: - name = "Ain Temouchent"; - break; - case 37: - name = "Annaba"; - break; - case 38: - name = "Bechar"; - break; - case 39: - name = "Bordj Bou Arreridj"; - break; - case 40: - name = "Boumerdes"; - break; - case 41: - name = "Chlef"; - break; - case 42: - name = "El Bayadh"; - break; - case 43: - name = "El Oued"; - break; - case 44: - name = "El Tarf"; - break; - case 45: - name = "Ghardaia"; - break; - case 46: - name = "Illizi"; - break; - case 47: - name = "Khenchela"; - break; - case 48: - name = "Mila"; - break; - case 49: - name = "Naama"; - break; - case 50: - name = "Ouargla"; - break; - case 51: - name = "Relizane"; - break; - case 52: - name = "Souk Ahras"; - break; - case 53: - name = "Tamanghasset"; - break; - case 54: - name = "Tindouf"; - break; - case 55: - name = "Tipaza"; - break; - case 56: - name = "Tissemsilt"; - break; - } - } - if (strcmp(country_code,"EC") == 0) { - switch (region_code2) { - case 1: - name = "Galapagos"; - break; - case 2: - name = "Azuay"; - break; - case 3: - name = "Bolivar"; - break; - case 4: - name = "Canar"; - break; - case 5: - name = "Carchi"; - break; - case 6: - name = "Chimborazo"; - break; - case 7: - name = "Cotopaxi"; - break; - case 8: - name = "El Oro"; - break; - case 9: - name = "Esmeraldas"; - break; - case 10: - name = "Guayas"; - break; - case 11: - name = "Imbabura"; - break; - case 12: - name = "Loja"; - break; - case 13: - name = "Los Rios"; - break; - case 14: - name = "Manabi"; - break; - case 15: - name = "Morona-Santiago"; - break; - case 17: - name = "Pastaza"; - break; - case 18: - name = "Pichincha"; - break; - case 19: - name = "Tungurahua"; - break; - case 20: - name = "Zamora-Chinchipe"; - break; - case 22: - name = "Sucumbios"; - break; - case 23: - name = "Napo"; - break; - case 24: - name = "Orellana"; - break; - } - } - if (strcmp(country_code,"EE") == 0) { - switch (region_code2) { - case 1: - name = "Harjumaa"; - break; - case 2: - name = "Hiiumaa"; - break; - case 3: - name = "Ida-Virumaa"; - break; - case 4: - name = "Jarvamaa"; - break; - case 5: - name = "Jogevamaa"; - break; - case 6: - name = "Kohtla-Jarve"; - break; - case 7: - name = "Laanemaa"; - break; - case 8: - name = "Laane-Virumaa"; - break; - case 9: - name = "Narva"; - break; - case 10: - name = "Parnu"; - break; - case 11: - name = "Parnumaa"; - break; - case 12: - name = "Polvamaa"; - break; - case 13: - name = "Raplamaa"; - break; - case 14: - name = "Saaremaa"; - break; - case 15: - name = "Sillamae"; - break; - case 16: - name = "Tallinn"; - break; - case 17: - name = "Tartu"; - break; - case 18: - name = "Tartumaa"; - break; - case 19: - name = "Valgamaa"; - break; - case 20: - name = "Viljandimaa"; - break; - case 21: - name = "Vorumaa"; - break; - } - } - if (strcmp(country_code,"EG") == 0) { - switch (region_code2) { - case 1: - name = "Ad Daqahliyah"; - break; - case 2: - name = "Al Bahr al Ahmar"; - break; - case 3: - name = "Al Buhayrah"; - break; - case 4: - name = "Al Fayyum"; - break; - case 5: - name = "Al Gharbiyah"; - break; - case 6: - name = "Al Iskandariyah"; - break; - case 7: - name = "Al Isma'iliyah"; - break; - case 8: - name = "Al Jizah"; - break; - case 9: - name = "Al Minufiyah"; - break; - case 10: - name = "Al Minya"; - break; - case 11: - name = "Al Qahirah"; - break; - case 12: - name = "Al Qalyubiyah"; - break; - case 13: - name = "Al Wadi al Jadid"; - break; - case 14: - name = "Ash Sharqiyah"; - break; - case 15: - name = "As Suways"; - break; - case 16: - name = "Aswan"; - break; - case 17: - name = "Asyut"; - break; - case 18: - name = "Bani Suwayf"; - break; - case 19: - name = "Bur Sa'id"; - break; - case 20: - name = "Dumyat"; - break; - case 21: - name = "Kafr ash Shaykh"; - break; - case 22: - name = "Matruh"; - break; - case 23: - name = "Qina"; - break; - case 24: - name = "Suhaj"; - break; - case 26: - name = "Janub Sina'"; - break; - case 27: - name = "Shamal Sina'"; - break; - } - } - if (strcmp(country_code,"ER") == 0) { - switch (region_code2) { - case 1: - name = "Anseba"; - break; - case 2: - name = "Debub"; - break; - case 3: - name = "Debubawi K'eyih Bahri"; - break; - case 4: - name = "Gash Barka"; - break; - case 5: - name = "Ma'akel"; - break; - case 6: - name = "Semenawi K'eyih Bahri"; - break; - } - } - if (strcmp(country_code,"ES") == 0) { - switch (region_code2) { - case 7: - name = "Islas Baleares"; - break; - case 27: - name = "La Rioja"; - break; - case 29: - name = "Madrid"; - break; - case 31: - name = "Murcia"; - break; - case 32: - name = "Navarra"; - break; - case 34: - name = "Asturias"; - break; - case 39: - name = "Cantabria"; - break; - case 51: - name = "Andalucia"; - break; - case 52: - name = "Aragon"; - break; - case 53: - name = "Canarias"; - break; - case 54: - name = "Castilla-La Mancha"; - break; - case 55: - name = "Castilla y Leon"; - break; - case 56: - name = "Catalonia"; - break; - case 57: - name = "Extremadura"; - break; - case 58: - name = "Galicia"; - break; - case 59: - name = "Pais Vasco"; - break; - case 60: - name = "Comunidad Valenciana"; - break; - } - } - if (strcmp(country_code,"ET") == 0) { - switch (region_code2) { - case 44: - name = "Adis Abeba"; - break; - case 45: - name = "Afar"; - break; - case 46: - name = "Amara"; - break; - case 47: - name = "Binshangul Gumuz"; - break; - case 48: - name = "Dire Dawa"; - break; - case 49: - name = "Gambela Hizboch"; - break; - case 50: - name = "Hareri Hizb"; - break; - case 51: - name = "Oromiya"; - break; - case 52: - name = "Sumale"; - break; - case 53: - name = "Tigray"; - break; - case 54: - name = "YeDebub Biheroch Bihereseboch na Hizboch"; - break; - } - } - if (strcmp(country_code,"FI") == 0) { - switch (region_code2) { - case 1: - name = "Aland"; - break; - case 6: - name = "Lapland"; - break; - case 8: - name = "Oulu"; - break; - case 13: - name = "Southern Finland"; - break; - case 14: - name = "Eastern Finland"; - break; - case 15: - name = "Western Finland"; - break; - } - } - if (strcmp(country_code,"FJ") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Eastern"; - break; - case 3: - name = "Northern"; - break; - case 4: - name = "Rotuma"; - break; - case 5: - name = "Western"; - break; - } - } - if (strcmp(country_code,"FM") == 0) { - switch (region_code2) { - case 1: - name = "Kosrae"; - break; - case 2: - name = "Pohnpei"; - break; - case 3: - name = "Chuuk"; - break; - case 4: - name = "Yap"; - break; - } - } - if (strcmp(country_code,"FR") == 0) { - switch (region_code2) { - case 97: - name = "Aquitaine"; - break; - case 98: - name = "Auvergne"; - break; - case 99: - name = "Basse-Normandie"; - break; - case 832: - name = "Bourgogne"; - break; - case 833: - name = "Bretagne"; - break; - case 834: - name = "Centre"; - break; - case 835: - name = "Champagne-Ardenne"; - break; - case 836: - name = "Corse"; - break; - case 837: - name = "Franche-Comte"; - break; - case 838: - name = "Haute-Normandie"; - break; - case 839: - name = "Ile-de-France"; - break; - case 840: - name = "Languedoc-Roussillon"; - break; - case 875: - name = "Limousin"; - break; - case 876: - name = "Lorraine"; - break; - case 877: - name = "Midi-Pyrenees"; - break; - case 878: - name = "Nord-Pas-de-Calais"; - break; - case 879: - name = "Pays de la Loire"; - break; - case 880: - name = "Picardie"; - break; - case 881: - name = "Poitou-Charentes"; - break; - case 882: - name = "Provence-Alpes-Cote d'Azur"; - break; - case 883: - name = "Rhone-Alpes"; - break; - case 918: - name = "Alsace"; - break; - } - } - if (strcmp(country_code,"GA") == 0) { - switch (region_code2) { - case 1: - name = "Estuaire"; - break; - case 2: - name = "Haut-Ogooue"; - break; - case 3: - name = "Moyen-Ogooue"; - break; - case 4: - name = "Ngounie"; - break; - case 5: - name = "Nyanga"; - break; - case 6: - name = "Ogooue-Ivindo"; - break; - case 7: - name = "Ogooue-Lolo"; - break; - case 8: - name = "Ogooue-Maritime"; - break; - case 9: - name = "Woleu-Ntem"; - break; - } - } - if (strcmp(country_code,"GB") == 0) { - switch (region_code2) { - case 832: - name = "Barking and Dagenham"; - break; - case 833: - name = "Barnet"; - break; - case 834: - name = "Barnsley"; - break; - case 835: - name = "Bath and North East Somerset"; - break; - case 836: - name = "Bedfordshire"; - break; - case 837: - name = "Bexley"; - break; - case 838: - name = "Birmingham"; - break; - case 839: - name = "Blackburn with Darwen"; - break; - case 840: - name = "Blackpool"; - break; - case 875: - name = "Bolton"; - break; - case 876: - name = "Bournemouth"; - break; - case 877: - name = "Bracknell Forest"; - break; - case 878: - name = "Bradford"; - break; - case 879: - name = "Brent"; - break; - case 880: - name = "Brighton and Hove"; - break; - case 881: - name = "Bristol, City of"; - break; - case 882: - name = "Bromley"; - break; - case 883: - name = "Buckinghamshire"; - break; - case 918: - name = "Bury"; - break; - case 919: - name = "Calderdale"; - break; - case 920: - name = "Cambridgeshire"; - break; - case 921: - name = "Camden"; - break; - case 922: - name = "Cheshire"; - break; - case 923: - name = "Cornwall"; - break; - case 924: - name = "Coventry"; - break; - case 925: - name = "Croydon"; - break; - case 926: - name = "Cumbria"; - break; - case 961: - name = "Darlington"; - break; - case 962: - name = "Derby"; - break; - case 963: - name = "Derbyshire"; - break; - case 964: - name = "Devon"; - break; - case 965: - name = "Doncaster"; - break; - case 966: - name = "Dorset"; - break; - case 967: - name = "Dudley"; - break; - case 968: - name = "Durham"; - break; - case 969: - name = "Ealing"; - break; - case 1004: - name = "East Riding of Yorkshire"; - break; - case 1005: - name = "East Sussex"; - break; - case 1006: - name = "Enfield"; - break; - case 1007: - name = "Essex"; - break; - case 1008: - name = "Gateshead"; - break; - case 1009: - name = "Gloucestershire"; - break; - case 1010: - name = "Greenwich"; - break; - case 1011: - name = "Hackney"; - break; - case 1012: - name = "Halton"; - break; - case 1047: - name = "Hammersmith and Fulham"; - break; - case 1048: - name = "Hampshire"; - break; - case 1049: - name = "Haringey"; - break; - case 1050: - name = "Harrow"; - break; - case 1051: - name = "Hartlepool"; - break; - case 1052: - name = "Havering"; - break; - case 1053: - name = "Herefordshire"; - break; - case 1054: - name = "Hertford"; - break; - case 1055: - name = "Hillingdon"; - break; - case 1090: - name = "Hounslow"; - break; - case 1091: - name = "Isle of Wight"; - break; - case 1092: - name = "Islington"; - break; - case 1093: - name = "Kensington and Chelsea"; - break; - case 1094: - name = "Kent"; - break; - case 1095: - name = "Kingston upon Hull, City of"; - break; - case 1096: - name = "Kingston upon Thames"; - break; - case 1097: - name = "Kirklees"; - break; - case 1098: - name = "Knowsley"; - break; - case 1133: - name = "Lambeth"; - break; - case 1134: - name = "Lancashire"; - break; - case 1135: - name = "Leeds"; - break; - case 1136: - name = "Leicester"; - break; - case 1137: - name = "Leicestershire"; - break; - case 1138: - name = "Lewisham"; - break; - case 1139: - name = "Lincolnshire"; - break; - case 1140: - name = "Liverpool"; - break; - case 1141: - name = "London, City of"; - break; - case 1176: - name = "Luton"; - break; - case 1177: - name = "Manchester"; - break; - case 1178: - name = "Medway"; - break; - case 1179: - name = "Merton"; - break; - case 1180: - name = "Middlesbrough"; - break; - case 1181: - name = "Milton Keynes"; - break; - case 1182: - name = "Newcastle upon Tyne"; - break; - case 1183: - name = "Newham"; - break; - case 1184: - name = "Norfolk"; - break; - case 1219: - name = "Northamptonshire"; - break; - case 1220: - name = "North East Lincolnshire"; - break; - case 1221: - name = "North Lincolnshire"; - break; - case 1222: - name = "North Somerset"; - break; - case 1223: - name = "North Tyneside"; - break; - case 1224: - name = "Northumberland"; - break; - case 1225: - name = "North Yorkshire"; - break; - case 1226: - name = "Nottingham"; - break; - case 1227: - name = "Nottinghamshire"; - break; - case 1262: - name = "Oldham"; - break; - case 1263: - name = "Oxfordshire"; - break; - case 1264: - name = "Peterborough"; - break; - case 1265: - name = "Plymouth"; - break; - case 1266: - name = "Poole"; - break; - case 1267: - name = "Portsmouth"; - break; - case 1268: - name = "Reading"; - break; - case 1269: - name = "Redbridge"; - break; - case 1270: - name = "Redcar and Cleveland"; - break; - case 1305: - name = "Richmond upon Thames"; - break; - case 1306: - name = "Rochdale"; - break; - case 1307: - name = "Rotherham"; - break; - case 1308: - name = "Rutland"; - break; - case 1309: - name = "Salford"; - break; - case 1310: - name = "Shropshire"; - break; - case 1311: - name = "Sandwell"; - break; - case 1312: - name = "Sefton"; - break; - case 1313: - name = "Sheffield"; - break; - case 1348: - name = "Slough"; - break; - case 1349: - name = "Solihull"; - break; - case 1350: - name = "Somerset"; - break; - case 1351: - name = "Southampton"; - break; - case 1352: - name = "Southend-on-Sea"; - break; - case 1353: - name = "South Gloucestershire"; - break; - case 1354: - name = "South Tyneside"; - break; - case 1355: - name = "Southwark"; - break; - case 1356: - name = "Staffordshire"; - break; - case 1391: - name = "St. Helens"; - break; - case 1392: - name = "Stockport"; - break; - case 1393: - name = "Stockton-on-Tees"; - break; - case 1394: - name = "Stoke-on-Trent"; - break; - case 1395: - name = "Suffolk"; - break; - case 1396: - name = "Sunderland"; - break; - case 1397: - name = "Surrey"; - break; - case 1398: - name = "Sutton"; - break; - case 1399: - name = "Swindon"; - break; - case 1434: - name = "Tameside"; - break; - case 1435: - name = "Telford and Wrekin"; - break; - case 1436: - name = "Thurrock"; - break; - case 1437: - name = "Torbay"; - break; - case 1438: - name = "Tower Hamlets"; - break; - case 1439: - name = "Trafford"; - break; - case 1440: - name = "Wakefield"; - break; - case 1441: - name = "Walsall"; - break; - case 1442: - name = "Waltham Forest"; - break; - case 1477: - name = "Wandsworth"; - break; - case 1478: - name = "Warrington"; - break; - case 1479: - name = "Warwickshire"; - break; - case 1480: - name = "West Berkshire"; - break; - case 1481: - name = "Westminster"; - break; - case 1482: - name = "West Sussex"; - break; - case 1483: - name = "Wigan"; - break; - case 1484: - name = "Wiltshire"; - break; - case 1485: - name = "Windsor and Maidenhead"; - break; - case 1520: - name = "Wirral"; - break; - case 1521: - name = "Wokingham"; - break; - case 1522: - name = "Wolverhampton"; - break; - case 1523: - name = "Worcestershire"; - break; - case 1524: - name = "York"; - break; - case 1525: - name = "Antrim"; - break; - case 1526: - name = "Ards"; - break; - case 1527: - name = "Armagh"; - break; - case 1528: - name = "Ballymena"; - break; - case 1563: - name = "Ballymoney"; - break; - case 1564: - name = "Banbridge"; - break; - case 1565: - name = "Belfast"; - break; - case 1566: - name = "Carrickfergus"; - break; - case 1567: - name = "Castlereagh"; - break; - case 1568: - name = "Coleraine"; - break; - case 1569: - name = "Cookstown"; - break; - case 1570: - name = "Craigavon"; - break; - case 1571: - name = "Down"; - break; - case 1606: - name = "Dungannon"; - break; - case 1607: - name = "Fermanagh"; - break; - case 1608: - name = "Larne"; - break; - case 1609: - name = "Limavady"; - break; - case 1610: - name = "Lisburn"; - break; - case 1611: - name = "Derry"; - break; - case 1612: - name = "Magherafelt"; - break; - case 1613: - name = "Moyle"; - break; - case 1614: - name = "Newry and Mourne"; - break; - case 1649: - name = "Newtownabbey"; - break; - case 1650: - name = "North Down"; - break; - case 1651: - name = "Omagh"; - break; - case 1652: - name = "Strabane"; - break; - case 1653: - name = "Aberdeen City"; - break; - case 1654: - name = "Aberdeenshire"; - break; - case 1655: - name = "Angus"; - break; - case 1656: - name = "Argyll and Bute"; - break; - case 1657: - name = "Scottish Borders, The"; - break; - case 1692: - name = "Clackmannanshire"; - break; - case 1693: - name = "Dumfries and Galloway"; - break; - case 1694: - name = "Dundee City"; - break; - case 1695: - name = "East Ayrshire"; - break; - case 1696: - name = "East Dunbartonshire"; - break; - case 1697: - name = "East Lothian"; - break; - case 1698: - name = "East Renfrewshire"; - break; - case 1699: - name = "Edinburgh, City of"; - break; - case 1700: - name = "Falkirk"; - break; - case 1735: - name = "Fife"; - break; - case 1736: - name = "Glasgow City"; - break; - case 1737: - name = "Highland"; - break; - case 1738: - name = "Inverclyde"; - break; - case 1739: - name = "Midlothian"; - break; - case 1740: - name = "Moray"; - break; - case 1741: - name = "North Ayrshire"; - break; - case 1742: - name = "North Lanarkshire"; - break; - case 1743: - name = "Orkney"; - break; - case 1778: - name = "Perth and Kinross"; - break; - case 1779: - name = "Renfrewshire"; - break; - case 1780: - name = "Shetland Islands"; - break; - case 1781: - name = "South Ayrshire"; - break; - case 1782: - name = "South Lanarkshire"; - break; - case 1783: - name = "Stirling"; - break; - case 1784: - name = "West Dunbartonshire"; - break; - case 1785: - name = "Eilean Siar"; - break; - case 1786: - name = "West Lothian"; - break; - case 1821: - name = "Isle of Anglesey"; - break; - case 1822: - name = "Blaenau Gwent"; - break; - case 1823: - name = "Bridgend"; - break; - case 1824: - name = "Caerphilly"; - break; - case 1825: - name = "Cardiff"; - break; - case 1826: - name = "Ceredigion"; - break; - case 1827: - name = "Carmarthenshire"; - break; - case 1828: - name = "Conwy"; - break; - case 1829: - name = "Denbighshire"; - break; - case 1864: - name = "Flintshire"; - break; - case 1865: - name = "Gwynedd"; - break; - case 1866: - name = "Merthyr Tydfil"; - break; - case 1867: - name = "Monmouthshire"; - break; - case 1868: - name = "Neath Port Talbot"; - break; - case 1869: - name = "Newport"; - break; - case 1870: - name = "Pembrokeshire"; - break; - case 1871: - name = "Powys"; - break; - case 1872: - name = "Rhondda Cynon Taff"; - break; - case 1907: - name = "Swansea"; - break; - case 1908: - name = "Torfaen"; - break; - case 1909: - name = "Vale of Glamorgan, The"; - break; - case 1910: - name = "Wrexham"; - break; - } - } - if (strcmp(country_code,"GD") == 0) { - switch (region_code2) { - case 1: - name = "Saint Andrew"; - break; - case 2: - name = "Saint David"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint John"; - break; - case 5: - name = "Saint Mark"; - break; - case 6: - name = "Saint Patrick"; - break; - } - } - if (strcmp(country_code,"GE") == 0) { - switch (region_code2) { - case 1: - name = "Abashis Raioni"; - break; - case 2: - name = "Abkhazia"; - break; - case 3: - name = "Adigenis Raioni"; - break; - case 4: - name = "Ajaria"; - break; - case 5: - name = "Akhalgoris Raioni"; - break; - case 6: - name = "Akhalk'alak'is Raioni"; - break; - case 7: - name = "Akhalts'ikhis Raioni"; - break; - case 8: - name = "Akhmetis Raioni"; - break; - case 9: - name = "Ambrolauris Raioni"; - break; - case 10: - name = "Aspindzis Raioni"; - break; - case 11: - name = "Baghdat'is Raioni"; - break; - case 12: - name = "Bolnisis Raioni"; - break; - case 13: - name = "Borjomis Raioni"; - break; - case 14: - name = "Chiat'ura"; - break; - case 15: - name = "Ch'khorotsqus Raioni"; - break; - case 16: - name = "Ch'okhatauris Raioni"; - break; - case 17: - name = "Dedop'listsqaros Raioni"; - break; - case 18: - name = "Dmanisis Raioni"; - break; - case 19: - name = "Dushet'is Raioni"; - break; - case 20: - name = "Gardabanis Raioni"; - break; - case 21: - name = "Gori"; - break; - case 22: - name = "Goris Raioni"; - break; - case 23: - name = "Gurjaanis Raioni"; - break; - case 24: - name = "Javis Raioni"; - break; - case 25: - name = "K'arelis Raioni"; - break; - case 26: - name = "Kaspis Raioni"; - break; - case 27: - name = "Kharagaulis Raioni"; - break; - case 28: - name = "Khashuris Raioni"; - break; - case 29: - name = "Khobis Raioni"; - break; - case 30: - name = "Khonis Raioni"; - break; - case 31: - name = "K'ut'aisi"; - break; - case 32: - name = "Lagodekhis Raioni"; - break; - case 33: - name = "Lanch'khut'is Raioni"; - break; - case 34: - name = "Lentekhis Raioni"; - break; - case 35: - name = "Marneulis Raioni"; - break; - case 36: - name = "Martvilis Raioni"; - break; - case 37: - name = "Mestiis Raioni"; - break; - case 38: - name = "Mts'khet'is Raioni"; - break; - case 39: - name = "Ninotsmindis Raioni"; - break; - case 40: - name = "Onis Raioni"; - break; - case 41: - name = "Ozurget'is Raioni"; - break; - case 42: - name = "P'ot'i"; - break; - case 43: - name = "Qazbegis Raioni"; - break; - case 44: - name = "Qvarlis Raioni"; - break; - case 45: - name = "Rust'avi"; - break; - case 46: - name = "Sach'kheris Raioni"; - break; - case 47: - name = "Sagarejos Raioni"; - break; - case 48: - name = "Samtrediis Raioni"; - break; - case 49: - name = "Senakis Raioni"; - break; - case 50: - name = "Sighnaghis Raioni"; - break; - case 51: - name = "T'bilisi"; - break; - case 52: - name = "T'elavis Raioni"; - break; - case 53: - name = "T'erjolis Raioni"; - break; - case 54: - name = "T'et'ritsqaros Raioni"; - break; - case 55: - name = "T'ianet'is Raioni"; - break; - case 56: - name = "Tqibuli"; - break; - case 57: - name = "Ts'ageris Raioni"; - break; - case 58: - name = "Tsalenjikhis Raioni"; - break; - case 59: - name = "Tsalkis Raioni"; - break; - case 60: - name = "Tsqaltubo"; - break; - case 61: - name = "Vanis Raioni"; - break; - case 62: - name = "Zestap'onis Raioni"; - break; - case 63: - name = "Zugdidi"; - break; - case 64: - name = "Zugdidis Raioni"; - break; - } - } - if (strcmp(country_code,"GH") == 0) { - switch (region_code2) { - case 1: - name = "Greater Accra"; - break; - case 2: - name = "Ashanti"; - break; - case 3: - name = "Brong-Ahafo"; - break; - case 4: - name = "Central"; - break; - case 5: - name = "Eastern"; - break; - case 6: - name = "Northern"; - break; - case 8: - name = "Volta"; - break; - case 9: - name = "Western"; - break; - case 10: - name = "Upper East"; - break; - case 11: - name = "Upper West"; - break; - } - } - if (strcmp(country_code,"GL") == 0) { - switch (region_code2) { - case 1: - name = "Nordgronland"; - break; - case 2: - name = "Ostgronland"; - break; - case 3: - name = "Vestgronland"; - break; - } - } - if (strcmp(country_code,"GM") == 0) { - switch (region_code2) { - case 1: - name = "Banjul"; - break; - case 2: - name = "Lower River"; - break; - case 3: - name = "Central River"; - break; - case 4: - name = "Upper River"; - break; - case 5: - name = "Western"; - break; - case 7: - name = "North Bank"; - break; - } - } - if (strcmp(country_code,"GN") == 0) { - switch (region_code2) { - case 1: - name = "Beyla"; - break; - case 2: - name = "Boffa"; - break; - case 3: - name = "Boke"; - break; - case 4: - name = "Conakry"; - break; - case 5: - name = "Dabola"; - break; - case 6: - name = "Dalaba"; - break; - case 7: - name = "Dinguiraye"; - break; - case 9: - name = "Faranah"; - break; - case 10: - name = "Forecariah"; - break; - case 11: - name = "Fria"; - break; - case 12: - name = "Gaoual"; - break; - case 13: - name = "Gueckedou"; - break; - case 15: - name = "Kerouane"; - break; - case 16: - name = "Kindia"; - break; - case 17: - name = "Kissidougou"; - break; - case 18: - name = "Koundara"; - break; - case 19: - name = "Kouroussa"; - break; - case 21: - name = "Macenta"; - break; - case 22: - name = "Mali"; - break; - case 23: - name = "Mamou"; - break; - case 25: - name = "Pita"; - break; - case 27: - name = "Telimele"; - break; - case 28: - name = "Tougue"; - break; - case 29: - name = "Yomou"; - break; - case 30: - name = "Coyah"; - break; - case 31: - name = "Dubreka"; - break; - case 32: - name = "Kankan"; - break; - case 33: - name = "Koubia"; - break; - case 34: - name = "Labe"; - break; - case 35: - name = "Lelouma"; - break; - case 36: - name = "Lola"; - break; - case 37: - name = "Mandiana"; - break; - case 38: - name = "Nzerekore"; - break; - case 39: - name = "Siguiri"; - break; - } - } - if (strcmp(country_code,"GQ") == 0) { - switch (region_code2) { - case 3: - name = "Annobon"; - break; - case 4: - name = "Bioko Norte"; - break; - case 5: - name = "Bioko Sur"; - break; - case 6: - name = "Centro Sur"; - break; - case 7: - name = "Kie-Ntem"; - break; - case 8: - name = "Litoral"; - break; - case 9: - name = "Wele-Nzas"; - break; - } - } - if (strcmp(country_code,"GR") == 0) { - switch (region_code2) { - case 1: - name = "Evros"; - break; - case 2: - name = "Rodhopi"; - break; - case 3: - name = "Xanthi"; - break; - case 4: - name = "Drama"; - break; - case 5: - name = "Serrai"; - break; - case 6: - name = "Kilkis"; - break; - case 7: - name = "Pella"; - break; - case 8: - name = "Florina"; - break; - case 9: - name = "Kastoria"; - break; - case 10: - name = "Grevena"; - break; - case 11: - name = "Kozani"; - break; - case 12: - name = "Imathia"; - break; - case 13: - name = "Thessaloniki"; - break; - case 14: - name = "Kavala"; - break; - case 15: - name = "Khalkidhiki"; - break; - case 16: - name = "Pieria"; - break; - case 17: - name = "Ioannina"; - break; - case 18: - name = "Thesprotia"; - break; - case 19: - name = "Preveza"; - break; - case 20: - name = "Arta"; - break; - case 21: - name = "Larisa"; - break; - case 22: - name = "Trikala"; - break; - case 23: - name = "Kardhitsa"; - break; - case 24: - name = "Magnisia"; - break; - case 25: - name = "Kerkira"; - break; - case 26: - name = "Levkas"; - break; - case 27: - name = "Kefallinia"; - break; - case 28: - name = "Zakinthos"; - break; - case 29: - name = "Fthiotis"; - break; - case 30: - name = "Evritania"; - break; - case 31: - name = "Aitolia kai Akarnania"; - break; - case 32: - name = "Fokis"; - break; - case 33: - name = "Voiotia"; - break; - case 34: - name = "Evvoia"; - break; - case 35: - name = "Attiki"; - break; - case 36: - name = "Argolis"; - break; - case 37: - name = "Korinthia"; - break; - case 38: - name = "Akhaia"; - break; - case 39: - name = "Ilia"; - break; - case 40: - name = "Messinia"; - break; - case 41: - name = "Arkadhia"; - break; - case 42: - name = "Lakonia"; - break; - case 43: - name = "Khania"; - break; - case 44: - name = "Rethimni"; - break; - case 45: - name = "Iraklion"; - break; - case 46: - name = "Lasithi"; - break; - case 47: - name = "Dhodhekanisos"; - break; - case 48: - name = "Samos"; - break; - case 49: - name = "Kikladhes"; - break; - case 50: - name = "Khios"; - break; - case 51: - name = "Lesvos"; - break; - } - } - if (strcmp(country_code,"GT") == 0) { - switch (region_code2) { - case 1: - name = "Alta Verapaz"; - break; - case 2: - name = "Baja Verapaz"; - break; - case 3: - name = "Chimaltenango"; - break; - case 4: - name = "Chiquimula"; - break; - case 5: - name = "El Progreso"; - break; - case 6: - name = "Escuintla"; - break; - case 7: - name = "Guatemala"; - break; - case 8: - name = "Huehuetenango"; - break; - case 9: - name = "Izabal"; - break; - case 10: - name = "Jalapa"; - break; - case 11: - name = "Jutiapa"; - break; - case 12: - name = "Peten"; - break; - case 13: - name = "Quetzaltenango"; - break; - case 14: - name = "Quiche"; - break; - case 15: - name = "Retalhuleu"; - break; - case 16: - name = "Sacatepequez"; - break; - case 17: - name = "San Marcos"; - break; - case 18: - name = "Santa Rosa"; - break; - case 19: - name = "Solola"; - break; - case 20: - name = "Suchitepequez"; - break; - case 21: - name = "Totonicapan"; - break; - case 22: - name = "Zacapa"; - break; - } - } - if (strcmp(country_code,"GW") == 0) { - switch (region_code2) { - case 1: - name = "Bafata"; - break; - case 2: - name = "Quinara"; - break; - case 4: - name = "Oio"; - break; - case 5: - name = "Bolama"; - break; - case 6: - name = "Cacheu"; - break; - case 7: - name = "Tombali"; - break; - case 10: - name = "Gabu"; - break; - case 11: - name = "Bissau"; - break; - case 12: - name = "Biombo"; - break; - } - } - if (strcmp(country_code,"GY") == 0) { - switch (region_code2) { - case 10: - name = "Barima-Waini"; - break; - case 11: - name = "Cuyuni-Mazaruni"; - break; - case 12: - name = "Demerara-Mahaica"; - break; - case 13: - name = "East Berbice-Corentyne"; - break; - case 14: - name = "Essequibo Islands-West Demerara"; - break; - case 15: - name = "Mahaica-Berbice"; - break; - case 16: - name = "Pomeroon-Supenaam"; - break; - case 17: - name = "Potaro-Siparuni"; - break; - case 18: - name = "Upper Demerara-Berbice"; - break; - case 19: - name = "Upper Takutu-Upper Essequibo"; - break; - } - } - if (strcmp(country_code,"HN") == 0) { - switch (region_code2) { - case 1: - name = "Atlantida"; - break; - case 2: - name = "Choluteca"; - break; - case 3: - name = "Colon"; - break; - case 4: - name = "Comayagua"; - break; - case 5: - name = "Copan"; - break; - case 6: - name = "Cortes"; - break; - case 7: - name = "El Paraiso"; - break; - case 8: - name = "Francisco Morazan"; - break; - case 9: - name = "Gracias a Dios"; - break; - case 10: - name = "Intibuca"; - break; - case 11: - name = "Islas de la Bahia"; - break; - case 12: - name = "La Paz"; - break; - case 13: - name = "Lempira"; - break; - case 14: - name = "Ocotepeque"; - break; - case 15: - name = "Olancho"; - break; - case 16: - name = "Santa Barbara"; - break; - case 17: - name = "Valle"; - break; - case 18: - name = "Yoro"; - break; - } - } - if (strcmp(country_code,"HR") == 0) { - switch (region_code2) { - case 1: - name = "Bjelovarsko-Bilogorska"; - break; - case 2: - name = "Brodsko-Posavska"; - break; - case 3: - name = "Dubrovacko-Neretvanska"; - break; - case 4: - name = "Istarska"; - break; - case 5: - name = "Karlovacka"; - break; - case 6: - name = "Koprivnicko-Krizevacka"; - break; - case 7: - name = "Krapinsko-Zagorska"; - break; - case 8: - name = "Licko-Senjska"; - break; - case 9: - name = "Medimurska"; - break; - case 10: - name = "Osjecko-Baranjska"; - break; - case 11: - name = "Pozesko-Slavonska"; - break; - case 12: - name = "Primorsko-Goranska"; - break; - case 13: - name = "Sibensko-Kninska"; - break; - case 14: - name = "Sisacko-Moslavacka"; - break; - case 15: - name = "Splitsko-Dalmatinska"; - break; - case 16: - name = "Varazdinska"; - break; - case 17: - name = "Viroviticko-Podravska"; - break; - case 18: - name = "Vukovarsko-Srijemska"; - break; - case 19: - name = "Zadarska"; - break; - case 20: - name = "Zagrebacka"; - break; - case 21: - name = "Grad Zagreb"; - break; - } - } - if (strcmp(country_code,"HT") == 0) { - switch (region_code2) { - case 3: - name = "Nord-Ouest"; - break; - case 6: - name = "Artibonite"; - break; - case 7: - name = "Centre"; - break; - case 9: - name = "Nord"; - break; - case 10: - name = "Nord-Est"; - break; - case 11: - name = "Ouest"; - break; - case 12: - name = "Sud"; - break; - case 13: - name = "Sud-Est"; - break; - case 14: - name = "Grand' Anse"; - break; - case 15: - name = "Nippes"; - break; - } - } - if (strcmp(country_code,"HU") == 0) { - switch (region_code2) { - case 1: - name = "Bacs-Kiskun"; - break; - case 2: - name = "Baranya"; - break; - case 3: - name = "Bekes"; - break; - case 4: - name = "Borsod-Abauj-Zemplen"; - break; - case 5: - name = "Budapest"; - break; - case 6: - name = "Csongrad"; - break; - case 7: - name = "Debrecen"; - break; - case 8: - name = "Fejer"; - break; - case 9: - name = "Gyor-Moson-Sopron"; - break; - case 10: - name = "Hajdu-Bihar"; - break; - case 11: - name = "Heves"; - break; - case 12: - name = "Komarom-Esztergom"; - break; - case 13: - name = "Miskolc"; - break; - case 14: - name = "Nograd"; - break; - case 15: - name = "Pecs"; - break; - case 16: - name = "Pest"; - break; - case 17: - name = "Somogy"; - break; - case 18: - name = "Szabolcs-Szatmar-Bereg"; - break; - case 19: - name = "Szeged"; - break; - case 20: - name = "Jasz-Nagykun-Szolnok"; - break; - case 21: - name = "Tolna"; - break; - case 22: - name = "Vas"; - break; - case 23: - name = "Veszprem"; - break; - case 24: - name = "Zala"; - break; - case 25: - name = "Gyor"; - break; - case 26: - name = "Bekescsaba"; - break; - case 27: - name = "Dunaujvaros"; - break; - case 28: - name = "Eger"; - break; - case 29: - name = "Hodmezovasarhely"; - break; - case 30: - name = "Kaposvar"; - break; - case 31: - name = "Kecskemet"; - break; - case 32: - name = "Nagykanizsa"; - break; - case 33: - name = "Nyiregyhaza"; - break; - case 34: - name = "Sopron"; - break; - case 35: - name = "Szekesfehervar"; - break; - case 36: - name = "Szolnok"; - break; - case 37: - name = "Szombathely"; - break; - case 38: - name = "Tatabanya"; - break; - case 39: - name = "Veszprem"; - break; - case 40: - name = "Zalaegerszeg"; - break; - case 41: - name = "Salgotarjan"; - break; - case 42: - name = "Szekszard"; - break; - case 43: - name = "Erd"; - break; - } - } - if (strcmp(country_code,"ID") == 0) { - switch (region_code2) { - case 1: - name = "Aceh"; - break; - case 2: - name = "Bali"; - break; - case 3: - name = "Bengkulu"; - break; - case 4: - name = "Jakarta Raya"; - break; - case 5: - name = "Jambi"; - break; - case 6: - name = "Jawa Barat"; - break; - case 7: - name = "Jawa Tengah"; - break; - case 8: - name = "Jawa Timur"; - break; - case 9: - name = "Papua"; - break; - case 10: - name = "Yogyakarta"; - break; - case 11: - name = "Kalimantan Barat"; - break; - case 12: - name = "Kalimantan Selatan"; - break; - case 13: - name = "Kalimantan Tengah"; - break; - case 14: - name = "Kalimantan Timur"; - break; - case 15: - name = "Lampung"; - break; - case 16: - name = "Maluku"; - break; - case 17: - name = "Nusa Tenggara Barat"; - break; - case 18: - name = "Nusa Tenggara Timur"; - break; - case 19: - name = "Riau"; - break; - case 20: - name = "Sulawesi Selatan"; - break; - case 21: - name = "Sulawesi Tengah"; - break; - case 22: - name = "Sulawesi Tenggara"; - break; - case 23: - name = "Sulawesi Utara"; - break; - case 24: - name = "Sumatera Barat"; - break; - case 25: - name = "Sumatera Selatan"; - break; - case 26: - name = "Sumatera Utara"; - break; - case 28: - name = "Maluku"; - break; - case 29: - name = "Maluku Utara"; - break; - case 30: - name = "Jawa Barat"; - break; - case 31: - name = "Sulawesi Utara"; - break; - case 32: - name = "Sumatera Selatan"; - break; - case 33: - name = "Banten"; - break; - case 34: - name = "Gorontalo"; - break; - case 35: - name = "Kepulauan Bangka Belitung"; - break; - case 36: - name = "Papua"; - break; - case 37: - name = "Riau"; - break; - case 38: - name = "Sulawesi Selatan"; - break; - case 39: - name = "Irian Jaya Barat"; - break; - case 40: - name = "Kepulauan Riau"; - break; - case 41: - name = "Sulawesi Barat"; - break; - } - } - if (strcmp(country_code,"IE") == 0) { - switch (region_code2) { - case 1: - name = "Carlow"; - break; - case 2: - name = "Cavan"; - break; - case 3: - name = "Clare"; - break; - case 4: - name = "Cork"; - break; - case 6: - name = "Donegal"; - break; - case 7: - name = "Dublin"; - break; - case 10: - name = "Galway"; - break; - case 11: - name = "Kerry"; - break; - case 12: - name = "Kildare"; - break; - case 13: - name = "Kilkenny"; - break; - case 14: - name = "Leitrim"; - break; - case 15: - name = "Laois"; - break; - case 16: - name = "Limerick"; - break; - case 18: - name = "Longford"; - break; - case 19: - name = "Louth"; - break; - case 20: - name = "Mayo"; - break; - case 21: - name = "Meath"; - break; - case 22: - name = "Monaghan"; - break; - case 23: - name = "Offaly"; - break; - case 24: - name = "Roscommon"; - break; - case 25: - name = "Sligo"; - break; - case 26: - name = "Tipperary"; - break; - case 27: - name = "Waterford"; - break; - case 29: - name = "Westmeath"; - break; - case 30: - name = "Wexford"; - break; - case 31: - name = "Wicklow"; - break; - } - } - if (strcmp(country_code,"IL") == 0) { - switch (region_code2) { - case 1: - name = "HaDarom"; - break; - case 2: - name = "HaMerkaz"; - break; - case 3: - name = "HaZafon"; - break; - case 4: - name = "Hefa"; - break; - case 5: - name = "Tel Aviv"; - break; - case 6: - name = "Yerushalayim"; - break; - } - } - if (strcmp(country_code,"IN") == 0) { - switch (region_code2) { - case 1: - name = "Andaman and Nicobar Islands"; - break; - case 2: - name = "Andhra Pradesh"; - break; - case 3: - name = "Assam"; - break; - case 5: - name = "Chandigarh"; - break; - case 6: - name = "Dadra and Nagar Haveli"; - break; - case 7: - name = "Delhi"; - break; - case 9: - name = "Gujarat"; - break; - case 10: - name = "Haryana"; - break; - case 11: - name = "Himachal Pradesh"; - break; - case 12: - name = "Jammu and Kashmir"; - break; - case 13: - name = "Kerala"; - break; - case 14: - name = "Lakshadweep"; - break; - case 16: - name = "Maharashtra"; - break; - case 17: - name = "Manipur"; - break; - case 18: - name = "Meghalaya"; - break; - case 19: - name = "Karnataka"; - break; - case 20: - name = "Nagaland"; - break; - case 21: - name = "Orissa"; - break; - case 22: - name = "Puducherry"; - break; - case 23: - name = "Punjab"; - break; - case 24: - name = "Rajasthan"; - break; - case 25: - name = "Tamil Nadu"; - break; - case 26: - name = "Tripura"; - break; - case 28: - name = "West Bengal"; - break; - case 29: - name = "Sikkim"; - break; - case 30: - name = "Arunachal Pradesh"; - break; - case 31: - name = "Mizoram"; - break; - case 32: - name = "Daman and Diu"; - break; - case 33: - name = "Goa"; - break; - case 34: - name = "Bihar"; - break; - case 35: - name = "Madhya Pradesh"; - break; - case 36: - name = "Uttar Pradesh"; - break; - case 37: - name = "Chhattisgarh"; - break; - case 38: - name = "Jharkhand"; - break; - case 39: - name = "Uttarakhand"; - break; - } - } - if (strcmp(country_code,"IQ") == 0) { - switch (region_code2) { - case 1: - name = "Al Anbar"; - break; - case 2: - name = "Al Basrah"; - break; - case 3: - name = "Al Muthanna"; - break; - case 4: - name = "Al Qadisiyah"; - break; - case 5: - name = "As Sulaymaniyah"; - break; - case 6: - name = "Babil"; - break; - case 7: - name = "Baghdad"; - break; - case 8: - name = "Dahuk"; - break; - case 9: - name = "Dhi Qar"; - break; - case 10: - name = "Diyala"; - break; - case 11: - name = "Arbil"; - break; - case 12: - name = "Karbala'"; - break; - case 13: - name = "At Ta'mim"; - break; - case 14: - name = "Maysan"; - break; - case 15: - name = "Ninawa"; - break; - case 16: - name = "Wasit"; - break; - case 17: - name = "An Najaf"; - break; - case 18: - name = "Salah ad Din"; - break; - } - } - if (strcmp(country_code,"IR") == 0) { - switch (region_code2) { - case 1: - name = "Azarbayjan-e Bakhtari"; - break; - case 3: - name = "Chahar Mahall va Bakhtiari"; - break; - case 4: - name = "Sistan va Baluchestan"; - break; - case 5: - name = "Kohkiluyeh va Buyer Ahmadi"; - break; - case 7: - name = "Fars"; - break; - case 8: - name = "Gilan"; - break; - case 9: - name = "Hamadan"; - break; - case 10: - name = "Ilam"; - break; - case 11: - name = "Hormozgan"; - break; - case 12: - name = "Kerman"; - break; - case 13: - name = "Bakhtaran"; - break; - case 15: - name = "Khuzestan"; - break; - case 16: - name = "Kordestan"; - break; - case 17: - name = "Mazandaran"; - break; - case 18: - name = "Semnan Province"; - break; - case 19: - name = "Markazi"; - break; - case 21: - name = "Zanjan"; - break; - case 22: - name = "Bushehr"; - break; - case 23: - name = "Lorestan"; - break; - case 24: - name = "Markazi"; - break; - case 25: - name = "Semnan"; - break; - case 26: - name = "Tehran"; - break; - case 27: - name = "Zanjan"; - break; - case 28: - name = "Esfahan"; - break; - case 29: - name = "Kerman"; - break; - case 30: - name = "Khorasan"; - break; - case 31: - name = "Yazd"; - break; - case 32: - name = "Ardabil"; - break; - case 33: - name = "East Azarbaijan"; - break; - case 34: - name = "Markazi"; - break; - case 35: - name = "Mazandaran"; - break; - case 36: - name = "Zanjan"; - break; - case 37: - name = "Golestan"; - break; - case 38: - name = "Qazvin"; - break; - case 39: - name = "Qom"; - break; - case 40: - name = "Yazd"; - break; - case 41: - name = "Khorasan-e Janubi"; - break; - case 42: - name = "Khorasan-e Razavi"; - break; - case 43: - name = "Khorasan-e Shemali"; - break; - } - } - if (strcmp(country_code,"IS") == 0) { - switch (region_code2) { - case 3: - name = "Arnessysla"; - break; - case 5: - name = "Austur-Hunavatnssysla"; - break; - case 6: - name = "Austur-Skaftafellssysla"; - break; - case 7: - name = "Borgarfjardarsysla"; - break; - case 9: - name = "Eyjafjardarsysla"; - break; - case 10: - name = "Gullbringusysla"; - break; - case 15: - name = "Kjosarsysla"; - break; - case 17: - name = "Myrasysla"; - break; - case 20: - name = "Nordur-Mulasysla"; - break; - case 21: - name = "Nordur-Tingeyjarsysla"; - break; - case 23: - name = "Rangarvallasysla"; - break; - case 28: - name = "Skagafjardarsysla"; - break; - case 29: - name = "Snafellsnes- og Hnappadalssysla"; - break; - case 30: - name = "Strandasysla"; - break; - case 31: - name = "Sudur-Mulasysla"; - break; - case 32: - name = "Sudur-Tingeyjarsysla"; - break; - case 34: - name = "Vestur-Bardastrandarsysla"; - break; - case 35: - name = "Vestur-Hunavatnssysla"; - break; - case 36: - name = "Vestur-Isafjardarsysla"; - break; - case 37: - name = "Vestur-Skaftafellssysla"; - break; - case 40: - name = "Norourland Eystra"; - break; - case 41: - name = "Norourland Vestra"; - break; - case 42: - name = "Suourland"; - break; - case 43: - name = "Suournes"; - break; - case 44: - name = "Vestfiroir"; - break; - case 45: - name = "Vesturland"; - break; - } - } - if (strcmp(country_code,"IT") == 0) { - switch (region_code2) { - case 1: - name = "Abruzzi"; - break; - case 2: - name = "Basilicata"; - break; - case 3: - name = "Calabria"; - break; - case 4: - name = "Campania"; - break; - case 5: - name = "Emilia-Romagna"; - break; - case 6: - name = "Friuli-Venezia Giulia"; - break; - case 7: - name = "Lazio"; - break; - case 8: - name = "Liguria"; - break; - case 9: - name = "Lombardia"; - break; - case 10: - name = "Marche"; - break; - case 11: - name = "Molise"; - break; - case 12: - name = "Piemonte"; - break; - case 13: - name = "Puglia"; - break; - case 14: - name = "Sardegna"; - break; - case 15: - name = "Sicilia"; - break; - case 16: - name = "Toscana"; - break; - case 17: - name = "Trentino-Alto Adige"; - break; - case 18: - name = "Umbria"; - break; - case 19: - name = "Valle d'Aosta"; - break; - case 20: - name = "Veneto"; - break; - } - } - if (strcmp(country_code,"JM") == 0) { - switch (region_code2) { - case 1: - name = "Clarendon"; - break; - case 2: - name = "Hanover"; - break; - case 4: - name = "Manchester"; - break; - case 7: - name = "Portland"; - break; - case 8: - name = "Saint Andrew"; - break; - case 9: - name = "Saint Ann"; - break; - case 10: - name = "Saint Catherine"; - break; - case 11: - name = "Saint Elizabeth"; - break; - case 12: - name = "Saint James"; - break; - case 13: - name = "Saint Mary"; - break; - case 14: - name = "Saint Thomas"; - break; - case 15: - name = "Trelawny"; - break; - case 16: - name = "Westmoreland"; - break; - case 17: - name = "Kingston"; - break; - } - } - if (strcmp(country_code,"JO") == 0) { - switch (region_code2) { - case 2: - name = "Al Balqa'"; - break; - case 7: - name = "Ma"; - break; - case 9: - name = "Al Karak"; - break; - case 10: - name = "Al Mafraq"; - break; - case 11: - name = "Amman Governorate"; - break; - case 12: - name = "At Tafilah"; - break; - case 13: - name = "Az Zarqa"; - break; - case 14: - name = "Irbid"; - break; - case 16: - name = "Amman"; - break; - } - } - if (strcmp(country_code,"JP") == 0) { - switch (region_code2) { - case 1: - name = "Aichi"; - break; - case 2: - name = "Akita"; - break; - case 3: - name = "Aomori"; - break; - case 4: - name = "Chiba"; - break; - case 5: - name = "Ehime"; - break; - case 6: - name = "Fukui"; - break; - case 7: - name = "Fukuoka"; - break; - case 8: - name = "Fukushima"; - break; - case 9: - name = "Gifu"; - break; - case 10: - name = "Gumma"; - break; - case 11: - name = "Hiroshima"; - break; - case 12: - name = "Hokkaido"; - break; - case 13: - name = "Hyogo"; - break; - case 14: - name = "Ibaraki"; - break; - case 15: - name = "Ishikawa"; - break; - case 16: - name = "Iwate"; - break; - case 17: - name = "Kagawa"; - break; - case 18: - name = "Kagoshima"; - break; - case 19: - name = "Kanagawa"; - break; - case 20: - name = "Kochi"; - break; - case 21: - name = "Kumamoto"; - break; - case 22: - name = "Kyoto"; - break; - case 23: - name = "Mie"; - break; - case 24: - name = "Miyagi"; - break; - case 25: - name = "Miyazaki"; - break; - case 26: - name = "Nagano"; - break; - case 27: - name = "Nagasaki"; - break; - case 28: - name = "Nara"; - break; - case 29: - name = "Niigata"; - break; - case 30: - name = "Oita"; - break; - case 31: - name = "Okayama"; - break; - case 32: - name = "Osaka"; - break; - case 33: - name = "Saga"; - break; - case 34: - name = "Saitama"; - break; - case 35: - name = "Shiga"; - break; - case 36: - name = "Shimane"; - break; - case 37: - name = "Shizuoka"; - break; - case 38: - name = "Tochigi"; - break; - case 39: - name = "Tokushima"; - break; - case 40: - name = "Tokyo"; - break; - case 41: - name = "Tottori"; - break; - case 42: - name = "Toyama"; - break; - case 43: - name = "Wakayama"; - break; - case 44: - name = "Yamagata"; - break; - case 45: - name = "Yamaguchi"; - break; - case 46: - name = "Yamanashi"; - break; - case 47: - name = "Okinawa"; - break; - } - } - if (strcmp(country_code,"KE") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Coast"; - break; - case 3: - name = "Eastern"; - break; - case 5: - name = "Nairobi Area"; - break; - case 6: - name = "North-Eastern"; - break; - case 7: - name = "Nyanza"; - break; - case 8: - name = "Rift Valley"; - break; - case 9: - name = "Western"; - break; - } - } - if (strcmp(country_code,"KG") == 0) { - switch (region_code2) { - case 1: - name = "Bishkek"; - break; - case 2: - name = "Chuy"; - break; - case 3: - name = "Jalal-Abad"; - break; - case 4: - name = "Naryn"; - break; - case 5: - name = "Osh"; - break; - case 6: - name = "Talas"; - break; - case 7: - name = "Ysyk-Kol"; - break; - case 8: - name = "Osh"; - break; - case 9: - name = "Batken"; - break; - } - } - if (strcmp(country_code,"KH") == 0) { - switch (region_code2) { - case 1: - name = "Batdambang"; - break; - case 2: - name = "Kampong Cham"; - break; - case 3: - name = "Kampong Chhnang"; - break; - case 4: - name = "Kampong Speu"; - break; - case 5: - name = "Kampong Thum"; - break; - case 6: - name = "Kampot"; - break; - case 7: - name = "Kandal"; - break; - case 8: - name = "Koh Kong"; - break; - case 9: - name = "Kracheh"; - break; - case 10: - name = "Mondulkiri"; - break; - case 11: - name = "Phnum Penh"; - break; - case 12: - name = "Pursat"; - break; - case 13: - name = "Preah Vihear"; - break; - case 14: - name = "Prey Veng"; - break; - case 15: - name = "Ratanakiri Kiri"; - break; - case 16: - name = "Siem Reap"; - break; - case 17: - name = "Stung Treng"; - break; - case 18: - name = "Svay Rieng"; - break; - case 19: - name = "Takeo"; - break; - case 25: - name = "Banteay Meanchey"; - break; - case 29: - name = "Batdambang"; - break; - case 30: - name = "Pailin"; - break; - } - } - if (strcmp(country_code,"KI") == 0) { - switch (region_code2) { - case 1: - name = "Gilbert Islands"; - break; - case 2: - name = "Line Islands"; - break; - case 3: - name = "Phoenix Islands"; - break; - } - } - if (strcmp(country_code,"KM") == 0) { - switch (region_code2) { - case 1: - name = "Anjouan"; - break; - case 2: - name = "Grande Comore"; - break; - case 3: - name = "Moheli"; - break; - } - } - if (strcmp(country_code,"KN") == 0) { - switch (region_code2) { - case 1: - name = "Christ Church Nichola Town"; - break; - case 2: - name = "Saint Anne Sandy Point"; - break; - case 3: - name = "Saint George Basseterre"; - break; - case 4: - name = "Saint George Gingerland"; - break; - case 5: - name = "Saint James Windward"; - break; - case 6: - name = "Saint John Capisterre"; - break; - case 7: - name = "Saint John Figtree"; - break; - case 8: - name = "Saint Mary Cayon"; - break; - case 9: - name = "Saint Paul Capisterre"; - break; - case 10: - name = "Saint Paul Charlestown"; - break; - case 11: - name = "Saint Peter Basseterre"; - break; - case 12: - name = "Saint Thomas Lowland"; - break; - case 13: - name = "Saint Thomas Middle Island"; - break; - case 15: - name = "Trinity Palmetto Point"; - break; - } - } - if (strcmp(country_code,"KP") == 0) { - switch (region_code2) { - case 1: - name = "Chagang-do"; - break; - case 3: - name = "Hamgyong-namdo"; - break; - case 6: - name = "Hwanghae-namdo"; - break; - case 7: - name = "Hwanghae-bukto"; - break; - case 8: - name = "Kaesong-si"; - break; - case 9: - name = "Kangwon-do"; - break; - case 11: - name = "P'yongan-bukto"; - break; - case 12: - name = "P'yongyang-si"; - break; - case 13: - name = "Yanggang-do"; - break; - case 14: - name = "Namp'o-si"; - break; - case 15: - name = "P'yongan-namdo"; - break; - case 17: - name = "Hamgyong-bukto"; - break; - case 18: - name = "Najin Sonbong-si"; - break; - } - } - if (strcmp(country_code,"KR") == 0) { - switch (region_code2) { - case 1: - name = "Cheju-do"; - break; - case 3: - name = "Cholla-bukto"; - break; - case 5: - name = "Ch'ungch'ong-bukto"; - break; - case 6: - name = "Kangwon-do"; - break; - case 10: - name = "Pusan-jikhalsi"; - break; - case 11: - name = "Seoul-t'ukpyolsi"; - break; - case 12: - name = "Inch'on-jikhalsi"; - break; - case 13: - name = "Kyonggi-do"; - break; - case 14: - name = "Kyongsang-bukto"; - break; - case 15: - name = "Taegu-jikhalsi"; - break; - case 16: - name = "Cholla-namdo"; - break; - case 17: - name = "Ch'ungch'ong-namdo"; - break; - case 18: - name = "Kwangju-jikhalsi"; - break; - case 19: - name = "Taejon-jikhalsi"; - break; - case 20: - name = "Kyongsang-namdo"; - break; - case 21: - name = "Ulsan-gwangyoksi"; - break; - } - } - if (strcmp(country_code,"KW") == 0) { - switch (region_code2) { - case 1: - name = "Al Ahmadi"; - break; - case 2: - name = "Al Kuwayt"; - break; - case 5: - name = "Al Jahra"; - break; - case 7: - name = "Al Farwaniyah"; - break; - case 8: - name = "Hawalli"; - break; - case 9: - name = "Mubarak al Kabir"; - break; - } - } - if (strcmp(country_code,"KY") == 0) { - switch (region_code2) { - case 1: - name = "Creek"; - break; - case 2: - name = "Eastern"; - break; - case 3: - name = "Midland"; - break; - case 4: - name = "South Town"; - break; - case 5: - name = "Spot Bay"; - break; - case 6: - name = "Stake Bay"; - break; - case 7: - name = "West End"; - break; - case 8: - name = "Western"; - break; - } - } - if (strcmp(country_code,"KZ") == 0) { - switch (region_code2) { - case 1: - name = "Almaty"; - break; - case 2: - name = "Almaty City"; - break; - case 3: - name = "Aqmola"; - break; - case 4: - name = "Aqtobe"; - break; - case 5: - name = "Astana"; - break; - case 6: - name = "Atyrau"; - break; - case 7: - name = "West Kazakhstan"; - break; - case 8: - name = "Bayqonyr"; - break; - case 9: - name = "Mangghystau"; - break; - case 10: - name = "South Kazakhstan"; - break; - case 11: - name = "Pavlodar"; - break; - case 12: - name = "Qaraghandy"; - break; - case 13: - name = "Qostanay"; - break; - case 14: - name = "Qyzylorda"; - break; - case 15: - name = "East Kazakhstan"; - break; - case 16: - name = "North Kazakhstan"; - break; - case 17: - name = "Zhambyl"; - break; - } - } - if (strcmp(country_code,"LA") == 0) { - switch (region_code2) { - case 1: - name = "Attapu"; - break; - case 2: - name = "Champasak"; - break; - case 3: - name = "Houaphan"; - break; - case 4: - name = "Khammouan"; - break; - case 5: - name = "Louang Namtha"; - break; - case 7: - name = "Oudomxai"; - break; - case 8: - name = "Phongsali"; - break; - case 9: - name = "Saravan"; - break; - case 10: - name = "Savannakhet"; - break; - case 11: - name = "Vientiane"; - break; - case 13: - name = "Xaignabouri"; - break; - case 14: - name = "Xiangkhoang"; - break; - case 17: - name = "Louangphrabang"; - break; - } - } - if (strcmp(country_code,"LB") == 0) { - switch (region_code2) { - case 1: - name = "Beqaa"; - break; - case 2: - name = "Al Janub"; - break; - case 3: - name = "Liban-Nord"; - break; - case 4: - name = "Beyrouth"; - break; - case 5: - name = "Mont-Liban"; - break; - case 6: - name = "Liban-Sud"; - break; - case 7: - name = "Nabatiye"; - break; - case 8: - name = "Beqaa"; - break; - case 9: - name = "Liban-Nord"; - break; - case 10: - name = "Aakk,r"; - break; - case 11: - name = "Baalbek-Hermel"; - break; - } - } - if (strcmp(country_code,"LC") == 0) { - switch (region_code2) { - case 1: - name = "Anse-la-Raye"; - break; - case 2: - name = "Dauphin"; - break; - case 3: - name = "Castries"; - break; - case 4: - name = "Choiseul"; - break; - case 5: - name = "Dennery"; - break; - case 6: - name = "Gros-Islet"; - break; - case 7: - name = "Laborie"; - break; - case 8: - name = "Micoud"; - break; - case 9: - name = "Soufriere"; - break; - case 10: - name = "Vieux-Fort"; - break; - case 11: - name = "Praslin"; - break; - } - } - if (strcmp(country_code,"LI") == 0) { - switch (region_code2) { - case 1: - name = "Balzers"; - break; - case 2: - name = "Eschen"; - break; - case 3: - name = "Gamprin"; - break; - case 4: - name = "Mauren"; - break; - case 5: - name = "Planken"; - break; - case 6: - name = "Ruggell"; - break; - case 7: - name = "Schaan"; - break; - case 8: - name = "Schellenberg"; - break; - case 9: - name = "Triesen"; - break; - case 10: - name = "Triesenberg"; - break; - case 11: - name = "Vaduz"; - break; - case 21: - name = "Gbarpolu"; - break; - case 22: - name = "River Gee"; - break; - } - } - if (strcmp(country_code,"LK") == 0) { - switch (region_code2) { - case 1: - name = "Amparai"; - break; - case 2: - name = "Anuradhapura"; - break; - case 3: - name = "Badulla"; - break; - case 4: - name = "Batticaloa"; - break; - case 6: - name = "Galle"; - break; - case 7: - name = "Hambantota"; - break; - case 9: - name = "Kalutara"; - break; - case 10: - name = "Kandy"; - break; - case 11: - name = "Kegalla"; - break; - case 12: - name = "Kurunegala"; - break; - case 14: - name = "Matale"; - break; - case 15: - name = "Matara"; - break; - case 16: - name = "Moneragala"; - break; - case 17: - name = "Nuwara Eliya"; - break; - case 18: - name = "Polonnaruwa"; - break; - case 19: - name = "Puttalam"; - break; - case 20: - name = "Ratnapura"; - break; - case 21: - name = "Trincomalee"; - break; - case 23: - name = "Colombo"; - break; - case 24: - name = "Gampaha"; - break; - case 25: - name = "Jaffna"; - break; - case 26: - name = "Mannar"; - break; - case 27: - name = "Mullaittivu"; - break; - case 28: - name = "Vavuniya"; - break; - case 29: - name = "Central"; - break; - case 30: - name = "North Central"; - break; - case 31: - name = "Northern"; - break; - case 32: - name = "North Western"; - break; - case 33: - name = "Sabaragamuwa"; - break; - case 34: - name = "Southern"; - break; - case 35: - name = "Uva"; - break; - case 36: - name = "Western"; - break; - } - } - if (strcmp(country_code,"LR") == 0) { - switch (region_code2) { - case 1: - name = "Bong"; - break; - case 4: - name = "Grand Cape Mount"; - break; - case 5: - name = "Lofa"; - break; - case 6: - name = "Maryland"; - break; - case 7: - name = "Monrovia"; - break; - case 9: - name = "Nimba"; - break; - case 10: - name = "Sino"; - break; - case 11: - name = "Grand Bassa"; - break; - case 12: - name = "Grand Cape Mount"; - break; - case 13: - name = "Maryland"; - break; - case 14: - name = "Montserrado"; - break; - case 17: - name = "Margibi"; - break; - case 18: - name = "River Cess"; - break; - case 19: - name = "Grand Gedeh"; - break; - case 20: - name = "Lofa"; - break; - case 21: - name = "Gbarpolu"; - break; - case 22: - name = "River Gee"; - break; - } - } - if (strcmp(country_code,"LS") == 0) { - switch (region_code2) { - case 10: - name = "Berea"; - break; - case 11: - name = "Butha-Buthe"; - break; - case 12: - name = "Leribe"; - break; - case 13: - name = "Mafeteng"; - break; - case 14: - name = "Maseru"; - break; - case 15: - name = "Mohales Hoek"; - break; - case 16: - name = "Mokhotlong"; - break; - case 17: - name = "Qachas Nek"; - break; - case 18: - name = "Quthing"; - break; - case 19: - name = "Thaba-Tseka"; - break; - } - } - if (strcmp(country_code,"LT") == 0) { - switch (region_code2) { - case 56: - name = "Alytaus Apskritis"; - break; - case 57: - name = "Kauno Apskritis"; - break; - case 58: - name = "Klaipedos Apskritis"; - break; - case 59: - name = "Marijampoles Apskritis"; - break; - case 60: - name = "Panevezio Apskritis"; - break; - case 61: - name = "Siauliu Apskritis"; - break; - case 62: - name = "Taurages Apskritis"; - break; - case 63: - name = "Telsiu Apskritis"; - break; - case 64: - name = "Utenos Apskritis"; - break; - case 65: - name = "Vilniaus Apskritis"; - break; - } - } - if (strcmp(country_code,"LU") == 0) { - switch (region_code2) { - case 1: - name = "Diekirch"; - break; - case 2: - name = "Grevenmacher"; - break; - case 3: - name = "Luxembourg"; - break; - } - } - if (strcmp(country_code,"LV") == 0) { - switch (region_code2) { - case 1: - name = "Aizkraukles"; - break; - case 2: - name = "Aluksnes"; - break; - case 3: - name = "Balvu"; - break; - case 4: - name = "Bauskas"; - break; - case 5: - name = "Cesu"; - break; - case 6: - name = "Daugavpils"; - break; - case 7: - name = "Daugavpils"; - break; - case 8: - name = "Dobeles"; - break; - case 9: - name = "Gulbenes"; - break; - case 10: - name = "Jekabpils"; - break; - case 11: - name = "Jelgava"; - break; - case 12: - name = "Jelgavas"; - break; - case 13: - name = "Jurmala"; - break; - case 14: - name = "Kraslavas"; - break; - case 15: - name = "Kuldigas"; - break; - case 16: - name = "Liepaja"; - break; - case 17: - name = "Liepajas"; - break; - case 18: - name = "Limbazu"; - break; - case 19: - name = "Ludzas"; - break; - case 20: - name = "Madonas"; - break; - case 21: - name = "Ogres"; - break; - case 22: - name = "Preilu"; - break; - case 23: - name = "Rezekne"; - break; - case 24: - name = "Rezeknes"; - break; - case 25: - name = "Riga"; - break; - case 26: - name = "Rigas"; - break; - case 27: - name = "Saldus"; - break; - case 28: - name = "Talsu"; - break; - case 29: - name = "Tukuma"; - break; - case 30: - name = "Valkas"; - break; - case 31: - name = "Valmieras"; - break; - case 32: - name = "Ventspils"; - break; - case 33: - name = "Ventspils"; - break; - } - } - if (strcmp(country_code,"LY") == 0) { - switch (region_code2) { - case 3: - name = "Al Aziziyah"; - break; - case 5: - name = "Al Jufrah"; - break; - case 8: - name = "Al Kufrah"; - break; - case 13: - name = "Ash Shati'"; - break; - case 30: - name = "Murzuq"; - break; - case 34: - name = "Sabha"; - break; - case 41: - name = "Tarhunah"; - break; - case 42: - name = "Tubruq"; - break; - case 45: - name = "Zlitan"; - break; - case 47: - name = "Ajdabiya"; - break; - case 48: - name = "Al Fatih"; - break; - case 49: - name = "Al Jabal al Akhdar"; - break; - case 50: - name = "Al Khums"; - break; - case 51: - name = "An Nuqat al Khams"; - break; - case 52: - name = "Awbari"; - break; - case 53: - name = "Az Zawiyah"; - break; - case 54: - name = "Banghazi"; - break; - case 55: - name = "Darnah"; - break; - case 56: - name = "Ghadamis"; - break; - case 57: - name = "Gharyan"; - break; - case 58: - name = "Misratah"; - break; - case 59: - name = "Sawfajjin"; - break; - case 60: - name = "Surt"; - break; - case 61: - name = "Tarabulus"; - break; - case 62: - name = "Yafran"; - break; - } - } - if (strcmp(country_code,"MA") == 0) { - switch (region_code2) { - case 45: - name = "Grand Casablanca"; - break; - case 46: - name = "Fes-Boulemane"; - break; - case 47: - name = "Marrakech-Tensift-Al Haouz"; - break; - case 48: - name = "Meknes-Tafilalet"; - break; - case 49: - name = "Rabat-Sale-Zemmour-Zaer"; - break; - case 50: - name = "Chaouia-Ouardigha"; - break; - case 51: - name = "Doukkala-Abda"; - break; - case 52: - name = "Gharb-Chrarda-Beni Hssen"; - break; - case 53: - name = "Guelmim-Es Smara"; - break; - case 54: - name = "Oriental"; - break; - case 55: - name = "Souss-Massa-Dr,a"; - break; - case 56: - name = "Tadla-Azilal"; - break; - case 57: - name = "Tanger-Tetouan"; - break; - case 58: - name = "Taza-Al Hoceima-Taounate"; - break; - case 59: - name = "La,youne-Boujdour-Sakia El Hamra"; - break; - } - } - if (strcmp(country_code,"MC") == 0) { - switch (region_code2) { - case 1: - name = "La Condamine"; - break; - case 2: - name = "Monaco"; - break; - case 3: - name = "Monte-Carlo"; - break; - } - } - if (strcmp(country_code,"MD") == 0) { - switch (region_code2) { - case 51: - name = "Gagauzia"; - break; - case 57: - name = "Chisinau"; - break; - case 58: - name = "Stinga Nistrului"; - break; - case 59: - name = "Anenii Noi"; - break; - case 60: - name = "Balti"; - break; - case 61: - name = "Basarabeasca"; - break; - case 62: - name = "Bender"; - break; - case 63: - name = "Briceni"; - break; - case 64: - name = "Cahul"; - break; - case 65: - name = "Cantemir"; - break; - case 66: - name = "Calarasi"; - break; - case 67: - name = "Causeni"; - break; - case 68: - name = "Cimislia"; - break; - case 69: - name = "Criuleni"; - break; - case 70: - name = "Donduseni"; - break; - case 71: - name = "Drochia"; - break; - case 72: - name = "Dubasari"; - break; - case 73: - name = "Edinet"; - break; - case 74: - name = "Falesti"; - break; - case 75: - name = "Floresti"; - break; - case 76: - name = "Glodeni"; - break; - case 77: - name = "Hincesti"; - break; - case 78: - name = "Ialoveni"; - break; - case 79: - name = "Leova"; - break; - case 80: - name = "Nisporeni"; - break; - case 81: - name = "Ocnita"; - break; - case 83: - name = "Rezina"; - break; - case 84: - name = "Riscani"; - break; - case 85: - name = "Singerei"; - break; - case 86: - name = "Soldanesti"; - break; - case 87: - name = "Soroca"; - break; - case 88: - name = "Stefan-Voda"; - break; - case 89: - name = "Straseni"; - break; - case 90: - name = "Taraclia"; - break; - case 91: - name = "Telenesti"; - break; - case 92: - name = "Ungheni"; - break; - } - } - if (strcmp(country_code,"MG") == 0) { - switch (region_code2) { - case 1: - name = "Antsiranana"; - break; - case 2: - name = "Fianarantsoa"; - break; - case 3: - name = "Mahajanga"; - break; - case 4: - name = "Toamasina"; - break; - case 5: - name = "Antananarivo"; - break; - case 6: - name = "Toliara"; - break; - } - } - if (strcmp(country_code,"MK") == 0) { - switch (region_code2) { - case 1: - name = "Aracinovo"; - break; - case 2: - name = "Bac"; - break; - case 3: - name = "Belcista"; - break; - case 4: - name = "Berovo"; - break; - case 5: - name = "Bistrica"; - break; - case 6: - name = "Bitola"; - break; - case 7: - name = "Blatec"; - break; - case 8: - name = "Bogdanci"; - break; - case 9: - name = "Bogomila"; - break; - case 10: - name = "Bogovinje"; - break; - case 11: - name = "Bosilovo"; - break; - case 12: - name = "Brvenica"; - break; - case 13: - name = "Cair"; - break; - case 14: - name = "Capari"; - break; - case 15: - name = "Caska"; - break; - case 16: - name = "Cegrane"; - break; - case 17: - name = "Centar"; - break; - case 18: - name = "Centar Zupa"; - break; - case 19: - name = "Cesinovo"; - break; - case 20: - name = "Cucer-Sandevo"; - break; - case 21: - name = "Debar"; - break; - case 22: - name = "Delcevo"; - break; - case 23: - name = "Delogozdi"; - break; - case 24: - name = "Demir Hisar"; - break; - case 25: - name = "Demir Kapija"; - break; - case 26: - name = "Dobrusevo"; - break; - case 27: - name = "Dolna Banjica"; - break; - case 28: - name = "Dolneni"; - break; - case 29: - name = "Dorce Petrov"; - break; - case 30: - name = "Drugovo"; - break; - case 31: - name = "Dzepciste"; - break; - case 32: - name = "Gazi Baba"; - break; - case 33: - name = "Gevgelija"; - break; - case 34: - name = "Gostivar"; - break; - case 35: - name = "Gradsko"; - break; - case 36: - name = "Ilinden"; - break; - case 37: - name = "Izvor"; - break; - case 38: - name = "Jegunovce"; - break; - case 39: - name = "Kamenjane"; - break; - case 40: - name = "Karbinci"; - break; - case 41: - name = "Karpos"; - break; - case 42: - name = "Kavadarci"; - break; - case 43: - name = "Kicevo"; - break; - case 44: - name = "Kisela Voda"; - break; - case 45: - name = "Klecevce"; - break; - case 46: - name = "Kocani"; - break; - case 47: - name = "Konce"; - break; - case 48: - name = "Kondovo"; - break; - case 49: - name = "Konopiste"; - break; - case 50: - name = "Kosel"; - break; - case 51: - name = "Kratovo"; - break; - case 52: - name = "Kriva Palanka"; - break; - case 53: - name = "Krivogastani"; - break; - case 54: - name = "Krusevo"; - break; - case 55: - name = "Kuklis"; - break; - case 56: - name = "Kukurecani"; - break; - case 57: - name = "Kumanovo"; - break; - case 58: - name = "Labunista"; - break; - case 59: - name = "Lipkovo"; - break; - case 60: - name = "Lozovo"; - break; - case 61: - name = "Lukovo"; - break; - case 62: - name = "Makedonska Kamenica"; - break; - case 63: - name = "Makedonski Brod"; - break; - case 64: - name = "Mavrovi Anovi"; - break; - case 65: - name = "Meseista"; - break; - case 66: - name = "Miravci"; - break; - case 67: - name = "Mogila"; - break; - case 68: - name = "Murtino"; - break; - case 69: - name = "Negotino"; - break; - case 70: - name = "Negotino-Polosko"; - break; - case 71: - name = "Novaci"; - break; - case 72: - name = "Novo Selo"; - break; - case 73: - name = "Oblesevo"; - break; - case 74: - name = "Ohrid"; - break; - case 75: - name = "Orasac"; - break; - case 76: - name = "Orizari"; - break; - case 77: - name = "Oslomej"; - break; - case 78: - name = "Pehcevo"; - break; - case 79: - name = "Petrovec"; - break; - case 80: - name = "Plasnica"; - break; - case 81: - name = "Podares"; - break; - case 82: - name = "Prilep"; - break; - case 83: - name = "Probistip"; - break; - case 84: - name = "Radovis"; - break; - case 85: - name = "Rankovce"; - break; - case 86: - name = "Resen"; - break; - case 87: - name = "Rosoman"; - break; - case 88: - name = "Rostusa"; - break; - case 89: - name = "Samokov"; - break; - case 90: - name = "Saraj"; - break; - case 91: - name = "Sipkovica"; - break; - case 92: - name = "Sopiste"; - break; - case 93: - name = "Sopotnica"; - break; - case 94: - name = "Srbinovo"; - break; - case 95: - name = "Staravina"; - break; - case 96: - name = "Star Dojran"; - break; - case 97: - name = "Staro Nagoricane"; - break; - case 98: - name = "Stip"; - break; - case 99: - name = "Struga"; - break; - case 832: - name = "Strumica"; - break; - case 833: - name = "Studenicani"; - break; - case 834: - name = "Suto Orizari"; - break; - case 835: - name = "Sveti Nikole"; - break; - case 836: - name = "Tearce"; - break; - case 837: - name = "Tetovo"; - break; - case 838: - name = "Topolcani"; - break; - case 839: - name = "Valandovo"; - break; - case 840: - name = "Vasilevo"; - break; - case 875: - name = "Veles"; - break; - case 876: - name = "Velesta"; - break; - case 877: - name = "Vevcani"; - break; - case 878: - name = "Vinica"; - break; - case 879: - name = "Vitoliste"; - break; - case 880: - name = "Vranestica"; - break; - case 881: - name = "Vrapciste"; - break; - case 882: - name = "Vratnica"; - break; - case 883: - name = "Vrutok"; - break; - case 918: - name = "Zajas"; - break; - case 919: - name = "Zelenikovo"; - break; - case 920: - name = "Zelino"; - break; - case 921: - name = "Zitose"; - break; - case 922: - name = "Zletovo"; - break; - case 923: - name = "Zrnovci"; - break; - } - } - if (strcmp(country_code,"ML") == 0) { - switch (region_code2) { - case 1: - name = "Bamako"; - break; - case 3: - name = "Kayes"; - break; - case 4: - name = "Mopti"; - break; - case 5: - name = "Segou"; - break; - case 6: - name = "Sikasso"; - break; - case 7: - name = "Koulikoro"; - break; - case 8: - name = "Tombouctou"; - break; - case 9: - name = "Gao"; - break; - case 10: - name = "Kidal"; - break; - } - } - if (strcmp(country_code,"MM") == 0) { - switch (region_code2) { - case 1: - name = "Rakhine State"; - break; - case 2: - name = "Chin State"; - break; - case 3: - name = "Irrawaddy"; - break; - case 4: - name = "Kachin State"; - break; - case 5: - name = "Karan State"; - break; - case 6: - name = "Kayah State"; - break; - case 7: - name = "Magwe"; - break; - case 8: - name = "Mandalay"; - break; - case 9: - name = "Pegu"; - break; - case 10: - name = "Sagaing"; - break; - case 11: - name = "Shan State"; - break; - case 12: - name = "Tenasserim"; - break; - case 13: - name = "Mon State"; - break; - case 14: - name = "Rangoon"; - break; - case 17: - name = "Yangon"; - break; - } - } - if (strcmp(country_code,"MN") == 0) { - switch (region_code2) { - case 1: - name = "Arhangay"; - break; - case 2: - name = "Bayanhongor"; - break; - case 3: - name = "Bayan-Olgiy"; - break; - case 5: - name = "Darhan"; - break; - case 6: - name = "Dornod"; - break; - case 7: - name = "Dornogovi"; - break; - case 8: - name = "Dundgovi"; - break; - case 9: - name = "Dzavhan"; - break; - case 10: - name = "Govi-Altay"; - break; - case 11: - name = "Hentiy"; - break; - case 12: - name = "Hovd"; - break; - case 13: - name = "Hovsgol"; - break; - case 14: - name = "Omnogovi"; - break; - case 15: - name = "Ovorhangay"; - break; - case 16: - name = "Selenge"; - break; - case 17: - name = "Suhbaatar"; - break; - case 18: - name = "Tov"; - break; - case 19: - name = "Uvs"; - break; - case 20: - name = "Ulaanbaatar"; - break; - case 21: - name = "Bulgan"; - break; - case 22: - name = "Erdenet"; - break; - case 23: - name = "Darhan-Uul"; - break; - case 24: - name = "Govisumber"; - break; - case 25: - name = "Orhon"; - break; - } - } - if (strcmp(country_code,"MO") == 0) { - switch (region_code2) { - case 1: - name = "Ilhas"; - break; - case 2: - name = "Macau"; - break; - } - } - if (strcmp(country_code,"MR") == 0) { - switch (region_code2) { - case 1: - name = "Hodh Ech Chargui"; - break; - case 2: - name = "Hodh El Gharbi"; - break; - case 3: - name = "Assaba"; - break; - case 4: - name = "Gorgol"; - break; - case 5: - name = "Brakna"; - break; - case 6: - name = "Trarza"; - break; - case 7: - name = "Adrar"; - break; - case 8: - name = "Dakhlet Nouadhibou"; - break; - case 9: - name = "Tagant"; - break; - case 10: - name = "Guidimaka"; - break; - case 11: - name = "Tiris Zemmour"; - break; - case 12: - name = "Inchiri"; - break; - } - } - if (strcmp(country_code,"MS") == 0) { - switch (region_code2) { - case 1: - name = "Saint Anthony"; - break; - case 2: - name = "Saint Georges"; - break; - case 3: - name = "Saint Peter"; - break; - } - } - if (strcmp(country_code,"MU") == 0) { - switch (region_code2) { - case 12: - name = "Black River"; - break; - case 13: - name = "Flacq"; - break; - case 14: - name = "Grand Port"; - break; - case 15: - name = "Moka"; - break; - case 16: - name = "Pamplemousses"; - break; - case 17: - name = "Plaines Wilhems"; - break; - case 18: - name = "Port Louis"; - break; - case 19: - name = "Riviere du Rempart"; - break; - case 20: - name = "Savanne"; - break; - case 21: - name = "Agalega Islands"; - break; - case 22: - name = "Cargados Carajos"; - break; - case 23: - name = "Rodrigues"; - break; - } - } - if (strcmp(country_code,"MV") == 0) { - switch (region_code2) { - case 1: - name = "Seenu"; - break; - case 5: - name = "Laamu"; - break; - case 30: - name = "Alifu"; - break; - case 31: - name = "Baa"; - break; - case 32: - name = "Dhaalu"; - break; - case 33: - name = "Faafu "; - break; - case 34: - name = "Gaafu Alifu"; - break; - case 35: - name = "Gaafu Dhaalu"; - break; - case 36: - name = "Haa Alifu"; - break; - case 37: - name = "Haa Dhaalu"; - break; - case 38: - name = "Kaafu"; - break; - case 39: - name = "Lhaviyani"; - break; - case 40: - name = "Maale"; - break; - case 41: - name = "Meemu"; - break; - case 42: - name = "Gnaviyani"; - break; - case 43: - name = "Noonu"; - break; - case 44: - name = "Raa"; - break; - case 45: - name = "Shaviyani"; - break; - case 46: - name = "Thaa"; - break; - case 47: - name = "Vaavu"; - break; - } - } - if (strcmp(country_code,"MW") == 0) { - switch (region_code2) { - case 2: - name = "Chikwawa"; - break; - case 3: - name = "Chiradzulu"; - break; - case 4: - name = "Chitipa"; - break; - case 5: - name = "Thyolo"; - break; - case 6: - name = "Dedza"; - break; - case 7: - name = "Dowa"; - break; - case 8: - name = "Karonga"; - break; - case 9: - name = "Kasungu"; - break; - case 11: - name = "Lilongwe"; - break; - case 12: - name = "Mangochi"; - break; - case 13: - name = "Mchinji"; - break; - case 15: - name = "Mzimba"; - break; - case 16: - name = "Ntcheu"; - break; - case 17: - name = "Nkhata Bay"; - break; - case 18: - name = "Nkhotakota"; - break; - case 19: - name = "Nsanje"; - break; - case 20: - name = "Ntchisi"; - break; - case 21: - name = "Rumphi"; - break; - case 22: - name = "Salima"; - break; - case 23: - name = "Zomba"; - break; - case 24: - name = "Blantyre"; - break; - case 25: - name = "Mwanza"; - break; - case 26: - name = "Balaka"; - break; - case 27: - name = "Likoma"; - break; - case 28: - name = "Machinga"; - break; - case 29: - name = "Mulanje"; - break; - case 30: - name = "Phalombe"; - break; - } - } - if (strcmp(country_code,"MX") == 0) { - switch (region_code2) { - case 1: - name = "Aguascalientes"; - break; - case 2: - name = "Baja California"; - break; - case 3: - name = "Baja California Sur"; - break; - case 4: - name = "Campeche"; - break; - case 5: - name = "Chiapas"; - break; - case 6: - name = "Chihuahua"; - break; - case 7: - name = "Coahuila de Zaragoza"; - break; - case 8: - name = "Colima"; - break; - case 9: - name = "Distrito Federal"; - break; - case 10: - name = "Durango"; - break; - case 11: - name = "Guanajuato"; - break; - case 12: - name = "Guerrero"; - break; - case 13: - name = "Hidalgo"; - break; - case 14: - name = "Jalisco"; - break; - case 15: - name = "Mexico"; - break; - case 16: - name = "Michoacan de Ocampo"; - break; - case 17: - name = "Morelos"; - break; - case 18: - name = "Nayarit"; - break; - case 19: - name = "Nuevo Leon"; - break; - case 20: - name = "Oaxaca"; - break; - case 21: - name = "Puebla"; - break; - case 22: - name = "Queretaro de Arteaga"; - break; - case 23: - name = "Quintana Roo"; - break; - case 24: - name = "San Luis Potosi"; - break; - case 25: - name = "Sinaloa"; - break; - case 26: - name = "Sonora"; - break; - case 27: - name = "Tabasco"; - break; - case 28: - name = "Tamaulipas"; - break; - case 29: - name = "Tlaxcala"; - break; - case 30: - name = "Veracruz-Llave"; - break; - case 31: - name = "Yucatan"; - break; - case 32: - name = "Zacatecas"; - break; - } - } - if (strcmp(country_code,"MY") == 0) { - switch (region_code2) { - case 1: - name = "Johor"; - break; - case 2: - name = "Kedah"; - break; - case 3: - name = "Kelantan"; - break; - case 4: - name = "Melaka"; - break; - case 5: - name = "Negeri Sembilan"; - break; - case 6: - name = "Pahang"; - break; - case 7: - name = "Perak"; - break; - case 8: - name = "Perlis"; - break; - case 9: - name = "Pulau Pinang"; - break; - case 11: - name = "Sarawak"; - break; - case 12: - name = "Selangor"; - break; - case 13: - name = "Terengganu"; - break; - case 14: - name = "Kuala Lumpur"; - break; - case 15: - name = "Labuan"; - break; - case 16: - name = "Sabah"; - break; - case 17: - name = "Putrajaya"; - break; - } - } - if (strcmp(country_code,"MZ") == 0) { - switch (region_code2) { - case 1: - name = "Cabo Delgado"; - break; - case 2: - name = "Gaza"; - break; - case 3: - name = "Inhambane"; - break; - case 4: - name = "Maputo"; - break; - case 5: - name = "Sofala"; - break; - case 6: - name = "Nampula"; - break; - case 7: - name = "Niassa"; - break; - case 8: - name = "Tete"; - break; - case 9: - name = "Zambezia"; - break; - case 10: - name = "Manica"; - break; - case 11: - name = "Maputo"; - break; - } - } - if (strcmp(country_code,"NA") == 0) { - switch (region_code2) { - case 1: - name = "Bethanien"; - break; - case 2: - name = "Caprivi Oos"; - break; - case 3: - name = "Boesmanland"; - break; - case 4: - name = "Gobabis"; - break; - case 5: - name = "Grootfontein"; - break; - case 6: - name = "Kaokoland"; - break; - case 7: - name = "Karibib"; - break; - case 8: - name = "Keetmanshoop"; - break; - case 9: - name = "Luderitz"; - break; - case 10: - name = "Maltahohe"; - break; - case 11: - name = "Okahandja"; - break; - case 12: - name = "Omaruru"; - break; - case 13: - name = "Otjiwarongo"; - break; - case 14: - name = "Outjo"; - break; - case 15: - name = "Owambo"; - break; - case 16: - name = "Rehoboth"; - break; - case 17: - name = "Swakopmund"; - break; - case 18: - name = "Tsumeb"; - break; - case 20: - name = "Karasburg"; - break; - case 21: - name = "Windhoek"; - break; - case 22: - name = "Damaraland"; - break; - case 23: - name = "Hereroland Oos"; - break; - case 24: - name = "Hereroland Wes"; - break; - case 25: - name = "Kavango"; - break; - case 26: - name = "Mariental"; - break; - case 27: - name = "Namaland"; - break; - case 28: - name = "Caprivi"; - break; - case 29: - name = "Erongo"; - break; - case 30: - name = "Hardap"; - break; - case 31: - name = "Karas"; - break; - case 32: - name = "Kunene"; - break; - case 33: - name = "Ohangwena"; - break; - case 34: - name = "Okavango"; - break; - case 35: - name = "Omaheke"; - break; - case 36: - name = "Omusati"; - break; - case 37: - name = "Oshana"; - break; - case 38: - name = "Oshikoto"; - break; - case 39: - name = "Otjozondjupa"; - break; - } - } - if (strcmp(country_code,"NE") == 0) { - switch (region_code2) { - case 1: - name = "Agadez"; - break; - case 2: - name = "Diffa"; - break; - case 3: - name = "Dosso"; - break; - case 4: - name = "Maradi"; - break; - case 5: - name = "Niamey"; - break; - case 6: - name = "Tahoua"; - break; - case 7: - name = "Zinder"; - break; - case 8: - name = "Niamey"; - break; - } - } - if (strcmp(country_code,"NG") == 0) { - switch (region_code2) { - case 5: - name = "Lagos"; - break; - case 11: - name = "Federal Capital Territory"; - break; - case 16: - name = "Ogun"; - break; - case 21: - name = "Akwa Ibom"; - break; - case 22: - name = "Cross River"; - break; - case 23: - name = "Kaduna"; - break; - case 24: - name = "Katsina"; - break; - case 25: - name = "Anambra"; - break; - case 26: - name = "Benue"; - break; - case 27: - name = "Borno"; - break; - case 28: - name = "Imo"; - break; - case 29: - name = "Kano"; - break; - case 30: - name = "Kwara"; - break; - case 31: - name = "Niger"; - break; - case 32: - name = "Oyo"; - break; - case 35: - name = "Adamawa"; - break; - case 36: - name = "Delta"; - break; - case 37: - name = "Edo"; - break; - case 39: - name = "Jigawa"; - break; - case 40: - name = "Kebbi"; - break; - case 41: - name = "Kogi"; - break; - case 42: - name = "Osun"; - break; - case 43: - name = "Taraba"; - break; - case 44: - name = "Yobe"; - break; - case 45: - name = "Abia"; - break; - case 46: - name = "Bauchi"; - break; - case 47: - name = "Enugu"; - break; - case 48: - name = "Ondo"; - break; - case 49: - name = "Plateau"; - break; - case 50: - name = "Rivers"; - break; - case 51: - name = "Sokoto"; - break; - case 52: - name = "Bayelsa"; - break; - case 53: - name = "Ebonyi"; - break; - case 54: - name = "Ekiti"; - break; - case 55: - name = "Gombe"; - break; - case 56: - name = "Nassarawa"; - break; - case 57: - name = "Zamfara"; - break; - } - } - if (strcmp(country_code,"NI") == 0) { - switch (region_code2) { - case 1: - name = "Boaco"; - break; - case 2: - name = "Carazo"; - break; - case 3: - name = "Chinandega"; - break; - case 4: - name = "Chontales"; - break; - case 5: - name = "Esteli"; - break; - case 6: - name = "Granada"; - break; - case 7: - name = "Jinotega"; - break; - case 8: - name = "Leon"; - break; - case 9: - name = "Madriz"; - break; - case 10: - name = "Managua"; - break; - case 11: - name = "Masaya"; - break; - case 12: - name = "Matagalpa"; - break; - case 13: - name = "Nueva Segovia"; - break; - case 14: - name = "Rio San Juan"; - break; - case 15: - name = "Rivas"; - break; - case 16: - name = "Zelaya"; - break; - case 17: - name = "Autonoma Atlantico Norte"; - break; - case 18: - name = "Region Autonoma Atlantico Sur"; - break; - } - } - if (strcmp(country_code,"NL") == 0) { - switch (region_code2) { - case 1: - name = "Drenthe"; - break; - case 2: - name = "Friesland"; - break; - case 3: - name = "Gelderland"; - break; - case 4: - name = "Groningen"; - break; - case 5: - name = "Limburg"; - break; - case 6: - name = "Noord-Brabant"; - break; - case 7: - name = "Noord-Holland"; - break; - case 8: - name = "Overijssel"; - break; - case 9: - name = "Utrecht"; - break; - case 10: - name = "Zeeland"; - break; - case 11: - name = "Zuid-Holland"; - break; - case 15: - name = "Overijssel"; - break; - case 16: - name = "Flevoland"; - break; - } - } - if (strcmp(country_code,"NO") == 0) { - switch (region_code2) { - case 1: - name = "Akershus"; - break; - case 2: - name = "Aust-Agder"; - break; - case 4: - name = "Buskerud"; - break; - case 5: - name = "Finnmark"; - break; - case 6: - name = "Hedmark"; - break; - case 7: - name = "Hordaland"; - break; - case 8: - name = "More og Romsdal"; - break; - case 9: - name = "Nordland"; - break; - case 10: - name = "Nord-Trondelag"; - break; - case 11: - name = "Oppland"; - break; - case 12: - name = "Oslo"; - break; - case 13: - name = "Ostfold"; - break; - case 14: - name = "Rogaland"; - break; - case 15: - name = "Sogn og Fjordane"; - break; - case 16: - name = "Sor-Trondelag"; - break; - case 17: - name = "Telemark"; - break; - case 18: - name = "Troms"; - break; - case 19: - name = "Vest-Agder"; - break; - case 20: - name = "Vestfold"; - break; - } - } - if (strcmp(country_code,"NP") == 0) { - switch (region_code2) { - case 1: - name = "Bagmati"; - break; - case 2: - name = "Bheri"; - break; - case 3: - name = "Dhawalagiri"; - break; - case 4: - name = "Gandaki"; - break; - case 5: - name = "Janakpur"; - break; - case 6: - name = "Karnali"; - break; - case 7: - name = "Kosi"; - break; - case 8: - name = "Lumbini"; - break; - case 9: - name = "Mahakali"; - break; - case 10: - name = "Mechi"; - break; - case 11: - name = "Narayani"; - break; - case 12: - name = "Rapti"; - break; - case 13: - name = "Sagarmatha"; - break; - case 14: - name = "Seti"; - break; - } - } - if (strcmp(country_code,"NR") == 0) { - switch (region_code2) { - case 1: - name = "Aiwo"; - break; - case 2: - name = "Anabar"; - break; - case 3: - name = "Anetan"; - break; - case 4: - name = "Anibare"; - break; - case 5: - name = "Baiti"; - break; - case 6: - name = "Boe"; - break; - case 7: - name = "Buada"; - break; - case 8: - name = "Denigomodu"; - break; - case 9: - name = "Ewa"; - break; - case 10: - name = "Ijuw"; - break; - case 11: - name = "Meneng"; - break; - case 12: - name = "Nibok"; - break; - case 13: - name = "Uaboe"; - break; - case 14: - name = "Yaren"; - break; - } - } - if (strcmp(country_code,"NZ") == 0) { - switch (region_code2) { - case 10: - name = "Chatham Islands"; - break; - case 1010: - name = "Auckland"; - break; - case 1011: - name = "Bay of Plenty"; - break; - case 1012: - name = "Canterbury"; - break; - case 1047: - name = "Gisborne"; - break; - case 1048: - name = "Hawke's Bay"; - break; - case 1049: - name = "Manawatu-Wanganui"; - break; - case 1050: - name = "Marlborough"; - break; - case 1051: - name = "Nelson"; - break; - case 1052: - name = "Northland"; - break; - case 1053: - name = "Otago"; - break; - case 1054: - name = "Southland"; - break; - case 1055: - name = "Taranaki"; - break; - case 1090: - name = "Waikato"; - break; - case 1091: - name = "Wellington"; - break; - case 1092: - name = "West Coast"; - break; - } - } - if (strcmp(country_code,"OM") == 0) { - switch (region_code2) { - case 1: - name = "Ad Dakhiliyah"; - break; - case 2: - name = "Al Batinah"; - break; - case 3: - name = "Al Wusta"; - break; - case 4: - name = "Ash Sharqiyah"; - break; - case 5: - name = "Az Zahirah"; - break; - case 6: - name = "Masqat"; - break; - case 7: - name = "Musandam"; - break; - case 8: - name = "Zufar"; - break; - } - } - if (strcmp(country_code,"PA") == 0) { - switch (region_code2) { - case 1: - name = "Bocas del Toro"; - break; - case 2: - name = "Chiriqui"; - break; - case 3: - name = "Cocle"; - break; - case 4: - name = "Colon"; - break; - case 5: - name = "Darien"; - break; - case 6: - name = "Herrera"; - break; - case 7: - name = "Los Santos"; - break; - case 8: - name = "Panama"; - break; - case 9: - name = "San Blas"; - break; - case 10: - name = "Veraguas"; - break; - } - } - if (strcmp(country_code,"PE") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Ancash"; - break; - case 3: - name = "Apurimac"; - break; - case 4: - name = "Arequipa"; - break; - case 5: - name = "Ayacucho"; - break; - case 6: - name = "Cajamarca"; - break; - case 7: - name = "Callao"; - break; - case 8: - name = "Cusco"; - break; - case 9: - name = "Huancavelica"; - break; - case 10: - name = "Huanuco"; - break; - case 11: - name = "Ica"; - break; - case 12: - name = "Junin"; - break; - case 13: - name = "La Libertad"; - break; - case 14: - name = "Lambayeque"; - break; - case 15: - name = "Lima"; - break; - case 16: - name = "Loreto"; - break; - case 17: - name = "Madre de Dios"; - break; - case 18: - name = "Moquegua"; - break; - case 19: - name = "Pasco"; - break; - case 20: - name = "Piura"; - break; - case 21: - name = "Puno"; - break; - case 22: - name = "San Martin"; - break; - case 23: - name = "Tacna"; - break; - case 24: - name = "Tumbes"; - break; - case 25: - name = "Ucayali"; - break; - } - } - if (strcmp(country_code,"PG") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Gulf"; - break; - case 3: - name = "Milne Bay"; - break; - case 4: - name = "Northern"; - break; - case 5: - name = "Southern Highlands"; - break; - case 6: - name = "Western"; - break; - case 7: - name = "North Solomons"; - break; - case 8: - name = "Chimbu"; - break; - case 9: - name = "Eastern Highlands"; - break; - case 10: - name = "East New Britain"; - break; - case 11: - name = "East Sepik"; - break; - case 12: - name = "Madang"; - break; - case 13: - name = "Manus"; - break; - case 14: - name = "Morobe"; - break; - case 15: - name = "New Ireland"; - break; - case 16: - name = "Western Highlands"; - break; - case 17: - name = "West New Britain"; - break; - case 18: - name = "Sandaun"; - break; - case 19: - name = "Enga"; - break; - case 20: - name = "National Capital"; - break; - } - } - if (strcmp(country_code,"PH") == 0) { - switch (region_code2) { - case 1: - name = "Abra"; - break; - case 2: - name = "Agusan del Norte"; - break; - case 3: - name = "Agusan del Sur"; - break; - case 4: - name = "Aklan"; - break; - case 5: - name = "Albay"; - break; - case 6: - name = "Antique"; - break; - case 7: - name = "Bataan"; - break; - case 8: - name = "Batanes"; - break; - case 9: - name = "Batangas"; - break; - case 10: - name = "Benguet"; - break; - case 11: - name = "Bohol"; - break; - case 12: - name = "Bukidnon"; - break; - case 13: - name = "Bulacan"; - break; - case 14: - name = "Cagayan"; - break; - case 15: - name = "Camarines Norte"; - break; - case 16: - name = "Camarines Sur"; - break; - case 17: - name = "Camiguin"; - break; - case 18: - name = "Capiz"; - break; - case 19: - name = "Catanduanes"; - break; - case 20: - name = "Cavite"; - break; - case 21: - name = "Cebu"; - break; - case 22: - name = "Basilan"; - break; - case 23: - name = "Eastern Samar"; - break; - case 24: - name = "Davao"; - break; - case 25: - name = "Davao del Sur"; - break; - case 26: - name = "Davao Oriental"; - break; - case 27: - name = "Ifugao"; - break; - case 28: - name = "Ilocos Norte"; - break; - case 29: - name = "Ilocos Sur"; - break; - case 30: - name = "Iloilo"; - break; - case 31: - name = "Isabela"; - break; - case 32: - name = "Kalinga-Apayao"; - break; - case 33: - name = "Laguna"; - break; - case 34: - name = "Lanao del Norte"; - break; - case 35: - name = "Lanao del Sur"; - break; - case 36: - name = "La Union"; - break; - case 37: - name = "Leyte"; - break; - case 38: - name = "Marinduque"; - break; - case 39: - name = "Masbate"; - break; - case 40: - name = "Mindoro Occidental"; - break; - case 41: - name = "Mindoro Oriental"; - break; - case 42: - name = "Misamis Occidental"; - break; - case 43: - name = "Misamis Oriental"; - break; - case 44: - name = "Mountain"; - break; - case 45: - name = "Negros Occidental"; - break; - case 46: - name = "Negros Oriental"; - break; - case 47: - name = "Nueva Ecija"; - break; - case 48: - name = "Nueva Vizcaya"; - break; - case 49: - name = "Palawan"; - break; - case 50: - name = "Pampanga"; - break; - case 51: - name = "Pangasinan"; - break; - case 53: - name = "Rizal"; - break; - case 54: - name = "Romblon"; - break; - case 55: - name = "Samar"; - break; - case 56: - name = "Maguindanao"; - break; - case 57: - name = "North Cotabato"; - break; - case 58: - name = "Sorsogon"; - break; - case 59: - name = "Southern Leyte"; - break; - case 60: - name = "Sulu"; - break; - case 61: - name = "Surigao del Norte"; - break; - case 62: - name = "Surigao del Sur"; - break; - case 63: - name = "Tarlac"; - break; - case 64: - name = "Zambales"; - break; - case 65: - name = "Zamboanga del Norte"; - break; - case 66: - name = "Zamboanga del Sur"; - break; - case 67: - name = "Northern Samar"; - break; - case 68: - name = "Quirino"; - break; - case 69: - name = "Siquijor"; - break; - case 70: - name = "South Cotabato"; - break; - case 71: - name = "Sultan Kudarat"; - break; - case 72: - name = "Tawitawi"; - break; - case 832: - name = "Angeles"; - break; - case 833: - name = "Bacolod"; - break; - case 834: - name = "Bago"; - break; - case 835: - name = "Baguio"; - break; - case 836: - name = "Bais"; - break; - case 837: - name = "Basilan City"; - break; - case 838: - name = "Batangas City"; - break; - case 839: - name = "Butuan"; - break; - case 840: - name = "Cabanatuan"; - break; - case 875: - name = "Cadiz"; - break; - case 876: - name = "Cagayan de Oro"; - break; - case 877: - name = "Calbayog"; - break; - case 878: - name = "Caloocan"; - break; - case 879: - name = "Canlaon"; - break; - case 880: - name = "Cavite City"; - break; - case 881: - name = "Cebu City"; - break; - case 882: - name = "Cotabato"; - break; - case 883: - name = "Dagupan"; - break; - case 918: - name = "Danao"; - break; - case 919: - name = "Dapitan"; - break; - case 920: - name = "Davao City"; - break; - case 921: - name = "Dipolog"; - break; - case 922: - name = "Dumaguete"; - break; - case 923: - name = "General Santos"; - break; - case 924: - name = "Gingoog"; - break; - case 925: - name = "Iligan"; - break; - case 926: - name = "Iloilo City"; - break; - case 961: - name = "Iriga"; - break; - case 962: - name = "La Carlota"; - break; - case 963: - name = "Laoag"; - break; - case 964: - name = "Lapu-Lapu"; - break; - case 965: - name = "Legaspi"; - break; - case 966: - name = "Lipa"; - break; - case 967: - name = "Lucena"; - break; - case 968: - name = "Mandaue"; - break; - case 969: - name = "Manila"; - break; - case 1004: - name = "Marawi"; - break; - case 1005: - name = "Naga"; - break; - case 1006: - name = "Olongapo"; - break; - case 1007: - name = "Ormoc"; - break; - case 1008: - name = "Oroquieta"; - break; - case 1009: - name = "Ozamis"; - break; - case 1010: - name = "Pagadian"; - break; - case 1011: - name = "Palayan"; - break; - case 1012: - name = "Pasay"; - break; - case 1047: - name = "Puerto Princesa"; - break; - case 1048: - name = "Quezon City"; - break; - case 1049: - name = "Roxas"; - break; - case 1050: - name = "San Carlos"; - break; - case 1051: - name = "San Carlos"; - break; - case 1052: - name = "San Jose"; - break; - case 1053: - name = "San Pablo"; - break; - case 1054: - name = "Silay"; - break; - case 1055: - name = "Surigao"; - break; - case 1090: - name = "Tacloban"; - break; - case 1091: - name = "Tagaytay"; - break; - case 1092: - name = "Tagbilaran"; - break; - case 1093: - name = "Tangub"; - break; - case 1094: - name = "Toledo"; - break; - case 1095: - name = "Trece Martires"; - break; - case 1096: - name = "Zamboanga"; - break; - case 1097: - name = "Aurora"; - break; - case 1134: - name = "Quezon"; - break; - case 1135: - name = "Negros Occidental"; - break; - } - } - if (strcmp(country_code,"PK") == 0) { - switch (region_code2) { - case 1: - name = "Federally Administered Tribal Areas"; - break; - case 2: - name = "Balochistan"; - break; - case 3: - name = "North-West Frontier"; - break; - case 4: - name = "Punjab"; - break; - case 5: - name = "Sindh"; - break; - case 6: - name = "Azad Kashmir"; - break; - case 7: - name = "Northern Areas"; - break; - case 8: - name = "Islamabad"; - break; - } - } - if (strcmp(country_code,"PL") == 0) { - switch (region_code2) { - case 72: - name = "Dolnoslaskie"; - break; - case 73: - name = "Kujawsko-Pomorskie"; - break; - case 74: - name = "Lodzkie"; - break; - case 75: - name = "Lubelskie"; - break; - case 76: - name = "Lubuskie"; - break; - case 77: - name = "Malopolskie"; - break; - case 78: - name = "Mazowieckie"; - break; - case 79: - name = "Opolskie"; - break; - case 80: - name = "Podkarpackie"; - break; - case 81: - name = "Podlaskie"; - break; - case 82: - name = "Pomorskie"; - break; - case 83: - name = "Slaskie"; - break; - case 84: - name = "Swietokrzyskie"; - break; - case 85: - name = "Warminsko-Mazurskie"; - break; - case 86: - name = "Wielkopolskie"; - break; - case 87: - name = "Zachodniopomorskie"; - break; - } - } - if (strcmp(country_code,"PS") == 0) { - switch (region_code2) { - case 1131: - name = "Gaza"; - break; - case 1798: - name = "West Bank"; - break; - } - } - if (strcmp(country_code,"PT") == 0) { - switch (region_code2) { - case 2: - name = "Aveiro"; - break; - case 3: - name = "Beja"; - break; - case 4: - name = "Braga"; - break; - case 5: - name = "Braganca"; - break; - case 6: - name = "Castelo Branco"; - break; - case 7: - name = "Coimbra"; - break; - case 8: - name = "Evora"; - break; - case 9: - name = "Faro"; - break; - case 10: - name = "Madeira"; - break; - case 11: - name = "Guarda"; - break; - case 13: - name = "Leiria"; - break; - case 14: - name = "Lisboa"; - break; - case 16: - name = "Portalegre"; - break; - case 17: - name = "Porto"; - break; - case 18: - name = "Santarem"; - break; - case 19: - name = "Setubal"; - break; - case 20: - name = "Viana do Castelo"; - break; - case 21: - name = "Vila Real"; - break; - case 22: - name = "Viseu"; - break; - case 23: - name = "Azores"; - break; - } - } - if (strcmp(country_code,"PY") == 0) { - switch (region_code2) { - case 1: - name = "Alto Parana"; - break; - case 2: - name = "Amambay"; - break; - case 3: - name = "Boqueron"; - break; - case 4: - name = "Caaguazu"; - break; - case 5: - name = "Caazapa"; - break; - case 6: - name = "Central"; - break; - case 7: - name = "Concepcion"; - break; - case 8: - name = "Cordillera"; - break; - case 10: - name = "Guaira"; - break; - case 11: - name = "Itapua"; - break; - case 12: - name = "Misiones"; - break; - case 13: - name = "Neembucu"; - break; - case 15: - name = "Paraguari"; - break; - case 16: - name = "Presidente Hayes"; - break; - case 17: - name = "San Pedro"; - break; - case 19: - name = "Canindeyu"; - break; - case 20: - name = "Chaco"; - break; - case 21: - name = "Nueva Asuncion"; - break; - case 23: - name = "Alto Paraguay"; - break; - } - } - if (strcmp(country_code,"QA") == 0) { - switch (region_code2) { - case 1: - name = "Ad Dawhah"; - break; - case 2: - name = "Al Ghuwariyah"; - break; - case 3: - name = "Al Jumaliyah"; - break; - case 4: - name = "Al Khawr"; - break; - case 5: - name = "Al Wakrah Municipality"; - break; - case 6: - name = "Ar Rayyan"; - break; - case 8: - name = "Madinat ach Shamal"; - break; - case 9: - name = "Umm Salal"; - break; - case 10: - name = "Al Wakrah"; - break; - case 11: - name = "Jariyan al Batnah"; - break; - case 12: - name = "Umm Sa'id"; - break; - } - } - if (strcmp(country_code,"RO") == 0) { - switch (region_code2) { - case 1: - name = "Alba"; - break; - case 2: - name = "Arad"; - break; - case 3: - name = "Arges"; - break; - case 4: - name = "Bacau"; - break; - case 5: - name = "Bihor"; - break; - case 6: - name = "Bistrita-Nasaud"; - break; - case 7: - name = "Botosani"; - break; - case 8: - name = "Braila"; - break; - case 9: - name = "Brasov"; - break; - case 10: - name = "Bucuresti"; - break; - case 11: - name = "Buzau"; - break; - case 12: - name = "Caras-Severin"; - break; - case 13: - name = "Cluj"; - break; - case 14: - name = "Constanta"; - break; - case 15: - name = "Covasna"; - break; - case 16: - name = "Dambovita"; - break; - case 17: - name = "Dolj"; - break; - case 18: - name = "Galati"; - break; - case 19: - name = "Gorj"; - break; - case 20: - name = "Harghita"; - break; - case 21: - name = "Hunedoara"; - break; - case 22: - name = "Ialomita"; - break; - case 23: - name = "Iasi"; - break; - case 25: - name = "Maramures"; - break; - case 26: - name = "Mehedinti"; - break; - case 27: - name = "Mures"; - break; - case 28: - name = "Neamt"; - break; - case 29: - name = "Olt"; - break; - case 30: - name = "Prahova"; - break; - case 31: - name = "Salaj"; - break; - case 32: - name = "Satu Mare"; - break; - case 33: - name = "Sibiu"; - break; - case 34: - name = "Suceava"; - break; - case 35: - name = "Teleorman"; - break; - case 36: - name = "Timis"; - break; - case 37: - name = "Tulcea"; - break; - case 38: - name = "Vaslui"; - break; - case 39: - name = "Valcea"; - break; - case 40: - name = "Vrancea"; - break; - case 41: - name = "Calarasi"; - break; - case 42: - name = "Giurgiu"; - break; - case 43: - name = "Ilfov"; - break; - } - } - if (strcmp(country_code,"RS") == 0) { - switch (region_code2) { - case 1: - name = "Kosovo"; - break; - case 2: - name = "Vojvodina"; - break; - } - } - if (strcmp(country_code,"RU") == 0) { - switch (region_code2) { - case 1: - name = "Adygeya, Republic of"; - break; - case 2: - name = "Aginsky Buryatsky AO"; - break; - case 3: - name = "Gorno-Altay"; - break; - case 4: - name = "Altaisky krai"; - break; - case 5: - name = "Amur"; - break; - case 6: - name = "Arkhangel'sk"; - break; - case 7: - name = "Astrakhan'"; - break; - case 8: - name = "Bashkortostan"; - break; - case 9: - name = "Belgorod"; - break; - case 10: - name = "Bryansk"; - break; - case 11: - name = "Buryat"; - break; - case 12: - name = "Chechnya"; - break; - case 13: - name = "Chelyabinsk"; - break; - case 14: - name = "Chita"; - break; - case 15: - name = "Chukot"; - break; - case 16: - name = "Chuvashia"; - break; - case 17: - name = "Dagestan"; - break; - case 18: - name = "Evenk"; - break; - case 19: - name = "Ingush"; - break; - case 20: - name = "Irkutsk"; - break; - case 21: - name = "Ivanovo"; - break; - case 22: - name = "Kabardin-Balkar"; - break; - case 23: - name = "Kaliningrad"; - break; - case 24: - name = "Kalmyk"; - break; - case 25: - name = "Kaluga"; - break; - case 26: - name = "Kamchatka"; - break; - case 27: - name = "Karachay-Cherkess"; - break; - case 28: - name = "Karelia"; - break; - case 29: - name = "Kemerovo"; - break; - case 30: - name = "Khabarovsk"; - break; - case 31: - name = "Khakass"; - break; - case 32: - name = "Khanty-Mansiy"; - break; - case 33: - name = "Kirov"; - break; - case 34: - name = "Komi"; - break; - case 35: - name = "Komi-Permyak"; - break; - case 36: - name = "Koryak"; - break; - case 37: - name = "Kostroma"; - break; - case 38: - name = "Krasnodar"; - break; - case 39: - name = "Krasnoyarsk"; - break; - case 40: - name = "Kurgan"; - break; - case 41: - name = "Kursk"; - break; - case 42: - name = "Leningrad"; - break; - case 43: - name = "Lipetsk"; - break; - case 44: - name = "Magadan"; - break; - case 45: - name = "Mariy-El"; - break; - case 46: - name = "Mordovia"; - break; - case 47: - name = "Moskva"; - break; - case 48: - name = "Moscow City"; - break; - case 49: - name = "Murmansk"; - break; - case 50: - name = "Nenets"; - break; - case 51: - name = "Nizhegorod"; - break; - case 52: - name = "Novgorod"; - break; - case 53: - name = "Novosibirsk"; - break; - case 54: - name = "Omsk"; - break; - case 55: - name = "Orenburg"; - break; - case 56: - name = "Orel"; - break; - case 57: - name = "Penza"; - break; - case 58: - name = "Perm'"; - break; - case 59: - name = "Primor'ye"; - break; - case 60: - name = "Pskov"; - break; - case 61: - name = "Rostov"; - break; - case 62: - name = "Ryazan'"; - break; - case 63: - name = "Sakha"; - break; - case 64: - name = "Sakhalin"; - break; - case 65: - name = "Samara"; - break; - case 66: - name = "Saint Petersburg City"; - break; - case 67: - name = "Saratov"; - break; - case 68: - name = "North Ossetia"; - break; - case 69: - name = "Smolensk"; - break; - case 70: - name = "Stavropol'"; - break; - case 71: - name = "Sverdlovsk"; - break; - case 72: - name = "Tambovskaya oblast"; - break; - case 73: - name = "Tatarstan"; - break; - case 74: - name = "Taymyr"; - break; - case 75: - name = "Tomsk"; - break; - case 76: - name = "Tula"; - break; - case 77: - name = "Tver'"; - break; - case 78: - name = "Tyumen'"; - break; - case 79: - name = "Tuva"; - break; - case 80: - name = "Udmurt"; - break; - case 81: - name = "Ul'yanovsk"; - break; - case 82: - name = "Ust-Orda Buryat"; - break; - case 83: - name = "Vladimir"; - break; - case 84: - name = "Volgograd"; - break; - case 85: - name = "Vologda"; - break; - case 86: - name = "Voronezh"; - break; - case 87: - name = "Yamal-Nenets"; - break; - case 88: - name = "Yaroslavl'"; - break; - case 89: - name = "Yevrey"; - break; - case 90: - name = "Permskiy Kray"; - break; - case 91: - name = "Krasnoyarskiy Kray"; - break; - case 942: - name = "Chechnya Republic"; - break; - } - } - if (strcmp(country_code,"RW") == 0) { - switch (region_code2) { - case 1: - name = "Butare"; - break; - case 6: - name = "Gitarama"; - break; - case 7: - name = "Kibungo"; - break; - case 9: - name = "Kigali"; - break; - case 11: - name = "Est"; - break; - case 12: - name = "Kigali"; - break; - case 13: - name = "Nord"; - break; - case 14: - name = "Ouest"; - break; - case 15: - name = "Sud"; - break; - } - } - if (strcmp(country_code,"SA") == 0) { - switch (region_code2) { - case 2: - name = "Al Bahah"; - break; - case 3: - name = "Al Jawf"; - break; - case 5: - name = "Al Madinah"; - break; - case 6: - name = "Ash Sharqiyah"; - break; - case 8: - name = "Al Qasim"; - break; - case 9: - name = "Al Qurayyat"; - break; - case 10: - name = "Ar Riyad"; - break; - case 13: - name = "Ha'il"; - break; - case 14: - name = "Makkah"; - break; - case 15: - name = "Al Hudud ash Shamaliyah"; - break; - case 16: - name = "Najran"; - break; - case 17: - name = "Jizan"; - break; - case 19: - name = "Tabuk"; - break; - case 20: - name = "Al Jawf"; - break; - } - } - if (strcmp(country_code,"SB") == 0) { - switch (region_code2) { - case 3: - name = "Malaita"; - break; - case 6: - name = "Guadalcanal"; - break; - case 7: - name = "Isabel"; - break; - case 8: - name = "Makira"; - break; - case 9: - name = "Temotu"; - break; - case 10: - name = "Central"; - break; - case 11: - name = "Western"; - break; - case 12: - name = "Choiseul"; - break; - case 13: - name = "Rennell and Bellona"; - break; - } - } - if (strcmp(country_code,"SC") == 0) { - switch (region_code2) { - case 1: - name = "Anse aux Pins"; - break; - case 2: - name = "Anse Boileau"; - break; - case 3: - name = "Anse Etoile"; - break; - case 4: - name = "Anse Louis"; - break; - case 5: - name = "Anse Royale"; - break; - case 6: - name = "Baie Lazare"; - break; - case 7: - name = "Baie Sainte Anne"; - break; - case 8: - name = "Beau Vallon"; - break; - case 9: - name = "Bel Air"; - break; - case 10: - name = "Bel Ombre"; - break; - case 11: - name = "Cascade"; - break; - case 12: - name = "Glacis"; - break; - case 13: - name = "Grand' Anse"; - break; - case 14: - name = "Grand' Anse"; - break; - case 15: - name = "La Digue"; - break; - case 16: - name = "La Riviere Anglaise"; - break; - case 17: - name = "Mont Buxton"; - break; - case 18: - name = "Mont Fleuri"; - break; - case 19: - name = "Plaisance"; - break; - case 20: - name = "Pointe La Rue"; - break; - case 21: - name = "Port Glaud"; - break; - case 22: - name = "Saint Louis"; - break; - case 23: - name = "Takamaka"; - break; - } - } - if (strcmp(country_code,"SD") == 0) { - switch (region_code2) { - case 27: - name = "Al Wusta"; - break; - case 28: - name = "Al Istiwa'iyah"; - break; - case 29: - name = "Al Khartum"; - break; - case 30: - name = "Ash Shamaliyah"; - break; - case 31: - name = "Ash Sharqiyah"; - break; - case 32: - name = "Bahr al Ghazal"; - break; - case 33: - name = "Darfur"; - break; - case 34: - name = "Kurdufan"; - break; - case 35: - name = "Upper Nile"; - break; - case 40: - name = "Al Wahadah State"; - break; - case 44: - name = "Central Equatoria State"; - break; - } - } - if (strcmp(country_code,"SE") == 0) { - switch (region_code2) { - case 2: - name = "Blekinge Lan"; - break; - case 3: - name = "Gavleborgs Lan"; - break; - case 5: - name = "Gotlands Lan"; - break; - case 6: - name = "Hallands Lan"; - break; - case 7: - name = "Jamtlands Lan"; - break; - case 8: - name = "Jonkopings Lan"; - break; - case 9: - name = "Kalmar Lan"; - break; - case 10: - name = "Dalarnas Lan"; - break; - case 12: - name = "Kronobergs Lan"; - break; - case 14: - name = "Norrbottens Lan"; - break; - case 15: - name = "Orebro Lan"; - break; - case 16: - name = "Ostergotlands Lan"; - break; - case 18: - name = "Sodermanlands Lan"; - break; - case 21: - name = "Uppsala Lan"; - break; - case 22: - name = "Varmlands Lan"; - break; - case 23: - name = "Vasterbottens Lan"; - break; - case 24: - name = "Vasternorrlands Lan"; - break; - case 25: - name = "Vastmanlands Lan"; - break; - case 26: - name = "Stockholms Lan"; - break; - case 27: - name = "Skane Lan"; - break; - case 28: - name = "Vastra Gotaland"; - break; - } - } - if (strcmp(country_code,"SH") == 0) { - switch (region_code2) { - case 1: - name = "Ascension"; - break; - case 2: - name = "Saint Helena"; - break; - case 3: - name = "Tristan da Cunha"; - break; - } - } - if (strcmp(country_code,"SI") == 0) { - switch (region_code2) { - case 1: - name = "Ajdovscina"; - break; - case 2: - name = "Beltinci"; - break; - case 3: - name = "Bled"; - break; - case 4: - name = "Bohinj"; - break; - case 5: - name = "Borovnica"; - break; - case 6: - name = "Bovec"; - break; - case 7: - name = "Brda"; - break; - case 8: - name = "Brezice"; - break; - case 9: - name = "Brezovica"; - break; - case 11: - name = "Celje"; - break; - case 12: - name = "Cerklje na Gorenjskem"; - break; - case 13: - name = "Cerknica"; - break; - case 14: - name = "Cerkno"; - break; - case 15: - name = "Crensovci"; - break; - case 16: - name = "Crna na Koroskem"; - break; - case 17: - name = "Crnomelj"; - break; - case 19: - name = "Divaca"; - break; - case 20: - name = "Dobrepolje"; - break; - case 22: - name = "Dol pri Ljubljani"; - break; - case 24: - name = "Dornava"; - break; - case 25: - name = "Dravograd"; - break; - case 26: - name = "Duplek"; - break; - case 27: - name = "Gorenja Vas-Poljane"; - break; - case 28: - name = "Gorisnica"; - break; - case 29: - name = "Gornja Radgona"; - break; - case 30: - name = "Gornji Grad"; - break; - case 31: - name = "Gornji Petrovci"; - break; - case 32: - name = "Grosuplje"; - break; - case 34: - name = "Hrastnik"; - break; - case 35: - name = "Hrpelje-Kozina"; - break; - case 36: - name = "Idrija"; - break; - case 37: - name = "Ig"; - break; - case 38: - name = "Ilirska Bistrica"; - break; - case 39: - name = "Ivancna Gorica"; - break; - case 40: - name = "Izola-Isola"; - break; - case 42: - name = "Jursinci"; - break; - case 44: - name = "Kanal"; - break; - case 45: - name = "Kidricevo"; - break; - case 46: - name = "Kobarid"; - break; - case 47: - name = "Kobilje"; - break; - case 49: - name = "Komen"; - break; - case 50: - name = "Koper-Capodistria"; - break; - case 51: - name = "Kozje"; - break; - case 52: - name = "Kranj"; - break; - case 53: - name = "Kranjska Gora"; - break; - case 54: - name = "Krsko"; - break; - case 55: - name = "Kungota"; - break; - case 57: - name = "Lasko"; - break; - case 61: - name = "Ljubljana"; - break; - case 62: - name = "Ljubno"; - break; - case 64: - name = "Logatec"; - break; - case 66: - name = "Loski Potok"; - break; - case 68: - name = "Lukovica"; - break; - case 71: - name = "Medvode"; - break; - case 72: - name = "Menges"; - break; - case 73: - name = "Metlika"; - break; - case 74: - name = "Mezica"; - break; - case 76: - name = "Mislinja"; - break; - case 77: - name = "Moravce"; - break; - case 78: - name = "Moravske Toplice"; - break; - case 79: - name = "Mozirje"; - break; - case 80: - name = "Murska Sobota"; - break; - case 81: - name = "Muta"; - break; - case 82: - name = "Naklo"; - break; - case 83: - name = "Nazarje"; - break; - case 84: - name = "Nova Gorica"; - break; - case 86: - name = "Odranci"; - break; - case 87: - name = "Ormoz"; - break; - case 88: - name = "Osilnica"; - break; - case 89: - name = "Pesnica"; - break; - case 91: - name = "Pivka"; - break; - case 92: - name = "Podcetrtek"; - break; - case 94: - name = "Postojna"; - break; - case 97: - name = "Puconci"; - break; - case 98: - name = "Racam"; - break; - case 99: - name = "Radece"; - break; - case 832: - name = "Radenci"; - break; - case 833: - name = "Radlje ob Dravi"; - break; - case 834: - name = "Radovljica"; - break; - case 837: - name = "Rogasovci"; - break; - case 838: - name = "Rogaska Slatina"; - break; - case 839: - name = "Rogatec"; - break; - case 875: - name = "Semic"; - break; - case 876: - name = "Sencur"; - break; - case 877: - name = "Sentilj"; - break; - case 878: - name = "Sentjernej"; - break; - case 880: - name = "Sevnica"; - break; - case 881: - name = "Sezana"; - break; - case 882: - name = "Skocjan"; - break; - case 883: - name = "Skofja Loka"; - break; - case 918: - name = "Skofljica"; - break; - case 919: - name = "Slovenj Gradec"; - break; - case 921: - name = "Slovenske Konjice"; - break; - case 922: - name = "Smarje pri Jelsah"; - break; - case 923: - name = "Smartno ob Paki"; - break; - case 924: - name = "Sostanj"; - break; - case 925: - name = "Starse"; - break; - case 926: - name = "Store"; - break; - case 961: - name = "Sveti Jurij"; - break; - case 962: - name = "Tolmin"; - break; - case 963: - name = "Trbovlje"; - break; - case 964: - name = "Trebnje"; - break; - case 965: - name = "Trzic"; - break; - case 966: - name = "Turnisce"; - break; - case 967: - name = "Velenje"; - break; - case 968: - name = "Velike Lasce"; - break; - case 1004: - name = "Vipava"; - break; - case 1005: - name = "Vitanje"; - break; - case 1006: - name = "Vodice"; - break; - case 1008: - name = "Vrhnika"; - break; - case 1009: - name = "Vuzenica"; - break; - case 1010: - name = "Zagorje ob Savi"; - break; - case 1012: - name = "Zavrc"; - break; - case 1047: - name = "Zelezniki"; - break; - case 1048: - name = "Ziri"; - break; - case 1049: - name = "Zrece"; - break; - case 1093: - name = "Dobrova-Horjul-Polhov Gradec"; - break; - case 1096: - name = "Domzale"; - break; - case 1136: - name = "Jesenice"; - break; - case 1138: - name = "Kamnik"; - break; - case 1139: - name = "Kocevje"; - break; - case 1177: - name = "Kuzma"; - break; - case 1178: - name = "Lenart"; - break; - case 1180: - name = "Litija"; - break; - case 1181: - name = "Ljutomer"; - break; - case 1182: - name = "Loska Dolina"; - break; - case 1184: - name = "Luce"; - break; - case 1219: - name = "Majsperk"; - break; - case 1220: - name = "Maribor"; - break; - case 1223: - name = "Miren-Kostanjevica"; - break; - case 1225: - name = "Novo Mesto"; - break; - case 1227: - name = "Piran"; - break; - case 1266: - name = "Preddvor"; - break; - case 1268: - name = "Ptuj"; - break; - case 1305: - name = "Ribnica"; - break; - case 1307: - name = "Ruse"; - break; - case 1311: - name = "Sentjur pri Celju"; - break; - case 1312: - name = "Slovenska Bistrica"; - break; - case 1392: - name = "Videm"; - break; - case 1393: - name = "Vojnik"; - break; - case 1395: - name = "Zalec"; - break; - } - } - if (strcmp(country_code,"SK") == 0) { - switch (region_code2) { - case 1: - name = "Banska Bystrica"; - break; - case 2: - name = "Bratislava"; - break; - case 3: - name = "Kosice"; - break; - case 4: - name = "Nitra"; - break; - case 5: - name = "Presov"; - break; - case 6: - name = "Trencin"; - break; - case 7: - name = "Trnava"; - break; - case 8: - name = "Zilina"; - break; - } - } - if (strcmp(country_code,"SL") == 0) { - switch (region_code2) { - case 1: - name = "Eastern"; - break; - case 2: - name = "Northern"; - break; - case 3: - name = "Southern"; - break; - case 4: - name = "Western Area"; - break; - } - } - if (strcmp(country_code,"SM") == 0) { - switch (region_code2) { - case 1: - name = "Acquaviva"; - break; - case 2: - name = "Chiesanuova"; - break; - case 3: - name = "Domagnano"; - break; - case 4: - name = "Faetano"; - break; - case 5: - name = "Fiorentino"; - break; - case 6: - name = "Borgo Maggiore"; - break; - case 7: - name = "San Marino"; - break; - case 8: - name = "Monte Giardino"; - break; - case 9: - name = "Serravalle"; - break; - } - } - if (strcmp(country_code,"SN") == 0) { - switch (region_code2) { - case 1: - name = "Dakar"; - break; - case 3: - name = "Diourbel"; - break; - case 5: - name = "Tambacounda"; - break; - case 7: - name = "Thies"; - break; - case 9: - name = "Fatick"; - break; - case 10: - name = "Kaolack"; - break; - case 11: - name = "Kolda"; - break; - case 12: - name = "Ziguinchor"; - break; - case 13: - name = "Louga"; - break; - case 14: - name = "Saint-Louis"; - break; - case 15: - name = "Matam"; - break; - } - } - if (strcmp(country_code,"SO") == 0) { - switch (region_code2) { - case 1: - name = "Bakool"; - break; - case 2: - name = "Banaadir"; - break; - case 3: - name = "Bari"; - break; - case 4: - name = "Bay"; - break; - case 5: - name = "Galguduud"; - break; - case 6: - name = "Gedo"; - break; - case 7: - name = "Hiiraan"; - break; - case 8: - name = "Jubbada Dhexe"; - break; - case 9: - name = "Jubbada Hoose"; - break; - case 10: - name = "Mudug"; - break; - case 11: - name = "Nugaal"; - break; - case 12: - name = "Sanaag"; - break; - case 13: - name = "Shabeellaha Dhexe"; - break; - case 14: - name = "Shabeellaha Hoose"; - break; - case 16: - name = "Woqooyi Galbeed"; - break; - case 18: - name = "Nugaal"; - break; - case 19: - name = "Togdheer"; - break; - case 20: - name = "Woqooyi Galbeed"; - break; - case 21: - name = "Awdal"; - break; - case 22: - name = "Sool"; - break; - } - } - if (strcmp(country_code,"SR") == 0) { - switch (region_code2) { - case 10: - name = "Brokopondo"; - break; - case 11: - name = "Commewijne"; - break; - case 12: - name = "Coronie"; - break; - case 13: - name = "Marowijne"; - break; - case 14: - name = "Nickerie"; - break; - case 15: - name = "Para"; - break; - case 16: - name = "Paramaribo"; - break; - case 17: - name = "Saramacca"; - break; - case 18: - name = "Sipaliwini"; - break; - case 19: - name = "Wanica"; - break; - } - } - if (strcmp(country_code,"ST") == 0) { - switch (region_code2) { - case 1: - name = "Principe"; - break; - case 2: - name = "Sao Tome"; - break; - } - } - if (strcmp(country_code,"SV") == 0) { - switch (region_code2) { - case 1: - name = "Ahuachapan"; - break; - case 2: - name = "Cabanas"; - break; - case 3: - name = "Chalatenango"; - break; - case 4: - name = "Cuscatlan"; - break; - case 5: - name = "La Libertad"; - break; - case 6: - name = "La Paz"; - break; - case 7: - name = "La Union"; - break; - case 8: - name = "Morazan"; - break; - case 9: - name = "San Miguel"; - break; - case 10: - name = "San Salvador"; - break; - case 11: - name = "Santa Ana"; - break; - case 12: - name = "San Vicente"; - break; - case 13: - name = "Sonsonate"; - break; - case 14: - name = "Usulutan"; - break; - } - } - if (strcmp(country_code,"SY") == 0) { - switch (region_code2) { - case 1: - name = "Al Hasakah"; - break; - case 2: - name = "Al Ladhiqiyah"; - break; - case 3: - name = "Al Qunaytirah"; - break; - case 4: - name = "Ar Raqqah"; - break; - case 5: - name = "As Suwayda'"; - break; - case 6: - name = "Dar"; - break; - case 7: - name = "Dayr az Zawr"; - break; - case 8: - name = "Rif Dimashq"; - break; - case 9: - name = "Halab"; - break; - case 10: - name = "Hamah"; - break; - case 11: - name = "Hims"; - break; - case 12: - name = "Idlib"; - break; - case 13: - name = "Dimashq"; - break; - case 14: - name = "Tartus"; - break; - } - } - if (strcmp(country_code,"SZ") == 0) { - switch (region_code2) { - case 1: - name = "Hhohho"; - break; - case 2: - name = "Lubombo"; - break; - case 3: - name = "Manzini"; - break; - case 4: - name = "Shiselweni"; - break; - case 5: - name = "Praslin"; - break; - } - } - if (strcmp(country_code,"TD") == 0) { - switch (region_code2) { - case 1: - name = "Batha"; - break; - case 2: - name = "Biltine"; - break; - case 3: - name = "Borkou-Ennedi-Tibesti"; - break; - case 4: - name = "Chari-Baguirmi"; - break; - case 5: - name = "Guera"; - break; - case 6: - name = "Kanem"; - break; - case 7: - name = "Lac"; - break; - case 8: - name = "Logone Occidental"; - break; - case 9: - name = "Logone Oriental"; - break; - case 10: - name = "Mayo-Kebbi"; - break; - case 11: - name = "Moyen-Chari"; - break; - case 12: - name = "Ouaddai"; - break; - case 13: - name = "Salamat"; - break; - case 14: - name = "Tandjile"; - break; - } - } - if (strcmp(country_code,"TG") == 0) { - switch (region_code2) { - case 22: - name = "Centrale"; - break; - case 23: - name = "Kara"; - break; - case 24: - name = "Maritime"; - break; - case 25: - name = "Plateaux"; - break; - case 26: - name = "Savanes"; - break; - } - } - if (strcmp(country_code,"TH") == 0) { - switch (region_code2) { - case 1: - name = "Mae Hong Son"; - break; - case 2: - name = "Chiang Mai"; - break; - case 3: - name = "Chiang Rai"; - break; - case 4: - name = "Nan"; - break; - case 5: - name = "Lamphun"; - break; - case 6: - name = "Lampang"; - break; - case 7: - name = "Phrae"; - break; - case 8: - name = "Tak"; - break; - case 9: - name = "Sukhothai"; - break; - case 10: - name = "Uttaradit"; - break; - case 11: - name = "Kamphaeng Phet"; - break; - case 12: - name = "Phitsanulok"; - break; - case 13: - name = "Phichit"; - break; - case 14: - name = "Phetchabun"; - break; - case 15: - name = "Uthai Thani"; - break; - case 16: - name = "Nakhon Sawan"; - break; - case 17: - name = "Nong Khai"; - break; - case 18: - name = "Loei"; - break; - case 20: - name = "Sakon Nakhon"; - break; - case 21: - name = "Nakhon Phanom"; - break; - case 22: - name = "Khon Kaen"; - break; - case 23: - name = "Kalasin"; - break; - case 24: - name = "Maha Sarakham"; - break; - case 25: - name = "Roi Et"; - break; - case 26: - name = "Chaiyaphum"; - break; - case 27: - name = "Nakhon Ratchasima"; - break; - case 28: - name = "Buriram"; - break; - case 29: - name = "Surin"; - break; - case 30: - name = "Sisaket"; - break; - case 31: - name = "Narathiwat"; - break; - case 32: - name = "Chai Nat"; - break; - case 33: - name = "Sing Buri"; - break; - case 34: - name = "Lop Buri"; - break; - case 35: - name = "Ang Thong"; - break; - case 36: - name = "Phra Nakhon Si Ayutthaya"; - break; - case 37: - name = "Saraburi"; - break; - case 38: - name = "Nonthaburi"; - break; - case 39: - name = "Pathum Thani"; - break; - case 40: - name = "Krung Thep"; - break; - case 41: - name = "Phayao"; - break; - case 42: - name = "Samut Prakan"; - break; - case 43: - name = "Nakhon Nayok"; - break; - case 44: - name = "Chachoengsao"; - break; - case 45: - name = "Prachin Buri"; - break; - case 46: - name = "Chon Buri"; - break; - case 47: - name = "Rayong"; - break; - case 48: - name = "Chanthaburi"; - break; - case 49: - name = "Trat"; - break; - case 50: - name = "Kanchanaburi"; - break; - case 51: - name = "Suphan Buri"; - break; - case 52: - name = "Ratchaburi"; - break; - case 53: - name = "Nakhon Pathom"; - break; - case 54: - name = "Samut Songkhram"; - break; - case 55: - name = "Samut Sakhon"; - break; - case 56: - name = "Phetchaburi"; - break; - case 57: - name = "Prachuap Khiri Khan"; - break; - case 58: - name = "Chumphon"; - break; - case 59: - name = "Ranong"; - break; - case 60: - name = "Surat Thani"; - break; - case 61: - name = "Phangnga"; - break; - case 62: - name = "Phuket"; - break; - case 63: - name = "Krabi"; - break; - case 64: - name = "Nakhon Si Thammarat"; - break; - case 65: - name = "Trang"; - break; - case 66: - name = "Phatthalung"; - break; - case 67: - name = "Satun"; - break; - case 68: - name = "Songkhla"; - break; - case 69: - name = "Pattani"; - break; - case 70: - name = "Yala"; - break; - case 71: - name = "Ubon Ratchathani"; - break; - case 72: - name = "Yasothon"; - break; - case 73: - name = "Nakhon Phanom"; - break; - case 75: - name = "Ubon Ratchathani"; - break; - case 76: - name = "Udon Thani"; - break; - case 77: - name = "Amnat Charoen"; - break; - case 78: - name = "Mukdahan"; - break; - case 79: - name = "Nong Bua Lamphu"; - break; - case 80: - name = "Sa Kaeo"; - break; - } - } - if (strcmp(country_code,"TJ") == 0) { - switch (region_code2) { - case 1: - name = "Kuhistoni Badakhshon"; - break; - case 2: - name = "Khatlon"; - break; - case 3: - name = "Sughd"; - break; - } - } - if (strcmp(country_code,"TM") == 0) { - switch (region_code2) { - case 1: - name = "Ahal"; - break; - case 2: - name = "Balkan"; - break; - case 3: - name = "Dashoguz"; - break; - case 4: - name = "Lebap"; - break; - case 5: - name = "Mary"; - break; - } - } - if (strcmp(country_code,"TN") == 0) { - switch (region_code2) { - case 2: - name = "Kasserine"; - break; - case 3: - name = "Kairouan"; - break; - case 6: - name = "Jendouba"; - break; - case 10: - name = "Qafsah"; - break; - case 14: - name = "El Kef"; - break; - case 15: - name = "Al Mahdia"; - break; - case 16: - name = "Al Munastir"; - break; - case 17: - name = "Bajah"; - break; - case 18: - name = "Bizerte"; - break; - case 19: - name = "Nabeul"; - break; - case 22: - name = "Siliana"; - break; - case 23: - name = "Sousse"; - break; - case 27: - name = "Ben Arous"; - break; - case 28: - name = "Madanin"; - break; - case 29: - name = "Gabes"; - break; - case 31: - name = "Kebili"; - break; - case 32: - name = "Sfax"; - break; - case 33: - name = "Sidi Bou Zid"; - break; - case 34: - name = "Tataouine"; - break; - case 35: - name = "Tozeur"; - break; - case 36: - name = "Tunis"; - break; - case 37: - name = "Zaghouan"; - break; - case 38: - name = "Aiana"; - break; - case 39: - name = "Manouba"; - break; - } - } - if (strcmp(country_code,"TO") == 0) { - switch (region_code2) { - case 1: - name = "Ha"; - break; - case 2: - name = "Tongatapu"; - break; - case 3: - name = "Vava"; - break; - } - } - if (strcmp(country_code,"TR") == 0) { - switch (region_code2) { - case 2: - name = "Adiyaman"; - break; - case 3: - name = "Afyonkarahisar"; - break; - case 4: - name = "Agri"; - break; - case 5: - name = "Amasya"; - break; - case 7: - name = "Antalya"; - break; - case 8: - name = "Artvin"; - break; - case 9: - name = "Aydin"; - break; - case 10: - name = "Balikesir"; - break; - case 11: - name = "Bilecik"; - break; - case 12: - name = "Bingol"; - break; - case 13: - name = "Bitlis"; - break; - case 14: - name = "Bolu"; - break; - case 15: - name = "Burdur"; - break; - case 16: - name = "Bursa"; - break; - case 17: - name = "Canakkale"; - break; - case 19: - name = "Corum"; - break; - case 20: - name = "Denizli"; - break; - case 21: - name = "Diyarbakir"; - break; - case 22: - name = "Edirne"; - break; - case 23: - name = "Elazig"; - break; - case 24: - name = "Erzincan"; - break; - case 25: - name = "Erzurum"; - break; - case 26: - name = "Eskisehir"; - break; - case 28: - name = "Giresun"; - break; - case 31: - name = "Hatay"; - break; - case 32: - name = "Mersin"; - break; - case 33: - name = "Isparta"; - break; - case 34: - name = "Istanbul"; - break; - case 35: - name = "Izmir"; - break; - case 37: - name = "Kastamonu"; - break; - case 38: - name = "Kayseri"; - break; - case 39: - name = "Kirklareli"; - break; - case 40: - name = "Kirsehir"; - break; - case 41: - name = "Kocaeli"; - break; - case 43: - name = "Kutahya"; - break; - case 44: - name = "Malatya"; - break; - case 45: - name = "Manisa"; - break; - case 46: - name = "Kahramanmaras"; - break; - case 48: - name = "Mugla"; - break; - case 49: - name = "Mus"; - break; - case 50: - name = "Nevsehir"; - break; - case 52: - name = "Ordu"; - break; - case 53: - name = "Rize"; - break; - case 54: - name = "Sakarya"; - break; - case 55: - name = "Samsun"; - break; - case 57: - name = "Sinop"; - break; - case 58: - name = "Sivas"; - break; - case 59: - name = "Tekirdag"; - break; - case 60: - name = "Tokat"; - break; - case 61: - name = "Trabzon"; - break; - case 62: - name = "Tunceli"; - break; - case 63: - name = "Sanliurfa"; - break; - case 64: - name = "Usak"; - break; - case 65: - name = "Van"; - break; - case 66: - name = "Yozgat"; - break; - case 68: - name = "Ankara"; - break; - case 69: - name = "Gumushane"; - break; - case 70: - name = "Hakkari"; - break; - case 71: - name = "Konya"; - break; - case 72: - name = "Mardin"; - break; - case 73: - name = "Nigde"; - break; - case 74: - name = "Siirt"; - break; - case 75: - name = "Aksaray"; - break; - case 76: - name = "Batman"; - break; - case 77: - name = "Bayburt"; - break; - case 78: - name = "Karaman"; - break; - case 79: - name = "Kirikkale"; - break; - case 80: - name = "Sirnak"; - break; - case 81: - name = "Adana"; - break; - case 82: - name = "Cankiri"; - break; - case 83: - name = "Gaziantep"; - break; - case 84: - name = "Kars"; - break; - case 85: - name = "Zonguldak"; - break; - case 86: - name = "Ardahan"; - break; - case 87: - name = "Bartin"; - break; - case 88: - name = "Igdir"; - break; - case 89: - name = "Karabuk"; - break; - case 90: - name = "Kilis"; - break; - case 91: - name = "Osmaniye"; - break; - case 92: - name = "Yalova"; - break; - case 93: - name = "Duzce"; - break; - } - } - if (strcmp(country_code,"TT") == 0) { - switch (region_code2) { - case 1: - name = "Arima"; - break; - case 2: - name = "Caroni"; - break; - case 3: - name = "Mayaro"; - break; - case 4: - name = "Nariva"; - break; - case 5: - name = "Port-of-Spain"; - break; - case 6: - name = "Saint Andrew"; - break; - case 7: - name = "Saint David"; - break; - case 8: - name = "Saint George"; - break; - case 9: - name = "Saint Patrick"; - break; - case 10: - name = "San Fernando"; - break; - case 11: - name = "Tobago"; - break; - case 12: - name = "Victoria"; - break; - } - } - if (strcmp(country_code,"TW") == 0) { - switch (region_code2) { - case 1: - name = "Fu-chien"; - break; - case 2: - name = "Kao-hsiung"; - break; - case 3: - name = "T'ai-pei"; - break; - case 4: - name = "T'ai-wan"; - break; - } - } - if (strcmp(country_code,"TZ") == 0) { - switch (region_code2) { - case 2: - name = "Pwani"; - break; - case 3: - name = "Dodoma"; - break; - case 4: - name = "Iringa"; - break; - case 5: - name = "Kigoma"; - break; - case 6: - name = "Kilimanjaro"; - break; - case 7: - name = "Lindi"; - break; - case 8: - name = "Mara"; - break; - case 9: - name = "Mbeya"; - break; - case 10: - name = "Morogoro"; - break; - case 11: - name = "Mtwara"; - break; - case 12: - name = "Mwanza"; - break; - case 13: - name = "Pemba North"; - break; - case 14: - name = "Ruvuma"; - break; - case 15: - name = "Shinyanga"; - break; - case 16: - name = "Singida"; - break; - case 17: - name = "Tabora"; - break; - case 18: - name = "Tanga"; - break; - case 19: - name = "Kagera"; - break; - case 20: - name = "Pemba South"; - break; - case 21: - name = "Zanzibar Central"; - break; - case 22: - name = "Zanzibar North"; - break; - case 23: - name = "Dar es Salaam"; - break; - case 24: - name = "Rukwa"; - break; - case 25: - name = "Zanzibar Urban"; - break; - case 26: - name = "Arusha"; - break; - case 27: - name = "Manyara"; - break; - } - } - if (strcmp(country_code,"UA") == 0) { - switch (region_code2) { - case 1: - name = "Cherkas'ka Oblast'"; - break; - case 2: - name = "Chernihivs'ka Oblast'"; - break; - case 3: - name = "Chernivets'ka Oblast'"; - break; - case 4: - name = "Dnipropetrovs'ka Oblast'"; - break; - case 5: - name = "Donets'ka Oblast'"; - break; - case 6: - name = "Ivano-Frankivs'ka Oblast'"; - break; - case 7: - name = "Kharkivs'ka Oblast'"; - break; - case 8: - name = "Khersons'ka Oblast'"; - break; - case 9: - name = "Khmel'nyts'ka Oblast'"; - break; - case 10: - name = "Kirovohrads'ka Oblast'"; - break; - case 11: - name = "Krym"; - break; - case 12: - name = "Kyyiv"; - break; - case 13: - name = "Kyyivs'ka Oblast'"; - break; - case 14: - name = "Luhans'ka Oblast'"; - break; - case 15: - name = "L'vivs'ka Oblast'"; - break; - case 16: - name = "Mykolayivs'ka Oblast'"; - break; - case 17: - name = "Odes'ka Oblast'"; - break; - case 18: - name = "Poltavs'ka Oblast'"; - break; - case 19: - name = "Rivnens'ka Oblast'"; - break; - case 20: - name = "Sevastopol'"; - break; - case 21: - name = "Sums'ka Oblast'"; - break; - case 22: - name = "Ternopil's'ka Oblast'"; - break; - case 23: - name = "Vinnyts'ka Oblast'"; - break; - case 24: - name = "Volyns'ka Oblast'"; - break; - case 25: - name = "Zakarpats'ka Oblast'"; - break; - case 26: - name = "Zaporiz'ka Oblast'"; - break; - case 27: - name = "Zhytomyrs'ka Oblast'"; - break; - } - } - if (strcmp(country_code,"UG") == 0) { - switch (region_code2) { - case 26: - name = "Apac"; - break; - case 28: - name = "Bundibugyo"; - break; - case 29: - name = "Bushenyi"; - break; - case 30: - name = "Gulu"; - break; - case 31: - name = "Hoima"; - break; - case 33: - name = "Jinja"; - break; - case 36: - name = "Kalangala"; - break; - case 37: - name = "Kampala"; - break; - case 38: - name = "Kamuli"; - break; - case 39: - name = "Kapchorwa"; - break; - case 40: - name = "Kasese"; - break; - case 41: - name = "Kibale"; - break; - case 42: - name = "Kiboga"; - break; - case 43: - name = "Kisoro"; - break; - case 45: - name = "Kotido"; - break; - case 46: - name = "Kumi"; - break; - case 47: - name = "Lira"; - break; - case 50: - name = "Masindi"; - break; - case 52: - name = "Mbarara"; - break; - case 56: - name = "Mubende"; - break; - case 58: - name = "Nebbi"; - break; - case 59: - name = "Ntungamo"; - break; - case 60: - name = "Pallisa"; - break; - case 61: - name = "Rakai"; - break; - case 65: - name = "Adjumani"; - break; - case 66: - name = "Bugiri"; - break; - case 67: - name = "Busia"; - break; - case 69: - name = "Katakwi"; - break; - case 70: - name = "Luwero"; - break; - case 71: - name = "Masaka"; - break; - case 72: - name = "Moyo"; - break; - case 73: - name = "Nakasongola"; - break; - case 74: - name = "Sembabule"; - break; - case 76: - name = "Tororo"; - break; - case 77: - name = "Arua"; - break; - case 78: - name = "Iganga"; - break; - case 79: - name = "Kabarole"; - break; - case 80: - name = "Kaberamaido"; - break; - case 81: - name = "Kamwenge"; - break; - case 82: - name = "Kanungu"; - break; - case 83: - name = "Kayunga"; - break; - case 84: - name = "Kitgum"; - break; - case 85: - name = "Kyenjojo"; - break; - case 86: - name = "Mayuge"; - break; - case 87: - name = "Mbale"; - break; - case 88: - name = "Moroto"; - break; - case 89: - name = "Mpigi"; - break; - case 90: - name = "Mukono"; - break; - case 91: - name = "Nakapiripirit"; - break; - case 92: - name = "Pader"; - break; - case 93: - name = "Rukungiri"; - break; - case 94: - name = "Sironko"; - break; - case 95: - name = "Soroti"; - break; - case 96: - name = "Wakiso"; - break; - case 97: - name = "Yumbe"; - break; - } - } - if (strcmp(country_code,"UY") == 0) { - switch (region_code2) { - case 1: - name = "Artigas"; - break; - case 2: - name = "Canelones"; - break; - case 3: - name = "Cerro Largo"; - break; - case 4: - name = "Colonia"; - break; - case 5: - name = "Durazno"; - break; - case 6: - name = "Flores"; - break; - case 7: - name = "Florida"; - break; - case 8: - name = "Lavalleja"; - break; - case 9: - name = "Maldonado"; - break; - case 10: - name = "Montevideo"; - break; - case 11: - name = "Paysandu"; - break; - case 12: - name = "Rio Negro"; - break; - case 13: - name = "Rivera"; - break; - case 14: - name = "Rocha"; - break; - case 15: - name = "Salto"; - break; - case 16: - name = "San Jose"; - break; - case 17: - name = "Soriano"; - break; - case 18: - name = "Tacuarembo"; - break; - case 19: - name = "Treinta y Tres"; - break; - } - } - if (strcmp(country_code,"UZ") == 0) { - switch (region_code2) { - case 1: - name = "Andijon"; - break; - case 2: - name = "Bukhoro"; - break; - case 3: - name = "Farghona"; - break; - case 4: - name = "Jizzakh"; - break; - case 5: - name = "Khorazm"; - break; - case 6: - name = "Namangan"; - break; - case 7: - name = "Nawoiy"; - break; - case 8: - name = "Qashqadaryo"; - break; - case 9: - name = "Qoraqalpoghiston"; - break; - case 10: - name = "Samarqand"; - break; - case 11: - name = "Sirdaryo"; - break; - case 12: - name = "Surkhondaryo"; - break; - case 13: - name = "Toshkent"; - break; - case 14: - name = "Toshkent"; - break; - } - } - if (strcmp(country_code,"VC") == 0) { - switch (region_code2) { - case 1: - name = "Charlotte"; - break; - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint David"; - break; - case 4: - name = "Saint George"; - break; - case 5: - name = "Saint Patrick"; - break; - case 6: - name = "Grenadines"; - break; - } - } - if (strcmp(country_code,"VE") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Anzoategui"; - break; - case 3: - name = "Apure"; - break; - case 4: - name = "Aragua"; - break; - case 5: - name = "Barinas"; - break; - case 6: - name = "Bolivar"; - break; - case 7: - name = "Carabobo"; - break; - case 8: - name = "Cojedes"; - break; - case 9: - name = "Delta Amacuro"; - break; - case 11: - name = "Falcon"; - break; - case 12: - name = "Guarico"; - break; - case 13: - name = "Lara"; - break; - case 14: - name = "Merida"; - break; - case 15: - name = "Miranda"; - break; - case 16: - name = "Monagas"; - break; - case 17: - name = "Nueva Esparta"; - break; - case 18: - name = "Portuguesa"; - break; - case 19: - name = "Sucre"; - break; - case 20: - name = "Tachira"; - break; - case 21: - name = "Trujillo"; - break; - case 22: - name = "Yaracuy"; - break; - case 23: - name = "Zulia"; - break; - case 24: - name = "Dependencias Federales"; - break; - case 25: - name = "Distrito Federal"; - break; - case 26: - name = "Vargas"; - break; - } - } - if (strcmp(country_code,"VN") == 0) { - switch (region_code2) { - case 1: - name = "An Giang"; - break; - case 3: - name = "Ben Tre"; - break; - case 5: - name = "Cao Bang"; - break; - case 9: - name = "Dong Thap"; - break; - case 13: - name = "Hai Phong"; - break; - case 20: - name = "Ho Chi Minh"; - break; - case 21: - name = "Kien Giang"; - break; - case 23: - name = "Lam Dong"; - break; - case 24: - name = "Long An"; - break; - case 30: - name = "Quang Ninh"; - break; - case 32: - name = "Son La"; - break; - case 33: - name = "Tay Ninh"; - break; - case 34: - name = "Thanh Hoa"; - break; - case 35: - name = "Thai Binh"; - break; - case 37: - name = "Tien Giang"; - break; - case 39: - name = "Lang Son"; - break; - case 43: - name = "An Giang"; - break; - case 44: - name = "Dac Lac"; - break; - case 45: - name = "Dong Nai"; - break; - case 46: - name = "Dong Thap"; - break; - case 47: - name = "Kien Giang"; - break; - case 49: - name = "Song Be"; - break; - case 50: - name = "Vinh Phu"; - break; - case 51: - name = "Ha Noi"; - break; - case 52: - name = "Ho Chi Minh"; - break; - case 53: - name = "Ba Ria-Vung Tau"; - break; - case 54: - name = "Binh Dinh"; - break; - case 55: - name = "Binh Thuan"; - break; - case 58: - name = "Ha Giang"; - break; - case 59: - name = "Ha Tay"; - break; - case 60: - name = "Ha Tinh"; - break; - case 61: - name = "Hoa Binh"; - break; - case 62: - name = "Khanh Hoa"; - break; - case 63: - name = "Kon Tum"; - break; - case 64: - name = "Quang Tri"; - break; - case 65: - name = "Nam Ha"; - break; - case 66: - name = "Nghe An"; - break; - case 67: - name = "Ninh Binh"; - break; - case 68: - name = "Ninh Thuan"; - break; - case 69: - name = "Phu Yen"; - break; - case 70: - name = "Quang Binh"; - break; - case 71: - name = "Quang Ngai"; - break; - case 72: - name = "Quang Tri"; - break; - case 73: - name = "Soc Trang"; - break; - case 74: - name = "Thua Thien"; - break; - case 75: - name = "Tra Vinh"; - break; - case 76: - name = "Tuyen Quang"; - break; - case 77: - name = "Vinh Long"; - break; - case 78: - name = "Da Nang"; - break; - case 79: - name = "Hai Duong"; - break; - case 80: - name = "Ha Nam"; - break; - case 81: - name = "Hung Yen"; - break; - case 82: - name = "Nam Dinh"; - break; - case 83: - name = "Phu Tho"; - break; - case 84: - name = "Quang Nam"; - break; - case 85: - name = "Thai Nguyen"; - break; - case 86: - name = "Vinh Puc Province"; - break; - case 87: - name = "Can Tho"; - break; - case 88: - name = "Dak Lak"; - break; - case 89: - name = "Lai Chau"; - break; - case 90: - name = "Lao Cai"; - break; - case 91: - name = "Dak Nong"; - break; - case 92: - name = "Dien Bien"; - break; - case 93: - name = "Hau Giang"; - break; - } - } - if (strcmp(country_code,"VU") == 0) { - switch (region_code2) { - case 5: - name = "Ambrym"; - break; - case 6: - name = "Aoba"; - break; - case 7: - name = "Torba"; - break; - case 8: - name = "Efate"; - break; - case 9: - name = "Epi"; - break; - case 10: - name = "Malakula"; - break; - case 11: - name = "Paama"; - break; - case 12: - name = "Pentecote"; - break; - case 13: - name = "Sanma"; - break; - case 14: - name = "Shepherd"; - break; - case 15: - name = "Tafea"; - break; - case 16: - name = "Malampa"; - break; - case 17: - name = "Penama"; - break; - case 18: - name = "Shefa"; - break; - } - } - if (strcmp(country_code,"WS") == 0) { - switch (region_code2) { - case 2: - name = "Aiga-i-le-Tai"; - break; - case 3: - name = "Atua"; - break; - case 4: - name = "Fa"; - break; - case 5: - name = "Gaga"; - break; - case 6: - name = "Va"; - break; - case 7: - name = "Gagaifomauga"; - break; - case 8: - name = "Palauli"; - break; - case 9: - name = "Satupa"; - break; - case 10: - name = "Tuamasaga"; - break; - case 11: - name = "Vaisigano"; - break; - } - } - if (strcmp(country_code,"YE") == 0) { - switch (region_code2) { - case 1: - name = "Abyan"; - break; - case 2: - name = "Adan"; - break; - case 3: - name = "Al Mahrah"; - break; - case 4: - name = "Hadramawt"; - break; - case 5: - name = "Shabwah"; - break; - case 6: - name = "Al Ghaydah"; - break; - case 8: - name = "Al Hudaydah"; - break; - case 10: - name = "Al Mahwit"; - break; - case 11: - name = "Dhamar"; - break; - case 14: - name = "Ma'rib"; - break; - case 15: - name = "Sa"; - break; - case 16: - name = "San"; - break; - case 20: - name = "Al Bayda'"; - break; - case 21: - name = "Al Jawf"; - break; - case 22: - name = "Hajjah"; - break; - case 23: - name = "Ibb"; - break; - case 24: - name = "Lahij"; - break; - case 25: - name = "Ta"; - break; - } - } - if (strcmp(country_code,"ZA") == 0) { - switch (region_code2) { - case 1: - name = "North-Western Province"; - break; - case 2: - name = "KwaZulu-Natal"; - break; - case 3: - name = "Free State"; - break; - case 5: - name = "Eastern Cape"; - break; - case 6: - name = "Gauteng"; - break; - case 7: - name = "Mpumalanga"; - break; - case 8: - name = "Northern Cape"; - break; - case 9: - name = "Limpopo"; - break; - case 10: - name = "North-West"; - break; - case 11: - name = "Western Cape"; - break; - } - } - if (strcmp(country_code,"ZM") == 0) { - switch (region_code2) { - case 1: - name = "Western"; - break; - case 2: - name = "Central"; - break; - case 3: - name = "Eastern"; - break; - case 4: - name = "Luapula"; - break; - case 5: - name = "Northern"; - break; - case 6: - name = "North-Western"; - break; - case 7: - name = "Southern"; - break; - case 8: - name = "Copperbelt"; - break; - case 9: - name = "Lusaka"; - break; - } - } - if (strcmp(country_code,"ZW") == 0) { - switch (region_code2) { - case 1: - name = "Manicaland"; - break; - case 2: - name = "Midlands"; - break; - case 3: - name = "Mashonaland Central"; - break; - case 4: - name = "Mashonaland East"; - break; - case 5: - name = "Mashonaland West"; - break; - case 6: - name = "Matabeleland North"; - break; - case 7: - name = "Matabeleland South"; - break; - case 8: - name = "Masvingo"; - break; - case 9: - name = "Bulawayo"; - break; - case 10: - name = "Harare"; - break; - } - } - return name; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c deleted file mode 100644 index 9db5fb8a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c +++ /dev/null @@ -1,2077 +0,0 @@ -#include -const char* GeoIP_time_zone_by_country_and_region(const char * country,const char * region) { - const char* timezone = NULL; - if (country == NULL) { - return NULL; - } - if (region == NULL) { - region = ""; - } - if ( strcmp (country, "AD") == 0 ) { - timezone = "Europe/Andorra"; - } - else if ( strcmp (country, "AE") == 0 ) { - timezone = "Asia/Dubai"; - } - else if ( strcmp (country, "AF") == 0 ) { - timezone = "Asia/Kabul"; - } - else if ( strcmp (country, "AG") == 0 ) { - timezone = "America/Antigua"; - } - else if ( strcmp (country, "AI") == 0 ) { - timezone = "America/Anguilla"; - } - else if ( strcmp (country, "AL") == 0 ) { - timezone = "Europe/Tirane"; - } - else if ( strcmp (country, "AM") == 0 ) { - timezone = "Asia/Yerevan"; - } - else if ( strcmp (country, "AO") == 0 ) { - timezone = "Africa/Luanda"; - } - else if ( strcmp (country, "AR") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Argentina/Catamarca"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Argentina/Rio_Gallegos"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Argentina/Cordoba"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Argentina/Jujuy"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Argentina/La_Rioja"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Argentina/Mendoza"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Argentina/Salta"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Argentina/San_Juan"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Argentina/Rio_Gallegos"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Argentina/Catamarca"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Argentina/Ushuaia"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - } - else if ( strcmp (country, "AS") == 0 ) { - timezone = "US/Samoa"; - } - else if ( strcmp (country, "AT") == 0 ) { - timezone = "Europe/Vienna"; - } - else if ( strcmp (country, "AU") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Australia/Canberra"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Australia/NSW"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Australia/North"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Australia/Queensland"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Australia/South"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Australia/Tasmania"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Australia/Victoria"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Australia/West"; - } - } - else if ( strcmp (country, "AW") == 0 ) { - timezone = "America/Aruba"; - } - else if ( strcmp (country, "AX") == 0 ) { - timezone = "Europe/Mariehamn"; - } - else if ( strcmp (country, "AZ") == 0 ) { - timezone = "Asia/Baku"; - } - else if ( strcmp (country, "BA") == 0 ) { - timezone = "Europe/Sarajevo"; - } - else if ( strcmp (country, "BB") == 0 ) { - timezone = "America/Barbados"; - } - else if ( strcmp (country, "BD") == 0 ) { - timezone = "Asia/Dhaka"; - } - else if ( strcmp (country, "BE") == 0 ) { - timezone = "Europe/Brussels"; - } - else if ( strcmp (country, "BF") == 0 ) { - timezone = "Africa/Ouagadougou"; - } - else if ( strcmp (country, "BG") == 0 ) { - timezone = "Europe/Sofia"; - } - else if ( strcmp (country, "BH") == 0 ) { - timezone = "Asia/Bahrain"; - } - else if ( strcmp (country, "BI") == 0 ) { - timezone = "Africa/Bujumbura"; - } - else if ( strcmp (country, "BJ") == 0 ) { - timezone = "Africa/Porto-Novo"; - } - else if ( strcmp (country, "BL") == 0 ) { - timezone = "America/St_Barthelemy"; - } - else if ( strcmp (country, "BM") == 0 ) { - timezone = "Atlantic/Bermuda"; - } - else if ( strcmp (country, "BN") == 0 ) { - timezone = "Asia/Brunei"; - } - else if ( strcmp (country, "BO") == 0 ) { - timezone = "America/La_Paz"; - } - else if ( strcmp (country, "BQ") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "BR") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Rio_Branco"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Maceio"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Manaus"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Bahia"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Fortaleza"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Campo_Grande"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Belem"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Cuiaba"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Belem"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Fortaleza"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Porto_Velho"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "America/Boa_Vista"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "America/Maceio"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "America/Araguaina"; - } - } - else if ( strcmp (country, "BS") == 0 ) { - timezone = "America/Nassau"; - } - else if ( strcmp (country, "BT") == 0 ) { - timezone = "Asia/Thimphu"; - } - else if ( strcmp (country, "BW") == 0 ) { - timezone = "Africa/Gaborone"; - } - else if ( strcmp (country, "BY") == 0 ) { - timezone = "Europe/Minsk"; - } - else if ( strcmp (country, "BZ") == 0 ) { - timezone = "America/Belize"; - } - else if ( strcmp (country, "CA") == 0 ) { - if ( strcmp (region, "AB") == 0 ) { - timezone = "America/Edmonton"; - } - else if ( strcmp (region, "BC") == 0 ) { - timezone = "America/Vancouver"; - } - else if ( strcmp (region, "MB") == 0 ) { - timezone = "America/Winnipeg"; - } - else if ( strcmp (region, "NB") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "NL") == 0 ) { - timezone = "America/St_Johns"; - } - else if ( strcmp (region, "NS") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "NT") == 0 ) { - timezone = "America/Yellowknife"; - } - else if ( strcmp (region, "NU") == 0 ) { - timezone = "America/Rankin_Inlet"; - } - else if ( strcmp (region, "ON") == 0 ) { - timezone = "America/Rainy_River"; - } - else if ( strcmp (region, "PE") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "QC") == 0 ) { - timezone = "America/Montreal"; - } - else if ( strcmp (region, "SK") == 0 ) { - timezone = "America/Regina"; - } - else if ( strcmp (region, "YT") == 0 ) { - timezone = "America/Whitehorse"; - } - } - else if ( strcmp (country, "CC") == 0 ) { - timezone = "Indian/Cocos"; - } - else if ( strcmp (country, "CD") == 0 ) { - if ( strcmp (region, "02") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - } - else if ( strcmp (country, "CF") == 0 ) { - timezone = "Africa/Bangui"; - } - else if ( strcmp (country, "CG") == 0 ) { - timezone = "Africa/Brazzaville"; - } - else if ( strcmp (country, "CH") == 0 ) { - timezone = "Europe/Zurich"; - } - else if ( strcmp (country, "CI") == 0 ) { - timezone = "Africa/Abidjan"; - } - else if ( strcmp (country, "CK") == 0 ) { - timezone = "Pacific/Rarotonga"; - } - else if ( strcmp (country, "CL") == 0 ) { - timezone = "Chile/Continental"; - } - else if ( strcmp (country, "CM") == 0 ) { - timezone = "Africa/Lagos"; - } - else if ( strcmp (country, "CN") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Urumqi"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Chongqing"; - } - } - else if ( strcmp (country, "CO") == 0 ) { - timezone = "America/Bogota"; - } - else if ( strcmp (country, "CR") == 0 ) { - timezone = "America/Costa_Rica"; - } - else if ( strcmp (country, "CU") == 0 ) { - timezone = "America/Havana"; - } - else if ( strcmp (country, "CV") == 0 ) { - timezone = "Atlantic/Cape_Verde"; - } - else if ( strcmp (country, "CW") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "CX") == 0 ) { - timezone = "Indian/Christmas"; - } - else if ( strcmp (country, "CY") == 0 ) { - timezone = "Asia/Nicosia"; - } - else if ( strcmp (country, "CZ") == 0 ) { - timezone = "Europe/Prague"; - } - else if ( strcmp (country, "DE") == 0 ) { - timezone = "Europe/Berlin"; - } - else if ( strcmp (country, "DJ") == 0 ) { - timezone = "Africa/Djibouti"; - } - else if ( strcmp (country, "DK") == 0 ) { - timezone = "Europe/Copenhagen"; - } - else if ( strcmp (country, "DM") == 0 ) { - timezone = "America/Dominica"; - } - else if ( strcmp (country, "DO") == 0 ) { - timezone = "America/Santo_Domingo"; - } - else if ( strcmp (country, "DZ") == 0 ) { - timezone = "Africa/Algiers"; - } - else if ( strcmp (country, "EC") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Pacific/Galapagos"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Guayaquil"; - } - } - else if ( strcmp (country, "EE") == 0 ) { - timezone = "Europe/Tallinn"; - } - else if ( strcmp (country, "EG") == 0 ) { - timezone = "Africa/Cairo"; - } - else if ( strcmp (country, "EH") == 0 ) { - timezone = "Africa/El_Aaiun"; - } - else if ( strcmp (country, "ER") == 0 ) { - timezone = "Africa/Asmera"; - } - else if ( strcmp (country, "ES") == 0 ) { - if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "34") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "39") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "51") == 0 ) { - timezone = "Africa/Ceuta"; - } - else if ( strcmp (region, "52") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "53") == 0 ) { - timezone = "Atlantic/Canary"; - } - else if ( strcmp (region, "54") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "55") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "56") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "57") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "58") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "59") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "60") == 0 ) { - timezone = "Europe/Madrid"; - } - } - else if ( strcmp (country, "ET") == 0 ) { - timezone = "Africa/Addis_Ababa"; - } - else if ( strcmp (country, "FI") == 0 ) { - timezone = "Europe/Helsinki"; - } - else if ( strcmp (country, "FJ") == 0 ) { - timezone = "Pacific/Fiji"; - } - else if ( strcmp (country, "FK") == 0 ) { - timezone = "Atlantic/Stanley"; - } - else if ( strcmp (country, "FO") == 0 ) { - timezone = "Atlantic/Faeroe"; - } - else if ( strcmp (country, "FR") == 0 ) { - timezone = "Europe/Paris"; - } - else if ( strcmp (country, "GA") == 0 ) { - timezone = "Africa/Libreville"; - } - else if ( strcmp (country, "GB") == 0 ) { - timezone = "Europe/London"; - } - else if ( strcmp (country, "GD") == 0 ) { - timezone = "America/Grenada"; - } - else if ( strcmp (country, "GE") == 0 ) { - timezone = "Asia/Tbilisi"; - } - else if ( strcmp (country, "GF") == 0 ) { - timezone = "America/Cayenne"; - } - else if ( strcmp (country, "GG") == 0 ) { - timezone = "Europe/Guernsey"; - } - else if ( strcmp (country, "GH") == 0 ) { - timezone = "Africa/Accra"; - } - else if ( strcmp (country, "GI") == 0 ) { - timezone = "Europe/Gibraltar"; - } - else if ( strcmp (country, "GL") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Thule"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Godthab"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Godthab"; - } - } - else if ( strcmp (country, "GM") == 0 ) { - timezone = "Africa/Banjul"; - } - else if ( strcmp (country, "GN") == 0 ) { - timezone = "Africa/Conakry"; - } - else if ( strcmp (country, "GP") == 0 ) { - timezone = "America/Guadeloupe"; - } - else if ( strcmp (country, "GQ") == 0 ) { - timezone = "Africa/Malabo"; - } - else if ( strcmp (country, "GR") == 0 ) { - timezone = "Europe/Athens"; - } - else if ( strcmp (country, "GS") == 0 ) { - timezone = "Atlantic/South_Georgia"; - } - else if ( strcmp (country, "GT") == 0 ) { - timezone = "America/Guatemala"; - } - else if ( strcmp (country, "GU") == 0 ) { - timezone = "Pacific/Guam"; - } - else if ( strcmp (country, "GW") == 0 ) { - timezone = "Africa/Bissau"; - } - else if ( strcmp (country, "GY") == 0 ) { - timezone = "America/Guyana"; - } - else if ( strcmp (country, "HK") == 0 ) { - timezone = "Asia/Hong_Kong"; - } - else if ( strcmp (country, "HN") == 0 ) { - timezone = "America/Tegucigalpa"; - } - else if ( strcmp (country, "HR") == 0 ) { - timezone = "Europe/Zagreb"; - } - else if ( strcmp (country, "HT") == 0 ) { - timezone = "America/Port-au-Prince"; - } - else if ( strcmp (country, "HU") == 0 ) { - timezone = "Europe/Budapest"; - } - else if ( strcmp (country, "ID") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Jayapura"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Jakarta"; - } - } - else if ( strcmp (country, "IE") == 0 ) { - timezone = "Europe/Dublin"; - } - else if ( strcmp (country, "IL") == 0 ) { - timezone = "Asia/Jerusalem"; - } - else if ( strcmp (country, "IM") == 0 ) { - timezone = "Europe/Isle_of_Man"; - } - else if ( strcmp (country, "IN") == 0 ) { - timezone = "Asia/Calcutta"; - } - else if ( strcmp (country, "IO") == 0 ) { - timezone = "Indian/Chagos"; - } - else if ( strcmp (country, "IQ") == 0 ) { - timezone = "Asia/Baghdad"; - } - else if ( strcmp (country, "IR") == 0 ) { - timezone = "Asia/Tehran"; - } - else if ( strcmp (country, "IS") == 0 ) { - timezone = "Atlantic/Reykjavik"; - } - else if ( strcmp (country, "IT") == 0 ) { - timezone = "Europe/Rome"; - } - else if ( strcmp (country, "JE") == 0 ) { - timezone = "Europe/Jersey"; - } - else if ( strcmp (country, "JM") == 0 ) { - timezone = "America/Jamaica"; - } - else if ( strcmp (country, "JO") == 0 ) { - timezone = "Asia/Amman"; - } - else if ( strcmp (country, "JP") == 0 ) { - timezone = "Asia/Tokyo"; - } - else if ( strcmp (country, "KE") == 0 ) { - timezone = "Africa/Nairobi"; - } - else if ( strcmp (country, "KG") == 0 ) { - timezone = "Asia/Bishkek"; - } - else if ( strcmp (country, "KH") == 0 ) { - timezone = "Asia/Phnom_Penh"; - } - else if ( strcmp (country, "KI") == 0 ) { - timezone = "Pacific/Tarawa"; - } - else if ( strcmp (country, "KM") == 0 ) { - timezone = "Indian/Comoro"; - } - else if ( strcmp (country, "KN") == 0 ) { - timezone = "America/St_Kitts"; - } - else if ( strcmp (country, "KP") == 0 ) { - timezone = "Asia/Pyongyang"; - } - else if ( strcmp (country, "KR") == 0 ) { - timezone = "Asia/Seoul"; - } - else if ( strcmp (country, "KW") == 0 ) { - timezone = "Asia/Kuwait"; - } - else if ( strcmp (country, "KY") == 0 ) { - timezone = "America/Cayman"; - } - else if ( strcmp (country, "KZ") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Aqtau"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Oral"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Aqtau"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Asia/Almaty"; - } - } - else if ( strcmp (country, "LA") == 0 ) { - timezone = "Asia/Vientiane"; - } - else if ( strcmp (country, "LB") == 0 ) { - timezone = "Asia/Beirut"; - } - else if ( strcmp (country, "LC") == 0 ) { - timezone = "America/St_Lucia"; - } - else if ( strcmp (country, "LI") == 0 ) { - timezone = "Europe/Vaduz"; - } - else if ( strcmp (country, "LK") == 0 ) { - timezone = "Asia/Colombo"; - } - else if ( strcmp (country, "LR") == 0 ) { - timezone = "Africa/Monrovia"; - } - else if ( strcmp (country, "LS") == 0 ) { - timezone = "Africa/Maseru"; - } - else if ( strcmp (country, "LT") == 0 ) { - timezone = "Europe/Vilnius"; - } - else if ( strcmp (country, "LU") == 0 ) { - timezone = "Europe/Luxembourg"; - } - else if ( strcmp (country, "LV") == 0 ) { - timezone = "Europe/Riga"; - } - else if ( strcmp (country, "LY") == 0 ) { - timezone = "Africa/Tripoli"; - } - else if ( strcmp (country, "MA") == 0 ) { - timezone = "Africa/Casablanca"; - } - else if ( strcmp (country, "MC") == 0 ) { - timezone = "Europe/Monaco"; - } - else if ( strcmp (country, "MD") == 0 ) { - timezone = "Europe/Chisinau"; - } - else if ( strcmp (country, "ME") == 0 ) { - timezone = "Europe/Podgorica"; - } - else if ( strcmp (country, "MF") == 0 ) { - timezone = "America/Marigot"; - } - else if ( strcmp (country, "MG") == 0 ) { - timezone = "Indian/Antananarivo"; - } - else if ( strcmp (country, "MK") == 0 ) { - timezone = "Europe/Skopje"; - } - else if ( strcmp (country, "ML") == 0 ) { - timezone = "Africa/Bamako"; - } - else if ( strcmp (country, "MM") == 0 ) { - timezone = "Asia/Rangoon"; - } - else if ( strcmp (country, "MN") == 0 ) { - timezone = "Asia/Choibalsan"; - } - else if ( strcmp (country, "MO") == 0 ) { - timezone = "Asia/Macao"; - } - else if ( strcmp (country, "MP") == 0 ) { - timezone = "Pacific/Saipan"; - } - else if ( strcmp (country, "MQ") == 0 ) { - timezone = "America/Martinique"; - } - else if ( strcmp (country, "MR") == 0 ) { - timezone = "Africa/Nouakchott"; - } - else if ( strcmp (country, "MS") == 0 ) { - timezone = "America/Montserrat"; - } - else if ( strcmp (country, "MT") == 0 ) { - timezone = "Europe/Malta"; - } - else if ( strcmp (country, "MU") == 0 ) { - timezone = "Indian/Mauritius"; - } - else if ( strcmp (country, "MV") == 0 ) { - timezone = "Indian/Maldives"; - } - else if ( strcmp (country, "MW") == 0 ) { - timezone = "Africa/Blantyre"; - } - else if ( strcmp (country, "MX") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Tijuana"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Hermosillo"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Chihuahua"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Chihuahua"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Cancun"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "America/Hermosillo"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "America/Monterrey"; - } - } - else if ( strcmp (country, "MY") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Kuching"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Kuching"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Kuching"; - } - } - else if ( strcmp (country, "MZ") == 0 ) { - timezone = "Africa/Maputo"; - } - else if ( strcmp (country, "NA") == 0 ) { - timezone = "Africa/Windhoek"; - } - else if ( strcmp (country, "NC") == 0 ) { - timezone = "Pacific/Noumea"; - } - else if ( strcmp (country, "NE") == 0 ) { - timezone = "Africa/Niamey"; - } - else if ( strcmp (country, "NF") == 0 ) { - timezone = "Pacific/Norfolk"; - } - else if ( strcmp (country, "NG") == 0 ) { - timezone = "Africa/Lagos"; - } - else if ( strcmp (country, "NI") == 0 ) { - timezone = "America/Managua"; - } - else if ( strcmp (country, "NL") == 0 ) { - timezone = "Europe/Amsterdam"; - } - else if ( strcmp (country, "NO") == 0 ) { - timezone = "Europe/Oslo"; - } - else if ( strcmp (country, "NP") == 0 ) { - timezone = "Asia/Katmandu"; - } - else if ( strcmp (country, "NR") == 0 ) { - timezone = "Pacific/Nauru"; - } - else if ( strcmp (country, "NU") == 0 ) { - timezone = "Pacific/Niue"; - } - else if ( strcmp (country, "NZ") == 0 ) { - if ( strcmp (region, "85") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E7") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E8") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E9") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F1") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F2") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F3") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F4") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F5") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F7") == 0 ) { - timezone = "Pacific/Chatham"; - } - else if ( strcmp (region, "F8") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F9") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G1") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G2") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G3") == 0 ) { - timezone = "Pacific/Auckland"; - } - } - else if ( strcmp (country, "OM") == 0 ) { - timezone = "Asia/Muscat"; - } - else if ( strcmp (country, "PA") == 0 ) { - timezone = "America/Panama"; - } - else if ( strcmp (country, "PE") == 0 ) { - timezone = "America/Lima"; - } - else if ( strcmp (country, "PF") == 0 ) { - timezone = "Pacific/Marquesas"; - } - else if ( strcmp (country, "PG") == 0 ) { - timezone = "Pacific/Port_Moresby"; - } - else if ( strcmp (country, "PH") == 0 ) { - timezone = "Asia/Manila"; - } - else if ( strcmp (country, "PK") == 0 ) { - timezone = "Asia/Karachi"; - } - else if ( strcmp (country, "PL") == 0 ) { - timezone = "Europe/Warsaw"; - } - else if ( strcmp (country, "PM") == 0 ) { - timezone = "America/Miquelon"; - } - else if ( strcmp (country, "PN") == 0 ) { - timezone = "Pacific/Pitcairn"; - } - else if ( strcmp (country, "PR") == 0 ) { - timezone = "America/Puerto_Rico"; - } - else if ( strcmp (country, "PS") == 0 ) { - timezone = "Asia/Gaza"; - } - else if ( strcmp (country, "PT") == 0 ) { - if ( strcmp (region, "02") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Atlantic/Madeira"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Lisbon"; - } - } - else if ( strcmp (country, "PW") == 0 ) { - timezone = "Pacific/Palau"; - } - else if ( strcmp (country, "PY") == 0 ) { - timezone = "America/Asuncion"; - } - else if ( strcmp (country, "QA") == 0 ) { - timezone = "Asia/Qatar"; - } - else if ( strcmp (country, "RE") == 0 ) { - timezone = "Indian/Reunion"; - } - else if ( strcmp (country, "RO") == 0 ) { - timezone = "Europe/Bucharest"; - } - else if ( strcmp (country, "RS") == 0 ) { - timezone = "Europe/Belgrade"; - } - else if ( strcmp (country, "RU") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Novokuznetsk"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Anadyr"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Europe/Kaliningrad"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Kamchatka"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Asia/Novokuznetsk"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Asia/Omsk"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "34") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "35") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "36") == 0 ) { - timezone = "Asia/Anadyr"; - } - else if ( strcmp (region, "37") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "38") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "39") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "40") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "41") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "42") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "43") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "44") == 0 ) { - timezone = "Asia/Magadan"; - } - else if ( strcmp (region, "45") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "46") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "47") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "48") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "49") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "50") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "51") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "52") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "53") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "54") == 0 ) { - timezone = "Asia/Omsk"; - } - else if ( strcmp (region, "55") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "56") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "57") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "58") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "59") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "60") == 0 ) { - timezone = "Europe/Kaliningrad"; - } - else if ( strcmp (region, "61") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "62") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "63") == 0 ) { - timezone = "Asia/Yakutsk"; - } - else if ( strcmp (region, "64") == 0 ) { - timezone = "Asia/Sakhalin"; - } - else if ( strcmp (region, "65") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "66") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "67") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "68") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "69") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "70") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "71") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "72") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "73") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "74") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "75") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "76") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "77") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "78") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "79") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "80") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "81") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "82") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "83") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "84") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "85") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "86") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "87") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "88") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "89") == 0 ) { - timezone = "Asia/Vladivostok"; - } - } - else if ( strcmp (country, "RW") == 0 ) { - timezone = "Africa/Kigali"; - } - else if ( strcmp (country, "SA") == 0 ) { - timezone = "Asia/Riyadh"; - } - else if ( strcmp (country, "SB") == 0 ) { - timezone = "Pacific/Guadalcanal"; - } - else if ( strcmp (country, "SC") == 0 ) { - timezone = "Indian/Mahe"; - } - else if ( strcmp (country, "SD") == 0 ) { - timezone = "Africa/Khartoum"; - } - else if ( strcmp (country, "SE") == 0 ) { - timezone = "Europe/Stockholm"; - } - else if ( strcmp (country, "SG") == 0 ) { - timezone = "Asia/Singapore"; - } - else if ( strcmp (country, "SH") == 0 ) { - timezone = "Atlantic/St_Helena"; - } - else if ( strcmp (country, "SI") == 0 ) { - timezone = "Europe/Ljubljana"; - } - else if ( strcmp (country, "SJ") == 0 ) { - timezone = "Arctic/Longyearbyen"; - } - else if ( strcmp (country, "SK") == 0 ) { - timezone = "Europe/Bratislava"; - } - else if ( strcmp (country, "SL") == 0 ) { - timezone = "Africa/Freetown"; - } - else if ( strcmp (country, "SM") == 0 ) { - timezone = "Europe/San_Marino"; - } - else if ( strcmp (country, "SN") == 0 ) { - timezone = "Africa/Dakar"; - } - else if ( strcmp (country, "SO") == 0 ) { - timezone = "Africa/Mogadishu"; - } - else if ( strcmp (country, "SR") == 0 ) { - timezone = "America/Paramaribo"; - } - else if ( strcmp (country, "ST") == 0 ) { - timezone = "Africa/Sao_Tome"; - } - else if ( strcmp (country, "SV") == 0 ) { - timezone = "America/El_Salvador"; - } - else if ( strcmp (country, "SX") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "SY") == 0 ) { - timezone = "Asia/Damascus"; - } - else if ( strcmp (country, "SZ") == 0 ) { - timezone = "Africa/Mbabane"; - } - else if ( strcmp (country, "TC") == 0 ) { - timezone = "America/Grand_Turk"; - } - else if ( strcmp (country, "TD") == 0 ) { - timezone = "Africa/Ndjamena"; - } - else if ( strcmp (country, "TF") == 0 ) { - timezone = "Indian/Kerguelen"; - } - else if ( strcmp (country, "TG") == 0 ) { - timezone = "Africa/Lome"; - } - else if ( strcmp (country, "TH") == 0 ) { - timezone = "Asia/Bangkok"; - } - else if ( strcmp (country, "TJ") == 0 ) { - timezone = "Asia/Dushanbe"; - } - else if ( strcmp (country, "TK") == 0 ) { - timezone = "Pacific/Fakaofo"; - } - else if ( strcmp (country, "TL") == 0 ) { - timezone = "Asia/Dili"; - } - else if ( strcmp (country, "TM") == 0 ) { - timezone = "Asia/Ashgabat"; - } - else if ( strcmp (country, "TN") == 0 ) { - timezone = "Africa/Tunis"; - } - else if ( strcmp (country, "TO") == 0 ) { - timezone = "Pacific/Tongatapu"; - } - else if ( strcmp (country, "TR") == 0 ) { - timezone = "Asia/Istanbul"; - } - else if ( strcmp (country, "TT") == 0 ) { - timezone = "America/Port_of_Spain"; - } - else if ( strcmp (country, "TV") == 0 ) { - timezone = "Pacific/Funafuti"; - } - else if ( strcmp (country, "TW") == 0 ) { - timezone = "Asia/Taipei"; - } - else if ( strcmp (country, "TZ") == 0 ) { - timezone = "Africa/Dar_es_Salaam"; - } - else if ( strcmp (country, "UA") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Kiev"; - } - } - else if ( strcmp (country, "UG") == 0 ) { - timezone = "Africa/Kampala"; - } - else if ( strcmp (country, "US") == 0 ) { - if ( strcmp (region, "AK") == 0 ) { - timezone = "America/Anchorage"; - } - else if ( strcmp (region, "AL") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "AR") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "AZ") == 0 ) { - timezone = "America/Phoenix"; - } - else if ( strcmp (region, "CA") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "CO") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "CT") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "DC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "DE") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "FL") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "GA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "HI") == 0 ) { - timezone = "Pacific/Honolulu"; - } - else if ( strcmp (region, "IA") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "ID") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "IL") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "IN") == 0 ) { - timezone = "America/Indianapolis"; - } - else if ( strcmp (region, "KS") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "KY") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "LA") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MD") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "ME") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MI") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MN") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MO") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MS") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MT") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "NC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "ND") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "NE") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "NH") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "NJ") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "NM") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "NV") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "NY") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "OH") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "OK") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "OR") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "PA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "RI") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "SC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "SD") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "TN") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "TX") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "UT") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "VA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "VT") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "WA") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "WI") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "WV") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "WY") == 0 ) { - timezone = "America/Denver"; - } - } - else if ( strcmp (country, "UY") == 0 ) { - timezone = "America/Montevideo"; - } - else if ( strcmp (country, "UZ") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Tashkent"; - } - } - else if ( strcmp (country, "VA") == 0 ) { - timezone = "Europe/Vatican"; - } - else if ( strcmp (country, "VC") == 0 ) { - timezone = "America/St_Vincent"; - } - else if ( strcmp (country, "VE") == 0 ) { - timezone = "America/Caracas"; - } - else if ( strcmp (country, "VG") == 0 ) { - timezone = "America/Tortola"; - } - else if ( strcmp (country, "VI") == 0 ) { - timezone = "America/St_Thomas"; - } - else if ( strcmp (country, "VN") == 0 ) { - timezone = "Asia/Phnom_Penh"; - } - else if ( strcmp (country, "VU") == 0 ) { - timezone = "Pacific/Efate"; - } - else if ( strcmp (country, "WF") == 0 ) { - timezone = "Pacific/Wallis"; - } - else if ( strcmp (country, "WS") == 0 ) { - timezone = "Pacific/Samoa"; - } - else if ( strcmp (country, "YE") == 0 ) { - timezone = "Asia/Aden"; - } - else if ( strcmp (country, "YT") == 0 ) { - timezone = "Indian/Mayotte"; - } - else if ( strcmp (country, "YU") == 0 ) { - timezone = "Europe/Belgrade"; - } - else if ( strcmp (country, "ZA") == 0 ) { - timezone = "Africa/Johannesburg"; - } - else if ( strcmp (country, "ZM") == 0 ) { - timezone = "Africa/Lusaka"; - } - else if ( strcmp (country, "ZW") == 0 ) { - timezone = "Africa/Harare"; - } - return timezone; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h deleted file mode 100644 index 42c5ddd0..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h +++ /dev/null @@ -1,140 +0,0 @@ -/* types.h - some common typedefs - * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - * - * This file is part of GNUPG. - * - * GNUPG 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. - * - * GNUPG 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 - */ - -#ifndef G10_TYPES_H -#define G10_TYPES_H - -#ifdef HAVE_INTTYPES_H -/* For uint64_t */ -#include -#endif - -/* The AC_CHECK_SIZEOF() in configure fails for some machines. - * we provide some fallback values here */ -#if !SIZEOF_UNSIGNED_SHORT -#undef SIZEOF_UNSIGNED_SHORT -#define SIZEOF_UNSIGNED_SHORT 2 -#endif -#if !SIZEOF_UNSIGNED_INT -#undef SIZEOF_UNSIGNED_INT -#define SIZEOF_UNSIGNED_INT 4 -#endif -#if !SIZEOF_UNSIGNED_LONG -#undef SIZEOF_UNSIGNED_LONG -#define SIZEOF_UNSIGNED_LONG 4 -#endif - - -#include - -#ifndef HAVE_BYTE_TYPEDEF -#undef byte /* maybe there is a macro with this name */ -#ifndef __riscos__ -typedef unsigned char byte; -#else -/* Norcroft treats char = unsigned char as legal assignment - but char* = unsigned char* as illegal assignment - and the same applies to the signed variants as well */ -typedef char byte; -#endif -#define HAVE_BYTE_TYPEDEF -#endif - -#ifndef HAVE_USHORT_TYPEDEF -#undef ushort /* maybe there is a macro with this name */ -typedef unsigned short ushort; -#define HAVE_USHORT_TYPEDEF -#endif - -#ifndef HAVE_ULONG_TYPEDEF -#undef ulong /* maybe there is a macro with this name */ -typedef unsigned long ulong; -#define HAVE_ULONG_TYPEDEF -#endif - -#ifndef HAVE_U16_TYPEDEF -#undef u16 /* maybe there is a macro with this name */ -#if SIZEOF_UNSIGNED_INT == 2 -typedef unsigned int u16; -#elif SIZEOF_UNSIGNED_SHORT == 2 -typedef unsigned short u16; -#else -#error no typedef for u16 -#endif -#define HAVE_U16_TYPEDEF -#endif - -#ifndef HAVE_U32_TYPEDEF -#undef u32 /* maybe there is a macro with this name */ -#if SIZEOF_UNSIGNED_INT == 4 -typedef unsigned int u32; -#elif SIZEOF_UNSIGNED_LONG == 4 -typedef unsigned long u32; -#else -#error no typedef for u32 -#endif -#define HAVE_U32_TYPEDEF -#endif - -/**************** - * Warning: Some systems segfault when this u64 typedef and - * the dummy code in cipher/md.c is not available. Examples are - * Solaris and IRIX. - */ -#ifndef HAVE_U64_TYPEDEF -#undef u64 /* maybe there is a macro with this name */ -#if SIZEOF_UINT64_T == 8 -typedef uint64_t u64; -#define U64_C(c) (UINT64_C(c)) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_INT == 8 -typedef unsigned int u64; -#define U64_C(c) (c ## U) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_LONG == 8 -typedef unsigned long u64; -#define U64_C(c) (c ## UL) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_LONG_LONG == 8 -typedef unsigned long long u64; -#define U64_C(c) (c ## ULL) -#define HAVE_U64_TYPEDEF -#endif -#endif - -typedef union { - int a; - short b; - char c[1]; - long d; -#ifdef HAVE_U64_TYPEDEF - u64 e; -#endif - float f; - double g; -} PROPERLY_ALIGNED_TYPE; - -typedef struct string_list { - struct string_list *next; - unsigned int flags; - char d[1]; -} *STRLIST; - -#endif /*G10_TYPES_H*/ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh b/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh deleted file mode 100644 index 7ed280bc..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh +++ /dev/null @@ -1,8413 +0,0 @@ -# Generated from ltmain.m4sh. - -# ltmain.sh (GNU libtool) 2.2.6b -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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. - -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [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 -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print informational messages (default) -# --version print version information -# -h, --help print short or long help message -# -# 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 `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . - -PROGRAM=ltmain.sh -PACKAGE=libtool -VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" -TIMESTAMP="" -package_revision=1.3017 - -# 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 - -# NLS nuisances: We save the old values to restore during execute mode. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done - -$lt_unset CDPATH - - - - - -: ${CP="cp -f"} -: ${ECHO="echo"} -: ${EGREP="/bin/grep -E"} -: ${FGREP="/bin/grep -F"} -: ${GREP="/bin/grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="/bin/sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - -# Generated shell functions inserted here. - -# 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: -# In the unlikely event $progname began with a '-', it would play havoc with -# func_echo (imagine progname=-n), so we prepend ./ in that case: -func_dirname_and_basename "$progpath" -progname=$func_basename_result -case $progname in - -*) progname=./$progname ;; -esac - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=: - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# 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='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname${mode+: }$mode: $*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` - done - my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# 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 "$opt_dry_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" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "X$my_tmpdir" | $Xsed -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "X$1" | $Xsed \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - - - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $SED -n '/^# Usage:/,/# -h/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - $ECHO - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help -# Echo long help message to standard output and exit. -func_help () -{ - $SED -n '/^# Usage:/,/# Report bugs to/ { - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ - p - }' < "$progpath" - exit $? -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - func_error "missing argument for $1" - exit_cmd=exit -} - -exit_cmd=: - - - - - -# 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 </dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# Parse options once, thoroughly. This comes as soon as possible in -# the script to make things like `libtool --version' happen quickly. -{ - - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - esac - - # Parse non-mode specific arguments: - while test "$#" -gt 0; do - opt="$1" - shift - - case $opt in - --config) func_config ;; - - --debug) preserve_args="$preserve_args $opt" - func_echo "enabling shell trace mode" - opt_debug='set -x' - $opt_debug - ;; - - -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break - execute_dlfiles="$execute_dlfiles $1" - shift - ;; - - --dry-run | -n) opt_dry_run=: ;; - --features) func_features ;; - --finish) mode="finish" ;; - - --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break - case $1 in - # Valid mode arguments: - clean) ;; - compile) ;; - execute) ;; - finish) ;; - install) ;; - link) ;; - relink) ;; - uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; - esac - - mode="$1" - shift - ;; - - --preserve-dup-deps) - opt_duplicate_deps=: ;; - - --quiet|--silent) preserve_args="$preserve_args $opt" - opt_silent=: - ;; - - --verbose| -v) preserve_args="$preserve_args $opt" - opt_silent=false - ;; - - --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break - preserve_args="$preserve_args $opt $1" - func_enable_tag "$1" # tagname is set here - shift - ;; - - # Separate optargs to long options: - -dlopen=*|--mode=*|--tag=*) - func_opt_split "$opt" - set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} - shift - ;; - - -\?|-h) func_usage ;; - --help) opt_help=: ;; - --version) func_version ;; - - -*) func_fatal_help "unrecognized option \`$opt'" ;; - - *) nonopt="$opt" - break - ;; - esac - done - - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_duplicate_deps - ;; - esac - - # Having warned about all mis-specified options, bail out if - # anything was wrong. - $exit_cmd $EXIT_FAILURE -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -## ----------- ## -## Main. ## -## ----------- ## - -$opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - test -z "$mode" && func_fatal_error "error: you must specify a MODE." - - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$mode' for more information." -} - - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_ltwrapper_scriptname_result="" - if func_ltwrapper_executable_p "$1"; then - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" - fi -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE 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. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# 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 () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" - 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. - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" - 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 - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T <?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # 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 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - 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" - 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 $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "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." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - removelist="$removelist $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - removelist="$removelist $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - command="$command -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/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." - - $opt_dry_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 - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - command="$command -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/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." - - $opt_dry_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 - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { -test "$mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [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: $progname [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 - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only 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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: - - -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [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 - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -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: $progname [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." - ;; - - *) - func_fatal_help "invalid operation mode \`$mode'" - ;; - esac - - $ECHO - $ECHO "Try \`$progname --help' for more information about other modes." - - exit $? -} - - # Now that we've collected a possible --mode arg, show help if necessary - $opt_help && func_mode_help - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - 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 func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_quote_for_eval "$file" - args="$args $func_quote_for_eval_result" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # 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 -} - -test "$mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - 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. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && 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" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" - $ECHO "pages." - ;; - *) - $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - $ECHO "X----------------------------------------------------------------------" | $Xsed - exit $EXIT_SUCCESS -} - -test "$mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # 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. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - install_prog="$install_prog$func_quote_for_eval_result" - - # 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. - func_quote_for_eval "$arg" - install_prog="$install_prog $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - 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. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # 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 - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - dir="$dir$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "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. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_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 - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_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 - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_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 - func_basename "$file" - destfile="$func_basename_result" - 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 - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - 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) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_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 progfile in $progfiles; do - func_verbose "extracting global C symbols from \`$progfile'" - $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - done - - $opt_dry_run || { - # 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/$my_dlsyms"' - else - $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - $ECHO >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -" - case $host in - *cygwin* | *mingw* | *cegcc* ) - $ECHO >> "$output_objdir/$my_dlsyms" "\ -/* DATA imports from DLLs on WIN32 con't be const, because - runtime relocations are performed -- see ld's documentation - on pseudo-relocs. */" - lt_dlsym_const= ;; - *osf5*) - echo >> "$output_objdir/$my_dlsyms" "\ -/* This system does not cope well with relocations in const data */" - lt_dlsym_const= ;; - *) - lt_dlsym_const=const ;; - esac - - $ECHO >> "$output_objdir/$my_dlsyms" "\ -extern $lt_dlsym_const lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -$lt_dlsym_const lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - $ECHO >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - 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*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) symtab_cflags="$symtab_cflags $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - 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 -} - -# 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 () -{ - $opt_debug - 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 '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_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - func_show_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 - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - 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 - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_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've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - 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 -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_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" -} - - - -# func_emit_wrapper_part1 [arg=no] -# -# Emit the first part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part1 () -{ - func_emit_wrapper_part1_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part1_arg1=$1 - fi - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# 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' - -# 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 - -# 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 variables: - generated_by_libtool_version='$macro_version' - 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 "\ - - # 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 -" -} -# end: func_emit_wrapper_part1 - -# func_emit_wrapper_part2 [arg=no] -# -# Emit the second part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part2 () -{ - func_emit_wrapper_part2_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part2_arg1=$1 - fi - - $ECHO "\ - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - 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 "\ - - # 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 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - 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 "\ - # 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 "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $ECHO "\ - 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* | *-cegcc*) - $ECHO "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 - 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 1 - fi -fi\ -" -} -# end: func_emit_wrapper_part2 - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=no - if test -n "$1" ; then - func_emit_wrapper_arg1=$1 - fi - - # split this up so that func_emit_cwrapperexe_src - # can call each part independently. - func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" - func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" -} - - -# func_to_host_path arg -# -# Convert paths to host format when used with build tools. -# Intended for use with "native" mingw (where libtool itself -# is running under the msys shell), or in the following cross- -# build environments: -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# where wine is equipped with the `winepath' executable. -# In the native mingw case, the (msys) shell automatically -# converts paths for any non-msys applications it launches, -# but that facility isn't available from inside the cwrapper. -# Similar accommodations are necessary for $host mingw and -# $build cygwin. Calling this function does no harm for other -# $host/$build combinations not listed above. -# -# ARG is the path (on $build) that should be converted to -# the proper representation for $host. The result is stored -# in $func_to_host_path_result. -func_to_host_path () -{ - func_to_host_path_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - case $build in - *mingw* ) # actually, msys - # awkward: cmd appends spaces to result - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_path_tmp1=`( cmd //c echo "$1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_path_tmp1=`cygpath -w "$1"` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # Unfortunately, winepath does not exit with a non-zero - # error code, so we are forced to check the contents of - # stdout. On the other hand, if the command is not - # found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both - # error code of zero AND non-empty stdout, which explains - # the odd construction: - func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - else - # Allow warning below. - func_to_host_path_result="" - fi - ;; - esac - if test -z "$func_to_host_path_result" ; then - func_error "Could not determine host path corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_path_result="$1" - fi - ;; - esac - fi -} -# end: func_to_host_path - -# func_to_host_pathlist arg -# -# Convert pathlists to host format when used with build tools. -# See func_to_host_path(), above. This function supports the -# following $build/$host combinations (but does no harm for -# combinations not listed here): -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# -# Path separators are also converted from $build format to -# $host format. If ARG begins or ends with a path separator -# character, it is preserved (but converted to $host format) -# on output. -# -# ARG is a pathlist (on $build) that should be converted to -# the proper representation on $host. The result is stored -# in $func_to_host_pathlist_result. -func_to_host_pathlist () -{ - func_to_host_pathlist_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_to_host_pathlist_tmp2="$1" - # Once set for this call, this variable should not be - # reassigned. It is used in tha fallback case. - func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e 's|^:*||' -e 's|:*$||'` - case $build in - *mingw* ) # Actually, msys. - # Awkward: cmd appends spaces to result. - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # unfortunately, winepath doesn't convert pathlists - func_to_host_pathlist_result="" - func_to_host_pathlist_oldIFS=$IFS - IFS=: - for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do - IFS=$func_to_host_pathlist_oldIFS - if test -n "$func_to_host_pathlist_f" ; then - func_to_host_path "$func_to_host_pathlist_f" - if test -n "$func_to_host_path_result" ; then - if test -z "$func_to_host_pathlist_result" ; then - func_to_host_pathlist_result="$func_to_host_path_result" - else - func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" - fi - fi - fi - IFS=: - done - IFS=$func_to_host_pathlist_oldIFS - ;; - esac - if test -z "$func_to_host_pathlist_result" ; then - func_error "Could not determine the host path(s) corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This may break if $1 contains DOS-style drive - # specifications. The fix is not to complicate the expression - # below, but for the user to provide a working wine installation - # with winepath so that path translation in the cross-to-mingw - # case works properly. - lt_replace_pathsep_nix_to_dos="s|:|;|g" - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_replace_pathsep_nix_to_dos"` - fi - # Now, add the leading and trailing path separators back - case "$1" in - :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" - ;; - esac - case "$1" in - *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" - ;; - esac - ;; - esac - fi -} -# end: func_to_host_pathlist - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -# define setmode _setmode -#else -# include -# include -# ifdef __CYGWIN__ -# include -# define HAVE_SETENV -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -# endif -#endif -#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 S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -#ifdef _MSC_VER -# define S_IXUSR _S_IEXEC -# define stat _stat -# ifndef _INTPTR_T_DEFINED -# define intptr_t int -# endif -#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 -# define FOPEN_WB "wb" -# 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 */ - -#ifdef __CYGWIN__ -# define FOPEN_WB "wb" -#endif - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#undef LTWRAPPER_DEBUGPRINTF -#if defined DEBUGWRAPPER -# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args -static void -ltwrapper_debugprintf (const char *fmt, ...) -{ - va_list args; - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); -} -#else -# define LTWRAPPER_DEBUGPRINTF(args) -#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); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_fatal (const char *message, ...); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_opt_process_env_set (const char *arg); -void lt_opt_process_env_prepend (const char *arg); -void lt_opt_process_env_append (const char *arg); -int lt_split_name_value (const char *arg, char** name, char** value); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); - -static const char *script_text_part1 = -EOF - - func_emit_wrapper_part1 yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ "/' -e 's/$/\\n"/' - echo ";" - cat <"))); - for (i = 0; i < newargc; i++) - { - LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); - } - -EOF - - case $host_os in - mingw*) - cat <<"EOF" - /* execv doesn't actually work on mingw as expected on unix */ - rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); - if (rval == -1) - { - /* failed to start process */ - LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); - return 127; - } - return rval; -EOF - ;; - *) - cat <<"EOF" - execv (lt_argv_zero, newargz); - return rval; /* =127, but avoids unused variable warning */ -EOF - ;; - esac - - cat <<"EOF" -} - -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; - - LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -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; - - LTWRAPPER_DEBUGPRINTF (("(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 * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", - tmp_pathspec)); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - char *errstr = strerror (errno); - lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal ("Could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -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); -} - -void -lt_setenv (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", - (name ? name : ""), - (value ? value : ""))); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -int -lt_split_name_value (const char *arg, char** name, char** value) -{ - const char *p; - int len; - if (!arg || !*arg) - return 1; - - p = strchr (arg, (int)'='); - - if (!p) - return 1; - - *value = xstrdup (++p); - - len = strlen (arg) - strlen (*value); - *name = XMALLOC (char, len); - strncpy (*name, arg, len-1); - (*name)[len - 1] = '\0'; - - return 0; -} - -void -lt_opt_process_env_set (const char *arg) -{ - char *name = NULL; - char *value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); - } - - lt_setenv (name, value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_prepend (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_append (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 1); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - - -EOF -} -# end: func_emit_cwrapperexe_src - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - 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 - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append 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" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) deplibs="$deplibs $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$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 func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - 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. - func_append 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 - func_append 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" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - 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 - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - weak_libs="$weak_libs $arg" - prev= - continue - ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - 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 - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -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 - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - 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*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname '-L' '' "$arg" - dir=$func_stripname_result - if test -z "$dir"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - 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* | *-cegcc*) - testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$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* | *-cegcc*) - # 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 System.ltframework" - 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 - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot) - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - 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*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # 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 - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" - linker_flags="$linker_flags $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # -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*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -F/path gives path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* 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*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - compiler_flags="$compiler_flags $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - 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. - func_append 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 - func_append 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" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool 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. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - 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\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - 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 $opt_duplicate_deps ; 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 $opt_duplicate_compiler_generated_deps; 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 - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - 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 - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - 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%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - case $lib in - *.la) func_source "$lib" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` - case " $weak_libs " in - *" $deplib_base "*) ;; - *) deplibs="$deplibs $deplib" ;; - esac - done - done - libs="$dlprefiles" - 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|-threads) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - compiler_flags="$compiler_flags $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; 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 func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - 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 - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - 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 - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - 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 - func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - dir=$func_stripname_result - # 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) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 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 use here." - else - $ECHO - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - 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 - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # 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 - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - 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 - func_fatal_error "cannot find name of link library for \`$lib'" - 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 $opt_duplicate_deps ; 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 - func_fatal_error "\`$lib' is not a convenience library" - 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 - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - 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 - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # 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 - func_warning "library \`$lib' was moved." - 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 - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - 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" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - dlpreconveniencelibs="$dlpreconveniencelibs $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*) func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - 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 $opt_duplicate_deps ; 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 "$prefer_static_libs,$installed" = "built,yes"; } || - 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 - *"$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 - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - notinst_deplibs="$notinst_deplibs $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && 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 - shift - realname="$1" - 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* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - 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 (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; 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 - elif test -n "$old_library"; then - 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 && - test "$hardcode_direct_absolute" = no; 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 - func_fatal_configuration "unsupported hardcode properties" - 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 && - test "$hardcode_direct_absolute" = no; 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*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - 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 $opt_duplicate_deps ; 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 - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_dirname "$deplib" "" "." - dir="$func_dirname_result" - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - 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 "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - 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" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # 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*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - $ECHO - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - 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 - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # 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="$1" - number_minor="$2" - number_revision="$3" - # - # 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|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - 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]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - 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]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - 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]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - 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 - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - 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 - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - 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 - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - 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 - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - libobjs="$libobjs $symfileobj" - test "X$libobjs" = "X " && libobjs= - - 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 | *.gcno) - ;; - $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 - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - 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 "X$lib_search_path " | $Xsed -e "s% $path % %g"` - # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` - # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -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* | *-cegcc*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs System.ltframework" - ;; - *-*-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. - $opt_dry_run || $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 -e 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 - ;; - *) - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - 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 \"X$potent_lib\"" 2>/dev/null | $Xsed -e 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 - ;; - *) - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - ;; - esac - 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" | $Xsed -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 with the System framework - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - ;; - 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 - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - 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 " $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 - shift - realname="$1" - 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` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - delfiles="$delfiles $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - func_len " $cmd" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "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" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $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" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - libobjs="$libobjs $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - 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 - $opt_dry_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:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # 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= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - $ECHO 'INPUT (' > $output - for obj in $save_libobjs - do - $ECHO "$obj" >> $output - done - $ECHO ')' >> $output - delfiles="$delfiles $output" - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - $ECHO "$obj" >> $output - done - delfiles="$delfiles $output" - output=$firstobj\"$file_list_spec$output\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append 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~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=$obj - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - 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 test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - delfiles="$delfiles $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "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" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - 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\" - test "X$libobjs" = "X " && libobjs= - 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 - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $dlprefiles - libobjs="$libobjs $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - ( 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 - $opt_dry_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 - func_show_eval '${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 - func_show_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 "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_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 and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` - 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" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${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" - # $opt_dry_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" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - 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 / System.ltframework /'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - 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* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$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 - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *cegcc) - # Disable wrappers for cegcc, we are cross compiling anyway. - wrappers_required=no - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; 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. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - 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. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_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" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - 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. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - # Now create the wrapper script. - func_verbose "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}\" || $lt_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 - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; 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 not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - 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 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - 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 $symfileobj" - 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" - if test "$preload" = yes && test -f "$symfileobj"; then - oldobjs="$oldobjs $symfileobj" - fi - 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 - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $dlprefiles - oldobjs="$oldobjs $func_extract_archives_result" - fi - - # 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 - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $ECHO "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - oldobjs="$oldobjs $gentop/$newobj" - ;; - *) oldobjs="$oldobjs $obj" ;; - esac - done - fi - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$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 - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$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 - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$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= - len=$len0 - 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 - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "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}\" || $lt_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 - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; 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. - $opt_dry_run || { - 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) - func_basename "$deplib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - newdlfiles="$newdlfiles $libdir/$name" - ;; - *) newdlfiles="$newdlfiles $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - newdlprefiles="$newdlprefiles $libdir/$name" - ;; - esac - 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 | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# 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' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_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 - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$mode" = link || test "$mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - 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 - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - origobjdir="$objdir" - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - objdir="$origobjdir" - else - objdir="$dir/$origobjdir" - fi - func_basename "$file" - name="$func_basename_result" - 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 func_lalib_p "$file"; then - func_source $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. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $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) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $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 func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - rmfiles="$rmfiles $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # 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 - func_show_eval "$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 - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$mode" = uninstall || test "$mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# 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 -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am deleted file mode 100644 index 0db02e3c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -man_MANS = geoipupdate.1 geoiplookup6.1 geoiplookup.1 - -EXTRA_DIST = geoiplookup6.1.in geoiplookup.1.in geoipupdate.1.in - - -edit = sed \ - -e 's|DATADIR|$(pkgdatadir)|g' \ - -e 's|CONF_DIR|$(sysconfdir)|g' - -geoipupdate.1 geoiplookup.1 geoiplookup6.1: Makefile - rm -f $@ $@.tmp - $(edit) '$(srcdir)/$@.in' >$@.tmp - mv $@.tmp $@ - -geoipupdate.1: geoipupdate.1.in -geoiplookup.1: geoiplookup.1.in -geoiplookup6.1: geoiplookup6.1.in - -CLEANFILES = geoiplookup6.1 geoipupdate.1 geoiplookup.1 - -UPDATE_MAN = $(mandir)/man1/geoipupdate.1 -LOOKUP_MAN = $(mandir)/man1/geoiplookup.1 -LOOKUP6_MAN = $(mandir)/man1/geoiplookup6.1 - -install-data-hook: - cat geoipupdate.1 | sed s,DATADIR,$(pkgdatadir), | sed s,CONF_DIR,$(sysconfdir), > $(DESTDIR)$(UPDATE_MAN) - cat geoiplookup.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP_MAN) - cat geoiplookup6.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP6_MAN) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in deleted file mode 100644 index 0e8b1436..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in +++ /dev/null @@ -1,455 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = man -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -man1dir = $(mandir)/man1 -am__installdirs = "$(DESTDIR)$(man1dir)" -NROFF = nroff -MANS = $(man_MANS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -man_MANS = geoipupdate.1 geoiplookup6.1 geoiplookup.1 -EXTRA_DIST = geoiplookup6.1.in geoiplookup.1.in geoipupdate.1.in -edit = sed \ - -e 's|DATADIR|$(pkgdatadir)|g' \ - -e 's|CONF_DIR|$(sysconfdir)|g' - -CLEANFILES = geoiplookup6.1 geoipupdate.1 geoiplookup.1 -UPDATE_MAN = $(mandir)/man1/geoipupdate.1 -LOOKUP_MAN = $(mandir)/man1/geoiplookup.1 -LOOKUP6_MAN = $(mandir)/man1/geoiplookup6.1 -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu man/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ - done; } - -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man1dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically \`make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man1 - -.MAKE: install-am install-data-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man1 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-man uninstall-man1 - - -geoipupdate.1 geoiplookup.1 geoiplookup6.1: Makefile - rm -f $@ $@.tmp - $(edit) '$(srcdir)/$@.in' >$@.tmp - mv $@.tmp $@ - -geoipupdate.1: geoipupdate.1.in -geoiplookup.1: geoiplookup.1.in -geoiplookup6.1: geoiplookup6.1.in - -install-data-hook: - cat geoipupdate.1 | sed s,DATADIR,$(pkgdatadir), | sed s,CONF_DIR,$(sysconfdir), > $(DESTDIR)$(UPDATE_MAN) - cat geoiplookup.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP_MAN) - cat geoiplookup6.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP6_MAN) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in deleted file mode 100644 index ede2e518..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in +++ /dev/null @@ -1,37 +0,0 @@ -.TH GEOIPLOOKUP 1 "2 Jan 2007" -.UC 4 -.SH NAME -geoiplookup \- look up country using IP Address or hostname -.SH SYNOPSIS -geoiplookup [\-d directory] [\-f filename] [\-v] -.SH DESCRIPTION -geoiplookup uses the GeoIP library and database to find the Country -that an IP address or hostname originates from. -.PP -For example -.PP -.I geoiplookup 80.60.233.195 -.PP -will find the Country that 80.60.233.195 originates from, in the following format: -.PP -.I NL, Netherlands -.PP -.SH OPTIONS -.IP "\-f" -Specify a custom path to a single GeoIP datafile. -.IP "\-d" -Specify a custom directory containing GeoIP datafile(s). By default geoiplookup looks in DATADIR -.IP "\-v" -Lists the date and build number for the GeoIP datafile(s). -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to -.SH COPYRIGHT -Copyright © 2006 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -geoipupdate(1), nslookup(1). diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in deleted file mode 100644 index 2a49ee1a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in +++ /dev/null @@ -1,42 +0,0 @@ -.TH GEOIPLOOKUP6 1 "28 Oct 2008" -.UC 4 -.SH NAME -geouplookup6 \- look up country using IP Address or hostname -.SH SYNOPSIS -geouplookup6 [\-d directory] [\-f filename] [\-v] -.SH DESCRIPTION -geouplookup6 uses the GeoIP library and database to find the Country -that an IP address or hostname originates from. You must install a database suitable for geoiplookup6. IE: GeoIPv6.dat -.PP -For example: -.PP -.I geouplookup6 2001:4860:0:1001::68 -.PP -.I geoiplookup6 ipv6.google.com -.PP -will find the Country that 2001:4860:0:1001::68 originates from, in the following format: -.PP -.I US, United States -.PP -.PP Please notice, that names must resolve to a ipv6 address. For example -.PP geoiplookup6 www.maxmind.com does not work, since there is no ipv6 -.PP DNS entry -.SH OPTIONS -.IP "\-f" -Specify a custom path to a single GeoIP datafile. -.IP "\-d" -Specify a custom directory containing GeoIP datafile(s). By default geouplookup6 looks in DATADIR -.IP "\-v" -Lists the date and build number for the GeoIP datafile(s). -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to -.SH COPYRIGHT -Copyright © 2008 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -geoipupdate(1), nslookup(1). diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in deleted file mode 100644 index c0f9a854..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in +++ /dev/null @@ -1,68 +0,0 @@ -.TH GEOIPUPDATE 1 "5 Oct 2010" -.UC 4 -.SH NAME -geoipupdate \- a program for updating the MaxMind GeoIP databases -.SH SYNOPSIS -geoipupdate [\-v] [\-f licensefile] -.SH DESCRIPTION -geoipupdate automatically updates the GeoIP database for GeoIP -subscribers. It connects to the MaxMind GeoIP Update server -and checks for an updated database. If it finds an updated -database, then it downloads it, uncompresses it, and installs it. -If you are running a firewall, it requires that the DNS and -HTTP (80) ports be open. -.PP -For example -.PP -.I geoipupdate \-v -.PP -Performs the update in verbose mode. -.PP -.SH OPTIONS -.IP "\-v" -Verbose mode, prints out the steps that geoipupdate takes. -.IP "\-d" -Specify a custom directory target to install the GeoIP datafile(s). By default geoipupdate installs to DATADIR -.IP "\-f" -Specifies the configuration file that contains the license key. -Defaults to CONF_DIR/GeoIP.conf -.SH USAGE -Typically you'll want to write a weekly crontab that will run geoipupdate. -Below is a sample crontab that runs geoipupdate on each Wednesday at noon: -.PP -.RS -# top of crontab -.PP -MAILTO=your@email.com -.PP -0 12 * * 3 BIN_DIR/geoipupdate -.PP -# end of crontab -.RE -To use with a proxy server, set the http_proxy environment variable. -E.g. -.RS -export http_proxy="http://proxy-hostname:port" -.RE -.SH RETURN CODES -geoipupdate returns 0 on success, 1 on error. -.SH FILES -.PP -.I CONF_DIR/GeoIP.conf -.PP -Configuration file for GeoIP, should contain license key. -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to -.SH COPYRIGHT -Copyright © 2011 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -Visit to -sign up for a GeoIP subscription. -.PP -geoiplookup(1), crontab(5) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/missing b/Src/Plugins/DSP/sc_serv3/GeoIP/missing deleted file mode 100644 index 28055d2a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/missing +++ /dev/null @@ -1,376 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2009-04-28.21; # UTC - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - tar*) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar*) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am deleted file mode 100644 index fffcbed3..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -check_PROGRAMS = test-geoip - -noinst_PROGRAMS = benchmark test-geoip-region test-geoip-city test-geoip-org test-geoip-asnum test-geoip-isp test-geoip-netspeed - -EXTRA_PROGRAMS = benchmark \ - test-geoip-region \ - test-geoip-city \ - test-geoip-org \ - test-geoip-asnum \ - test-geoip-isp \ - test-geoip-netspeed - -LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -AM_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\" - -test_geoip_SOURCES = test-geoip.c - -test_geoip_region_SOURCES = test-geoip-region.c - -test_geoip_org_SOURCES = test-geoip-org.c - -test_geoip_isp_SOURCES = test-geoip-isp.c - -test_geoip_asnum_SOURCES = test-geoip-asnum.c - -test_geoip_netspeed_SOURCES = test-geoip-netspeed.c - -test_geoip_city_SOURCES = test-geoip-city.c - -benchmark_SOURCES = benchmark.c - -EXTRA_DIST = Makefile.vc city_test.txt country_test.txt country_test2.txt country_test_name.txt region_test.txt -TESTS = test-geoip diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in deleted file mode 100644 index 6d1282bd..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in +++ /dev/null @@ -1,657 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -check_PROGRAMS = test-geoip$(EXEEXT) -noinst_PROGRAMS = benchmark$(EXEEXT) test-geoip-region$(EXEEXT) \ - test-geoip-city$(EXEEXT) test-geoip-org$(EXEEXT) \ - test-geoip-asnum$(EXEEXT) test-geoip-isp$(EXEEXT) \ - test-geoip-netspeed$(EXEEXT) -EXTRA_PROGRAMS = benchmark$(EXEEXT) test-geoip-region$(EXEEXT) \ - test-geoip-city$(EXEEXT) test-geoip-org$(EXEEXT) \ - test-geoip-asnum$(EXEEXT) test-geoip-isp$(EXEEXT) \ - test-geoip-netspeed$(EXEEXT) -TESTS = test-geoip$(EXEEXT) -subdir = test -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_benchmark_OBJECTS = benchmark.$(OBJEXT) -benchmark_OBJECTS = $(am_benchmark_OBJECTS) -benchmark_LDADD = $(LDADD) -benchmark_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_OBJECTS = test-geoip.$(OBJEXT) -test_geoip_OBJECTS = $(am_test_geoip_OBJECTS) -test_geoip_LDADD = $(LDADD) -test_geoip_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_asnum_OBJECTS = test-geoip-asnum.$(OBJEXT) -test_geoip_asnum_OBJECTS = $(am_test_geoip_asnum_OBJECTS) -test_geoip_asnum_LDADD = $(LDADD) -test_geoip_asnum_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_city_OBJECTS = test-geoip-city.$(OBJEXT) -test_geoip_city_OBJECTS = $(am_test_geoip_city_OBJECTS) -test_geoip_city_LDADD = $(LDADD) -test_geoip_city_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_isp_OBJECTS = test-geoip-isp.$(OBJEXT) -test_geoip_isp_OBJECTS = $(am_test_geoip_isp_OBJECTS) -test_geoip_isp_LDADD = $(LDADD) -test_geoip_isp_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_netspeed_OBJECTS = test-geoip-netspeed.$(OBJEXT) -test_geoip_netspeed_OBJECTS = $(am_test_geoip_netspeed_OBJECTS) -test_geoip_netspeed_LDADD = $(LDADD) -test_geoip_netspeed_DEPENDENCIES = \ - $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_org_OBJECTS = test-geoip-org.$(OBJEXT) -test_geoip_org_OBJECTS = $(am_test_geoip_org_OBJECTS) -test_geoip_org_LDADD = $(LDADD) -test_geoip_org_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_region_OBJECTS = test-geoip-region.$(OBJEXT) -test_geoip_region_OBJECTS = $(am_test_geoip_region_OBJECTS) -test_geoip_region_LDADD = $(LDADD) -test_geoip_region_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(benchmark_SOURCES) $(test_geoip_SOURCES) \ - $(test_geoip_asnum_SOURCES) $(test_geoip_city_SOURCES) \ - $(test_geoip_isp_SOURCES) $(test_geoip_netspeed_SOURCES) \ - $(test_geoip_org_SOURCES) $(test_geoip_region_SOURCES) -DIST_SOURCES = $(benchmark_SOURCES) $(test_geoip_SOURCES) \ - $(test_geoip_asnum_SOURCES) $(test_geoip_city_SOURCES) \ - $(test_geoip_isp_SOURCES) $(test_geoip_netspeed_SOURCES) \ - $(test_geoip_org_SOURCES) $(test_geoip_region_SOURCES) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -AM_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\" -test_geoip_SOURCES = test-geoip.c -test_geoip_region_SOURCES = test-geoip-region.c -test_geoip_org_SOURCES = test-geoip-org.c -test_geoip_isp_SOURCES = test-geoip-isp.c -test_geoip_asnum_SOURCES = test-geoip-asnum.c -test_geoip_netspeed_SOURCES = test-geoip-netspeed.c -test_geoip_city_SOURCES = test-geoip-city.c -benchmark_SOURCES = benchmark.c -EXTRA_DIST = Makefile.vc city_test.txt country_test.txt country_test2.txt country_test_name.txt region_test.txt -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -benchmark$(EXEEXT): $(benchmark_OBJECTS) $(benchmark_DEPENDENCIES) - @rm -f benchmark$(EXEEXT) - $(LINK) $(benchmark_OBJECTS) $(benchmark_LDADD) $(LIBS) -test-geoip$(EXEEXT): $(test_geoip_OBJECTS) $(test_geoip_DEPENDENCIES) - @rm -f test-geoip$(EXEEXT) - $(LINK) $(test_geoip_OBJECTS) $(test_geoip_LDADD) $(LIBS) -test-geoip-asnum$(EXEEXT): $(test_geoip_asnum_OBJECTS) $(test_geoip_asnum_DEPENDENCIES) - @rm -f test-geoip-asnum$(EXEEXT) - $(LINK) $(test_geoip_asnum_OBJECTS) $(test_geoip_asnum_LDADD) $(LIBS) -test-geoip-city$(EXEEXT): $(test_geoip_city_OBJECTS) $(test_geoip_city_DEPENDENCIES) - @rm -f test-geoip-city$(EXEEXT) - $(LINK) $(test_geoip_city_OBJECTS) $(test_geoip_city_LDADD) $(LIBS) -test-geoip-isp$(EXEEXT): $(test_geoip_isp_OBJECTS) $(test_geoip_isp_DEPENDENCIES) - @rm -f test-geoip-isp$(EXEEXT) - $(LINK) $(test_geoip_isp_OBJECTS) $(test_geoip_isp_LDADD) $(LIBS) -test-geoip-netspeed$(EXEEXT): $(test_geoip_netspeed_OBJECTS) $(test_geoip_netspeed_DEPENDENCIES) - @rm -f test-geoip-netspeed$(EXEEXT) - $(LINK) $(test_geoip_netspeed_OBJECTS) $(test_geoip_netspeed_LDADD) $(LIBS) -test-geoip-org$(EXEEXT): $(test_geoip_org_OBJECTS) $(test_geoip_org_DEPENDENCIES) - @rm -f test-geoip-org$(EXEEXT) - $(LINK) $(test_geoip_org_OBJECTS) $(test_geoip_org_LDADD) $(LIBS) -test-geoip-region$(EXEEXT): $(test_geoip_region_OBJECTS) $(test_geoip_region_DEPENDENCIES) - @rm -f test-geoip-region$(EXEEXT) - $(LINK) $(test_geoip_region_OBJECTS) $(test_geoip_region_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/benchmark.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-asnum.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-city.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-isp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-netspeed.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-org.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-region.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ - else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc deleted file mode 100644 index eaa23763..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc +++ /dev/null @@ -1,29 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -LINK = link -nologo - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) - -GEOIPLIB = ..\libGeoIP\GeoIP.lib - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -TEST: benchmark.exe test-geoip.exe - -benchmark.exe: benchmark.c - $(CC1) -c benchmark.c - $(LINK) benchmark.obj $(GEOIPLIB) - -test-geoip.exe: test-geoip.c - $(CC1) -c test-geoip.c - $(LINK) test-geoip.obj $(GEOIPLIB) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c deleted file mode 100644 index 3d2346f2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#if !defined(_WIN32) -#include -#endif /* !defined(_WIN32) */ - -char *ipstring[4] = {"24.24.24.24","80.24.24.80", -"200.24.24.40","68.24.24.46"}; -int numipstrings = 4; - -#if !defined(_WIN32) -struct timeval timer_t1; -struct timeval timer_t2; -#else /* !defined(_WIN32) */ -FILETIME timer_t1; /* 100 ns */ -FILETIME timer_t2; -#endif /* !defined(_WIN32) */ - -#if !defined(_WIN32) -void timerstart() { - gettimeofday(&timer_t1,NULL); -} -double timerstop() { - int a1 = 0; - int a2 = 0; - double r = 0; - gettimeofday(&timer_t2,NULL); - a1 = timer_t2.tv_sec - timer_t1.tv_sec; - a2 = timer_t2.tv_usec - timer_t1.tv_usec; - if (a1 < 0) { - a1 = a1 - 1; - a2 = a2 + 1000000; - } - r = (((double) a1) + (((double) a2) / 1000000)); - return r; -} -#else /* !defined(_WIN32) */ -void timerstart() { - GetSystemTimeAsFileTime(&timer_t1); -} -double timerstop() { - __int64 delta; /* VC6 can't convert an unsigned int64 to to double */ - GetSystemTimeAsFileTime(&timer_t2); - delta = FILETIME_TO_USEC(timer_t2) - FILETIME_TO_USEC(timer_t2); - return delta; -} -#endif /* !defined(_WIN32) */ - -void testgeoipcountry(int flags,const char *msg,int numlookups) { - const char *str = NULL; - double t = 0; - int i4 = 0; - int i2 = 0; - GeoIP *i = NULL; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIP.dat",flags); - if (i == NULL) { - printf("error: GeoIP.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - str = GeoIP_country_name_by_addr(i,ipstring[i4]); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -void testgeoipregion(int flags,const char *msg,int numlookups) { - GeoIP *i = NULL; - GeoIPRegion *i3 = NULL; - int i4 = 0; - int i2 = 0; - double t = 0; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIPRegion.dat",flags); - if (i == NULL) { - printf("error: GeoIPRegion.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - i3 = GeoIP_region_by_addr(i,ipstring[i4]); - GeoIPRegion_delete(i3); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -void testgeoipcity(int flags,const char *msg,int numlookups) { - GeoIP *i = NULL; - GeoIPRecord * i3 = NULL; - int i4 = 0; - int i2 = 0; - double t = 0; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIPCity.dat",flags); - if (i == NULL) { - printf("error: GeoLiteCity.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - i3 = GeoIP_record_by_addr(i,ipstring[i4]); - GeoIPRecord_delete(i3); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -int main(){ - int time = 300*numipstrings; - testgeoipcountry(0,"GeoIP Country",100*time); - testgeoipcountry(GEOIP_CHECK_CACHE,"GeoIP Country with GEOIP_CHECK_CACHE",100*time); - testgeoipcountry(GEOIP_MEMORY_CACHE,"GeoIP Country with GEOIP_MEMORY_CACHE",1000*time); - testgeoipcountry(GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,"GeoIP Country with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",1000*time); - - testgeoipregion(0,"GeoIP Region",100*time); - testgeoipregion(GEOIP_CHECK_CACHE,"GeoIP Region with GEOIP_CHECK_CACHE",100*time); - testgeoipregion(GEOIP_MEMORY_CACHE,"GeoIP Region with GEOIP_MEMORY_CACHE",1000*time); - testgeoipregion(GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,"GeoIP Region with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",1000*time); - - testgeoipcity(0,"GeoIP City",50*time); - testgeoipcity(GEOIP_INDEX_CACHE,"GeoIP City with GEOIP_INDEX_CACHE",200*time); - testgeoipcity(GEOIP_INDEX_CACHE | GEOIP_CHECK_CACHE,"GeoIP City with GEOIP_INDEX_CACHE and GEOIP_CHECK_CACHE",200*time); - testgeoipcity(GEOIP_MEMORY_CACHE,"GeoIP City with GEOIP_MEMORY_CACHE",500*time); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt deleted file mode 100644 index 20cd8e15..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt +++ /dev/null @@ -1,2 +0,0 @@ -24.24.24.24 # Should return Ithaca, NY, US -80.24.24.24 # Should return Madrid, 29, ES diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt deleted file mode 100644 index eaffb935..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt +++ /dev/null @@ -1,69 +0,0 @@ -216.236.135.152 US USA -192.106.51.100 IT ITA -147.251.48.1 CZ CZE -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -134.102.101.18 DE DEU -193.75.148.28 BE BEL -194.244.83.2 IT ITA -203.15.106.23 AU AUS -196.31.1.1 ZA ZAF -151.28.39.114 IT ITA -151.38.70.94 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -211.232.0.0 KR KOR -211.240.0.0 KR KOR -193.194.4.0 MA MAR -139.20.112.104 DE DEU -139.20.112.3 DE DEU -145.236.125.211 HU HUN -149.225.169.61 DE DEU -151.17.191.46 IT ITA -151.24.176.194 IT ITA -151.25.8.136 IT ITA -151.26.146.192 IT ITA -151.26.153.66 IT ITA -151.26.167.71 IT ITA -151.26.35.204 IT ITA -151.26.64.157 IT ITA -151.27.138.182 IT ITA -151.28.39.114 IT ITA -151.29.150.217 IT ITA -151.29.237.39 IT ITA -151.29.73.189 IT ITA -151.30.134.242 IT ITA -151.30.135.85 IT ITA -151.30.168.224 IT ITA -151.35.80.202 IT ITA -151.35.80.240 IT ITA -151.36.191.229 IT ITA -151.38.70.94 IT ITA -151.38.92.126 IT ITA -151.42.100.132 IT ITA -151.42.169.71 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -195.142.49.205 TR TUR -202.247.74.18 JP JPN -202.247.74.71 JP JPN -202.247.74.81 JP JPN -202.247.74.88 JP JPN -203.242.239.188 KR KOR -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -202.53.254.193 ID IDN -12.168.0.0 US USA -12.169.0.0 US USA -12.200.0.0 US USA -203.121.0.8 MY MYS -203.20.231.1 AU AUS -203.87.98.29 AU AUS -203.181.121.150 JP JPN -202.166.127.246 SG SGP -62.188.202.242 GB GBR -12.12.197.23 US USA -12.12.199.3 US USA -12.12.200.79 US USA diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt deleted file mode 100644 index eb078a83..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt +++ /dev/null @@ -1,29 +0,0 @@ -212.118.5.94 JO -64.170.57.29 US -202.7.216.215 AU -212.33.164.149 SA -68.96.110.210 US -213.166.131.168 SA -64.158.191.179 US -24.247.251.23 US -203.199.228.66 IN -195.14.141.225 CY -200.52.94.98 MX -203.197.187.193 IN -203.128.9.170 PK -144.106.240.140 US -195.248.180.102 UA -213.1.0.118 GB -64.255.148.52 US -12.78.124.119 US -212.68.224.183 BE -62.148.73.85 PL -203.146.135.180 TH -209.204.179.145 US -64.123.0.164 US -202.56.198.16 IN -61.0.94.172 IN -62.42.171.190 ES -192.117.245.177 IL -213.123.75.243 GB -80.56.171.62 NL diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt deleted file mode 100644 index 366b2f26..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt +++ /dev/null @@ -1 +0,0 @@ -yahoo.com US diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt deleted file mode 100644 index 4df7ea79..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt +++ /dev/null @@ -1,24 +0,0 @@ -216.236.135.152 US USA -24.24.24.24 US USA -147.251.48.1 CZ CZE -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -134.102.101.18 DE DEU -193.75.148.28 BE BEL -194.244.83.2 IT ITA -203.15.106.23 AU AUS -196.31.1.1 ZA ZAF -151.28.39.114 IT ITA -151.38.70.94 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -211.232.0.0 KR KOR -211.240.0.0 KR KOR -193.194.4.0 MA MAR -139.20.112.104 DE DEU -139.20.112.3 DE DEU -145.236.125.211 HU HUN -yahoo.com US USA -amazon.com US USA -www.uspto.gov US USA diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c deleted file mode 100644 index d6c3afcd..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-asnum.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - char * org; - int generate = 0; - char host[50]; - - if (argc == 2) - if (!strcmp(argv[1],"gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPASNum.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("asnum_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening asnum_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_org_by_name (gi, (const char *)host); - - if (org != NULL) { - printf("%s\t%s\n", host, _mk_NA(org)); - } - } - - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c deleted file mode 100644 index 4a48fdea..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-city.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPCity.h" - - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int -main(int argc, char *argv[]) -{ - FILE *f; - GeoIP *gi; - GeoIPRecord *gir; - int generate = 0; - char host[50]; - const char *time_zone = NULL; - char **ret; - if (argc == 2) - if (!strcmp(argv[1], "gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPCity.dat", GEOIP_INDEX_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("city_test.txt", "r"); - - if (f == NULL) { - fprintf(stderr, "Error opening city_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - gir = GeoIP_record_by_name(gi, (const char *) host); - - if (gir != NULL) { - ret = GeoIP_range_by_ip(gi, (const char *) host); - time_zone = GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region); - printf("%s\t%s\t%s\t%s\t%s\t%s\t%f\t%f\t%d\t%d\t%s\t%s\t%s\n", host, - _mk_NA(gir->country_code), - _mk_NA(gir->region), - _mk_NA(GeoIP_region_name_by_code(gir->country_code, gir->region)), - _mk_NA(gir->city), - _mk_NA(gir->postal_code), - gir->latitude, - gir->longitude, - gir->metro_code, - gir->area_code, - _mk_NA(time_zone), - ret[0], - ret[1]); - GeoIP_range_by_ip_delete(ret); - GeoIPRecord_delete(gir); - } - } - GeoIP_delete(gi); - return 0; - -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c deleted file mode 100644 index d6212b86..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-isp.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - char * org; - int generate = 0; - char host[50]; - - if (argc == 2) - if (!strcmp(argv[1],"gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPISP.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("isp_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening isp_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_org_by_name (gi, (const char *)host); - - if (org != NULL) { - printf("%s\t%s\n", host, _mk_NA(org)); - free(org); - } - } - - fclose(f); - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c deleted file mode 100644 index 05def4e9..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-netspeed.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - int netspeed; - char host[50]; - - gi = GeoIP_open("../data/GeoIPNetSpeed.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("netspeed_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening netspeed_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - netspeed = GeoIP_id_by_name (gi, (const char *)host); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s\tUnknown\n", host); - } else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s\tDialup\n", host); - } else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s\tCable/DSL\n", host); - } else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s\tCorporate\n", host); - } - } - fclose(f); - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c deleted file mode 100644 index 74ba01be..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-org.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int -main(int argc, char *argv[]) -{ - FILE *f; - GeoIP *gi; - char *org; - int generate = 0; - char host[50]; - char **ret; - if (argc == 2) - if (!strcmp(argv[1], "gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPOrg.dat", GEOIP_INDEX_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("org_test.txt", "r"); - - if (f == NULL) { - fprintf(stderr, "Error opening org_test.txt\n"); - exit(1); - } - - printf("IP\torganization\tnetmask\tbeginIp\tendIp\n"); - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_name_by_name(gi, (const char *) host); - - if (org != NULL) { - ret = GeoIP_range_by_ip(gi, (const char *) host); - - printf("%s\t%s\t%d\t%s\t%s\n", host, _mk_NA(org), GeoIP_last_netmask(gi), ret[0], ret[1]); - GeoIP_range_by_ip_delete(ret); - free(org); - } - } - - fclose(f); - GeoIP_delete(gi); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c deleted file mode 100644 index 0be75177..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-region.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include /* For uint32_t */ -#ifdef HAVE_STDINT_H -#include /* For uint32_t */ -#endif -#if !defined(_WIN32) -#include /* For gethostbyname */ -#include /* For ntohl */ -#else -#include -#include -#endif -#include - -unsigned long inetaddr(const char * name) -{ - struct hostent * host; - struct in_addr inaddr; - - host = gethostbyname(name); assert(host); - inaddr.s_addr = *((uint32_t*)host->h_addr_list[0]); - return inaddr.s_addr; -} - -static const char * _mk_NA ( const char * p ){ - return p ? p : "N/A"; -} - -int main () { - GeoIP * gi; - GeoIPRegion * gir, giRegion; - - FILE *f; - char ipAddress[30]; - char expectedCountry[3]; - char expectedCountry3[4]; - const char * time_zone; - - gi = GeoIP_open("../data/GeoIPRegion.dat", GEOIP_MEMORY_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("region_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening region_test.txt\n"); - exit(1); - } - - gir = GeoIP_region_by_addr (gi, "10.0.0.0"); - if (gir != NULL) { - printf("lookup of private IP address: country = %s, region = %s\n", gir->country_code, gir->region); - } - - while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3 ) != EOF) { - printf("ip = %s\n",ipAddress); - - gir = GeoIP_region_by_name (gi, ipAddress); - time_zone = GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region); - if (gir != NULL) { - printf("%s, %s, %s, %s\n", - gir->country_code, - (!gir->region[0]) ? "N/A" : gir->region, - _mk_NA(GeoIP_region_name_by_code(gir->country_code, gir->region)), - _mk_NA(time_zone)); - } else { - printf("NULL!\n"); - } - - GeoIP_assign_region_by_inetaddr (gi, inetaddr(ipAddress), &giRegion); - if (gir != NULL) { - assert(giRegion.country_code[0]); - assert(!strcmp(gir->country_code, giRegion.country_code)); - if ( gir->region[0] ) { - assert(giRegion.region[0]); - assert(!strcmp(gir->region, giRegion.region)); - } else { - assert(!giRegion.region[0]); - } - } else { - assert(!giRegion.country_code[0]); - } - - if ( gir != NULL ) { - GeoIPRegion_delete(gir); - } - } - - GeoIP_delete(gi); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c deleted file mode 100644 index 4bb209e8..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip.c - * - * Copyright (C) 2006 MaxMind LLC - * - * 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -int main () { - FILE *f; - char ipAddress[30]; - char expectedCountry[3]; - char expectedCountry3[4]; - const char * returnedCountry; - GeoIP * gi; - int failed = 0; - int test_num = 1; - - int i; - for (i = 0; i < 2; ++i) { - if (0 == i) { - /* Read from filesystem, check for updated file */ - gi = GeoIP_open(SRCDIR"/data/GeoIP.dat", GEOIP_STANDARD | GEOIP_CHECK_CACHE); - } else { - /* Read from memory, faster but takes up more memory */ - gi = GeoIP_open(SRCDIR"/data/GeoIP.dat", GEOIP_MEMORY_CACHE); - } - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - /* make sure GeoIP deals with invalid query gracefully */ - returnedCountry = GeoIP_country_code_by_addr(gi,NULL); - if (returnedCountry != NULL) { - fprintf(stderr,"Invalid Query test failed, got non NULL, expected NULL\n"); - failed = 1; - } - - returnedCountry = GeoIP_country_code_by_name(gi,NULL); - if (returnedCountry != NULL) { - fprintf(stderr,"Invalid Query test failed, got non NULL, expected NULL\n"); - failed = 1; - } - - f = fopen(SRCDIR"/test/country_test.txt","r"); - - while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3) != EOF) { - returnedCountry = GeoIP_country_code_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test name %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code3_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry3) != 0) { - fprintf(stderr,"Test addr %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code3_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry3) != 0) { - fprintf(stderr,"Test name %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - fclose(f); - - f = fopen(SRCDIR"/test/country_test2.txt","r"); - while (fscanf(f, "%s%s", ipAddress, expectedCountry ) != EOF) { - returnedCountry = GeoIP_country_code_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - fclose(f); - - f = fopen(SRCDIR"/test/country_test_name.txt","r"); - while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) { - returnedCountry = GeoIP_country_code_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - - fclose(f); - GeoIP_delete(gi); - } - return failed; -} diff --git a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp b/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp deleted file mode 100644 index 430c8c4b..00000000 --- a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp +++ /dev/null @@ -1,827 +0,0 @@ -#include "ID3miniParsers.h" -#include "stl/stringUtils.h" -#include - -using namespace ID3V2; -using namespace uniString; -using namespace std; - -static const __uint8 E_LATIN1(0); -static const __uint8 E_UTF16(1); // with COM -static const __uint8 E_UTF16BE(2); // big endian no BOM -static const __uint8 E_UTF8(3); // utf8 - -void ID3V2::base64encode(const char *in,size_t siz,string &out) throw() -{ - char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int shift = 0; - int accum = 0; - - while (siz) - { - accum <<= 8; - shift += 8; - accum |= *in++; - siz--; - while ( shift >= 6 ) - { - shift -= 6; - out.push_back(alphabet[(accum >> shift) & 0x3F]); - } - } - if (shift == 4) - { - out.push_back(alphabet[(accum & 0xF)<<2]); - out.push_back('='); - } - else if (shift == 2) - { - out.push_back(alphabet[(accum & 0x3)<<4]); - out.push_back('='); - out.push_back('='); - } -} - -// way cool function. Given a hunk of data from an ID3V2 entry, break it into a collection -// of unicode strings based on a format string (sort of like sprintf for ID3V2 data) -vector ID3V2::extractor(const vector<__uint8> &data,const char *format) throw(exception) -{ - vector result; - - __uint8 encoding = E_LATIN1; - - int bytesRemaining = (int)data.size(); - vector<__uint8>::size_type offset = 0; - - const char *f = format; - while((*f) && (bytesRemaining > 0)) - { - switch(*f) - { - case ' ': break; // do nothing, just move to next - case 'e': // encoding - encoding = data[offset++]; - --bytesRemaining; - break; - - case 'c': // single digit code - { - __uint8 code = data[offset++]; - --bytesRemaining; - result.push_back(stringUtil::tos((int)code)); - } - break; - - case 'y': // dynamic counter - { - __uint64 counter = 0; - while(bytesRemaining > 0) - { - counter = counter << 8; - counter += data[offset]; - ++offset; - --bytesRemaining; - } - result.push_back(stringUtil::tos(counter)); - } - break; - - case 'u': // non-encoding string - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32; - u32.assignFromLatinExtended(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - break; - - case 's': // encoding string - { - if (encoding == E_LATIN1) - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32; - u32.assignFromLatinExtended(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF16) - { - const utf16::value_type *v16 = reinterpret_cast(&(data[offset])); - size_t slen = uniString::strlen(v16,bytesRemaining / 2); - utf32 u32(v16,slen); - offset += ((slen * 2) + 2); - bytesRemaining -= ((slen * 2) + 2); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF16BE) - { - const utf16::value_type *v16 = reinterpret_cast(&(data[offset])); - size_t slen = uniString::strlen(v16,bytesRemaining / 2); - utf32 u32(v16,slen,false); // assume big endian - offset += ((slen * 2) + 2); - bytesRemaining -= ((slen * 2) + 2); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF8) - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - else throw runtime_error("unknown encoding " + stringUtil::tos((int)encoding)); - } - break; - - case 'b': // binary data - { - string b64; - base64encode((const char *)&(data[offset]),bytesRemaining,b64); - result.push_back(b64); - offset += bytesRemaining; - bytesRemaining = 0; - } - break; - - case 'l': // three char language code - { - if (bytesRemaining < 3) throw runtime_error("not enough data"); - utf8 l; - bool bad = - (data[offset] < '0' || data[offset] > 'z' || - data[offset+1] < '0' || data[offset+1] > 'z' || - data[offset+2] < '0' || data[offset+2] > 'z'); - - l.push_back(data[offset++]); l.push_back(data[offset++]); l.push_back(data[offset++]); - bytesRemaining -= 3; - if (bad) - result.push_back(utf8()); - else - result.push_back(l); - } - break; - - case '+': - while(f > format && ((*f) == '+' || (*f) == ' ')) --f; - --f; - break; - } - ++f; - } - - while((!result.empty()) && (result.back().empty())) result.pop_back(); - return result; -} - -static const utf8 LT("<"); -static const utf8 GT(">"); -static const utf8 LTSLASH(" &slist,genreList_t &gl) throw(runtime_error) -{ - gl.clear(); - - static const int state_Initial = 0; - static const int state_LeadingParen = 1; - static const int state_Code = 2; - static const int state_Subgenre = 3; - int state = state_Initial; - - genreEntry e; - - for(vector::const_iterator li = slist.begin(); li != slist.end(); ++li) - { - for(utf8::const_iterator i = (*li).begin(); i != (*li).end(); ++i) - { - switch(state) - { - case state_Initial: - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - if (stringUtil::safe_is_space(*i)) {} - else if ((*i) == LPAREN) - { - state = state_LeadingParen; - } - else - { - state = state_Subgenre; - e.m_refinement += (*i); - } - break; - - case state_LeadingParen: - if ((*i) == LPAREN) - { - state = state_Subgenre; - e.m_refinement += (*i); - } - else if ((*i) == RPAREN) - { - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - state = state_Initial; - } - else - { - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - e.m_genreCode += (*i); - state = state_Code; - } - break; - - case state_Code: - if ((*i) == RPAREN) - { - state = state_Subgenre; - } - else - { - e.m_genreCode += *i; - } - break; - - case state_Subgenre: - if ((*i) == LPAREN) - { - state = state_LeadingParen; - } - else - { - e.m_refinement += (*i); - } - break; - - default: - throw logic_error(string(__FUNCTION__) + " internal error. Bad state"); - break; - } - } - - switch(state) - { - case state_Initial: - break; - - case state_LeadingParen: - throw runtime_error(string(__FUNCTION__) + " badly formed TCON data " + (*li).hideAsString()); - break; - - case state_Code: - throw runtime_error(string(__FUNCTION__) + " badly formed TCON data " + (*li).hideAsString()); - break; - - case state_Subgenre: - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - break; - - default: - throw logic_error(string(__FUNCTION__) + " internal error. Bad state"); - break; - } // character iteration - } // end string list iteration -} - -uniString::utf8 ID3V2::toXML(const utf8 &tag,const genreList_t &l) throw() -{ - utf8 result; - utf8 endTag = utf8(""); - - for(genreList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - result += LT + tag; - if (!(*i).m_genreCode.empty()) - result += utf8(" v1=\"") + (*i).m_genreCode.escapeXML() + utf8("\""); - result += GT + (*i).m_refinement.escapeXML() + endTag; - } - return result; -} - -uniString::utf8 ID3V2::toString(const genreList_t &l) throw() -{ - for(genreList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - if (!(*i).m_genreCode.empty()) return (*i).m_genreCode; - } - return uniString::utf8(); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const vector &s,stringList_t &l) throw() -{ - //l = stringUtil::tokenizer(s,(utf8::value_type)'/'); - l = s; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const stringList_t &l) throw() -{ - utf8 result; - utf8 startTag = LT + tag + GT; - utf8 endTag = LTSLASH + tag + GT; - for(stringList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - result += startTag + (*i).escapeXML() + endTag; - } - return result; -} - -uniString::utf8 ID3V2::toString(const stringList_t &l) throw() -{ - return (l.empty() ? uniString::utf8() : l.front()); -} - -///////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector &s,comment_t &c) throw() -{ - if (s.size() >= 3) - { - c.m_languageCode = s[0]; - c.m_id = s[1]; - c.m_comment = s[2]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const comment_t &c) throw() -{ - utf8 result; - result += LT + tag; - if (!c.m_languageCode.empty()) - result += utf8(" language=\"") + c.m_languageCode.escapeXML() + utf8("\""); - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_comment.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const comment_t &c) throw() -{ - return c.m_comment; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector &s,userUrl_t &c) throw() -{ - if (!s.empty()) - c.m_id = s[0]; - if (s.size() > 1) - c.m_url = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const userUrl_t &c) throw() -{ - if (c.m_id.empty() && c.m_url.empty()) return utf8(); - - utf8 result = LT + tag; - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_url.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const userUrl_t &c) throw() -{ return c.m_url; } - -///////////////////////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,userText_t &t) throw() -{ - if (!s.empty()) - t.m_id = s[0]; - if (s.size() > 1) - t.m_text = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const userText_t &t) throw() -{ - if (t.m_id.empty() && t.m_text.empty()) return utf8(); - - utf8 result = LT + tag; - if (!t.m_id.empty()) - result += utf8(" id=\"") + t.m_id.escapeXML() + utf8("\""); - result += GT + t.m_text.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const userText_t &t) throw() -{ return t.m_text; } - -///////////////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,popularimeter_t &p) throw() -{ - vector::size_type siz = s.size(); - - if (siz > 0) - p.m_email = s[0]; - if (siz > 1) - p.m_rating = s[1]; - if (siz > 2) - p.m_counter = s[2]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const popularimeter_t &p) throw() -{ - if (p.m_counter.empty() && p.m_email.empty() && p.m_rating.empty()) return utf8(); - - utf8 result = LT + tag + GT; - - result += LT + utf8("email") + GT; - result += p.m_email.escapeXML(); - result += LTSLASH + utf8("email") + GT; - - result += LT + utf8("rating") + GT; - result += p.m_rating.escapeXML(); - result += LTSLASH + utf8("rating") + GT; - - result += LT + utf8("counter") + GT; - result += p.m_counter.escapeXML(); - result += LTSLASH + utf8("counter") + GT; - - result += LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const popularimeter_t &p) throw() -{ return p.m_rating; } - -///////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector &s,unsyncLyrics_t &c) throw() -{ - if (s.size() >= 3) - { - c.m_languageCode = s[0]; - c.m_id = s[1]; - c.m_lyrics = s[2]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const unsyncLyrics_t &c) throw() -{ - if (c.m_lyrics.empty()) return utf8(); - - utf8 result; - result += LT + tag; - if (!c.m_languageCode.empty()) - result += utf8(" language=\"") + c.m_languageCode.escapeXML() + utf8("\""); - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_lyrics.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const unsyncLyrics_t &c) throw() -{ - return c.m_lyrics; -} - -///////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector &s,picture_t &p) throw() -{ - vector::size_type siz = s.size(); - if (siz > 0) p.m_mimeType = s[0]; - if (siz > 1) p.m_pictureType = s[1]; - if (siz > 2) p.m_id = s[2]; - if (siz > 3) p.m_pictureData = s[3]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const picture_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_mimeType.empty()) - result += utf8(" mime=\"") + p.m_mimeType.escapeXML() + utf8("\""); - if (!p.m_id.empty()) - result += utf8(" id=\"") + p.m_id.escapeXML() + utf8("\""); - if (!p.m_pictureType.empty()) - result += utf8(" type=\"") + p.m_pictureType.escapeXML() + utf8("\""); - result += GT + p.m_pictureData.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const picture_t &p) throw() -{ - return p.m_pictureData; -} - -//////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector &s,mcdi_t &m) throw() -{ - if (!s.empty()) m.m_cdTOC = s[0]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const mcdi_t &m) throw() -{ - utf8 result; - result += LT + tag; - result += GT + m.m_cdTOC.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const mcdi_t &m) throw() -{ return m.m_cdTOC; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,ufid_t &u) throw() -{ - vector::size_type siz = s.size(); - if (siz > 0) u.m_id = s[0]; - if (siz > 1) u.m_data = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const ufid_t &u) throw() -{ - utf8 result; - result += LT + tag; - if (!u.m_id.empty()) - result += utf8(" id=\"") + u.m_id.escapeXML() + utf8("\""); - result += GT + u.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const ufid_t &u) throw() -{ return u.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,part_t &p) throw() -{ - if (!s.empty()) - { - vector l = stringUtil::tokenizer(s[0],(utf8::value_type)'/'); - if (!l.empty()) p.m_part = l[0]; - if (l.size() > 1) p.m_total = l[1]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const part_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_total.empty()) - result += utf8(" total=\"") + p.m_total.escapeXML() + utf8("\""); - result += GT + p.m_part.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const part_t &p) throw() -{ return p.m_part; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,geob_t &g) throw() -{ - vector::size_type siz = s.size(); - if (siz > 0) g.m_mimeType = s[0]; - if (siz > 1) g.m_filename = s[1]; - if (siz > 2) g.m_id = s[2]; - if (siz > 3) g.m_data = s[3]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const geob_t &g) throw() -{ - utf8 result; - result += LT + tag; - if (!g.m_mimeType.empty()) - result += utf8(" mime=\"") + g.m_mimeType.escapeXML() + utf8("\""); - if (!g.m_id.empty()) - result += utf8(" id=\"") + g.m_id.escapeXML() + utf8("\""); - if (!g.m_filename.empty()) - result += utf8(" filename=\"") + g.m_filename.escapeXML() + utf8("\""); - result += GT + g.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const geob_t &g) throw() -{ return g.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,priv_t &p) throw() -{ - vector::size_type siz = s.size(); - if (siz > 0) p.m_id = s[0]; - if (siz > 1) p.m_data = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const priv_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_id.empty()) - result += utf8(" id=\"") + p.m_id.escapeXML() + utf8("\""); - result += GT + p.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const priv_t &p) throw() -{ return p.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector &s,timestamp_t &t) throw(runtime_error) -{ - if (s.empty()) return; - - static const int state_year = 0; - static const int state_month = 1; - static const int state_day = 2; - static const int state_hour = 3; - static const int state_minute = 4; - static const int state_second = 5; - - int state = state_year; - utf8 value; - for(utf8::const_iterator i = s[0].begin(); i != s[0].end(); ++i) - { - switch(state) - { - case state_year: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 4) throw runtime_error("Year has too many digits"); - } - else if ((*i) == '-') - { - if (value.size() != 4) throw runtime_error("Year has the wrong digit count"); - t.m_year = value; - value.clear(); - state = state_month; - } - else throw runtime_error("Unexpected character while processing year"); - break; - - case state_month: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Month has too many digits"); - } - else if ((*i) == '-') - { - if (value.empty()) throw runtime_error("No digits for month"); - t.m_month = value; - value.clear(); - state = state_day; - } - else throw runtime_error("Unexpected character while processing month"); - break; - - case state_day: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Day has too many digits"); - } - else if ((*i) == 'T') - { - if (value.empty()) throw runtime_error("No digits for day"); - t.m_day = value; - value.clear(); - state = state_hour; - } - else throw runtime_error("Unexpected character while processing day"); - break; - - case state_hour: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Hour has too many digits"); - } - else if ((*i) == ':') - { - if (value.empty()) throw runtime_error("No digits for hour"); - t.m_hour = value; - value.clear(); - state = state_minute; - } - else throw runtime_error("Unexpected character while processing hour"); - break; - - case state_minute: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Minute has too many digits"); - } - else if ((*i) == ':') - { - if (value.empty()) throw runtime_error("No digits for minute"); - t.m_minute = value; - value.clear(); - state = state_second; - } - else throw runtime_error("Unexpected character while processing minute"); - break; - - case state_second: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Second has too many digits"); - } - else throw runtime_error("Unexpected character while processing second"); - break; - - default: - throw runtime_error(string(__FUNCTION__) + " internal error. Unknown state"); - break; - } - } - - if (!value.empty()) - { - switch(state) - { - case state_year: - if (value.size() != 4) throw runtime_error("Wrong digit count for year"); - t.m_year = value; - break; - - case state_month: - if (value.size() > 2) throw runtime_error("Month has too many digits"); - t.m_month = value; - break; - - case state_day: - if (value.size() > 2) throw runtime_error("Day has too many digits"); - t.m_day = value; - break; - - case state_hour: - if (value.size() > 2) throw runtime_error("Hour has too many digits"); - t.m_hour = value; - break; - - case state_minute: - if (value.size() > 2) throw runtime_error("Minute has too many digits"); - t.m_minute = value; - break; - - case state_second: - if (value.size() > 2) throw runtime_error("Second has too many digits"); - t.m_second = value; - break; - - default: - throw runtime_error(string(__FUNCTION__) + " internal error. Unknown state"); - break; - } - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const timestamp_t &t) throw() -{ - utf8 result; - if (t.m_year.empty()) return result; - result += LT + tag + GT; - if (!t.m_year.empty()) result += LT + utf8("year") + GT + t.m_year.escapeXML() + LTSLASH + utf8("year") + GT; - if (!t.m_month.empty()) result += LT + utf8("month") + GT + t.m_month.escapeXML() + LTSLASH + utf8("month") + GT; - if (!t.m_day.empty()) result += LT + utf8("day") + GT + t.m_day.escapeXML() + LTSLASH + utf8("day") + GT; - if (!t.m_hour.empty()) result += LT + utf8("hour") + GT + t.m_hour.escapeXML() + LTSLASH + utf8("hour") + GT; - if (!t.m_minute.empty()) result += LT + utf8("minute") + GT + t.m_minute.escapeXML() + LTSLASH + utf8("minute") + GT; - if (!t.m_second.empty()) result += LT + utf8("second") + GT + t.m_second.escapeXML() + LTSLASH + utf8("second") + GT; - result += LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const timestamp_t &t) throw() -{ - utf8 result; - if (t.m_year.empty()) return result; - result += t.m_year; - if (t.m_month.empty()) return result; - result += utf8("-") + t.m_month; - if (t.m_day.empty()) return result; - result += utf8("-") + t.m_day; - if (t.m_hour.empty()) return result; - result += utf8("T") + t.m_hour; - if (t.m_minute.empty()) return result; - result += utf8(":") + t.m_minute; - if (t.m_second.empty()) return result; - result += utf8(":") + t.m_second; - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h b/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h deleted file mode 100644 index 263a5cda..00000000 --- a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef ID3miniParsers_H_ -#define ID3miniParsers_H_ - -#include "unicode/uniString.h" -#include -#include - -// parsers for complex ID3V2 fields (like genre) - -namespace ID3V2 -{ - void base64encode(const char *in,size_t siz,std::string &out) throw(); - - //////////////////// - /* Extracts strings based on a coded formatter - - e - single byte encoding. Will be used for all subsequence encoding based strings - u - non-encoded latin-1 string - s - encoded string - b - binary coded data to end of block - l - three char language code - c - single byte code - y - dynamic counter (value in popularimeter) - - modifiers: - - + - repeats to end of block - */ - - std::vector extractor(const std::vector<__uint8> &data,const char *format) throw(std::exception); - ////////////////////// - //// structs for various tag types - struct genreEntry - { - uniString::utf8 m_genreCode; - uniString::utf8 m_refinement; - }; - - struct comment_t - { - uniString::utf8 m_languageCode; - uniString::utf8 m_id; - uniString::utf8 m_comment; - }; - - struct userUrl_t - { - uniString::utf8 m_id; - uniString::utf8 m_url; - }; - - struct userText_t - { - uniString::utf8 m_id; - uniString::utf8 m_text; - }; - - struct popularimeter_t - { - uniString::utf8 m_email; - uniString::utf8 m_rating; - uniString::utf8 m_counter; - }; - - struct unsyncLyrics_t - { - uniString::utf8 m_languageCode; - uniString::utf8 m_id; - uniString::utf8 m_lyrics; - }; - - struct picture_t - { - uniString::utf8 m_mimeType; - uniString::utf8 m_pictureType; - uniString::utf8 m_id; - uniString::utf8 m_pictureData; - }; - - struct mcdi_t // CD TOC - { - uniString::utf8 m_cdTOC; - }; - - struct ufid_t // universal file id - { - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct part_t // TRCK or TPOS (ie 3/7) - { - uniString::utf8 m_part; - uniString::utf8 m_total; - }; - - struct geob_t // general encapsulated object - { - uniString::utf8 m_mimeType; - uniString::utf8 m_filename; - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct priv_t // private frame - { - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct timestamp_t - { - uniString::utf8 m_year; - uniString::utf8 m_month; - uniString::utf8 m_day; - uniString::utf8 m_hour; - uniString::utf8 m_minute; - uniString::utf8 m_second; - }; - - typedef std::vector genreList_t; - typedef std::vector stringList_t; - typedef uniString::utf8 string_t; - - // parser and extractor overloads for the various data types - ///// - void fromStringList(const std::vector &s,genreList_t &l) throw(std::runtime_error); - uniString::utf8 toXML(const uniString::utf8 &tag,const genreList_t &l) throw(); - uniString::utf8 toString(const genreList_t &l) throw(); - - void fromStringList(const std::vector &s,stringList_t &l) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const stringList_t &l) throw(); - uniString::utf8 toString(const stringList_t &l) throw(); - - void fromStringList(const std::vector &s,comment_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const comment_t &c) throw(); - uniString::utf8 toString(const comment_t &c) throw(); - - void fromStringList(const std::vector &s,userUrl_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const userUrl_t &c) throw(); - uniString::utf8 toString(const userUrl_t &c) throw(); - - void fromStringList(const std::vector &s,userText_t &t) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const userText_t &t) throw(); - uniString::utf8 toString(const userText_t &t) throw(); - - void fromStringList(const std::vector &s,popularimeter_t &p) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const popularimeter_t &p) throw(); - uniString::utf8 toString(const popularimeter_t &p) throw(); - - void fromStringList(const std::vector &s,unsyncLyrics_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const unsyncLyrics_t &c) throw(); - uniString::utf8 toString(const unsyncLyrics_t &c) throw(); - - void fromStringList(const std::vector &s,picture_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const picture_t &c) throw(); - uniString::utf8 toString(const picture_t &c) throw(); - - void fromStringList(const std::vector &s,mcdi_t &m) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const mcdi_t &m) throw(); - uniString::utf8 toString(const mcdi_t &m) throw(); - - void fromStringList(const std::vector &s,ufid_t &u) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const ufid_t &u) throw(); - uniString::utf8 toString(const ufid_t &u) throw(); - - void fromStringList(const std::vector &s,part_t &u) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const part_t &u) throw(); - uniString::utf8 toString(const part_t &u) throw(); - - void fromStringList(const std::vector &s,geob_t &g) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const geob_t &g) throw(); - uniString::utf8 toString(const geob_t &g) throw(); - - void fromStringList(const std::vector &s,priv_t &p) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const priv_t &p) throw(); - uniString::utf8 toString(const priv_t &p) throw(); - - void fromStringList(const std::vector &s,timestamp_t &t) throw(std::runtime_error); - uniString::utf8 toXML(const uniString::utf8 &tag,const timestamp_t &t) throw(); - uniString::utf8 toString(const timestamp_t &t) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/MP3Header.cpp b/Src/Plugins/DSP/sc_serv3/MP3Header.cpp deleted file mode 100644 index 5ac4a465..00000000 --- a/Src/Plugins/DSP/sc_serv3/MP3Header.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include "MP3Header.h" -#include "global.h" -#include "nmrCommon/stl/stringUtils.h" -#include "nmrCommon/services/stdServiceImpl.h" -#include "nmrCommon/unicode/uniString.h" - -const __uint32 make28BitValue(const __uint8 buf[4]) -{ - return ((((__uint32)buf[0]) << 21) | - (((__uint32)buf[1]) << 14) | - (((__uint32)buf[2]) << 7) | - (((__uint32)buf[3]))); -} - -// Bitrates - use [version][layer][bitrate] -const __uint16 mpeg_bitrates[4][4][16] = { - { // Version 2.5 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 - }, - { // Reserved - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Invalid - }, - { // Version 2 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 - }, - { // Version 1 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2 - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1 - } -}; - -// Sample rates - use [version][srate] -const __uint16 mpeg_srates[4][4] = { - { 11025, 12000, 8000, 0 }, // MPEG 2.5 - { 0, 0, 0, 0 }, // Reserved - { 22050, 24000, 16000, 0 }, // MPEG 2 - { 44100, 48000, 32000, 0 } // MPEG 1 -}; - -// Samples per frame - use [version][layer] -const __uint16 mpeg_frame_samples[4][4] = { -// Rsvd 3 2 1 < Layer v Version - { 0, 576, 1152, 384 }, // 2.5 - { 0, 0, 0, 0 }, // Reserved - { 0, 576, 1152, 384 }, // 2 - { 0, 1152, 1152, 384 } // 1 -}; - -// Slot size (MPEG unit of measurement) - use [layer] -const __uint8 mpeg_slot_size[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1 - -const char *MP3_FrameInfo::getLayerName() const -{ - switch (m_layer) - { - case 1: return "3"; - case 2: return "2"; - case 3: return "1"; - } - return "unknown layer"; -} - -const char *MP3_FrameInfo::getVersionName() const -{ - switch (m_version) - { - case 0: return "v2.5"; - case 2: return "v2"; - case 3: return "v1"; - } - return "unknown version"; -} - -int getMP3FrameSize (MP3_FrameInfo &info, const unsigned char *hdr, unsigned int len) -{ - if (len < 4) - return 0; - int samples = mpeg_frame_samples[info.m_version][info.m_layer]; - if (samples == 0) - return -1; - int bitrate = mpeg_bitrates [info.m_version] [info.m_layer] [((hdr[2] & 0xf0) >> 4)]; - if (bitrate == 0) - return -1; - info.m_bitrate = bitrate; - info.m_samples = samples; - - return (int)(((float)(samples / 8.0) * (float)bitrate * 1000) / - (float)info.m_samplerate) + (((hdr[2] & 0x02) >> 1) ? mpeg_slot_size[info.m_layer] : 0); -} - -const int getMP3FrameInfo(const char *hdr, unsigned int *samplerate, int *bitrate, bool *mono) -{ - // Quick validity check - if ( ( ((unsigned char)hdr[0] & 0xFF) != 0xFF) - || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0) // 3 sync bits - || ( ((unsigned char)hdr[1] & 0x18) == 0x08) // Version rsvd - || ( ((unsigned char)hdr[1] & 0x06) == 0x00) // Layer rsvd - || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0) // Bitrate rsvd - ) return 0; - - // Data to be extracted from the header - __uint8 ver = (hdr[1] & 0x18) >> 3; // Version index - __uint8 lyr = (hdr[1] & 0x06) >> 1; // Layer index - //__uint8 pad = (hdr[2] & 0x02) >> 1; // Padding? 0/1 - //__uint8 brx = (hdr[2] & 0xf0) >> 4; // Bitrate index - __uint8 srx = (hdr[2] & 0x0c) >> 2; // SampRate index - - if (mono) - { - *mono = (((hdr[3] >> 6) & 3) == 0x3); // Channel mode - } - - // Lookup real values of these fields - *samplerate = mpeg_srates[ver][srx]; - *bitrate = mpeg_bitrates[ver][lyr][((hdr[2] & 0xf0) >> 4)]; - //__uint16 samples = mpeg_frame_samples[ver][lyr]; - //__uint8 slot_size = mpeg_slot_size[lyr]; - - // Frame sizes are truncated integers - return (__uint16)(((float)(mpeg_frame_samples[ver][lyr] / 8.0) * - (float)*bitrate * 1000) / (float)mpeg_srates[ver][srx]) + - (((hdr[2] & 0x02) >> 1) ? mpeg_slot_size[lyr] : 0); -} - - -const int getMP3FrameInfo (const unsigned char *hdr, unsigned int len, MP3_FrameInfo &info) -{ - // Quick validity check - if ( len < 4 - || ( ((unsigned char)hdr[0] & 0xFF) != 0xFF) - || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0) // 3 sync bits - || ( ((unsigned char)hdr[1] & 0x18) == 0x08) // Version rsvd - || ( ((unsigned char)hdr[1] & 0x06) == 0x00) // Layer rsvd - || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0) // Bitrate rsvd - ) return -1; - - // Data to be extracted from the header - __uint8 ver = (hdr[1] & 0x18) >> 3; // Version index - __uint8 lyr = (hdr[1] & 0x06) >> 1; // Layer index - __uint8 srx = (hdr[2] & 0x0c) >> 2; // SampRate index - - do - { - // Lookup real values of these fields - unsigned int samplerate = mpeg_srates [ver][srx]; - if (samplerate == 0) - break; - - int bitrate = mpeg_bitrates [ver][lyr][((hdr[2] & 0xf0) >> 4)]; - if (bitrate == 0) - break; - info.m_bitrate = bitrate; - // the following are not supposed to change - info.m_samplerate = samplerate; - info.m_mono = (((hdr[3] >> 6) & 3) == 0x3); // Channel mode - info.m_layer = lyr; // Layer index - info.m_version = ver; - if (info.m_pattern == 0) - info.m_pattern = (unsigned long)(hdr[0]<<24 | (hdr[1]<<16) | (hdr[2]<<8) | hdr[0]) & info.m_mask; - - // DLOG (uniString::utf8("MPEG ") + info.getVersionName() + " layer " + info.getLayerName() + (info.m_mono ? " mono (" : " stereo (") + stringUtil::tos(bitrate) + "k)"); - - return getMP3FrameSize (info, hdr, 4); - } while (0); - return -1; -} - -int MP3_FrameInfo::verifyFrame (const unsigned char *buf, unsigned int len) -{ - if (len > 4) - { - unsigned long v = (unsigned long)(buf[0])<<24 | (buf[1]<<16) | (buf[2]<<8) | buf[0]; - - if ((v & m_mask) == m_pattern) - { -#if 0 - if (len > 40) - { - unsigned char str[6] = "LAME"; - int i; - for (i=0; i < 5 && buf[36+i] == str[i]; i++) - ; - if (str[i] == '\0') DLOG ("LAME header found"); - } -#endif - return getMP3FrameSize (*this, buf, len); - } - // DLOG ("MPG: mask is " + stringUtil::tos(v&m_mask) + ", patt " + stringUtil::tos(m_pattern)); - return -1; - } - return 0; -} - -MP3_FrameInfo::MP3_FrameInfo (unsigned long value) : parserInfo (0xFFFE0000, value) -{ - m_description = "MPEG "; -} - -MP3_FrameInfo::MP3_FrameInfo(const unsigned char *p, unsigned int len) : parserInfo() -{ - m_mask = 0xFFFE0000; - m_description = "MPEG "; - getMP3FrameInfo (p, len, *this); -} - diff --git a/Src/Plugins/DSP/sc_serv3/MP3Header.h b/Src/Plugins/DSP/sc_serv3/MP3Header.h deleted file mode 100644 index d1fbe704..00000000 --- a/Src/Plugins/DSP/sc_serv3/MP3Header.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#ifndef _MP3_HEADER_H -#define _MP3_HEADER_H - -#include "nmrCommon/intTypes.h" -#include -#include "global.h" -#include "uvox2Common.h" - - -struct MP3_FrameInfo : public parserInfo -{ - bool m_mono; - int m_layer; - int m_samples; - - int verifyFrame (const unsigned char *buf, unsigned int len); - - MP3_FrameInfo (unsigned long value = 0); - MP3_FrameInfo (const unsigned char *p, unsigned int len); - - const char *getLayerName() const; - const char *getVersionName() const; - int getUvoxType() { return MP3_DATA; } -}; - - -const __uint32 make28BitValue(const __uint8 buf[4]); -const int getMP3FrameInfo(const char *hdr, unsigned int *samplerate, int *bitrate, bool *mono = 0); -const int getMP3FrameInfo (const unsigned char *hdr, unsigned int len, MP3_FrameInfo &info); -int getMP3FrameSize (MP3_FrameInfo &info, const unsigned char *hdr, unsigned int len); - - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/MSG00001.bin b/Src/Plugins/DSP/sc_serv3/MSG00001.bin deleted file mode 100644 index a528a83b86febcd25e060d0558b10e08070bfc2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32 hcmZQ%U|?WmU^oE60zkF^kf+LE$iU0M1>`X>001eB0ulfK diff --git a/Src/Plugins/DSP/sc_serv3/adminList.cpp b/Src/Plugins/DSP/sc_serv3/adminList.cpp deleted file mode 100644 index 547a2176..00000000 --- a/Src/Plugins/DSP/sc_serv3/adminList.cpp +++ /dev/null @@ -1,303 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -#include -#include -#include "adminList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[ADMINCGI] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -adminList g_adminList; - -class adminList::impl -{ -private: - struct adminEntry: public admin_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - explicit adminEntry(const utf8 &numericIP) throw() : admin_t(numericIP), m_ip(stringToIP(numericIP, m_hostIP)) {} - adminEntry() throw() : m_ip(0) {} - }; - - AOL_namespace::mutex m_lock; - list m_list; - -public: - bool load(const uniFile::filenameType &fn) throw(exception) - { - if (fn.empty()) - { - throwEx(LOGNAME "No admin access file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read admin access file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - adminEntry e(stripWhitespace(s)); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of admin access list has been ignored (bad IP)"); - } - else - { - if (this->find(e.m_numericIP,false) < 1) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - if (count > 0) - { - ILOG(LOGNAME "Enabled " + tos(count) + " IP" + - (count != 1 ? "'s" : "") + " from admin access file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "No IPs read from admin access file"); - } - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " IP" + - (count != 1 ? "'s" : "") + " from admin access file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - bool add(const utf8 &ipAddr, const bool soft) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - adminEntry e(ipAddr); - if (!e.validIP()) - { - if (!soft) - { - throwEx(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - else - { - return false; - } - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for ( list::iterator i = m_list.begin(); i != m_list.end(); ++i ) - { - if ( ( allStream || ( ( !allStream && ( ( *i ).m_numericIP == ipAddr ) ) || ( ( *i ).m_hostIP == ipAddr ) ) ) ) - { - m_list.erase( i ); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, allStream, true, false); - } - } - - return false; - } - - // 1 if found, 0 if not, -1 if empty (assume allowed) - int find(const utf8 &ipAddr, const bool use_lock=true) throw() - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((ipAddr == (*i).m_numericIP) || (ipAddr == (*i).m_hostIP)) - { - return 1; - } - } - return 0; - } - return -1; - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -adminList::adminList():m_impl(0) -{ - m_impl = new adminList::impl; -} - -adminList::~adminList() throw() -{ - forget(m_impl); -} - -bool adminList::load(const uniFile::filenameType &fn) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool adminList::add(const utf8 &ipAddr, const bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, soft); -} - -// true if removed -bool adminList::remove(const utf8 &ipAddr, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, allStream); -} - -// 1 if found, 0 if not, -1 if empty (assume allowed) -int adminList::find(const utf8 &ipAddr) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr); -} diff --git a/Src/Plugins/DSP/sc_serv3/adminList.h b/Src/Plugins/DSP/sc_serv3/adminList.h deleted file mode 100644 index 32645f76..00000000 --- a/Src/Plugins/DSP/sc_serv3/adminList.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#ifndef adminList_H_ -#define adminList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of reserved IPs -// these are remote addresses that must always be allowed in no matter what. - -class adminList -{ -private: - class impl; - impl *m_impl; - -public: - struct admin_t - { - uniString::utf8 m_numericIP; - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - - explicit admin_t(const uniString::utf8 &numericIP) throw() : m_numericIP(numericIP) {} - admin_t() throw() {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const bool allStream) throw(); - // 1 if found, 0 if not, -1 if empty (assume allowed) - int find(const uniString::utf8 &ipAddr) throw(); - - bool load(const uniFile::filenameType &fn) throw(); - - adminList(); - ~adminList() throw(); -}; - -extern adminList g_adminList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/agentList.cpp b/Src/Plugins/DSP/sc_serv3/agentList.cpp deleted file mode 100644 index 28202f33..00000000 --- a/Src/Plugins/DSP/sc_serv3/agentList.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include -#include -#include "agentList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include "macros.h" -#include - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[AGENT] " - -agentList g_agentList; - -class agentList::impl -{ -private: - struct agentEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct agentEntry: public agent_t - { - void save(agentEntrySave entrySave) throw(exception) - { - if(m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_agent + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " agent file"); - } - } - } - - agentEntry(const utf8 &agent, const size_t stream_ID) throw() : agent_t(agent, stream_ID) {} - agentEntry() throw() {} - }; - - AOL_namespace::mutex m_lock; - list m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read agent file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - s = &(buffer[3]); - else - s = buffer; - - if (stripWhitespace(s).empty()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list has been ignored"); - } - else - { - agentEntry e(stripWhitespace(s),stream_ID); - if(this->find(e.m_agent,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - ILOG(LOGNAME "Loaded " + tos(count) + " blocked user agents" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " blocked user agents" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn,size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " agent file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - agentEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&agentEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if(!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &agent, const size_t stream_ID, const bool soft) throw(exception) - { - if (agent.empty()) - { - if (!soft) throwEx(LOGNAME "Empty User Agent specified"); - else return false; - } - - agentEntry e(agent,stream_ID); - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - - // true if removed - bool remove(const utf8 &agent, const size_t stream_ID, const bool allStream) throw() - { - stackLock sml(m_lock); - - for (list::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (allStream || (((!allStream && ((*i).m_agent == agent))) && ((*i).m_stream_ID == stream_ID))) - { - m_list.erase(i); - return true; - } - } - - return false; - } - - // true if found - bool find(const utf8 &agent, size_t stream_ID, bool use_lock = true) throw() - { - if(use_lock) - { - stackLock sml(m_lock); - } - - if(!m_list.empty()) - { - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && (agent == (*i).m_agent)) - { - return true; - } - } - } - - return false; - } - - void get(std::vector &rl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - rl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -agentList::agentList():m_impl(0) -{ - m_impl = new agentList::impl; -} - -agentList::~agentList() throw() -{ - forget(m_impl); -} - -bool agentList::load(const uniFile::filenameType &fn,size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool agentList::save(const uniFile::filenameType &fn,size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool agentList::add(const utf8 &agent, const size_t stream_ID, bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(agent,stream_ID,soft); -} - -// true if removed -bool agentList::remove(const utf8 &agent, const size_t stream_ID, bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(agent,stream_ID,allStream); -} - -// true if found -bool agentList::find(const utf8 &agent, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(agent, stream_ID); -} - -void agentList::get(vector &bl,size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl,stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/agentList.h b/Src/Plugins/DSP/sc_serv3/agentList.h deleted file mode 100644 index 87b1861d..00000000 --- a/Src/Plugins/DSP/sc_serv3/agentList.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#ifndef agentList_H_ -#define agentList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of blocked user agents - -class agentList -{ -private: - class impl; - impl *m_impl; - -public: - struct agent_t - { - uniString::utf8 m_agent; // used to hold the user agent to not allow - size_t m_stream_ID; // used to differentiate - - agent_t(const uniString::utf8 &agent, const size_t stream_ID) throw() : m_agent(agent), m_stream_ID(stream_ID) {} - agent_t() throw() : m_stream_ID(0) {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &agent, const size_t stream_ID, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &agent, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &agent, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - agentList(); - ~agentList() throw(); - - // for web administration reference - void get(std::vector &rl, const size_t stream_ID) throw(); -}; - -extern agentList g_agentList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/amf.cpp b/Src/Plugins/DSP/sc_serv3/amf.cpp deleted file mode 100644 index bb7adddb..00000000 --- a/Src/Plugins/DSP/sc_serv3/amf.cpp +++ /dev/null @@ -1,759 +0,0 @@ -#if 0 -#include "amf.h" -#include "global.h" - -#define DEBUG_LOG(x) { if (gOptions.RTMPClientDebug()) DLOG((x)); } - -#ifndef _WIN32 -#include -#endif - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#ifdef _WIN32 -// Windows is little endian only -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER - -typedef unsigned char uint8_t; - -#else /* !_WIN32 */ - -#include - -#if defined(BYTE_ORDER) && !defined(__BYTE_ORDER) -#define __BYTE_ORDER BYTE_ORDER -#endif - -#if defined(BIG_ENDIAN) && !defined(__BIG_ENDIAN) -#define __BIG_ENDIAN BIG_ENDIAN -#endif - -#if defined(LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN) -#define __LITTLE_ENDIAN LITTLE_ENDIAN -#endif - -#endif /* !_WIN32 */ - -// define default endianness -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif - -#ifndef __BIG_ENDIAN -#define __BIG_ENDIAN 4321 -#endif - -#ifndef __BYTE_ORDER -#warning "Byte order not defined on your system, assuming little endian!" -#define __BYTE_ORDER __LITTLE_ENDIAN -#endif - -// ok, we assume to have the same float word order and byte order if float word order is not defined -#ifndef __FLOAT_WORD_ORDER -//#warning "Float word order not defined, assuming the same as byte order!" -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#if !defined(__BYTE_ORDER) || !defined(__FLOAT_WORD_ORDER) -#error "Undefined byte or float word order!" -#endif - -#if __FLOAT_WORD_ORDER != __BIG_ENDIAN && __FLOAT_WORD_ORDER != __LITTLE_ENDIAN -#error "Unknown/unsupported float word order!" -#endif - -#if __BYTE_ORDER != __BIG_ENDIAN && __BYTE_ORDER != __LITTLE_ENDIAN -#error "Unknown/unsupported byte order!" -#endif - -static double -AMF0_DecodeNumber(const char *data) -{ - double dVal; -#if __FLOAT_WORD_ORDER == __BYTE_ORDER -#if __BYTE_ORDER == __BIG_ENDIAN - memcpy(&dVal, data, 8); -#elif __BYTE_ORDER == __LITTLE_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[7]; - co[1] = ci[6]; - co[2] = ci[5]; - co[3] = ci[4]; - co[4] = ci[3]; - co[5] = ci[2]; - co[6] = ci[1]; - co[7] = ci[0]; -#endif -#else -#if __BYTE_ORDER == __LITTLE_ENDIAN // __FLOAT_WORD_ORER == __BIG_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[3]; - co[1] = ci[2]; - co[2] = ci[1]; - co[3] = ci[0]; - co[4] = ci[7]; - co[5] = ci[6]; - co[6] = ci[5]; - co[7] = ci[4]; -#else // __BYTE_ORDER == __BIG_ENDIAN && __FLOAT_WORD_ORER == __LITTLE_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[4]; - co[1] = ci[5]; - co[2] = ci[6]; - co[3] = ci[7]; - co[4] = ci[0]; - co[5] = ci[1]; - co[6] = ci[2]; - co[7] = ci[3]; -#endif -#endif - return dVal; -} - -char * -AMF0_EncodeNumber(char *output, char *outend, double dVal) -{ - if (output+8 > outend) - return NULL; - -// *output++ = AMF_NUMBER; // type: Number - -#if __FLOAT_WORD_ORDER == __BYTE_ORDER -#if __BYTE_ORDER == __BIG_ENDIAN - memcpy(output, &dVal, 8); -#elif __BYTE_ORDER == __LITTLE_ENDIAN - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[7]; - co[1] = ci[6]; - co[2] = ci[5]; - co[3] = ci[4]; - co[4] = ci[3]; - co[5] = ci[2]; - co[6] = ci[1]; - co[7] = ci[0]; - } -#endif -#else -#if __BYTE_ORDER == __LITTLE_ENDIAN /* __FLOAT_WORD_ORER == __BIG_ENDIAN */ - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[3]; - co[1] = ci[2]; - co[2] = ci[1]; - co[3] = ci[0]; - co[4] = ci[7]; - co[5] = ci[6]; - co[6] = ci[5]; - co[7] = ci[4]; - } -#else /* __BYTE_ORDER == __BIG_ENDIAN && __FLOAT_WORD_ORER == __LITTLE_ENDIAN */ - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[4]; - co[1] = ci[5]; - co[2] = ci[6]; - co[3] = ci[7]; - co[4] = ci[0]; - co[5] = ci[1]; - co[6] = ci[2]; - co[7] = ci[3]; - } -#endif -#endif - return output+8; -} - -static void serialize(vector<__uint8> &s,const utf8 &v,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not yet implemented - __uint16 slen = (__uint16)v.length(); - slen = htons(slen); - s.insert(s.end(),(const char *)&slen,((const char *)&slen) + 2); - s.insert(s.end(),v.begin(),v.end()); -} - -///////////////////////////////////////////////////////////////////////////////////////////////// - -AMFObject::AMFObject() throw() {} - -AMFObject::~AMFObject() throw() -{ - clearProperties(); -} - -AMFObject::AMFObject(const AMFObject &obj) throw() -{ - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } -} - -AMFObject& AMFObject::operator=(const AMFObject &obj) throw() -{ - clearProperties(); - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } - return *this; -} - -void AMFObject::clearProperties() throw() -{ - for(propertyMap_t::iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - delete (*i).second; - } - m_properties.clear(); -} - -// add property. Takes possession of value "v" -// throws if value already exists -void AMFObject::addProperty(const utf8 &key,AMFVal *v) throw(exception) -{ - assert(v); - assert(m_properties.find(key) == m_properties.end()); - - if (m_properties.find(key) != m_properties.end()) - throwEx(string(__FUNCTION__) + " property " + key + " already exists"); - if (!v) - throwEx(string(__FUNCTION__) + " value is null."); - - m_properties[key] = v; -} - -const AMFVal* AMFObject::getProperty(const uniString::utf8 &key) const throw() -{ - propertyMap_t::const_iterator i = m_properties.find(key); - if (i == m_properties.end()) return 0; - return (*i).second; -} - -utf8 AMFObject::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - utf8 result; - result += tabs + "{" + eol(); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - result += tabs + "\t" + (*i).first + ": "; - result += (*i).second->prettyPrint(mode,tabs + "\t"); - result += eol(); - } - - result += tabs + "}"; - return result; -} - -void AMFObject::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - assert(mode == 0); // AMF3 not yet implemented - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - ::serialize(s,(*i).first,mode,logMsgPrefix); - (*i).second->serialize(s,mode,logMsgPrefix); - } - s.push_back(0); - s.push_back(0); - s.push_back(AMF0_object_end_marker); -} - -void AMFObject::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not implemented yet - propertyMap_t pmap; - - AMFVal *val = 0; - try - { - while(true) - { - if (bitstreamLen < 3) throwEx(logMsgPrefix + " Insufficient data for AMF0 object marker."); - if (bitstream[0] == 0 && bitstream[1] == 0 && bitstream[2] == 9) - { - // end of object - bitstream += 3; - bitstreamLen -= 3; - break; - } - if (bitstream[0] == 0 && bitstream[1] == 0) throwEx(logMsgPrefix + " AMF0 object has null string keyed property"); - if (bitstreamLen < 4) throwEx(logMsgPrefix + " Insufficient data for AMF0 object marker."); - - // alright, we've taken care of the abberant cases and end-of-object. Now let's get a property - int slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx(logMsgPrefix + " Insufficient data for AMF0 object property key."); - utf8 key(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - assert(!val); - val = new AMFVal; - val->loadFromBitstream(bitstream,bitstreamLen,mode,logMsgPrefix); - pmap[key] = val; - val = 0; - } - - clearProperties(); - m_properties = pmap; - } - catch(...) - { - delete val; - throw; - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////// - -AMFEMCAArray::AMFEMCAArray() throw() {} - -AMFEMCAArray::~AMFEMCAArray() throw() -{ - clearProperties(); -} - -AMFEMCAArray::AMFEMCAArray(const AMFEMCAArray &obj) throw() -{ - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } -} - -AMFEMCAArray& AMFEMCAArray::operator=(const AMFEMCAArray &obj) throw() -{ - clearProperties(); - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } - return *this; -} - -void AMFEMCAArray::clearProperties() throw() -{ - for(propertyMap_t::iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - delete (*i).second; - } - m_properties.clear(); -} - -// add property. Takes possession of value "v" -// throws if value already exists -void AMFEMCAArray::addProperty(const utf8 &key,AMFVal *v) throw(exception) -{ - assert(v); - assert(m_properties.find(key) == m_properties.end()); - - if (m_properties.find(key) != m_properties.end()) - throwEx(string(__FUNCTION__) + " property " + key + " already exists"); - if (!v) - throwEx(string(__FUNCTION__) + " value is null."); - - m_properties[key] = v; -} - -const AMFVal* AMFEMCAArray::getProperty(const uniString::utf8 &key) const throw() -{ - propertyMap_t::const_iterator i = m_properties.find(key); - if (i == m_properties.end()) return 0; - return (*i).second; -} - -utf8 AMFEMCAArray::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - utf8 result; - result += tabs + "{" + eol(); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - result += tabs + "\t" + (*i).first + ": "; - result += (*i).second->prettyPrint(mode,tabs + "\t"); - result += eol(); - } - - result += tabs + "}"; - return result; -} - -void AMFEMCAArray::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - assert(mode == 0); // amf3 not implemented - // wowza seems to always just use zero as array length - s.push_back(0); s.push_back(0); s.push_back(0); s.push_back(0); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - ::serialize(s,(*i).first,mode,logMsgPrefix); - (*i).second->serialize(s,mode,logMsgPrefix); - } - s.push_back(0); - s.push_back(0); - s.push_back(AMF0_object_end_marker); -} - -void AMFEMCAArray::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not implemented yet - propertyMap_t pmap; - - AMFVal *val = 0; - try - { - if (bitstreamLen < 7) throwEx(logMsgPrefix + " Insufficient data for AMF0 ECMA array type."); - - // skip length - bitstream += 4; - bitstreamLen -= 4; - - while(true) - { - if (bitstreamLen < 3) throwEx(logMsgPrefix + " Insufficient data for ECMA array type."); - if (bitstream[0] == 0 && bitstream[1] == 0 && bitstream[2] == 9) - { - // end of object - bitstream += 3; - bitstreamLen -= 3; - break; - } - if (bitstream[0] == 0 && bitstream[1] == 0) throwEx(logMsgPrefix + " AMF0 ECMA array type has null string keyed property"); - if (bitstreamLen < 4) throwEx(logMsgPrefix + " Insufficient data for AMF0 ECMA array type."); - - // alright, we've taken care of the abberant cases and end-of-object. Now let's get a property - int slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx(logMsgPrefix + " Insufficient data for AMF0 ECMA array type property key."); - utf8 key(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - assert(!val); - val = new AMFVal; - val->loadFromBitstream(bitstream,bitstreamLen,mode,logMsgPrefix); - pmap[key] = val; - val = 0; - } - - clearProperties(); - m_properties = pmap; - } - catch(...) - { - delete val; - throw; - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const uniString::utf8 & AMFVal::getString() const throw(std::exception) -{ - if (m_type3 == AMF3_string_marker) return m_string_val; - if (m_type0 != AMF0_string_marker) throwEx("AMFVal type error. Wanted string but type is " + tos(m_type0)); - return m_string_val; -} - -int AMFVal::getInteger() const throw(std::exception) -{ - if (m_type3 != AMF3_integer_marker) throwEx("AMFVal type error. Wanted integer but type is " + tos(m_type3)); - return m_integer_val; -} - -double AMFVal::getNumber() const throw(std::exception) -{ - if (m_type3 == AMF3_double_marker) return m_number_val; - if (m_type0 != AMF0_number_marker) throwEx("AMFVal type error. Wanted number but type is " + tos(m_type0)); - return m_number_val; -} - -bool AMFVal::getBool() const throw(std::exception) -{ - if (m_type3 == AMF3_true_marker) return true; - if (m_type3 == AMF3_false_marker) return false; - if (m_type0 != AMF0_boolean_marker) throwEx("AMFVal type error. Wanted boolean but type is " + tos(m_type0)); - return m_boolean_val; -} - -const AMFObject& AMFVal::getObject() const throw(std::exception) -{ - if (m_type3 == AMF3_object_marker) return m_object_val; - if (m_type0 != AMF0_object_marker) throwEx("AMFVal type error. Wanted object but type is " + tos(m_type0)); - return m_object_val; -} - -void AMFVal::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - s.push_back(mode == 3 ? (__uint8)m_type3 : (__uint8)m_type0); - if (mode == 3) - { - switch(m_type3) - { - case AMF3_double_marker: - { - __uint8 buf[8] = {0}; - AMF0_EncodeNumber((char *)buf,(char *)buf+8,m_number_val); - s.insert(s.end(),buf,buf+8); - } - break; - - default: - throwEx(logMsgPrefix + __FUNCTION__ + " unsupported type " + tos(m_type3)); - } - } - else - { - switch(m_type0) - { - case AMF0_number_marker: - { - __uint8 buf[8] = {0}; - AMF0_EncodeNumber((char *)buf,(char *)buf+8,m_number_val); - s.insert(s.end(),buf,buf+8); - } - break; - - case AMF0_boolean_marker: - s.push_back(m_boolean_val ? 1 : 0); - break; - - case AMF0_string_marker: - ::serialize(s,m_string_val,mode,logMsgPrefix); - break; - - case AMF0_object_marker: - m_object_val.serialize(s,mode,logMsgPrefix); - break; - - case AMF0_ecma_array_marker: - m_ecma_array_val.serialize(s,mode,logMsgPrefix); - break; - - case AMF0_null_marker: - break; - - default: - throwEx(logMsgPrefix + __FUNCTION__ + " unsupported type " + tos(m_type0)); - break; - } - } -} - -utf8 AMFVal::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - if (mode == 3) - { - switch(m_type3) - { - case AMF3_double_marker: - return tabs + tos(m_number_val); - - case AMF3_integer_marker: - return tabs + tos(m_integer_val); - - default: - break; - } - } - else - { - switch(m_type0) - { - case AMF0_number_marker: - return tabs + tos(m_number_val); - - case AMF0_boolean_marker: - return tabs + (m_boolean_val ? "true" : "false"); - - case AMF0_string_marker: - return tabs + m_string_val; - - case AMF0_object_marker: - return m_object_val.prettyPrint(mode,tabs); - - case AMF0_ecma_array_marker: - return m_ecma_array_val.prettyPrint(mode,tabs); - - default: - break; - } - } - return ""; -} - -void AMFVal::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - if (!bitstreamLen) throwEx(logMsgPrefix + " AMF bitstream is empty"); - if (mode == 3) - { - m_type3 = (AMF3Marker_t)*bitstream; - bitstreamLen -= 1; - bitstream += 1; - switch(m_type3) - { - case AMF3_double_marker: - if (bitstreamLen < 8) throwEx(logMsgPrefix + " Insufficient data for AMF3 double marker."); - m_number_val = AMF0_DecodeNumber(bitstream); - bitstream += 8; - bitstreamLen -= 8; - break; - - case AMF3_null_marker: - case AMF3_false_marker: - case AMF3_true_marker: - case AMF3_integer_marker: - case AMF3_string_marker: - case AMF3_xml_doc_marker: - case AMF3_date_marker: - case AMF3_array_marker: - case AMF3_object_marker: - case AMF3_xml_marker: - case AMF3_byte_array_marker: - case AMF3_undefined_marker: - throwEx(logMsgPrefix + " Unsupported AMF3 marker " + tos(m_type3)); - break; - - default: - throwEx(logMsgPrefix + " Unknown AMF3 marker " + tos(m_type3)); - break; - } - } - else - { - m_type0 = (AMF0Marker_t)*bitstream; - bitstreamLen -= 1; - bitstream += 1; - switch(m_type0) - { - case AMF0_number_marker: - if (bitstreamLen < 8) throwEx(logMsgPrefix + " Insufficient data for AMF0 number marker."); - m_number_val = AMF0_DecodeNumber(bitstream); - bitstream += 8; - bitstreamLen -= 8; - break; - - case AMF0_boolean_marker: - if (bitstreamLen < 1) throwEx(logMsgPrefix + " Insufficient data for AMF0 boolean marker."); - m_boolean_val = ((*bitstream) ? true : false); - bitstream += 1; - bitstreamLen -= 1; - break; - - case AMF0_string_marker: - { - if (bitstreamLen < 2) throwEx(logMsgPrefix + " Insufficient data for AMF0 string marker."); - __uint16 slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx(logMsgPrefix + " Insufficient data for AMF0 string marker."); - m_string_val = utf8(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - } - break; - - case AMF0_object_marker: - m_object_val.loadFromBitstream(bitstream,bitstreamLen,0,logMsgPrefix); - break; - - case AMF0_ecma_array_marker: - m_ecma_array_val.loadFromBitstream(bitstream,bitstreamLen,0,logMsgPrefix); - break; - - case AMF0_undefined_marker: - DEBUG_LOG(logMsgPrefix + "Warning - Undefined AMF0 marker " + tos(m_type0)); - case AMF0_null_marker: - break; - - case AMF0_reference_marker: - case AMF0_object_end_marker: - case AMF0_strict_array_marker: - case AMF0_date_marker: - case AMF0_long_string_marker: - case AMF0_unsupported_marker: - case AMF0_recordset_marker: - case AMF0_xml_Document_marker: - case AMF0_typed_object_marker: - case AMF0_amvplus_object_marker: - case AMF0_movieclip_marker: - throwEx(logMsgPrefix + " Unsupported AMF0 marker " + tos(m_type0)); - break; - - default: - throwEx(logMsgPrefix + " Unknown AMF0 marker " + tos(m_type0)); - break; - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////// - -void AMFEncoding::loadFromBitstream(const char *bitstream, int bitstreamLen,const uniString::utf8 &logMsgPrefix) throw(exception) -{ - int blen = bitstreamLen; - const char *bs = bitstream; - vector values; - while(blen) - { - AMFVal v; - v.loadFromBitstream(bs,blen,m_mode,logMsgPrefix); - values.push_back(v); - } - m_values=values; -} - -const AMFVal& AMFEncoding::getValue(size_t index) const throw(std::exception) -{ - if (index >= m_values.size()) - throwEx("AMFEncoding::getValue(" + tos(index) + ") out of range"); - return m_values[index]; -} - -void AMFEncoding::appendValue(const AMFVal &v) throw() -{ - m_values.push_back(v); -} - -void AMFEncoding::serialize(vector<__uint8> &s,const utf8 &logMsgPrefix) const throw(exception) -{ - for(vector::const_iterator i = m_values.begin(); i != m_values.end(); ++i) - (*i).serialize(s,m_mode,logMsgPrefix); -} - -utf8 AMFEncoding::prettyPrint() const throw() -{ - utf8 result("INVOKE("); - result += eol(); - for(vector::const_iterator i = m_values.begin(); i != m_values.end(); ++i) - result += (*i).prettyPrint(m_mode,"\t") + eol(); - result += ")"; - return result; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/amf.h b/Src/Plugins/DSP/sc_serv3/amf.h deleted file mode 100644 index 41ae87f9..00000000 --- a/Src/Plugins/DSP/sc_serv3/amf.h +++ /dev/null @@ -1,156 +0,0 @@ -#ifndef amf_H_ -#define amf_H_ - -#include -#include -#include -#include "unicode/uniString.h" - -enum AMF0Marker_t -{ - AMF0_number_marker = 0x00, - AMF0_boolean_marker, - AMF0_string_marker, - AMF0_object_marker, - AMF0_movieclip_marker, - AMF0_null_marker, - AMF0_undefined_marker, - AMF0_reference_marker, - AMF0_ecma_array_marker, - AMF0_object_end_marker, - AMF0_strict_array_marker, - AMF0_date_marker, - AMF0_long_string_marker, - AMF0_unsupported_marker, - AMF0_recordset_marker, - AMF0_xml_Document_marker, - AMF0_typed_object_marker, - AMF0_amvplus_object_marker -}; - -enum AMF3Marker_t -{ - AMF3_undefined_marker = 0x00, - AMF3_null_marker, - AMF3_false_marker, - AMF3_true_marker, - AMF3_integer_marker, - AMF3_double_marker, - AMF3_string_marker, - AMF3_xml_doc_marker, - AMF3_date_marker, - AMF3_array_marker, - AMF3_object_marker, - AMF3_xml_marker, - AMF3_byte_array_marker, -}; - -struct AMFStrictArray -{ -}; - -struct AMFDate -{ -}; - -class AMFVal; - -struct AMFEMCAArray -{ -private: - typedef std::map propertyMap_t; - std::map m_properties; - -public: - AMFEMCAArray() throw(); - ~AMFEMCAArray() throw(); - AMFEMCAArray(const AMFEMCAArray &obj) throw(); - AMFEMCAArray& operator=(const AMFEMCAArray &obj) throw(); - - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal* getProperty(const uniString::utf8 &key) const throw(); - void addProperty(const uniString::utf8 &key,AMFVal *v) throw(std::exception); // takes possession of "v" - void clearProperties() throw(); - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFObject -{ -private: - typedef std::map propertyMap_t; - std::map m_properties; - -public: - AMFObject() throw(); - ~AMFObject() throw(); - AMFObject(const AMFObject &obj) throw(); - AMFObject& operator=(const AMFObject &obj) throw(); - - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal* getProperty(const uniString::utf8 &key) const throw(); - void addProperty(const uniString::utf8 &key,AMFVal *v) throw(std::exception); // takes possession of "v" - void clearProperties() throw(); - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFVal -{ -private: - AMF0Marker_t m_type0; // type - AMF3Marker_t m_type3; - - // value depends on type - int m_integer_val; - double m_number_val; - bool m_boolean_val; - uniString::utf8 m_string_val; - AMFObject m_object_val; - __uint16 m_reference_val; - AMFEMCAArray m_ecma_array_val; - AMFStrictArray m_strict_array_val; - AMFDate m_date_val; - -public: - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - - const uniString::utf8 &getString() const throw(std::exception); - double getNumber() const throw(std::exception); - bool getBool() const throw(std::exception); - const AMFObject& getObject() const throw(std::exception); - int getInteger() const throw(std::exception); - - AMFVal() throw(): m_type0(AMF0_null_marker),m_type3(AMF3_undefined_marker){} - AMFVal(double v) throw(): m_type0(AMF0_number_marker),m_type3(AMF3_undefined_marker) ,m_number_val(v){} - AMFVal(bool v) throw(): m_type0(AMF0_boolean_marker),m_type3(AMF3_undefined_marker),m_boolean_val(v){} - AMFVal(const uniString::utf8 &v) throw(): m_type0(AMF0_string_marker),m_type3(AMF3_undefined_marker) ,m_string_val(v){} - AMFVal(const AMFObject &v) throw(): m_type0(AMF0_object_marker),m_type3(AMF3_undefined_marker) ,m_object_val(v){} - AMFVal(const AMFEMCAArray &v) throw(): m_type0(AMF0_ecma_array_marker),m_type3(AMF3_undefined_marker),m_ecma_array_val(v){} - - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFEncoding -{ -private: - std::vector m_values; - int m_mode; - -public: - AMFEncoding(int mode = 0) throw():m_mode(mode){} - ~AMFEncoding() throw(){} - - void clear() throw() { m_values.clear(); } - - void loadFromBitstream(const char *bitstream,int bitstreamLen,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal& getValue(size_t index) const throw(std::exception); - - void appendValue(const AMFVal &v) throw(); - void serialize(std::vector<__uint8> &s,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - - uniString::utf8 prettyPrint() const throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile b/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile deleted file mode 100644 index f1a5feaf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile +++ /dev/null @@ -1,2 +0,0 @@ -build: - ./unix_build_expat diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README deleted file mode 100644 index eda302d9..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README +++ /dev/null @@ -1,42 +0,0 @@ -== How to build expat with cmake (experimental) == - -The cmake based buildsystem for expat works on Windows (cygwin, mingw, Visual -Studio) and should work on all other platform cmake supports. - -Assuming ~/expat-2.1.0 is the source directory of expat, add a subdirectory -build and change into that directory: -~/expat-2.1.0$ mkdir build && cd build -~/expat-2.1.0/build$ - -From that directory, call cmake first, then call make, make test and -make install in the usual way: -~/expat-2.1.0/build$ cmake .. --- The C compiler identification is GNU --- The CXX compiler identification is GNU -.... --- Configuring done --- Generating done --- Build files have been written to: /home/patrick/expat-2.1.0/build - -If you want to specify the install location for your files, append --DCMAKE_INSTALL_PREFIX=/your/install/path to the cmake call. - -~/expat-2.1.0/build$ make && make test && make install -Scanning dependencies of target expat -[ 5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o -[ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o -.... --- Installing: /usr/local/lib/pkgconfig/expat.pc --- Installing: /usr/local/bin/xmlwf --- Installing: /usr/local/share/man/man1/xmlwf.1 - -For Windows builds, you must make sure to call cmake from an environment where -your compiler is reachable, that means either you call it from the -Visual Studio Command Prompt or when using mingw, you must open a cmd.exe and -make sure that gcc can be called. On Windows, you also might want to specify a -special Generator for CMake: -for Visual Studio builds do: -cmake .. -G "Visual Studio 10" && vcexpress expat.sln -for mingw builds do: -cmake .. -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=D:\expat-install - && gmake && gmake install diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt deleted file mode 100644 index 0c923baa..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -# This file is copyrighted under the BSD-license for buildsystem files of KDE -# copyright 2010, Patrick Spendrin - -project(expat) - -cmake_minimum_required(VERSION 2.6) -set(PACKAGE_BUGREPORT "expat-bugs@libexpat.org") -set(PACKAGE_NAME "expat") -set(PACKAGE_VERSION "2.1.0") -set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") -set(PACKAGE_TARNAME "${PACKAGE_NAME}") - -option(BUILD_tools "build the xmlwf tool for expat library" ON) -option(BUILD_examples "build the examples for expat library" ON) -option(BUILD_tests "build the tests for expat library" ON) -option(BUILD_shared "build a shared expat library" ON) - -# configuration options -set(XML_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point") -option(XML_DTD "Define to make parameter entity parsing functionality available" ON) -option(XML_NS "Define to make XML Namespaces functionality available" ON) - -if(XML_DTD) - set(XML_DTD 1) -else(XML_DTD) - set(XML_DTD 0) -endif(XML_DTD) -if(XML_NS) - set(XML_NS 1) -else(XML_NS) - set(XML_NS 0) -endif(XML_NS) - -if(BUILD_tests) - enable_testing() -endif(BUILD_tests) - -include(ConfigureChecks.cmake) - -include_directories(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/lib) -if(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996) -endif(MSVC) - -set(expat_SRCS - lib/xmlparse.c - lib/xmlrole.c - lib/xmltok.c - lib/xmltok_impl.c - lib/xmltok_ns.c -) - -if(WIN32 AND BUILD_shared) - set(expat_SRCS ${expat_SRCS} lib/libexpat.def) -endif(WIN32 AND BUILD_shared) - -if(BUILD_shared) - set(_SHARED SHARED) -else(BUILD_shared) - set(_SHARED STATIC) -endif(BUILD_shared) - -add_library(expat ${_SHARED} ${expat_SRCS}) - -install(TARGETS expat RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix "\${prefix}/bin") -set(libdir "\${prefix}/lib") -set(includedir "\${prefix}/include") -configure_file(expat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/expat.pc) - -install(FILES lib/expat.h lib/expat_external.h DESTINATION include) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/expat.pc DESTINATION lib/pkgconfig) - - - -if(BUILD_tools AND NOT WINCE) - set(xmlwf_SRCS - xmlwf/xmlwf.c - xmlwf/xmlfile.c - xmlwf/codepage.c - xmlwf/readfilemap.c - ) - - add_executable(xmlwf ${xmlwf_SRCS}) - target_link_libraries(xmlwf expat) - install(TARGETS xmlwf DESTINATION bin) - install(FILES doc/xmlwf.1 DESTINATION share/man/man1) -endif(BUILD_tools AND NOT WINCE) - -if(BUILD_examples) - add_executable(elements examples/elements.c) - target_link_libraries(elements expat) - - add_executable(outline examples/outline.c) - target_link_libraries(outline expat) -endif(BUILD_examples) - -if(BUILD_tests) - ## these are unittests that can be run on any platform - add_executable(runtests tests/runtests.c tests/chardata.c tests/minicheck.c) - target_link_libraries(runtests expat) - add_test(runtests runtests) - - add_executable(runtestspp tests/runtestspp.cpp tests/chardata.c tests/minicheck.c) - target_link_libraries(runtestspp expat) - add_test(runtestspp runtestspp) -endif(BUILD_tests) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING deleted file mode 100644 index dcb45064..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - and Clark Cooper -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - -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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes deleted file mode 100644 index 08897b9f..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes +++ /dev/null @@ -1,205 +0,0 @@ -Release 2.1.0 Sat March 24 2012 - - Bug Fixes: - #1742315: Harmful XML_ParserCreateNS suggestion. - #2895533: CVE-2012-1147 - Resource leak in readfilemap.c. - #1785430: Expat build fails on linux-amd64 with gcc version>=4.1 -O3. - #1983953, 2517952, 2517962, 2649838: - Build modifications using autoreconf instead of buildconf.sh. - #2815947, #2884086: OBJEXT and EXEEXT support while building. - #1990430: CVE-2009-3720 - Parser crash with special UTF-8 sequences. - #2517938: xmlwf should return non-zero exit status if not well-formed. - #2517946: Wrong statement about XMLDecl in xmlwf.1 and xmlwf.sgml. - #2855609: Dangling positionPtr after error. - #2894085: CVE-2009-3560 - Buffer over-read and crash in big2_toUtf8(). - #2958794: CVE-2012-1148 - Memory leak in poolGrow. - #2990652: CMake support. - #3010819: UNEXPECTED_STATE with a trailing "%" in entity value. - #3206497: Unitialized memory returned from XML_Parse. - #3287849: make check fails on mingw-w64. - #3496608: CVE-2012-0876 - Hash DOS attack. - - Patches: - #1749198: pkg-config support. - #3010222: Fix for bug #3010819. - #3312568: CMake support. - #3446384: Report byte offsets for attr names and values. - - New Features / API changes: - Added new API member XML_SetHashSalt() that allows setting an intial - value (salt) for hash calculations. This is part of the fix for - bug #3496608 to randomize hash parameters. - When compiled with XML_ATTR_INFO defined, adds new API member - XML_GetAttributeInfo() that allows retrieving the byte - offsets for attribute names and values (patch #3446384). - Added CMake build system. - See bug #2990652 and patch #3312568. - Added run-benchmark target to Makefile.in - relies on testdata module - present in the same relative location as in the repository. - -Release 2.0.1 Tue June 5 2007 - - Fixed bugs #1515266, #1515600: The character data handler's calling - of XML_StopParser() was not handled properly; if the parser was - stopped and the handler set to NULL, the parser would segfault. - - Fixed bug #1690883: Expat failed on EBCDIC systems as it assumed - some character constants to be ASCII encoded. - - Minor cleanups of the test harness. - - Fixed xmlwf bug #1513566: "out of memory" error on file size zero. - - Fixed outline.c bug #1543233: missing a final XML_ParserFree() call. - - Fixes and improvements for Windows platform: - bugs #1409451, #1476160, #1548182, #1602769, #1717322. - - Build fixes for various platforms: - HP-UX, Tru64, Solaris 9: patch #1437840, bug #1196180. - All Unix: #1554618 (refreshed config.sub/config.guess). - #1490371, #1613457: support both, DESTDIR and INSTALL_ROOT, - without relying on GNU-Make specific features. - #1647805: Patched configure.in to work better with Intel compiler. - - Fixes to Makefile.in to have make check work correctly: - bugs #1408143, #1535603, #1536684. - - Added Open Watcom support: patch #1523242. - -Release 2.0.0 Wed Jan 11 2006 - - We no longer use the "check" library for C unit testing; we - always use the (partial) internal implementation of the API. - - Report XML_NS setting via XML_GetFeatureList(). - - Fixed headers for use from C++. - - XML_GetCurrentLineNumber() and XML_GetCurrentColumnNumber() - now return unsigned integers. - - Added XML_LARGE_SIZE switch to enable 64-bit integers for - byte indexes and line/column numbers. - - Updated to use libtool 1.5.22 (the most recent). - - Added support for AmigaOS. - - Some mostly minor bug fixes. SF issues include: #1006708, - #1021776, #1023646, #1114960, #1156398, #1221160, #1271642. - -Release 1.95.8 Fri Jul 23 2004 - - Major new feature: suspend/resume. Handlers can now request - that a parse be suspended for later resumption or aborted - altogether. See "Temporarily Stopping Parsing" in the - documentation for more details. - - Some mostly minor bug fixes, but compilation should no - longer generate warnings on most platforms. SF issues - include: #827319, #840173, #846309, #888329, #896188, #923913, - #928113, #961698, #985192. - -Release 1.95.7 Mon Oct 20 2003 - - Fixed enum XML_Status issue (reported on SourceForge many - times), so compilers that are properly picky will be happy. - - Introduced an XMLCALL macro to control the calling - convention used by the Expat API; this macro should be used - to annotate prototypes and definitions of callback - implementations in code compiled with a calling convention - other than the default convention for the host platform. - - Improved ability to build without the configure-generated - expat_config.h header. This is useful for applications - which embed Expat rather than linking in the library. - - Fixed a variety of bugs: see SF issues #458907, #609603, - #676844, #679754, #692878, #692964, #695401, #699323, #699487, - #820946. - - Improved hash table lookups. - - Added more regression tests and improved documentation. - -Release 1.95.6 Tue Jan 28 2003 - - Added XML_FreeContentModel(). - - Added XML_MemMalloc(), XML_MemRealloc(), XML_MemFree(). - - Fixed a variety of bugs: see SF issues #615606, #616863, - #618199, #653180, #673791. - - Enhanced the regression test suite. - - Man page improvements: includes SF issue #632146. - -Release 1.95.5 Fri Sep 6 2002 - - Added XML_UseForeignDTD() for improved SAX2 support. - - Added XML_GetFeatureList(). - - Defined XML_Bool type and the values XML_TRUE and XML_FALSE. - - Use an incomplete struct instead of a void* for the parser - (may not retain). - - Fixed UTF-8 decoding bug that caused legal UTF-8 to be rejected. - - Finally fixed bug where default handler would report DTD - events that were already handled by another handler. - Initial patch contributed by Darryl Miles. - - Removed unnecessary DllMain() function that caused static - linking into a DLL to be difficult. - - Added VC++ projects for building static libraries. - - Reduced line-length for all source code and headers to be - no longer than 80 characters, to help with AS/400 support. - - Reduced memory copying during parsing (SF patch #600964). - - Fixed a variety of bugs: see SF issues #580793, #434664, - #483514, #580503, #581069, #584041, #584183, #584832, #585537, - #596555, #596678, #598352, #598944, #599715, #600479, #600971. - -Release 1.95.4 Fri Jul 12 2002 - - Added support for VMS, contributed by Craig Berry. See - vms/README.vms for more information. - - Added Mac OS (classic) support, with a makefile for MPW, - contributed by Thomas Wegner and Daryle Walker. - - Added Borland C++ Builder 5 / BCC 5.5 support, contributed - by Patrick McConnell (SF patch #538032). - - Fixed a variety of bugs: see SF issues #441449, #563184, - #564342, #566334, #566901, #569461, #570263, #575168, #579196. - - Made skippedEntityHandler conform to SAX2 (see source comment) - - Re-implemented WFC: Entity Declared from XML 1.0 spec and - added a new error "entity declared in parameter entity": - see SF bug report #569461 and SF patch #578161 - - Re-implemented section 5.1 from XML 1.0 spec: - see SF bug report #570263 and SF patch #578161 - -Release 1.95.3 Mon Jun 3 2002 - - Added a project to the MSVC workspace to create a wchar_t - version of the library; the DLLs are named libexpatw.dll. - - Changed the name of the Windows DLLs from expat.dll to - libexpat.dll; this fixes SF bug #432456. - - Added the XML_ParserReset() API function. - - Fixed XML_SetReturnNSTriplet() to work for element names. - - Made the XML_UNICODE builds usable (thanks, Karl!). - - Allow xmlwf to read from standard input. - - Install a man page for xmlwf on Unix systems. - - Fixed many bugs; see SF bug reports #231864, #461380, #464837, - #466885, #469226, #477667, #484419, #487840, #494749, #496505, - #547350. Other bugs which we can't test as easily may also - have been fixed, especially in the area of build support. - -Release 1.95.2 Fri Jul 27 2001 - - More changes to make MSVC happy with the build; add a single - workspace to support both the library and xmlwf application. - - Added a Windows installer for Windows users; includes - xmlwf.exe. - - Added compile-time constants that can be used to determine the - Expat version - - Removed a lot of GNU-specific dependencies to aide portability - among the various Unix flavors. - - Fix the UTF-8 BOM bug. - - Cleaned up warning messages for several compilers. - - Added the -Wall, -Wstrict-prototypes options for GCC. - -Release 1.95.1 Sun Oct 22 15:11:36 EDT 2000 - - Changes to get expat to build under Microsoft compiler - - Removed all aborts and instead return an UNEXPECTED_STATE error. - - Fixed a bug where a stray '%' in an entity value would cause an - abort. - - Defined XML_SetEndNamespaceDeclHandler. Thanks to Darryl Miles for - finding this oversight. - - Changed default patterns in lib/Makefile.in to fit non-GNU makes - Thanks to robin@unrated.net for reporting and providing an - account to test on. - - The reference had the wrong label for XML_SetStartNamespaceDecl. - Reported by an anonymous user. - -Release 1.95.0 Fri Sep 29 2000 - - XML_ParserCreate_MM - Allows you to set a memory management suite to replace the - standard malloc,realloc, and free. - - XML_SetReturnNSTriplet - If you turn this feature on when namespace processing is in - effect, then qualified, prefixed element and attribute names - are returned as "uri|name|prefix" where '|' is whatever - separator character is used in namespace processing. - - Merged in features from perl-expat - o XML_SetElementDeclHandler - o XML_SetAttlistDeclHandler - o XML_SetXmlDeclHandler - o XML_SetEntityDeclHandler - o StartDoctypeDeclHandler takes 3 additional parameters: - sysid, pubid, has_internal_subset - o Many paired handler setters (like XML_SetElementHandler) - now have corresponding individual handler setters - o XML_GetInputContext for getting the input context of - the current parse position. - - Added reference material - - Packaged into a distribution that builds a sharable library diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake deleted file mode 100644 index f03faa63..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake +++ /dev/null @@ -1,44 +0,0 @@ -include(CheckIncludeFile) -include(CheckIncludeFiles) -include(CheckFunctionExists) -include(CheckSymbolExists) -include(TestBigEndian) - -check_include_file("dlfcn.h" HAVE_DLFCN_H) -check_include_file("fcntl.h" HAVE_FCNTL_H) -check_include_file("inttypes.h" HAVE_INTTYPES_H) -check_include_file("memory.h" HAVE_MEMORY_H) -check_include_file("stdint.h" HAVE_STDINT_H) -check_include_file("stdlib.h" HAVE_STDLIB_H) -check_include_file("strings.h" HAVE_STRINGS_H) -check_include_file("string.h" HAVE_STRING_H) -check_include_file("sys/stat.h" HAVE_SYS_STAT_H) -check_include_file("sys/types.h" HAVE_SYS_TYPES_H) -check_include_file("unistd.h" HAVE_UNISTD_H) - -check_function_exists("getpagesize" HAVE_GETPAGESIZE) -check_function_exists("bcopy" HAVE_BCOPY) -check_symbol_exists("memmove" "string.h" HAVE_MEMMOVE) -check_function_exists("mmap" HAVE_MMAP) - -#/* Define to 1 if you have the ANSI C header files. */ -check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) - -test_big_endian(WORDS_BIGENDIAN) -#/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -if(WORDS_BIGENDIAN) - set(BYTEORDER 4321) -else(WORDS_BIGENDIAN) - set(BYTEORDER 1234) -endif(WORDS_BIGENDIAN) - -if(HAVE_SYS_TYPES_H) - check_symbol_exists("off_t" "sys/types.h" OFF_T) - check_symbol_exists("size_t" "sys/types.h" SIZE_T) -else(HAVE_SYS_TYPES_H) - set(OFF_T "long") - set(SIZE_T "unsigned") -endif(HAVE_SYS_TYPES_H) - -configure_file(expat_config.h.cmake expat_config.h) -add_definitions(-DHAVE_EXPAT_CONFIG_H) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST deleted file mode 100644 index 7a020dc0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST +++ /dev/null @@ -1,141 +0,0 @@ -amiga/launch.c -amiga/expat_68k.c -amiga/expat_68k.h -amiga/expat_68k_handler_stubs.c -amiga/expat_base.h -amiga/expat_vectors.c -amiga/expat_lib.c -amiga/expat.xml -amiga/README.txt -amiga/Makefile -amiga/include/proto/expat.h -amiga/include/libraries/expat.h -amiga/include/interfaces/expat.h -amiga/include/inline4/expat.h -bcb5/README.txt -bcb5/all_projects.bpg -bcb5/elements.bpf -bcb5/elements.bpr -bcb5/elements.mak -bcb5/expat.bpf -bcb5/expat.bpr -bcb5/expat.mak -bcb5/expat_static.bpf -bcb5/expat_static.bpr -bcb5/expat_static.mak -bcb5/expatw.bpf -bcb5/expatw.bpr -bcb5/expatw.mak -bcb5/expatw_static.bpf -bcb5/expatw_static.bpr -bcb5/expatw_static.mak -bcb5/libexpat_mtd.def -bcb5/libexpatw_mtd.def -bcb5/makefile.mak -bcb5/outline.bpf -bcb5/outline.bpr -bcb5/outline.mak -bcb5/setup.bat -bcb5/xmlwf.bpf -bcb5/xmlwf.bpr -bcb5/xmlwf.mak -doc/expat.png -doc/reference.html -doc/style.css -doc/valid-xhtml10.png -doc/xmlwf.1 -doc/xmlwf.sgml -CMakeLists.txt -CMake.README -COPYING -Changes -ConfigureChecks.cmake -MANIFEST -Makefile.in -README -configure -configure.in -expat_config.h.in -expat_config.h.cmake -expat.pc.in -expat.dsw -aclocal.m4 -conftools/PrintPath -conftools/ac_c_bigendian_cross.m4 -conftools/expat.m4 -conftools/get-version.sh -conftools/mkinstalldirs -conftools/config.guess -conftools/config.sub -conftools/install-sh -conftools/ltmain.sh -m4/libtool.m4 -m4/ltversion.m4 -m4/ltoptions.m4 -m4/ltsugar.m4 -m4/lt~obsolete.m4 -examples/elements.c -examples/elements.dsp -examples/outline.c -examples/outline.dsp -lib/Makefile.MPW -lib/amigaconfig.h -lib/ascii.h -lib/asciitab.h -lib/expat.dsp -lib/expat.h -lib/expat_external.h -lib/expat_static.dsp -lib/expatw.dsp -lib/expatw_static.dsp -lib/iasciitab.h -lib/internal.h -lib/latin1tab.h -lib/libexpat.def -lib/libexpatw.def -lib/macconfig.h -lib/nametab.h -lib/utf8tab.h -lib/winconfig.h -lib/xmlparse.c -lib/xmlrole.c -lib/xmlrole.h -lib/xmltok.c -lib/xmltok.h -lib/xmltok_impl.c -lib/xmltok_impl.h -lib/xmltok_ns.c -tests/benchmark/README.txt -tests/benchmark/benchmark.c -tests/benchmark/benchmark.dsp -tests/benchmark/benchmark.dsw -tests/README.txt -tests/chardata.c -tests/chardata.h -tests/minicheck.c -tests/minicheck.h -tests/runtests.c -tests/runtestspp.cpp -tests/xmltest.sh -vms/README.vms -vms/descrip.mms -vms/expat_config.h -win32/MANIFEST.txt -win32/README.txt -win32/expat.iss -xmlwf/codepage.c -xmlwf/codepage.h -xmlwf/ct.c -xmlwf/filemap.h -xmlwf/readfilemap.c -xmlwf/unixfilemap.c -xmlwf/win32filemap.c -xmlwf/xmlfile.c -xmlwf/xmlfile.h -xmlwf/xmlmime.c -xmlwf/xmlmime.h -xmlwf/xmltchar.h -xmlwf/xmlurl.h -xmlwf/xmlwf.c -xmlwf/xmlwf.dsp -xmlwf/xmlwin32url.cxx diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in deleted file mode 100644 index 9c0f5d49..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in +++ /dev/null @@ -1,201 +0,0 @@ -################################################################ -# Process this file with top-level configure script to produce Makefile -# -# Copyright 2000 Clark Cooper -# -# This file is part of EXPAT. -# -# EXPAT is free software; you can redistribute it and/or modify it -# under the terms of the License (based on the MIT/X license) contained -# in the file COPYING that comes with this distribution. -# -# EXPAT 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN EXPAT. -# - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -libdir = @libdir@ -includedir = @includedir@ -man1dir = @mandir@/man1 -pkgconfigdir = $(libdir)/pkgconfig - -top_builddir = . - - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -mkinstalldirs = $(SHELL) $(top_srcdir)/conftools/mkinstalldirs - -MANFILE = $(srcdir)/doc/xmlwf.1 -APIHEADER = $(srcdir)/lib/expat.h $(srcdir)/lib/expat_external.h -LIBRARY = libexpat.la - -DESTDIR = $(INSTALL_ROOT) - -default: buildlib xmlwf/xmlwf@EXEEXT@ - -buildlib: $(LIBRARY) expat.pc - -all: $(LIBRARY) expat.pc xmlwf/xmlwf@EXEEXT@ examples/elements examples/outline - -clean: - cd lib && rm -f $(LIBRARY) *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd xmlwf && rm -f xmlwf *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd examples && rm -f elements outline *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd tests && rm -rf .libs runtests runtests.@OBJEXT@ runtestspp runtestspp.@OBJEXT@ - cd tests && rm -f chardata.@OBJEXT@ minicheck.@OBJEXT@ - rm -rf .libs libexpat.la - rm -f examples/core tests/core xmlwf/core - -clobber: clean - -distclean: clean - rm -f expat_config.h config.status config.log config.cache libtool - rm -f Makefile expat.pc - -extraclean: distclean - rm -f expat_config.h.in configure - rm -f aclocal.m4 m4/* - rm -f conftools/ltmain.sh conftools/install-sh conftools/config.guess conftools/config.sub - -check: tests/runtests tests/runtestspp - tests/runtests - tests/runtestspp - -install: xmlwf/xmlwf@EXEEXT@ installlib - $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) xmlwf/xmlwf@EXEEXT@ $(DESTDIR)$(bindir)/xmlwf - $(INSTALL_DATA) $(MANFILE) $(DESTDIR)$(man1dir) - -installlib: $(LIBRARY) $(APIHEADER) expat.pc - $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir) $(DESTDIR)$(pkgconfigdir) - $(LIBTOOL) --mode=install $(INSTALL) $(LIBRARY) $(DESTDIR)$(libdir)/$(LIBRARY) - for FN in $(APIHEADER) ; do $(INSTALL_DATA) $$FN $(DESTDIR)$(includedir) ; done - $(INSTALL_DATA) expat.pc $(DESTDIR)$(pkgconfigdir)/expat.pc - -uninstall: uninstalllib - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(bindir)/xmlwf@EXEEXT@ - rm -f $(DESTDIR)$(man1dir)/xmlwf.1 - -uninstalllib: - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$(LIBRARY) - rm -f $(DESTDIR)$(includedir)/expat.h - rm -f $(DESTDIR)$(includedir)/expat_external.h - rm -f $(DESTDIR)$(pkgconfigdir)/expat.pc - -# for VPATH builds (invoked by configure) -mkdir-init: - @for d in lib xmlwf examples tests ; do \ - (mkdir $$d 2> /dev/null || test 1) ; \ - done - -CC = @CC@ -CXX = @CXX@ -LIBTOOL = @LIBTOOL@ - -INCLUDES = -I$(srcdir)/lib -I. -LDFLAGS = @LDFLAGS@ -CPPFLAGS = @CPPFLAGS@ -DHAVE_EXPAT_CONFIG_H -CFLAGS = @CFLAGS@ -CXXFLAGS = @CXXFLAGS@ -VSNFLAG = -version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@ - -### autoconf this? -LTFLAGS = --silent - -COMPILE = $(CC) $(INCLUDES) $(CFLAGS) $(DEFS) $(CPPFLAGS) -CXXCOMPILE = $(CXX) $(INCLUDES) $(CXXFLAGS) $(DEFS) $(CPPFLAGS) -LTCOMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -LINK_LIB = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -no-undefined $(VSNFLAG) -rpath $(libdir) $(LDFLAGS) -o $@ -LINK_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LDFLAGS) -o $@ -LINK_CXX_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CXXCOMPILE) $(LDFLAGS) -o $@ - -LIB_OBJS = lib/xmlparse.lo lib/xmltok.lo lib/xmlrole.lo -$(LIBRARY): $(LIB_OBJS) - $(LINK_LIB) $(LIB_OBJS) - -expat.pc: $(top_builddir)/config.status - cd $(top_builddir) && $(SHELL) ./config.status $@ - -lib/xmlparse.lo: lib/xmlparse.c lib/expat.h lib/xmlrole.h lib/xmltok.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - -lib/xmlrole.lo: lib/xmlrole.c lib/ascii.h lib/xmlrole.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - -lib/xmltok.lo: lib/xmltok.c lib/xmltok_impl.c lib/xmltok_ns.c \ - lib/ascii.h lib/asciitab.h lib/iasciitab.h lib/latin1tab.h \ - lib/nametab.h lib/utf8tab.h lib/xmltok.h lib/xmltok_impl.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - - -XMLWF_OBJS = xmlwf/xmlwf.@OBJEXT@ xmlwf/xmlfile.@OBJEXT@ xmlwf/codepage.@OBJEXT@ xmlwf/@FILEMAP@.@OBJEXT@ -xmlwf/xmlwf.@OBJEXT@: xmlwf/xmlwf.c -xmlwf/xmlfile.@OBJEXT@: xmlwf/xmlfile.c -xmlwf/codepage.@OBJEXT@: xmlwf/codepage.c -xmlwf/@FILEMAP@.@OBJEXT@: xmlwf/@FILEMAP@.c -xmlwf/xmlwf@EXEEXT@: $(XMLWF_OBJS) $(LIBRARY) - $(LINK_EXE) $(XMLWF_OBJS) $(LIBRARY) - -examples/elements.@OBJEXT@: examples/elements.c -examples/elements: examples/elements.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) $< $(LIBRARY) - -examples/outline.@OBJEXT@: examples/outline.c -examples/outline: examples/outline.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) $< $(LIBRARY) - -tests/chardata.@OBJEXT@: tests/chardata.c tests/chardata.h -tests/minicheck.@OBJEXT@: tests/minicheck.c tests/minicheck.h -tests/runtests.@OBJEXT@: tests/runtests.c tests/chardata.h -tests/runtests: tests/runtests.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) tests/runtests.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) -tests/runtestspp.@OBJEXT@: tests/runtestspp.cpp tests/runtests.c tests/chardata.h -tests/runtestspp: tests/runtestspp.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - $(LINK_CXX_EXE) tests/runtestspp.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - -tests/benchmark/benchmark.@OBJEXT@: tests/benchmark/benchmark.c -tests/benchmark/benchmark: tests/benchmark/benchmark.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) tests/benchmark/benchmark.@OBJEXT@ $(LIBRARY) - -run-benchmark: tests/benchmark/benchmark - tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3 - -tests/xmlts.zip: - wget --output-document=tests/xmlts.zip \ - http://www.w3.org/XML/Test/xmlts20080827.zip - -tests/XML-Test-Suite: tests/xmlts.zip - cd tests && unzip -q xmlts.zip - -run-xmltest: xmlwf/xmlwf@EXEEXT@ tests/XML-Test-Suite - tests/xmltest.sh - -.SUFFIXES: .c .cpp .lo .@OBJEXT@ - -.cpp.@OBJEXT@: - $(CXXCOMPILE) -o $@ -c $< -.c.@OBJEXT@: - $(COMPILE) -o $@ -c $< -.c.lo: - $(LTCOMPILE) -o $@ -c $< - -.PHONY: buildlib all \ - clean distclean extraclean maintainer-clean \ - dist distdir \ - install uninstall diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README deleted file mode 100644 index 1f88467d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README +++ /dev/null @@ -1,139 +0,0 @@ - - Expat, Release 2.1.0 - -This is Expat, a C library for parsing XML, written by James Clark. -Expat is a stream-oriented XML parser. This means that you register -handlers with the parser before starting the parse. These handlers -are called when the parser discovers the associated structures in the -document being parsed. A start tag is an example of the kind of -structures for which you may register handlers. - -Windows users should use the expat_win32bin package, which includes -both precompiled libraries and executables, and source code for -developers. - -Expat is free software. You may copy, distribute, and modify it under -the terms of the License contained in the file COPYING distributed -with this package. This license is the same as the MIT/X Consortium -license. - -Versions of Expat that have an odd minor version (the middle number in -the release above), are development releases and should be considered -as beta software. Releases with even minor version numbers are -intended to be production grade software. - -If you are building Expat from a check-out from the CVS repository, -you need to run a script that generates the configure script using the -GNU autoconf and libtool tools. To do this, you need to have -autoconf 2.58 or newer. Run the script like this: - - ./buildconf.sh - -Once this has been done, follow the same instructions as for building -from a source distribution. - -To build Expat from a source distribution, you first run the -configuration shell script in the top level distribution directory: - - ./configure - -There are many options which you may provide to configure (which you -can discover by running configure with the --help option). But the -one of most interest is the one that sets the installation directory. -By default, the configure script will set things up to install -libexpat into /usr/local/lib, expat.h into /usr/local/include, and -xmlwf into /usr/local/bin. If, for example, you'd prefer to install -into /home/me/mystuff/lib, /home/me/mystuff/include, and -/home/me/mystuff/bin, you can tell configure about that with: - - ./configure --prefix=/home/me/mystuff - -Another interesting option is to enable 64-bit integer support for -line and column numbers and the over-all byte index: - - ./configure CPPFLAGS=-DXML_LARGE_SIZE - -However, such a modification would be a breaking change to the ABI -and is therefore not recommended for general use - e.g. as part of -a Linux distribution - but rather for builds with special requirements. - -After running the configure script, the "make" command will build -things and "make install" will install things into their proper -location. Have a look at the "Makefile" to learn about additional -"make" options. Note that you need to have write permission into -the directories into which things will be installed. - -If you are interested in building Expat to provide document -information in UTF-16 encoding rather than the default UTF-8, follow -these instructions (after having run "make distclean"): - - 1. For UTF-16 output as unsigned short (and version/error - strings as char), run: - - ./configure CPPFLAGS=-DXML_UNICODE - - For UTF-16 output as wchar_t (incl. version/error strings), - run: - - ./configure CFLAGS="-g -O2 -fshort-wchar" \ - CPPFLAGS=-DXML_UNICODE_WCHAR_T - - 2. Edit the MakeFile, changing: - - LIBRARY = libexpat.la - - to: - - LIBRARY = libexpatw.la - - (Note the additional "w" in the library name.) - - 3. Run "make buildlib" (which builds the library only). - Or, to save step 2, run "make buildlib LIBRARY=libexpatw.la". - - 4. Run "make installlib" (which installs the library only). - Or, if step 2 was omitted, run "make installlib LIBRARY=libexpatw.la". - -Using DESTDIR or INSTALL_ROOT is enabled, with INSTALL_ROOT being the default -value for DESTDIR, and the rest of the make file using only DESTDIR. -It works as follows: - $ make install DESTDIR=/path/to/image -overrides the in-makefile set DESTDIR, while both - $ INSTALL_ROOT=/path/to/image make install - $ make install INSTALL_ROOT=/path/to/image -use DESTDIR=$(INSTALL_ROOT), even if DESTDIR eventually is defined in the -environment, because variable-setting priority is -1) commandline -2) in-makefile -3) environment - -Note: This only applies to the Expat library itself, building UTF-16 versions -of xmlwf and the tests is currently not supported. - -Note for Solaris users: The "ar" command is usually located in -"/usr/ccs/bin", which is not in the default PATH. You will need to -add this to your path for the "make" command, and probably also switch -to GNU make (the "make" found in /usr/ccs/bin does not seem to work -properly -- appearantly it does not understand .PHONY directives). If -you're using ksh or bash, use this command to build: - - PATH=/usr/ccs/bin:$PATH make - -When using Expat with a project using autoconf for configuration, you -can use the probing macro in conftools/expat.m4 to determine how to -include Expat. See the comments at the top of that file for more -information. - -A reference manual is available in the file doc/reference.html in this -distribution. - -The homepage for this project is http://www.libexpat.org/. There -are links there to connect you to the bug reports page. If you need -to report a bug when you don't have access to a browser, you may also -send a bug report by email to expat-bugs@mail.libexpat.org. - -Discussion related to the direction of future expat development takes -place on expat-discuss@mail.libexpat.org. Archives of this list and -other Expat-related lists may be found at: - - http://mail.libexpat.org/mailman/listinfo/ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 deleted file mode 100644 index 6fe5ffd2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 +++ /dev/null @@ -1,8460 +0,0 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 57 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl - -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 - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -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 delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -]) - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# 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 - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -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 - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # 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 - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_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 -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # 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) - - _LT_PROG_REPLACE_SHELLFNS - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_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${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed '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${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- -# 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. -# Store the results from the different compilers for each TAGNAME. -# Allow to override them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" - fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) -fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -case "$ECHO" in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_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 '$LINENO' "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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - 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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[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 - ;; -sparc*-*solaris*) - # 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 - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $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 other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# 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* | cegcc*) - # 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; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - 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* | dragonfly*) - # 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 all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # 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. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - 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` - fi - ;; - 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 -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_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 <<_LT_EOF -[#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 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; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_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* | cegcc*) - 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="-ldld"], - [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="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - 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" - wl=$lt_prog_compiler_wl 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_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 - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_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 -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $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:$LINENO: \$? = $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 - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $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 .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_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 -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_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 -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_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_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -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" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # 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. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -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" -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' - ;; - -aix[[4-9]]*) - 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*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - 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=`func_echo_all "$lib" | $SED '\''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' - ;; - esac - ;; - -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* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - 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~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - 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}' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - 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 - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - 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 - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # 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 - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # 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}${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`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - 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 - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - 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 - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - 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 - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - 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=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - 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' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[[3-9]]*) - 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' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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* | k*bsd*-gnu | kopensolaris*-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' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # 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=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | 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' - ;; - -netbsdelf*-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='NetBSD ld.elf_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=qnx - 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='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - 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" - ;; - -rdos*) - dynamic_linker=no - ;; - -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.3*) - 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 - 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 - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/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}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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 - -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 - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[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]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_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="m4_if([$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 <<_LT_EOF 1>&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 - -_LT_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 -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_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 - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_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])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 variants of GNU ld 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 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - 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|DragonFly)/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 - ;; - -haiku*) - 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])(-bit)?( [LM]SB)? 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 - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -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* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - 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=pass_all - ;; - -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 - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - 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 - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - -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 - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_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" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB - - -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-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_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; - *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; - esac - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# 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]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -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 - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# 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 - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $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 <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_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_globsym_save_LIBS - CFLAGS=$lt_globsym_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 -rf 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 - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_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 - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # 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). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - case $host_os in - aix[[4-9]]*) - # 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 - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_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_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # 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. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # 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 - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[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 - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_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~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&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. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - 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 - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_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]].*|aix[[5-9]]*) - 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_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - 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 - : - else - # We have old collect2 - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - _LT_TAGVAR(link_all_deplibs, $1)=no - 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 - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # 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. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_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_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_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_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_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' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_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} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_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_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_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_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$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_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [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]]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -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_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will 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 - ;; - - aix[[4-9]]*) - 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]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - 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 - $as_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 - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_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_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_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_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 -v "^Configured with:" | $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_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - 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]].*|aix[[5-9]]*) - 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_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - 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 - : - else - # We have old collect2 - _LT_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_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - 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 - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd[[12]]*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_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_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_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) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_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_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_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; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_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_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_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - 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_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_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; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # 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_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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 - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_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 -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_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::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_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_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_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | 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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_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 ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_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=`func_echo_all "$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; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_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 -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_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_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -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 -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_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 -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_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... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - 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 -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF - -# _LT_SYS_HIDDEN_LIBDEPS([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. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -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... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -]) - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); 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 - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${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 - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} 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 "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${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 "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$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 "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - 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 - ;; - aix[[4-9]]*) - 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]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_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... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - 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 - ;; - aix[[4-9]]*) - 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]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_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... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# 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. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL -# ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# 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. # - -m4_defun([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 -IFS=$as_save_IFS -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 && continue - 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_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine which file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_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=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3293 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4]) -m4_define([LT_PACKAGE_REVISION], [1.3293]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4' -macro_revision='1.3293' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure deleted file mode 100644 index 247d0ef2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure +++ /dev/null @@ -1,18632 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for expat 2.1.0. -# -# Report bugs to . -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: expat-bugs@libexpat.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -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 - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_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 -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/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= - -# Identity of this package. -PACKAGE_NAME='expat' -PACKAGE_TARNAME='expat' -PACKAGE_VERSION='2.1.0' -PACKAGE_STRING='expat 2.1.0' -PACKAGE_BUGREPORT='expat-bugs@libexpat.org' -PACKAGE_URL='' - -ac_unique_file="Makefile.in" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_header_list= -ac_subst_vars='LTLIBOBJS -LIBOBJS -FILEMAP -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -CXXCPP -ac_ct_CXX -CXXFLAGS -CXX -LIBAGE -LIBREVISION -LIBCURRENT -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -AWK -RANLIB -STRIP -ac_ct_AR -AR -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -LIBTOOL -OBJDUMP -DLLTOOL -AS -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -CXX -CXXFLAGS -CCC -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_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= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - 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 expat 2.1.0 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/expat] - --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 expat 2.1.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --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) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/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 - -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" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -expat configure 2.1.0 -generated by GNU Autoconf 2.68 - -Copyright (C) 2010 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 - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* 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 $2 (); -/* 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_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_cxx_try_cpp LINENO -# ------------------------ -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_try_link LINENO -# ------------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -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 -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## -------------------------------------- ## -## Report this to expat-bugs@libexpat.org ## -## -------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel -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 expat $as_me 2.1.0, which was -generated by GNU Autoconf 2.68. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append 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 - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset 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 - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; 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 - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_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 - -$as_echo "/* confdefs.h */" > 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 - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - 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. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -as_fn_append ac_header_list " stdlib.h" -as_fn_append ac_header_list " unistd.h" -as_fn_append ac_header_list " sys/param.h" -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -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_aux_dir= -for ac_dir in conftools "$srcdir"/conftools; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in conftools \"$srcdir\"/conftools" "$LINENO" 5 -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. - - - - - - -LIBCURRENT=7 -LIBREVISION=0 -LIBAGE=6 - -ac_config_headers="$ac_config_headers expat_config.h" - - - - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&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 && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -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 - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&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` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -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 - - -enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_AS" = x; then - AS="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AS=$ac_ct_AS - fi -else - AS="$ac_cv_prog_AS" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4' -macro_revision='1.3293' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Backslashify metacharacters that are still active within -# double-quoted strings. -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 delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&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 -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_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 -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_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_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_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 fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_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_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&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 variants of GNU ld 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 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_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" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&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* | cegcc*) - # 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; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - 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* | dragonfly*) - # 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 all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # 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. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - 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` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$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 - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&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 -aix[4-9]*) - 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', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - 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|DragonFly)/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 - ;; - -haiku*) - 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])(-bit)?( [LM]SB)? 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 - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -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* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - 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=pass_all - ;; - -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 - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - 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 - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -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 test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&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]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -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 - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# 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 - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$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=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && 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 <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_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 -rf 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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# 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\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; 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 '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; 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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - 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-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - 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" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$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 - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - - enable_dlopen=no - - - - # 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 --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 - - - - - - - - # 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 - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -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 - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 - -_LT_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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 - -_LT_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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -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;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$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= - - - 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*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # 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' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - 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' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - 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 - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - lt_prog_compiler_pic='-Xcompiler -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 - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # 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' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - 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 - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - 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 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_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 - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_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 - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # 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_|_GLOBAL__F[ID]_.*' - # 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. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # 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 - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - 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 - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [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 - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - 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 - ;; - esac - ;; - - 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* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - 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 '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; 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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; 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~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - 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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&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. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - 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 - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $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" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - 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 "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - 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 - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - 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") || (\$ 2 == "W")) && (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].*|aix[5-9]*) - 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_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - 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 - : - 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' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - 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 - - export_dynamic_flag_spec='${wl}-bexpall' - # 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. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${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 '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -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' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - 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 - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # 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. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # 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 $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - 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 `func_echo_all "$deplibs" | $SED '\''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' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - 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* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -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 $pic_flag ${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*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=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 - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - 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 - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - 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 - else - ld_shlibs=no - 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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - 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} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${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='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-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; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${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 $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - 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' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $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 -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - 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*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - 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 - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - 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\":${as_lineno-$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=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # 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. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -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" -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' - ;; - -aix[4-9]*) - 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*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - 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=`func_echo_all "$lib" | $SED '\''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' - ;; - esac - ;; - -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* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - 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~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - 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="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - 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 - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - 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 - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # 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 - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # 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}${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`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - 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 - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - 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 - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - 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 - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - 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=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - 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' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - 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' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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* | k*bsd*-gnu | kopensolaris*-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' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # 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=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | 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' - ;; - -netbsdelf*-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='NetBSD ld.elf_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=qnx - 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='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - 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" - ;; - -rdos*) - dynamic_linker=no - ;; - -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.3*) - 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 - 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 - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/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}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = 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 - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent 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_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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; 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 - - - - - - - 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* | cegcc*) - 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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; 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 - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -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" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 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; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&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 <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#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 - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 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; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$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 - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&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" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "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" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&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 - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -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" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -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_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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&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_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "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:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$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=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 - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -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 - -else - _lt_caught_CXX_error=yes -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 - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - 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 - $as_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 - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&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 variants of GNU ld 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 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$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 $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -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 -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - 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].*|aix[5-9]*) - 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_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - 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 - : - 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' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - 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 - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # 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. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${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 '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -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' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # 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_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - 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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - 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${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed '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${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - 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 - ;; - - freebsd[12]*) - # 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* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - 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) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${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 - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_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*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - 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; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${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 - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - 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" && func_echo_all "-set_version $verstring"` -update_registry ${output_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 $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${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=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - 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; func_echo_all "$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* | ecpc* ) - # 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 - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $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' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # 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' - ;; - esac - ;; - 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::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - 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=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | 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. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - 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" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - 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" && func_echo_all "-set_version $verstring"` -update_registry ${output_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 ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - 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=`func_echo_all "$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; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - 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 -v "^Configured with:" | $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 - ;; - - 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* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -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} ${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 compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # 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 $pic_flag -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 $pic_flag -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 -v "^Configured with:" | $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 -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - 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 - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$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... - # 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= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; 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 - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${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 - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} 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 - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$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 -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # 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*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # 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' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # 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). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - 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= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # 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_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 - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # 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' - ;; - 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* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${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='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - 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* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - 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' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - 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*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # 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 - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - 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 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_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 - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker 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 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $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 - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $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 .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&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 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_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 - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # 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 - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - 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") || (\$ 2 == "W")) && (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* | cegcc*) - case $cc_basename in - cl*) ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# 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. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_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\":${as_lineno-$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=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_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* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&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" -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' - ;; - -aix[4-9]*) - 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*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - 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=`func_echo_all "$lib" | $SED '\''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' - ;; - esac - ;; - -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* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - 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~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - 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}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - 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 - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - 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 - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # 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 - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # 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}${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`' - - 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 - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - 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 - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - 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 - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - 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=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - 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' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - 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' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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* | k*bsd*-gnu | kopensolaris*-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' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # 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=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | 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' - ;; - -netbsdelf*-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='NetBSD ld.elf_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=qnx - 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='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - 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" - ;; - -rdos*) - dynamic_linker=no - ;; - -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.3*) - 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 - 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 - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/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}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = 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 - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&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-existent 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_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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; 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 - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - 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 -fi # test "$_lt_caught_CXX_error" != 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 - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -if test "$GCC" = yes ; then - OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes" - CFLAGS="$OLDCFLAGS -fexceptions" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -fexceptions" >&5 -$as_echo_n "checking whether $CC accepts -fexceptions... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; CFLAGS="$OLDCFLAGS" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - CXXFLAGS=`echo "$CFLAGS" | sed 's/ -Wmissing-prototypes -Wstrict-prototypes//'` -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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 -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ - -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ - -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=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 -if test $ac_cv_c_bigendian = unknown; then -if test "$cross_compiling" = yes; then : - echo $ac_n "cross-compiling... " 2>&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } -if test $ac_cv_c_bigendian = unknown; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to probe for byte ordering" >&5 -$as_echo_n "checking to probe for byte ordering... " >&6; } - -cat >conftest.c <&6 - ac_cv_c_bigendian=yes - fi - if test `grep -l LiTTleEnDian conftest.o` ; then - echo $ac_n ' little endian probe OK, ' 1>&6 - if test $ac_cv_c_bigendian = yes ; then - ac_cv_c_bigendian=unknown; - else - ac_cv_c_bigendian=no - fi - fi - echo $ac_n 'guessing bigendian ... ' >&6 - fi - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } -fi -if test $ac_cv_c_bigendian = yes; then - -$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h - - BYTEORDER=4321 -else - BYTEORDER=1234 -fi - -cat >>confdefs.h <<_ACEOF -#define BYTEORDER $BYTEORDER -_ACEOF - -if test $ac_cv_c_bigendian = unknown; then - as_fn_error please pre-set ac_cv_c_bigendian "unknown endianess - sorry" "$LINENO" 5 -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -for ac_func in memmove bcopy -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -for ac_header in fcntl.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF - -fi - - - - - for ac_header in $ac_header_list -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - - - - - -for ac_func in getpagesize -do : - ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" -if test "x$ac_cv_func_getpagesize" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPAGESIZE 1 -_ACEOF - -fi -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 -$as_echo_n "checking for working mmap... " >&6; } -if ${ac_cv_func_mmap_fixed_mapped+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_mmap_fixed_mapped=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -/* malloc might have been renamed as rpl_malloc. */ -#undef malloc - -/* Thanks to Mike Haertel and Jim Avera for this test. - Here is a matrix of mmap possibilities: - mmap private not fixed - mmap private fixed at somewhere currently unmapped - mmap private fixed at somewhere already mapped - mmap shared not fixed - mmap shared fixed at somewhere currently unmapped - mmap shared fixed at somewhere already mapped - For private mappings, we should verify that changes cannot be read() - back from the file, nor mmap's back from the file at a different - address. (There have been systems where private was not correctly - implemented like the infamous i386 svr4.0, and systems where the - VM page cache was not coherent with the file system buffer cache - like early versions of FreeBSD and possibly contemporary NetBSD.) - For shared mappings, we should conversely verify that changes get - propagated back to all the places they're supposed to be. - - Grep wants private fixed already mapped. - The main things grep needs to know about mmap are: - * does it exist and is it safe to write into the mmap'd area - * how to use it (BSD variants) */ - -#include -#include - -#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H -char *malloc (); -#endif - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -int -main () -{ - char *data, *data2, *data3; - const char *cdata2; - int i, pagesize; - int fd, fd2; - - pagesize = getpagesize (); - - /* First, make a file with some known garbage in it. */ - data = (char *) malloc (pagesize); - if (!data) - return 1; - for (i = 0; i < pagesize; ++i) - *(data + i) = rand (); - umask (0); - fd = creat ("conftest.mmap", 0600); - if (fd < 0) - return 2; - if (write (fd, data, pagesize) != pagesize) - return 3; - close (fd); - - /* Next, check that the tail of a page is zero-filled. File must have - non-zero length, otherwise we risk SIGBUS for entire page. */ - fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); - if (fd2 < 0) - return 4; - cdata2 = ""; - if (write (fd2, cdata2, 1) != 1) - return 5; - data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); - if (data2 == MAP_FAILED) - return 6; - for (i = 0; i < pagesize; ++i) - if (*(data2 + i)) - return 7; - close (fd2); - if (munmap (data2, pagesize)) - return 8; - - /* Next, try to mmap the file at a fixed address which already has - something else allocated at it. If we can, also make sure that - we see the same garbage. */ - fd = open ("conftest.mmap", O_RDWR); - if (fd < 0) - return 9; - if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - return 10; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - return 11; - - /* Finally, make sure that changes to the mapped area do not - percolate back to the file as seen by read(). (This is a bug on - some variants of i386 svr4.0.) */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = (char *) malloc (pagesize); - if (!data3) - return 12; - if (read (fd, data3, pagesize) != pagesize) - return 13; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - return 14; - close (fd); - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_mmap_fixed_mapped=yes -else - ac_cv_func_mmap_fixed_mapped=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 -$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } -if test $ac_cv_func_mmap_fixed_mapped = yes; then - -$as_echo "#define HAVE_MMAP 1" >>confdefs.h - -fi -rm -f conftest.mmap conftest.txt - - -if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then - FILEMAP=unixfilemap -else - FILEMAP=readfilemap -fi - - - -# AC_CPP_FUNC -# ------------------ # -# Checks to see if ANSI C99 CPP variable __func__ works. -# If not, perhaps __FUNCTION__ works instead. -# If not, we'll just define __func__ to "". -# AC_CPP_FUNC - - case $ac_cv_prog_cc_stdc in #( - no) : - ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( - *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 -$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } -if ${ac_cv_prog_cc_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#include - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -#define debug(...) fprintf (stderr, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) -{ - int x = 1234; - int y = 5678; - debug ("Flag"); - debug ("X = %d\n", x); - showlist (The first, second, and third items.); - report (x>y, "x is %d but y is %d", x, y); -} - -// Check long long types. -#define BIG64 18446744073709551615ull -#define BIG32 4294967295ul -#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) -#if !BIG_OK - your preprocessor is broken; -#endif -#if BIG_OK -#else - your preprocessor is broken; -#endif -static long long int bignum = -9223372036854775807LL; -static unsigned long long int ubignum = BIG64; - -struct incomplete_array -{ - int datasize; - double data[]; -}; - -struct named_init { - int number; - const wchar_t *name; - double average; -}; - -typedef const char *ccp; - -static inline int -test_restrict (ccp restrict text) -{ - // See if C++-style comments work. - // Iterate through items via the restricted pointer. - // Also check for declarations in for loops. - for (unsigned int i = 0; *(text+i) != '\0'; ++i) - continue; - return 0; -} - -// Check varargs and va_copy. -static void -test_varargs (const char *format, ...) -{ - va_list args; - va_start (args, format); - va_list args_copy; - va_copy (args_copy, args); - - const char *str; - int number; - float fnumber; - - while (*format) - { - switch (*format++) - { - case 's': // string - str = va_arg (args_copy, const char *); - break; - case 'd': // int - number = va_arg (args_copy, int); - break; - case 'f': // float - fnumber = va_arg (args_copy, double); - break; - default: - break; - } - } - va_end (args_copy); - va_end (args); -} - -int -main () -{ - - // Check bool. - _Bool success = false; - - // Check restrict. - if (test_restrict ("String literal") == 0) - success = true; - char *restrict newvar = "Another string"; - - // Check varargs. - test_varargs ("s, d' f .", "string", 65, 34.234); - test_varargs_macros (); - - // Check flexible array members. - struct incomplete_array *ia = - malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); - ia->datasize = 10; - for (int i = 0; i < ia->datasize; ++i) - ia->data[i] = i * 1.234; - - // Check named initializers. - struct named_init ni = { - .number = 34, - .name = L"Test wide string", - .average = 543.34343, - }; - - ni.number = 58; - - int dynamic_array[ni.number]; - dynamic_array[ni.number - 1] = 543; - - // work around unused variable warnings - return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' - || dynamic_array[ni.number - 1] != 543); - - ; - return 0; -} -_ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c99=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c99" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c99" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c99" != xno; then : - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* 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" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 -else - ac_cv_prog_cc_stdc=no -fi - -fi - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 -$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } - if ${ac_cv_prog_cc_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -fi - - case $ac_cv_prog_cc_stdc in #( - no) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; #( - '') : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; #( - *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 -$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C99-conforming __func__" >&5 -$as_echo_n "checking for an ANSI C99-conforming __func__... " >&6; } -if ${ac_cv_cpp_func+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -char *foo = __func__; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_cpp_func=yes -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -char *foo = __FUNCTION__; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_cpp_func=__FUNCTION__ -else - ac_cv_cpp_func=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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_func" >&5 -$as_echo "$ac_cv_cpp_func" >&6; } -if test $ac_cv_cpp_func = __FUNCTION__; then - -$as_echo "#define __func__ __FUNCTION__" >>confdefs.h - -elif test $ac_cv_cpp_func = no; then - -$as_echo "#define __func__ \"\"" >>confdefs.h - -fi - - - - -$as_echo "#define XML_NS 1" >>confdefs.h - - -$as_echo "#define XML_DTD 1" >>confdefs.h - - -$as_echo "#define XML_CONTEXT_BYTES 1024" >>confdefs.h - - -ac_config_files="$ac_config_files Makefile expat.pc" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; 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 - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -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 - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# 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 - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 expat $as_me 2.1.0, which was -generated by GNU Autoconf 2.68. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -expat config.status 2.1.0 -configured by $0, generated by GNU Autoconf 2.68, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2010 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' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# - - -# 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 - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in AS \ -DLLTOOL \ -OBJDUMP \ -SHELL \ -ECHO \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_flag_spec_ld_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "expat_config.h") CONFIG_HEADERS="$CONFIG_HEADERS expat_config.h" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "expat.pc") CONFIG_FILES="$CONFIG_FILES expat.pc" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[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="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "libtool":C) - - # 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 - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Assembler program. -AS=$lt_AS - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Object dumper program. -OBJDUMP=$lt_OBJDUMP - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# 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 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# 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 - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# 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 - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# 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 - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# 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 - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# 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 - -# 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 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# 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 - -# 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 - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# 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 a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# 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 DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# 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 - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# 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 - -# 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 - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -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 - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_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 -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # 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) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# 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 - -# 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 - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# 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 a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# 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 DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_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 - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_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 - -# 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 - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -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 - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# 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 || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - -abs_srcdir="`cd $srcdir && pwd`" -abs_builddir="`pwd`" -if test "$abs_srcdir" != "$abs_builddir"; then - make mkdir-init -fi diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in deleted file mode 100644 index 7e968c46..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in +++ /dev/null @@ -1,155 +0,0 @@ -dnl configuration script for expat -dnl Process this file with autoconf to produce a configure script. -dnl -dnl Copyright 2000 Clark Cooper -dnl -dnl This file is part of EXPAT. -dnl -dnl EXPAT is free software; you can redistribute it and/or modify it -dnl under the terms of the License (based on the MIT/X license) contained -dnl in the file COPYING that comes with this distribution. -dnl - -dnl Ensure that Expat is configured with autoconf 2.58 or newer -AC_PREREQ(2.58) - -dnl Get the version number of Expat, using m4's esyscmd() command to run -dnl the command at m4-generation time. This allows us to create an m4 -dnl symbol holding the correct version number. AC_INIT() requires the -dnl version number at m4-time, rather than when ./configure is run, so -dnl all this must happen as part of m4, not as part of the shell code -dnl contained in ./configure. -dnl -dnl NOTE: esyscmd() is a GNU M4 extension. Thus, we wrap it in an appropriate -dnl test. I believe this test will work, but I don't have a place with non- -dnl GNU M4 to test it right now. -define([expat_version], ifdef([__gnu__], - [esyscmd(conftools/get-version.sh lib/expat.h)], - [2.1.x])) -AC_INIT(expat, expat_version, expat-bugs@libexpat.org) -undefine([expat_version]) - -AC_CONFIG_SRCDIR(Makefile.in) -AC_CONFIG_AUX_DIR(conftools) -AC_CONFIG_MACRO_DIR([m4]) - - -dnl -dnl Increment LIBREVISION if source code has changed at all -dnl -dnl If the API has changed, increment LIBCURRENT and set LIBREVISION to 0 -dnl -dnl If the API changes compatibly (i.e. simply adding a new function -dnl without changing or removing earlier interfaces), then increment LIBAGE. -dnl -dnl If the API changes incompatibly set LIBAGE back to 0 -dnl - -LIBCURRENT=7 -LIBREVISION=0 -LIBAGE=6 - -AC_CONFIG_HEADER(expat_config.h) - -sinclude(conftools/ac_c_bigendian_cross.m4) - -AC_LIBTOOL_WIN32_DLL -AC_PROG_LIBTOOL - -AC_SUBST(LIBCURRENT) -AC_SUBST(LIBREVISION) -AC_SUBST(LIBAGE) - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CXX -AC_PROG_INSTALL - -if test "$GCC" = yes ; then - dnl - dnl Be careful about adding the -fexceptions option; some versions of - dnl GCC don't support it and it causes extra warnings that are only - dnl distracting; avoid. - dnl - OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes" - CFLAGS="$OLDCFLAGS -fexceptions" - AC_MSG_CHECKING(whether $CC accepts -fexceptions) - AC_TRY_LINK( , , - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no); CFLAGS="$OLDCFLAGS") - CXXFLAGS=`echo "$CFLAGS" | sed 's/ -Wmissing-prototypes -Wstrict-prototypes//'` -fi - -dnl Checks for header files. -AC_HEADER_STDC - -dnl Checks for typedefs, structures, and compiler characteristics. - -dnl Note: Avoid using AC_C_BIGENDIAN because it does not -dnl work in a cross compile. -AC_C_BIGENDIAN_CROSS - -AC_C_CONST -AC_TYPE_SIZE_T -AC_CHECK_FUNCS(memmove bcopy) - -dnl Only needed for xmlwf: -AC_CHECK_HEADERS(fcntl.h unistd.h) -AC_TYPE_OFF_T -AC_FUNC_MMAP - -if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then - FILEMAP=unixfilemap -else - FILEMAP=readfilemap -fi -AC_SUBST(FILEMAP) - -dnl Needed for the test support code; this was found at -dnl http://lists.gnu.org/archive/html/bug-autoconf/2002-07/msg00028.html - -# AC_CPP_FUNC -# ------------------ # -# Checks to see if ANSI C99 CPP variable __func__ works. -# If not, perhaps __FUNCTION__ works instead. -# If not, we'll just define __func__ to "". -AC_DEFUN([AC_CPP_FUNC], -[AC_REQUIRE([AC_PROG_CC_STDC])dnl -AC_CACHE_CHECK([for an ANSI C99-conforming __func__], ac_cv_cpp_func, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], -[[char *foo = __func__;]])], - [ac_cv_cpp_func=yes], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], -[[char *foo = __FUNCTION__;]])], - [ac_cv_cpp_func=__FUNCTION__], - [ac_cv_cpp_func=no])])]) -if test $ac_cv_cpp_func = __FUNCTION__; then - AC_DEFINE(__func__,__FUNCTION__, - [Define to __FUNCTION__ or "" if `__func__' does not conform to -ANSI C.]) -elif test $ac_cv_cpp_func = no; then - AC_DEFINE(__func__,"", - [Define to __FUNCTION__ or "" if `__func__' does not conform to -ANSI C.]) -fi -])# AC_CPP_FUNC - -AC_CPP_FUNC - - -dnl Some basic configuration: -AC_DEFINE([XML_NS], 1, - [Define to make XML Namespaces functionality available.]) -AC_DEFINE([XML_DTD], 1, - [Define to make parameter entity parsing functionality available.]) -AC_DEFINE([XML_CONTEXT_BYTES], 1024, - [Define to specify how much context to retain around the current parse point.]) - -AC_CONFIG_FILES([Makefile expat.pc]) -AC_OUTPUT - -abs_srcdir="`cd $srcdir && pwd`" -abs_builddir="`pwd`" -if test "$abs_srcdir" != "$abs_builddir"; then - make mkdir-init -fi diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath deleted file mode 100644 index e8559a3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh -# Look for program[s] somewhere in $PATH. -# -# Options: -# -s -# Do not print out full pathname. (silent) -# -pPATHNAME -# Look in PATHNAME instead of $PATH -# -# Usage: -# PrintPath [-s] [-pPATHNAME] program [program ...] -# -# Initially written by Jim Jagielski for the Apache configuration mechanism -# (with kudos to Kernighan/Pike) -# -# This script falls under the Apache License. -# See http://www.apache.org/licenses/LICENSE - -## -# Some "constants" -## -pathname=$PATH -echo="yes" - -## -# Find out what OS we are running for later on -## -os=`(uname) 2>/dev/null` - -## -# Parse command line -## -for args in $* -do - case $args in - -s ) echo="no" ;; - -p* ) pathname="`echo $args | sed 's/^..//'`" ;; - * ) programs="$programs $args" ;; - esac -done - -## -# Now we make the adjustments required for OS/2 and everyone -# else :) -# -# First of all, all OS/2 programs have the '.exe' extension. -# Next, we adjust PATH (or what was given to us as PATH) to -# be whitespace separated directories. -# Finally, we try to determine the best flag to use for -# test/[] to look for an executable file. OS/2 just has '-r' -# but with other OSs, we do some funny stuff to check to see -# if test/[] knows about -x, which is the preferred flag. -## - -if [ "x$os" = "xOS/2" ] -then - ext=".exe" - pathname=`echo -E $pathname | - sed 's/^;/.;/ - s/;;/;.;/g - s/;$/;./ - s/;/ /g - s/\\\\/\\//g' ` - test_exec_flag="-r" -else - ext="" # No default extensions - pathname=`echo $pathname | - sed 's/^:/.:/ - s/::/:.:/g - s/:$/:./ - s/:/ /g' ` - # Here is how we test to see if test/[] can handle -x - testfile="pp.t.$$" - - cat > $testfile </dev/null`; then - test_exec_flag="-x" - else - test_exec_flag="-r" - fi - rm -f $testfile -fi - -for program in $programs -do - for path in $pathname - do - if [ $test_exec_flag $path/${program}${ext} ] && \ - [ ! -d $path/${program}${ext} ]; then - if [ "x$echo" = "xyes" ]; then - echo $path/${program}${ext} - fi - exit 0 - fi - -# Next try without extension (if one was used above) - if [ "x$ext" != "x" ]; then - if [ $test_exec_flag $path/${program} ] && \ - [ ! -d $path/${program} ]; then - if [ "x$echo" = "xyes" ]; then - echo $path/${program} - fi - exit 0 - fi - fi - done -done -exit 1 - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 deleted file mode 100644 index 67577364..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 +++ /dev/null @@ -1,81 +0,0 @@ -dnl @synopsis AC_C_BIGENDIAN_CROSS -dnl -dnl Check endianess even when crosscompiling -dnl (partially based on the original AC_C_BIGENDIAN). -dnl -dnl The implementation will create a binary, and instead of running -dnl the binary it will be grep'ed for some symbols that will look -dnl different for different endianess of the binary. -dnl -dnl @version $Id: ac_c_bigendian_cross.m4,v 1.1 2012/06/15 13:38:48 dromagod Exp $ -dnl @author Guido Draheim -dnl -AC_DEFUN([AC_C_BIGENDIAN_CROSS], -[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, -[ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -AC_TRY_COMPILE([#include -#include ], [ -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. -AC_TRY_COMPILE([#include -#include ], [ -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) -if test $ac_cv_c_bigendian = unknown; then -AC_TRY_RUN([main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); -}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, -[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) -fi]) -if test $ac_cv_c_bigendian = unknown; then -AC_MSG_CHECKING(to probe for byte ordering) -[ -cat >conftest.c <&AC_FD_MSG - ac_cv_c_bigendian=yes - fi - if test `grep -l LiTTleEnDian conftest.o` ; then - echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG - if test $ac_cv_c_bigendian = yes ; then - ac_cv_c_bigendian=unknown; - else - ac_cv_c_bigendian=no - fi - fi - echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG - fi - fi -AC_MSG_RESULT($ac_cv_c_bigendian) -fi -if test $ac_cv_c_bigendian = yes; then - AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) - BYTEORDER=4321 -else - BYTEORDER=1234 -fi -AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) -if test $ac_cv_c_bigendian = unknown; then - AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) -fi -]) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess deleted file mode 100644 index 40eaed48..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess +++ /dev/null @@ -1,1517 +0,0 @@ -#! /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, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-05-11' - -# 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 (context -# diff format) to and include a 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. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -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, 2006, 2007, 2008, 2009, 2010, 2011 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 "$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 ;; - sh5el) machine=sh5le-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 -q __ELF__ - 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 ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-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'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - 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 ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - 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:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-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:*:[4567]) - 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 -q __LP64__ - 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:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *: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 ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-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 ;; - 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 -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*: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 ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - 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:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - 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 ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-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 ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-tilera-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - 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.[02]*:*) - 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 i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-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; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - 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; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) - 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 ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - 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 ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-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 - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - 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 ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - 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 ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - 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/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub deleted file mode 100644 index 30fdca81..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub +++ /dev/null @@ -1,1760 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-03-23' - -# 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 GNU 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. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# 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, 2006, 2007, 2008, 2009, 2010, 2011 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-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-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 | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -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 | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # 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 - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-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-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | 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-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile-* | tilegx-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # 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 - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - 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 - ;; - cr16 | cr16-*) - basic_machine=cr16-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 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - 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 - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - 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 - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - 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 - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - 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 | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - 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 - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - 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 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - 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 - ;; - # This must be matched before tile*. - tilegx*) - basic_machine=tilegx-unknown - os=-linux-gnu - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - 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 - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-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[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - 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. - -auroraux) - os=-auroraux - ;; - -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* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -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* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -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* | -toppers* | -drops* | -es*) - # 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 - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -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 - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - 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 - ;; - mep-*) - os=-elf - ;; - 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 - ;; - -cnk*|-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/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 deleted file mode 100644 index 57e579b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 +++ /dev/null @@ -1,43 +0,0 @@ -dnl Check if --with-expat[=PREFIX] is specified and -dnl Expat >= 1.95.0 is installed in the system. -dnl If yes, substitute EXPAT_CFLAGS, EXPAT_LIBS with regard to -dnl the specified PREFIX and set with_expat to PREFIX, or 'yes' if PREFIX -dnl has not been specified. Also HAVE_LIBEXPAT, HAVE_EXPAT_H are defined. -dnl If --with-expat has not been specified, set with_expat to 'no'. -dnl In addition, an Automake conditional EXPAT_INSTALLED is set accordingly. -dnl This is necessary to adapt a whole lot of packages that have expat -dnl bundled as a static library. -AC_DEFUN([AM_WITH_EXPAT], -[ AC_ARG_WITH(expat, - [ --with-expat=PREFIX Use system Expat library], - , with_expat=no) - - AM_CONDITIONAL(EXPAT_INSTALLED, test $with_expat != no) - - EXPAT_CFLAGS= - EXPAT_LIBS= - if test $with_expat != no; then - if test $with_expat != yes; then - EXPAT_CFLAGS="-I$with_expat/include" - EXPAT_LIBS="-L$with_expat/lib" - fi - AC_CHECK_LIB(expat, XML_ParserCreate, - [ EXPAT_LIBS="$EXPAT_LIBS -lexpat" - expat_found=yes ], - [ expat_found=no ], - "$EXPAT_LIBS") - if test $expat_found = no; then - AC_MSG_ERROR([Could not find the Expat library]) - fi - expat_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $EXPAT_CFLAGS" - AC_CHECK_HEADERS(expat.h, , expat_found=no) - if test $expat_found = no; then - AC_MSG_ERROR([Could not find expat.h]) - fi - CFLAGS="$expat_save_CFLAGS" - fi - - AC_SUBST(EXPAT_CFLAGS) - AC_SUBST(EXPAT_LIBS) -]) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh deleted file mode 100644 index a70e0fb4..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# USAGE: get-version.sh path/to/expat.h -# -# This script will print Expat's version number on stdout. For example: -# -# $ ./conftools/get-version.sh ./lib/expat.h -# 1.95.3 -# $ -# - -if test $# = 0; then - echo "ERROR: pathname for expat.h was not provided." - echo "" - echo "USAGE: $0 path/to/expat.h" - exit 1 -fi -if test $# != 1; then - echo "ERROR: too many arguments were provided." - echo "" - echo "USAGE: $0 path/to/expat.h" - exit 1 -fi - -hdr="$1" -if test ! -r "$hdr"; then - echo "ERROR: '$hdr' does not exist, or is not readable." - exit 1 -fi - -MAJOR_VERSION="`sed -n -e '/MAJOR_VERSION/s/[^0-9]*//gp' $hdr`" -MINOR_VERSION="`sed -n -e '/MINOR_VERSION/s/[^0-9]*//gp' $hdr`" -MICRO_VERSION="`sed -n -e '/MICRO_VERSION/s/[^0-9]*//gp' $hdr`" - -# Determine how to tell echo not to print the trailing \n. This is -# similar to Autoconf's @ECHO_C@ and @ECHO_N@; however, we don't -# generate this file via autoconf (in fact, get-version.sh is used -# to *create* ./configure), so we just do something similar inline. -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ;; - *c*,* ) ECHO_N=-n ECHO_C= ;; - *) ECHO_N= ECHO_C='\c' ;; -esac - -echo $ECHO_N "$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$ECHO_C" diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh deleted file mode 100644 index 6781b987..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# 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. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; 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 - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 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. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh deleted file mode 100644 index b4a3231c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh +++ /dev/null @@ -1,9642 +0,0 @@ - -# libtool (GNU libtool) 2.4 -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010 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. - -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [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 -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# 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. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4 Debian-2.4-2ubuntu1 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4 Debian-2.4-2ubuntu1" -TIMESTAMP="" -package_revision=1.3293 - -# 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 - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -$lt_unset CDPATH - - -# 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" - - - -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${EGREP="/bin/grep -E"} -: ${FGREP="/bin/grep -F"} -: ${GREP="/bin/grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="/bin/sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=: - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# 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='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# 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 "$opt_dry_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" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "$my_tmpdir" -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# 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= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_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 $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE 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. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# 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 () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - 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 "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # 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. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # 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 - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # 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= - pie_flag= - - 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) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append 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,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_append_quoted lastarg "$arg" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append 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. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # 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 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - 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 "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - 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 $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "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." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/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." - - $opt_dry_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 - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/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." - - $opt_dry_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 - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [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: $progname [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 - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [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 - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -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 - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -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: $progname [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." - ;; - - *) - func_fatal_help "invalid operation mode \`$opt_mode'" - ;; - esac - - echo - $ECHO "Try \`$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test "$opt_help" = :; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - 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 - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # 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 -} - -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - 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" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # 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. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - 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. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append 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 -e "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. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - 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 - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_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 - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append 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 - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_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 - func_basename "$file" - destfile="$func_basename_result" - 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 - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "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) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # 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/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - 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*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - 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 "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# 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. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - 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 - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $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_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - 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 - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_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've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# 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. -sed_quote_subst='$sed_quote_subst' - -# 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 - -# 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 variables: - generated_by_libtool_version='$macro_version' - 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 - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - 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 "\ - - # 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 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - 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 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#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 -# define FOPEN_WB "wb" -# 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 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -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; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - 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 (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - 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 (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - 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 * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -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; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' - - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - 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 - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append 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 - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - 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 - func_append 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. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append 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 - func_append 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" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - 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 - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - 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 - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - 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*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append 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* | *-cegcc* | *-*-haiku*) - # 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 - func_append deplibs " System.ltframework" - 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 - func_append deplibs " $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - 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*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # 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 - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - 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 - func_append 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. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append 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 - func_append 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" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - 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. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'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\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - 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 $opt_preserve_dup_deps ; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append 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 $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append 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 - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - 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 - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - 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%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - 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|-threads) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; 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 func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - 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 - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - 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 - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - 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 - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - 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 use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - 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. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # 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 - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append 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 - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - 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. - func_append dlprefiles " $lib $dependency_libs" - else - func_append 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 - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$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 - func_append notinst_path " $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - 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 - func_append 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*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - 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 $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append 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 "$prefer_static_libs,$installed" = "built,yes"; } || - 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 - *"$absdir:"*) ;; - *) func_append 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 "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append 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 - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && 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 "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - 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* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - 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 "$opt_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 (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; 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 - elif test -n "$old_library"; then - 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 && - test "$hardcode_direct_absolute" = no; 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 - [\\/]*) - func_append 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 - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append 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:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$opt_mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; 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:"*) ;; - *) func_append 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 - [\\/]*) - func_append 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*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - func_append 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" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - 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 "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - 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 "*) ;; - *) func_append 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 "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append 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 - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - 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 - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # 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="$1" - number_minor="$2" - number_revision="$3" - # - # 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|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - 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]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - 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]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - 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]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - 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 - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - 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 - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - 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 - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - 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 - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_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 | *.gcno) - ;; - $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 - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append 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 "*) ;; - *) func_append 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 "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-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 - func_append 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. - $opt_dry_run || $RM conftest.c - cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - 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 "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append 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 - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append 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 - func_append 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 - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; 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 " $tmp_deplibs" | $SED "s,$i,,"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - 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 - ;; - esac - ;; - 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 with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - 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 - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - 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 " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append 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 "$opt_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 - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - 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"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_apped 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 - func_append 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 "$opt_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 - shift - realname="$1" - 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 - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do - IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "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" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_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:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # 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 - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append 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. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - 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~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "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" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - 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\" - test "X$libobjs" = "X " && libobjs= - 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 - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( 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 "$opt_mode" = relink; then - $opt_dry_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 - func_show_eval '${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 - func_show_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 "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_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 and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${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" - # $opt_dry_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" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - 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 "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - func_append compile_command " $compile_deplibs" - func_append 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 "*) ;; - *) func_append 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"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append 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"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append 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 "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - 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 - func_append 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 - func_append 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - 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" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED '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 "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "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}\" || $lt_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 - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - 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 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - 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 $symfileobj" - 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" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append 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 - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # 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 - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$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 - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$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= - len=$len0 - 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 - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "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}\" || $lt_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 - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; 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 "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - 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) - func_basename "$deplib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# 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' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_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 - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - 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) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" - else - odir="$dir/$objdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" - - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - 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 func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case "$opt_mode" in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append 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 - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$opt_mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# 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 -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs deleted file mode 100644 index 879e5292..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -# $Id: mkinstalldirs,v 1.1 2012/06/15 13:38:49 dromagod 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/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png deleted file mode 100644 index 5bc0726cfd8508d0aa53cf53486b0330780b5f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)=T+4e4Js00002VoOIv z0RM-N%)bBt1B6LLK~!ko?U>t@>mUq8)d+=9h#H{~3Q;2}M1^oacv#|LJI>6kWL^9- zPA0}%;&3E@^wk$^{EffyH~z-o_#1!YZ~TqF@i+dTUID;=F}?$c-;2)xAis?t0001j zNt%-%z{k7Vc?VxI{*k8u0Q6v>*t5c2?Yt$PXw%PjDsGSBpo5^>+Idg=&ZOT1xQ8it zs-5@nP5R^goLSTX|Gswa;GZ!0BmMHiOV9CN(9ShJdpvizl70_>=|}LJc3hA*@uO2z zLWqbY!`nd;DbHjK5iuo30Ps=$p3nn;LpsB6(+B{8pW{n(01aP?QUJX4<{6R$U_JW) zX;SU{%D(ckm??#nEW+ z3XW&yX|=z!mNR^r^i4H@$tv#fdGSjnZ?aNtwTnA^*7%yJESEWc9BQ!gKqH75e#shWuW7Wm8RR|3FG{7K8MEuu4uR_# zIO{m=qZz|-nH=gjrMh+%n?(}|gI&XArp#V9+VyqWuwC@~LFu(Nx`=H{PAXZfYFBIY zQ3qA-5y2@Xwk09?Ct)b{@%e5`!m-=JzG#W*bQEdEk6k^Jw%aL2m93!;i=%cfH!C;x zy3t|V1A - - - - - Expat XML Parser - - - - - - - - - - - - - - -
(Expat logo)
Release 2.0.1
-