Merge branch 'master' into v1.10

This commit is contained in:
Andrey Volk 2022-10-14 22:32:45 +03:00
commit 3510866140
1424 changed files with 17909 additions and 185674 deletions

View File

@ -4,18 +4,24 @@ name: unit-tests
steps:
- name: bootstrap
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
commands:
- cat /proc/sys/kernel/core_pattern
- ./bootstrap.sh -j
- name: configure
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
environment:
REPOTOKEN:
from_secret: repotoken
commands:
- echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf
- apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq remove libsofia-sip-ua0 libspandsp-dev
- DEBIAN_FRONTEND=noninteractive apt-get -yq install libspandsp3-dev
- export REPOTOKEN=''
- rm -rf /etc/apt/auth.conf
- git clone https://github.com/freeswitch/sofia-sip.git
- cd sofia-sip && ./autogen.sh && ./configure.gnu && make -j`nproc` && make install && cd ..
- echo 'codecs/mod_openh264' >> modules.conf
@ -23,29 +29,42 @@ steps:
- sed -i '/event_handlers\\/mod_rayo/s/^#//g' modules.conf
- sed -i '/formats\\/mod_opusfile/s/^#//g' modules.conf
- sed -i '/languages\\/mod_lua/s/^#//g' modules.conf
- export ASAN_OPTIONS=log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1;
- ./configure --enable-address-sanitizer
- export ASAN_OPTIONS=log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1:fast_unwind_on_malloc=0
- ./configure --enable-address-sanitizer --enable-fake-dlclose
- name: build
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
environment:
REPOTOKEN:
from_secret: repotoken
commands:
- echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf
- apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq remove libsofia-sip-ua0 libspandsp-dev
- DEBIAN_FRONTEND=noninteractive apt-get -yq install libspandsp3-dev
- export REPOTOKEN=''
- rm -rf /etc/apt/auth.conf
- cd sofia-sip && make install && cd ..
- echo '#!/bin/bash\nmake -j`nproc --all` |& tee ./unit-tests-build-result.txt\nexitstatus=$${PIPESTATUS[0]}\necho $$exitstatus > ./build-status.txt\n' > build.sh
- chmod +x build.sh
- ./build.sh
- name: run-tests
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
environment:
REPOTOKEN:
from_secret: repotoken
commands:
- echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf
- apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq remove libsofia-sip-ua0 libspandsp-dev
- DEBIAN_FRONTEND=noninteractive apt-get -yq install libspandsp3-dev
- export REPOTOKEN=''
- rm -rf /etc/apt/auth.conf
- cd sofia-sip && make install && cd ..
- make install || true
- cd tests/unit
- export ASAN_OPTIONS=log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1:fast_unwind_on_malloc=0
- ./run-tests.sh
- ls -la /cores
- mkdir logs && (mv log_run-tests_*.html logs || true) && (mv backtrace_*.txt logs || true)
@ -78,17 +97,23 @@ name: scan-build
steps:
- name: bootstrap
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
commands:
- ./bootstrap.sh -j
- name: configure
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
environment:
REPOTOKEN:
from_secret: repotoken
commands:
- echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf
- apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq remove libspandsp-dev
- DEBIAN_FRONTEND=noninteractive apt-get -yq install libsofia-sip-ua-dev libspandsp3-dev
- export REPOTOKEN=''
- rm -rf /etc/apt/auth.conf
- cp build/modules.conf.most modules.conf
#Enable/Uncomment mods
- echo 'codecs/mod_openh264' >> modules.conf
@ -115,13 +140,19 @@ steps:
- ./configure
- name: scan-build
image: signalwire/freeswitch-public-base
image: signalwire/freeswitch-public-base:bullseye
pull: always
environment:
REPOTOKEN:
from_secret: repotoken
commands:
- echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf
- apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq remove libspandsp-dev
- DEBIAN_FRONTEND=noninteractive apt-get -yq install libsofia-sip-ua-dev libspandsp3-dev
- export REPOTOKEN=''
- rm -rf /etc/apt/auth.conf
- mkdir -p scan-build
- echo '#!/bin/bash\nscan-build-7 -o ./scan-build/ make -j`nproc --all` |& tee ./scan-build-result.txt\nexitstatus=$${PIPESTATUS[0]}\necho $$exitstatus > ./scan-build-status.txt\n' > scan.sh
- echo '#!/bin/bash\nscan-build-11 -o ./scan-build/ make -j`nproc --all` |& tee ./scan-build-result.txt\nexitstatus=$${PIPESTATUS[0]}\necho $$exitstatus > ./scan-build-status.txt\n' > scan.sh
- chmod +x scan.sh
- ./scan.sh
- exitstatus=`cat ./scan-build-status.txt`
@ -147,6 +178,6 @@ trigger:
---
kind: signature
hmac: a85b0db203d2c9a71c3e4a63a46b5513fbdb3b8f5135e21d0fe0992f33626824
hmac: 780e4aaee61e3683ea4a8d6fe5131f7c9e62ebad727546013f18df0fca80d705
...

View File

@ -69,7 +69,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoloa
conf\vanilla\autoload_configs\conference.conf.xml = conf\vanilla\autoload_configs\conference.conf.xml
conf\vanilla\autoload_configs\console.conf.xml = conf\vanilla\autoload_configs\console.conf.xml
conf\vanilla\autoload_configs\dialplan_directory.conf.xml = conf\vanilla\autoload_configs\dialplan_directory.conf.xml
conf\vanilla\autoload_configs\dingaling.conf.xml = conf\vanilla\autoload_configs\dingaling.conf.xml
conf\vanilla\autoload_configs\enum.conf.xml = conf\vanilla\autoload_configs\enum.conf.xml
conf\vanilla\autoload_configs\event_multicast.conf.xml = conf\vanilla\autoload_configs\event_multicast.conf.xml
conf\vanilla\autoload_configs\event_socket.conf.xml = conf\vanilla\autoload_configs\event_socket.conf.xml
@ -166,8 +165,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sound Files", "Sound Files", "{4F227C26-768F-46A3-8684-1D08A46FB374}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unimrcp", "unimrcp", "{62F27B1A-C919-4A70-8478-51F178F3B18F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.2017.vcxproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2017.vcxproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
@ -198,8 +195,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cepstral", "src\mod\asr
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.2017.vcxproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.2017.vcxproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.2017.vcxproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_console", "src\mod\loggers\mod_console\mod_console.2017.vcxproj", "{1C453396-D912-4213-89FD-9B489162B7B5}"
@ -217,20 +212,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\appl
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.2017.vcxproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.2017.vcxproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.2017.vcxproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2017.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2017.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.2017.vcxproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2017.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2017.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2017.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pthread", "libs\win32\pthread\pthread.2017.vcxproj", "{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}"
@ -380,29 +369,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbroadvoice", "libs\win32
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_bv", "src\mod\codecs\mod_bv\mod_bv.2017.vcxproj", "{D5C87B19-150D-4EF3-A671-96589BD2D14A}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aprtoolkit", "libs\unimrcp\libs\apr-toolkit\aprtoolkit.2017.vcxproj", "{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}"
ProjectSection(ProjectDependencies) = postProject
{155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpf", "libs\unimrcp\libs\mpf\mpf.2017.vcxproj", "{B5A00BFA-6083-4FAE-A097-71642D6473B5}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcp", "libs\unimrcp\libs\mrcp\mrcp.2017.vcxproj", "{1C320193-46A6-4B34-9C56-8AB584FC1B56}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpclient", "libs\unimrcp\libs\mrcp-client\mrcpclient.2017.vcxproj", "{72782932-37CC-46AE-8C7F-9A7B1A6EE108}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsignaling", "libs\unimrcp\libs\mrcp-signaling\mrcpsignaling.2017.vcxproj", "{12A49562-BAB9-43A3-A21D-15B60BBB4C31}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2transport", "libs\unimrcp\libs\mrcpv2-transport\mrcpv2transport.2017.vcxproj", "{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unirtsp", "libs\unimrcp\libs\uni-rtsp\unirtsp.2017.vcxproj", "{504B3154-7A4F-459D-9877-B951021C3F1F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\unimrcp\modules\mrcp-sofiasip\mrcpsofiasip.2017.vcxproj", "{746F3632-5BB2-4570-9453-31D6D58A7D8E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpunirtsp", "libs\unimrcp\modules\mrcp-unirtsp\mrcpunirtsp.2017.vcxproj", "{DEB01ACB-D65F-4A62-AED9-58C1054499E9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_unimrcp", "src\mod\asr_tts\mod_unimrcp\mod_unimrcp.2017.vcxproj", "{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "libs\win32\celt\libcelt.2017.vcxproj", "{ABB71A76-42B0-47A4-973A-42E3D920C6FD}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FSComm", "fscomm\FSComm.2017.vcxproj", "{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}"
@ -752,17 +718,6 @@ Global
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64
@ -840,17 +795,6 @@ Global
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64
@ -884,17 +828,6 @@ Global
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64
@ -906,17 +839,6 @@ Global
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64
@ -1697,116 +1619,6 @@ Global
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64
@ -2739,7 +2551,6 @@ Global
{713E4747-1126-40B1-BD84-58F9A7745423} = {57199684-EC63-4A60-9DC6-11815AF6B413}
{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
{62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
{5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
@ -2753,7 +2564,6 @@ Global
{8B754330-A434-4791-97E5-1EE67060BAC0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
{692F6330-4D87-4C82-81DF-40DB5892636E} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
{D3EC0AFF-76FC-4210-A825-9A17410660A3} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{1C453396-D912-4213-89FD-9B489162B7B5} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}
{CBEC7225-0C21-4DA8-978E-1F158F8AD950} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
@ -2761,13 +2571,10 @@ Global
{C24FB505-05D7-4319-8485-7540B44C8603} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{05515420-16DE-4E63-BE73-85BE85BA5142} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
{1906D736-08BD-4EE1-924F-B536249B9A54} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
@ -2840,16 +2647,6 @@ Global
{432DB165-1EB2-4781-A9C0-71E62610B20A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{CF70F278-3364-4395-A2E1-23501C9B8AD2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{D5C87B19-150D-4EF3-A671-96589BD2D14A} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{B5A00BFA-6083-4FAE-A097-71642D6473B5} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{1C320193-46A6-4B34-9C56-8AB584FC1B56} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{72782932-37CC-46AE-8C7F-9A7B1A6EE108} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{12A49562-BAB9-43A3-A21D-15B60BBB4C31} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{504B3154-7A4F-459D-9877-B951021C3F1F} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{746F3632-5BB2-4570-9453-31D6D58A7D8E} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{DEB01ACB-D65F-4A62-AED9-58C1054499E9} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
{ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{AFA983D6-4569-4F88-BA94-555ED00FD9A8} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}

19
LICENSE
View File

@ -3,8 +3,8 @@ Upstream-Name: freeswitch
Source: https://freeswitch.org/
Files: *
Copyright: 2005-2014 Anthony Minessale II <anthm@freeswitch.org>
2005-2014 Anthony Minessale II
Copyright: 2005-2022 Anthony Minessale II <anthm@freeswitch.org>
2005-2022 Anthony Minessale II
License: MPL-1.1
MOZILLA PUBLIC LICENSE
Version 1.1
@ -1011,12 +1011,6 @@ License: MPL-1.1 or GPL-2+
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]
Files: libs/unimrcp/*
Copyright: 2008-2010 Arsen Chaloyan
2009-2010 Tomas Valenta, Arsen Chaloyan
2001-2006 Steve Underwood
License: Apache-2.0
Files: */inet_pton.c
libs/curl/lib/inet_ntop.c
libs/curl/lib/mprintf.c
@ -1595,15 +1589,6 @@ Files: libs/silk/*
Copyright: 2006-2011, Skype Limited.
License: BSD-2-clause
Files: libs/libdingaling/*
Copyright: 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
2001-2003 Allan Saddi <allan@saddi.com>
License: MPL-1.1
Files: libs/libdingaling/src/sha1.[ch]
Copyright: 2001-2003 Allan Saddi <allan@saddi.com>
License: BSD-2-clause
Files: libs/libcodec2/*
Copyright: 1990-2010 David Rowe
1990-2010 David Rowe 2009

View File

@ -15,16 +15,6 @@ AM_LIBAPR_CPPFLAGS := $(shell ./libs/apr/apr-1-config --cppflags --includes)
AM_LIBAPR_LDFLAGS := $(shell ./libs/apr/apr-1-config --ldflags)
AM_LIBAPR_LIBS := $(subst $(switch_builddir)/,,$(shell ./libs/apr/apr-1-config \--libs))
endif
if SYSTEM_APRUTIL
AM_LIBAPU_CPPFLAGS := $(shell apu-1-config --includes)
AM_LIBAPU_LDFLAGS := $(shell apu-1-config --ldflags)
AM_LIBAPU_LIBS := $(shell apu-1-config \--libs)
AM_LIBAPU_LINKLIBTOOL := $(shell apu-1-config \--link-libtool)
else
AM_LIBAPU_CPPFLAGS := $(shell ./libs/apr-util/apu-1-config --includes)
AM_LIBAPU_LDFLAGS := $(shell ./libs/apr-util/apu-1-config --ldflags)
AM_LIBAPU_LIBS := $(subst $(switch_builddir)/,,$(shell ./libs/apr-util/apu-1-config \--libs))
endif
AM_CFLAGS = $(SWITCH_AM_CFLAGS) $(SWITCH_ANSI_CFLAGS)
@ -141,11 +131,6 @@ CORE_LIBS=
if ENABLE_LIBVPX
CORE_LIBS += libs/libvpx/libvpx.a
endif
if SYSTEM_APRUTIL
CORE_LIBS += $(AM_LIBAPU_LINKLIBTOOL)
else
CORE_LIBS += libs/apr-util/libaprutil-1.la
endif
if SYSTEM_APR
CORE_LIBS += $(AM_LIBAPR_LINKLIBTOOL)
else
@ -310,6 +295,7 @@ library_include_HEADERS = \
src/include/switch_jitterbuffer.h \
src/include/switch_estimators.h \
src/include/switch_rtcp_frame.h \
src/include/switch_spandsp.h \
src/include/switch_stun.h \
src/include/switch_nat.h \
src/include/switch_log.h \
@ -339,6 +325,7 @@ nodist_libfreeswitch_la_SOURCES = \
libfreeswitch_la_SOURCES = \
src/switch_apr.c \
src/switch_apr_queue.c \
src/switch_buffer.c \
src/switch_caller.c \
src/switch_channel.c \
@ -385,6 +372,7 @@ libfreeswitch_la_SOURCES = \
src/switch_ivr_say.c \
src/switch_ivr_menu.c \
src/switch_ivr.c \
src/switch_spandsp.c \
src/switch_stun.c \
src/switch_nat.c \
src/switch_log.c \
@ -598,9 +586,6 @@ libs/apr/Makefile: libs/apr/Makefile.in libs/apr/config.status libs/apr libs/apr
libs/apr/libapr-1.la: libs/apr/Makefile libs/apr/.update
@if [ $(MAKELEVEL) = 0 -o -z "`echo "$(MAKEARGS)" | grep "j"`" ] ; then touch $(switch_srcdir)/src/include/switch.h; cd libs/apr && $(MAKE) $(MFLAGS) && touch libapr-1.la; fi
libs/apr-util/libaprutil-1.la: libs/apr/libapr-1.la libs/apr-util libs/apr-util/.update
@if [ $(MAKELEVEL) = 0 -o -z "`echo "$(MAKEARGS)" | grep "j"`" ] ; then touch $(switch_srcdir)/src/include/switch.h; cd libs/apr-util && $(MAKE) $(MFLAGS) && touch libaprutil-1.la; fi
SRTP_SRC = libs/srtp/srtp/srtp.c libs/srtp/crypto/cipher/cipher.c libs/srtp/crypto/cipher/null_cipher.c \
libs/srtp/crypto/cipher/aes.c libs/srtp/crypto/cipher/aes_icm.c \
libs/srtp/crypto/hash/null_auth.c libs/srtp/crypto/hash/sha1.c \
@ -700,7 +685,7 @@ yesdepends:
rm .nodepends
iksemel-dep:
make -C src/mod/endpoints/mod_dingaling deps
make -C src/mod/formats/mod_ssml deps
core: $(switch_builddir)/modules.conf src/include/switch_version.h $(CORE_LIBS)
$(MAKE) $(AM_MAKEFLAGS) libfreeswitch.la
@ -780,7 +765,7 @@ iks-reconf:
cd libs/iksemel && $(MAKE) clean
cd libs/iksemel && autoreconf -fi
cd libs/iksemel && sh ./configure.gnu $(MY_DEFAULT_ARGS)
$(MAKE) mod_dingaling-clean
$(MAKE) mod_ssml-clean
cluecon:
@clear

View File

@ -24,15 +24,26 @@ The main index for documentation is available at:
* https://freeswitch.org/confluence/
### Release notes:
* https://freeswitch.org/confluence/display/FREESWITCH/Release+Notes
### Installation
### Install from packages
Step by step tutorials to install FreeSWITCH from packages or source code are available at:
Step by step tutorials to install FreeSWITCH from packages:
* [Debian 10 Buster](https://freeswitch.org/confluence/display/FREESWITCH/Debian+10+Buster) [<b>Recommended</b>]
* [Debian](https://freeswitch.org/confluence/display/FREESWITCH/Debian) [<b>Recommended</b>]
* [Raspberry Pi](https://freeswitch.org/confluence/display/FREESWITCH/Raspberry+Pi)
* [CentOS 7](https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7)
### Build from source
Example Dockerfiles to build FreeSWITCH and dependencies from source:
* https://github.com/signalwire/freeswitch/tree/dockerfile/docker/examples
Step by step tutorials to build FreeSWITCH with provided dependency packages:
* [Debian](https://freeswitch.org/confluence/display/FREESWITCH/Debian#Debian-buildfromsource) [<b>Recommended</b>]
* [Raspberry Pi](https://freeswitch.org/confluence/display/FREESWITCH/Raspberry+Pi)
* [CentOS 7](https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7)

View File

@ -10,7 +10,7 @@ BGJOB=false
VERBOSE=false
BASEDIR=`pwd`;
LIBDIR=${BASEDIR}/libs;
SUBDIRS="apr libzrtp iksemel libdingaling srtp unimrcp fs";
SUBDIRS="apr libzrtp iksemel srtp fs";
while getopts 'jhd:v' o; do
case "$o" in
@ -170,9 +170,6 @@ bootstrap_apr() {
# Remove autoconf 2.5x's cache directory
rm -rf autom4te*.cache
echo "Entering directory ${LIBDIR}/apr-util"
cd ${LIBDIR}/apr-util
./buildconf
}
bootstrap_libzrtp() {

View File

@ -1,6 +0,0 @@
#!/bin/sh
base=`pwd`
cd libs/unimrcp
./configure --with-pocketsphinx=$base/libs/pocketsphinx-0.5.99 --with-sphinxbase=$base/libs/sphinxbase-0.4.99 --with-flite=$base/libs/flite-1.3.99 --with-apr=$base/libs/apr --with-apr-util=$base/libs/apr-util --with-sofia-sip=$base/libs/sofia-sip --prefix=/usr/local/unimrcpserver --enable-pocketsphinx-plugin --enable-flite-plugin --disable-demosynth-plugin --disable-demorecog-plugin --disable-recorder-plugin --disable-cepstral-plugin
make
make install

View File

@ -188,7 +188,7 @@ $(MODNAME).o: $(MODDIR)/$(SOURCEFILE) \
$(switch_srcdir)/src/include/switch_event.h $(switch_srcdir)/src/include/switch_resample.h \
$(switch_srcdir)/src/include/switch_ivr.h $(switch_srcdir)/src/include/switch_rtp.h \
$(switch_srcdir)/src/include/switch_stun.h $(switch_srcdir)/src/include/switch_log.h \
$(switch_srcdir)/src/include/switch_xml.h
$(switch_srcdir)/src/include/switch_xml.h $(switch_srcdir)/src/include/switch_spandsp.h
@echo Compiling $<...
if test -f "$(CSOURCEFILE)" -o -f "$(MODDIR)/$(CSOURCEFILE)"; then \
if test ! -z $(VERBOSE) ; then echo $(COMPILE) -c -o $@ `test -f '$<' || echo '$(MODDIR)/'`$< ; fi ;\
@ -211,7 +211,7 @@ $(MODNAME).lo: $(MODDIR)/$(SOURCEFILE) \
$(switch_srcdir)/src/include/switch_event.h $(switch_srcdir)/src/include/switch_resample.h \
$(switch_srcdir)/src/include/switch_ivr.h $(switch_srcdir)/src/include/switch_rtp.h \
$(switch_srcdir)/src/include/switch_stun.h $(switch_srcdir)/src/include/switch_log.h \
$(switch_srcdir)/src/include/switch_xml.h
$(switch_srcdir)/src/include/switch_xml.h $(switch_srcdir)/src/include/switch_spandsp.h
@echo Compiling $<...
if test -f "$(CSOURCEFILE)" -o -f "$(MODDIR)/$(CSOURCEFILE)"; then \
if test ! -z $(VERBOSE) ; then echo $(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(MODDIR)/'`$< ; fi ;\
@ -261,6 +261,8 @@ $(switch_srcdir)/src/include/switch_ivr.h:
$(switch_srcdir)/src/include/switch_rtp.h:
$(switch_srcdir)/src/include/switch_spandsp.h:
$(switch_srcdir)/src/include/switch_stun.h:
$(switch_srcdir)/src/include/switch_log.h:

View File

@ -60,7 +60,6 @@ applications/mod_voicemail
#asr_tts/mod_flite
#asr_tts/mod_pocketsphinx
#asr_tts/mod_tts_commandline
#asr_tts/mod_unimrcp
codecs/mod_amr
#codecs/mod_amrwb
codecs/mod_b64
@ -87,7 +86,6 @@ dialplans/mod_dialplan_asterisk
dialplans/mod_dialplan_xml
#directories/mod_ldap
#endpoints/mod_alsa
#endpoints/mod_dingaling
#endpoints/mod_gsmopen
#endpoints/mod_h323
#endpoints/mod_khomp

View File

@ -58,7 +58,6 @@ applications/mod_voicemail_ivr
asr_tts/mod_flite
asr_tts/mod_pocketsphinx
asr_tts/mod_tts_commandline
asr_tts/mod_unimrcp
codecs/mod_amr
codecs/mod_amrwb
codecs/mod_b64
@ -84,7 +83,6 @@ dialplans/mod_dialplan_directory
dialplans/mod_dialplan_xml
directories/mod_ldap
#endpoints/mod_alsa
endpoints/mod_dingaling
#endpoints/mod_gsmopen
#endpoints/mod_h323
#endpoints/mod_khomp

View File

@ -1 +1 @@
1.10.7-release
1.10.8-release

View File

@ -1,5 +1,5 @@
en-us-callie 1.0.52
en-us-allison 1.0.1
en-us-callie 1.0.53
en-us-allison 1.0.2
ru-RU-elena 1.0.51
ru-RU-kirill 1.0.0
ru-RU-vika 1.0.0

View File

@ -1,49 +0,0 @@
# Locate APR-Util include paths and libraries
# This module defines
# APRUTIL_INCLUDES, where to find apr.h, etc.
# APRUTIL_LIBS, the libraries to link against to use APR.
# APRUTIL_FOUND, set to yes if found
find_program(APRUTIL_CONFIG_EXECUTABLE
apu-1-config
/usr/local/apr-util/1.2.12/bin
/usr/local/bin
/usr/bin
C:/Progra~1/apr/bin
)
mark_as_advanced(APRUTIL_CONFIG_EXECUTABLE)
macro(_apu_invoke _varname _regexp)
execute_process(
COMMAND ${APRUTIL_CONFIG_EXECUTABLE} ${ARGN}
OUTPUT_VARIABLE _apr_output
RESULT_VARIABLE _apr_failed
)
if(_apr_failed)
message(FATAL_ERROR "apu-1-config ${ARGN} failed")
else(_apr_failed)
string(REGEX REPLACE "[\r\n]" "" _apr_output "${_apr_output}")
string(REGEX REPLACE " +$" "" _apr_output "${_apr_output}")
if(NOT ${_regexp} STREQUAL "")
string(REGEX REPLACE "${_regexp}" " " _apr_output "${_apr_output}")
endif(NOT ${_regexp} STREQUAL "")
separate_arguments(_apr_output)
set(${_varname} "${_apr_output}")
endif(_apr_failed)
endmacro(_apu_invoke)
_apu_invoke(APRUTIL_INCLUDES "(^| )-I" --includes)
_apu_invoke(APRUTIL_LIBS "" --link-ld)
if(APRUTIL_LIBS AND APRUTIL_INCLUDES)
set(APRUTIL_FOUND "YES")
set(APRUTIL_DEFINITIONS "")
message (STATUS "apr-util found: YES ${APRUTIL_LIBS}")
endif(APRUTIL_LIBS AND APRUTIL_INCLUDES)

View File

@ -1,9 +0,0 @@
<configuration name="dingaling.conf" description="XMPP Jingle Endpoint">
<settings>
<param name="debug" value="0"/>
<param name="codec-prefs" value="PCMU"/>
</settings>
<X-PRE-PROCESS cmd="include" data="../jingle_profiles/*.xml"/>
</configuration>

View File

@ -277,36 +277,6 @@
</input>
]]>
</alias>
<alias name="input_voice_yesno_unimrcp" target="call">
<![CDATA[
<input xmlns="urn:xmpp:rayo:input:1" mode="voice" recognizer="unimrcp">
<grammar content-type="application/srgs+xml>
<![CDATA[
<grammar xmlns="http://www.w3.org/2001/06/grammar"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd"
xml:lang="en-US" version="1.0">
<rule id="yesno"><one-of><item>yes</item><item>no</item></one-of></rule></grammar>
]]]]><![CDATA[>
</grammar>
</input>
]]>
</alias>
<alias name="input_voice_yesno_unimrcp_timeout" target="call">
<![CDATA[
<input xmlns="urn:xmpp:rayo:input:1" mode="voice" recognizer="unimrcp" max-silence="5000" initial-timeout="5000">
<grammar content-type="application/srgs+xml>
<![CDATA[
<grammar xmlns="http://www.w3.org/2001/06/grammar"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd"
xml:lang="en-US" version="1.0">
<rule id="yesno"><one-of><item>yes</item><item>no</item></one-of></rule></grammar>
]]]]><![CDATA[>
</grammar>
</input>
]]>
</alias>
<alias name="input_voice_yesno_pocketsphinx" target="call">
<![CDATA[

View File

@ -1,9 +0,0 @@
<configuration name="dingaling.conf" description="XMPP Jingle Endpoint">
<settings>
<param name="debug" value="0"/>
<param name="codec-prefs" value="H264,PCMU"/>
</settings>
<X-PRE-PROCESS cmd="include" data="../jingle_profiles/*.xml"/>
</configuration>

View File

@ -0,0 +1,14 @@
<configuration name="signalwire.conf" description="SignalWire">
<settings>
<!-- on/off/file-path -->
<!--<param name="kslog" value="on"/>-->
<!--<param name="blade-bootstrap" value="blade://switchblade:2100"/>-->
<!--<param name="adoption-service" value="https://adopt.signalwire.com/adoption"/>-->
<!--<param name="stun-server" value="stun.freeswitch.org"/>-->
<!--<param name="caller-id-in-from" value="true"/>-->
<!--<authentication></authentication>-->
<!-- override dialplan context for calls on connector -->
<!--<param name="override-context" value="signalwire"/-->
</settings>
</configuration>

View File

@ -184,6 +184,9 @@
<!-- <param name="core-db-dsn" value="postgresql://freeswitch:@127.0.0.1/freeswitch?options=-c%20client_min_messages%3DNOTICE" /> -->
<!-- <param name="core-db-dsn" value="mariadb://Server=localhost;Database=freeswitch;Uid=freeswitch;Pwd=pass;" /> -->
<!-- <param name="core-db-dsn" value="dsn:username:password" /> -->
<!-- <param name="odbc-skip-autocommit-flip" value="true" /> -->
<!--
Allow to specify the sqlite db at a different location (In this example, move it to ramdrive for
better performance on most linux distro (note, you loose the data if you reboot))

View File

@ -1,23 +0,0 @@
<configuration name="unimrcp.conf" description="UniMRCP Client">
<settings>
<!-- UniMRCP profile to use for TTS -->
<param name="default-tts-profile" value="voxeo-prophecy8.0-mrcp1"/>
<!-- UniMRCP profile to use for ASR -->
<param name="default-asr-profile" value="voxeo-prophecy8.0-mrcp1"/>
<!-- UniMRCP logging level to appear in freeswitch.log. Options are:
EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
<param name="log-level" value="DEBUG"/>
<!-- Enable events for profile creation, open, and close -->
<param name="enable-profile-events" value="false"/>
<param name="max-connection-count" value="100"/>
<param name="offer-new-connection" value="1"/>
<param name="request-timeout" value="3000"/>
</settings>
<profiles>
<X-PRE-PROCESS cmd="include" data="../mrcp_profiles/*.xml"/>
</profiles>
</configuration>

View File

@ -1,36 +0,0 @@
<include>
<!-- Client Profile (Original mode) -->
<!-- to use this profile take the x- away from the open and close tags so its <profile> and </profile> -->
<x-profile type="client">
<param name="name" value="$${xmpp_client_profile}"/>
<param name="login" value="myjid@myserver.com/talk"/>
<param name="password" value="mypass"/>
<param name="dialplan" value="XML"/>
<param name="context" value="public"/>
<param name="message" value="Jingle all the way"/>
<param name="rtp-ip" value="$${bind_server_ip}"/>
<!-- <param name="ext-rtp-ip" value="auto-nat"/> -->
<param name="auto-login" value="true"/>
<!-- SASL "plain" or "md5" -->
<param name="sasl" value="plain"/>
<!-- if the server where the jabber is hosted is not the same as the one in the jid -->
<!--<param name="server" value="alternate.server.com"/>-->
<!-- Enable TLS or not -->
<param name="tls" value="true"/>
<!-- disable to trade async for more calls -->
<param name="use-rtp-timer" value="true"/>
<!-- default extension (if one cannot be determined) -->
<param name="exten" value="888"/>
<!-- VAD choose one -->
<!-- <param name="vad" value="in"/> -->
<!-- <param name="vad" value="out"/> -->
<!--<param name="vad" value="both"/>-->
<!--<param name="avatar" value="/path/to/tiny.jpg"/>-->
<!--<param name="candidate-acl" value="wan.auto"/>-->
<param name="local-network-acl" value="localnet.auto"/>
<!-- google voice does not work on this yet ....ikr... -->
<!--<param name="use-jingle" value="true"/>-->
</x-profile>
</include>

View File

@ -1,21 +0,0 @@
<include>
<!-- Component (Server to Server Login) -->
<!-- to use this profile take the x- away from the open and close tags so its <profile> and </profile> -->
<x-profile type="component">
<param name="name" value="$${xmpp_server_profile}"/>
<param name="password" value="secret"/>
<param name="dialplan" value="XML"/>
<param name="context" value="public"/>
<param name="rtp-ip" value="$${bind_server_ip}"/>
<param name="server" value="jabber.server.org:5347"/>
<!-- disable to trade async for more calls -->
<param name="use-rtp-timer" value="true"/>
<!-- "_auto_" means the extension will be automaticly set to the called jid -->
<param name="exten" value="_auto_"/>
<!--<param name="vad" value="both"/>-->
<!--<param name="avatar" value="/path/to/tiny.jpg"/>-->
<!--If you have ODBC support and a working dsn you can use it instead of SQLite-->
<!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
<!--<param name="candidate-acl" value="wan.auto"/>-->
</x-profile>
</include>

View File

@ -1,32 +0,0 @@
<include>
<!-- Loquendo MRCP Server 7 MRCPv2 -->
<profile name="loquendo7-mrcp2" version="2">
<!--param name="client-ext-ip" value="auto"-->
<param name="client-ip" value="auto"/>
<param name="client-port" value="5090"/>
<param name="server-ip" value="10.5.5.152"/>
<param name="server-port" value="5060"/>
<!--param name="force-destination" value="1"/-->
<param name="sip-transport" value="udp"/>
<!--param name="ua-name" value="FreeSWITCH"/-->
<!--param name="sdp-origin" value="FreeSWITCH"/-->
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<param name="jsgf-mime-type" value="application/jsgf"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,39 +0,0 @@
<include>
<!-- Nuance MRCP 1.0.0 Server -->
<profile name="nuance-mrcp1" version="1">
<param name="server-ip" value="10.5.5.152"/>
<param name="server-port" value="554"/>
<param name="resource-location" value=""/>
<param name="speechsynth" value="synthesizer"/>
<param name="speechrecog" value="recognizer"/>
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!-- enable/disable rtcp support -->
<param name="rtcp" value="1"/>
<!-- rtcp bye policies (rtcp must be enabled first)
0 - disable rtcp bye
1 - send rtcp bye at the end of session
2 - send rtcp bye also at the end of each talkspurt (input)
-->
<param name="rtcp-bye" value="2"/>
<!-- rtcp transmission interval in msec (set 0 to disable) -->
<param name="rtcp-tx-interval" value="5000"/>
<!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
<param name="rtcp-rx-resolution" value="1000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,39 +0,0 @@
<include>
<!-- Nuance Speech Server 5.0 MRCPv1 -->
<profile name="nuance5-mrcp1" version="1">
<param name="server-ip" value="10.5.5.152"/>
<param name="server-port" value="4900"/>
<param name="resource-location" value="media"/>
<param name="speechsynth" value="speechsynthesizer"/>
<param name="speechrecog" value="speechrecognizer"/>
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!-- enable/disable rtcp support -->
<param name="rtcp" value="1"/>
<!-- rtcp bye policies (rtcp must be enabled first)
0 - disable rtcp bye
1 - send rtcp bye at the end of session
2 - send rtcp bye also at the end of each talkspurt (input)
-->
<param name="rtcp-bye" value="2"/>
<!-- rtcp transmission interval in msec (set 0 to disable) -->
<param name="rtcp-tx-interval" value="5000"/>
<!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
<param name="rtcp-rx-resolution" value="1000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,43 +0,0 @@
<include>
<!-- Nuance Speech Server 5.0 MRCPv2 -->
<profile name="nuance5-mrcp2" version="2">
<!--param name="client-ext-ip" value="auto"-->
<param name="client-ip" value="auto"/>
<param name="client-port" value="5090"/>
<param name="server-ip" value="10.5.5.152"/>
<param name="server-port" value="5060"/>
<!--param name="force-destination" value="1"/-->
<param name="sip-transport" value="udp"/>
<!--param name="ua-name" value="FreeSWITCH"/-->
<!--param name="sdp-origin" value="FreeSWITCH"/-->
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!-- enable/disable rtcp support -->
<param name="rtcp" value="1"/>
<!-- rtcp bye policies (rtcp must be enabled first)
0 - disable rtcp bye
1 - send rtcp bye at the end of session
2 - send rtcp bye also at the end of each talkspurt (input)
-->
<param name="rtcp-bye" value="2"/>
<!-- rtcp transmission interval in msec (set 0 to disable) -->
<param name="rtcp-tx-interval" value="5000"/>
<!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
<param name="rtcp-rx-resolution" value="1000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,27 +0,0 @@
<include>
<!-- UniMRCP Server MRCPv1 -->
<profile name="unimrcpserver-mrcp1" version="1">
<param name="server-ip" value="10.5.5.152"/>
<param name="server-port" value="1554"/>
<param name="resource-location" value=""/>
<param name="speechsynth" value="speechsynthesizer"/>
<param name="speechrecog" value="speechrecognizer"/>
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,26 +0,0 @@
<include>
<!-- Vestec VASRE MRCP Server -->
<profile name="vestec-mrcp-v1" version="1">
<param name="server-ip" value="127.0.0.1"/>
<param name="server-port" value="1554"/>
<param name="resource-location" value=""/>
<param name="speechsynth" value="speechsynthesizer"/>
<param name="speechrecog" value="speechrecognizer"/>
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="14000"/>
<param name="rtp-port-max" value="15000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -1,27 +0,0 @@
<include>
<!-- Voxeo Prophecy 8.0 MRCPv1 -->
<profile name="voxeo-prophecy8.0-mrcp1" version="1">
<param name="server-ip" value="99.185.85.31"/>
<param name="server-port" value="554"/>
<param name="resource-location" value=""/>
<param name="speechsynth" value="synthesizer"/>
<param name="speechrecog" value="recognizer"/>
<!--param name="rtp-ext-ip" value="auto"/-->
<param name="rtp-ip" value="auto"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<!--param name="playout-delay" value="50"/-->
<!--param name="max-playout-delay" value="200"/-->
<!--param name="ptime" value="20"/-->
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
<!-- Add any default MRCP params for SPEAK requests here -->
<synthparams>
</synthparams>
<!-- Add any default MRCP params for RECOGNIZE requests here -->
<recogparams>
<!--param name="start-input-timers" value="false"/-->
</recogparams>
</profile>
</include>

View File

@ -239,6 +239,9 @@
<!-- Or, if you have PGSQL support, you can use that -->
<!--<param name="odbc-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />-->
<!-- By default each profile will give the database 1000 ms to spin-up on load -->
<!--<param name="db-spin-up-wait-ms" value="1000" />-->
<!--Uncomment to set all inbound calls to no media mode-->
<!--<param name="inbound-bypass-media" value="true"/>-->

View File

@ -3,10 +3,10 @@
# Must change all of the below together
# For a release, set revision for that tagged release as well and uncomment
AC_INIT([freeswitch], [1.10.7-release], bugs@freeswitch.org)
AC_INIT([freeswitch], [1.10.8-release], bugs@freeswitch.org)
AC_SUBST(SWITCH_VERSION_MAJOR, [1])
AC_SUBST(SWITCH_VERSION_MINOR, [10])
AC_SUBST(SWITCH_VERSION_MICRO, [7-release])
AC_SUBST(SWITCH_VERSION_MICRO, [8-release])
AC_SUBST(SWITCH_VERSION_REVISION, [])
AC_SUBST(SWITCH_VERSION_REVISION_HUMAN, [])
@ -665,12 +665,13 @@ AC_PATH_PROG([PKG_CONFIG], [pkg-config], [no])
case $host in
*-darwin*)
path_push_unique PKG_CONFIG_PATH /usr/local/opt/libpq/lib/pkgconfig
path_push_unique PKG_CONFIG_PATH /usr/local/opt/openssl/lib/pkgconfig
;;
esac
if test "$PKG_CONFIG" = "no" \
|| test x"$enable_core_pgsql_pkgconfig" = x"no" \
|| ! pkg-config libpq; then
|| ! pkg-config --modversion libpq > /dev/null; then
if test "$PG_CONFIG" != "no"; then
AC_MSG_CHECKING([for PostgreSQL libraries via pg_config])
POSTGRESQL_CFLAGS="-I`$PG_CONFIG --includedir`"
@ -682,7 +683,6 @@ if test "$PKG_CONFIG" = "no" \
POSTGRESQL_PATCH_VERSION=`$PG_CONFIG --version | awk '{ print $NF }' | awk -F. '{ print $3 }'`
fi
else
AC_MSG_CHECKING([for PostgreSQL libraries via pkg_config])
POSTGRESQL_CFLAGS="`$PKG_CONFIG --cflags libpq`"
POSTGRESQL_LIBDIR="`$PKG_CONFIG libpq --libs-only-L`"
@ -844,8 +844,6 @@ PKG_CHECK_MODULES([STIRSHAKEN], [stirshaken],[
AC_CHECK_LIB(apr-1, apr_pool_mutex_set, use_system_apr=yes, use_system_apr=no)
AM_CONDITIONAL([SYSTEM_APR],[test "${use_system_apr}" = "yes"])
AC_CHECK_LIB(aprutil-1, apr_queue_pop_timeout, use_system_aprutil=yes, use_system_aprutil=no)
AM_CONDITIONAL([SYSTEM_APRUTIL],[test "${use_system_aprutil}" = "yes"])
save_LIBS="$LIBS"
LIBS=
@ -883,7 +881,7 @@ AC_SUBST(LIBTOOL_LIB_EXTEN)
# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_CHECK_HEADERS([sys/types.h sys/resource.h sched.h wchar.h sys/filio.h sys/ioctl.h sys/prctl.h sys/select.h netdb.h execinfo.h sys/time.h])
AC_CHECK_HEADERS([sys/types.h sys/resource.h sched.h wchar.h sys/filio.h sys/ioctl.h sys/prctl.h sys/select.h netdb.h sys/time.h])
# Solaris 11 privilege management
AS_CASE([$host],
@ -1090,8 +1088,8 @@ if test "x${ax_cv_c_compiler_vendor}" = "xclang" ; then
fi
# Tested and fixed lot of modules, but some are untested. Will be added back when the core team decide it ready
# Untested modules : mod_osp mod_soundtouch mod_sangoma_codec mod_dingaling mod_opal mod_h323 mod_khomp
# mod_unimrcp mod_cepstral mod_erlang_event mod_snmp mod_perl mod_java mod_managed
# Untested modules : mod_osp mod_soundtouch mod_sangoma_codec mod_opal mod_h323 mod_khomp
# mod_cepstral mod_erlang_event mod_snmp mod_perl mod_java mod_managed
#
#saved_CFLAGS="$CFLAGS"
#AC_CACHE_CHECK([whether compiler supports -Wunused-but-set-variable], [ac_cv_gcc_unused_but_set_variable], [
@ -1531,11 +1529,25 @@ PKG_CHECK_MODULES([V8FS_STATIC], [v8-6.1_static >= 6.1.298],[
PKG_CHECK_MODULES([KS], [libks >= 1.1.0],[
AM_CONDITIONAL([HAVE_KS],[true])],[
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_KS],[false])])
if module_enabled mod_verto; then
AC_MSG_ERROR([You need to either install libks or disable mod_verto in modules.conf])
else
if module_enabled mod_signalwire; then
AC_MSG_ERROR([You need to either install libks or disable mod_signalwire in modules.conf])
else
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_KS],[false])
fi
fi
])
PKG_CHECK_MODULES([SIGNALWIRE_CLIENT], [signalwire_client >= 1.0.0],[
AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[true])],[
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[false])])
if module_enabled mod_signalwire; then
AC_MSG_ERROR([You need to either install signalwire-client-c or disable mod_signalwire in modules.conf])
else
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[false])
fi
])
PKG_CHECK_MODULES([AMQP], [librabbitmq >= 0.5.2],[
AM_CONDITIONAL([HAVE_AMQP],[true])],[
@ -1956,6 +1968,22 @@ else
AC_MSG_WARN([python3 support disabled, building mod_python3 will fail!])
fi
# pcap lib for unit-testing
AC_MSG_CHECKING(libpcap)
AC_CHECK_PROG(HAVE_PCAP_CONFIG,pcap-config,[true],[false])
if test x"$HAVE_PCAP_CONFIG" = x"true"; then
AC_MSG_RESULT(yes)
PCAP_CONFIG=pcap-config
PCAP_LIBS="`$PCAP_CONFIG --libs`"
PCAP_CFLAGS="`$PCAP_CONFIG --cflags`"
AM_CONDITIONAL([HAVE_PCAP], [true])
else
AC_MSG_RESULT(no)
AM_CONDITIONAL([HAVE_PCAP], [false])
fi
AC_SUBST([PCAP_CFLAGS])
AC_SUBST([PCAP_LIBS])
#
# SNMP checks for mod_snmp
#
@ -2116,7 +2144,6 @@ AC_CONFIG_FILES([Makefile
src/mod/asr_tts/mod_flite/Makefile
src/mod/asr_tts/mod_pocketsphinx/Makefile
src/mod/asr_tts/mod_tts_commandline/Makefile
src/mod/asr_tts/mod_unimrcp/Makefile
src/mod/codecs/mod_amr/Makefile
src/mod/codecs/mod_amrwb/Makefile
src/mod/codecs/mod_b64/Makefile
@ -2145,7 +2172,6 @@ AC_CONFIG_FILES([Makefile
src/mod/dialplans/mod_dialplan_xml/Makefile
src/mod/directories/mod_ldap/Makefile
src/mod/endpoints/mod_alsa/Makefile
src/mod/endpoints/mod_dingaling/Makefile
src/mod/endpoints/mod_gsmopen/Makefile
src/mod/endpoints/mod_h323/Makefile
src/mod/endpoints/mod_khomp/Makefile
@ -2303,12 +2329,7 @@ AC_CONFIG_SUBDIRS([libs/srtp])
if test "$use_system_apr" != "yes"; then
AC_CONFIG_SUBDIRS([libs/apr])
fi
if test "$use_system_aprutil" != "yes"; then
AC_CONFIG_SUBDIRS([libs/apr-util])
fi
AC_CONFIG_SUBDIRS([libs/iksemel])
AC_CONFIG_SUBDIRS([libs/libdingaling])
AC_CONFIG_SUBDIRS([libs/unimrcp])
if test "x${enable_zrtp}" = "xyes"; then
AC_CONFIG_SUBDIRS([libs/libzrtp])
fi

4
debian/bootstrap.sh vendored
View File

@ -653,11 +653,9 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}),
freeswitch-mod-flite (= \${binary:Version}),
freeswitch-mod-pocketsphinx (= \${binary:Version}),
freeswitch-mod-tts-commandline (= \${binary:Version}),
freeswitch-mod-unimrcp (= \${binary:Version}),
freeswitch-mod-dialplan-asterisk (= \${binary:Version}),
freeswitch-mod-dialplan-directory (= \${binary:Version}),
freeswitch-mod-dialplan-xml (= \${binary:Version}),
freeswitch-mod-dingaling (= \${binary:Version}),
freeswitch-mod-loopback (= \${binary:Version}),
freeswitch-mod-portaudio (= \${binary:Version}),
freeswitch-mod-rtc (= \${binary:Version}),
@ -892,11 +890,9 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}),
freeswitch-mod-flite-dbg (= \${binary:Version}),
freeswitch-mod-pocketsphinx-dbg (= \${binary:Version}),
freeswitch-mod-tts-commandline-dbg (= \${binary:Version}),
freeswitch-mod-unimrcp-dbg (= \${binary:Version}),
freeswitch-mod-dialplan-asterisk-dbg (= \${binary:Version}),
freeswitch-mod-dialplan-directory-dbg (= \${binary:Version}),
freeswitch-mod-dialplan-xml-dbg (= \${binary:Version}),
freeswitch-mod-dingaling-dbg (= \${binary:Version}),
freeswitch-mod-loopback-dbg (= \${binary:Version}),
freeswitch-mod-portaudio-dbg (= \${binary:Version}),
freeswitch-mod-rtc-dbg (= \${binary:Version}),

View File

@ -291,10 +291,6 @@ Module: asr_tts/mod_tts_commandline
Description: mod_tts_commandline
Adds mod_tts_commandline.
Module: asr_tts/mod_unimrcp
Description: mod_unimrcp
Adds mod_unimrcp.
## mod/codecs
Module: codecs/mod_amr
@ -431,10 +427,6 @@ Description: mod_alsa
Adds mod_alsa.
Build-Depends: libasound2-dev
Module: endpoints/mod_dingaling
Description: mod_dingaling
Adds mod_dingaling.
Module: endpoints/mod_gsmopen
Description: mod_gsmopen
Adds mod_gsmopen.

15
debian/copyright vendored
View File

@ -1011,12 +1011,6 @@ License: MPL-1.1 or GPL-2+
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]
Files: libs/unimrcp/*
Copyright: 2008-2010 Arsen Chaloyan
2009-2010 Tomas Valenta, Arsen Chaloyan
2001-2006 Steve Underwood
License: Apache-2.0
Files: */inet_pton.c
libs/curl/lib/inet_ntop.c
libs/curl/lib/mprintf.c
@ -1595,15 +1589,6 @@ Files: libs/silk/*
Copyright: 2006-2011, Skype Limited.
License: BSD-2-clause
Files: libs/libdingaling/*
Copyright: 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
2001-2003 Allan Saddi <allan@saddi.com>
License: MPL-1.1
Files: libs/libdingaling/src/sha1.[ch]
Copyright: 2001-2003 Allan Saddi <allan@saddi.com>
License: BSD-2-clause
Files: libs/libcodec2/*
Copyright: 1990-2010 David Rowe
1990-2010 David Rowe 2009

View File

@ -0,0 +1,49 @@
FROM debian:bullseye
MAINTAINER Andrey Volk <andrey@signalwire.com>
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq install git
RUN git clone https://github.com/signalwire/freeswitch /usr/src/freeswitch
RUN git clone https://github.com/signalwire/libks /usr/src/libs/libks
RUN git clone https://github.com/freeswitch/sofia-sip /usr/src/libs/sofia-sip
RUN git clone https://github.com/freeswitch/spandsp /usr/src/libs/spandsp
RUN git clone https://github.com/signalwire/signalwire-c /usr/src/libs/signalwire-c
RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install \
# build
build-essential cmake automake autoconf 'libtool-bin|libtool' pkg-config \
# general
libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \
# core
libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \
# core codecs
libogg-dev libspeex-dev libspeexdsp-dev \
# mod_enum
libldns-dev \
# mod_python3
python3-dev \
# mod_av
libavformat-dev libswscale-dev libavresample-dev \
# mod_lua
liblua5.2-dev \
# mod_opus
libopus-dev \
# mod_pgsql
libpq-dev \
# mod_sndfile
libsndfile1-dev libflac-dev libogg-dev libvorbis-dev
RUN cd /usr/src/libs/libks && cmake . -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LIBBACKTRACE=1 && make install
RUN cd /usr/src/libs/sofia-sip && ./bootstrap.sh && ./configure CFLAGS="-g -ggdb" --with-pic --with-glib=no --without-doxygen --disable-stun --prefix=/usr && make -j`nproc --all` && make install
RUN cd /usr/src/libs/spandsp && ./bootstrap.sh && ./configure CFLAGS="-g -ggdb" --with-pic --prefix=/usr && make -j`nproc --all` && make install
RUN cd /usr/src/libs/signalwire-c && PKG_CONFIG_PATH=/usr/lib/pkgconfig cmake . -DCMAKE_INSTALL_PREFIX=/usr && make install
RUN cd /usr/src/freeswitch && ./bootstrap.sh -j
RUN cd /usr/src/freeswitch && ./configure
RUN cd /usr/src/freeswitch && make -j`nproc` && make install
# Cleanup the image
RUN apt-get clean
# Uncomment to cleanup even more
#RUN rm -rf /usr/src/*

View File

@ -0,0 +1,4 @@
##### Dockerfile examples showing how to build FreeSWITCH without installing FreeSWITCH repo.
[Debian 11](https://github.com/signalwire/freeswitch/blob/dockerfile/docker/examples/Debian11/Dockerfile "Debian 11")

View File

@ -1,5 +1,7 @@
# vim:set ft=dockerfile:
FROM debian:jessie
ARG DEBIAN_VERSION=buster
FROM debian:${DEBIAN_VERSION}
ARG TOKEN
# Source Dockerfile:
# https://github.com/docker-library/postgres/blob/master/9.4/Dockerfile
@ -8,39 +10,32 @@ FROM debian:jessie
RUN groupadd -r freeswitch --gid=999 && useradd -r -g freeswitch --uid=999 freeswitch
# grab gosu for easy step-down from root
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
RUN apt-get update && apt-get install -y --no-install-recommends dirmngr gnupg2 ca-certificates wget \
&& gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 655DA1341B5207915210AFE936B4249FA7B0FB03 \
&& gpg2 --output /usr/share/keyrings/signalwire-freeswitch-repo.gpg --export 655DA1341B5207915210AFE936B4249FA7B0FB03 \
&& rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture).asc" \
&& gpg --verify /usr/local/bin/gosu.asc \
&& rm /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& apt-get purge -y --auto-remove ca-certificates wget
&& apt-get purge -y --auto-remove ca-certificates wget dirmngr gnupg2
# make the "en_US.UTF-8" locale so freeswitch will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
# https://files.freeswitch.org/repo/deb/freeswitch-1.*/dists/jessie/main/binary-amd64/Packages
# https://freeswitch.org/confluence/display/FREESWITCH/Debian
ENV FS_MAJOR debian-unstable
RUN sed -i "s/jessie main/jessie main contrib non-free/" /etc/apt/sources.list
# https://freeswitch.org/confluence/display/FREESWITCH/Debian+8+Jessie#Debian8Jessie-InstallingfromDebianpackages
RUN apt-get update && apt-get install -y curl \
&& curl https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add - \
&& echo "deb http://files.freeswitch.org/repo/deb/$FS_MAJOR/ jessie main" > /etc/apt/sources.list.d/freeswitch.list \
&& apt-get purge -y --auto-remove curl
RUN apt-get update && apt-get install -y freeswitch-all \
RUN apt-get update && apt-get install ca-certificates lsb-release -y --no-install-recommends \
&& echo "machine freeswitch.signalwire.com login signalwire password ${TOKEN}" > /etc/apt/auth.conf \
&& echo "deb [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list \
&& apt-get update && apt-get install -y freeswitch-all \
&& apt-get purge -y --auto-remove ca-certificates lsb-release \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Clean up
RUN apt-get autoremove
COPY docker-entrypoint.sh /
# Add anything else here

View File

@ -1242,7 +1242,7 @@ SEARCH_INCLUDES = YES
INCLUDE_PATH =../libs/apr ../libs/apr-util ../libs/iksemel ../libs/libnatpmp \
../libs/miniupnpc ../libs/sofia-sip ../libs/spandsp \
../libs/srtp ../libs/unimrcp ../libs/win32 ../libs/xmlrpc-c
../libs/srtp ../libs/win32 ../libs/xmlrpc-c
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the

View File

@ -636,15 +636,6 @@ Requires: %{name} = %{version}-%{release}
Provides FreeSWITCH mod_tts_commandline, Run a command line and play the
output file.
%package asrtts-unimrcp
Summary: FreeSWITCH mod_unimrcp
Group: System/Libraries
Requires: %{name} = %{version}-%{release}
%description asrtts-unimrcp
Provides FreeSWITCH mod_unimrcp, allows communication with Media Resource
Control Protocol (MRCP) servers
######################################################################################################################
# FreeSWITCH Codec Modules
######################################################################################################################
@ -841,15 +832,6 @@ PostgreSQL native support for FreeSWITCH.
# FreeSWITCH Endpoint Modules
######################################################################################################################
%package endpoint-dingaling
Summary: Generic XMPP support for FreeSWITCH open source telephony platform
Group: System/Libraries
Requires: %{name} = %{version}-%{release}
%description endpoint-dingaling
XMPP support for FreeSWITCH open source telephony platform. Allows FreeSWITCH
to be used as a client for GoogleTalk or other XMPP Servers.
#%package endpoint-gsmopen
#Summary: Generic GSM endpoint support for FreeSWITCH open source telephony platform
#Group: System/Libraries
@ -1444,7 +1426,7 @@ APPLICATIONS_MODULES="$APPLICATION_MODULES_AC $APPLICATION_MODULES_DE $APPLICATI
# Automatic Speech Recognition and Text To Speech Modules
#
######################################################################################################################
ASR_TTS_MODULES="asr_tts/mod_flite asr_tts/mod_pocketsphinx asr_tts/mod_tts_commandline asr_tts/mod_unimrcp"
ASR_TTS_MODULES="asr_tts/mod_flite asr_tts/mod_pocketsphinx asr_tts/mod_tts_commandline"
######################################################################################################################
#
@ -1485,7 +1467,7 @@ DIRECTORIES_MODULES=""
# Endpoints
#
######################################################################################################################
ENDPOINTS_MODULES="endpoints/mod_dingaling \
ENDPOINTS_MODULES=" \
endpoints/mod_loopback endpoints/mod_portaudio endpoints/mod_rtmp \
endpoints/mod_skinny endpoints/mod_verto endpoints/mod_rtc endpoints/mod_sofia"
@ -1810,9 +1792,7 @@ fi
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/dialplan/skinny-patterns
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/directory
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/directory/default
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/jingle_profiles
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/lang
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/mrcp_profiles
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/sip_profiles
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/sip_profiles/external
%dir %attr(0750, freeswitch, daemon) %{sysconfdir}/sip_profiles/external-ipv6
@ -1920,7 +1900,6 @@ fi
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/curl.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/db.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/dialplan_directory.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/dingaling.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/directory.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/distributor.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/easyroute.conf.xml
@ -1960,6 +1939,7 @@ fi
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/rtmp.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/sangoma_codec.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/shout.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/signalwire.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/skinny.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/smpp.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/sms_flowroute.conf.xml
@ -1972,7 +1952,6 @@ fi
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/translate.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/tts_commandline.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/unicall.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/unimrcp.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/verto.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/voicemail.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/voicemail_ivr.conf.xml
@ -2015,11 +1994,9 @@ fi
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/sip_profiles/external/*.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/sip_profiles/external-ipv6/*.xml
######################################################################################################################
# Other Protocol Profiles (skinny, jingle, mrcp)
# Other Protocol Profiles (skinny)
######################################################################################################################
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/skinny_profiles/*.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/jingle_profiles/*.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/mrcp_profiles/*.xml
######################################################################################################################
# Grammar Files
######################################################################################################################
@ -2173,9 +2150,6 @@ fi
%files asrtts-tts-commandline
%{MODINSTDIR}/mod_tts_commandline.so*
%files asrtts-unimrcp
%{MODINSTDIR}/mod_unimrcp.so*
######################################################################################################################
#
# CODEC Packages
@ -2258,9 +2232,6 @@ fi
#
######################################################################################################################
%files endpoint-dingaling
%{MODINSTDIR}/mod_dingaling.so*
#%files endpoint-gsmopen
#%{MODINSTDIR}/mod_gsmopen.so*

152
libs/.gitignore vendored
View File

@ -34,40 +34,13 @@ opal
/apr/build/pkg/pkginfo
/apr/exports.c
/apr/export_vars.c
/apr/include/apr.h
/apr/include/arch/unix/apr_private.h
/apr/include/arch/unix/apr_private.h.in
/apr/include/fspr.h
/apr/include/arch/unix/fspr_private.h
/apr/include/arch/unix/fspr_private.h.in
/apr/.make.dirs
/apr/Makefile
/apr/test/internal/Makefile
/apr/test/Makefile
/apr-util/aprutil.exp
/apr-util/apu-1-config
/apr-util/build/apr_common.m4
/apr-util/build/find_apr.m4
/apr-util/build/get-version.sh
/apr-util/build/install.sh
/apr-util/build/pkg/pkginfo
/apr-util/build/rules.mk
/apr-util/exports.c
/apr-util/export_vars.c
/apr-util/export_vars.sh
/apr-util/include/apr_ldap.h
/apr-util/include/apu_config.h
/apr-util/include/apu.h
/apr-util/include/apu_select_dbm.h
/apr-util/include/apu_want.h
/apr-util/include/private/apu_config.h
/apr-util/include/private/apu_config.h.in
/apr-util/include/private/apu_select_dbm.h
/apr-util/.make.dirs
/apr-util/Makefile
/apr-util/test/Makefile
/apr-util/xml/expat/config.h
/apr-util/xml/expat/lib/config.h
/apr-util/xml/expat/lib/expat.h
/apr-util/xml/expat/lib/Makefile
/apr-util/xml/expat/Makefile
/broadvoice/config-h.in
/broadvoice/doc/Makefile
/broadvoice/doc/Makefile.in
@ -226,11 +199,6 @@ opal
/libcodec2/unittest/vqtrainjnd
/libcodec2/unittest/vqtrainph
/libcodec2/unittest/vqtrainsp
/libdingaling/build/compile
/libdingaling/Makefile
/libdingaling/Makefile.in
/libdingaling/src/config.h
/libdingaling/src/stamp-h1
/libg722_1/config-h.in
/libg722_1/doc/Makefile
/libg722_1/doc/Makefile.in
@ -583,102 +551,6 @@ opal
/tiff-*/tools/tiffmedian
/tiff-*/tools/tiffset
/tiff-*/tools/tiffsplit
/unimrcp/build/acmacros/libtool.m4
/unimrcp/build/acmacros/lt~obsolete.m4
/unimrcp/build/acmacros/ltoptions.m4
/unimrcp/build/acmacros/ltsugar.m4
/unimrcp/build/acmacros/ltversion.m4
/unimrcp/build/Makefile
/unimrcp/build/Makefile.in
/unimrcp/build/pkgconfig/Makefile
/unimrcp/build/pkgconfig/Makefile.in
/unimrcp/build/svnrev/Makefile
/unimrcp/build/svnrev/Makefile.in
/unimrcp/build/svnrev/svnrev
!/unimrcp/build/tools/unimrcpservice.exe.manifest
!/unimrcp/build/uni_revision.h
!/unimrcp/configure.gnu
/unimrcp/conf/Makefile
/unimrcp/conf/Makefile.in
/unimrcp/data/Makefile
/unimrcp/data/Makefile.in
/unimrcp/docs/doxygen.conf
/unimrcp/libs/apr-toolkit/Makefile
/unimrcp/libs/apr-toolkit/Makefile.in
/unimrcp/libs/Makefile
/unimrcp/libs/Makefile.in
/unimrcp/libs/mpf/Makefile
/unimrcp/libs/mpf/Makefile.in
/unimrcp/libs/mrcp-client/Makefile
/unimrcp/libs/mrcp-client/Makefile.in
/unimrcp/libs/mrcp-engine/Makefile
/unimrcp/libs/mrcp-engine/Makefile.in
/unimrcp/libs/mrcp/Makefile
/unimrcp/libs/mrcp/Makefile.in
/unimrcp/libs/mrcp-server/Makefile
/unimrcp/libs/mrcp-server/Makefile.in
/unimrcp/libs/mrcp-signaling/Makefile
/unimrcp/libs/mrcp-signaling/Makefile.in
/unimrcp/libs/mrcpv2-transport/Makefile
/unimrcp/libs/mrcpv2-transport/Makefile.in
/unimrcp/libs/uni-rtsp/Makefile
/unimrcp/libs/uni-rtsp/Makefile.in
/unimrcp/Makefile
/unimrcp/Makefile.in
/unimrcp/modules/Makefile
/unimrcp/modules/Makefile.in
/unimrcp/modules/mrcp-sofiasip/Makefile
/unimrcp/modules/mrcp-sofiasip/Makefile.in
/unimrcp/modules/mrcp-unirtsp/Makefile
/unimrcp/modules/mrcp-unirtsp/Makefile.in
/unimrcp/platforms/asr-client/asrclient
/unimrcp/platforms/asr-client/Makefile
/unimrcp/platforms/asr-client/Makefile.in
/unimrcp/platforms/libasr-client/Makefile
/unimrcp/platforms/libasr-client/Makefile.in
/unimrcp/platforms/libunimrcp-client/Makefile
/unimrcp/platforms/libunimrcp-client/Makefile.in
/unimrcp/platforms/libunimrcp-server/Makefile
/unimrcp/platforms/libunimrcp-server/Makefile.in
/unimrcp/platforms/Makefile
/unimrcp/platforms/Makefile.in
/unimrcp/platforms/umc/Makefile
/unimrcp/platforms/umc/Makefile.in
/unimrcp/platforms/umc/umc
/unimrcp/platforms/unimrcp-client/Makefile
/unimrcp/platforms/unimrcp-client/Makefile.in
/unimrcp/platforms/unimrcp-client/unimrcpclient
/unimrcp/platforms/unimrcp-server/Makefile
/unimrcp/platforms/unimrcp-server/Makefile.in
/unimrcp/platforms/unimrcp-server/unimrcpserver
/unimrcp/plugins/demo-recog/Makefile
/unimrcp/plugins/demo-recog/Makefile.in
/unimrcp/plugins/demo-synth/Makefile
/unimrcp/plugins/demo-synth/Makefile.in
/unimrcp/plugins/demo-verifier/Makefile
/unimrcp/plugins/demo-verifier/Makefile.in
/unimrcp/plugins/Makefile
/unimrcp/plugins/Makefile.in
/unimrcp/plugins/mrcp-cepstral/Makefile
/unimrcp/plugins/mrcp-cepstral/Makefile.in
/unimrcp/plugins/mrcp-flite/Makefile
/unimrcp/plugins/mrcp-flite/Makefile.in
/unimrcp/plugins/mrcp-pocketsphinx/Makefile
/unimrcp/plugins/mrcp-pocketsphinx/Makefile.in
/unimrcp/plugins/mrcp-recorder/Makefile
/unimrcp/plugins/mrcp-recorder/Makefile.in
/unimrcp/tests/apttest/Makefile
/unimrcp/tests/apttest/Makefile.in
/unimrcp/tests/Makefile
/unimrcp/tests/Makefile.in
/unimrcp/tests/mpftest/Makefile
/unimrcp/tests/mpftest/Makefile.in
/unimrcp/tests/mrcptest/Makefile
/unimrcp/tests/mrcptest/Makefile.in
/unimrcp/tests/rtsptest/Makefile
/unimrcp/tests/rtsptest/Makefile.in
/unimrcp/tests/strtablegen/Makefile
/unimrcp/tests/strtablegen/Makefile.in
/win32/celt/*/*/libcelt.log
/win32/libg722_1/*/*/libg722_1.log
/win32/libshout/*/*/libshout.log
@ -728,17 +600,7 @@ opal
/v8-*.zip
# build products we should remove
!/apr-util/xml/expat/conftools/config.guess
!/apr-util/xml/expat/conftools/config.sub
!/apr-util/xml/expat/conftools/install-sh
!/apr-util/xml/expat/conftools/missing
!/iksemel/ltmain.sh
!/libdingaling/config.guess
!/libdingaling/config.sub
!/libdingaling/depcomp
!/libdingaling/install-sh
!/libdingaling/ltmain.sh
!/libdingaling/missing
!/libg722_1/config/depcomp
!/libg722_1/config/missing
!/tiff-*/config/depcomp
@ -750,7 +612,6 @@ ilbc/config/compile
libg722_1/config/compile
pcre/compile
srtp/build/compile
unimrcp/build/compile
/pcre-*/
/speex-*/
/curl-*/
@ -759,16 +620,12 @@ unimrcp/build/compile
/ldns/
/portaudio/
portaudio.*.log
apr-util/configure
apr-util/xml/expat/configure
apr/configure
iksemel/configure
libdingaling/configure
libyuv/Makefile
libyuv/convert
srtp/configure
tiff-4.0.2/configure
unimrcp/configure
zlib-*/
zlib-*
libpq-*/
@ -793,4 +650,5 @@ mariadb-connector-c-*/
mariadb-connector-c-*
/spandsp*/
/spandsp*
win32/spandsp/spandsp.h
win32/spandsp/spandsp.h
win32/spandsp/win32

View File

@ -1 +0,0 @@
Thu 18 Nov 2010 20:56:38 EST

View File

@ -1,619 +0,0 @@
Changes with APR-util 1.2.8
*) Add support for Berkeley DB 4.5 to the configure scripts.
[Garrett Rooney]
*) Allow apr_queue.h to be included before other APR headers.
PR 40891 [Henry Jen <henryjen ztune.net>]
*) Provide folding in autogenerated .manifest files for Win32 builders
using VisualStudio 2005 [William Rowe]
*) Implement prepared statement support in SQLite3 DBD driver
[Bojan Smojver]
*) Fix to ensure that "deprecated" LDAP interfaces are still
exposed if using OpenLDAP 2.3. [Joe Orton]
*) Fix incorrect byte order and incorrect timestamp type
in the fallback UUID generator used when no external UUID
generator is detected by APR. PR 37342. [Max Bowsher]
Changes with APR-util 1.2.7
*) Fix apr_dbd_init to be safe to call multiple times
[Bojan Smojver <bojan rexursive com>, Nick Kew]
*) Win32 / Netware - add missing apu_version.c for apu_version_string()
to the Windows and Netware specific builds. Unix platforms supported
this API since 0.9.1. [William Rowe, Brad Nicholes].
Changes with APR-util 1.2.6
*) Stop trying to link against Berkeley DB by default. To enable use
of Berkeley DB users must now explicitly pass --with-berkeley-db to
configure, since Berkeley DB is released under a viral license that
requires distribution of source code for any program that uses it.
[Garrett Rooney]
*) Stop trying to link against GDBM by default. To enable use of GDBM
users must now explicitly pass --with-gdbm to configure, since GDBM
is licensed under the GPL.
[Garrett Rooney]
*) Fix VPATH builds, and symlink builds where apr and apr-util
reside in parallel as symlinks to directories with more explicit
names, e.g. apr-1.x and apr-util-1.x. This solves various breakage
on Solaris in particular with ./buildconf and ./configure. Also
eliminated the nested ../apr-iconv/buildconf, given that apr-util
didn't bother with ../apr/buildconf, and this was inconsistant.
[William Rowe]
*) Fix the escape implementations for the sqlite2 and sqlite3 dbd
back ends.
[Ronen Mizrahi <ronen tversity.com>, Garrett Rooney]
*) Add support for Berkeley DB 4.4 to the configure scripts.
[Garrett Rooney]
*) Fix bug in test suite that cause testbuckets to write 8GB file
on Mac OS X. [Justin Erenkrantz]
Changes with APR-util 1.2.2
*) Teach configure how to find the Novell LDAP SDK. [Graham Leggett]
*) Fix usage of ldapssl_init/ldap_sslinit on platforms that support
these API's including Win32. Support APR_HAS_LDAP_START_TLS_S
flag in the Win32 LDAP API, to drop usage of ldap_start_ssl_s
and ldap_stop_ssl_s on Win32 by default (change the flag in apr_ldap.hw
to enable if supported on a given OS level). [William Rowe]
Changes with APR-util 1.2.1
*) Fix apr_rmm_realloc() offset calculation bug. [Keith Kelleman
<keith.kelleman oracle.com>]
*) Add sqlite3 support to APR DBD. [Rick Keiner <rick_keiner yahoo.com>]
*) Fix build failure with non-threaded APR on AIX. PR 34655.
[Ryan Murray <rmurray+apache cyberhqz.com>]
*) Add sqlite2 support to APR DBD. [Ryan Phillips <ryan trolocsis.com>]
*) Introduction of APR DBD layer. [Nick Kew]
Changes with APR-util 1.1.2
*) Fix libaprutil.rc for Win32 builds [William Rowe, Justin Erenkrantz]
Changes with APR-util 1.1.1
*) Fix memory leak in buckets when using APR_POOL_DEBUG mode. [Joe Schaefer]
*) find_apu.m4: Try installed APR-util before bundled copy if --with-apr-util
not passed to configure. [Justin Erenkrantz]
Changes with APR-util 1.1.0
*) LDAP: Move all certificate initialisation, and the creation of SSL
and TLS connections into the apr_ldap_set_option() API. Add support
for client certificates. [Graham Leggett]
*) Emit the run-time link path option in apu-config after installation
if the user is linking with libtool. [Justin Erenkrantz]
*) Port testmd4 and testmd5 to the new test suite. [Thom May]
*) Allow passing NULL inbuf/inbytes_left parameters to
apr_xlate_conv_buffer(), required to correctly terminate the
output buffer for some stateful character set encodings.
[Joe Orton]
*) Link libaprutil against the libraries on which it depends.
PR 11122. [Joe Orton]
*) Add apr_brigade_insert_file() function, to safely insert a file
into a brigade, regardless of size. [Joe Orton]
Changes with APR-util 1.0.2
*) Teach apr_ldap_init() how to handle STARTTLS in addition to the existing
SSL support. Add apr_ldap_option API. [Graham Leggett]
*) Rework the LDAP toolkit detection to be more accurate than "OpenLDAP
detected regardless", while remaining backwards compatible with v1.0.
[Graham Leggett]
*) Added the apr_ldap_ssl_add_cert() API to allow multiple certificates
to be stored and used when establishing an SSL connection to different
LDAP servers. [Brad Nicholes]
*) Fix the detection of ldap.h on Solaris - it needs lber.h to be
defined first. [Graham Leggett]
*) Add a build script to create a solaris package. [Graham Leggett]
Changes with APR-util 1.0.1
*) Add support for Berkeley DB 4.3. [Jani Averbach <jaa jaa.iki.fi>]
*) SECURITY: CAN-2004-0786 (cve.mitre.org)
Fix input validation in apr_uri_parse() to avoid passing negative
length to memcpy for malformed IPv6 literal addresses.
[Joe Orton]
Changes with APR-util 1.0
*) Only install apu-$MAJOR-config and add appropriate detection code to
find_apu.m4 (APU_FIND_APU). [Max Bowsher <maxb ukf.net>]
*) Overhaul support for LDAP URL parsing. Instead of using incompatible
URL parsers and memory that needs freeing, apr-util provides a parser
which parses the URL and allocates memory from a pool. [Graham Leggett]
*) Remove support for LDAP v2.0 SDK toolkits. This will be added
back properly later assuming there is demand for it. In the mean
time, please use an LDAP v3.0 SDK toolkit. [Graham Leggett]
*) Add an apr_ldap_err_t structure to handle the return of LDAP
specific error codes. [Graham Leggett, Brad Nicholes]
*) Add APR functions to do the job of ldap_init(), hiding toolkit
specific SSL/TLS handling. Code derived from httpd util_ldap.
[Graham Leggett]
*) Add an RPM spec file derived from Fedora Core.
[Graham Leggett, Joe Orton]
*) The whole codebase was relicensed and is now available under
the Apache License, Version 2.0 (http://www.apache.org/licenses).
[Apache Software Foundation]
*) A new function, apr_reslist_invalidate, was added so that invalid
resources can be removed from a reslist instead of being returned
to the reslist in a broken state. [Nick Kew <nick webthing.com>]
*) Switch to a single, top-level make. [Greg Stein]
*) Add timeout feature to apr_reslist_acquire().
[Mladen Turk <mturk apache.org>]
*) Pass error codes returned from constructors all the way back to
the reslist consumer. Also fix a minor reslist memory leak that could
happen when a constructor returns an error code. PR 23492.
[Snke Tesch <st@kino-fahrplan.de>, Aaron Bannert]
*) The following header files have been removed:
apu_compat.h
Changes with APR-util 0.9.5
*) Fix corrupt output from the apr_xlate_* interfaces on AIX 4.x.
[Joe Orton]
*) Change the order in which ldap.h and lber.h are defined, to fix
a compile bug in Solaris v2.8 which requires lber.h then ldap.h.
PR 27379. [Andrew Connors <andy.connors idea.com>]
*) Restore support for SHA1 passwords in apr_validate_password.
PR 17343. [Paul Querna <chip force-elite.com>]
*) Fix DESTDIR install for bundled expat library. PR 14076
[David S. Madole <david madole.net>]
*) Fix occasional crash in apr_rmm_realloc(). PR 22915.
[Jay Shrauner <shrauner inktomi.com>]
*) Fix apr_dbm_exists() for sdbm when sizeof(int) != sizeof(size_t).
[Joe Orton]
*) The whole codebase was relicensed and is now available under
the Apache License, Version 2.0 (http://www.apache.org/licenses).
[Apache Software Foundation]
*) Fix xlate.c compile failure on AIX 5.2. PR 25701. [Jeff Trawick]
*) Fixed a bug in apr_rmm that would cause it to mishandle blocks of
a size close to the one requested from the allocator.
[Kevin Wang <xwang_tech yahoo.com>]
Changes with APR-util 0.9.4
*) Changed apr_bucket_alloc_create() so that it uses the allocator
from the pool that was passed in rather than creating its own.
Also, the bucket_allocator is now allocated from the apr_allocator_t
rather than using apr_palloc(). Added apr_bucket_alloc_create_ex()
which takes an apr_allocator_t* directly rather than an apr_pool_t*.
[Cliff Woolley, Jean-Jacques Clar]
*) Added debugging consistency checks to the buckets code. Add
-DAPR_BUCKET_DEBUG to the build flags to enable.
[Cliff Woolley]
*) Make the version of the db library APU built against visible.
[Thom May]
*) Fix a problem with VPATH builds copying the APR rules.mk into the
source directory rather than the build directory. [Justin Erenkrantz]
*) SECURITY [httpd incident CAN-2003-0189] Address a thread safety
issue with apr_password_validate() on AIX, Linux, Mac OS X, and
possibly other platforms. [Jeff Trawick, Justin Erenkrantz]
*) Fix a problem with LDAP configuration which caused subsequent
configure tests to fail since LIBS contained LDAP libraries for
subsequent tests but LDFLAGS no longer included the path to such
LDAP libraries. [Jeff Trawick]
*) Fix a problem preventing the use of the bundled Expat when APR-util
is built stand-alone. [Jeff Trawick]
*) Use the same compiler and preprocessor for the APR-util config tests
which were used by APR. The user can override this via CC and CPP.
This was done all along for the actual build, but not necessarily
for the config tests. [Jeff Trawick]
*) Fix apr_uuid_parse() on EBCDIC machines. [Jeff Trawick]
*) Fix alignment problem when allocating memory using apr_rmm. The problem
showed up while trying to write a double in the memory allocated.
[Madhusudan Mathihalli]
Changes with APR-util 0.9.3
*) Allow apr_date_parse_rfc to parse 'Sun, 06-Nov-1994 08:49:37 GMT' as a
valid date. [Dmitri Tikhonov <dmitri@netilla.com>]
*) Fix error in apu-config when symlinks are involved.
[Garrett Rooney <rooneg@electricjellyfish.net>]
Changes with APR-util 0.9.2
*) Fix the APR_BUCKET_IS_foo() macros so they parenthesize their parameter.
This fixes compile problems with some types of parameters.
[Jim Carlson <jcarlson@jnous.com>]
*) Queue overwrite, we now return the item pushed, not a reference to it.
[Paul Marquis <PMarquis@pobox.com, Jacob Lewallen <jlwalle@cs.ucr.edu>]
*) Remove include/apr_ldap.h on distclean. PR 15592. [Justin Erenkrantz]
*) Fix race conditions in apr_queue.
[Jacob Lewallen <jlwalle@cs.ucr.edu>]
*) Stop buildconf copying rules.mk, copy it at configure time.
[Thom May]
*) Make buildconf copy rules.mk as well.
[Garrett Rooney <rooneg@electricjellyfish.net>]
*) Add --includedir flag to apu-config. [Justin Erenkrantz]
*) Fix brokenness in sdbm when sizeof(int) != sizeof(size_t)
(e.g., 64-bit AIX, 64-bit Solaris). PR 14861. [Jeff Trawick]
*) Have buildconf copy required files from apr so that apr-util can build
on its own. [Craig Rodrigues <rodrigc@attbi.com>]
*) Detect OpenLDAP when used with Solaris 9. PR 13427.
[Gary Algier <gaa@ulticom.com>]
*) Detect Berkeley DB 4.1 when compiled with --with-uniquenames
[Thom May]
*) Allow apu-config to work in symlinked install directories when
'realpath' is available. [Justin Erenkrantz]
*) Fix bug in apr_strmatch when used with case-insensitive patterns.
[Justin Erenkrantz]
*) Allow apr_queue to have greater than int number of elements.
[Justin Erenkrantz]
*) Detect Berkeley DB 4.0 compiled with --with-uniquenames.
[Philip Martin <philip@codematters.co.uk>]
*) Allocate brigades from a bucket allocator rather than a pool. [Brian Pane]
*) Update with the latest APR renames [Thom May]
*) Update doxygen tags. [Justin Erenkrantz]
*) Add apr_ldap.hw for Windows build.
[Andre Schild <A.Schild@aarboard.ch>]
*) Add IPv6 literal address support to apr_uri_parse(), apr_uri_unparse(),
and apr_uri_parse_hostinfo(). PR 11887 [Jeff Trawick]
*) Add apr_brigade_writev() [Brian Pane]
*) Add support for Berkeley DB 4.1. [Justin Erenkrantz]
*) Add --bindir option to apu-config. [Justin Erenkrantz]
Changes with APR-util 0.9.1
*) Add versioning infrastructure.
[Justin Erenkrantz]
*) Running "make check" in the toplevel directory or the test/ directory
will build and run all test programs. [Aaron Bannert]
*) Bug #9789 : NDBM support
[Toomas Soome <tsoome@muhv.pri.ee>, Ian Holsman]
*) Added a Thread safe FIFO bounded buffer (apr_queue) [Ian Holsman]
*) Changed file_bucket_setaside() to use apr_file_setaside() instead
of turning the file bucket into an mmap bucket. [Brian Pane]
*) Install libaprutil support libraries before installing libaprutil
itself, since on some platforms libaprutil is relinked during
make install and the support libraries need to exist already.
[Jeff Trawick]
*) Added a Resource List API for threadsafe access to persistent
and dynamically created user-defined resources. [Aaron Bannert]
*) Adopted apr-util/xlate from apr/i18n for inclusion of apr-iconv
as required by missing libiconv. [William Rowe]
*) Adopted apr-util/crypto/ uuid and md5 from apr. [William Rowe]
*) Look for expat in lib64 directories. [Peter Poeml <poeml@suse.de>]
*) Faster implementation of apr_brigade_puts() [Brian Pane]
*) Fixed a segfault in apr_date_parse_rfc() for some date formats
where it was trying to overlay a potentially static input
string even though it didn't really need to.
[Cliff Woolley, Doug MacEachern]
*) Ensure that apu-config does not print libtool libraries when
using --libs. [Justin Erenkrantz]
*) Added apr_bucket_file_enable_mmap() function to the bucket
API to let an application control whether a file bucket may
be turned into an mmap bucket upon read. (The default remains
to do the mmap, but this function lets the app prevent the
mmap in contexts where mmap would be a bad idea. Examples
include multiprocessors where mmap doesn't scale well and
NFS-mounted filesystems where a bus error can result if
a memory-mapped file is removed or truncated.) [Brian Pane]
*) Added string-matching API (apr_strmatch.h) [Brian Pane]
*) Rearrange INCLUDES so that APRUTIL_PRIV_INCLUDES is always
first. [Garrett Rooney <rooneg@electricjellyfish.net>]
*) Add --old-expat option to apu-config to allow users of apr-util to
determine what expat it should expect to be installed. If the
flag is set to yes, it should include xmlparse.h. If it is set to
no, it should include expat.h. [Justin Erenkrantz]
*) Fix exporting of includes in apu-config. [Justin Erenkrantz]
*) Change bucket brigades API to allow a "bucket allocator" to be
passed in at certain points. This allows us to implement freelists
so that we can stop using malloc/free so frequently.
[Cliff Woolley, Brian Pane]
*) add apr_rmm_realloc() function
[Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>]
*) renames: apr_ansi_time_to_apr_time becomes apr_time_ansi_put
ap_exploded_time_t becomes apr_time_exp_t
[Thom May <thom@planetarytramp.net>]
*) Add detection support for FreeBSD's expat and expat2 ports.
[Justin Erenkrantz]
*) Deprecate check_brigade_flush(), which had several nasty bugs, and
which was causing apr_brigade_write()'s logic to be less than obvious.
Everything is now done in a slightly rearranged apr_brigade_write().
[Cliff Woolley]
*) Don't add /usr/include to the INCLUDES variable on expat's account.
[Joe Orton <joe@manyfish.co.uk>]
*) Remove the autoconf 2.5x cache directory in buildconf.
[Joe Orton <joe@manyfish.co.uk>]
*) BerkleyDB should NULL out the key if it is @EOF in vt_db_nextkey
[Ian Holsman]
*) Add ability to natively fetch and split brigades based on LF lines.
[Justin Erenkrantz]
*) add --with-berkeley-db=DIR & --with-gdbm configure flags
[Ian Holsman/Justin Erenkrantz]
*) Fix expat detection to recognize installed versions.
[Eric Gillespie, Jr. <epg@pretzelnet.org>]
*) Add find_apu.m4 to allow third-party programs that use APR-util
to have a standard m4 macro for detection. [Justin Erenkrantz]
*) Add apu-config - a shell script to allow third-party programs
easy access to APR configuration parameters. [Justin Erenkrantz]
*) Add GMT offset calculation to apr_date_parse_rfc().
[Justin Erenkrantz]
*) Introduce the apr_rmm api, to allow relocatable memory management
of address-independent data stores, such as shared memory.
[William Rowe]
*) Rework and fix VPATH-build support. [Justin Erenkrantz]
*) Add support for Berkeley DB4. [Justin Erenkrantz]
*) Improve testdbm help. [Justin Erenkrantz]
*) Improve autoconf detection of DBMs. [Justin Erenkrantz]
*) BerkeleyDBM v2 now checks minor level for cursor ops [Ian Holsman]
*) Reading a file bucket bigger than APR_MMAP_LIMIT (4MB) now yields
a string of 4MB mmap buckets, rather than a string of 8KB heap buckets
plus a 4MB mmap bucket. To accomodate this, the mmap bucket destroy
function explicitly deletes the apr_mmap_t after last reference
to avoid having too much of a large file mapped at once if possible.
[Cliff Woolley]
*) Multi-DBM support (via apr_dbm_open_ex). [Ian Holsman]
*) Use apr_mmap_dup in mmap_setaside(). [Brian Pane <bpane@pacbell.net>]
*) Dropped the "w" parameter from apr_bucket_heap_create() and
apr_bucket_heap_make(). That parameter was originally intended
to return the amount of data copied into the bucket, but it
ended up being unnecessary because that amount is invariant from
the size of the data and is available as b->length in the
resulting bucket anyway. [Cliff Woolley]
*) Fix Makefile conversion for BSD/OS. [Cliff Woolley]
*) Use APR_XtOffsetOf instead of offsetof() in the ring macros for
portability. [Cliff Woolley]
*) We now create exports.c and export_vars.h, which in turn create
exports.c. From this we generate two more files with different
purposes: aprutil.exp - list of exported symbols; and exports.lo
(exports.o) - an object file that can be linked with an executable
to force resolution of all apr-util symbols. [Aaron Bannert]
*) Fix Berkley DBM support [Ian Holsman <ianh@apache.org>]
*) Fix apr_brigade_vprintf so that it can handle more than
4k of data at one time. [Cody Sherr <csherr@covalent.net>]
*) prefix UNP_* flags with APR_URI_
rename:
apr_uri_components -> apr_uri_t
apr_uri_unparse_components -> apr_uri_unparse
apr_uri_parse_components -> apr_uri_parse
apr_uri_parse_hostinfo_components -> apr_uri_parse_hostinfo
s/APU_URI_/APR_URI_/g
[Perl]
*) Landed the link-to-LDAP to the build process, and the LDAP v2/v3
compatibility functions.
[Dave Carrigan <dave@rudedog.org>, Graham Leggett]
*) Fix URI unparse function to handle the case where it would place a @
when both the username and password were present but omitted.
[Jon Travis <jtravis@covalent.net]
*) Added apr_xml_parse_file() routine and a testxml program.
[Ian Holsman <ianh@cnet.com>]
*) Extend apr_bucket struct to add a pointer to a function used
to free the bucket. This change enables custom buckets to
completely specify how they are to be allocated and freed.
Before this change, custom buckets were required to use the
same memory allocation scheme as the standard APR buckets.
[Saeid Sakhitab, Bill Stoddard, Cliff Woolley, Roy Fielding]
*) Install Expat when installing APR-util. [Justin Erenkrantz]
*) Make APR-util configure script rely on APR. This removes the locally
generated copy of libtool and uses the one in APR. Fix up how we
call the expat configure script. Generate config.nice file.
[Justin Erenkrantz]
*) The apr_bucket lengths are now consistently apr_size_t, while any
apr_brigade lengths (short of a read) are consistently apr_off_t.
This is required for APR_HAS_LARGE_FILES handling. [William Rowe]
*) apr_bucket_file_create() and apr_bucket_file_make() now take a pool
parameter which is the pool into which any needed data structures
should be created during file_read(). This is used for MMAPing the
file and reopening the file if the original apr_file_t is in XTHREAD
mode. [Cliff Woolley]
*) apr_brigade_partition() now returns an apr_status_t. [Cliff Woolley]
*) Add MD4 implementation in crypto. [Sander Striker, Justin Erenkrantz]
*) Moved httpd 2.0.18's util_date to apr_date and enhanced its parsing
capabilities. [Justin Erenkrantz]
*) Moved httpd 2.0.18's util_uri to apr_uri and name-protected its
symbols and functions. [Justin Erenkrantz, Roy Fielding]
*) Rename field "private" in struct apr_xml_elem to "priv" for C++
compatibility. PR #7727 [Joshua MacDonald <jmacd@cs.berkeley.edu>]
*) Make APR_IMPLEMENT_EXTERNAL_HOOK_BASE generate a
${namespace}_hook_get_${hookname} function to fetch the
list of registered hooks [Doug MacEachern]
*) Allow LTFLAGS to be overridden by the configure command-line
(default="--silent") and introduce LT_LDFLAGS. [Roy Fielding]
*) Add APR_SHARELOCK support to apr_sdbm_open(), locking read operations
with a shared lock and all write ops with an excl lock. [Will Rowe]
*) Namespace protect apr_sdbm, and normalize the return values (including
the apr_sdbm_fetch, apr_sdbm_firstkey and apr_sdbm_nextkey functions).
Normalized the get/clear error function names, and stores the actual
apr error for apr_sdbm_error_get. [Will Rowe]
*) Introduce an apr_fileperms_t argument to apr_dbm_open(). [Will Rowe]
*) Removed apr_bucket_do_create() macro, which was causing warnings
about unreachable code in some compilers (notably MSVC). What
used to be done by this macro is now done inline in the various
apr_bucket_foo_create() functions. [Cliff Woolley]
*) Make clean, distclean, and extraclean consistently according to the
Gnu makefile guidelines. [Justin Erenkrantz <jerenkrantz@ebuilt.com>]
*) Migrate the --disable-libtool changes from APR to APR-util.
This cleans things up, and allows more flexibility when building
programs. [Ryan Bloom]
*) Allow APR-util to be compiled without libtool. The default is
to use libtool, but it can turned off with --disable-libtool
on the configure command. [Ryan Bloom]
*) Repair calling convention for apr_register_optional_fn to
eliminate GP fault on Win32. [William Rowe]
*) Substantial changes to correct linkage and declarations for
generic hooks on dso architectures. [Ben Laurie, Will Rowe]
*) apr_bucket_shared_destroy() now returns a boolean value.
[Cliff Woolley]
*) We have to initialize the heap buckets to the correct length.
we were seeing heap buckets with 17 chars in them reporting
a length of 9017, because they were initialized to the amount
of memory allocated, instead of the amount of memory used.
This was only an issue for heap buckets created by the
apr_brigade_* functions. [Ryan Bloom]
*) apr_bucket_init_types() and apr_bucket_insert_type() have been
removed... they're not needed anymore. [Cliff Woolley]
*) The apr_bucket_shared and apr_bucket_simple structures have been
removed as an API simplification/optimization. This should be
transparent outside APR-util except to callers who attempt to
directly manipulate the buckets' internal structure (which is
not recommended anyway) and to callers who create their own
bucket types. [Cliff Woolley]
*) apr_bucket_simple_split() and apr_bucket_simple_copy() are now
exported functions, which could be helpful in implementing
external bucket types. [Cliff Woolley]
*) The third parameter to apr_bucket_shared_make() is now
'apr_off_t length' rather than 'apr_off_t end', since the
end usually had to be computed by the caller and all we
really want is the length anyway. [Cliff Woolley]

View File

@ -1,36 +0,0 @@
cmake_minimum_required(VERSION 2.6)
INCLUDE_DIRECTORIES(include/)
add_definitions(-DHAVE_CONFIG_H -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK)
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/libs/apr-util/include ${CMAKE_SOURCE_DIR}/libs/apr-util/include/private ${CMAKE_SOURCE_DIR}/libs/apr/include)
SET (apr-util_SRCS
crypto/apr_md5.c
crypto/uuid.c
crypto/apr_sha1.c
crypto/getuuid.c
crypto/apr_md4.c
encoding/apr_base64.c
hooks/apr_hooks.c
misc/apr_reslist.c
misc/apr_rmm.c
misc/apr_date.c
misc/apu_version.c
misc/apr_queue.c
uri/apr_uri.c
strmatch/apr_strmatch.c
xlate/xlate.c
)
LINK_LIBRARIES ("-liconv -ldl -lpthread")
ADD_LIBRARY(apr-util STATIC ${apr-util_SRCS})

View File

@ -1,14 +0,0 @@
The MySQL driver is not distributed from apache.org due to licensing issues.
If you wish to build the driver, download apr_dbd_mysql.c from
http://apache.webthing.com/database/
and copy it into the dbd directory.
Now run buildconf, followed by configure.
It is distributed under the GPL to conform with MySQL License terms
This means it cannot be distributed from apache.org, as that would
violate ASF policy.
Using the driver with APR and Apache is of course allowed,
and there is no problem with a third party bundling the driver,
provided you respect both the ASF and GPL licenses.

View File

@ -1,404 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
APACHE PORTABLE RUNTIME SUBCOMPONENTS:
The Apache Portable Runtime includes a number of subcomponents with
separate copyright notices and license terms. Your use of the source
code for the these subcomponents is subject to the terms and
conditions of the following licenses.
For the include\apr_md5.h component:
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* 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.
*/
For the passwd\apr_md5.c component:
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
*/
/* 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.
*/
/*
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
* MD5 crypt() function, which is licenced as follows:
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*/
For the crypto\apr_md4.c component:
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* 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. MD4 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. MD4 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.
*/
For the include\apr_md4.h component:
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* 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. MD4 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. MD4 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.
*/
For the test\testmd4.c component:
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
* rights reserved.
*
* 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.
*/
For the xml\expat\conftools\install-sh component:
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
For the expat xml parser component:
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
and Clark Cooper
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.
====================================================================

View File

@ -1,91 +0,0 @@
#
# Top-level Makefile for APRUTIL
#
CPP = @CPP@
# gets substituted into some targets
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
srcdir = @srcdir@
VPATH = @srcdir@
INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
APRUTIL_LDFLAGS = @APRUTIL_LDFLAGS@
APRUTIL_LIBS = @APRUTIL_LIBS@
TARGET_LIB = lib@APRUTIL_LIBNAME@.la
INSTALL_SUBDIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
EXTRA_SOURCE_DIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
APRUTIL_PCFILE = apr-util-$(APRUTIL_MAJOR_VERSION).pc
APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
TARGETS = $(TARGET_LIB) aprutil.exp
# bring in rules.mk for standard functionality
@INCLUDE_RULES@
@INCLUDE_OUTPUTS@
CLEAN_SUBDIRS = test @APR_ICONV_DIR@
CLEAN_TARGETS = exports.c export_vars.c aprutil.exp .make.dirs apu-config.out
DISTCLEAN_TARGETS = config.cache config.log config.status libtool \
include/private/apu_config.h include/private/apu_private.h \
include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h \
export_vars.sh $(APU_CONFIG) build/rules.mk include/apu_want.h \
apr-util.pc build/pkg/pkginfo
EXTRACLEAN_TARGETS = configure aclocal.m4 include/private/apu_config.h.in \
exports.c build-outputs.mk \
build/apr_common.m4 build/find_apr.m4 build/install.sh \
build/config.guess build/config.sub
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
includedir=@includedir@
top_srcdir=@abs_srcdir@
top_blddir=@abs_builddir@
# Create apu-config script suitable for the install tree
apu-config.out: $(APU_CONFIG)
sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@
install: $(TARGET_LIB) apu-config.out
$(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \
$(DESTDIR)$(libdir) $(DESTDIR)$(bindir)
for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \
$(INSTALL_DATA) $${f} $(DESTDIR)$(includedir); \
done
$(INSTALL_DATA) apr-util.pc $(DESTDIR)$(libdir)/pkgconfig/$(APRUTIL_PCFILE)
list='$(INSTALL_SUBDIRS)'; for i in $$list; do \
( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \
done
$(LIBTOOL) --mode=install $(INSTALL) -m 755 $(TARGET_LIB) $(DESTDIR)$(libdir)
$(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir)
$(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG)
$(TARGET_LIB): $(OBJECTS)
$(LINK) @lib_target@ $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS)
exports.c: $(HEADERS)
$(APR_MKEXPORT) $(HEADERS) > $@
export_vars.c: $(HEADERS)
$(APR_MKVAREXPORT) $(HEADERS) > $@
aprutil.exp: exports.c export_vars.c
@echo "#! lib@APRUTIL_LIBNAME@.so" > $@
@echo "* This file was AUTOGENERATED at build time." >> $@
@echo "* Please do not edit by hand." >> $@
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
dox:
doxygen $(top_srcdir)/docs/doxygen.conf
test: check
check: $(TARGET_LIB)
cd test && $(MAKE) check

View File

@ -1,11 +0,0 @@
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
Portions of this software were developed at the National Center
for Supercomputing Applications (NCSA) at the University of
Illinois at Urbana-Champaign.
This software contains code derived from the RSA Data Security
Inc. MD5 Message-Digest Algorithm, including various
modifications by Spyglass Inc., Carnegie Mellon University, and
Bell Communications Research, Inc (Bellcore).

View File

@ -1,292 +0,0 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
ldap \
xml \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
include $(APR_WORK)\build\NWGNUhead.inc
#
# Make sure all needed macro's are defined
#
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include \
$(APR)/include/arch/NetWare \
$(APRUTIL)/include \
$(APRUTIL)/uri \
$(APRUTIL)/dbm/sdbm \
$(APRUTIL)/include/private \
$(APRUTIL)/xml/expat/lib \
$(LDAPSDK)/inc \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME =
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION =
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME =
#
# If this is specified, it will override VERSION value in
# $(APR_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE =
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If this is specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
# be disabled by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# Declare all target files (you must add your files here)
#
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(OBJDIR)/aprutil.lib \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(EOLIST)
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
$(EOLIST)
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
$(EOLIST)
#
# Any symbols exported to here
#
FILES_nlm_exports = \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(OBJDIR)/apr_base64.o \
$(OBJDIR)/apr_brigade.o \
$(OBJDIR)/apr_buckets.o \
$(OBJDIR)/apr_buckets_alloc.o \
$(OBJDIR)/apr_buckets_eos.o \
$(OBJDIR)/apr_buckets_file.o \
$(OBJDIR)/apr_buckets_flush.o \
$(OBJDIR)/apr_buckets_heap.o \
$(OBJDIR)/apr_buckets_mmap.o \
$(OBJDIR)/apr_buckets_pipe.o \
$(OBJDIR)/apr_buckets_pool.o \
$(OBJDIR)/apr_buckets_refcount.o \
$(OBJDIR)/apr_buckets_simple.o \
$(OBJDIR)/apr_buckets_socket.o \
$(OBJDIR)/apr_date.o \
$(OBJDIR)/apr_dbm.o \
$(OBJDIR)/apr_dbd.o \
$(OBJDIR)/apr_dbd_pgsql.o \
$(OBJDIR)/apr_dbm_berkeleydb.o \
$(OBJDIR)/apr_dbm_sdbm.o \
$(OBJDIR)/apr_hooks.o \
$(OBJDIR)/apr_md4.o \
$(OBJDIR)/apr_md5.o \
$(OBJDIR)/apr_queue.o \
$(OBJDIR)/apr_reslist.o \
$(OBJDIR)/apr_rmm.o \
$(OBJDIR)/apr_sha1.o \
$(OBJDIR)/apu_version.o \
$(OBJDIR)/getuuid.o \
$(OBJDIR)/uuid.o \
$(OBJDIR)/apr_strmatch.o \
$(OBJDIR)/apr_uri.o \
$(OBJDIR)/sdbm.o \
$(OBJDIR)/sdbm_hash.o \
$(OBJDIR)/sdbm_lock.o \
$(OBJDIR)/sdbm_pair.o \
$(OBJDIR)/xlate.o \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(APR_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
vpath %.c buckets:crypto:dbd:dbm:dbm/sdbm:encoding:hooks:ldap:misc:strmatch:uri:xlate:xml
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APR_WORK)\build\NWGNUtail.inc

View File

@ -1,13 +0,0 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
includedir=@includedir@
Name: APR Utils
Description: Companion library for APR
Version: @APRUTIL_DOTTED_VERSION@
# assume that apr-util requires libapr of same major version
Requires: apr-@APRUTIL_MAJOR_VERSION@
Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @APRUTIL_EXPORT_LIBS@
Cflags: -I${includedir}

View File

@ -1,89 +0,0 @@
%define apuver 1
Summary: Apache Portable Runtime Utility library
Name: apr-util
Version: 1.2.8
Release: 1
License: Apache Software License
Group: System Environment/Libraries
URL: http://apr.apache.org/
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
BuildPrereq: autoconf, libtool, doxygen, apr-devel >= 0:{version}-{release}
BuildPrereq: openldap-devel, db4-devel, expat-devel
Conflicts: subversion < 0.20.1-2
%description
The mission of the Apache Portable Runtime (APR) is to provide a
free library of C data structures and routines. This library
contains additional utility interfaces for APR; including support
for XML, LDAP, database interfaces, URI parsing and more.
%package devel
Group: Development/Libraries
Summary: APR utility library development kit
Requires: apr-util = %{version}-%{release}, apr-devel
Requires: openldap-devel, db4-devel, expat-devel
Conflicts: subversion-devel < 0.20.1-2
%description devel
This package provides the support files which can be used to
build applications using the APR utility library. The mission
of the Apache Portable Runtime (APR) is to provide a free
library of C data structures and routines.
%prep
%setup -q
%build
%configure --with-apr=%{_prefix} \
--includedir=%{_includedir}/apr-%{apuver} \
--with-ldap --without-gdbm
make %{?_smp_mflags} && make dox
%check
# Run non-interactive tests
pushd test
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
./testall -v || exit 1
popd
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
# Documentation
mv docs/dox/html html
# Unpackaged files
rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
%clean
rm -rf $RPM_BUILD_ROOT
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%defattr(-,root,root,-)
%doc CHANGES LICENSE NOTICE
%{_libdir}/libaprutil-%{apuver}.so.*
%files devel
%defattr(-,root,root,-)
%{_bindir}/apu-%{apuver}-config
%{_libdir}/libaprutil-%{apuver}.*a
%{_libdir}/libaprutil-%{apuver}.so
%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
%{_includedir}/apr-%{apuver}/*.h
%doc --parents html
%changelog
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- update to support v1.0.0 of APR
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- derived from Fedora Core apr.spec

View File

@ -1,587 +0,0 @@
# Microsoft Developer Studio Project File - Name="aprutil" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=aprutil - 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 "aprutil.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 "aprutil.mak" CFG="aprutil - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "aprutil - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "aprutil - 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)" == "aprutil - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "LibR"
# PROP BASE Intermediate_Dir "LibR"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "LibR"
# PROP Intermediate_Dir "LibR"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /O2 /Oy- /Zi /I "./include" /I "../apr/include" /I "./include/private" /I "../apr-iconv/include" /I "./dbm/sdbm" /I "./xml/expat/lib" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "API_DECLARE_STATIC" /D "APU_USE_SDBM" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibR\aprutil_src" /FD /c
# ADD BASE RSC /l 0x409 /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:"LibR\aprutil-1.lib"
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "LibD"
# PROP BASE Intermediate_Dir "LibD"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "LibD"
# PROP Intermediate_Dir "LibD"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "../apr/include" /I "./include/private" /I "../apr-iconv/include" /I "./dbm/sdbm" /I "./xml/expat/lib" /D "_DEBUG" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "API_DECLARE_STATIC" /D "APU_USE_SDBM" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibD\aprutil_src" /FD /c
# ADD BASE RSC /l 0x409 /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:"LibD\aprutil-1.lib"
!ENDIF
# Begin Target
# Name "aprutil - Win32 Release"
# Name "aprutil - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Group "buckets"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\buckets\apr_brigade.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_alloc.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_eos.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_file.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_flush.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_heap.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_mmap.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_pipe.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_pool.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_refcount.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_simple.c
# End Source File
# Begin Source File
SOURCE=.\buckets\apr_buckets_socket.c
# End Source File
# End Group
# Begin Group "crypto"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\crypto\apr_md4.c
# End Source File
# Begin Source File
SOURCE=.\crypto\apr_md5.c
# End Source File
# Begin Source File
SOURCE=.\crypto\apr_sha1.c
# End Source File
# Begin Source File
SOURCE=.\crypto\getuuid.c
# End Source File
# Begin Source File
SOURCE=.\crypto\uuid.c
# End Source File
# End Group
# Begin Group "dbd"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\dbd\apr_dbd.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_pgsql.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_sqlite2.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_sqlite3.c
# End Source File
# End Group
# Begin Group "dbm"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\dbm\apr_dbm.c
# End Source File
# Begin Source File
SOURCE=.\dbm\apr_dbm_berkeleydb.c
# End Source File
# Begin Source File
SOURCE=.\dbm\apr_dbm_gdbm.c
# End Source File
# Begin Source File
SOURCE=.\dbm\apr_dbm_sdbm.c
# End Source File
# End Group
# Begin Group "encoding"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\encoding\apr_base64.c
# End Source File
# End Group
# Begin Group "hooks"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\hooks\apr_hooks.c
# End Source File
# End Group
# Begin Group "ldap"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\ldap\apr_ldap_init.c
# End Source File
# Begin Source File
SOURCE=.\ldap\apr_ldap_url.c
# End Source File
# Begin Source File
SOURCE=.\ldap\apr_ldap_option.c
# End Source File
# End Group
# Begin Group "misc"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\misc\apr_date.c
# End Source File
# Begin Source File
SOURCE=.\misc\apr_queue.c
# End Source File
# Begin Source File
SOURCE=.\misc\apr_reslist.c
# End Source File
# Begin Source File
SOURCE=.\misc\apr_rmm.c
# End Source File
# Begin Source File
SOURCE=.\misc\apu_version.c
# End Source File
# End Group
# Begin Group "sdbm"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm.c
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_hash.c
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_lock.c
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_pair.c
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_pair.h
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_private.h
# End Source File
# Begin Source File
SOURCE=.\dbm\sdbm\sdbm_tune.h
# End Source File
# End Group
# Begin Group "strmatch"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\strmatch\apr_strmatch.c
# End Source File
# End Group
# Begin Group "uri"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\uri\apr_uri.c
# End Source File
# End Group
# Begin Group "xlate"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\xlate\xlate.c
# End Source File
# End Group
# Begin Group "xml"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\xml\apr_xml.c
# End Source File
# End Group
# End Group
# Begin Group "Generated Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\include\apr_ldap.h.in
# End Source File
# Begin Source File
SOURCE=.\include\apr_ldap.hnw
# End Source File
# Begin Source File
SOURCE=.\include\apr_ldap.hw
!IF "$(CFG)" == "aprutil - Win32 Release"
# Begin Custom Build - Creating apr_ldap.h from apr_ldap.hw
InputPath=.\include\apr_ldap.hw
".\include\apr_ldap.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apr_ldap.hw > .\include\apr_ldap.h
# End Custom Build
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# Begin Custom Build - Creating apr_ldap.h from apr_ldap.hw
InputPath=.\include\apr_ldap.hw
".\include\apr_ldap.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apr_ldap.hw > .\include\apr_ldap.h
# End Custom Build
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\include\apu.h.in
# End Source File
# Begin Source File
SOURCE=.\include\apu.hnw
# End Source File
# Begin Source File
SOURCE=.\include\apu.hw
!IF "$(CFG)" == "aprutil - Win32 Release"
# Begin Custom Build - Creating apu.h from apu.hw
InputPath=.\include\apu.hw
".\include\apu.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apu.hw > .\include\apu.h
# End Custom Build
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# Begin Custom Build - Creating apu.h from apu.hw
InputPath=.\include\apu.hw
".\include\apu.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apu.hw > .\include\apu.h
# End Custom Build
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\include\private\apu_config.h.in
# End Source File
# Begin Source File
SOURCE=.\include\private\apu_config.hw
!IF "$(CFG)" == "aprutil - Win32 Release"
# Begin Custom Build - Creating apu_config.h from apu_config.hw
InputPath=.\include\private\apu_config.hw
".\include\private\apu_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\private\apu_config.hw > .\include\private\apu_config.h
# End Custom Build
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# Begin Custom Build - Creating apu_config.h from apu_config.hw
InputPath=.\include\private\apu_config.hw
".\include\private\apu_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\private\apu_config.hw > .\include\private\apu_config.h
# End Custom Build
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\include\private\apu_select_dbm.h.in
# End Source File
# Begin Source File
SOURCE=.\include\private\apu_select_dbm.hw
!IF "$(CFG)" == "aprutil - Win32 Release"
# Begin Custom Build - Creating apu_select_dbm.h from apu_select_dbm.hw
InputPath=.\include\private\apu_select_dbm.hw
".\include\private\apu_select_dbm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\private\apu_select_dbm.hw > .\include\private\apu_select_dbm.h
# End Custom Build
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# Begin Custom Build - Creating apu_select_dbm.h from apu_select_dbm.hw
InputPath=.\include\private\apu_select_dbm.hw
".\include\private\apu_select_dbm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\private\apu_select_dbm.hw > .\include\private\apu_select_dbm.h
# End Custom Build
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\include\apu_want.h.in
# End Source File
# Begin Source File
SOURCE=.\include\apu_want.hnw
# End Source File
# Begin Source File
SOURCE=.\include\apu_want.hw
!IF "$(CFG)" == "aprutil - Win32 Release"
# Begin Custom Build - Creating apu_want.h from apu_want.hw
InputPath=.\include\apu_want.hw
".\include\apu_want.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apu_want.hw > .\include\apu_want.h
# End Custom Build
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
# Begin Custom Build - Creating apu_want.h from apu_want.hw
InputPath=.\include\apu_want.hw
".\include\apu_want.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
type .\include\apu_want.hw > .\include\apu_want.h
# End Custom Build
!ENDIF
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\include\apr_anylock.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_base64.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_buckets.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_date.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_dbm.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_hooks.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_ldap_url.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_md4.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_md5.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_optional.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_optional_hooks.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_queue.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_reslist.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_rmm.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_sdbm.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_sha1.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_strmatch.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_uri.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_uuid.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_xlate.h
# End Source File
# Begin Source File
SOURCE=.\include\apr_xml.h
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,161 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "apr"="..\apr\apr.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "apriconv"="..\apr-iconv\apriconv.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name apr
End Project Dependency
}}}
###############################################################################
Project: "aprutil"=".\aprutil.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name apr
End Project Dependency
Begin Project Dependency
Project_Dep_Name xml
End Project Dependency
Begin Project Dependency
Project_Dep_Name apriconv
End Project Dependency
}}}
###############################################################################
Project: "libapr"="..\apr\libapr.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "libapriconv"="..\apr-iconv\libapriconv.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
}}}
###############################################################################
Project: "libapriconv_ccs_modules"="..\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
}}}
###############################################################################
Project: "libapriconv_ces_modules"="..\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
}}}
###############################################################################
Project: "libaprutil"=".\libaprutil.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name xml
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
}}}
###############################################################################
Project: "xml"=".\xml\expat\lib\xml.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -1,207 +0,0 @@
#!/bin/sh
# Copyright 2001-2005 The Apache Software Foundation or its licensors, as
# applicable.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# APR-util script designed to allow easy command line access to APR-util
# configuration parameters.
APRUTIL_MAJOR_VERSION="@APRUTIL_MAJOR_VERSION@"
APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@"
prefix="@prefix@"
exec_prefix="@exec_prefix@"
bindir="@bindir@"
libdir="@libdir@"
includedir="@includedir@"
LIBS="@APRUTIL_EXPORT_LIBS@"
INCLUDES="@APRUTIL_INCLUDES@"
LDFLAGS="@APRUTIL_LDFLAGS@"
APRUTIL_LIBNAME="@APRUTIL_LIBNAME@"
APU_SOURCE_DIR="@abs_srcdir@"
APU_BUILD_DIR="@abs_builddir@"
APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@"
APU_DB_VERSION="@apu_db_version@"
# NOTE: the following line is modified during 'make install': alter with care!
location=@APU_CONFIG_LOCATION@
show_usage()
{
cat << EOF
Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION]
Known values for OPTION are:
--prefix[=DIR] change prefix to DIR
--bindir print location where binaries are installed
--includes print include information
--includedir print location where headers are installed
--ldflags print linker flags
--libs print library information
--srcdir print APR-util source directory
--link-ld print link switch(es) for linking to APR-util
--link-libtool print the libtool inputs for linking to APR-util
--apu-la-file print the path to the .la file, if available
--old-expat indicate if APR-util was built against an old expat
--db-version print the DB version
--version print APR-util's version as a dotted triple
--help print this help
When linking with libtool, an application should do something like:
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`"
or when linking directly:
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`"
An application should use the results of --includes, and --ldflags in
their build process.
EOF
}
if test $# -eq 0; then
show_usage
exit 1
fi
if test "$location" = "installed"; then
LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la"
LIBS=`echo "$LIBS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s $prefix/lib/libexpat.la -lexpat g"`
LDFLAGS=`echo "$LDFLAGS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g"`
INCLUDES=`echo "$INCLUDES" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s -I$prefix/lib g"`
else
LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la"
fi
flags=""
while test $# -gt 0; do
# Normalize the prefix.
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$1" in
# It is possible for the user to override our prefix.
--prefix=*)
prefix=$optarg
;;
--prefix)
echo $prefix
exit 0
;;
--bindir)
echo $bindir
exit 0
;;
--libs)
flags="$flags $LIBS"
;;
--includedir)
if test "$location" = "installed"; then
flags="$includedir"
elif test "$location" = "source"; then
flags="$APU_SOURCE_DIR/include"
else
# this is for VPATH builds
flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include"
fi
echo $flags
exit 0
;;
--includes)
if test "$location" = "installed"; then
flags="$flags -I$includedir $INCLUDES"
elif test "$location" = "source"; then
flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES"
else
# this is for VPATH builds
flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES"
fi
;;
--ldflags)
flags="$flags $LDFLAGS"
;;
--srcdir)
echo $APU_SOURCE_DIR
exit 0
;;
--version)
echo $APRUTIL_DOTTED_VERSION
exit 0
;;
--link-ld)
if test "$location" = "installed"; then
### avoid using -L if libdir is a "standard" location like /usr/lib
flags="$flags -L$libdir -l$APRUTIL_LIBNAME"
else
flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME"
fi
;;
--link-libtool)
# If the LA_FILE exists where we think it should be, use it. If we're
# installed and the LA_FILE does not exist, assume to use -L/-l
# (the LA_FILE may not have been installed). If we're building ourselves,
# we'll assume that at some point the .la file be created.
if test -f "$LA_FILE"; then
flags="$flags $LA_FILE"
elif test "$location" = "installed"; then
### avoid using -L if libdir is a "standard" location like /usr/lib
# Since the user is specifying they are linking with libtool, we
# *know* that -R will be recognized by libtool.
flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME"
else
flags="$flags $LA_FILE"
fi
;;
--apu-la-file)
if test -f "$LA_FILE"; then
flags="$flags $LA_FILE"
fi
;;
--old-expat)
if test ! -n "$APR_XML_EXPAT_OLD"; then
echo "no"
else
echo "$APR_XML_EXPAT_OLD"
fi
exit 0
;;
--db-version)
echo $APU_DB_VERSION
exit 0
;;
--help)
show_usage
exit 0
;;
*)
show_usage
exit 1
;;
esac
# Next please.
shift
done
if test -n "$flags"; then
echo "$flags"
fi
exit 0

View File

@ -1,702 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_lib.h"
#include "apr_strings.h"
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_buckets.h"
#include "apr_errno.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#if APR_HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif
static apr_status_t brigade_cleanup(void *data)
{
return apr_brigade_cleanup(data);
}
APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data)
{
apr_bucket_brigade *b = data;
apr_bucket *e;
while (!APR_BRIGADE_EMPTY(b)) {
e = APR_BRIGADE_FIRST(b);
apr_bucket_delete(e);
}
/* We don't need to free(bb) because it's allocated from a pool. */
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b)
{
apr_pool_cleanup_kill(b->p, b, brigade_cleanup);
return apr_brigade_cleanup(b);
}
APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket_brigade *b;
b = apr_palloc(p, sizeof(*b));
b->p = p;
b->bucket_alloc = list;
APR_RING_INIT(&b->list, apr_bucket, link);
apr_pool_cleanup_register(b->p, b, brigade_cleanup, apr_pool_cleanup_null);
return b;
}
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
apr_bucket *e)
{
apr_bucket_brigade *a;
apr_bucket *f;
a = apr_brigade_create(b->p, b->bucket_alloc);
/* Return an empty brigade if there is nothing left in
* the first brigade to split off
*/
if (e != APR_BRIGADE_SENTINEL(b)) {
f = APR_RING_LAST(&b->list);
APR_RING_UNSPLICE(e, f, link);
APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link);
}
APR_BRIGADE_CHECK_CONSISTENCY(a);
APR_BRIGADE_CHECK_CONSISTENCY(b);
return a;
}
APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
apr_off_t point,
apr_bucket **after_point)
{
apr_bucket *e;
const char *s;
apr_size_t len;
apr_status_t rv;
if (point < 0) {
/* this could cause weird (not necessarily SEGV) things to happen */
return APR_EINVAL;
}
if (point == 0) {
*after_point = APR_BRIGADE_FIRST(b);
return APR_SUCCESS;
}
APR_BRIGADE_CHECK_CONSISTENCY(b);
for (e = APR_BRIGADE_FIRST(b);
e != APR_BRIGADE_SENTINEL(b);
e = APR_BUCKET_NEXT(e))
{
if ((e->length == (apr_size_t)(-1)) && (point > (apr_size_t)(-1))) {
/* point is too far out to simply split this bucket,
* we must fix this bucket's size and keep going... */
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
if (rv != APR_SUCCESS) {
*after_point = e;
return rv;
}
}
if ((point < e->length) || (e->length == (apr_size_t)(-1))) {
/* We already checked e->length -1 above, so we now
* trust e->length < MAX_APR_SIZE_T.
* First try to split the bucket natively... */
if ((rv = apr_bucket_split(e, (apr_size_t)point))
!= APR_ENOTIMPL) {
*after_point = APR_BUCKET_NEXT(e);
return rv;
}
/* if the bucket cannot be split, we must read from it,
* changing its type to one that can be split */
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
if (rv != APR_SUCCESS) {
*after_point = e;
return rv;
}
/* this assumes that len == e->length, which is okay because e
* might have been morphed by the apr_bucket_read() above, but
* if it was, the length would have been adjusted appropriately */
if (point < e->length) {
rv = apr_bucket_split(e, (apr_size_t)point);
*after_point = APR_BUCKET_NEXT(e);
return rv;
}
}
if (point == e->length) {
*after_point = APR_BUCKET_NEXT(e);
return APR_SUCCESS;
}
point -= e->length;
}
*after_point = APR_BRIGADE_SENTINEL(b);
return APR_INCOMPLETE;
}
APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
int read_all, apr_off_t *length)
{
apr_off_t total = 0;
apr_bucket *bkt;
for (bkt = APR_BRIGADE_FIRST(bb);
bkt != APR_BRIGADE_SENTINEL(bb);
bkt = APR_BUCKET_NEXT(bkt))
{
if (bkt->length == (apr_size_t)(-1)) {
const char *ignore;
apr_size_t len;
apr_status_t status;
if (!read_all) {
*length = -1;
return APR_SUCCESS;
}
if ((status = apr_bucket_read(bkt, &ignore, &len,
APR_BLOCK_READ)) != APR_SUCCESS) {
return status;
}
}
total += bkt->length;
}
*length = total;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
char *c, apr_size_t *len)
{
apr_size_t actual = 0;
apr_bucket *b;
for (b = APR_BRIGADE_FIRST(bb);
b != APR_BRIGADE_SENTINEL(bb);
b = APR_BUCKET_NEXT(b))
{
const char *str;
apr_size_t str_len;
apr_status_t status;
status = apr_bucket_read(b, &str, &str_len, APR_BLOCK_READ);
if (status != APR_SUCCESS) {
return status;
}
/* If we would overflow. */
if (str_len + actual > *len) {
str_len = *len - actual;
}
/* XXX: It appears that overflow of the final bucket
* is DISCARDED without any warning to the caller.
*
* No, we only copy the data up to their requested size. -- jre
*/
memcpy(c, str, str_len);
c += str_len;
actual += str_len;
/* This could probably be actual == *len, but be safe from stray
* photons. */
if (actual >= *len) {
break;
}
}
*len = actual;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb,
char **c,
apr_size_t *len,
apr_pool_t *pool)
{
apr_off_t actual;
apr_size_t total;
apr_status_t rv;
apr_brigade_length(bb, 1, &actual);
/* XXX: This is dangerous beyond belief. At least in the
* apr_brigade_flatten case, the user explicitly stated their
* buffer length - so we don't up and palloc 4GB for a single
* file bucket. This API must grow a useful max boundry,
* either compiled-in or preset via the *len value.
*
* Shouldn't both fn's grow an additional return value for
* the case that the brigade couldn't be flattened into the
* provided or allocated buffer (such as APR_EMOREDATA?)
* Not a failure, simply an advisory result.
*/
total = (apr_size_t)actual;
*c = apr_palloc(pool, total);
rv = apr_brigade_flatten(bb, *c, &total);
if (rv != APR_SUCCESS) {
return rv;
}
*len = total;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
apr_bucket_brigade *bbIn,
apr_read_type_e block,
apr_off_t maxbytes)
{
apr_off_t readbytes = 0;
while (!APR_BRIGADE_EMPTY(bbIn)) {
const char *pos;
const char *str;
apr_size_t len;
apr_status_t rv;
apr_bucket *e;
e = APR_BRIGADE_FIRST(bbIn);
rv = apr_bucket_read(e, &str, &len, block);
if (rv != APR_SUCCESS) {
return rv;
}
pos = memchr(str, APR_ASCII_LF, len);
/* We found a match. */
if (pos != NULL) {
apr_bucket_split(e, pos - str + 1);
APR_BUCKET_REMOVE(e);
APR_BRIGADE_INSERT_TAIL(bbOut, e);
return APR_SUCCESS;
}
APR_BUCKET_REMOVE(e);
APR_BRIGADE_INSERT_TAIL(bbOut, e);
readbytes += len;
/* We didn't find an APR_ASCII_LF within the maximum line length. */
if (readbytes >= maxbytes) {
break;
}
}
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b,
struct iovec *vec, int *nvec)
{
int left = *nvec;
apr_bucket *e;
struct iovec *orig;
apr_size_t iov_len;
apr_status_t rv;
orig = vec;
for (e = APR_BRIGADE_FIRST(b);
e != APR_BRIGADE_SENTINEL(b);
e = APR_BUCKET_NEXT(e))
{
if (left-- == 0)
break;
rv = apr_bucket_read(e, (const char **)&vec->iov_base, &iov_len,
APR_NONBLOCK_READ);
if (rv != APR_SUCCESS)
return rv;
vec->iov_len = iov_len; /* set indirectly in case size differs */
++vec;
}
*nvec = vec - orig;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
va_list va)
{
for (;;) {
const char *str = va_arg(va, const char *);
apr_status_t rv;
if (str == NULL)
break;
rv = apr_brigade_write(b, flush, ctx, str, strlen(str));
if (rv != APR_SUCCESS)
return rv;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
apr_brigade_flush flush, void *ctx,
const char c)
{
return apr_brigade_write(b, flush, ctx, &c, 1);
}
APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
const char *str, apr_size_t nbyte)
{
apr_bucket *e = APR_BRIGADE_LAST(b);
apr_size_t remaining = APR_BUCKET_BUFF_SIZE;
char *buf = NULL;
if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)) {
apr_bucket_heap *h = e->data;
/* HEAP bucket start offsets are always in-memory, safe to cast */
remaining = h->alloc_len - (e->length + (apr_size_t)e->start);
buf = h->base + e->start + e->length;
}
if (nbyte > remaining) {
/* either a buffer bucket exists but is full,
* or no buffer bucket exists and the data is too big
* to buffer. In either case, we should flush. */
if (flush) {
e = apr_bucket_transient_create(str, nbyte, b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
return flush(b, ctx);
}
else {
e = apr_bucket_heap_create(str, nbyte, NULL, b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
return APR_SUCCESS;
}
}
else if (!buf) {
/* we don't have a buffer, but the data is small enough
* that we don't mind making a new buffer */
buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
apr_bucket_free, b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
e->length = 0; /* We are writing into the brigade, and
* allocating more memory than we need. This
* ensures that the bucket thinks it is empty just
* after we create it. We'll fix the length
* once we put data in it below.
*/
}
/* there is a sufficiently big buffer bucket available now */
memcpy(buf, str, nbyte);
e->length += nbyte;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
const struct iovec *vec,
apr_size_t nvec)
{
apr_bucket *e;
apr_size_t total_len;
apr_size_t i;
char *buf;
/* Compute the total length of the data to be written.
*/
total_len = 0;
for (i = 0; i < nvec; i++) {
total_len += vec[i].iov_len;
}
/* If the data to be written is very large, try to convert
* the iovec to transient buckets rather than copying.
*/
if (total_len > APR_BUCKET_BUFF_SIZE) {
if (flush) {
for (i = 0; i < nvec; i++) {
e = apr_bucket_transient_create(vec[i].iov_base,
vec[i].iov_len,
b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
}
return flush(b, ctx);
}
else {
for (i = 0; i < nvec; i++) {
e = apr_bucket_heap_create((const char *) vec[i].iov_base,
vec[i].iov_len, NULL,
b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
}
return APR_SUCCESS;
}
}
i = 0;
/* If there is a heap bucket at the end of the brigade
* already, copy into the existing bucket.
*/
e = APR_BRIGADE_LAST(b);
if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)) {
apr_bucket_heap *h = e->data;
apr_size_t remaining = h->alloc_len -
(e->length + (apr_size_t)e->start);
buf = h->base + e->start + e->length;
if (remaining >= total_len) {
/* Simple case: all the data will fit in the
* existing heap bucket
*/
for (; i < nvec; i++) {
apr_size_t len = vec[i].iov_len;
memcpy(buf, (const void *) vec[i].iov_base, len);
buf += len;
}
e->length += total_len;
return APR_SUCCESS;
}
else {
/* More complicated case: not all of the data
* will fit in the existing heap bucket. The
* total data size is <= APR_BUCKET_BUFF_SIZE,
* so we'll need only one additional bucket.
*/
const char *start_buf = buf;
for (; i < nvec; i++) {
apr_size_t len = vec[i].iov_len;
if (len > remaining) {
break;
}
memcpy(buf, (const void *) vec[i].iov_base, len);
buf += len;
remaining -= len;
}
e->length += (buf - start_buf);
total_len -= (buf - start_buf);
if (flush) {
apr_status_t rv = flush(b, ctx);
if (rv != APR_SUCCESS) {
return rv;
}
}
/* Now fall through into the case below to
* allocate another heap bucket and copy the
* rest of the array. (Note that i is not
* reset to zero here; it holds the index
* of the first vector element to be
* written to the new bucket.)
*/
}
}
/* Allocate a new heap bucket, and copy the data into it.
* The checks above ensure that the amount of data to be
* written here is no larger than APR_BUCKET_BUFF_SIZE.
*/
buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
apr_bucket_free, b->bucket_alloc);
for (; i < nvec; i++) {
apr_size_t len = vec[i].iov_len;
memcpy(buf, (const void *) vec[i].iov_base, len);
buf += len;
}
e->length = total_len;
APR_BRIGADE_INSERT_TAIL(b, e);
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
apr_brigade_flush flush, void *ctx,
const char *str)
{
apr_size_t len = strlen(str);
apr_bucket *bkt = APR_BRIGADE_LAST(bb);
if (!APR_BRIGADE_EMPTY(bb) && APR_BUCKET_IS_HEAP(bkt)) {
/* If there is enough space available in a heap bucket
* at the end of the brigade, copy the string directly
* into the heap bucket
*/
apr_bucket_heap *h = bkt->data;
apr_size_t bytes_avail = h->alloc_len - bkt->length;
if (bytes_avail >= len) {
char *buf = h->base + bkt->start + bkt->length;
memcpy(buf, str, len);
bkt->length += len;
return APR_SUCCESS;
}
}
/* If the string could not be copied into an existing heap
* bucket, delegate the work to apr_brigade_write(), which
* knows how to grow the brigade
*/
return apr_brigade_write(bb, flush, ctx, str, len);
}
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx, ...)
{
va_list va;
apr_status_t rv;
va_start(va, ctx);
rv = apr_brigade_vputstrs(b, flush, ctx, va);
va_end(va);
return rv;
}
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
const char *fmt, ...)
{
va_list ap;
apr_status_t rv;
va_start(ap, fmt);
rv = apr_brigade_vprintf(b, flush, ctx, fmt, ap);
va_end(ap);
return rv;
}
struct brigade_vprintf_data_t {
apr_vformatter_buff_t vbuff;
apr_bucket_brigade *b; /* associated brigade */
apr_brigade_flush *flusher; /* flushing function */
void *ctx;
char *cbuff; /* buffer to flush from */
};
static apr_status_t brigade_flush(apr_vformatter_buff_t *buff)
{
/* callback function passed to ap_vformatter to be
* called when vformatter needs to buff and
* buff.curpos > buff.endpos
*/
/* "downcast," have really passed a brigade_vprintf_data_t* */
struct brigade_vprintf_data_t *vd = (struct brigade_vprintf_data_t*)buff;
apr_status_t res = APR_SUCCESS;
res = apr_brigade_write(vd->b, *vd->flusher, vd->ctx, vd->cbuff,
APR_BUCKET_BUFF_SIZE);
if(res != APR_SUCCESS) {
return -1;
}
vd->vbuff.curpos = vd->cbuff;
vd->vbuff.endpos = vd->cbuff + APR_BUCKET_BUFF_SIZE;
return res;
}
APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
const char *fmt, va_list va)
{
/* the cast, in order of appearance */
struct brigade_vprintf_data_t vd;
char buf[APR_BUCKET_BUFF_SIZE];
apr_size_t written;
vd.vbuff.curpos = buf;
vd.vbuff.endpos = buf + APR_BUCKET_BUFF_SIZE;
vd.b = b;
vd.flusher = &flush;
vd.ctx = ctx;
vd.cbuff = buf;
written = apr_vformatter(brigade_flush, &vd.vbuff, fmt, va);
if (written == -1) {
return -1;
}
/* tack on null terminator to remaining string */
*(vd.vbuff.curpos) = '\0';
/* write out what remains in the buffer */
return apr_brigade_write(b, flush, ctx, buf, vd.vbuff.curpos - buf);
}
/* A "safe" maximum bucket size, 1Gb */
#define MAX_BUCKET_SIZE (0x40000000)
APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
apr_file_t *f,
apr_off_t start,
apr_off_t length,
apr_pool_t *p)
{
apr_bucket *e;
if (sizeof(apr_off_t) == sizeof(apr_size_t) || length < MAX_BUCKET_SIZE) {
e = apr_bucket_file_create(f, start, (apr_size_t)length, p,
bb->bucket_alloc);
}
else {
/* Several buckets are needed. */
e = apr_bucket_file_create(f, start, MAX_BUCKET_SIZE, p,
bb->bucket_alloc);
while (length > MAX_BUCKET_SIZE) {
apr_bucket *ce;
apr_bucket_copy(e, &ce);
APR_BRIGADE_INSERT_TAIL(bb, ce);
e->start += MAX_BUCKET_SIZE;
length -= MAX_BUCKET_SIZE;
}
e->length = (apr_size_t)length; /* Resize just the last bucket */
}
APR_BRIGADE_INSERT_TAIL(bb, e);
return e;
}

View File

@ -1,46 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
apr_pool_t *pool)
{
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
apr_pool_t *pool)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
apr_size_t point)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
apr_bucket **c)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data)
{
return;
}

View File

@ -1,184 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include "apr_buckets.h"
#include "apr_allocator.h"
#define ALLOC_AMT (8192 - APR_MEMNODE_T_SIZE)
typedef struct node_header_t {
apr_size_t size;
apr_bucket_alloc_t *alloc;
apr_memnode_t *memnode;
struct node_header_t *next;
} node_header_t;
#define SIZEOF_NODE_HEADER_T APR_ALIGN_DEFAULT(sizeof(node_header_t))
#define SMALL_NODE_SIZE (APR_BUCKET_ALLOC_SIZE + SIZEOF_NODE_HEADER_T)
/** A list of free memory from which new buckets or private bucket
* structures can be allocated.
*/
struct apr_bucket_alloc_t {
apr_pool_t *pool;
apr_allocator_t *allocator;
node_header_t *freelist;
apr_memnode_t *blocks;
};
static apr_status_t alloc_cleanup(void *data)
{
apr_bucket_alloc_t *list = data;
apr_allocator_free(list->allocator, list->blocks);
#if APR_POOL_DEBUG
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
apr_allocator_destroy(list->allocator);
}
#endif
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p)
{
apr_allocator_t *allocator = apr_pool_allocator_get(p);
apr_bucket_alloc_t *list;
#if APR_POOL_DEBUG
/* may be NULL for debug mode. */
if (allocator == NULL) {
if (apr_allocator_create(&allocator) != APR_SUCCESS) {
abort();
}
}
#endif
list = apr_bucket_alloc_create_ex(allocator);
list->pool = p;
apr_pool_cleanup_register(list->pool, list, alloc_cleanup,
apr_pool_cleanup_null);
return list;
}
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(
apr_allocator_t *allocator)
{
apr_bucket_alloc_t *list;
apr_memnode_t *block;
block = apr_allocator_alloc(allocator, ALLOC_AMT);
list = (apr_bucket_alloc_t *)block->first_avail;
list->pool = NULL;
list->allocator = allocator;
list->freelist = NULL;
list->blocks = block;
block->first_avail += APR_ALIGN_DEFAULT(sizeof(*list));
return list;
}
APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list)
{
if (list->pool) {
apr_pool_cleanup_kill(list->pool, list, alloc_cleanup);
}
apr_allocator_free(list->allocator, list->blocks);
#if APR_POOL_DEBUG
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
apr_allocator_destroy(list->allocator);
}
#endif
}
APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size,
apr_bucket_alloc_t *list)
{
node_header_t *node;
apr_memnode_t *active = list->blocks;
char *endp;
size += SIZEOF_NODE_HEADER_T;
if (size <= SMALL_NODE_SIZE) {
if (list->freelist) {
node = list->freelist;
list->freelist = node->next;
}
else {
endp = active->first_avail + SMALL_NODE_SIZE;
if (endp >= active->endp) {
list->blocks = apr_allocator_alloc(list->allocator, ALLOC_AMT);
list->blocks->next = active;
active = list->blocks;
endp = active->first_avail + SMALL_NODE_SIZE;
}
node = (node_header_t *)active->first_avail;
node->alloc = list;
node->memnode = active;
node->size = SMALL_NODE_SIZE;
active->first_avail = endp;
}
}
else {
apr_memnode_t *memnode = apr_allocator_alloc(list->allocator, size);
node = (node_header_t *)memnode->first_avail;
node->alloc = list;
node->memnode = memnode;
node->size = size;
}
return ((char *)node) + SIZEOF_NODE_HEADER_T;
}
#ifdef APR_BUCKET_DEBUG
#if APR_HAVE_STDLIB_H
#include <stdlib.h>
#endif
static void check_not_already_free(node_header_t *node)
{
apr_bucket_alloc_t *list = node->alloc;
node_header_t *curr = list->freelist;
while (curr) {
if (node == curr) {
abort();
}
curr = curr->next;
}
}
#else
#define check_not_already_free(node)
#endif
APU_DECLARE_NONSTD(void) apr_bucket_free(void *mem)
{
node_header_t *node = (node_header_t *)((char *)mem - SIZEOF_NODE_HEADER_T);
apr_bucket_alloc_t *list = node->alloc;
if (node->size == SMALL_NODE_SIZE) {
check_not_already_free(node);
node->next = list->freelist;
list->freelist = node;
}
else {
apr_allocator_free(list->allocator, node->memnode);
}
}

View File

@ -1,54 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t eos_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = NULL;
*len = 0;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b)
{
b->length = 0;
b->start = 0;
b->data = NULL;
b->type = &apr_bucket_type_eos;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_eos_make(b);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos = {
"EOS", 5, APR_BUCKET_METADATA,
apr_bucket_destroy_noop,
eos_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_split_notimpl,
apr_bucket_simple_copy
};

View File

@ -1,228 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_general.h"
#include "apr_file_io.h"
#include "apr_buckets.h"
#if APR_HAS_MMAP
#include "apr_mmap.h"
/* mmap support for static files based on ideas from John Heidemann's
* patch against 1.0.5. See
* <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
*/
#endif /* APR_HAS_MMAP */
static void file_bucket_destroy(void *data)
{
apr_bucket_file *f = data;
if (apr_bucket_shared_destroy(f)) {
/* no need to close the file here; it will get
* done automatically when the pool gets cleaned up */
apr_bucket_free(f);
}
}
#if APR_HAS_MMAP
static int file_make_mmap(apr_bucket *e, apr_size_t filelength,
apr_off_t fileoffset, apr_pool_t *p)
{
apr_bucket_file *a = e->data;
apr_mmap_t *mm;
if (!a->can_mmap) {
return 0;
}
if (filelength > APR_MMAP_LIMIT) {
if (apr_mmap_create(&mm, a->fd, fileoffset, APR_MMAP_LIMIT,
APR_MMAP_READ, p) != APR_SUCCESS)
{
return 0;
}
apr_bucket_split(e, APR_MMAP_LIMIT);
filelength = APR_MMAP_LIMIT;
}
else if ((filelength < APR_MMAP_THRESHOLD) ||
(apr_mmap_create(&mm, a->fd, fileoffset, filelength,
APR_MMAP_READ, p) != APR_SUCCESS))
{
return 0;
}
apr_bucket_mmap_make(e, mm, 0, filelength);
file_bucket_destroy(a);
return 1;
}
#endif
static apr_status_t file_bucket_read(apr_bucket *e, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_file *a = e->data;
apr_file_t *f = a->fd;
apr_bucket *b = NULL;
char *buf;
apr_status_t rv;
apr_size_t filelength = e->length; /* bytes remaining in file past offset */
apr_off_t fileoffset = e->start;
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
apr_int32_t flags;
#endif
#if APR_HAS_MMAP
if (file_make_mmap(e, filelength, fileoffset, a->readpool)) {
return apr_bucket_read(e, str, len, block);
}
#endif
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
if ((flags = apr_file_flags_get(f)) & APR_XTHREAD) {
/* this file descriptor is shared across multiple threads and
* this OS doesn't support that natively, so as a workaround
* we must reopen the file into a->readpool */
const char *fname;
apr_file_name_get(&fname, f);
rv = apr_file_open(&f, fname, (flags & ~APR_XTHREAD), 0, a->readpool);
if (rv != APR_SUCCESS)
return rv;
a->fd = f;
}
#endif
*len = (filelength > APR_BUCKET_BUFF_SIZE)
? APR_BUCKET_BUFF_SIZE
: filelength;
*str = NULL; /* in case we die prematurely */
buf = apr_bucket_alloc(*len, e->list);
/* Handle offset ... */
rv = apr_file_seek(f, APR_SET, &fileoffset);
if (rv != APR_SUCCESS) {
apr_bucket_free(buf);
return rv;
}
rv = apr_file_read(f, buf, len);
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
filelength -= *len;
/*
* Change the current bucket to refer to what we read,
* even if we read nothing because we hit EOF.
*/
apr_bucket_heap_make(e, buf, *len, apr_bucket_free);
/* If we have more to read from the file, then create another bucket */
if (filelength > 0 && rv != APR_EOF) {
/* for efficiency, we can just build a new apr_bucket struct
* to wrap around the existing file bucket */
b = apr_bucket_alloc(sizeof(*b), e->list);
b->start = fileoffset + (*len);
b->length = filelength;
b->data = a;
b->type = &apr_bucket_type_file;
b->free = apr_bucket_free;
b->list = e->list;
APR_BUCKET_INSERT_AFTER(e, b);
}
else {
file_bucket_destroy(a);
}
*str = buf;
return rv;
}
APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
apr_off_t offset,
apr_size_t len, apr_pool_t *p)
{
apr_bucket_file *f;
f = apr_bucket_alloc(sizeof(*f), b->list);
f->fd = fd;
f->readpool = p;
#if APR_HAS_MMAP
f->can_mmap = 1;
#endif
b = apr_bucket_shared_make(b, f, offset, len);
b->type = &apr_bucket_type_file;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
apr_off_t offset,
apr_size_t len, apr_pool_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_file_make(b, fd, offset, len, p);
}
APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *e,
int enabled)
{
#if APR_HAS_MMAP
apr_bucket_file *a = e->data;
a->can_mmap = enabled;
return APR_SUCCESS;
#else
return APR_ENOTIMPL;
#endif /* APR_HAS_MMAP */
}
static apr_status_t file_bucket_setaside(apr_bucket *data, apr_pool_t *reqpool)
{
apr_bucket_file *a = data->data;
apr_file_t *fd = NULL;
apr_file_t *f = a->fd;
apr_pool_t *curpool = apr_file_pool_get(f);
if (apr_pool_is_ancestor(curpool, reqpool)) {
return APR_SUCCESS;
}
if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
a->readpool = reqpool;
}
apr_file_setaside(&fd, f, reqpool);
a->fd = fd;
return APR_SUCCESS;
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file = {
"FILE", 5, APR_BUCKET_DATA,
file_bucket_destroy,
file_bucket_read,
file_bucket_setaside,
apr_bucket_shared_split,
apr_bucket_shared_copy
};

View File

@ -1,54 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t flush_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = NULL;
*len = 0;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b)
{
b->length = 0;
b->start = 0;
b->data = NULL;
b->type = &apr_bucket_type_flush;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_flush_make(b);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush = {
"FLUSH", 5, APR_BUCKET_METADATA,
apr_bucket_destroy_noop,
flush_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_split_notimpl,
apr_bucket_simple_copy
};

View File

@ -1,96 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
static apr_status_t heap_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_heap *h = b->data;
*str = h->base + b->start;
*len = b->length;
return APR_SUCCESS;
}
static void heap_bucket_destroy(void *data)
{
apr_bucket_heap *h = data;
if (apr_bucket_shared_destroy(h)) {
(*h->free_func)(h->base);
apr_bucket_free(h);
}
}
/* Warning: if you change this function, be sure to
* change apr_bucket_pool_make() too! */
APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
apr_size_t length,
void (*free_func)(void *data))
{
apr_bucket_heap *h;
h = apr_bucket_alloc(sizeof(*h), b->list);
if (!free_func) {
h->alloc_len = length;
h->base = apr_bucket_alloc(h->alloc_len, b->list);
if (h->base == NULL) {
apr_bucket_free(h);
return NULL;
}
h->free_func = apr_bucket_free;
memcpy(h->base, buf, length);
}
else {
/* XXX: we lose the const qualifier here which indicates
* there's something screwy with the API...
*/
h->base = (char *) buf;
h->alloc_len = length;
h->free_func = free_func;
}
b = apr_bucket_shared_make(b, h, 0, length);
b->type = &apr_bucket_type_heap;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
apr_size_t length,
void (*free_func)(void *data),
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_heap_make(b, buf, length, free_func);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap = {
"HEAP", 5, APR_BUCKET_DATA,
heap_bucket_destroy,
heap_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_shared_split,
apr_bucket_shared_copy
};

View File

@ -1,144 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#if APR_HAS_MMAP
static apr_status_t mmap_bucket_read(apr_bucket *b, const char **str,
apr_size_t *length, apr_read_type_e block)
{
apr_bucket_mmap *m = b->data;
apr_status_t ok;
void *addr;
if (!m->mmap) {
/* the apr_mmap_t was already cleaned up out from under us */
return APR_EINVAL;
}
ok = apr_mmap_offset(&addr, m->mmap, b->start);
if (ok != APR_SUCCESS) {
return ok;
}
*str = addr;
*length = b->length;
return APR_SUCCESS;
}
static apr_status_t mmap_bucket_cleanup(void *data)
{
/* the apr_mmap_t is about to disappear out from under us, so we
* have no choice but to pretend it doesn't exist anymore. the
* refcount is now useless because there's nothing to refer to
* anymore. so the only valid action on any remaining referrer
* is to delete it. no more reads, no more anything. */
apr_bucket_mmap *m = data;
m->mmap = NULL;
return APR_SUCCESS;
}
static void mmap_bucket_destroy(void *data)
{
apr_bucket_mmap *m = data;
if (apr_bucket_shared_destroy(m)) {
if (m->mmap) {
apr_pool_cleanup_kill(m->mmap->cntxt, m, mmap_bucket_cleanup);
apr_mmap_delete(m->mmap);
}
apr_bucket_free(m);
}
}
/*
* XXX: are the start and length arguments useful?
*/
APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
apr_off_t start,
apr_size_t length)
{
apr_bucket_mmap *m;
m = apr_bucket_alloc(sizeof(*m), b->list);
m->mmap = mm;
apr_pool_cleanup_register(mm->cntxt, m, mmap_bucket_cleanup,
apr_pool_cleanup_null);
b = apr_bucket_shared_make(b, m, start, length);
b->type = &apr_bucket_type_mmap;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm,
apr_off_t start,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_mmap_make(b, mm, start, length);
}
static apr_status_t mmap_bucket_setaside(apr_bucket *b, apr_pool_t *p)
{
apr_bucket_mmap *m = b->data;
apr_mmap_t *mm = m->mmap;
apr_mmap_t *new_mm;
apr_status_t ok;
if (!mm) {
/* the apr_mmap_t was already cleaned up out from under us */
return APR_EINVAL;
}
/* shortcut if possible */
if (apr_pool_is_ancestor(mm->cntxt, p)) {
return APR_SUCCESS;
}
/* duplicate apr_mmap_t into new pool */
ok = apr_mmap_dup(&new_mm, mm, p);
if (ok != APR_SUCCESS) {
return ok;
}
/* decrement refcount on old apr_bucket_mmap */
mmap_bucket_destroy(m);
/* create new apr_bucket_mmap pointing to new apr_mmap_t */
apr_bucket_mmap_make(b, new_mm, b->start, b->length);
return APR_SUCCESS;
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_mmap = {
"MMAP", 5, APR_BUCKET_DATA,
mmap_bucket_destroy,
mmap_bucket_read,
mmap_bucket_setaside,
apr_bucket_shared_split,
apr_bucket_shared_copy
};
#endif

View File

@ -1,119 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t pipe_bucket_read(apr_bucket *a, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_file_t *p = a->data;
char *buf;
apr_status_t rv;
apr_interval_time_t timeout;
if (block == APR_NONBLOCK_READ) {
apr_file_pipe_timeout_get(p, &timeout);
apr_file_pipe_timeout_set(p, 0);
}
*str = NULL;
*len = APR_BUCKET_BUFF_SIZE;
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
rv = apr_file_read(p, buf, len);
if (block == APR_NONBLOCK_READ) {
apr_file_pipe_timeout_set(p, timeout);
}
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
/*
* If there's more to read we have to keep the rest of the pipe
* for later. Otherwise, we'll close the pipe.
* XXX: Note that more complicated bucket types that
* refer to data not in memory and must therefore have a read()
* function similar to this one should be wary of copying this
* code because if they have a destroy function they probably
* want to migrate the bucket's subordinate structure from the
* old bucket to a raw new one and adjust it as appropriate,
* rather than destroying the old one and creating a completely
* new bucket.
*/
if (*len > 0) {
apr_bucket_heap *h;
/* Change the current bucket to refer to what we read */
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
h = a->data;
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
*str = buf;
APR_BUCKET_INSERT_AFTER(a, apr_bucket_pipe_create(p, a->list));
}
else {
apr_bucket_free(buf);
a = apr_bucket_immortal_make(a, "", 0);
*str = a->data;
if (rv == APR_EOF) {
apr_file_close(p);
}
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b, apr_file_t *p)
{
/*
* A pipe is closed when the end is reached in pipe_bucket_read(). If
* the pipe isn't read to the end (e.g., error path), the pipe will be
* closed when its pool goes away.
*
* Note that typically the pipe is allocated from the request pool
* so it will disappear when the request is finished. However the
* core filter may decide to set aside the tail end of a CGI
* response if the connection is pipelined. This turns out not to
* be a problem because the core will have read to the end of the
* stream so the bucket(s) that it sets aside will be the heap
* buckets created by pipe_bucket_read() above.
*/
b->type = &apr_bucket_type_pipe;
b->length = (apr_size_t)(-1);
b->start = -1;
b->data = p;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_pipe_make(b, p);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe = {
"PIPE", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
pipe_bucket_read,
apr_bucket_setaside_notimpl,
apr_bucket_split_notimpl,
apr_bucket_copy_notimpl
};

View File

@ -1,142 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
static apr_status_t pool_bucket_cleanup(void *data)
{
apr_bucket_pool *p = data;
/*
* If the pool gets cleaned up, we have to copy the data out
* of the pool and onto the heap. But the apr_buckets out there
* that point to this pool bucket need to be notified such that
* they can morph themselves into a regular heap bucket the next
* time they try to read. To avoid having to manipulate
* reference counts and b->data pointers, the apr_bucket_pool
* actually _contains_ an apr_bucket_heap as its first element,
* so the two share their apr_bucket_refcount member, and you
* can typecast a pool bucket struct to make it look like a
* regular old heap bucket struct.
*/
p->heap.base = apr_bucket_alloc(p->heap.alloc_len, p->list);
memcpy(p->heap.base, p->base, p->heap.alloc_len);
p->base = NULL;
p->pool = NULL;
return APR_SUCCESS;
}
static apr_status_t pool_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_pool *p = b->data;
const char *base = p->base;
if (p->pool == NULL) {
/*
* pool has been cleaned up... masquerade as a heap bucket from now
* on. subsequent bucket operations will use the heap bucket code.
*/
b->type = &apr_bucket_type_heap;
base = p->heap.base;
}
*str = base + b->start;
*len = b->length;
return APR_SUCCESS;
}
static void pool_bucket_destroy(void *data)
{
apr_bucket_pool *p = data;
/* If the pool is cleaned up before the last reference goes
* away, the data is really now on the heap; heap_destroy() takes
* over. free() in heap_destroy() thinks it's freeing
* an apr_bucket_heap, when in reality it's freeing the whole
* apr_bucket_pool for us.
*/
if (p->pool) {
/* the shared resource is still in the pool
* because the pool has not been cleaned up yet
*/
if (apr_bucket_shared_destroy(p)) {
apr_pool_cleanup_kill(p->pool, p, pool_bucket_cleanup);
apr_bucket_free(p);
}
}
else {
/* the shared resource is no longer in the pool, it's
* on the heap, but this reference still thinks it's a pool
* bucket. we should just go ahead and pass control to
* heap_destroy() for it since it doesn't know any better.
*/
apr_bucket_type_heap.destroy(p);
}
}
APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b,
const char *buf, apr_size_t length, apr_pool_t *pool)
{
apr_bucket_pool *p;
p = apr_bucket_alloc(sizeof(*p), b->list);
/* XXX: we lose the const qualifier here which indicates
* there's something screwy with the API...
*/
/* XXX: why is this? buf is const, p->base is const... what's
* the problem? --jcw */
p->base = (char *) buf;
p->pool = pool;
p->list = b->list;
b = apr_bucket_shared_make(b, p, 0, length);
b->type = &apr_bucket_type_pool;
/* pre-initialize heap bucket member */
p->heap.alloc_len = length;
p->heap.base = NULL;
p->heap.free_func = apr_bucket_free;
apr_pool_cleanup_register(p->pool, p, pool_bucket_cleanup,
apr_pool_cleanup_null);
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf,
apr_size_t length,
apr_pool_t *pool,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_pool_make(b, buf, length, pool);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool = {
"POOL", 5, APR_BUCKET_DATA,
pool_bucket_destroy,
pool_bucket_read,
apr_bucket_setaside_noop, /* don't need to setaside thanks to the cleanup*/
apr_bucket_shared_split,
apr_bucket_shared_copy
};

View File

@ -1,64 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *a,
apr_size_t point)
{
apr_bucket_refcount *r = a->data;
apr_status_t rv;
if ((rv = apr_bucket_simple_split(a, point)) != APR_SUCCESS) {
return rv;
}
r->refcount++;
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
apr_bucket **b)
{
apr_bucket_refcount *r = a->data;
apr_bucket_simple_copy(a, b);
r->refcount++;
return APR_SUCCESS;
}
APU_DECLARE(int) apr_bucket_shared_destroy(void *data)
{
apr_bucket_refcount *r = data;
r->refcount--;
return (r->refcount == 0);
}
APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
apr_off_t start,
apr_size_t length)
{
apr_bucket_refcount *r = data;
b->data = r;
b->start = start;
b->length = length;
/* caller initializes the type field */
r->refcount = 1;
return b;
}

View File

@ -1,137 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
apr_bucket **b)
{
*b = apr_bucket_alloc(sizeof(**b), a->list); /* XXX: check for failure? */
**b = *a;
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *a,
apr_size_t point)
{
apr_bucket *b;
if (point > a->length) {
return APR_EINVAL;
}
apr_bucket_simple_copy(a, &b);
a->length = point;
b->length -= point;
b->start += point;
APR_BUCKET_INSERT_AFTER(a, b);
return APR_SUCCESS;
}
static apr_status_t simple_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = (char *)b->data + b->start;
*len = b->length;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b,
const char *buf,
apr_size_t length)
{
b->data = (char *)buf;
b->length = length;
b->start = 0;
b->type = &apr_bucket_type_immortal;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_immortal_make(b, buf, length);
}
/*
* XXX: This function could do with some tweaking to reduce memory
* usage in various cases, e.g. share buffers in the heap between all
* the buckets that are set aside, or even spool set-aside data to
* disk if it gets too voluminous (but if it does then that's probably
* a bug elsewhere). There should probably be a apr_brigade_setaside()
* function that co-ordinates the action of all the bucket setaside
* functions to improve memory efficiency.
*/
static apr_status_t transient_bucket_setaside(apr_bucket *b, apr_pool_t *pool)
{
b = apr_bucket_heap_make(b, (char *)b->data + b->start, b->length, NULL);
if (b == NULL) {
return APR_ENOMEM;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b,
const char *buf,
apr_size_t length)
{
b->data = (char *)buf;
b->length = length;
b->start = 0;
b->type = &apr_bucket_type_transient;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_transient_make(b, buf, length);
}
const apr_bucket_type_t apr_bucket_type_immortal = {
"IMMORTAL", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
simple_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_simple_split,
apr_bucket_simple_copy
};
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient = {
"TRANSIENT", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
simple_bucket_read,
transient_bucket_setaside,
apr_bucket_simple_split,
apr_bucket_simple_copy
};

View File

@ -1,114 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t socket_bucket_read(apr_bucket *a, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_socket_t *p = a->data;
char *buf;
apr_status_t rv;
apr_interval_time_t timeout;
if (block == APR_NONBLOCK_READ) {
apr_socket_timeout_get(p, &timeout);
apr_socket_timeout_set(p, 0);
}
*str = NULL;
*len = APR_BUCKET_BUFF_SIZE;
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
rv = apr_socket_recv(p, buf, len);
if (block == APR_NONBLOCK_READ) {
apr_socket_timeout_set(p, timeout);
}
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
/*
* If there's more to read we have to keep the rest of the socket
* for later. XXX: Note that more complicated bucket types that
* refer to data not in memory and must therefore have a read()
* function similar to this one should be wary of copying this
* code because if they have a destroy function they probably
* want to migrate the bucket's subordinate structure from the
* old bucket to a raw new one and adjust it as appropriate,
* rather than destroying the old one and creating a completely
* new bucket.
*
* Even if there is nothing more to read, don't close the socket here
* as we have to use it to send any response :) We could shut it
* down for reading, but there is no benefit to doing so.
*/
if (*len > 0) {
apr_bucket_heap *h;
/* Change the current bucket to refer to what we read */
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
h = a->data;
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
*str = buf;
APR_BUCKET_INSERT_AFTER(a, apr_bucket_socket_create(p, a->list));
}
else {
apr_bucket_free(buf);
a = apr_bucket_immortal_make(a, "", 0);
*str = a->data;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b, apr_socket_t *p)
{
/*
* XXX: We rely on a cleanup on some pool or other to actually
* destroy the socket. We should probably explicitly call apr to
* destroy it instead.
*
* Note that typically the socket is allocated from the connection pool
* so it will disappear when the connection is finished.
*/
b->type = &apr_bucket_type_socket;
b->length = (apr_size_t)(-1);
b->start = -1;
b->data = p;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_socket_make(b, p);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket = {
"SOCKET", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
socket_bucket_read,
apr_bucket_setaside_notimpl,
apr_bucket_split_notimpl,
apr_bucket_copy_notimpl
};

View File

@ -1,40 +0,0 @@
# DO NOT EDIT. AUTOMATICALLY GENERATED.
crypto/apr_md5.lo: crypto/apr_md5.c .make.dirs include/apr_xlate.h include/apr_md5.h include/apr_sha1.h
crypto/uuid.lo: crypto/uuid.c .make.dirs include/apr_uuid.h
crypto/apr_sha1.lo: crypto/apr_sha1.c .make.dirs include/apr_xlate.h include/apr_sha1.h include/apr_base64.h
crypto/getuuid.lo: crypto/getuuid.c .make.dirs include/apr_uuid.h include/apr_md5.h include/apr_xlate.h
crypto/apr_md4.lo: crypto/apr_md4.c .make.dirs include/apr_md4.h include/apr_xlate.h
encoding/apr_base64.lo: encoding/apr_base64.c .make.dirs include/apr_base64.h include/apr_xlate.h
hooks/apr_hooks.lo: hooks/apr_hooks.c .make.dirs include/apr_optional_hooks.h include/apr_optional.h include/apr_hooks.h
misc/apr_reslist.lo: misc/apr_reslist.c .make.dirs include/apr_reslist.h
misc/apr_rmm.lo: misc/apr_rmm.c .make.dirs include/apr_rmm.h include/apr_anylock.h
misc/apr_date.lo: misc/apr_date.c .make.dirs include/apr_date.h
misc/apu_version.lo: misc/apu_version.c .make.dirs include/apu_version.h
misc/apr_queue.lo: misc/apr_queue.c .make.dirs include/apr_queue.h
uri/apr_uri.lo: uri/apr_uri.c .make.dirs include/apr_uri.h
xml/apr_xml.lo: xml/apr_xml.c .make.dirs include/apr_xml.h include/apr_xlate.h
strmatch/apr_strmatch.lo: strmatch/apr_strmatch.c .make.dirs include/apr_strmatch.h
xlate/xlate.lo: xlate/xlate.c .make.dirs include/apr_xlate.h
OBJECTS_all = crypto/apr_md5.lo crypto/uuid.lo crypto/apr_sha1.lo crypto/getuuid.lo crypto/apr_md4.lo encoding/apr_base64.lo hooks/apr_hooks.lo misc/apr_reslist.lo misc/apr_rmm.lo misc/apr_date.lo misc/apu_version.lo misc/apr_queue.lo uri/apr_uri.lo xml/apr_xml.lo strmatch/apr_strmatch.lo xlate/xlate.lo
OBJECTS_unix = $(OBJECTS_all)
OBJECTS_aix = $(OBJECTS_all)
OBJECTS_beos = $(OBJECTS_all)
OBJECTS_os2 = $(OBJECTS_all)
OBJECTS_os390 = $(OBJECTS_all)
HEADERS = $(top_srcdir)/include/apr_optional.h $(top_srcdir)/include/apu_version.h $(top_srcdir)/include/apr_strmatch.h $(top_srcdir)/include/apr_optional_hooks.h $(top_srcdir)/include/apr_sdbm.h $(top_srcdir)/include/apr_md4.h $(top_srcdir)/include/apr_reslist.h $(top_srcdir)/include/apr_base64.h $(top_srcdir)/include/apr_xml.h $(top_srcdir)/include/apr_anylock.h $(top_srcdir)/include/apr_rmm.h $(top_srcdir)/include/apr_md5.h $(top_srcdir)/include/apr_date.h $(top_srcdir)/include/apr_hooks.h $(top_srcdir)/include/apr_xlate.h $(top_srcdir)/include/apr_queue.h $(top_srcdir)/include/apr_uri.h $(top_srcdir)/include/apr_uuid.h $(top_srcdir)/include/apr_sha1.h
SOURCE_DIRS = xml encoding hooks misc crypto uri strmatch xlate $(EXTRA_SOURCE_DIRS)
BUILD_DIRS = crypto encoding hooks misc strmatch uri xlate xml
.make.dirs: $(srcdir)/build-outputs.mk
@for d in $(BUILD_DIRS); do test -d $$d || mkdir $$d; done
@echo timestamp > $@

View File

@ -1,32 +0,0 @@
#
# Configuration file for APRUTIL. Used by APR/build/gen-build.py
#
[options]
# the platform-independent .c files
paths =
buckets/*.c
crypto/*.c
dbm/*.c
dbm/sdbm/*.c
encoding/*.c
hooks/*.c
ldap/*.c
misc/*.c
uri/apr_uri.c
xml/*.c
strmatch/*.c
xlate/*.c
dbd/*.c
# we have no platform-specific subdirs
platform_dirs =
# the public headers
headers = include/*.h
# gen_uri_delim.c
# we have a recursive makefile for the test files (for now)
# test/*.c

View File

@ -1,435 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2000-2005 The Apache Software Foundation or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl custom autoconf rules for APRUTIL
dnl
dnl
dnl APU_FIND_APR: figure out where APR is located
dnl
AC_DEFUN([APU_FIND_APR], [
dnl use the find_apr.m4 script to locate APR. sets apr_found and apr_config
APR_FIND_APR(,,,[1])
if test "$apr_found" = "no"; then
AC_MSG_ERROR(APR could not be located. Please use the --with-apr option.)
fi
APR_BUILD_DIR="`$apr_config --installbuilddir`"
dnl make APR_BUILD_DIR an absolute directory (we'll need it in the
dnl sub-projects in some cases)
APR_BUILD_DIR="`cd $APR_BUILD_DIR && pwd`"
APR_INCLUDES="`$apr_config --includes`"
APR_LIBS="`$apr_config --link-libtool --libs`"
APR_SO_EXT="`$apr_config --apr-so-ext`"
APR_LIB_TARGET="`$apr_config --apr-lib-target`"
AC_SUBST(APR_INCLUDES)
AC_SUBST(APR_LIBS)
AC_SUBST(APR_BUILD_DIR)
])
dnl
dnl APU_TEST_EXPAT(directory): test if Expat is located in the specified dir
dnl
dnl if present: sets expat_include_dir, expat_libs, possibly expat_old
dnl
AC_DEFUN([APU_TEST_EXPAT], [
AC_MSG_CHECKING(for Expat in ifelse($2,,$1,$2))
expat_libtool=""
if test -r "$1/lib/expat.h.in"; then
dnl Expat 1.95.* distribution
expat_include_dir="$1/lib"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
expat_libtool="$1/lib/libexpat.la"
elif test -r "$1/include/expat.h" -a \
-r "$1/lib/libexpat.la"; then
dnl Expat 1.95.* installation (with libtool)
expat_include_dir="$1/include"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
expat_libtool="$1/lib/libexpat.la"
elif test -r "$1/include/expat.h" -a \
-r "$1/lib64/libexpat.la"; then
dnl Expat 1.95.* installation on certain 64-bit platforms (with libtool)
expat_include_dir="$1/include"
expat_ldflags="-L$1/lib64"
expat_libs="-lexpat"
expat_libtool="$1/lib64/libexpat.la"
elif test -r "$1/include/expat.h" -a \
-r "$1/lib/libexpat.a"; then
dnl Expat 1.95.* installation (without libtool)
dnl FreeBSD textproc/expat2
expat_include_dir="$1/include"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
elif test -r "$1/xmlparse.h"; then
dnl maybe an expat-lite. use this dir for both includes and libs
expat_include_dir="$1"
expat_ldflags="-L$1"
expat_libs="-lexpat"
expat_libtool="$1/libexpat.la"
expat_old=yes
elif test -r "$1/include/xmlparse.h" -a \
-r "$1/lib/libexpat.a"; then
dnl previously installed expat
expat_include_dir="$1/include"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
expat_old=yes
elif test -r "$1/include/xml/xmlparse.h" -a \
-r "$1/lib/xml/libexpat.a"; then
dnl previously installed expat
expat_include_dir="$1/include/xml"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
expat_old=yes
elif test -r "$1/include/xmltok/xmlparse.h"; then
dnl Debian distribution
expat_include_dir="$1/include/xmltok"
expat_ldflags="-L$1/lib"
expat_libs="-lxmlparse -lxmltok"
expat_old=yes
elif test -r "$1/include/xml/xmlparse.h" -a \
-r "$1/lib/libexpat.a"; then
dnl FreeBSD textproc/expat package
expat_include_dir="$1/include/xml"
expat_ldflags="-L$1/lib"
expat_libs="-lexpat"
expat_old=yes
elif test -r "$1/xmlparse/xmlparse.h"; then
dnl Expat 1.0 or 1.1 source directory
expat_include_dir="$1/xmlparse"
expat_ldflags="-L$1"
expat_libs="-lexpat"
expat_old=yes
fi
dnl ### test for installed Expat 1.95.* distros
if test -n "$expat_include_dir"; then
dnl ### more info about what we found there? version? using .la?
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
])
dnl
dnl APU_FIND_EXPAT: figure out where EXPAT is located (or use bundled)
dnl
AC_DEFUN([APU_FIND_EXPAT], [
AC_ARG_WITH([expat],
[ --with-expat=DIR specify Expat location or 'builtin'], [
if test "$withval" = "yes"; then
AC_MSG_ERROR([a directory must be specified for --with-expat])
elif test "$withval" = "no"; then
AC_MSG_ERROR([Expat cannot be disabled (at this time)])
elif test "$withval" = "builtin"; then
abs_expatdir="`cd $srcdir/xml/expat && pwd`"
if test -d $abs_expatdir/. -a ! -d xml/expat/.; then
$mkdir_p xml/expat
fi
APU_TEST_EXPAT($abs_expatdir, xml/expat)
else
abs_expatdir="`cd $withval && pwd`"
APU_TEST_EXPAT($abs_expatdir, $withval)
if test -z "$expat_include_dir"; then
AC_MSG_ERROR([Expat was not found (or recognized) in \"$withval\"])
fi
fi
])
if test -z "$expat_include_dir"; then
for d in /usr /usr/local xml/expat-cvs xml/expat $srcdir/xml/expat ; do
APU_TEST_EXPAT($d)
if test -n "$expat_include_dir"; then
dnl For /usr installs of expat, we can't specify -L/usr/lib
if test "$d" = "/usr"; then
expat_ldflags=""
fi
break
fi
done
fi
if test -z "$expat_include_dir"; then
AC_MSG_ERROR([could not locate Expat. use --with-expat])
fi
dnl If this expat doesn't use libtool natively, we'll mimic it for our
dnl dependency library generation.
if test -z "$expat_libtool"; then
expat_libtool="$expat_ldflags $expat_libs"
fi
if test -n "$expat_old"; then
AC_DEFINE(APR_HAVE_OLD_EXPAT, 1, [define if Expat 1.0 or 1.1 was found])
fi
dnl special-case the bundled distribution (use absolute dirs)
if test "$expat_include_dir" = "xml/expat/lib" -o "$expat_include_dir" = "xml/expat-cvs/lib"; then
bundled_subdir="`echo $expat_include_dir | sed -e 's%/lib%%'`"
APR_SUBDIR_CONFIG($bundled_subdir, [--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir])
expat_include_dir=$top_builddir/$bundled_subdir/lib
expat_ldflags="-L$top_builddir/$bundled_subdir/lib"
expat_libs="-lexpat"
expat_libtool=$top_builddir/$bundled_subdir/lib/libexpat.la
APR_XML_SUBDIRS="`echo $bundled_subdir | sed -e 's%xml/%%'`"
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libtool])
else
if test "$expat_include_dir" = "$abs_srcdir/xml/expat/include" -o "$expat_include_dir" = "$abs_srcdir/xml/expat/lib"; then
dnl This is a bit of a hack. This only works because we know that
dnl we are working with the bundled version of the software.
bundled_subdir="xml/expat"
APR_SUBDIR_CONFIG($bundled_subdir, [--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir])
expat_include_dir=$top_builddir/$bundled_subdir/lib
expat_ldflags="-L$top_builddir/$bundled_subdir/lib"
expat_libs="-lexpat"
expat_libtool=$top_builddir/$bundled_subdir/lib/libexpat.la
APR_XML_SUBDIRS="`echo $bundled_subdir | sed -e 's%xml/%%'`"
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libtool])
else
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libs])
fi
fi
APR_XML_DIR=$bundled_subdir
APR_XML_EXPAT_OLD=$expat_old
AC_SUBST(APR_XML_SUBDIRS)
AC_SUBST(APR_XML_DIR)
AC_SUBST(APR_XML_EXPAT_OLD)
if test "$expat_include_dir" != "/usr/include"; then
APR_ADDTO(APRUTIL_INCLUDES, [-I$expat_include_dir])
fi
APR_ADDTO(APRUTIL_LDFLAGS, [$expat_ldflags])
APR_ADDTO(APRUTIL_LIBS, [$expat_libtool])
])
dnl
dnl Find a particular LDAP library
dnl
AC_DEFUN([APU_FIND_LDAPLIB], [
if test ${apu_has_ldap} != "1"; then
ldaplib=$1
extralib=$2
unset ac_cv_lib_${ldaplib}_ldap_init
unset ac_cv_lib_${ldaplib}___ldap_init
AC_CHECK_LIB(${ldaplib}, ldap_init,
[
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l${ldaplib} ${extralib}])
APR_ADDTO(APRUTIL_LIBS,[-l${ldaplib} ${extralib}])
AC_CHECK_LIB(${ldaplib}, ldapssl_client_init, apu_has_ldapssl_client_init="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldapssl_client_deinit, apu_has_ldapssl_client_deinit="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldapssl_add_trusted_cert, apu_has_ldapssl_add_trusted_cert="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldap_start_tls_s, apu_has_ldap_start_tls_s="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldap_sslinit, apu_has_ldap_sslinit="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldapssl_init, apu_has_ldapssl_init="1", , ${extralib})
AC_CHECK_LIB(${ldaplib}, ldapssl_install_routines, apu_has_ldapssl_install_routines="1", , ${extralib})
apu_has_ldap="1";
], , ${extralib})
fi
])
dnl
dnl APU_FIND_LDAP: figure out where LDAP is located
dnl
AC_DEFUN([APU_FIND_LDAP], [
echo $ac_n "${nl}checking for ldap support..."
apu_has_ldap="0";
apu_has_ldapssl_client_init="0"
apu_has_ldapssl_client_deinit="0"
apu_has_ldapssl_add_trusted_cert="0"
apu_has_ldap_start_tls_s="0"
apu_has_ldapssl_init="0"
apu_has_ldap_sslinit="0"
apu_has_ldapssl_install_routines="0"
apu_has_ldap_openldap="0"
apu_has_ldap_solaris="0"
apu_has_ldap_novell="0"
apu_has_ldap_microsoft="0"
apu_has_ldap_netscape="0"
apu_has_ldap_mozilla="0"
apu_has_ldap_other="0"
AC_ARG_WITH(ldap-include,[ --with-ldap-include=path path to ldap include files with trailing slash])
AC_ARG_WITH(ldap-lib,[ --with-ldap-lib=path path to ldap lib file])
AC_ARG_WITH(ldap,[ --with-ldap=library ldap library to use],
[
save_cppflags="$CPPFLAGS"
save_ldflags="$LDFLAGS"
save_libs="$LIBS"
if test -n "$with_ldap_include"; then
CPPFLAGS="$CPPFLAGS -I$with_ldap_include"
APR_ADDTO(APRUTIL_INCLUDES, [-I$with_ldap_include])
fi
if test -n "$with_ldap_lib"; then
LDFLAGS="$LDFLAGS -L$with_ldap_lib"
APR_ADDTO(APRUTIL_LDFLAGS, [-L$with_ldap_lib])
fi
LIBLDAP="$withval"
if test "$LIBLDAP" = "yes"; then
dnl The iPlanet C SDK 5.0 is as yet untested...
APU_FIND_LDAPLIB("ldap50", "-lnspr4 -lplc4 -lplds4 -liutil50 -llber50 -lldif50 -lnss3 -lprldap50 -lssl3 -lssldap50")
APU_FIND_LDAPLIB("ldapssl41", "-lnspr3 -lplc3 -lplds3")
APU_FIND_LDAPLIB("ldapssl40")
APU_FIND_LDAPLIB("ldapssl30")
APU_FIND_LDAPLIB("ldapssl20")
APU_FIND_LDAPLIB("ldapsdk", "-lldapx -lldapssl -lldapgss -lgssapi_krb5")
APU_FIND_LDAPLIB("ldapsdk", "-lldapx -lldapssl -lldapgss -lgss -lresolv -lsocket")
APU_FIND_LDAPLIB("ldap", "-llber")
APU_FIND_LDAPLIB("ldap", "-llber -lresolv")
APU_FIND_LDAPLIB("ldap", "-llber -lresolv -lsocket -lnsl")
APU_FIND_LDAPLIB("ldap", "-ldl -lpthread")
else
APU_FIND_LDAPLIB($LIBLDAP)
APU_FIND_LDAPLIB($LIBLDAP, "-lresolv")
APU_FIND_LDAPLIB($LIBLDAP, "-lresolv -lsocket -lnsl")
APU_FIND_LDAPLIB($LIBLDAP, "-ldl -lpthread")
fi
test ${apu_has_ldap} != "1" && AC_MSG_ERROR(could not find an LDAP library)
AC_CHECK_LIB(lber, ber_init)
AC_CHECK_HEADERS(lber.h, lber_h=["#include <lber.h>"])
# Solaris has a problem in <ldap.h> which prevents it from
# being included by itself. Check for <ldap.h> manually,
# including lber.h first.
AC_CACHE_CHECK([for ldap.h], [apr_cv_hdr_ldap_h],
[AC_TRY_CPP(
[#ifdef HAVE_LBER_H
#include <lber.h>
#endif
#include <ldap.h>
], [apr_cv_hdr_ldap_h=yes], [apr_cv_hdr_ldap_h=no])])
if test "$apr_cv_hdr_ldap_h" = "yes"; then
ldap_h=["#include <ldap.h>"]
AC_DEFINE([HAVE_LDAP_H], 1, [Defined if ldap.h is present])
fi
AC_CHECK_HEADERS(ldap_ssl.h, ldap_ssl_h=["#include <ldap_ssl.h>"])
if test "$apr_cv_hdr_ldap_h" = "yes"; then
AC_CACHE_CHECK([for LDAP toolkit],
[apr_cv_ldap_toolkit], [
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([OpenLDAP], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_openldap="1"
apr_cv_ldap_toolkit="OpenLDAP"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([Sun Microsystems Inc.], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_solaris="1"
apr_cv_ldap_toolkit="Solaris"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([Novell], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_novell="1"
apr_cv_ldap_toolkit="Novell"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([Microsoft Corporation.], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_microsoft="1"
apr_cv_ldap_toolkit="Microsoft"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([Netscape Communications Corp.], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_netscape="1"
apr_cv_ldap_toolkit="Netscape"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
AC_EGREP_CPP([mozilla.org], [$lber_h
$ldap_h
LDAP_VENDOR_NAME], [apu_has_ldap_mozilla="1"
apr_cv_ldap_toolkit="Mozilla"])
fi
if test "x$apr_cv_ldap_toolkit" = "x"; then
apu_has_ldap_other="1"
apr_cv_ldap_toolkit="unknown"
fi
])
fi
CPPFLAGS=$save_cppflags
LDFLAGS=$save_ldflags
LIBS=$save_libs
])
AC_SUBST(ldap_h)
AC_SUBST(lber_h)
AC_SUBST(ldap_ssl_h)
AC_SUBST(apu_has_ldapssl_client_init)
AC_SUBST(apu_has_ldapssl_client_deinit)
AC_SUBST(apu_has_ldapssl_add_trusted_cert)
AC_SUBST(apu_has_ldap_start_tls_s)
AC_SUBST(apu_has_ldapssl_init)
AC_SUBST(apu_has_ldap_sslinit)
AC_SUBST(apu_has_ldapssl_install_routines)
AC_SUBST(apu_has_ldap)
AC_SUBST(apu_has_ldap_openldap)
AC_SUBST(apu_has_ldap_solaris)
AC_SUBST(apu_has_ldap_novell)
AC_SUBST(apu_has_ldap_microsoft)
AC_SUBST(apu_has_ldap_netscape)
AC_SUBST(apu_has_ldap_mozilla)
AC_SUBST(apu_has_ldap_other)
])
dnl
dnl APU_CHECK_CRYPT_R_STYLE
dnl
dnl Decide which of a couple of flavors of crypt_r() is necessary for
dnl this platform.
dnl
AC_DEFUN([APU_CHECK_CRYPT_R_STYLE], [
AC_CACHE_CHECK([style of crypt_r], apr_cv_crypt_r_style,
[AC_TRY_COMPILE([#include <crypt.h>],
[CRYPTD buffer;
crypt_r("passwd", "hash", &buffer);],
[apr_cv_crypt_r_style=cryptd],
[AC_TRY_COMPILE([#include <crypt.h>],
[struct crypt_data buffer;
crypt_r("passwd", "hash", &buffer);],
[apr_cv_crypt_r_style=struct_crypt_data],
[apr_cv_crypt_r_style=none])])])
if test "$apr_cv_crypt_r_style" = "cryptd"; then
AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD])
elif test "$apr_cv_crypt_r_style" = "struct_crypt_data"; then
AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data])
fi
])

View File

@ -1,61 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2003-2005 The Apache Software Foundation or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl -----------------------------------------------------------------
dnl apu-hints.m4: apr-util's autoconf macros for platform-specific hints
dnl
dnl We preload various configure settings depending
dnl on previously obtained platform knowledge.
dnl We allow all settings to be overridden from
dnl the command-line.
dnl
dnl APU_PRELOAD
dnl
dnl Preload various build parameters based on outside knowledge.
dnl
AC_DEFUN([APU_PRELOAD], [
if test "x$apu_preload_done" != "xyes" ; then
apu_preload_done="yes"
echo "Applying apr-util hints file rules for $host"
case "$host" in
*-dec-osf*)
APR_SETIFNULL(apu_crypt_threadsafe, [1])
;;
*-hp-hpux11.*)
APR_SETIFNULL(apu_crypt_threadsafe, [1])
;;
*-ibm-aix4*|*-ibm-aix5.1*)
APR_SETIFNULL(apu_iconv_inbuf_const, [1])
;;
*-ibm-os390)
APR_SETIFNULL(apu_crypt_threadsafe, [1])
;;
*-solaris2*)
APR_SETIFNULL(apu_iconv_inbuf_const, [1])
APR_SETIFNULL(apu_crypt_threadsafe, [1])
;;
*-sco3.2v5*)
APR_SETIFNULL(apu_db_xtra_libs, [-lsocket])
;;
esac
fi
])

View File

@ -1,123 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2002-2005 The Apache Software Foundation, or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl APU_TRY_ICONV[ IF-SUCCESS, IF-FAILURE ]: try to compile for iconv.
dnl
AC_DEFUN([APU_TRY_ICONV], [
AC_TRY_LINK([
#include <stdlib.h>
#include <iconv.h>
],
[
iconv_t cd = iconv_open("", "");
iconv(cd, NULL, NULL, NULL, NULL);
], [$1], [$2])
])
dnl
dnl APU_FIND_ICONV: find an iconv library
dnl
AC_DEFUN([APU_FIND_ICONV], [
apu_iconv_dir="unknown"
have_apr_iconv="0"
AC_ARG_WITH(iconv,[ --with-iconv[=DIR] path to iconv installation],
[ apu_iconv_dir="$withval"
if test "$apu_iconv_dir" != "yes"; then
APR_ADDTO(CPPFLAGS,[-I$apu_iconv_dir/include])
APR_ADDTO(LDFLAGS,[-L$apu_iconv_dir/lib])
fi
if test -f "$apu_iconv_dir/include/api_version.h"; then
have_apr_iconv="1"
have_iconv="0"
APR_REMOVEFROM(LIBS,[-lapriconv])
AC_MSG_RESULT("Using apr-iconv")
fi
])
if test "$have_apr_iconv" != "1"; then
AC_CHECK_HEADER(iconv.h, [
APU_TRY_ICONV([ have_iconv="1" ], [
APR_ADDTO(LIBS,[-liconv])
APU_TRY_ICONV([
APR_ADDTO(APRUTIL_LIBS,[-liconv])
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-liconv])
have_iconv="1" ],
[ have_iconv="0" ])
APR_REMOVEFROM(LIBS,[-liconv])
])
], [ have_iconv="0" ])
fi
if test "$apu_iconv_dir" != "unknown"; then
if test "$have_iconv" != "1"; then
if test "$have_apr_iconv" != "1"; then
AC_MSG_ERROR([iconv support requested, but not found])
fi
fi
APR_REMOVEFROM(CPPFLAGS,[-I$apu_iconv_dir/include])
APR_REMOVEFROM(LDFLAGS,[-L$apu_iconv_dir/lib])
APR_ADDTO(APRUTIL_INCLUDES,[-I$apu_iconv_dir/include])
APR_ADDTO(APRUTIL_LDFLAGS,[-L$apu_iconv_dir/lib])
fi
if test "$have_iconv" = "1"; then
APU_CHECK_ICONV_INBUF
fi
APR_FLAG_HEADERS(iconv.h langinfo.h)
APR_FLAG_FUNCS(nl_langinfo)
APR_CHECK_DEFINE(CODESET, langinfo.h, [CODESET defined in langinfo.h])
AC_SUBST(have_iconv)
AC_SUBST(have_apr_iconv)
])dnl
dnl
dnl APU_CHECK_ICONV_INBUF
dnl
dnl Decide whether or not the inbuf parameter to iconv() is const.
dnl
dnl We try to compile something without const. If it fails to
dnl compile, we assume that the system's iconv() has const.
dnl Unfortunately, we won't realize when there was a compile
dnl warning, so we allow a variable -- apu_iconv_inbuf_const -- to
dnl be set in hints.m4 to specify whether or not iconv() has const
dnl on this parameter.
dnl
AC_DEFUN([APU_CHECK_ICONV_INBUF], [
AC_MSG_CHECKING(for type of inbuf parameter to iconv)
if test "x$apu_iconv_inbuf_const" = "x"; then
APR_TRY_COMPILE_NO_WARNING([
#include <stddef.h>
#include <iconv.h>
],[
iconv(0,(char **)0,(size_t *)0,(char **)0,(size_t *)0);
], apu_iconv_inbuf_const="0", apu_iconv_inbuf_const="1")
fi
if test "$apu_iconv_inbuf_const" = "1"; then
AC_DEFINE(APU_ICONV_INBUF_CONST, 1, [Define if the inbuf parm to iconv() is const char **])
msg="const char **"
else
msg="char **"
fi
AC_MSG_RESULT([$msg])
])dnl

View File

@ -1,278 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2005 The Apache Software Foundation or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl DBD module
dnl
dnl
dnl APU_CHECK_DBD: compile backends for apr_dbd.
dnl
AC_DEFUN([APU_CHECK_DBD], [
apu_have_pgsql=0
AC_ARG_WITH([pgsql], [
--with-pgsql=DIR specify PostgreSQL location
], [
apu_have_pgsql=0
if test "$withval" = "yes"; then
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
if test "$apu_have_pgsql" = "0"; then
AC_CHECK_HEADERS(postgresql/libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
fi
elif test "$withval" = "no"; then
apu_have_pgsql=0
else
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
pgsql_CPPFLAGS="-I$withval/include"
pgsql_LDFLAGS="-L$withval/lib "
APR_ADDTO(CPPFLAGS, [$pgsql_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$pgsql_LDFLAGS])
AC_MSG_NOTICE(checking for pgsql in $withval)
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
if test "$apu_have_pgsql" != "0"; then
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
fi
if test "$apu_have_pgsql" != "1"; then
AC_CHECK_HEADERS(postgresql/libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
if test "$apu_have_pgsql" != "0"; then
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include/postgresql])
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
fi
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
fi
], [
apu_have_pgsql=0
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
])
AC_SUBST(apu_have_pgsql)
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
dnl we know the library is there.
if test "$apu_have_pgsql" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lpq])
APR_ADDTO(APRUTIL_LIBS,[-lpq])
fi
])
dnl
AC_DEFUN([APU_CHECK_DBD_MYSQL], [
apu_have_mysql=0
AC_CHECK_FILES([dbd/apr_dbd_mysql.c],[
AC_ARG_WITH([mysql], [
--with-mysql=DIR **** SEE INSTALL.MySQL ****
], [
apu_have_mysql=0
if test "$withval" = "yes"; then
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config])
if test "x$MYSQL_CONFIG" != 'x'; then
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
fi
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
if test "$apu_have_mysql" = "0"; then
AC_CHECK_HEADERS(mysql/mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
else
if test "x$MYSQL_CONFIG" != 'x'; then
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
fi
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
elif test "$withval" = "no"; then
apu_have_mysql=0
else
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config],,[$withval/bin])
if test "x$MYSQL_CONFIG" != 'x'; then
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
else
mysql_CPPFLAGS="-I$withval/include"
mysql_LDFLAGS="-L$withval/lib "
fi
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
AC_MSG_NOTICE(checking for mysql in $withval)
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
if test "$apu_have_mysql" != "0"; then
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
fi
if test "$apu_have_mysql" != "1"; then
AC_CHECK_HEADERS(mysql/mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
if test "$apu_have_mysql" != "0"; then
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include/mysql])
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
fi
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
fi
], [
apu_have_mysql=0
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config])
if test "x$MYSQL_CONFIG" != 'x'; then
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
fi
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
if test "$apu_have_mysql" != "0"; then
if test "x$MYSQL_CONFIG" != 'x'; then
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
fi
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
])
])
AC_SUBST(apu_have_mysql)
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
dnl we know the library is there.
if test "$apu_have_mysql" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lmysqlclient_r])
APR_ADDTO(APRUTIL_LIBS,[-lmysqlclient_r])
fi
])
dnl
AC_DEFUN([APU_CHECK_DBD_SQLITE3], [
apu_have_sqlite3=0
AC_ARG_WITH([sqlite3], [
--with-sqlite3=DIR
], [
apu_have_sqlite3=0
if test "$withval" = "yes"; then
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
elif test "$withval" = "no"; then
apu_have_sqlite3=0
else
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
sqlite3_CPPFLAGS="-I$withval/include"
sqlite3_LDFLAGS="-L$withval/lib "
APR_ADDTO(CPPFLAGS, [$sqlite3_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$sqlite3_LDFLAGS])
AC_MSG_NOTICE(checking for sqlite3 in $withval)
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
if test "$apu_have_sqlite3" != "0"; then
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
fi
], [
apu_have_sqlite3=0
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
])
AC_SUBST(apu_have_sqlite3)
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
dnl we know the library is there.
if test "$apu_have_sqlite3" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite3])
APR_ADDTO(APRUTIL_LIBS,[-lsqlite3])
fi
])
dnl
AC_DEFUN([APU_CHECK_DBD_SQLITE2], [
apu_have_sqlite2=0
AC_ARG_WITH([sqlite2], [
--with-sqlite2=DIR
], [
apu_have_sqlite2=0
if test "$withval" = "yes"; then
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
elif test "$withval" = "no"; then
apu_have_sqlite2=0
else
old_cppflags="$CPPFLAGS"
old_ldflags="$LDFLAGS"
sqlite2_CPPFLAGS="-I$withval/include"
sqlite2_LDFLAGS="-L$withval/lib "
APR_ADDTO(CPPFLAGS, [$sqlite2_CPPFLAGS])
APR_ADDTO(LDFLAGS, [$sqlite2_LDFLAGS])
AC_MSG_NOTICE(checking for sqlite2 in $withval)
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
if test "$apu_have_sqlite2" != "0"; then
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
fi
CPPFLAGS="$old_cppflags"
LDFLAGS="$old_ldflags"
fi
], [
apu_have_sqlite2=0
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
])
AC_SUBST(apu_have_sqlite2)
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
dnl we know the library is there.
if test "$apu_have_sqlite2" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite])
APR_ADDTO(APRUTIL_LIBS,[-lsqlite])
fi
])
dnl

View File

@ -1,870 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2002-2005 The Apache Software Foundation or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl DBM module
dnl
dnl APU_LIB_BERKELEY_DB(major, minor, patch, places, headers, libnames)
dnl
dnl Search for a useable version of Berkeley DB in a number of
dnl common places. The installed DB must be no older than the
dnl version given by MAJOR, MINOR, and PATCH. All of these
dnl arguments are allowed to be '-1', indicating we don't care.
dnl PLACES is a list of places to search for a Berkeley DB
dnl installation. HEADERS is a list of headers to try. LIBNAMES
dnl is a list of names of the library to attempt to link against,
dnl typically 'db' and 'db4'.
dnl
dnl If we find a useable version, set CPPFLAGS and LIBS as
dnl appropriate, and set the shell variable `apu_have_db' to
dnl `1', and apu_db_lib to the matching lib name, and apu_db_header
dnl to the header to use. Otherwise, set `apu_have_db' to `0'.
dnl
dnl This macro also checks for the `--with-berkeley-db=PATH' flag;
dnl if given, the macro will use the PATH specified, and the
dnl configuration script will die if it can't find the library. If
dnl the user gives the `--without-berkeley-db' flag, the entire
dnl search is skipped.
dnl
dnl We cache the results of individual searches under particular
dnl prefixes, not the overall result of whether we found Berkeley
dnl DB. That way, the user can re-run the configure script with
dnl different --with-berkeley-db switch values, without interference
dnl from the cache.
AC_DEFUN([APU_CHECK_BERKELEY_DB], [
bdb_version=$1
if test "$2" != "-1"; then
bdb_version="$bdb_version.$2"
if test "$3" != "-1"; then
bdb_version="$bdb_version.$3"
fi
fi
bdb_places=$4
bdb_default_search_headers=$5
bdb_default_search_lib_names=$6
apu_have_db=0
# Save the original values of the flags we tweak.
apu_check_lib_save_libs="$LIBS"
apu_check_lib_save_ldflags="$LDFLAGS"
apu_check_lib_save_cppflags="$CPPFLAGS"
# The variable `found' is the prefix under which we've found
# Berkeley DB, or `not' if we haven't found it anywhere yet.
found=not
for bdb_place in $bdb_places; do
LDFLAGS="$apu_check_lib_save_ldflags"
CPPFLAGS="$apu_check_lib_save_cppflags"
case "$bdb_place" in
"std" )
description="the standard places"
;;
*":"* )
header="`echo $bdb_place | sed -e 's/:.*$//'`"
lib="`echo $bdb_place | sed -e 's/^.*://'`"
CPPFLAGS="$CPPFLAGS -I$header"
LDFLAGS="$LDFLAGS -L$lib"
description="$header and $lib"
;;
* )
if test -d $bdb_place; then
LDFLAGS="$LDFLAGS -L$bdb_place/lib"
CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
else
AC_MSG_CHECKING([for Berkeley DB $bdb_version in $bdb_place])
AC_MSG_RESULT([directory not found])
continue
fi
description="$bdb_place"
;;
esac
# Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
# trick to display a message instead.
AC_MSG_CHECKING([for Berkeley DB $bdb_version in $description])
AC_MSG_RESULT()
for bdb_libname in $bdb_default_search_lib_names; do
for bdb_header in $bdb_default_search_headers; do
# Clear the header cache variable for each location
changequote(,)
cache_id="`echo ac_cv_header_${bdb_header} \
| sed -e 's/[^a-zA-Z0-9_]/_/g'`"
changequote([,])
unset $cache_id
AC_CHECK_HEADER([$bdb_header], [
if test "$1" = "3" -o "$1" = "4"; then
# We generate a separate cache variable for each prefix and libname
# we search under. That way, we avoid caching information that
# changes if the user runs `configure' with a different set of
# switches.
changequote(,)
cache_id="`echo apu_cv_check_berkeley_db_$1_$2_$3_${bdb_header}_${bdb_libname}_in_${bdb_place} \
| sed -e 's/[^a-zA-Z0-9_]/_/g'`"
changequote([,])
AC_MSG_CHECKING([for -l$bdb_libname])
dnl We can't use AC_CACHE_CHECK here, because that won't print out
dnl the value of the computed cache variable properly.
AC_CACHE_VAL($cache_id,
[
APU_TRY_BERKELEY_DB($1, $2, $3, $bdb_header, $bdb_libname)
eval "$cache_id=$apu_try_berkeley_db"
])
result="`eval echo '$'$cache_id`"
AC_MSG_RESULT($result)
elif test "$1" = "1"; then
AC_CHECK_LIB($bdb_libname,
dbopen,
[result=yes],
[result=no]
)
elif test "$1" = "2"; then
AC_CHECK_LIB($bdb_libname,
db_open,
[result=yes],
[result=no]
)
fi
], [result="no"])
# If we found it, no need to search any more.
if test "$result" = "yes"; then
found="$bdb_place"
break
fi
done
test "$found" != "not" && break
done
test "$found" != "not" && break
done
# Restore the original values of the flags we tweak.
LDFLAGS="$apu_check_lib_save_ldflags"
CPPFLAGS="$apu_check_lib_save_cppflags"
case "$found" in
"not")
apu_have_db=0
;;
"std")
apu_db_header=$bdb_header
apu_db_lib=$bdb_libname
apu_have_db=1
;;
*":"*)
header="`echo $found | sed -e 's/:.*$//'`"
lib="`echo $found | sed -e 's/^.*://'`"
APR_ADDTO(APRUTIL_INCLUDES, [-I$header])
APR_ADDTO(APRUTIL_LDFLAGS, [-L$lib])
apu_db_header=$bdb_header
apu_db_lib=$bdb_libname
apu_have_db=1
;;
*)
APR_ADDTO(APRUTIL_INCLUDES, [-I$found/include])
APR_ADDTO(APRUTIL_LDFLAGS, [-L$found/lib])
apu_db_header=$bdb_header
apu_db_lib=$bdb_libname
apu_have_db=1
;;
esac
])
dnl APU_TRY_BERKELEY_DB(major, minor, patch, header, libname)
dnl
dnl A subroutine of APU_CHECK_BERKELEY_DB.
dnl
dnl Check that a new-enough version of Berkeley DB is installed.
dnl "New enough" means no older than the version given by MAJOR,
dnl MINOR, and PATCH. The result of the test is not cached; no
dnl messages are printed. Use HEADER as the header file to include.
dnl Use LIBNAME as the library to link against.
dnl (e.g. LIBNAME should usually be "db" or "db4".)
dnl
dnl Set the shell variable `apu_try_berkeley_db' to `yes' if we found
dnl an appropriate version installed, or `no' otherwise.
dnl
dnl This macro uses the Berkeley DB library function `db_version' to
dnl find the version. If the library installed doesn't have this
dnl function, then this macro assumes it is too old.
dnl NOTE: This is pretty messed up. It seems that the FreeBSD port of
dnl Berkeley DB 4 puts the header file in /usr/local/include/db4, but the
dnl database library in /usr/local/lib, as libdb4.[a|so]. There is no
dnl /usr/local/include/db.h. So if you check for /usr/local first, you'll
dnl get the old header file from /usr/include, and the new library from
dnl /usr/local/lib. Disaster. Thus this test compares the version constants
dnl in the db.h header with the ones returned by db_version().
AC_DEFUN([APU_TRY_BERKELEY_DB],
[
apu_try_berkeley_db_save_libs="$LIBS"
apu_check_berkeley_db_major=$1
apu_check_berkeley_db_minor=$2
apu_check_berkeley_db_patch=$3
apu_try_berkeley_db_header=$4
apu_try_berkeley_db_libname=$5
LIBS="$LIBS -l$apu_try_berkeley_db_libname"
AC_TRY_RUN(
[
#include <stdio.h>
#include <$apu_try_berkeley_db_header>
main ()
{
int major, minor, patch;
db_version(&major, &minor, &patch);
/* Sanity check: ensure that db.h constants actually match the db library */
if (major != DB_VERSION_MAJOR
|| minor != DB_VERSION_MINOR
|| patch != DB_VERSION_PATCH)
exit (1);
/* Run-time check: ensure the library claims to be the correct version. */
if ($apu_check_berkeley_db_major != -1) {
if (major < $apu_check_berkeley_db_major)
exit (1);
if (major > $apu_check_berkeley_db_major)
exit (0);
}
if ($apu_check_berkeley_db_minor != -1) {
if (minor < $apu_check_berkeley_db_minor)
exit (1);
if (minor > $apu_check_berkeley_db_minor)
exit (0);
}
if ($apu_check_berkeley_db_patch == -1
|| patch >= $apu_check_berkeley_db_patch)
exit (0);
else
exit (1);
}
],
[apu_try_berkeley_db=yes],
[apu_try_berkeley_db=no],
[apu_try_berkeley_db=yes]
)
LIBS="$apu_try_berkeley_db_save_libs"
]
)
dnl
dnl APU_CHECK_DB1: is DB1 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB1], [
places=$1
if test -z "$places"; then
places="std"
fi
APU_CHECK_BERKELEY_DB(1, 0, 0,
"$places",
"db1/db.h db.h",
"db1"
)
if test "$apu_have_db" = "1"; then
apu_db_version=1
fi
])
dnl
dnl APU_CHECK_DB185: is DB1.85 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
dnl NB: BerkelyDB v2 and above can be compiled in 1.85 mode
dnl which has a libdb not libdb1 or libdb185
AC_DEFUN([APU_CHECK_DB185], [
places=$1
if test -z "$places"; then
places="std"
fi
APU_CHECK_BERKELEY_DB(1, -1, -1,
"$places",
"db_185.h",
"db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=185
fi
])
dnl
dnl APU_CHECK_DB2: is DB2 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB2], [
places=$1
if test -z "$places"; then
places="std"
fi
APU_CHECK_BERKELEY_DB(2, -1, -1,
"$places",
"db2/db.h db.h",
"db2 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=2
fi
])
dnl
dnl APU_CHECK_DB3: is DB3 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB3], [
places=$1
if test -z "$places"; then
places="std"
fi
APU_CHECK_BERKELEY_DB(3, -1, -1,
"$places",
"db3/db.h db.h",
"db3 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=3
fi
])
dnl
dnl APU_CHECK_DB4: is DB4 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB4], [
places=$1
if test -z "$places"; then
places="std /usr/local /usr/local/BerkeleyDB.4.0 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "0", "-1",
"$places",
"db4/db.h db.h",
"db-4.0 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
dnl
dnl APU_CHECK_DB41: is DB4.1 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB41], [
places=$1
if test -z "$places"; then
places="std /usr/local /usr/local/BerkeleyDB.4.1 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "1", "-1",
"$places",
"db41/db.h db4/db.h db.h",
"db-4.1 db41 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
dnl
dnl APU_CHECK_DB42: is DB4.2 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB42], [
places=$1
if test -z "$places"; then
places="std /usr/local /usr/local/BerkeleyDB.4.2 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "2", "-1",
"$places",
"db42/db.h db4/db.h db.h",
"db-4.2 db42 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
dnl
dnl APU_CHECK_DB43: is DB4.3 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB43], [
places=$1
if test -z "$places"; then
places="std /usr/local/BerkeleyDB.4.3 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "3", "-1",
"$places",
"db43/db.h db4/db.h db.h",
"db-4.3 db4-4.3 db43 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
dnl
dnl APU_CHECK_DB44: is DB4.4 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB44], [
places=$1
if test -z "$places"; then
places="std /usr/local/BerkeleyDB.4.4 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "4", "-1",
"$places",
"db44/db.h db4/db.h db.h",
"db-4.4 db4-4.4 db44 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
dnl
dnl APU_CHECK_DB45: is DB4.5 present?
dnl
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
dnl
AC_DEFUN([APU_CHECK_DB45], [
places=$1
if test -z "$places"; then
places="std /usr/local/BerkeleyDB.4.5 /boot/home/config"
fi
APU_CHECK_BERKELEY_DB("4", "5", "-1",
"$places",
"db45/db.h db4/db.h db.h",
"db-4.5 db4-4.5 db45 db4 db"
)
if test "$apu_have_db" = "1"; then
apu_db_version=4
fi
])
AC_DEFUN([APU_CHECK_DB], [
requested=$1
check_places=$2
case "$requested" in
db)
APU_CHECK_DB_ALL("$check_places")
if test "$apu_have_db" = "0"; then
AC_MSG_ERROR(Berkeley db requested, but not found)
fi
;;
db1)
APU_CHECK_DB1("$check_places")
if test "$apu_db_version" != "1"; then
AC_MSG_ERROR(Berkeley db1 not found)
fi
;;
db185)
APU_CHECK_DB185("$check_places")
if test "$apu_db_version" != "185"; then
AC_MSG_ERROR(Berkeley db185 not found)
fi
;;
db2)
APU_CHECK_DB2("$check_places")
if test "$apu_db_version" != "2"; then
AC_MSG_ERROR(Berkeley db2 not found)
fi
;;
db3)
APU_CHECK_DB3("$check_places")
if test "$apu_db_version" != "3"; then
AC_MSG_ERROR(Berkeley db3 not found)
fi
;;
db4)
APU_CHECK_DB4("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
db41)
APU_CHECK_DB41("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
db42)
APU_CHECK_DB42("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
db43)
APU_CHECK_DB43("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
db44)
APU_CHECK_DB44("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
db45)
APU_CHECK_DB44("$check_places")
if test "$apu_db_version" != "4"; then
AC_MSG_ERROR(Berkeley db4 not found)
fi
;;
default)
APU_CHECK_DB_ALL("$check_places")
;;
esac
])
dnl
dnl APU_CHECK_DB_ALL: Try all Berkeley DB versions, from 4.3 to 1.
dnl
AC_DEFUN([APU_CHECK_DB_ALL], [
all_places=$1
APU_CHECK_DB45("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB44("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB43("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB42("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB41("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB4("$all_places")
if test "$apu_db_version" != "4"; then
APU_CHECK_DB3("$all_places")
if test "$apu_db_version" != "3"; then
APU_CHECK_DB2("$all_places")
if test "$apu_db_version" != "2"; then
APU_CHECK_DB1("$all_places")
if test "$apu_db_version" != "1"; then
APU_CHECK_DB185("$all_places")
fi
fi
fi
fi
fi
fi
fi
fi
fi
AC_MSG_CHECKING(for Berkeley DB)
if test "$apu_have_db" = "1"; then
AC_MSG_RESULT(found db$apu_db_version)
else
AC_MSG_RESULT(not found)
fi
])
dnl
dnl APU_CHECK_DBM: see what kind of DBM backend to use for apr_dbm.
dnl
AC_DEFUN([APU_CHECK_DBM], [
apu_use_sdbm=0
apu_use_ndbm=0
apu_use_gdbm=0
apu_use_db=0
dnl it's in our codebase
apu_have_sdbm=1
apu_have_gdbm=0
apu_have_ndbm=0
apu_have_db=0
apu_db_header=db.h # default so apu_select_dbm.h is syntactically correct
apu_db_version=0
AC_ARG_WITH(dbm, [
--with-dbm=DBM choose the DBM type to use.
DBM={sdbm,gdbm,ndbm,db,db1,db185,db2,db3,db4,db41,db42,db43,db44,db45}
], [
if test "$withval" = "yes"; then
AC_MSG_ERROR([--with-dbm needs to specify a DBM type to use.
One of: sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4, db41, db42, db43, db44, db45])
fi
requested="$withval"
], [
requested=default
])
dnl We don't pull in GDBM unless the user asks for it, since it's GPL
AC_ARG_WITH([gdbm], [
--with-gdbm=DIR specify GDBM location
], [
apu_have_gdbm=0
if test "$withval" = "yes"; then
AC_CHECK_HEADER(gdbm.h, AC_CHECK_LIB(gdbm, gdbm_open, [apu_have_gdbm=1]))
elif test "$withval" = "no"; then
apu_have_gdbm=0
else
CPPFLAGS="-I$withval/include"
LIBS="-L$withval/lib "
AC_MSG_CHECKING(checking for gdbm in $withval)
AC_CHECK_HEADER(gdbm.h, AC_CHECK_LIB(gdbm, gdbm_open, [apu_have_gdbm=1]))
if test "$apu_have_gdbm" != "0"; then
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
fi
fi
])
AC_ARG_WITH([ndbm], [
--with-ndbm=PATH
Find the NDBM header and library in \`PATH/include' and
\`PATH/lib'. If PATH is of the form \`HEADER:LIB', then search
for header files in HEADER, and the library in LIB. If you omit
the \`=PATH' part completely, the configure script will search
for NDBM in a number of standard places.
], [
apu_have_ndbm=0
if test "$withval" = "yes"; then
AC_MSG_CHECKING(checking for ndbm in the usual places)
apu_want_ndbm=1
NDBM_INC=""
NDBM_LDFLAGS=""
elif test "$withval" = "no"; then
apu_want_ndbm=0
else
apu_want_ndbm=1
case "$withval" in
*":"*)
NDBM_INC="-I`echo $withval |sed -e 's/:.*$//'`"
NDBM_LDFLAGS="-L`echo $withval |sed -e 's/^.*://'`"
AC_MSG_CHECKING(checking for ndbm includes with $NDBM_INC libs with $NDBM_LDFLAGS )
;;
*)
NDBM_INC="-I$withval/include"
NDBM_LDFLAGS="-L$withval/lib"
AC_MSG_CHECKING(checking for ndbm includes in $withval)
;;
esac
fi
save_cppflags="$CPPFLAGS"
save_ldflags="$LDFLAGS"
CPPFLAGS="$CPPFLAGS $NDBM_INC"
LDFLAGS="$LDFLAGS $NDBM_LDFLAGS"
dnl db_ndbm_open is what sleepcat's compatibility library actually has in it's lib
if test "$apu_want_ndbm" != "0"; then
AC_CHECK_HEADER(ndbm.h,
AC_CHECK_LIB(c, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=c],
AC_CHECK_LIB(dbm, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=dbm],
AC_CHECK_LIB(db, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=db],
AC_CHECK_LIB(db, __db_ndbm_open, [apu_have_ndbm=1;apu_ndbm_lib=db])
)
)
)
)
if test "$apu_have_ndbm" != "0"; then
if test "$withval" != "yes"; then
APR_ADDTO(APRUTIL_INCLUDES, [$NDBM_INC])
APR_ADDTO(APRUTIL_LDFLAGS, [$NDBM_LDFLAGS])
fi
elif test "$withval" != "yes"; then
AC_ERROR( NDBM not found in the specified directory)
fi
fi
CPPFLAGS="$save_cppflags"
LDFLAGS="$save_ldflags"
], [
dnl don't check it no one has asked us for it
apu_have_ndbm=0
])
if test -n "$apu_db_xtra_libs"; then
saveddbxtralibs="$LIBS"
LIBS="$apu_db_xtra_libs $LIBS"
fi
dnl We're going to try to find the highest version of Berkeley DB supported.
dnl
dnl Note that we only do this if the user requested it, since the Sleepycat
dnl license is viral and requires distribution of source along with programs
dnl that use it.
AC_ARG_WITH([berkeley-db], [
--with-berkeley-db=PATH
Find the Berkeley DB header and library in \`PATH/include' and
\`PATH/lib'. If PATH is of the form \`HEADER:LIB', then search
for header files in HEADER, and the library in LIB. If you omit
the \`=PATH' part completely, the configure script will search
for Berkeley DB in a number of standard places.
], [
if test "$withval" = "yes"; then
apu_want_db=1
user_places=""
elif test "$withval" = "no"; then
apu_want_db=0
else
apu_want_db=1
user_places="$withval"
fi
if test "$apu_want_db" != "0"; then
APU_CHECK_DB($requested, $user_places)
if test "$apu_have_db" = "0"; then
AC_ERROR(Berkeley DB not found.)
fi
fi
])
if test -n "$apu_db_xtra_libs"; then
LIBS="$saveddbxtralibs"
fi
case "$requested" in
sdbm)
apu_use_sdbm=1
apu_default_dbm=sdbm
;;
gdbm)
apu_use_gdbm=1
apu_default_dbm=gdbm
;;
ndbm)
apu_use_ndbm=1
apu_default_dbm=ndbm
;;
db)
apu_use_db=1
apu_default_dbm=db
;;
db1)
apu_use_db=1
apu_default_dbm=db1
;;
db185)
apu_use_db=1
apu_default_dbm=db185
;;
db2)
apu_use_db=1
apu_default_dbm=db2
;;
db3)
apu_use_db=1
apu_default_dbm=db3
;;
db4)
apu_use_db=1
apu_default_dbm=db4
;;
db41)
apu_use_db=1
apu_default_dbm=db4
;;
db42)
apu_use_db=1
apu_default_dbm=db4
;;
db43)
apu_use_db=1
apu_default_dbm=db4
;;
db44)
apu_use_db=1
apu_default_dbm=db4
;;
db45)
apu_use_db=1
apu_default_dbm=db4
;;
default)
dnl ### use more sophisticated DBMs for the default?
apu_default_dbm="sdbm (default)"
apu_use_sdbm=1
;;
*)
AC_MSG_ERROR([--with-dbm=$look_for is an unknown DBM type.
Use one of: sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4, db41, db42, db43, db44 db45])
;;
esac
dnl Yes, it'd be nice if we could collate the output in an order
dnl so that the AC_MSG_CHECKING would be output before the actual
dnl checks, but it isn't happening now.
AC_MSG_CHECKING(for default DBM)
AC_MSG_RESULT($apu_default_dbm)
AC_SUBST(apu_use_sdbm)
AC_SUBST(apu_use_gdbm)
AC_SUBST(apu_use_ndbm)
AC_SUBST(apu_use_db)
AC_SUBST(apu_have_sdbm)
AC_SUBST(apu_have_gdbm)
AC_SUBST(apu_have_ndbm)
AC_SUBST(apu_have_db)
AC_SUBST(apu_db_header)
AC_SUBST(apu_db_version)
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
dnl we know the library is there.
if test "$apu_have_gdbm" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lgdbm])
APR_ADDTO(APRUTIL_LIBS,[-lgdbm])
fi
if test "$apu_have_ndbm" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l$apu_ndbm_lib])
APR_ADDTO(APRUTIL_LIBS,[-l$apu_ndbm_lib])
fi
if test "$apu_have_db" = "1"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l$apu_db_lib])
APR_ADDTO(APRUTIL_LIBS,[-l$apu_db_lib])
if test -n "apu_db_xtra_libs"; then
APR_ADDTO(APRUTIL_EXPORT_LIBS,[$apu_db_xtra_libs])
APR_ADDTO(APRUTIL_LIBS,[$apu_db_xtra_libs])
fi
fi
])

View File

@ -1,176 +0,0 @@
dnl -------------------------------------------------------- -*- autoconf -*-
dnl Copyright 2002-2005 The Apache Software Foundation or its licensors, as
dnl applicable.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
dnl You may obtain a copy of the License at
dnl
dnl http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl
dnl find_apu.m4 : locate the APR-util (APU) include files and libraries
dnl
dnl This macro file can be used by applications to find and use the APU
dnl library. It provides a standardized mechanism for using APU. It supports
dnl embedding APU into the application source, or locating an installed
dnl copy of APU.
dnl
dnl APR_FIND_APU(srcdir, builddir, implicit-install-check, acceptable-majors)
dnl
dnl where srcdir is the location of the bundled APU source directory, or
dnl empty if source is not bundled.
dnl
dnl where builddir is the location where the bundled APU will be built,
dnl or empty if the build will occur in the srcdir.
dnl
dnl where implicit-install-check set to 1 indicates if there is no
dnl --with-apr-util option specified, we will look for installed copies.
dnl
dnl where acceptable-majors is a space separated list of acceptable major
dnl version numbers. Often only a single major version will be acceptable.
dnl If multiple versions are specified, and --with-apr-util=PREFIX or the
dnl implicit installed search are used, then the first (leftmost) version
dnl in the list that is found will be used. Currently defaults to [0 1].
dnl
dnl Sets the following variables on exit:
dnl
dnl apu_found : "yes", "no", "reconfig"
dnl
dnl apu_config : If the apu-config tool exists, this refers to it. If
dnl apu_found is "reconfig", then the bundled directory
dnl should be reconfigured *before* using apu_config.
dnl
dnl Note: this macro file assumes that apr-config has been installed; it
dnl is normally considered a required part of an APR installation.
dnl
dnl Note: At this time, we cannot find *both* a source dir and a build dir.
dnl If both are available, the build directory should be passed to
dnl the --with-apr-util switch.
dnl
dnl Note: the installation layout is presumed to follow the standard
dnl PREFIX/lib and PREFIX/include pattern. If the APU config file
dnl is available (and can be found), then non-standard layouts are
dnl possible, since it will be described in the config file.
dnl
dnl If a bundled source directory is available and needs to be (re)configured,
dnl then apu_found is set to "reconfig". The caller should reconfigure the
dnl (passed-in) source directory, placing the result in the build directory,
dnl as appropriate.
dnl
dnl If apu_found is "yes" or "reconfig", then the caller should use the
dnl value of apu_config to fetch any necessary build/link information.
dnl
AC_DEFUN([APR_FIND_APU], [
apu_found="no"
if test "$target_os" = "os2-emx"; then
# Scripts don't pass test -x on OS/2
TEST_X="test -f"
else
TEST_X="test -x"
fi
ifelse([$4], [],
[
ifdef(AC_WARNING,([$0: missing argument 4 (acceptable-majors): Defaulting to APU 0.x then APU 1.x]))
acceptable_majors="0 1"
], [acceptable_majors="$4"])
apu_temp_acceptable_apu_config=""
for apu_temp_major in $acceptable_majors
do
case $apu_temp_major in
0)
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config"
;;
*)
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config"
;;
esac
done
AC_MSG_CHECKING(for APR-util)
AC_ARG_WITH(apr-util,
[ --with-apr-util=PATH prefix for installed APU, path to APU build tree,
or the full path to apu-config],
[
if test "$withval" = "no" || test "$withval" = "yes"; then
AC_MSG_ERROR([--with-apr-util requires a directory or file to be provided])
fi
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
do
for lookdir in "$withval/bin" "$withval"
do
if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then
apu_found="yes"
apu_config="$lookdir/$apu_temp_apu_config_file"
break 2
fi
done
done
if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
apu_found="yes"
apu_config="$withval"
fi
dnl if --with-apr-util is used, it is a fatal error for its argument
dnl to be invalid
if test "$apu_found" != "yes"; then
AC_MSG_ERROR([the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file.])
fi
],[
if test -n "$3" && test "$3" = "1"; then
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
do
if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then
apu_found="yes"
apu_config="$apu_temp_apu_config_file"
break
else
dnl look in some standard places (apparently not in builtin/default)
for lookdir in /usr /usr/local /usr/local/apr /opt/apr /usr/local/apache2 ; do
if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then
apu_found="yes"
apu_config="$lookdir/bin/$apu_temp_apu_config_file"
break 2
fi
done
fi
done
fi
dnl if we have not found anything yet and have bundled source, use that
if test "$apu_found" = "no" && test -d "$1"; then
apu_temp_abs_srcdir="`cd $1 && pwd`"
apu_found="reconfig"
apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apu_version.h\"`"
case $apu_bundled_major in
"")
AC_MSG_ERROR([failed to find major version of bundled APU])
;;
0)
apu_temp_apu_config_file="apu-config"
;;
*)
apu_temp_apu_config_file="apu-$apu_bundled_major-config"
;;
esac
if test -n "$2"; then
apu_config="$2/$apu_temp_apu_config_file"
else
apu_config="$1/$apu_temp_apu_config_file"
fi
fi
])
AC_MSG_RESULT($apu_found)
])

View File

@ -1,37 +0,0 @@
#!/bin/sh
##
## mkdir.sh -- make directory hierarchy
##
## Based on `mkinstalldirs' from Noah Friedman <friedman@prep.ai.mit.edu>
## as of 1994-03-25, which was placed in the Public Domain.
## Cleaned up for Apache's Autoconf-style Interface (APACI)
## by Ralf S. Engelschall <rse@apache.org>
##
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE
umask 022
errstatus=0
for file in ${1+"$@"} ; do
set fnord `echo ":$file" |\
sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'`
shift
pathcomp=
for d in ${1+"$@"}; do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
?: ) pathcomp="$pathcomp/"
continue ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp" 1>&2
mkdir "$pathcomp" || errstatus=$?
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus

View File

@ -1,20 +0,0 @@
The script in this directory will attempt to build a Solaris package
out of a source tree for APR-util.
To build a package, make sure you are in the root of the source tree,
and run:
build/pkg/buildpkg.sh
A Solaris package called apr-util-<version>-<architecture>-local.gz will be
created in the root of the source tree.
By default, if you attempt to build packages for apr-util, it will
search for the sources for apr in:
../apr
You may override the location of apr like so:
build/pkg/buildpkg.sh --with-apr=some/other/path

View File

@ -1,99 +0,0 @@
#!/bin/sh
# Copyright 2000-2005 The Apache Software Foundation or its licensors, as
# applicable.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# buildpkg.sh: This script builds a Solaris PKG from the source tree
# provided.
PREFIX=/usr/local
TEMPDIR=/var/tmp/$USER/apr-util-root
rm -rf $TEMPDIR
apr_util_src_dir=.
apr_src_dir=../apr
expat_dir=/usr
while test $# -gt 0
do
# Normalize
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$1" in
--with-apr=*)
apr_src_dir=$optarg
;;
esac
case "$1" in
--with-apr-util=*)
apr_util_src_dir=$optarg
;;
esac
case "$1" in
--with-expat=*)
expat_dir=$optarg
;;
esac
shift
done
if [ -f "$apr_util_src_dir/configure.ac" ]; then
cd $apr_util_src_dir
else
echo "The apr-util source could not be found within $apr_util_src_dir"
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
exit 1
fi
if [ ! -f "$apr_src_dir/configure.ac" ]; then
echo "The apr source could not be found within $apr_src_dir"
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
exit 1
fi
if [ ! -d "$expat_dir" ]; then
echo "The expat directory could not be found within $expat_dir"
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
exit 1
fi
./configure --prefix=$PREFIX --with-apr=$apr_src_dir \
--with-ldap --with-expat=$expat_dir
make
make install DESTDIR=$TEMPDIR
rm $TEMPDIR$PREFIX/lib/aprutil.exp
. build/pkg/pkginfo
cp build/pkg/pkginfo $TEMPDIR$PREFIX
current=`pwd`
cd $TEMPDIR$PREFIX
echo "i pkginfo=./pkginfo" > prototype
find . -print | grep -v ./prototype | grep -v ./pkginfo | pkgproto | awk '{print $1" "$2" "$3" "$4" root bin"}' >> prototype
mkdir $TEMPDIR/pkg
pkgmk -r $TEMPDIR$PREFIX -d $TEMPDIR/pkg
cd $current
pkgtrans -s $TEMPDIR/pkg $current/$NAME-$VERSION-$ARCH-local
gzip $current/$NAME-$VERSION-$ARCH-local
rm -rf $TEMPDIR

View File

@ -1,11 +0,0 @@
PKG="ASFapu-1"
NAME="apr-util"
ARCH="@target_cpu@"
VERSION="@APRUTIL_DOTTED_VERSION@"
CATEGORY="application"
VENDOR="Apache Software Foundation"
EMAIL="dev@apr.apache.org"
PSTAMP="dev@apr.apache.org"
BASEDIR="@prefix@"
CLASSES="none"

View File

@ -1,89 +0,0 @@
%define apuver 1
Summary: Apache Portable Runtime Utility library
Name: apr-util
Version: APU_VERSION
Release: APU_RELEASE
License: Apache Software License
Group: System Environment/Libraries
URL: http://apr.apache.org/
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
BuildPrereq: autoconf, libtool, doxygen, apr-devel >= 0:{version}-{release}
BuildPrereq: openldap-devel, db4-devel, expat-devel
Conflicts: subversion < 0.20.1-2
%description
The mission of the Apache Portable Runtime (APR) is to provide a
free library of C data structures and routines. This library
contains additional utility interfaces for APR; including support
for XML, LDAP, database interfaces, URI parsing and more.
%package devel
Group: Development/Libraries
Summary: APR utility library development kit
Requires: apr-util = %{version}-%{release}, apr-devel
Requires: openldap-devel, db4-devel, expat-devel
Conflicts: subversion-devel < 0.20.1-2
%description devel
This package provides the support files which can be used to
build applications using the APR utility library. The mission
of the Apache Portable Runtime (APR) is to provide a free
library of C data structures and routines.
%prep
%setup -q
%build
%configure --with-apr=%{_prefix} \
--includedir=%{_includedir}/apr-%{apuver} \
--with-ldap --without-gdbm
make %{?_smp_mflags} && make dox
%check
# Run non-interactive tests
pushd test
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
./testall -v || exit 1
popd
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
# Documentation
mv docs/dox/html html
# Unpackaged files
rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
%clean
rm -rf $RPM_BUILD_ROOT
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%defattr(-,root,root,-)
%doc CHANGES LICENSE NOTICE
%{_libdir}/libaprutil-%{apuver}.so.*
%files devel
%defattr(-,root,root,-)
%{_bindir}/apu-%{apuver}-config
%{_libdir}/libaprutil-%{apuver}.*a
%{_libdir}/libaprutil-%{apuver}.so
%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
%{_includedir}/apr-%{apuver}/*.h
%doc --parents html
%changelog
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- update to support v1.0.0 of APR
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- derived from Fedora Core apr.spec

View File

@ -1,217 +0,0 @@
#! perl -w
#
# w32locatedb.pl -- Build apr-util with Berkeley DB on Win32
#
# Usage: perl w32locatedb.pl <type> <incdir> <libdir>
# type: Library type to link with ('lib' or 'dll')
# incdir: BDB includes directory (for db.h)
# libdir: Library directory (for libdbXY[s][d].lib)
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE
require 5.008;
use strict;
use File::Spec::Functions qw(canonpath rel2abs
splitpath catpath splitdir catdir);
########
# Subroutine prototypes
sub usage();
sub find_srcdir();
sub get_lib_name($$);
sub edit_header($$);
sub edit_project($$);
########
# Parse program arguments and set globals
die usage() unless scalar @ARGV >= 3;
my $type = lc($ARGV[0]);
die "Invalid library type '$type'\n"
unless $type eq 'lib' or $type eq 'dll';
my $incdir = $ARGV[1];
die "No 'db.h' in $incdir\n" unless -f "$incdir/db.h";
my $libdir = $ARGV[2];
die "$libdir: $!" unless -d $libdir;
my $libname = get_lib_name($type, $incdir);
die "No '$libname.lib' in $libdir" unless -f "$libdir/$libname.lib";
die "No '${libname}d.lib' in $libdir" unless -f "$libdir/${libname}d.lib";
my $srcdir = find_srcdir();
my $apu_hw = canonpath("$srcdir/include/apu.hw");
my $apu_want_hw = canonpath("$srcdir/include/apu_want.hw");
my $apu_select_dbm_hw = canonpath("$srcdir/include/private/apu_select_dbm.hw");
my $aprutil_dsp = canonpath("$srcdir/aprutil.dsp");
my $libaprutil_dsp = canonpath("$srcdir/libaprutil.dsp");
die "Can't find $apu_hw" unless -f $apu_hw;
die "Can't find $apu_want_hw" unless -f $apu_want_hw;
die "Can't find $apu_select_dbm_hw" unless -f $apu_select_dbm_hw;
die "Can't find $aprutil_dsp" unless -f $aprutil_dsp;
die "Can't find $libaprutil_dsp" unless -f $libaprutil_dsp;
########
# Edit the header file templates
my $db_h = rel2abs(canonpath("$incdir/db.h"));
$db_h =~ s/\\/\//g;
edit_header($apu_hw,
[['^\s*\#\s*define\s+APU_HAVE_DB\s+0\s*$',
'#define APU_HAVE_DB 1']]);
edit_header($apu_want_hw,
[['^\s*\#\s*include\s+\<db\.h\>\s*$',
"#include \"$db_h\""]]);
edit_header($apu_select_dbm_hw,
[['^\s*\#\s*define\s+APU_USE_DB\s+0\s*$',
'#define APU_USE_DB 1'],
['^\s*\#\s*include\s+\<db\.h\>\s*$',
"#include \"$db_h\""]]);
########
# Edit the .dsp files
my $libpath = rel2abs(canonpath("$libdir/$libname"));
edit_project($aprutil_dsp, $libpath);
edit_project($libaprutil_dsp, $libpath);
########
# Print usage
sub usage()
{
return ("Usage: perl w32locatedb.pl <type> <incdir> <libdir>\n"
. " type: Library type to link with ('lib' or 'dll')\n"
. " incdir: BDB includes directory (for db.h)\n"
. " libdir: Library directory (for libdbXY[s][d].lib)\n");
}
########
# Calculate the (possibly relative) path to the top of the apr-util
# source dir.
sub find_srcdir()
{
my $srcdir = rel2abs(canonpath($0));
my ($vol, $dir, $file) = splitpath($srcdir);
my @dirs = splitdir($dir);
die if scalar @dirs < 1;
do { $_ = pop @dirs } while ($_ eq '');
return catpath($vol, catdir(@dirs), '');
}
########
# Construct the name of the BDB library, based on the type and
# version information in db.h
sub get_lib_name($$)
{
my ($type, $incdir) = @_;
my $major = undef;
my $minor = undef;
my $patch = undef;
open(DBH, "< $incdir/db.h")
or die "Can't open $incdir/db.h: $!";
while (<DBH>) {
chomp;
m/^\s*\#\s*define\s+DB_VERSION_(MAJOR|MINOR|PATCH)\s+(\d+)\s*$/;
next unless defined $1 and defined $2;
if ($1 eq 'MAJOR') { $major = $2; }
elsif ($1 eq 'MINOR') { $minor = $2; }
elsif ($1 eq 'PATCH') { $patch = $2; }
last if defined $major and defined $minor and defined $patch;
}
close(DBH);
die "Can't determine BDB version\n"
unless defined $major and defined $minor and defined $patch;
print "Using BDB version $major.$minor.$patch\n";
my $libname = "libdb$major$minor";
$libname .= 's' if $type eq 'lib';
return $libname;
}
########
# Replace a file, keeping a backup copy
sub maybe_rename_with_backup($$$)
{
my ($tmpfile, $file, $maybe) = @_;
if ($maybe) {
# Make the file writable by the owner. On Windows, this removes
# any read-only bits.
chmod((stat($file))[2] | 0600, $file);
rename($file, "${file}~");
rename($tmpfile, $file);
} else {
print "No changes in $file\n";
unlink($tmpfile);
}
}
########
# Edit a header template in-place.
sub edit_header($$)
{
my ($file, $pairs) = @_;
my $tmpfile = "$file.tmp";
my $substs = 0;
open(IN, "< $file") or die "Can't open $file: $!";
open(TMP, "> $tmpfile") or die "Can't open $tmpfile: $!";
while (<IN>) {
chomp;
foreach my $pair (@$pairs) {
$substs += s/${$pair}[0]/${$pair}[1]/;
}
print TMP $_, "\n";
}
close(IN);
close(TMP);
maybe_rename_with_backup($tmpfile, $file, $substs > 0);
}
########
# Edit a project file in-place
sub edit_project($$)
{
my ($file, $libpath) = @_;
my $tmpfile = "$file.tmp";
my $substs = 0;
my ($prog, $debug) = (undef, undef);
my $libsearch = $libpath;
$libsearch =~ s/\\/\\\\/g;
open(IN, "< $file") or die "Can't open $file: $!";
open(TMP, "> $tmpfile") or die "Can't open $tmpfile: $!";
while (<IN>) {
chomp;
if (m/^\# TARGTYPE \"[^\"]+\" 0x([0-9A-Za-z]+)/
and defined $1) {
$prog = 'LINK32' if $1 eq '0102';
$prog = 'LIB32' if $1 eq '0104';
die "Unknown project type 0x$1" unless defined $prog;
} elsif (defined $prog
and m/^\# PROP Use_Debug_Libraries ([01])/
and defined $1) {
$debug = $1;
} elsif (defined $prog and defined $debug
and m/^\# ADD $prog (\"$libsearch)?/
and not defined $1) {
my $fullpath =
($debug eq '1' ? "${libpath}d.lib" : "$libpath.lib");
$substs += s/^\# ADD $prog /\# ADD $prog \"$fullpath\" /;
} elsif (m/^\# ADD CPP/) {
$substs += s/APU_USE_SDBM/APU_USE_DB/g;
}
print TMP $_, "\n";
}
close(IN);
close(TMP);
maybe_rename_with_backup($tmpfile, $file, $substs > 0);
}

View File

@ -1,111 +0,0 @@
#!/bin/sh
#
# Copyright 1999-2005 The Apache Software Foundation or its licensors, as
# applicable.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Default place to look for apr source. Can be overridden with
# --with-apr=[directory]
apr_src_dir=../apr
while test $# -gt 0
do
# Normalize
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$1" in
--with-apr=*)
apr_src_dir=$optarg
;;
esac
shift
done
if [ -f "$apr_src_dir/build/apr_common.m4" ]; then
apr_src_dir=`cd $apr_src_dir; pwd`
echo ""
echo "Looking for apr source in $apr_src_dir"
else
echo ""
echo "Problem finding apr source in $apr_src_dir."
echo "Use:"
echo " --with-apr=[directory]"
exit 1
fi
set -e
# Remove some files, then copy them from apr source tree
rm -f build/apr_common.m4 build/find_apr.m4 build/install.sh \
build/config.guess build/config.sub build/get-version.sh
cp -p $apr_src_dir/build/apr_common.m4 $apr_src_dir/build/find_apr.m4 \
$apr_src_dir/build/install.sh $apr_src_dir/build/config.guess \
$apr_src_dir/build/config.sub $apr_src_dir/build/get-version.sh \
build/
# Remove aclocal.m4 as it'll break some builds...
rm -rf aclocal.m4 autom4te*.cache
#
# Generate the autoconf header (include/apu_config.h) and ./configure
#
echo "Creating include/private/apu_config.h ..."
${AUTOHEADER:-autoheader}
echo "Creating configure ..."
### do some work to toss config.cache?
if ${AUTOCONF:-autoconf}; then
:
else
echo "autoconf failed"
exit 1
fi
#
# Generate build-outputs.mk for the build systme
#
echo "Generating 'make' outputs ..."
#$apr_src_dir/build/gen-build.py make
#
# If Expat has been bundled, then go and configure the thing
#
if [ -f xml/expat/buildconf.sh ]; then
echo "Invoking xml/expat/buildconf.sh ..."
(cd xml/expat; ./buildconf.sh)
fi
# Remove autoconf cache again
rm -rf autom4te*.cache
# Create RPM Spec file
if [ -f `which cut` ]; then
echo rebuilding rpm spec file
REVISION=`build/get-version.sh all include/apu_version.h APU`
VERSION=`echo $REVISION | cut -d- -s -f1`
RELEASE=`echo $REVISION | cut -d- -s -f2`
if [ "x$VERSION" = "x" ]; then
VERSION=$REVISION
RELEASE=1
fi
sed -e "s/APU_VERSION/$VERSION/" -e "s/APU_RELEASE/$RELEASE/" \
./build/rpm/apr-util.spec.in > apr-util.spec
fi

View File

@ -1,232 +0,0 @@
##
## config.layout -- Pre-defined Installation Path Layouts
##
## Hints:
## - layouts can be loaded with configure's --enable-layout=ID option
## - when no --enable-layout option is given, the default layout is `apr'
## - a trailing plus character (`+') on paths is replaced with a
## `/<target>' suffix where <target> is currently hardcoded to 'apr'.
## (This may become a configurable parameter at some point.)
##
# Classical APR-util path layout designed for parallel installs.
<Layout apr-util>
prefix: /usr/local/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/modules
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
localstatedir: ${prefix}
libsuffix: -${APRUTIL_MAJOR_VERSION}
</Layout>
# Classical single-installation APR path layout.
<Layout classic>
prefix: /usr/local/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/modules
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: ${prefix}
</Layout>
# GNU standards conforming path layout.
# See FSF's GNU project `make-stds' document for details.
<Layout GNU>
prefix: /usr/local
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: ${prefix}/etc+
datadir: ${prefix}/share+
installbuilddir: ${datadir}/build
includedir: ${prefix}/include+
localstatedir: ${prefix}/var+
runtimedir: ${localstatedir}/run
</Layout>
# Mac OS X Server (Rhapsody)
<Layout Mac OS X Server>
prefix: /Local/Library/WebServer
exec_prefix: /usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: /System/Library/apr/Modules
mandir: ${exec_prefix}/share/man
sysconfdir: ${prefix}/Configuration
datadir: ${prefix}
installbuilddir: /System/Library/apr/Build
includedir: /System/Library/Frameworks/apr.framework/Versions/2.0/Headers
localstatedir: /var
runtimedir: ${prefix}/Logs
</Layout>
# Darwin/Mac OS Layout
<Layout Darwin>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec+
mandir: ${prefix}/share/man
datadir: /Library/WebServer
sysconfdir: /etc+
installbuilddir: ${prefix}/share/httpd/build
includedir: ${prefix}/include+
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# Red Hat Linux 7.x layout
<Layout RedHat>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${prefix}/bin
sbindir: ${prefix}/sbin
libdir: ${prefix}/lib
libexecdir: ${prefix}/lib/apr
mandir: ${prefix}/man
sysconfdir: /etc/httpd/conf
datadir: /var/www
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# According to the /opt filesystem conventions
<Layout opt>
prefix: /opt/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: /etc${prefix}
datadir: ${prefix}/share
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: /var${prefix}
runtimedir: ${localstatedir}/run
</Layout>
# BeOS layout...
<Layout beos>
prefix: /boot/home/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: ${prefix}
runtimedir: ${localstatedir}/logs
</Layout>
# SuSE 6.x layout
<Layout SuSE>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${prefix}/bin
sbindir: ${prefix}/sbin
libdir: ${prefix}/lib
libexecdir: ${prefix}/lib/apr
mandir: ${prefix}/share/man
sysconfdir: /etc/httpd
datadir: /usr/local/httpd
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr
localstatedir: /var/lib/httpd
runtimedir: /var/run
</Layout>
# BSD/OS layout
<Layout BSDI>
prefix: /var/www
exec_prefix: /usr/contrib
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec/apr
mandir: ${exec_prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${exec_prefix}/include/apr
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# Solaris 8 Layout
<Layout Solaris>
prefix: /usr/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${exec_prefix}/man
sysconfdir: /etc/apr
datadir: /var/apr
installbuilddir: ${datadir}/build
includedir: ${exec_prefix}/include
localstatedir: ${prefix}
runtimedir: /var/run
</Layout>
# OpenBSD Layout
<Layout OpenBSD>
prefix: /var/www
exec_prefix: /usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/lib/apr/modules
mandir: ${exec_prefix}/share/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${prefix}/build
includedir: ${exec_prefix}/lib/apr/include
localstatedir: ${prefix}
runtimedir: ${prefix}/logs
</Layout>
# Debian layout
<Layout Debian>
prefix:
exec_prefix: ${prefix}/usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/lib/apr/modules
mandir: ${exec_prefix}/share/man
datadir: ${exec_prefix}/share/apr
includedir: ${exec_prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
localstatedir: ${prefix}/var/run
runtimedir: ${prefix}/var/run
infodir: ${exec_prefix}/share/info
libsuffix: -${APRUTIL_MAJOR_VERSION}
installbuilddir: ${prefix}/usr/share/apache2/build
</Layout>

View File

@ -1,216 +0,0 @@
dnl
dnl Process this file with autoconf to produce a configure script
dnl
AC_PREREQ(2.50)
AC_INIT(export_vars.sh.in)
AC_CONFIG_HEADERS(include/private/apu_config.h)
AC_CONFIG_AUX_DIR(build)
sinclude(build/apu-conf.m4)
sinclude(build/apu-iconv.m4)
sinclude(build/apu-hints.m4)
sinclude(build/apr_common.m4)
sinclude(build/find_apr.m4)
sinclude(build/dbm.m4)
sinclude(build/dbd.m4)
dnl Generate ./config.nice for reproducing runs of configure
dnl
APR_CONFIG_NICE(config.nice)
CFLAGS="$CFLAGS $CONFIGURE_CFLAGS"
CXXFLAGS="$CXXFLAGS $CONFIGURE_CXXFLAGS"
LDFLAGS="$LDFLAGS $CONFIGURE_LDFLAGS"
dnl # Some initial steps for configuration. We setup the default directory
dnl # and which files are to be configured.
dnl Absolute source/build directory
abs_srcdir=`(cd $srcdir && pwd)`
abs_builddir=`pwd`
if test "$abs_builddir" != "$abs_srcdir"; then
USE_VPATH=1
APU_CONFIG_LOCATION=build
else
APU_CONFIG_LOCATION=source
fi
AC_SUBST(APU_CONFIG_LOCATION)
AC_CANONICAL_SYSTEM
AC_PROG_INSTALL
dnl
dnl compute the top directory of the build
dnl note: this is needed for LIBTOOL and exporting the bundled Expat
dnl
top_builddir="$abs_builddir"
AC_SUBST(top_builddir)
AC_SUBST(abs_srcdir)
AC_SUBST(abs_builddir)
dnl Initialize mkdir -p functionality.
APR_MKDIR_P_CHECK($abs_srcdir/build/mkdir.sh)
dnl get our version information
get_version="$abs_srcdir/build/get-version.sh"
version_hdr="$abs_srcdir/include/apu_version.h"
APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"
AC_SUBST(APRUTIL_DOTTED_VERSION)
AC_SUBST(APRUTIL_MAJOR_VERSION)
echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"
dnl Enable the layout handling code, then reparse the prefix-style
dnl arguments due to autoconf being a PITA.
APR_ENABLE_LAYOUT(apr-util)
APR_PARSE_ARGUMENTS
dnl load os-specific hints for apr-util
APU_PRELOAD
dnl
dnl set up the compilation flags and stuff
dnl
APRUTIL_INCLUDES=""
APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
if test -n "$USE_VPATH"; then
APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
fi
dnl
dnl Find the APR includes directory and (possibly) the source (base) dir.
dnl
APU_FIND_APR
dnl
dnl even though we use apr_rules.mk for building apr-util, we need
dnl to grab CC and CPP ahead of time so that apr-util config tests
dnl use the same compiler as APR; we need the same compiler options
dnl and feature test macros as well
dnl
APR_SETIFNULL(CC, `$apr_config --cc`)
APR_SETIFNULL(CPP, `$apr_config --cpp`)
APR_ADDTO(CFLAGS, `$apr_config --cflags`)
APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
dnl
dnl Find the APR-ICONV directory.
dnl
if test -d ../apr-iconv; then
APR_SUBDIR_CONFIG(../apr-iconv,
[$apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir --datadir=$datadir --with-installbuilddir=$installbuilddir],
[--enable-layout=*|\'--enable-layout=*])
APRUTIL_EXPORT_LIBS="$abs_srcdir/../apr-iconv/lib/libapriconv.la $APRUTIL_EXPORT_LIBS"
APRUTIL_INCLUDES="-I$abs_srcdir/../apr-iconv/include $APRUTIL_INCLUDES"
APR_ICONV_DIR=../apr-iconv
else
APR_ICONV_DIR=""
fi
AC_SUBST(APR_ICONV_DIR)
dnl Find LDAP library
dnl Determine what DBM backend type to use.
dnl Find Expat
dnl Find an iconv library
APU_FIND_LDAP
APU_CHECK_DBM
APU_CHECK_DBD
APU_CHECK_DBD_MYSQL
APU_CHECK_DBD_SQLITE3
APU_CHECK_DBD_SQLITE2
APU_FIND_EXPAT
APU_FIND_ICONV
AC_SEARCH_LIBS(crypt, crypt ufc)
AC_MSG_CHECKING(if system crypt() function is threadsafe)
if test "x$apu_crypt_threadsafe" = "x1"; then
AC_DEFINE(APU_CRYPT_THREADSAFE, 1, [Define if the system crypt() function is threadsafe])
msg="yes"
else
msg="no"
fi
AC_MSG_RESULT([$msg])
AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ])
if test "$crypt_r" = "1"; then
APU_CHECK_CRYPT_R_STYLE
fi
so_ext=$APR_SO_EXT
lib_target=$APR_LIB_TARGET
AC_SUBST(so_ext)
AC_SUBST(lib_target)
APRUTIL_LIBNAME="aprutil${libsuffix}"
AC_SUBST(APRUTIL_LIBNAME)
dnl
dnl Prep all the flags and stuff for compilation and export to other builds
dnl
APR_ADDTO(APRUTIL_LIBS, [$APR_LIBS])
AC_SUBST(APRUTIL_EXPORT_LIBS)
AC_SUBST(APRUTIL_PRIV_INCLUDES)
AC_SUBST(APRUTIL_INCLUDES)
AC_SUBST(APRUTIL_LDFLAGS)
AC_SUBST(APRUTIL_LIBS)
AC_SUBST(LDFLAGS)
dnl copy apr's rules.mk into our build directory.
if test ! -d ./build; then
$mkdir_p build
fi
cp $APR_BUILD_DIR/apr_rules.mk $abs_builddir/build/rules.mk
dnl
dnl BSD/OS (BSDi) needs to use a different include syntax in the Makefiles
dnl
case "$host_alias" in
*bsdi* | BSD/OS)
# Check whether they've installed GNU make
if make --version > /dev/null 2>&1; then
INCLUDE_RULES="include $abs_builddir/build/rules.mk"
INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
else
INCLUDE_RULES=".include \"$abs_builddir/build/rules.mk\""
INCLUDE_OUTPUTS=".include \"$abs_srcdir/build-outputs.mk\""
fi
;;
*)
INCLUDE_RULES="include $abs_builddir/build/rules.mk"
INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
;;
esac
AC_SUBST(INCLUDE_RULES)
AC_SUBST(INCLUDE_OUTPUTS)
for d in include include/private; do
test -d $top_builddir/$d || mkdir $top_builddir/$d
done
AC_CONFIG_FILES([Makefile export_vars.sh
build/pkg/pkginfo apr-util.pc
apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in
include/private/apu_select_dbm.h
include/apr_ldap.h
include/apu.h include/apu_want.h])
AC_CONFIG_COMMANDS([default], [
chmod +x apu-$APRUTIL_MAJOR_VERSION-config
],[
APRUTIL_MAJOR_VERSION=$APRUTIL_MAJOR_VERSION
])
if test -d $srcdir/test; then
AC_CONFIG_FILES([test/Makefile])
fi
AC_OUTPUT

View File

@ -1,4 +0,0 @@
#! /bin/sh
srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-pic --without-sqlite2 --without-sqlite3 --with-expat=builtin

View File

@ -1,404 +0,0 @@
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* 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. MD4 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. MD4 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.
*/
#include "apr_strings.h"
#include "apr_md4.h"
#include "apr_lib.h"
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_UNISTD_H
#include <unistd.h>
#endif
/* Constants for MD4Transform routine.
*/
#define S11 3
#define S12 7
#define S13 11
#define S14 19
#define S21 3
#define S22 5
#define S23 9
#define S24 13
#define S31 3
#define S32 9
#define S33 11
#define S34 15
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64]);
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len);
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len);
static unsigned char PADDING[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#if APR_CHARSET_EBCDIC
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md4_encode() */
#endif
/* F, G and I are basic MD4 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* FF, GG and HH are transformations for rounds 1, 2 and 3 */
/* Rotation is separate from addition to prevent recomputation */
#define FF(a, b, c, d, x, s) { \
(a) += F ((b), (c), (d)) + (x); \
(a) = ROTATE_LEFT ((a), (s)); \
}
#define GG(a, b, c, d, x, s) { \
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)0x5a827999; \
(a) = ROTATE_LEFT ((a), (s)); \
}
#define HH(a, b, c, d, x, s) { \
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)0x6ed9eba1; \
(a) = ROTATE_LEFT ((a), (s)); \
}
/* MD4 initialization. Begins an MD4 operation, writing a new context.
*/
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants. */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
#if APR_HAS_XLATE
context->xlate = NULL;
#endif
return APR_SUCCESS;
}
#if APR_HAS_XLATE
/* MD4 translation setup. Provides the APR translation handle
* to be used for translating the content before calculating the
* digest.
*/
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
apr_xlate_t *xlate)
{
apr_status_t rv;
int is_sb;
/* TODO: remove the single-byte-only restriction from this code
*/
rv = apr_xlate_sb_get(xlate, &is_sb);
if (rv != APR_SUCCESS) {
return rv;
}
if (!is_sb) {
return APR_EINVAL;
}
context->xlate = xlate;
return APR_SUCCESS;
}
#endif /* APR_HAS_XLATE */
/* MD4 block update operation. Continues an MD4 message-digest
* operation, processing another message block, and updating the
* context.
*/
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
const unsigned char *input,
apr_size_t inputLen)
{
unsigned int i, idx, partLen;
#if APR_HAS_XLATE
apr_size_t inbytes_left, outbytes_left;
#endif
/* Compute number of bytes mod 64 */
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
< ((apr_uint32_t)inputLen << 3))
context->count[1]++;
context->count[1] += (apr_uint32_t)inputLen >> 29;
partLen = 64 - idx;
/* Transform as many times as possible. */
#if !APR_HAS_XLATE
if (inputLen >= partLen) {
memcpy(&context->buffer[idx], input, partLen);
MD4Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD4Transform(context->state, &input[i]);
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
memcpy(&context->buffer[idx], &input[i], inputLen - i);
#else /*APR_HAS_XLATE*/
if (inputLen >= partLen) {
if (context->xlate) {
inbytes_left = outbytes_left = partLen;
apr_xlate_conv_buffer(context->xlate, (const char *)input,
&inbytes_left,
(char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], input, partLen);
}
MD4Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
if (context->xlate) {
unsigned char inp_tmp[64];
inbytes_left = outbytes_left = 64;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left,
(char *)inp_tmp, &outbytes_left);
MD4Transform(context->state, inp_tmp);
}
else {
MD4Transform(context->state, &input[i]);
}
}
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
if (context->xlate) {
inbytes_left = outbytes_left = inputLen - i;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], &input[i], inputLen - i);
}
#endif /*APR_HAS_XLATE*/
return APR_SUCCESS;
}
/* MD4 finalization. Ends an MD4 message-digest operation, writing the
* the message digest and zeroizing the context.
*/
APU_DECLARE(apr_status_t) apr_md4_final(
unsigned char digest[APR_MD4_DIGESTSIZE],
apr_md4_ctx_t *context)
{
unsigned char bits[8];
unsigned int idx, padLen;
/* Save number of bits */
Encode(bits, context->count, 8);
#if APR_HAS_XLATE
/* apr_md4_update() should not translate for this final round. */
context->xlate = NULL;
#endif /*APR_HAS_XLATE*/
/* Pad out to 56 mod 64. */
idx = (unsigned int) ((context->count[0] >> 3) & 0x3f);
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
apr_md4_update(context, PADDING, padLen);
/* Append length (before padding) */
apr_md4_update(context, bits, 8);
/* Store state in digest */
Encode(digest, context->state, APR_MD4_DIGESTSIZE);
/* Zeroize sensitive information. */
memset(context, 0, sizeof(*context));
return APR_SUCCESS;
}
/* MD4 computation in one step (init, update, final)
*/
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
const unsigned char *input,
apr_size_t inputLen)
{
apr_md4_ctx_t ctx;
apr_status_t rv;
apr_md4_init(&ctx);
if ((rv = apr_md4_update(&ctx, input, inputLen)) != APR_SUCCESS)
return rv;
return apr_md4_final(digest, &ctx);
}
/* MD4 basic transformation. Transforms state based on block. */
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64])
{
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
x[APR_MD4_DIGESTSIZE];
Decode(x, block, 64);
/* Round 1 */
FF (a, b, c, d, x[ 0], S11); /* 1 */
FF (d, a, b, c, x[ 1], S12); /* 2 */
FF (c, d, a, b, x[ 2], S13); /* 3 */
FF (b, c, d, a, x[ 3], S14); /* 4 */
FF (a, b, c, d, x[ 4], S11); /* 5 */
FF (d, a, b, c, x[ 5], S12); /* 6 */
FF (c, d, a, b, x[ 6], S13); /* 7 */
FF (b, c, d, a, x[ 7], S14); /* 8 */
FF (a, b, c, d, x[ 8], S11); /* 9 */
FF (d, a, b, c, x[ 9], S12); /* 10 */
FF (c, d, a, b, x[10], S13); /* 11 */
FF (b, c, d, a, x[11], S14); /* 12 */
FF (a, b, c, d, x[12], S11); /* 13 */
FF (d, a, b, c, x[13], S12); /* 14 */
FF (c, d, a, b, x[14], S13); /* 15 */
FF (b, c, d, a, x[15], S14); /* 16 */
/* Round 2 */
GG (a, b, c, d, x[ 0], S21); /* 17 */
GG (d, a, b, c, x[ 4], S22); /* 18 */
GG (c, d, a, b, x[ 8], S23); /* 19 */
GG (b, c, d, a, x[12], S24); /* 20 */
GG (a, b, c, d, x[ 1], S21); /* 21 */
GG (d, a, b, c, x[ 5], S22); /* 22 */
GG (c, d, a, b, x[ 9], S23); /* 23 */
GG (b, c, d, a, x[13], S24); /* 24 */
GG (a, b, c, d, x[ 2], S21); /* 25 */
GG (d, a, b, c, x[ 6], S22); /* 26 */
GG (c, d, a, b, x[10], S23); /* 27 */
GG (b, c, d, a, x[14], S24); /* 28 */
GG (a, b, c, d, x[ 3], S21); /* 29 */
GG (d, a, b, c, x[ 7], S22); /* 30 */
GG (c, d, a, b, x[11], S23); /* 31 */
GG (b, c, d, a, x[15], S24); /* 32 */
/* Round 3 */
HH (a, b, c, d, x[ 0], S31); /* 33 */
HH (d, a, b, c, x[ 8], S32); /* 34 */
HH (c, d, a, b, x[ 4], S33); /* 35 */
HH (b, c, d, a, x[12], S34); /* 36 */
HH (a, b, c, d, x[ 2], S31); /* 37 */
HH (d, a, b, c, x[10], S32); /* 38 */
HH (c, d, a, b, x[ 6], S33); /* 39 */
HH (b, c, d, a, x[14], S34); /* 40 */
HH (a, b, c, d, x[ 1], S31); /* 41 */
HH (d, a, b, c, x[ 9], S32); /* 42 */
HH (c, d, a, b, x[ 5], S33); /* 43 */
HH (b, c, d, a, x[13], S34); /* 44 */
HH (a, b, c, d, x[ 3], S31); /* 45 */
HH (d, a, b, c, x[11], S32); /* 46 */
HH (c, d, a, b, x[ 7], S33); /* 47 */
HH (b, c, d, a, x[15], S34); /* 48 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
/* Zeroize sensitive information. */
memset(x, 0, sizeof(x));
}
/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
* a multiple of 4.
*/
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len)
{
unsigned int i, j;
apr_uint32_t k;
for (i = 0, j = 0; j < len; i++, j += 4) {
k = input[i];
output[j] = (unsigned char)(k & 0xff);
output[j + 1] = (unsigned char)((k >> 8) & 0xff);
output[j + 2] = (unsigned char)((k >> 16) & 0xff);
output[j + 3] = (unsigned char)((k >> 24) & 0xff);
}
}
/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
* a multiple of 4.
*/
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len)
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((apr_uint32_t)input[j]) |
(((apr_uint32_t)input[j + 1]) << 8) |
(((apr_uint32_t)input[j + 2]) << 16) |
(((apr_uint32_t)input[j + 3]) << 24);
}
#if APR_CHARSET_EBCDIC
APU_DECLARE(apr_status_t) apr_MD4InitEBCDIC(apr_xlate_t *xlate)
{
xlate_ebcdic_to_ascii = xlate;
return APR_SUCCESS;
}
#endif

View File

@ -1,733 +0,0 @@
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
*/
/* 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.
*/
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
* MD5 crypt() function, which is licenced as follows:
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*/
#include "apr_strings.h"
#include "apr_md5.h"
#include "apr_lib.h"
#include "apu_config.h"
#include "apr_sha1.h"
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_CRYPT_H
#include <crypt.h>
#endif
#if APR_HAVE_UNISTD_H
#include <unistd.h>
#endif
#if APR_HAVE_PTHREAD_H
#include <pthread.h>
#endif
/* Constants for MD5Transform routine.
*/
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64]);
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len);
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len);
static unsigned char PADDING[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#if APR_CHARSET_EBCDIC
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */
#endif
/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
* Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
/* MD5 initialization. Begins an MD5 operation, writing a new context.
*/
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants. */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
context->xlate = NULL;
return APR_SUCCESS;
}
/* MD5 translation setup. Provides the APR translation handle
* to be used for translating the content before calculating the
* digest.
*/
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
apr_xlate_t *xlate)
{
#if APR_HAS_XLATE
apr_status_t rv;
int is_sb;
/* TODO: remove the single-byte-only restriction from this code
*/
rv = apr_xlate_sb_get(xlate, &is_sb);
if (rv != APR_SUCCESS) {
return rv;
}
if (!is_sb) {
return APR_EINVAL;
}
context->xlate = xlate;
return APR_SUCCESS;
#else
return APR_ENOTIMPL;
#endif /* APR_HAS_XLATE */
}
/* MD5 block update operation. Continues an MD5 message-digest
* operation, processing another message block, and updating the
* context.
*/
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
const void *_input,
apr_size_t inputLen)
{
const unsigned char *input = _input;
unsigned int i, idx, partLen;
#if APR_HAS_XLATE
apr_size_t inbytes_left, outbytes_left;
#endif
/* Compute number of bytes mod 64 */
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
< ((apr_uint32_t)inputLen << 3))
context->count[1]++;
context->count[1] += (apr_uint32_t)inputLen >> 29;
partLen = 64 - idx;
/* Transform as many times as possible. */
#if !APR_HAS_XLATE
if (inputLen >= partLen) {
memcpy(&context->buffer[idx], input, partLen);
MD5Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD5Transform(context->state, &input[i]);
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
memcpy(&context->buffer[idx], &input[i], inputLen - i);
#else /*APR_HAS_XLATE*/
if (inputLen >= partLen) {
if (context->xlate) {
inbytes_left = outbytes_left = partLen;
apr_xlate_conv_buffer(context->xlate, (const char *)input,
&inbytes_left,
(char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], input, partLen);
}
MD5Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
if (context->xlate) {
unsigned char inp_tmp[64];
inbytes_left = outbytes_left = 64;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)inp_tmp,
&outbytes_left);
MD5Transform(context->state, inp_tmp);
}
else {
MD5Transform(context->state, &input[i]);
}
}
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
if (context->xlate) {
inbytes_left = outbytes_left = inputLen - i;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], &input[i], inputLen - i);
}
#endif /*APR_HAS_XLATE*/
return APR_SUCCESS;
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
* the message digest and zeroizing the context.
*/
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
apr_md5_ctx_t *context)
{
unsigned char bits[8];
unsigned int idx, padLen;
/* Save number of bits */
Encode(bits, context->count, 8);
#if APR_HAS_XLATE
/* apr_md5_update() should not translate for this final round. */
context->xlate = NULL;
#endif /*APR_HAS_XLATE*/
/* Pad out to 56 mod 64. */
idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
apr_md5_update(context, PADDING, padLen);
/* Append length (before padding) */
apr_md5_update(context, bits, 8);
/* Store state in digest */
Encode(digest, context->state, APR_MD5_DIGESTSIZE);
/* Zeroize sensitive information. */
memset(context, 0, sizeof(*context));
return APR_SUCCESS;
}
/* MD5 in one step (init, update, final)
*/
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
const void *_input,
apr_size_t inputLen)
{
const unsigned char *input = _input;
apr_md5_ctx_t ctx;
apr_status_t rv;
apr_md5_init(&ctx);
if ((rv = apr_md5_update(&ctx, input, inputLen)) != APR_SUCCESS)
return rv;
return apr_md5_final(digest, &ctx);
}
/* MD5 basic transformation. Transforms state based on block. */
static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64])
{
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
x[APR_MD5_DIGESTSIZE];
Decode(x, block, 64);
/* Round 1 */
FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
/* Zeroize sensitive information. */
memset(x, 0, sizeof(x));
}
/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
* a multiple of 4.
*/
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len)
{
unsigned int i, j;
apr_uint32_t k;
for (i = 0, j = 0; j < len; i++, j += 4) {
k = input[i];
output[j] = (unsigned char)(k & 0xff);
output[j + 1] = (unsigned char)((k >> 8) & 0xff);
output[j + 2] = (unsigned char)((k >> 16) & 0xff);
output[j + 3] = (unsigned char)((k >> 24) & 0xff);
}
}
/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
* a multiple of 4.
*/
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len)
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((apr_uint32_t)input[j]) |
(((apr_uint32_t)input[j + 1]) << 8) |
(((apr_uint32_t)input[j + 2]) << 16) |
(((apr_uint32_t)input[j + 3]) << 24);
}
#if APR_CHARSET_EBCDIC
APU_DECLARE(apr_status_t) apr_MD5InitEBCDIC(apr_xlate_t *xlate)
{
xlate_ebcdic_to_ascii = xlate;
return APR_SUCCESS;
}
#endif
/*
* Define the Magic String prefix that identifies a password as being
* hashed using our algorithm.
*/
static const char *apr1_id = "$apr1$";
/*
* The following MD5 password encryption code was largely borrowed from
* the FreeBSD 3.0 /usr/src/lib/libcrypt/crypt.c file, which is
* licenced as stated at the top of this file.
*/
static void to64(char *s, unsigned long v, int n)
{
static unsigned char itoa64[] = /* 0 ... 63 => ASCII - 64 */
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
while (--n >= 0) {
*s++ = itoa64[v&0x3f];
v >>= 6;
}
}
APU_DECLARE(apr_status_t) apr_md5_encode(const char *pw, const char *salt,
char *result, apr_size_t nbytes)
{
/*
* Minimum size is 8 bytes for salt, plus 1 for the trailing NUL,
* plus 4 for the '$' separators, plus the password hash itself.
* Let's leave a goodly amount of leeway.
*/
char passwd[120], *p;
const char *sp, *ep;
unsigned char final[APR_MD5_DIGESTSIZE];
apr_ssize_t sl, pl, i;
apr_md5_ctx_t ctx, ctx1;
unsigned long l;
/*
* Refine the salt first. It's possible we were given an already-hashed
* string as the salt argument, so extract the actual salt value from it
* if so. Otherwise just use the string up to the first '$' as the salt.
*/
sp = salt;
/*
* If it starts with the magic string, then skip that.
*/
if (!strncmp(sp, apr1_id, strlen(apr1_id))) {
sp += strlen(apr1_id);
}
/*
* It stops at the first '$' or 8 chars, whichever comes first
*/
for (ep = sp; (*ep != '\0') && (*ep != '$') && (ep < (sp + 8)); ep++) {
continue;
}
/*
* Get the length of the true salt
*/
sl = ep - sp;
/*
* 'Time to make the doughnuts..'
*/
apr_md5_init(&ctx);
#if APR_CHARSET_EBCDIC
apr_md5_set_xlate(&ctx, xlate_ebcdic_to_ascii);
#endif
/*
* The password first, since that is what is most unknown
*/
apr_md5_update(&ctx, pw, strlen(pw));
/*
* Then our magic string
*/
apr_md5_update(&ctx, apr1_id, strlen(apr1_id));
/*
* Then the raw salt
*/
apr_md5_update(&ctx, sp, sl);
/*
* Then just as many characters of the MD5(pw, salt, pw)
*/
apr_md5_init(&ctx1);
apr_md5_update(&ctx1, pw, strlen(pw));
apr_md5_update(&ctx1, sp, sl);
apr_md5_update(&ctx1, pw, strlen(pw));
apr_md5_final(final, &ctx1);
for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) {
apr_md5_update(&ctx, final,
(pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl);
}
/*
* Don't leave anything around in vm they could use.
*/
memset(final, 0, sizeof(final));
/*
* Then something really weird...
*/
for (i = strlen(pw); i != 0; i >>= 1) {
if (i & 1) {
apr_md5_update(&ctx, final, 1);
}
else {
apr_md5_update(&ctx, pw, 1);
}
}
/*
* Now make the output string. We know our limitations, so we
* can use the string routines without bounds checking.
*/
strcpy(passwd, apr1_id);
strncat(passwd, sp, sl);
strcat(passwd, "$");
apr_md5_final(final, &ctx);
/*
* And now, just to make sure things don't run too fast..
* On a 60 Mhz Pentium this takes 34 msec, so you would
* need 30 seconds to build a 1000 entry dictionary...
*/
for (i = 0; i < 1000; i++) {
apr_md5_init(&ctx1);
if (i & 1) {
apr_md5_update(&ctx1, pw, strlen(pw));
}
else {
apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
}
if (i % 3) {
apr_md5_update(&ctx1, sp, sl);
}
if (i % 7) {
apr_md5_update(&ctx1, pw, strlen(pw));
}
if (i & 1) {
apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
}
else {
apr_md5_update(&ctx1, pw, strlen(pw));
}
apr_md5_final(final,&ctx1);
}
p = passwd + strlen(passwd);
l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p, l, 4); p += 4;
l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p, l, 4); p += 4;
l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p, l, 4); p += 4;
l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p, l, 4); p += 4;
l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p, l, 4); p += 4;
l = final[11] ; to64(p, l, 2); p += 2;
*p = '\0';
/*
* Don't leave anything around in vm they could use.
*/
memset(final, 0, sizeof(final));
apr_cpystrn(result, passwd, nbytes - 1);
return APR_SUCCESS;
}
#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
#if defined(APU_CRYPT_THREADSAFE) || !APR_HAS_THREADS || \
defined(CRYPT_R_CRYPTD) || defined(CRYPT_R_STRUCT_CRYPT_DATA)
#define crypt_mutex_lock()
#define crypt_mutex_unlock()
#elif APR_HAVE_PTHREAD_H && defined(PTHREAD_MUTEX_INITIALIZER)
static pthread_mutex_t crypt_mutex = PTHREAD_MUTEX_INITIALIZER;
static void crypt_mutex_lock(void)
{
pthread_mutex_lock(&crypt_mutex);
}
static void crypt_mutex_unlock(void)
{
pthread_mutex_unlock(&crypt_mutex);
}
#else
#error apr_password_validate() is not threadsafe. rebuild APR without thread support.
#endif
#endif
/*
* Validate a plaintext password against a smashed one. Uses either
* crypt() (if available) or apr_md5_encode() or apr_sha1_base64(), depending
* upon the format of the smashed input password. Returns APR_SUCCESS if
* they match, or APR_EMISMATCH if they don't. If the platform doesn't
* support crypt, then the default check is against a clear text string.
*/
APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd,
const char *hash)
{
char sample[120];
#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
char *crypt_pw;
#endif
if (!strncmp(hash, apr1_id, strlen(apr1_id))) {
/*
* The hash was created using our custom algorithm.
*/
apr_md5_encode(passwd, hash, sample, sizeof(sample));
}
else if (!strncmp(hash, APR_SHA1PW_ID, APR_SHA1PW_IDLEN)) {
apr_sha1_base64(passwd, strlen(passwd), sample);
}
else {
/*
* It's not our algorithm, so feed it to crypt() if possible.
*/
#if defined(WIN32) || defined(BEOS) || defined(NETWARE)
apr_cpystrn(sample, passwd, sizeof(sample) - 1);
#elif defined(CRYPT_R_CRYPTD)
CRYPTD buffer;
crypt_pw = crypt_r(passwd, hash, &buffer);
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
#elif defined(CRYPT_R_STRUCT_CRYPT_DATA)
struct crypt_data buffer;
/* having to clear this seems bogus... GNU doc is
* confusing... user report found from google says
* the crypt_data struct had to be cleared to get
* the same result as plain crypt()
*/
memset(&buffer, 0, sizeof(buffer));
crypt_pw = crypt_r(passwd, hash, &buffer);
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
#else
/* Do a bit of sanity checking since we know that crypt_r()
* should always be used for threaded builds on AIX, and
* problems in configure logic can result in the wrong
* choice being made.
*/
#if defined(_AIX) && APR_HAS_THREADS
#error Configuration error! crypt_r() should have been selected!
#endif
/* Handle thread safety issues by holding a mutex around the
* call to crypt().
*/
crypt_mutex_lock();
crypt_pw = crypt(passwd, hash);
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
crypt_mutex_unlock();
#endif
}
return (strcmp(sample, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
}

View File

@ -1,372 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* The exported function:
*
* apr_sha1_base64(const char *clear, int len, char *out);
*
* provides a means to SHA1 crypt/encode a plaintext password in
* a way which makes password files compatible with those commonly
* used in netscape web and ldap installations. It was put together
* by Clinton Wong <clintdw@netcom.com>, who also notes that:
*
* Note: SHA1 support is useful for migration purposes, but is less
* secure than Apache's password format, since Apache's (MD5)
* password format uses a random eight character salt to generate
* one of many possible hashes for the same password. Netscape
* uses plain SHA1 without a salt, so the same password
* will always generate the same hash, making it easier
* to break since the search space is smaller.
*
* See also the documentation in support/SHA1 as to hints on how to
* migrate an existing netscape installation and other supplied utitlites.
*
* This software also makes use of the following component:
*
* NIST Secure Hash Algorithm
* heavily modified by Uwe Hollerbach uh@alumni.caltech edu
* from Peter C. Gutmann's implementation as found in
* Applied Cryptography by Bruce Schneier
* This code is hereby placed in the public domain
*/
#include "apr_sha1.h"
#include "apr_base64.h"
#include "apr_strings.h"
#include "apr_lib.h"
#if APR_CHARSET_EBCDIC
#include "apr_xlate.h"
#endif /*APR_CHARSET_EBCDIC*/
#include <string.h>
/* a bit faster & bigger, if defined */
#define UNROLL_LOOPS
/* NIST's proposed modification to SHA, 7/11/94 */
#define USE_MODIFIED_SHA
/* SHA f()-functions */
#define f1(x,y,z) ((x & y) | (~x & z))
#define f2(x,y,z) (x ^ y ^ z)
#define f3(x,y,z) ((x & y) | (x & z) | (y & z))
#define f4(x,y,z) (x ^ y ^ z)
/* SHA constants */
#define CONST1 0x5a827999L
#define CONST2 0x6ed9eba1L
#define CONST3 0x8f1bbcdcL
#define CONST4 0xca62c1d6L
/* 32-bit rotate */
#define ROT32(x,n) ((x << n) | (x >> (32 - n)))
#define FUNC(n,i) \
temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n; \
E = D; D = C; C = ROT32(B,30); B = A; A = temp
#define SHA_BLOCKSIZE 64
#if APR_CHARSET_EBCDIC
static apr_xlate_t *ebcdic2ascii_xlate;
APU_DECLARE(apr_status_t) apr_SHA1InitEBCDIC(apr_xlate_t *x)
{
apr_status_t rv;
int onoff;
/* Only single-byte conversion is supported.
*/
rv = apr_xlate_sb_get(x, &onoff);
if (rv) {
return rv;
}
if (!onoff) { /* If conversion is not single-byte-only */
return APR_EINVAL;
}
ebcdic2ascii_xlate = x;
return APR_SUCCESS;
}
#endif
/* do SHA transformation */
static void sha_transform(apr_sha1_ctx_t *sha_info)
{
int i;
apr_uint32_t temp, A, B, C, D, E, W[80];
for (i = 0; i < 16; ++i) {
W[i] = sha_info->data[i];
}
for (i = 16; i < 80; ++i) {
W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
#ifdef USE_MODIFIED_SHA
W[i] = ROT32(W[i], 1);
#endif /* USE_MODIFIED_SHA */
}
A = sha_info->digest[0];
B = sha_info->digest[1];
C = sha_info->digest[2];
D = sha_info->digest[3];
E = sha_info->digest[4];
#ifdef UNROLL_LOOPS
FUNC(1, 0); FUNC(1, 1); FUNC(1, 2); FUNC(1, 3); FUNC(1, 4);
FUNC(1, 5); FUNC(1, 6); FUNC(1, 7); FUNC(1, 8); FUNC(1, 9);
FUNC(1,10); FUNC(1,11); FUNC(1,12); FUNC(1,13); FUNC(1,14);
FUNC(1,15); FUNC(1,16); FUNC(1,17); FUNC(1,18); FUNC(1,19);
FUNC(2,20); FUNC(2,21); FUNC(2,22); FUNC(2,23); FUNC(2,24);
FUNC(2,25); FUNC(2,26); FUNC(2,27); FUNC(2,28); FUNC(2,29);
FUNC(2,30); FUNC(2,31); FUNC(2,32); FUNC(2,33); FUNC(2,34);
FUNC(2,35); FUNC(2,36); FUNC(2,37); FUNC(2,38); FUNC(2,39);
FUNC(3,40); FUNC(3,41); FUNC(3,42); FUNC(3,43); FUNC(3,44);
FUNC(3,45); FUNC(3,46); FUNC(3,47); FUNC(3,48); FUNC(3,49);
FUNC(3,50); FUNC(3,51); FUNC(3,52); FUNC(3,53); FUNC(3,54);
FUNC(3,55); FUNC(3,56); FUNC(3,57); FUNC(3,58); FUNC(3,59);
FUNC(4,60); FUNC(4,61); FUNC(4,62); FUNC(4,63); FUNC(4,64);
FUNC(4,65); FUNC(4,66); FUNC(4,67); FUNC(4,68); FUNC(4,69);
FUNC(4,70); FUNC(4,71); FUNC(4,72); FUNC(4,73); FUNC(4,74);
FUNC(4,75); FUNC(4,76); FUNC(4,77); FUNC(4,78); FUNC(4,79);
#else /* !UNROLL_LOOPS */
for (i = 0; i < 20; ++i) {
FUNC(1,i);
}
for (i = 20; i < 40; ++i) {
FUNC(2,i);
}
for (i = 40; i < 60; ++i) {
FUNC(3,i);
}
for (i = 60; i < 80; ++i) {
FUNC(4,i);
}
#endif /* !UNROLL_LOOPS */
sha_info->digest[0] += A;
sha_info->digest[1] += B;
sha_info->digest[2] += C;
sha_info->digest[3] += D;
sha_info->digest[4] += E;
}
union endianTest {
long Long;
char Char[sizeof(long)];
};
static char isLittleEndian(void)
{
static union endianTest u;
u.Long = 1;
return (u.Char[0] == 1);
}
/* change endianness of data */
/* count is the number of bytes to do an endian flip */
static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
{
int i;
apr_byte_t ct[4], *cp;
if (isLittleEndian()) { /* do the swap only if it is little endian */
count /= sizeof(apr_uint32_t);
cp = (apr_byte_t *) buffer;
for (i = 0; i < count; ++i) {
ct[0] = cp[0];
ct[1] = cp[1];
ct[2] = cp[2];
ct[3] = cp[3];
cp[0] = ct[3];
cp[1] = ct[2];
cp[2] = ct[1];
cp[3] = ct[0];
cp += sizeof(apr_uint32_t);
}
}
}
/* initialize the SHA digest */
APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *sha_info)
{
sha_info->digest[0] = 0x67452301L;
sha_info->digest[1] = 0xefcdab89L;
sha_info->digest[2] = 0x98badcfeL;
sha_info->digest[3] = 0x10325476L;
sha_info->digest[4] = 0xc3d2e1f0L;
sha_info->count_lo = 0L;
sha_info->count_hi = 0L;
sha_info->local = 0;
}
/* update the SHA digest */
APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *sha_info,
const unsigned char *buffer,
unsigned int count)
{
unsigned int i;
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
++sha_info->count_hi;
}
sha_info->count_lo += (apr_uint32_t) count << 3;
sha_info->count_hi += (apr_uint32_t) count >> 29;
if (sha_info->local) {
i = SHA_BLOCKSIZE - sha_info->local;
if (i > count) {
i = count;
}
memcpy(((apr_byte_t *) sha_info->data) + sha_info->local, buffer, i);
count -= i;
buffer += i;
sha_info->local += i;
if (sha_info->local == SHA_BLOCKSIZE) {
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
else {
return;
}
}
while (count >= SHA_BLOCKSIZE) {
memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
buffer += SHA_BLOCKSIZE;
count -= SHA_BLOCKSIZE;
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
memcpy(sha_info->data, buffer, count);
sha_info->local = count;
}
APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *sha_info, const char *buf,
unsigned int count)
{
#if APR_CHARSET_EBCDIC
int i;
const apr_byte_t *buffer = (const apr_byte_t *) buf;
apr_size_t inbytes_left, outbytes_left;
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
++sha_info->count_hi;
}
sha_info->count_lo += (apr_uint32_t) count << 3;
sha_info->count_hi += (apr_uint32_t) count >> 29;
/* Is there a remainder of the previous Update operation? */
if (sha_info->local) {
i = SHA_BLOCKSIZE - sha_info->local;
if (i > count) {
i = count;
}
inbytes_left = outbytes_left = i;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
((apr_byte_t *) sha_info->data) + sha_info->local,
&outbytes_left);
count -= i;
buffer += i;
sha_info->local += i;
if (sha_info->local == SHA_BLOCKSIZE) {
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
else {
return;
}
}
while (count >= SHA_BLOCKSIZE) {
inbytes_left = outbytes_left = SHA_BLOCKSIZE;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
(apr_byte_t *) sha_info->data, &outbytes_left);
buffer += SHA_BLOCKSIZE;
count -= SHA_BLOCKSIZE;
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
inbytes_left = outbytes_left = count;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
(apr_byte_t *) sha_info->data, &outbytes_left);
sha_info->local = count;
#else
apr_sha1_update_binary(sha_info, (const unsigned char *) buf, count);
#endif
}
/* finish computing the SHA digest */
APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
apr_sha1_ctx_t *sha_info)
{
int count, i, j;
apr_uint32_t lo_bit_count, hi_bit_count, k;
lo_bit_count = sha_info->count_lo;
hi_bit_count = sha_info->count_hi;
count = (int) ((lo_bit_count >> 3) & 0x3f);
((apr_byte_t *) sha_info->data)[count++] = 0x80;
if (count > SHA_BLOCKSIZE - 8) {
memset(((apr_byte_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
memset((apr_byte_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
}
else {
memset(((apr_byte_t *) sha_info->data) + count, 0,
SHA_BLOCKSIZE - 8 - count);
}
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_info->data[14] = hi_bit_count;
sha_info->data[15] = lo_bit_count;
sha_transform(sha_info);
for (i = 0, j = 0; j < APR_SHA1_DIGESTSIZE; i++) {
k = sha_info->digest[i];
digest[j++] = (unsigned char) ((k >> 24) & 0xff);
digest[j++] = (unsigned char) ((k >> 16) & 0xff);
digest[j++] = (unsigned char) ((k >> 8) & 0xff);
digest[j++] = (unsigned char) (k & 0xff);
}
}
APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out)
{
int l;
apr_sha1_ctx_t context;
apr_byte_t digest[APR_SHA1_DIGESTSIZE];
if (strncmp(clear, APR_SHA1PW_ID, APR_SHA1PW_IDLEN) == 0) {
clear += APR_SHA1PW_IDLEN;
}
apr_sha1_init(&context);
apr_sha1_update(&context, clear, len);
apr_sha1_final(digest, &context);
/* private marker. */
apr_cpystrn(out, APR_SHA1PW_ID, APR_SHA1PW_IDLEN + 1);
/* SHA1 hash is always 20 chars */
l = apr_base64_encode_binary(out + APR_SHA1PW_IDLEN, digest, sizeof(digest));
out[l + APR_SHA1PW_IDLEN] = '\0';
/*
* output of base64 encoded SHA1 is always 28 chars + APR_SHA1PW_IDLEN
*/
}

View File

@ -1,209 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This attempts to generate V1 UUIDs according to the Internet Draft
* located at http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
*/
#include "apr.h"
#include "apr_uuid.h"
#include "apr_general.h"
#include "apr_portable.h"
#if !APR_HAS_RANDOM
#include "apr_md5.h"
#endif
#if APR_HAVE_UNISTD_H
#include <unistd.h> /* for getpid, gethostname */
#endif
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for rand, srand */
#endif
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_STRINGS_H
#include <strings.h>
#endif
#if APR_HAVE_NETDB_H
#include <netdb.h>
#endif
#if APR_HAVE_SYS_TIME_H
#include <sys/time.h> /* for gettimeofday */
#endif
#define NODE_LENGTH 6
static int uuid_state_seqnum;
static unsigned char uuid_state_node[NODE_LENGTH] = { 0 };
static void get_random_info(unsigned char node[NODE_LENGTH])
{
#if APR_HAS_RANDOM
(void) apr_generate_random_bytes(node, NODE_LENGTH);
#else
unsigned char seed[APR_MD5_DIGESTSIZE];
apr_md5_ctx_t c;
/* ### probably should revise some of this to be a bit more portable */
/* Leach & Salz use Linux-specific struct sysinfo;
* replace with pid/tid for portability (in the spirit of mod_unique_id) */
struct {
/* Add thread id here, if applicable, when we get to pthread or apr */
pid_t pid;
#ifdef NETWARE
apr_uint64_t t;
#else
struct timeval t;
#endif
char hostname[257];
} r;
apr_md5_init(&c);
#ifdef NETWARE
r.pid = NXThreadGetId();
NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &(r.t));
#else
r.pid = getpid();
gettimeofday(&r.t, (struct timezone *)0);
#endif
gethostname(r.hostname, 256);
apr_md5_update(&c, (const unsigned char *)&r, sizeof(r));
apr_md5_final(seed, &c);
memcpy(node, seed, NODE_LENGTH); /* use a subset of the seed bytes */
#endif
}
/* This implementation generates a random node ID instead of a
system-dependent call to get IEEE node ID. This is also more secure:
we aren't passing out our MAC address.
*/
static void get_pseudo_node_identifier(unsigned char *node)
{
get_random_info(node);
node[0] |= 0x01; /* this designates a random node ID */
}
static void get_system_time(apr_uint64_t *uuid_time)
{
/* ### fix this call to be more portable? */
*uuid_time = apr_time_now();
/* Offset between UUID formatted times and Unix formatted times.
UUID UTC base time is October 15, 1582.
Unix base time is January 1, 1970. */
*uuid_time = (*uuid_time * 10) + APR_TIME_C(0x01B21DD213814000);
}
/* true_random -- generate a crypto-quality random number. */
static int true_random(void)
{
apr_uint64_t time_now;
#if APR_HAS_RANDOM
unsigned char buf[2];
if (apr_generate_random_bytes(buf, 2) == APR_SUCCESS) {
return (buf[0] << 8) | buf[1];
}
#endif
/* crap. this isn't crypto quality, but it will be Good Enough */
get_system_time(&time_now);
srand((unsigned int)(((time_now >> 32) ^ time_now) & 0xffffffff));
return rand() & 0x0FFFF;
}
static void init_state(void)
{
uuid_state_seqnum = true_random();
get_pseudo_node_identifier(uuid_state_node);
}
static void get_current_time(apr_uint64_t *timestamp)
{
/* ### this needs to be made thread-safe! */
apr_uint64_t time_now;
static apr_uint64_t time_last = 0;
static apr_uint64_t fudge = 0;
get_system_time(&time_now);
/* if clock reading changed since last UUID generated... */
if (time_last != time_now) {
/* The clock reading has changed since the last UUID was generated.
Reset the fudge factor. if we are generating them too fast, then
the fudge may need to be reset to something greater than zero. */
if (time_last + fudge > time_now)
fudge = time_last + fudge - time_now + 1;
else
fudge = 0;
time_last = time_now;
}
else {
/* We generated two really fast. Bump the fudge factor. */
++fudge;
}
*timestamp = time_now + fudge;
}
APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid)
{
apr_uint64_t timestamp;
unsigned char *d = uuid->data;
#if APR_HAS_OS_UUID
if (apr_os_uuid_get(d) == APR_SUCCESS) {
return;
}
#endif /* !APR_HAS_OS_UUID */
if (!uuid_state_node[0])
init_state();
get_current_time(&timestamp);
/* time_low, uint32 */
d[3] = (unsigned char)timestamp;
d[2] = (unsigned char)(timestamp >> 8);
d[1] = (unsigned char)(timestamp >> 16);
d[0] = (unsigned char)(timestamp >> 24);
/* time_mid, uint16 */
d[5] = (unsigned char)(timestamp >> 32);
d[4] = (unsigned char)(timestamp >> 40);
/* time_hi_and_version, uint16 */
d[7] = (unsigned char)(timestamp >> 48);
d[6] = (unsigned char)(((timestamp >> 56) & 0x0F) | 0x10);
/* clock_seq_hi_and_reserved, uint8 */
d[8] = (unsigned char)(((++uuid_state_seqnum >> 8) & 0x3F) | 0x80);
/* clock_seq_low, uint8 */
d[9] = (unsigned char)uuid_state_seqnum;
/* node, byte[6] */
memcpy(&d[10], uuid_state_node, NODE_LENGTH);
}

View File

@ -1,130 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h> /* for sprintf */
#include "apr.h"
#include "apr_uuid.h"
#include "apr_errno.h"
#include "apr_lib.h"
APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid)
{
const unsigned char *d = uuid->data;
sprintf(buffer,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
}
/* convert a pair of hex digits to an integer value [0,255] */
#if 'A' == 65
static unsigned char parse_hexpair(const char *s)
{
int result;
int temp;
result = s[0] - '0';
if (result > 48)
result = (result - 39) << 4;
else if (result > 16)
result = (result - 7) << 4;
else
result = result << 4;
temp = s[1] - '0';
if (temp > 48)
result |= temp - 39;
else if (temp > 16)
result |= temp - 7;
else
result |= temp;
return (unsigned char)result;
}
#else
static unsigned char parse_hexpair(const char *s)
{
int result;
if (isdigit(*s)) {
result = (*s - '0') << 4;
}
else {
if (isupper(*s)) {
result = (*s - 'A' + 10) << 4;
}
else {
result = (*s - 'a' + 10) << 4;
}
}
++s;
if (isdigit(*s)) {
result |= (*s - '0');
}
else {
if (isupper(*s)) {
result |= (*s - 'A' + 10);
}
else {
result |= (*s - 'a' + 10);
}
}
return (unsigned char)result;
}
#endif
APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid,
const char *uuid_str)
{
int i;
unsigned char *d = uuid->data;
for (i = 0; i < 36; ++i) {
char c = uuid_str[i];
if (!apr_isxdigit(c) &&
!(c == '-' && (i == 8 || i == 13 || i == 18 || i == 23)))
/* ### need a better value */
return APR_BADARG;
}
if (uuid_str[36] != '\0') {
/* ### need a better value */
return APR_BADARG;
}
d[0] = parse_hexpair(&uuid_str[0]);
d[1] = parse_hexpair(&uuid_str[2]);
d[2] = parse_hexpair(&uuid_str[4]);
d[3] = parse_hexpair(&uuid_str[6]);
d[4] = parse_hexpair(&uuid_str[9]);
d[5] = parse_hexpair(&uuid_str[11]);
d[6] = parse_hexpair(&uuid_str[14]);
d[7] = parse_hexpair(&uuid_str[16]);
d[8] = parse_hexpair(&uuid_str[19]);
d[9] = parse_hexpair(&uuid_str[21]);
for (i = 6; i--;)
d[10 + i] = parse_hexpair(&uuid_str[i*2+24]);
return APR_SUCCESS;
}

View File

@ -1,303 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include "apu.h"
#include "apr_pools.h"
#include "apr_dbd_internal.h"
#include "apr_dbd.h"
#include "apr_hash.h"
#include "apr_thread_mutex.h"
#include "apr_dso.h"
#include "apr_strings.h"
static apr_hash_t *drivers = NULL;
#define CLEANUP_CAST (apr_status_t (*)(void*))
/* Once the autofoo supports building it for dynamic load, we can use
* #define APR_DSO_BUILD APR_HAS_DSO
*/
#if APR_DSO_BUILD
#if APR_HAS_THREADS
static apr_thread_mutex_t* mutex = NULL;
#endif
#else
#define DRIVER_LOAD(name,driver,pool) \
{ \
extern const apr_dbd_driver_t driver; \
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
if (driver.init) { \
driver.init(pool); \
} \
}
#endif
static apr_status_t apr_dbd_term(void *ptr)
{
/* set drivers to NULL so init can work again */
drivers = NULL;
/* Everything else we need is handled by cleanups registered
* when we created mutexes and loaded DSOs
*/
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool)
{
apr_status_t ret = APR_SUCCESS;
if (drivers != NULL) {
return APR_SUCCESS;
}
drivers = apr_hash_make(pool);
apr_pool_cleanup_register(pool, NULL, apr_dbd_term,
apr_pool_cleanup_null);
#if APR_DSO_BUILD
#if APR_HAS_THREADS
ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
/* This already registers a pool cleanup */
#endif
#else
#if APU_HAVE_MYSQL
DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool);
#endif
#if APU_HAVE_PGSQL
DRIVER_LOAD("pgsql", apr_dbd_pgsql_driver, pool);
#endif
#if APU_HAVE_SQLITE3
DRIVER_LOAD("sqlite3", apr_dbd_sqlite3_driver, pool);
#endif
#if APU_HAVE_SQLITE2
DRIVER_LOAD("sqlite2", apr_dbd_sqlite2_driver, pool);
#endif
#if APU_HAVE_SOME_OTHER_BACKEND
DRIVER_LOAD("firebird", apr_dbd_other_driver, pool);
#endif
#endif
return ret;
}
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
const apr_dbd_driver_t **driver)
{
#if APR_DSO_BUILD
char path[80];
apr_dso_handle_t *dlhandle = NULL;
#endif
apr_status_t rv;
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
if (*driver) {
return APR_SUCCESS;
}
#if APR_DSO_BUILD
#if APR_HAS_THREADS
rv = apr_thread_mutex_lock(mutex);
if (rv != APR_SUCCESS) {
goto unlock;
}
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
if (*driver) {
goto unlock;
}
#endif
#ifdef WIN32
sprintf(path, "apr_dbd_%s.dll", name);
#else
sprintf(path, "apr_dbd_%s.so", name);
#endif
rv = apr_dso_load(&dlhandle, path, pool);
if (rv != APR_SUCCESS) { /* APR_EDSOOPEN */
goto unlock;
}
sprintf(path, "apr_dbd_%s_driver", name);
rv = apr_dso_sym((void*)driver, dlhandle, path);
if (rv != APR_SUCCESS) { /* APR_ESYMNOTFOUND */
apr_dso_unload(dlhandle);
goto unlock;
}
if ((*driver)->init) {
(*driver)->init(pool);
}
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
unlock:
#if APR_HAS_THREADS
apr_thread_mutex_unlock(mutex);
#endif
#else /* APR_DSO_BUILD - so if it wasn't already loaded, it's NOTIMPL */
rv = APR_ENOTIMPL;
#endif
return rv;
}
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *params,
apr_dbd_t **handle)
{
apr_status_t rv;
*handle = driver->open(pool, params);
if (*handle == NULL) {
return APR_EGENERAL;
}
rv = apr_dbd_check_conn(driver, pool, *handle);
if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
apr_dbd_close(driver, *handle);
return APR_EGENERAL;
}
return APR_SUCCESS;
}
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int ret = driver->start_transaction(pool, handle, trans);
if (*trans) {
apr_pool_cleanup_register(pool, *trans,
CLEANUP_CAST driver->end_transaction,
apr_pool_cleanup_null);
}
return ret;
}
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_transaction_t *trans)
{
apr_pool_cleanup_kill(pool, trans, CLEANUP_CAST driver->end_transaction);
return driver->end_transaction(trans);
}
APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
apr_dbd_t *handle)
{
return driver->close(handle);
}
APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver)
{
return driver->name;
}
APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
apr_dbd_t *handle)
{
return driver->native_handle(handle);
}
APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle)
{
return driver->check_conn(pool, handle);
}
APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, const char *name)
{
return driver->set_dbname(pool,handle,name);
}
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
int *nrows, const char *statement)
{
return driver->query(handle,nrows,statement);
}
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
const char *statement, int random)
{
return driver->select(pool,handle,res,statement,random);
}
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res)
{
return driver->num_cols(res);
}
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res)
{
return driver->num_tuples(res);
}
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_results_t *res, apr_dbd_row_t **row,
int rownum)
{
return driver->get_row(pool,res,row,rownum);
}
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
apr_dbd_row_t *row, int col)
{
return driver->get_entry(row,col);
}
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
apr_dbd_t *handle, int errnum)
{
return driver->error(handle,errnum);
}
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *string,
apr_dbd_t *handle)
{
return driver->escape(pool,string,handle);
}
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, const char *query,
const char *label,
apr_dbd_prepared_t **statement)
{
return driver->prepare(pool,handle,query,label,statement);
}
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, int nargs,
const char **args)
{
return driver->pquery(pool,handle,nrows,statement,nargs,args);
}
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,
int nargs, const char **args)
{
return driver->pselect(pool,handle,res,statement,random,nargs,args);
}
APU_DECLARE(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement,...)
{
int ret;
va_list args;
va_start(args, statement);
ret = driver->pvquery(pool,handle,nrows,statement,args);
va_end(args);
return ret;
}
APU_DECLARE(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,...)
{
int ret;
va_list args;
va_start(args, random);
ret = driver->pvselect(pool,handle,res,statement,random,args);
va_end(args);
return ret;
}

View File

@ -1,664 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#if APU_HAVE_PGSQL
#include "apu_config.h"
#include <ctype.h>
#include <stdlib.h>
#ifdef HAVE_LIBPQ_FE_H
#include <libpq-fe.h>
#elif defined(HAVE_POSTGRESQL_LIBPQ_FE_H)
#include <postgresql/libpq-fe.h>
#endif
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_dbd_internal.h"
#define QUERY_MAX_ARGS 40
struct apr_dbd_transaction_t {
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
PGconn *conn;
apr_dbd_transaction_t *trans;
};
struct apr_dbd_results_t {
int random;
PGconn *handle;
PGresult *res;
size_t ntuples;
size_t sz;
size_t index;
};
struct apr_dbd_row_t {
int n;
apr_dbd_results_t *res;
};
struct apr_dbd_prepared_t {
const char *name;
int prepared;
int nargs;
};
#define dbd_pgsql_is_success(x) (((x) == PGRES_EMPTY_QUERY) \
|| ((x) == PGRES_COMMAND_OK) \
|| ((x) == PGRES_TUPLES_OK))
static apr_status_t clear_result(void *data)
{
PQclear(data);
return APR_SUCCESS;
}
static int dbd_pgsql_select(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
const char *query, int seek)
{
PGresult *res;
int ret;
if ( sql->trans && sql->trans->errnum ) {
return sql->trans->errnum;
}
if (seek) { /* synchronous query */
res = PQexec(sql->conn, query);
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
} else {
PQclear(res);
}
} else {
ret = PGRES_FATAL_ERROR;
}
if (ret != 0) {
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->res = res;
(*results)->ntuples = PQntuples(res);
(*results)->sz = PQnfields(res);
(*results)->random = seek;
apr_pool_cleanup_register(pool, res, clear_result,
apr_pool_cleanup_null);
}
else {
if (PQsendQuery(sql->conn, query) == 0) {
if (sql->trans) {
sql->trans->errnum = 1;
}
return 1;
}
if (*results == NULL) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->random = seek;
(*results)->handle = sql->conn;
}
return 0;
}
static int dbd_pgsql_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
apr_dbd_row_t **rowp, int rownum)
{
apr_dbd_row_t *row = *rowp;
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
if (row == NULL) {
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
*rowp = row;
row->res = res;
row->n = sequential ? 0 : rownum;
}
else {
if ( sequential ) {
++row->n;
}
else {
row->n = rownum;
}
}
if (res->random) {
if (row->n >= res->ntuples) {
*rowp = NULL;
apr_pool_cleanup_run(pool, res->res, clear_result);
res->res = NULL;
return -1;
}
}
else {
if (row->n >= res->ntuples) {
/* no data; we have to fetch some */
row->n -= res->ntuples;
if (res->res != NULL) {
PQclear(res->res);
}
res->res = PQgetResult(res->handle);
if (res->res) {
res->ntuples = PQntuples(res->res);
while (res->ntuples == 0) {
/* if we got an empty result, clear it, wait a mo, try
* again */
PQclear(res->res);
apr_sleep(100000); /* 0.1 secs */
res->res = PQgetResult(res->handle);
if (res->res) {
res->ntuples = PQntuples(res->res);
}
else {
return -1;
}
}
if (res->sz == 0) {
res->sz = PQnfields(res->res);
}
}
else {
return -1;
}
}
}
return 0;
}
static const char *dbd_pgsql_get_entry(const apr_dbd_row_t *row, int n)
{
return PQgetvalue(row->res->res, row->n, n);
}
static const char *dbd_pgsql_error(apr_dbd_t *sql, int n)
{
return PQerrorMessage(sql->conn);
}
static int dbd_pgsql_query(apr_dbd_t *sql, int *nrows, const char *query)
{
PGresult *res;
int ret;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
res = PQexec(sql->conn, query);
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
/* ugh, making 0 return-success doesn't fit */
ret = 0;
}
*nrows = atoi(PQcmdTuples(res));
PQclear(res);
}
else {
ret = PGRES_FATAL_ERROR;
}
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static const char *dbd_pgsql_escape(apr_pool_t *pool, const char *arg,
apr_dbd_t *sql)
{
size_t len = strlen(arg);
char *ret = apr_palloc(pool, 2*(len + 1));
PQescapeString(ret, arg, len);
return ret;
}
static int dbd_pgsql_prepare(apr_pool_t *pool, apr_dbd_t *sql,
const char *query, const char *label,
apr_dbd_prepared_t **statement)
{
char *sqlcmd;
char *sqlptr;
size_t length;
size_t i = 0;
const char *args[QUERY_MAX_ARGS];
size_t alen;
int ret;
PGresult *res;
char *pgquery;
char *pgptr;
if (!*statement) {
*statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
}
(*statement)->nargs = 0;
/* Translate from apr_dbd to native query format */
for (sqlptr = (char*)query; *sqlptr; ++sqlptr) {
if (sqlptr[0] == '%') {
if (isalpha(sqlptr[1])) {
++(*statement)->nargs;
}
else if (sqlptr[1] == '%') {
++sqlptr;
}
}
}
length = strlen(query) + 1;
if ((*statement)->nargs > 8) {
length += (*statement)->nargs - 8;
}
pgptr = pgquery = apr_palloc(pool, length) ;
for (sqlptr = (char*)query; *sqlptr; ++sqlptr) {
if ((sqlptr[0] == '%') && isalpha(sqlptr[1])) {
*pgptr++ = '$';
if (i < 9) {
*pgptr++ = '1' + i;
}
else {
*pgptr++ = '0' + ((i+1)/10);
*pgptr++ = '0' + ((i+1)%10);
}
switch (*++sqlptr) {
case 'd':
args[i] = "integer";
break;
case 's':
args[i] = "varchar";
break;
default:
args[i] = "varchar";
break;
}
length += 1 + strlen(args[i]);
++i;
}
else if ((sqlptr[0] == '%') && (sqlptr[1] == '%')) {
/* reduce %% to % */
*pgptr++ = *sqlptr++;
}
else {
*pgptr++ = *sqlptr;
}
}
*pgptr = 0;
if (!label) {
/* don't really prepare; use in execParams instead */
(*statement)->prepared = 0;
(*statement)->name = apr_pstrdup(pool, pgquery);
return 0;
}
(*statement)->name = apr_pstrdup(pool, label);
/* length of SQL query that prepares this statement */
length = 8 + strlen(label) + 2 + 4 + length + 1;
sqlcmd = apr_palloc(pool, length);
sqlptr = sqlcmd;
memcpy(sqlptr, "PREPARE ", 8);
sqlptr += 8;
length = strlen(label);
memcpy(sqlptr, label, length);
sqlptr += length;
if ((*statement)->nargs > 0) {
memcpy(sqlptr, " (",2);
sqlptr += 2;
for (i=0; i < (*statement)->nargs; ++i) {
alen = strlen(args[i]);
memcpy(sqlptr, args[i], alen);
sqlptr += alen;
*sqlptr++ = ',';
}
sqlptr[-1] = ')';
}
memcpy(sqlptr, " AS ", 4);
sqlptr += 4;
memcpy(sqlptr, pgquery, strlen(pgquery));
sqlptr += strlen(pgquery);
*sqlptr = 0;
res = PQexec(sql->conn, sqlcmd);
if ( res ) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
}
/* Hmmm, do we do this here or register it on the pool? */
PQclear(res);
}
else {
ret = PGRES_FATAL_ERROR;
}
(*statement)->prepared = 1;
return ret;
}
static int dbd_pgsql_pquery(apr_pool_t *pool, apr_dbd_t *sql,
int *nrows, apr_dbd_prepared_t *statement,
int nargs, const char **values)
{
int ret;
PGresult *res;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
if (statement->prepared) {
res = PQexecPrepared(sql->conn, statement->name, nargs, values, 0, 0,
0);
}
else {
res = PQexecParams(sql->conn, statement->name, nargs, 0, values, 0, 0,
0);
}
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
}
*nrows = atoi(PQcmdTuples(res));
PQclear(res);
}
else {
ret = PGRES_FATAL_ERROR;
}
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_pgsql_pvquery(apr_pool_t *pool, apr_dbd_t *sql,
int *nrows, apr_dbd_prepared_t *statement,
va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
for (i = 0; i < statement->nargs; i++) {
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
}
return dbd_pgsql_pquery(pool, sql, nrows, statement,
statement->nargs, values);
}
static int dbd_pgsql_pselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, int nargs, const char **values)
{
PGresult *res;
int rv;
int ret = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
if (seek) { /* synchronous query */
if (statement->prepared) {
res = PQexecPrepared(sql->conn, statement->name, nargs, values, 0,
0, 0);
}
else {
res = PQexecParams(sql->conn, statement->name, nargs, 0, values, 0,
0, 0);
}
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
}
else {
PQclear(res);
}
}
else {
ret = PGRES_FATAL_ERROR;
}
if (ret != 0) {
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->res = res;
(*results)->ntuples = PQntuples(res);
(*results)->sz = PQnfields(res);
(*results)->random = seek;
apr_pool_cleanup_register(pool, res, clear_result,
apr_pool_cleanup_null);
}
else {
if (statement->prepared) {
rv = PQsendQueryPrepared(sql->conn, statement->name, nargs, values,
0, 0, 0);
}
else {
rv = PQsendQueryParams(sql->conn, statement->name, nargs, 0,
values, 0, 0, 0);
}
if (rv == 0) {
if (sql->trans) {
sql->trans->errnum = 1;
}
return 1;
}
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->random = seek;
(*results)->handle = sql->conn;
}
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_pgsql_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
for (i = 0; i < statement->nargs; i++) {
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
}
return dbd_pgsql_pselect(pool, sql, results, statement,
seek, statement->nargs, values) ;
}
static int dbd_pgsql_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int ret = 0;
PGresult *res;
/* XXX handle recursive transactions here */
res = PQexec(handle->conn, "BEGIN TRANSACTION");
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
}
}
PQclear(res);
(*trans)->handle = handle;
handle->trans = *trans;
}
else {
ret = PGRES_FATAL_ERROR;
}
return ret;
}
static int dbd_pgsql_end_transaction(apr_dbd_transaction_t *trans)
{
PGresult *res;
int ret = -1; /* no transaction is an error cond */
if (trans) {
if (trans->errnum) {
trans->errnum = 0;
res = PQexec(trans->handle->conn, "ROLLBACK");
}
else {
res = PQexec(trans->handle->conn, "COMMIT");
}
if (res) {
ret = PQresultStatus(res);
if (dbd_pgsql_is_success(ret)) {
ret = 0;
}
PQclear(res);
}
else {
ret = PGRES_FATAL_ERROR;
}
trans->handle->trans = NULL;
}
return ret;
}
static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params)
{
apr_dbd_t *sql;
PGconn *conn = PQconnectdb(params);
/* if there's an error in the connect string or something we get
* back a * bogus connection object, and things like PQreset are
* liable to segfault, so just close it out now. it would be nice
* if we could give an indication of why we failed to connect... */
if (PQstatus(conn) != CONNECTION_OK) {
PQfinish(conn);
return NULL;
}
sql = apr_pcalloc (pool, sizeof (*sql));
sql->conn = conn;
return sql;
}
static apr_status_t dbd_pgsql_close(apr_dbd_t *handle)
{
PQfinish(handle->conn);
return APR_SUCCESS;
}
static apr_status_t dbd_pgsql_check_conn(apr_pool_t *pool,
apr_dbd_t *handle)
{
if (PQstatus(handle->conn) != CONNECTION_OK) {
PQreset(handle->conn);
if (PQstatus(handle->conn) != CONNECTION_OK) {
return APR_EGENERAL;
}
}
return APR_SUCCESS;
}
static int dbd_pgsql_select_db(apr_pool_t *pool, apr_dbd_t *handle,
const char *name)
{
return APR_ENOTIMPL;
}
static void *dbd_pgsql_native(apr_dbd_t *handle)
{
return handle->conn;
}
static int dbd_pgsql_num_cols(apr_dbd_results_t* res)
{
return res->sz;
}
static int dbd_pgsql_num_tuples(apr_dbd_results_t* res)
{
if (res->random) {
return res->ntuples;
}
else {
return -1;
}
}
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_pgsql_driver = {
"pgsql",
NULL,
dbd_pgsql_native,
dbd_pgsql_open,
dbd_pgsql_check_conn,
dbd_pgsql_close,
dbd_pgsql_select_db,
dbd_pgsql_start_transaction,
dbd_pgsql_end_transaction,
dbd_pgsql_query,
dbd_pgsql_select,
dbd_pgsql_num_cols,
dbd_pgsql_num_tuples,
dbd_pgsql_get_row,
dbd_pgsql_get_entry,
dbd_pgsql_error,
dbd_pgsql_escape,
dbd_pgsql_prepare,
dbd_pgsql_pvquery,
dbd_pgsql_pvselect,
dbd_pgsql_pquery,
dbd_pgsql_pselect,
};
#endif

View File

@ -1,396 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#if APU_HAVE_SQLITE2
#include <ctype.h>
#include <stdlib.h>
#include <sqlite.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_dbd_internal.h"
struct apr_dbd_transaction_t {
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
sqlite *conn;
char *errmsg;
apr_dbd_transaction_t *trans;
};
struct apr_dbd_results_t {
int random;
sqlite *handle;
char **res;
size_t ntuples;
size_t sz;
size_t index;
};
struct apr_dbd_row_t {
int n;
char **data;
apr_dbd_results_t *res;
};
struct apr_dbd_prepared_t {
const char *name;
int prepared;
};
#define FREE_ERROR_MSG(dbd) \
do { \
if(dbd && dbd->errmsg) { \
free(dbd->errmsg); \
dbd->errmsg = NULL; \
} \
} while(0);
static apr_status_t free_table(void *data)
{
sqlite_free_table(data);
return APR_SUCCESS;
}
static int dbd_sqlite_select(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results, const char *query,
int seek)
{
char **result;
int ret = 0;
int tuples = 0;
int fields = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
FREE_ERROR_MSG(sql);
ret = sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
&sql->errmsg);
if (ret == SQLITE_OK) {
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->res = result;
(*results)->ntuples = tuples;
(*results)->sz = fields;
(*results)->random = seek;
if (tuples > 0)
apr_pool_cleanup_register(pool, result, free_table,
apr_pool_cleanup_null);
ret = 0;
}
else {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite_get_row(apr_pool_t * pool, apr_dbd_results_t * res,
apr_dbd_row_t ** rowp, int rownum)
{
apr_dbd_row_t *row = *rowp;
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
if (row == NULL) {
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
*rowp = row;
row->res = res;
row->n = sequential ? 0 : rownum - 1;
}
else {
if (sequential) {
++row->n;
}
else {
row->n = rownum - 1;
}
}
if (row->n >= res->ntuples) {
*rowp = NULL;
apr_pool_cleanup_run(pool, res->res, free_table);
res->res = NULL;
return -1;
}
/* Pointer magic explanation:
* The sqlite result is an array such that the first res->sz elements are
* the column names and each tuple follows afterwards
* ex: (from the sqlite2 documentation)
SELECT employee_name, login, host FROM users WHERE login LIKE * 'd%';
nrow = 2
ncolumn = 3
result[0] = "employee_name"
result[1] = "login"
result[2] = "host"
result[3] = "dummy"
result[4] = "No such user"
result[5] = 0
result[6] = "D. Richard Hipp"
result[7] = "drh"
result[8] = "zadok"
*/
row->data = res->res + res->sz + (res->sz * row->n);
return 0;
}
static const char *dbd_sqlite_get_entry(const apr_dbd_row_t * row, int n)
{
if ((n < 0) || (n >= row->res->sz)) {
return NULL;
}
return row->data[n];
}
static const char *dbd_sqlite_error(apr_dbd_t * sql, int n)
{
return sql->errmsg;
}
static int dbd_sqlite_query(apr_dbd_t * sql, int *nrows, const char *query)
{
char **result;
int ret;
int tuples = 0;
int fields = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
FREE_ERROR_MSG(sql);
ret =
sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
&sql->errmsg);
if (ret == SQLITE_OK) {
*nrows = sqlite_changes(sql->conn);
if (tuples > 0)
free(result);
ret = 0;
}
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static apr_status_t free_mem(void *data)
{
sqlite_freemem(data);
return APR_SUCCESS;
}
static const char *dbd_sqlite_escape(apr_pool_t * pool, const char *arg,
apr_dbd_t * sql)
{
char *ret = sqlite_mprintf("%q", arg);
apr_pool_cleanup_register(pool, ret, free_mem, apr_pool_cleanup_null);
return ret;
}
static int dbd_sqlite_prepare(apr_pool_t * pool, apr_dbd_t * sql,
const char *query, const char *label,
apr_dbd_prepared_t ** statement)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
int nargs, const char **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement,
int seek, int nargs, const char **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement, int seek,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_start_transaction(apr_pool_t * pool, apr_dbd_t * handle,
apr_dbd_transaction_t ** trans)
{
int ret, rows;
ret = dbd_sqlite_query(handle, &rows, "BEGIN TRANSACTION");
if (ret == 0) {
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
}
(*trans)->handle = handle;
handle->trans = *trans;
}
else {
ret = -1;
}
return ret;
}
static int dbd_sqlite_end_transaction(apr_dbd_transaction_t * trans)
{
int rows;
int ret = -1; /* no transaction is an error cond */
if (trans) {
if (trans->errnum) {
trans->errnum = 0;
ret =
dbd_sqlite_query(trans->handle, &rows,
"ROLLBACK TRANSACTION");
}
else {
ret =
dbd_sqlite_query(trans->handle, &rows, "COMMIT TRANSACTION");
}
trans->handle->trans = NULL;
}
return ret;
}
static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_)
{
apr_dbd_t *sql;
sqlite *conn = NULL;
char *perm;
int iperms = 600;
char* params = apr_pstrdup(pool, params_);
/* params = "[filename]:[permissions]"
* example: "shopping.db:600"
*/
perm = strstr(params, ":");
if (perm) {
*(perm++) = '\x00'; /* split the filename and permissions */
if (strlen(perm) > 0)
iperms = atoi(perm);
}
conn = sqlite_open(params, iperms, NULL);
sql = apr_pcalloc(pool, sizeof(*sql));
sql->conn = conn;
return sql;
}
static apr_status_t dbd_sqlite_close(apr_dbd_t * handle)
{
if (handle->conn) {
sqlite_close(handle->conn);
handle->conn = NULL;
}
return APR_SUCCESS;
}
static apr_status_t dbd_sqlite_check_conn(apr_pool_t * pool,
apr_dbd_t * handle)
{
if (handle->conn == NULL)
return -1;
return APR_SUCCESS;
}
static int dbd_sqlite_select_db(apr_pool_t * pool, apr_dbd_t * handle,
const char *name)
{
return APR_ENOTIMPL;
}
static void *dbd_sqlite_native(apr_dbd_t * handle)
{
return handle->conn;
}
static int dbd_sqlite_num_cols(apr_dbd_results_t * res)
{
return res->sz;
}
static int dbd_sqlite_num_tuples(apr_dbd_results_t * res)
{
return res->ntuples;
}
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite2_driver = {
"sqlite2",
NULL,
dbd_sqlite_native,
dbd_sqlite_open,
dbd_sqlite_check_conn,
dbd_sqlite_close,
dbd_sqlite_select_db,
dbd_sqlite_start_transaction,
dbd_sqlite_end_transaction,
dbd_sqlite_query,
dbd_sqlite_select,
dbd_sqlite_num_cols,
dbd_sqlite_num_tuples,
dbd_sqlite_get_row,
dbd_sqlite_get_entry,
dbd_sqlite_error,
dbd_sqlite_escape,
dbd_sqlite_prepare,
dbd_sqlite_pvquery,
dbd_sqlite_pvselect,
dbd_sqlite_pquery,
dbd_sqlite_pselect,
};
#endif

View File

@ -1,723 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#if APU_HAVE_SQLITE3
#include <ctype.h>
#include <stdlib.h>
#include <sqlite3.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_dbd_internal.h"
#define MAX_RETRY_COUNT 15
#define MAX_RETRY_SLEEP 100000
struct apr_dbd_transaction_t {
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
sqlite3 *conn;
apr_dbd_transaction_t *trans;
#if APR_HAS_THREADS
apr_thread_mutex_t *mutex;
#endif
apr_pool_t *pool;
apr_dbd_prepared_t *prep;
};
typedef struct {
char *name;
char *value;
int size;
int type;
} apr_dbd_column_t;
struct apr_dbd_row_t {
apr_dbd_results_t *res;
apr_dbd_column_t **columns;
apr_dbd_row_t *next_row;
int columnCount;
int rownum;
};
struct apr_dbd_results_t {
int random;
sqlite3 *handle;
sqlite3_stmt *stmt;
apr_dbd_row_t *next_row;
size_t sz;
int tuples;
char **col_names;
};
struct apr_dbd_prepared_t {
sqlite3_stmt *stmt;
apr_dbd_prepared_t *next;
};
#define dbd_sqlite3_is_success(x) (((x) == SQLITE_DONE ) \
|| ((x) == SQLITE_OK ))
static int dbd_sqlite3_select(apr_pool_t * pool, apr_dbd_t * sql, apr_dbd_results_t ** results, const char *query, int seek)
{
sqlite3_stmt *stmt = NULL;
const char *tail = NULL;
int i, ret, retry_count = 0;
size_t num_tuples = 0;
int increment = 0;
apr_dbd_row_t *row = NULL;
apr_dbd_row_t *lastrow = NULL;
apr_dbd_column_t *column;
char *hold = NULL;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
if (!dbd_sqlite3_is_success(ret)) {
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
return ret;
} else {
int column_count;
column_count = sqlite3_column_count(stmt);
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->stmt = stmt;
(*results)->sz = column_count;
(*results)->random = seek;
(*results)->next_row = 0;
(*results)->tuples = 0;
(*results)->col_names = apr_pcalloc(pool,
column_count * sizeof(char *));
do {
ret = sqlite3_step(stmt);
if (ret == SQLITE_BUSY) {
if (retry_count++ > MAX_RETRY_COUNT) {
ret = SQLITE_ERROR;
} else {
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
apr_sleep(MAX_RETRY_SLEEP);
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
}
} else if (ret == SQLITE_ROW) {
int length;
apr_dbd_column_t *col;
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
row->res = *results;
increment = sizeof(apr_dbd_column_t *);
length = increment * (*results)->sz;
row->columns = apr_palloc(pool, length);
row->columnCount = column_count;
for (i = 0; i < (*results)->sz; i++) {
column = apr_palloc(pool, sizeof(apr_dbd_column_t));
row->columns[i] = column;
/* copy column name once only */
if ((*results)->col_names[i] == NULL) {
(*results)->col_names[i] =
apr_pstrdup(pool, sqlite3_column_name(stmt, i));
}
column->name = (*results)->col_names[i];
column->size = sqlite3_column_bytes(stmt, i);
column->type = sqlite3_column_type(stmt, i);
column->value = NULL;
switch (column->type) {
case SQLITE_FLOAT:
case SQLITE_INTEGER:
case SQLITE_TEXT:
hold = NULL;
hold = (char *) sqlite3_column_text(stmt, i);
if (hold) {
column->value = apr_palloc(pool, column->size + 1);
strncpy(column->value, hold, column->size + 1);
}
break;
case SQLITE_BLOB:
break;
case SQLITE_NULL:
break;
}
col = row->columns[i];
}
row->rownum = num_tuples++;
row->next_row = 0;
(*results)->tuples = num_tuples;
if ((*results)->next_row == 0) {
(*results)->next_row = row;
}
if (lastrow != 0) {
lastrow->next_row = row;
}
lastrow = row;
} else if (ret == SQLITE_DONE) {
ret = SQLITE_OK;
}
} while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
}
ret = sqlite3_finalize(stmt);
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
apr_dbd_row_t **rowp, int rownum)
{
int i = 0;
if (rownum == -1) {
*rowp = res->next_row;
if (*rowp == 0)
return -1;
res->next_row = (*rowp)->next_row;
return 0;
}
if (rownum > res->tuples) {
return -1;
}
rownum--;
*rowp = res->next_row;
for (; *rowp != 0; i++, *rowp = (*rowp)->next_row) {
if (i == rownum) {
return 0;
}
}
return -1;
}
static const char *dbd_sqlite3_get_entry(const apr_dbd_row_t *row, int n)
{
apr_dbd_column_t *column;
const char *value;
if ((n < 0) || (n >= row->columnCount)) {
return NULL;
}
column = row->columns[n];
value = column->value;
return value;
}
static const char *dbd_sqlite3_error(apr_dbd_t *sql, int n)
{
return sqlite3_errmsg(sql->conn);
}
static int dbd_sqlite3_query(apr_dbd_t *sql, int *nrows, const char *query)
{
sqlite3_stmt *stmt = NULL;
const char *tail = NULL;
int ret = -1, length = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
length = strlen(query);
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
do {
int retry_count = 0;
ret = sqlite3_prepare(sql->conn, query, length, &stmt, &tail);
if (ret != SQLITE_OK) {
sqlite3_finalize(stmt);
break;
}
while(retry_count++ <= MAX_RETRY_COUNT) {
ret = sqlite3_step(stmt);
if (ret != SQLITE_BUSY)
break;
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
apr_sleep(MAX_RETRY_SLEEP);
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
}
*nrows = sqlite3_changes(sql->conn);
sqlite3_finalize(stmt);
length -= (tail - query);
query = tail;
} while (length > 0);
if (dbd_sqlite3_is_success(ret)) {
ret = 0;
}
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static apr_status_t free_mem(void *data)
{
sqlite3_free(data);
return APR_SUCCESS;
}
static const char *dbd_sqlite3_escape(apr_pool_t *pool, const char *arg,
apr_dbd_t *sql)
{
char *ret = sqlite3_mprintf("%q", arg);
apr_pool_cleanup_register(pool, ret, free_mem,
apr_pool_cleanup_null);
return ret;
}
static int dbd_sqlite3_prepare(apr_pool_t *pool, apr_dbd_t *sql,
const char *query, const char *label,
apr_dbd_prepared_t **statement)
{
sqlite3_stmt *stmt;
char *p, *slquery = apr_pstrdup(pool, query);
const char *tail = NULL, *q;
int ret;
for (p = slquery, q = query; *q; ++q) {
if (q[0] == '%') {
if (isalpha(q[1])) {
*p++ = '?';
++q;
}
else if (q[1] == '%') {
/* reduce %% to % */
*p++ = *q++;
}
else {
*p++ = *q;
}
}
else {
*p++ = *q;
}
}
*p = 0;
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
ret = sqlite3_prepare(sql->conn, slquery, strlen(query), &stmt, &tail);
if (ret == SQLITE_OK) {
apr_dbd_prepared_t *prep;
prep = apr_pcalloc(sql->pool, sizeof(*prep));
prep->stmt = stmt;
prep->next = sql->prep;
/* link new statement to the handle */
sql->prep = prep;
*statement = prep;
} else {
sqlite3_finalize(stmt);
}
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
return ret;
}
static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql,
int *nrows, apr_dbd_prepared_t *statement,
int nargs, const char **values)
{
sqlite3_stmt *stmt = statement->stmt;
int ret = -1, retry_count = 0, i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
for (i=0; i < nargs; i++) {
sqlite3_bind_text(stmt, i + 1, values[i], strlen(values[i]),
SQLITE_STATIC);
}
while(retry_count++ <= MAX_RETRY_COUNT) {
ret = sqlite3_step(stmt);
if (ret != SQLITE_BUSY)
break;
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
apr_sleep(MAX_RETRY_SLEEP);
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
}
*nrows = sqlite3_changes(sql->conn);
sqlite3_reset(stmt);
}
if (dbd_sqlite3_is_success(ret)) {
ret = 0;
}
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
apr_dbd_prepared_t *statement, va_list args)
{
const char **values;
int i, nargs;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
nargs = sqlite3_bind_parameter_count(statement->stmt);
values = apr_palloc(pool, sizeof(*values) * nargs);
for (i = 0; i < nargs; i++) {
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
}
return dbd_sqlite3_pquery(pool, sql, nrows, statement, nargs, values);
}
static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement, int seek,
int nargs, const char **values)
{
sqlite3_stmt *stmt = statement->stmt;
int i, ret, retry_count = 0;
size_t num_tuples = 0;
int increment = 0;
apr_dbd_row_t *row = NULL;
apr_dbd_row_t *lastrow = NULL;
apr_dbd_column_t *column;
char *hold = NULL;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
int column_count;
for (i=0; i < nargs; i++) {
sqlite3_bind_text(stmt, i + 1, values[i], strlen(values[i]),
SQLITE_STATIC);
}
column_count = sqlite3_column_count(stmt);
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->stmt = stmt;
(*results)->sz = column_count;
(*results)->random = seek;
(*results)->next_row = 0;
(*results)->tuples = 0;
(*results)->col_names = apr_pcalloc(pool,
column_count * sizeof(char *));
do {
ret = sqlite3_step(stmt);
if (ret == SQLITE_BUSY) {
if (retry_count++ > MAX_RETRY_COUNT) {
ret = SQLITE_ERROR;
} else {
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
apr_sleep(MAX_RETRY_SLEEP);
#if APR_HAS_THREADS
apr_thread_mutex_lock(sql->mutex);
#endif
}
} else if (ret == SQLITE_ROW) {
int length;
apr_dbd_column_t *col;
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
row->res = *results;
increment = sizeof(apr_dbd_column_t *);
length = increment * (*results)->sz;
row->columns = apr_palloc(pool, length);
row->columnCount = column_count;
for (i = 0; i < (*results)->sz; i++) {
column = apr_palloc(pool, sizeof(apr_dbd_column_t));
row->columns[i] = column;
/* copy column name once only */
if ((*results)->col_names[i] == NULL) {
(*results)->col_names[i] =
apr_pstrdup(pool, sqlite3_column_name(stmt, i));
}
column->name = (*results)->col_names[i];
column->size = sqlite3_column_bytes(stmt, i);
column->type = sqlite3_column_type(stmt, i);
column->value = NULL;
switch (column->type) {
case SQLITE_FLOAT:
case SQLITE_INTEGER:
case SQLITE_TEXT:
hold = NULL;
hold = (char *) sqlite3_column_text(stmt, i);
if (hold) {
column->value = apr_palloc(pool, column->size + 1);
strncpy(column->value, hold, column->size + 1);
}
break;
case SQLITE_BLOB:
break;
case SQLITE_NULL:
break;
}
col = row->columns[i];
}
row->rownum = num_tuples++;
row->next_row = 0;
(*results)->tuples = num_tuples;
if ((*results)->next_row == 0) {
(*results)->next_row = row;
}
if (lastrow != 0) {
lastrow->next_row = row;
}
lastrow = row;
} else if (ret == SQLITE_DONE) {
ret = SQLITE_OK;
}
} while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
sqlite3_reset(stmt);
}
#if APR_HAS_THREADS
apr_thread_mutex_unlock(sql->mutex);
#endif
if (sql->trans) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement, int seek,
va_list args)
{
const char **values;
int i, nargs;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
nargs = sqlite3_bind_parameter_count(statement->stmt);
values = apr_palloc(pool, sizeof(*values) * nargs);
for (i = 0; i < nargs; i++) {
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
}
return dbd_sqlite3_pselect(pool, sql, results, statement,
seek, nargs, values);
}
static int dbd_sqlite3_start_transaction(apr_pool_t *pool,
apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int ret = 0;
int nrows = 0;
ret = dbd_sqlite3_query(handle, &nrows, "BEGIN");
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
(*trans)->handle = handle;
handle->trans = *trans;
}
return ret;
}
static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans)
{
int ret = -1; /* ending transaction that was never started is an error */
int nrows = 0;
if (trans) {
if (trans->errnum) {
trans->errnum = 0;
ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK");
} else {
ret = dbd_sqlite3_query(trans->handle, &nrows, "COMMIT");
}
trans->handle->trans = NULL;
}
return ret;
}
static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params)
{
apr_dbd_t *sql = NULL;
sqlite3 *conn = NULL;
apr_status_t res;
int sqlres;
if (!params)
return NULL;
sqlres = sqlite3_open(params, &conn);
if (sqlres != SQLITE_OK) {
sqlite3_close(conn);
return NULL;
}
/* should we register rand or power functions to the sqlite VM? */
sql = apr_pcalloc(pool, sizeof(*sql));
sql->conn = conn;
sql->pool = pool;
sql->trans = NULL;
#if APR_HAS_THREADS
/* Create a mutex */
res = apr_thread_mutex_create(&sql->mutex, APR_THREAD_MUTEX_DEFAULT,
pool);
if (res != APR_SUCCESS) {
return NULL;
}
#endif
return sql;
}
static apr_status_t dbd_sqlite3_close(apr_dbd_t *handle)
{
apr_dbd_prepared_t *prep = handle->prep;
/* finalize all prepared statements, or we'll get SQLITE_BUSY on close */
while (prep) {
sqlite3_finalize(prep->stmt);
prep = prep->next;
}
sqlite3_close(handle->conn);
#if APR_HAS_THREADS
apr_thread_mutex_destroy(handle->mutex);
#endif
return APR_SUCCESS;
}
static apr_status_t dbd_sqlite3_check_conn(apr_pool_t *pool,
apr_dbd_t *handle)
{
return (handle->conn != NULL) ? APR_SUCCESS : APR_EGENERAL;
}
static int dbd_sqlite3_select_db(apr_pool_t *pool, apr_dbd_t *handle,
const char *name)
{
return APR_ENOTIMPL;
}
static void *dbd_sqlite3_native(apr_dbd_t *handle)
{
return handle->conn;
}
static int dbd_sqlite3_num_cols(apr_dbd_results_t *res)
{
return res->sz;
}
static int dbd_sqlite3_num_tuples(apr_dbd_results_t *res)
{
return res->tuples;
}
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = {
"sqlite3",
NULL,
dbd_sqlite3_native,
dbd_sqlite3_open,
dbd_sqlite3_check_conn,
dbd_sqlite3_close,
dbd_sqlite3_select_db,
dbd_sqlite3_start_transaction,
dbd_sqlite3_end_transaction,
dbd_sqlite3_query,
dbd_sqlite3_select,
dbd_sqlite3_num_cols,
dbd_sqlite3_num_tuples,
dbd_sqlite3_get_row,
dbd_sqlite3_get_entry,
dbd_sqlite3_error,
dbd_sqlite3_escape,
dbd_sqlite3_prepare,
dbd_sqlite3_pvquery,
dbd_sqlite3_pvselect,
dbd_sqlite3_pquery,
dbd_sqlite3_pselect,
};
#endif

View File

@ -1,207 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_errno.h"
#include "apr_pools.h"
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#include "apr_general.h"
#include "apu.h"
#include "apu_select_dbm.h"
#include "apr_dbm.h"
#include "apr_dbm_private.h"
/* ### note: the setting of DBM_VTABLE will go away once we have multiple
### DBMs in here.
### Well, that day is here. So, do we remove DBM_VTABLE and the old
### API entirely? Oh, what to do. We need an APU_DEFAULT_DBM #define.
### Sounds like a job for autoconf. */
#if APU_USE_SDBM
#define DBM_VTABLE apr_dbm_type_sdbm
#elif APU_USE_GDBM
#define DBM_VTABLE apr_dbm_type_gdbm
#elif APU_USE_DB
#define DBM_VTABLE apr_dbm_type_db
#elif APU_USE_NDBM
#define DBM_VTABLE apr_dbm_type_ndbm
#else /* Not in the USE_xDBM list above */
#error a DBM implementation was not specified
#endif
APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **pdb, const char*type,
const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
#if APU_HAVE_GDBM
if (!strcasecmp(type, "GDBM")) {
return (*apr_dbm_type_gdbm.open)(pdb, pathname, mode, perm, pool);
}
#endif
#if APU_HAVE_SDBM
if (!strcasecmp(type, "SDBM")) {
return (*apr_dbm_type_sdbm.open)(pdb, pathname, mode, perm, pool);
}
#endif
#if APU_HAVE_DB
if (!strcasecmp(type, "DB")) {
return (*apr_dbm_type_db.open)(pdb, pathname, mode, perm, pool);
}
#endif
#if APU_HAVE_NDBM
if (!strcasecmp(type, "NDBM")) {
return (*apr_dbm_type_ndbm.open)(pdb, pathname, mode, perm, pool);
}
#endif
if (!strcasecmp(type, "default")) {
return (*DBM_VTABLE.open)(pdb, pathname, mode, perm, pool);
}
return APR_ENOTIMPL;
}
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
return (*DBM_VTABLE.open)(pdb, pathname, mode, perm, pool);
}
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm)
{
(*dbm->type->close)(dbm);
}
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue)
{
return (*dbm->type->fetch)(dbm, key, pvalue);
}
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
return (*dbm->type->store)(dbm, key, value);
}
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key)
{
return (*dbm->type->del)(dbm, key);
}
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
return (*dbm->type->exists)(dbm, key);
}
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
return (*dbm->type->firstkey)(dbm, pkey);
}
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
return (*dbm->type->nextkey)(dbm, pkey);
}
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
(*dbm->type->freedatum)(dbm, data);
}
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
char *errbuf, apr_size_t errbufsize)
{
if (errcode != NULL)
*errcode = dbm->errcode;
/* assert: errbufsize > 0 */
if (dbm->errmsg == NULL)
*errbuf = '\0';
else
(void) apr_cpystrn(errbuf, dbm->errmsg, errbufsize);
return errbuf;
}
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *p,
const char *type,
const char *pathname,
const char **used1,
const char **used2)
{
#if APU_HAVE_GDBM
if (!strcasecmp(type, "GDBM")) {
(*apr_dbm_type_gdbm.getusednames)(p,pathname,used1,used2);
return APR_SUCCESS;
}
#endif
#if APU_HAVE_SDBM
if (!strcasecmp(type, "SDBM")) {
(*apr_dbm_type_sdbm.getusednames)(p,pathname,used1,used2);
return APR_SUCCESS;
}
#endif
#if APU_HAVE_DB
if (!strcasecmp(type, "DB")) {
(*apr_dbm_type_db.getusednames)(p,pathname,used1,used2);
return APR_SUCCESS;
}
#endif
#if APU_HAVE_NDBM
if (!strcasecmp(type, "NDBM")) {
(*apr_dbm_type_ndbm.getusednames)(p,pathname,used1,used2);
return APR_SUCCESS;
}
#endif
if (!strcasecmp(type, "default")) {
(*DBM_VTABLE.getusednames)(p, pathname, used1, used2);
return APR_SUCCESS;
}
return APR_ENOTIMPL;
}
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *p,
const char *pathname,
const char **used1,
const char **used2)
{
/* ### one day, a DBM type name will be passed and we'll need to look it
### up. for now, it is constant. */
(*DBM_VTABLE.getusednames)(p, pathname, used1, used2);
}
/* Most DBM libraries take a POSIX mode for creating files. Don't trust
* the mode_t type, some platforms may not support it, int is safe.
*/
APU_DECLARE(int) apr_posix_perms2mode(apr_fileperms_t perm)
{
int mode = 0;
mode |= 0700 & (perm >> 2); /* User is off-by-2 bits */
mode |= 0070 & (perm >> 1); /* Group is off-by-1 bit */
mode |= 0007 & (perm); /* World maps 1 for 1 */
return mode;
}

View File

@ -1,403 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
#define APU_WANT_DB
#include "apu_want.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for abort() */
#endif
#include "apu.h"
#if APU_HAVE_DB
#include "apr_dbm_private.h"
/*
* We pick up all varieties of Berkeley DB through db.h (included through
* apu_select_dbm.h). This code has been compiled/tested against DB1,
* DB_185, DB2, DB3, and DB4.
*/
#if defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 4)
/* We will treat anything greater than 4.1 as DB4.
* We can treat 4.0 as DB3.
*/
#if defined(DB_VERSION_MINOR) && (DB_VERSION_MINOR >= 1)
#define DB_VER 4
#else
#define DB_VER 3
#endif
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 3)
#define DB_VER 3
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 2)
#define DB_VER 2
#else
#define DB_VER 1
#endif
typedef struct {
DB *bdb;
#if DB_VER != 1
DBC *curs;
#endif
} real_file_t;
#if DB_VER == 1
#define TXN_ARG
#else
#define TXN_ARG NULL,
#endif
#define GET_BDB(f) (((real_file_t *)(f))->bdb)
#define do_fetch(bdb, k, v) ((*(bdb)->get)(bdb, TXN_ARG &(k), &(v), 0))
#if DB_VER == 1
#include <sys/fcntl.h>
#define APR_DBM_DBMODE_RO O_RDONLY
#define APR_DBM_DBMODE_RW O_RDWR
#define APR_DBM_DBMODE_RWCREATE (O_CREAT | O_RDWR)
#define APR_DBM_DBMODE_RWTRUNC (O_CREAT | O_RDWR | O_TRUNC)
#else
#define APR_DBM_DBMODE_RO DB_RDONLY
#define APR_DBM_DBMODE_RW 0
#define APR_DBM_DBMODE_RWCREATE DB_CREATE
#define APR_DBM_DBMODE_RWTRUNC DB_TRUNCATE
#endif /* DBVER == 1 */
/* --------------------------------------------------------------------------
**
** UTILITY FUNCTIONS
*/
/* map a DB error to an apr_status_t */
static apr_status_t db2s(int dberr)
{
if (dberr != 0) {
/* ### need to fix this */
return APR_OS_START_USEERR + dberr;
}
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
if (dbm_said == APR_SUCCESS) {
dbm->errcode = 0;
dbm->errmsg = NULL;
}
else {
/* ### need to fix. dberr was tossed in db2s(). */
/* ### use db_strerror() */
dbm->errcode = dbm_said;
#if DB_VER == 1 || DB_VER == 2
dbm->errmsg = NULL;
#else
dbm->errmsg = db_strerror(dbm_said - APR_OS_START_USEERR);
#endif
rv = dbm_said;
}
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR BERKELEY DB
**
** ### we may need three sets of these: db1, db2, db3
*/
static apr_status_t vt_db_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
real_file_t file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
int dberr;
#if DB_VER >= 3
if ((dberr = db_create(&file.bdb, NULL, 0)) == 0) {
if ((dberr = (*file.bdb->open)(file.bdb,
#if DB_VER == 4
NULL,
#endif
pathname, NULL,
DB_HASH, dbmode,
apr_posix_perms2mode(perm))) != 0) {
/* close the DB handler */
(void) (*file.bdb->close)(file.bdb, 0);
}
}
file.curs = NULL;
#elif DB_VER == 2
dberr = db_open(pathname, DB_HASH, dbmode, apr_posix_perms2mode(perm),
NULL, NULL, &file.bdb);
file.curs = NULL;
#else
file.bdb = dbopen(pathname, dbmode, apr_posix_perms2mode(perm),
DB_HASH, NULL);
if (file.bdb == NULL)
return APR_EGENERAL; /* ### need a better error */
dberr = 0;
#endif
if (dberr != 0)
return db2s(dberr);
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_db;
(*pdb)->file = apr_pmemdup(pool, &file, sizeof(file));
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_db_close(apr_dbm_t *dbm)
{
(*GET_BDB(dbm->file)->close)(GET_BDB(dbm->file)
#if DB_VER != 1
, 0
#endif
);
}
static apr_status_t vt_db_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t * pvalue)
{
DBT ckey = { 0 };
DBT rd = { 0 };
int dberr;
ckey.data = key.dptr;
ckey.size = key.dsize;
dberr = do_fetch(GET_BDB(dbm->file), ckey, rd);
/* "not found" is not an error. return zero'd value. */
if (dberr ==
#if DB_VER == 1
RET_SPECIAL
#else
DB_NOTFOUND
#endif
) {
memset(&rd, 0, sizeof(rd));
dberr = 0;
}
pvalue->dptr = rd.data;
pvalue->dsize = rd.size;
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, db2s(dberr));
}
static apr_status_t vt_db_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
DBT ckey = { 0 };
DBT cvalue = { 0 };
ckey.data = key.dptr;
ckey.size = key.dsize;
cvalue.data = value.dptr;
cvalue.size = value.dsize;
rv = db2s((*GET_BDB(dbm->file)->put)(GET_BDB(dbm->file),
TXN_ARG
&ckey,
&cvalue,
0));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_db_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
DBT ckey = { 0 };
ckey.data = key.dptr;
ckey.size = key.dsize;
rv = db2s((*GET_BDB(dbm->file)->del)(GET_BDB(dbm->file),
TXN_ARG
&ckey,
0));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_db_exists(apr_dbm_t *dbm, apr_datum_t key)
{
DBT ckey = { 0 }; /* converted key */
DBT data = { 0 };
int dberr;
ckey.data = key.dptr;
ckey.size = key.dsize;
dberr = do_fetch(GET_BDB(dbm->file), ckey, data);
/* note: the result data is "loaned" to us; we don't need to free it */
/* DB returns DB_NOTFOUND if it doesn't exist. but we want to say
that *any* error means it doesn't exist. */
return dberr == 0;
}
static apr_status_t vt_db_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
real_file_t *f = dbm->file;
DBT first = { 0 };
DBT data = { 0 };
int dberr;
#if DB_VER == 1
dberr = (*f->bdb->seq)(f->bdb, &first, &data, R_FIRST);
#else
if ((dberr = (*f->bdb->cursor)(f->bdb, NULL, &f->curs
#if DB_VER >= 3 || ((DB_VERSION_MAJOR == 2) && (DB_VERSION_MINOR > 5))
, 0
#endif
)) == 0) {
dberr = (*f->curs->c_get)(f->curs, &first, &data, DB_FIRST);
if (dberr == DB_NOTFOUND) {
memset(&first, 0, sizeof(first));
(*f->curs->c_close)(f->curs);
f->curs = NULL;
dberr = 0;
}
}
#endif
pkey->dptr = first.data;
pkey->dsize = first.size;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, db2s(dberr));
}
static apr_status_t vt_db_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
real_file_t *f = dbm->file;
DBT ckey = { 0 };
DBT data = { 0 };
int dberr;
ckey.data = pkey->dptr;
ckey.size = pkey->dsize;
#if DB_VER == 1
dberr = (*f->bdb->seq)(f->bdb, &ckey, &data, R_NEXT);
if (dberr == RET_SPECIAL) {
dberr = 0;
ckey.data = NULL;
ckey.size = 0;
}
#else
if (f->curs == NULL)
return APR_EINVAL;
dberr = (*f->curs->c_get)(f->curs, &ckey, &data, DB_NEXT);
if (dberr == DB_NOTFOUND) {
(*f->curs->c_close)(f->curs);
f->curs = NULL;
dberr = 0;
ckey.data = NULL;
ckey.size = 0;
}
#endif
pkey->dptr = ckey.data;
pkey->dsize = ckey.size;
/* store any error info into DBM, and return a status code. */
/* ### or use db2s(dberr) instead of APR_SUCCESS? */
return set_error(dbm, APR_SUCCESS);
}
static void vt_db_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
/* nothing to do */
}
static void vt_db_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_db = {
"db",
vt_db_open,
vt_db_close,
vt_db_fetch,
vt_db_store,
vt_db_del,
vt_db_exists,
vt_db_firstkey,
vt_db_nextkey,
vt_db_freedatum,
vt_db_usednames
};
#endif /* APU_HAVE_DB */

View File

@ -1,270 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for free() */
#endif
#include "apu.h"
#if APU_HAVE_GDBM
#include "apr_dbm_private.h"
#include <gdbm.h>
/* this is used in a few places to define a noop "function". it is needed
to stop "no effect" warnings from GCC. */
#define NOOP_FUNCTION if (0) ; else
/* ### define defaults for now; these will go away in a while */
#define REGISTER_CLEANUP(dbm, pdatum) NOOP_FUNCTION
#define SET_FILE(pdb, f) ((pdb)->file = (f))
typedef GDBM_FILE real_file_t;
typedef datum *cvt_datum_t;
#define CONVERT_DATUM(cvt, pinput) ((cvt) = (datum *)(pinput))
typedef datum result_datum_t;
#define RETURN_DATUM(poutput, rd) (*(poutput) = *(apr_datum_t *)&(rd))
#define APR_DBM_CLOSE(f) gdbm_close(f)
#define APR_DBM_FETCH(f, k, v) ((v) = gdbm_fetch(f, *(k)), APR_SUCCESS)
#define APR_DBM_STORE(f, k, v) g2s(gdbm_store(f, *(k), *(v), GDBM_REPLACE))
#define APR_DBM_DELETE(f, k) g2s(gdbm_delete(f, *(k)))
#define APR_DBM_FIRSTKEY(f, k) ((k) = gdbm_firstkey(f), APR_SUCCESS)
#define APR_DBM_NEXTKEY(f, k, nk) ((nk) = gdbm_nextkey(f, *(k)), APR_SUCCESS)
#define APR_DBM_FREEDPTR(dptr) ((dptr) ? free(dptr) : 0)
#undef REGISTER_CLEANUP
#define REGISTER_CLEANUP(dbm, pdatum) \
if ((pdatum)->dptr) \
apr_pool_cleanup_register((dbm)->pool, (pdatum)->dptr, \
datum_cleanup, apr_pool_cleanup_null); \
else
#define APR_DBM_DBMODE_RO GDBM_READER
#define APR_DBM_DBMODE_RW GDBM_WRITER
#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
#define APR_DBM_DBMODE_RWTRUNC GDBM_NEWDB
/* map a GDBM error to an apr_status_t */
static apr_status_t g2s(int gerr)
{
if (gerr == -1) {
/* ### need to fix this */
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static apr_status_t datum_cleanup(void *dptr)
{
if (dptr)
free(dptr);
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
if ((dbm->errcode = gdbm_errno) == GDBM_NO_ERROR) {
dbm->errmsg = NULL;
}
else {
dbm->errmsg = gdbm_strerror(gdbm_errno);
rv = APR_EGENERAL; /* ### need something better */
}
/* captured it. clear it now. */
gdbm_errno = GDBM_NO_ERROR;
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR GDBM
*/
static apr_status_t vt_gdbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
real_file_t file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
/* Note: stupid cast to get rid of "const" on the pathname */
file = gdbm_open((char *) pathname, 0, dbmode,
apr_posix_perms2mode(perm), NULL);
if (file == NULL)
return APR_EGENERAL; /* ### need a better error */
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_gdbm;
SET_FILE(*pdb, file);
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_gdbm_close(apr_dbm_t *dbm)
{
APR_DBM_CLOSE(dbm->file);
}
static apr_status_t vt_gdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t * pvalue)
{
apr_status_t rv;
cvt_datum_t ckey;
result_datum_t rd;
CONVERT_DATUM(ckey, &key);
rv = APR_DBM_FETCH(dbm->file, ckey, rd);
RETURN_DATUM(pvalue, rd);
REGISTER_CLEANUP(dbm, pvalue);
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, rv);
}
static apr_status_t vt_gdbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
cvt_datum_t ckey;
cvt_datum_t cvalue;
CONVERT_DATUM(ckey, &key);
CONVERT_DATUM(cvalue, &value);
rv = APR_DBM_STORE(dbm->file, ckey, cvalue);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_gdbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
cvt_datum_t ckey;
CONVERT_DATUM(ckey, &key);
rv = APR_DBM_DELETE(dbm->file, ckey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_gdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
datum *ckey = (datum *)&key;
return gdbm_exists(dbm->file, *ckey) != 0;
}
static apr_status_t vt_gdbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
apr_status_t rv;
result_datum_t rd;
rv = APR_DBM_FIRSTKEY(dbm->file, rd);
RETURN_DATUM(pkey, rd);
REGISTER_CLEANUP(dbm, pkey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_gdbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
apr_status_t rv;
cvt_datum_t ckey;
result_datum_t rd;
CONVERT_DATUM(ckey, pkey);
rv = APR_DBM_NEXTKEY(dbm->file, ckey, rd);
RETURN_DATUM(pkey, rd);
REGISTER_CLEANUP(dbm, pkey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_gdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
(void) apr_pool_cleanup_run(dbm->pool, data.dptr, datum_cleanup);
}
static void vt_gdbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_gdbm = {
"gdbm",
vt_gdbm_open,
vt_gdbm_close,
vt_gdbm_fetch,
vt_gdbm_store,
vt_gdbm_del,
vt_gdbm_exists,
vt_gdbm_firstkey,
vt_gdbm_nextkey,
vt_gdbm_freedatum,
vt_gdbm_usednames
};
#endif /* APU_HAVE_GDBM */

View File

@ -1,227 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for free() */
#endif
#include "apu.h"
#if APU_HAVE_NDBM
#include "apr_dbm_private.h"
#include <ndbm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* this is used in a few places to define a noop "function". it is needed
to stop "no effect" warnings from GCC. */
#define NOOP_FUNCTION if (0) ; else
#define APR_DBM_DBMODE_RO O_RDONLY
#define APR_DBM_DBMODE_RW O_RDWR
#define APR_DBM_DBMODE_RWCREATE (O_RDWR|O_CREAT)
#define APR_DBM_DBMODE_RWTRUNC (O_RDWR|O_CREAT|O_TRUNC)
/* map a NDBM error to an apr_status_t */
static apr_status_t ndbm2s(int ndbmerr)
{
if (ndbmerr == -1) {
/* ### need to fix this */
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
dbm->errmsg = NULL;
if (dbm_error((DBM*)dbm->file)) {
dbm->errmsg = NULL;
rv = APR_EGENERAL; /* ### need something better */
}
/* captured it. clear it now. */
dbm_clearerr((DBM*)dbm->file);
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR NDBM
*/
static apr_status_t vt_ndbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
DBM *file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
file = dbm_open(pathname, dbmode, apr_posix_perms2mode(perm));
if (file == NULL)
return APR_EGENERAL; /* ### need a better error */
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_ndbm;
(*pdb)->file = file;
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_ndbm_close(apr_dbm_t *dbm)
{
dbm_close(dbm->file);
}
static apr_status_t vt_ndbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t * pvalue)
{
datum *ckey;
datum rd;
ckey = (datum*)&key;
rd = dbm_fetch(dbm->file, *ckey);
*pvalue = *(apr_datum_t*)&rd;
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_ndbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
datum *ckey;
datum *cvalue;
ckey = (datum*)&key;
cvalue = (datum*)&value;
rv = ndbm2s( dbm_store( dbm->file, *ckey, *cvalue, DBM_REPLACE));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_ndbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
datum *ckey;
ckey = (datum*)&key;
rv = ndbm2s( dbm_delete(dbm->file, *ckey));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_ndbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
datum *ckey = (datum *)&key;
datum value;
value = dbm_fetch( dbm->file, *ckey);
return value.dptr != NULL;
}
static apr_status_t vt_ndbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
datum rd;
rd = dbm_firstkey(dbm->file);
*pkey = *(apr_datum_t*)&rd;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_ndbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
datum *ckey;
datum rd;
ckey = (datum*)pkey;
rd = dbm_nextkey(dbm->file);
*pkey = *(apr_datum_t*)&rd;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_ndbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
/* nothing to do */
}
static void vt_ndbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_ndbm = {
"ndbm",
vt_ndbm_open,
vt_ndbm_close,
vt_ndbm_fetch,
vt_ndbm_store,
vt_ndbm_del,
vt_ndbm_exists,
vt_ndbm_firstkey,
vt_ndbm_nextkey,
vt_ndbm_freedatum,
vt_ndbm_usednames
};
#endif /* APU_HAVE_NDBM */

View File

@ -1,265 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#include "apu.h"
#if APU_HAVE_SDBM
#include "apr_dbm_private.h"
#include "apr_sdbm.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* For abort() */
#endif
/* this is used in a few places to define a noop "function". it is needed
to stop "no effect" warnings from GCC. */
#define NOOP_FUNCTION if (0) ; else
/* ### define defaults for now; these will go away in a while */
#define REGISTER_CLEANUP(dbm, pdatum) NOOP_FUNCTION
#define SET_FILE(pdb, f) ((pdb)->file = (f))
typedef apr_sdbm_t *real_file_t;
typedef apr_sdbm_datum_t cvt_datum_t;
#define CONVERT_DATUM(cvt, pinput) ((cvt).dptr = (pinput)->dptr, (cvt).dsize = (pinput)->dsize)
typedef apr_sdbm_datum_t result_datum_t;
#define RETURN_DATUM(poutput, rd) ((poutput)->dptr = (rd).dptr, (poutput)->dsize = (rd).dsize)
#define APR_DBM_CLOSE(f) apr_sdbm_close(f)
#define APR_DBM_FETCH(f, k, v) apr_sdbm_fetch(f, &(v), (k))
#define APR_DBM_STORE(f, k, v) apr_sdbm_store(f, (k), (v), APR_SDBM_REPLACE)
#define APR_DBM_DELETE(f, k) apr_sdbm_delete(f, (k))
#define APR_DBM_FIRSTKEY(f, k) apr_sdbm_firstkey(f, &(k))
#define APR_DBM_NEXTKEY(f, k, nk) apr_sdbm_nextkey(f, &(nk))
#define APR_DBM_FREEDPTR(dptr) NOOP_FUNCTION
#define APR_DBM_DBMODE_RO APR_READ
#define APR_DBM_DBMODE_RW (APR_READ | APR_WRITE)
#define APR_DBM_DBMODE_RWCREATE (APR_READ | APR_WRITE | APR_CREATE)
#define APR_DBM_DBMODE_RWTRUNC (APR_READ | APR_WRITE | APR_CREATE | \
APR_TRUNCATE)
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
if ((dbm->errcode = dbm_said) == APR_SUCCESS) {
dbm->errmsg = NULL;
}
else {
dbm->errmsg = "I/O error occurred.";
rv = APR_EGENERAL; /* ### need something better */
}
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR SDBM
*/
static apr_status_t vt_sdbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
real_file_t file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
apr_status_t rv;
rv = apr_sdbm_open(&file, pathname, dbmode, perm, pool);
if (rv != APR_SUCCESS)
return rv;
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_sdbm;
SET_FILE(*pdb, file);
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_sdbm_close(apr_dbm_t *dbm)
{
APR_DBM_CLOSE(dbm->file);
}
static apr_status_t vt_sdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t * pvalue)
{
apr_status_t rv;
cvt_datum_t ckey;
result_datum_t rd;
CONVERT_DATUM(ckey, &key);
rv = APR_DBM_FETCH(dbm->file, ckey, rd);
RETURN_DATUM(pvalue, rd);
REGISTER_CLEANUP(dbm, pvalue);
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
cvt_datum_t ckey;
cvt_datum_t cvalue;
CONVERT_DATUM(ckey, &key);
CONVERT_DATUM(cvalue, &value);
rv = APR_DBM_STORE(dbm->file, ckey, cvalue);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
cvt_datum_t ckey;
CONVERT_DATUM(ckey, &key);
rv = APR_DBM_DELETE(dbm->file, ckey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_sdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
int exists;
apr_sdbm_datum_t ckey;
CONVERT_DATUM(ckey, &key);
{
apr_sdbm_datum_t value;
if (apr_sdbm_fetch(dbm->file, &value, ckey) != APR_SUCCESS) {
exists = 0;
}
else
exists = value.dptr != NULL;
}
return exists;
}
static apr_status_t vt_sdbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
apr_status_t rv;
result_datum_t rd;
rv = APR_DBM_FIRSTKEY(dbm->file, rd);
RETURN_DATUM(pkey, rd);
REGISTER_CLEANUP(dbm, pkey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
apr_status_t rv;
cvt_datum_t ckey;
result_datum_t rd;
CONVERT_DATUM(ckey, pkey);
rv = APR_DBM_NEXTKEY(dbm->file, ckey, rd);
RETURN_DATUM(pkey, rd);
REGISTER_CLEANUP(dbm, pkey);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_sdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
APR_DBM_FREEDPTR(data.dptr);
}
static void vt_sdbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
char *work;
/* ### this could be optimized by computing strlen() once and using
### memcpy and pmemdup instead. but why bother? */
*used1 = apr_pstrcat(pool, pathname, APR_SDBM_DIRFEXT, NULL);
*used2 = work = apr_pstrdup(pool, *used1);
/* we know the extension is 4 characters */
memcpy(&work[strlen(work) - 4], APR_SDBM_PAGFEXT, 4);
}
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_sdbm = {
"sdbm",
vt_sdbm_open,
vt_sdbm_close,
vt_sdbm_fetch,
vt_sdbm_store,
vt_sdbm_del,
vt_sdbm_exists,
vt_sdbm_firstkey,
vt_sdbm_nextkey,
vt_sdbm_freedatum,
vt_sdbm_usednames
};
#endif /* APU_HAVE_SDBM */

View File

@ -1,588 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
* ex-public domain, ported to APR for Apache 2
* core routines
*/
#include "apr.h"
#include "apr_file_io.h"
#include "apr_strings.h"
#include "apr_errno.h"
#include "apr_sdbm.h"
#include "sdbm_tune.h"
#include "sdbm_pair.h"
#include "sdbm_private.h"
#include <string.h> /* for memset() */
#include <stdlib.h> /* for malloc() and free() */
/*
* forward
*/
static int getdbit (apr_sdbm_t *, long);
static apr_status_t setdbit(apr_sdbm_t *, long);
static apr_status_t getpage(apr_sdbm_t *db, long);
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db);
static apr_status_t makroom(apr_sdbm_t *, long, int);
/*
* useful macros
*/
#define bad(x) ((x).dptr == NULL || (x).dsize <= 0)
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
/* ### Does anything need these externally? */
#define sdbm_dirfno(db) ((db)->dirf)
#define sdbm_pagfno(db) ((db)->pagf)
#define OFF_PAG(off) (apr_off_t) (off) * PBLKSIZ
#define OFF_DIR(off) (apr_off_t) (off) * DBLKSIZ
static long masks[] = {
000000000000, 000000000001, 000000000003, 000000000007,
000000000017, 000000000037, 000000000077, 000000000177,
000000000377, 000000000777, 000000001777, 000000003777,
000000007777, 000000017777, 000000037777, 000000077777,
000000177777, 000000377777, 000000777777, 000001777777,
000003777777, 000007777777, 000017777777, 000037777777,
000077777777, 000177777777, 000377777777, 000777777777,
001777777777, 003777777777, 007777777777, 017777777777
};
const apr_sdbm_datum_t sdbm_nullitem = { NULL, 0 };
static apr_status_t database_cleanup(void *data)
{
apr_sdbm_t *db = data;
/*
* Can't rely on apr_sdbm_unlock, since it will merely
* decrement the refcnt if several locks are held.
*/
if (db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK))
(void) apr_file_unlock(db->dirf);
(void) apr_file_close(db->dirf);
(void) apr_file_close(db->pagf);
free(db);
return APR_SUCCESS;
}
static apr_status_t prep(apr_sdbm_t **pdb, const char *dirname, const char *pagname,
apr_int32_t flags, apr_fileperms_t perms, apr_pool_t *p)
{
apr_sdbm_t *db;
apr_status_t status;
*pdb = NULL;
db = malloc(sizeof(*db));
memset(db, 0, sizeof(*db));
db->pool = p;
/*
* adjust user flags so that WRONLY becomes RDWR,
* as required by this package. Also set our internal
* flag for RDONLY if needed.
*/
if (!(flags & APR_WRITE)) {
db->flags |= SDBM_RDONLY;
}
/*
* adjust the file open flags so that we handle locking
* on our own (don't rely on any locking behavior within
* an apr_file_t, in case it's ever introduced, and set
* our own flag.
*/
if (flags & APR_SHARELOCK) {
db->flags |= SDBM_SHARED;
flags &= ~APR_SHARELOCK;
}
flags |= APR_BINARY | APR_READ;
/*
* open the files in sequence, and stat the dirfile.
* If we fail anywhere, undo everything, return NULL.
*/
if ((status = apr_file_open(&db->dirf, dirname, flags, perms, p))
!= APR_SUCCESS)
goto error;
if ((status = apr_file_open(&db->pagf, pagname, flags, perms, p))
!= APR_SUCCESS)
goto error;
if ((status = apr_sdbm_lock(db, (db->flags & SDBM_RDONLY)
? APR_FLOCK_SHARED
: APR_FLOCK_EXCLUSIVE))
!= APR_SUCCESS)
goto error;
/* apr_pcalloc zeroed the buffers
* apr_sdbm_lock stated the dirf->size and invalidated the cache
*/
/*
* if we are opened in SHARED mode, unlock ourself
*/
if (db->flags & SDBM_SHARED)
if ((status = apr_sdbm_unlock(db)) != APR_SUCCESS)
goto error;
/* make sure that we close the database at some point */
apr_pool_cleanup_register(p, db, database_cleanup, apr_pool_cleanup_null);
/* Done! */
*pdb = db;
return APR_SUCCESS;
error:
if (db->dirf && db->pagf)
(void) apr_sdbm_unlock(db);
if (db->dirf != NULL)
(void) apr_file_close(db->dirf);
if (db->pagf != NULL) {
(void) apr_file_close(db->pagf);
}
free(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *file,
apr_int32_t flags,
apr_fileperms_t perms, apr_pool_t *p)
{
char *dirname = apr_pstrcat(p, file, APR_SDBM_DIRFEXT, NULL);
char *pagname = apr_pstrcat(p, file, APR_SDBM_PAGFEXT, NULL);
return prep(db, dirname, pagname, flags, perms, p);
}
APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db)
{
return apr_pool_cleanup_run(db->pool, db, database_cleanup);
}
APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db, apr_sdbm_datum_t *val,
apr_sdbm_datum_t key)
{
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
*val = getpair(db->pagbuf, key);
/* ### do we want a not-found result? */
}
(void) apr_sdbm_unlock(db);
return status;
}
static apr_status_t write_page(apr_sdbm_t *db, const char *buf, long pagno)
{
apr_status_t status;
apr_off_t off = OFF_PAG(pagno);
if ((status = apr_file_seek(db->pagf, APR_SET, &off)) == APR_SUCCESS)
status = apr_file_write_full(db->pagf, buf, PBLKSIZ, NULL);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
const apr_sdbm_datum_t key)
{
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (apr_sdbm_rdonly(db))
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
return status;
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
if (!delpair(db->pagbuf, key))
/* ### should we define some APRUTIL codes? */
status = APR_EGENERAL;
else
status = write_page(db, db->pagbuf, db->pagbno);
}
(void) apr_sdbm_unlock(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
apr_sdbm_datum_t val, int flags)
{
int need;
register long hash;
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (apr_sdbm_rdonly(db))
return APR_EINVAL;
need = key.dsize + val.dsize;
/*
* is the pair too big (or too small) for this database ??
*/
if (need < 0 || need > PAIRMAX)
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
return status;
if ((status = getpage(db, (hash = exhash(key)))) == APR_SUCCESS) {
/*
* if we need to replace, delete the key/data pair
* first. If it is not there, ignore.
*/
if (flags == APR_SDBM_REPLACE)
(void) delpair(db->pagbuf, key);
else if (!(flags & APR_SDBM_INSERTDUP) && duppair(db->pagbuf, key)) {
status = APR_EEXIST;
goto error;
}
/*
* if we do not have enough room, we have to split.
*/
if (!fitpair(db->pagbuf, need))
if ((status = makroom(db, hash, need)) != APR_SUCCESS)
goto error;
/*
* we have enough room or split is successful. insert the key,
* and update the page file.
*/
(void) putpair(db->pagbuf, key, val);
status = write_page(db, db->pagbuf, db->pagbno);
}
error:
(void) apr_sdbm_unlock(db);
return status;
}
/*
* makroom - make room by splitting the overfull page
* this routine will attempt to make room for SPLTMAX times before
* giving up.
*/
static apr_status_t makroom(apr_sdbm_t *db, long hash, int need)
{
long newp;
char twin[PBLKSIZ];
char *pag = db->pagbuf;
char *new = twin;
register int smax = SPLTMAX;
apr_status_t status;
do {
/*
* split the current page
*/
(void) splpage(pag, new, db->hmask + 1);
/*
* address of the new page
*/
newp = (hash & db->hmask) | (db->hmask + 1);
/*
* write delay, read avoidence/cache shuffle:
* select the page for incoming pair: if key is to go to the new page,
* write out the previous one, and copy the new one over, thus making
* it the current page. If not, simply write the new page, and we are
* still looking at the page of interest. current page is not updated
* here, as sdbm_store will do so, after it inserts the incoming pair.
*/
if (hash & (db->hmask + 1)) {
if ((status = write_page(db, db->pagbuf, db->pagbno))
!= APR_SUCCESS)
return status;
db->pagbno = newp;
(void) memcpy(pag, new, PBLKSIZ);
}
else {
if ((status = write_page(db, new, newp)) != APR_SUCCESS)
return status;
}
if ((status = setdbit(db, db->curbit)) != APR_SUCCESS)
return status;
/*
* see if we have enough room now
*/
if (fitpair(pag, need))
return APR_SUCCESS;
/*
* try again... update curbit and hmask as getpage would have
* done. because of our update of the current page, we do not
* need to read in anything. BUT we have to write the current
* [deferred] page out, as the window of failure is too great.
*/
db->curbit = 2 * db->curbit
+ ((hash & (db->hmask + 1)) ? 2 : 1);
db->hmask |= db->hmask + 1;
if ((status = write_page(db, db->pagbuf, db->pagbno))
!= APR_SUCCESS)
return status;
} while (--smax);
/*
* if we are here, this is real bad news. After SPLTMAX splits,
* we still cannot fit the key. say goodnight.
*/
#if 0
(void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44);
#endif
/* ### ENOSPC not really appropriate but better than nothing */
return APR_ENOSPC;
}
/* Reads 'len' bytes from file 'f' at offset 'off' into buf.
* 'off' is given relative to the start of the file.
* If EOF is returned while reading, this is taken as success.
*/
static apr_status_t read_from(apr_file_t *f, void *buf,
apr_off_t off, apr_size_t len)
{
apr_status_t status;
if ((status = apr_file_seek(f, APR_SET, &off)) != APR_SUCCESS ||
((status = apr_file_read_full(f, buf, len, NULL)) != APR_SUCCESS)) {
/* if EOF is reached, pretend we read all zero's */
if (status == APR_EOF) {
memset(buf, 0, len);
status = APR_SUCCESS;
}
}
return status;
}
/*
* the following two routines will break if
* deletions aren't taken into account. (ndbm bug)
*/
APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db,
apr_sdbm_datum_t *key)
{
apr_status_t status;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
/*
* start at page 0
*/
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(0), PBLKSIZ))
== APR_SUCCESS) {
db->pagbno = 0;
db->blkptr = 0;
db->keyptr = 0;
status = getnext(key, db);
}
(void) apr_sdbm_unlock(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db,
apr_sdbm_datum_t *key)
{
apr_status_t status;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
status = getnext(key, db);
(void) apr_sdbm_unlock(db);
return status;
}
/*
* all important binary tree traversal
*/
static apr_status_t getpage(apr_sdbm_t *db, long hash)
{
register int hbit;
register long dbit;
register long pagb;
apr_status_t status;
dbit = 0;
hbit = 0;
while (dbit < db->maxbno && getdbit(db, dbit))
dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1);
debug(("dbit: %d...", dbit));
db->curbit = dbit;
db->hmask = masks[hbit];
pagb = hash & db->hmask;
/*
* see if the block we need is already in memory.
* note: this lookaside cache has about 10% hit rate.
*/
if (pagb != db->pagbno) {
/*
* note: here, we assume a "hole" is read as 0s.
* if not, must zero pagbuf first.
* ### joe: this assumption was surely never correct? but
* ### we make it so in read_from anyway.
*/
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(pagb), PBLKSIZ))
!= APR_SUCCESS)
return status;
if (!chkpage(db->pagbuf))
return APR_ENOSPC; /* ### better error? */
db->pagbno = pagb;
debug(("pag read: %d\n", pagb));
}
return APR_SUCCESS;
}
static int getdbit(apr_sdbm_t *db, long dbit)
{
register long c;
register long dirb;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if (read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ)
!= APR_SUCCESS)
return 0;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ);
}
static apr_status_t setdbit(apr_sdbm_t *db, long dbit)
{
register long c;
register long dirb;
apr_status_t status;
apr_off_t off;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if ((status = read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ))
!= APR_SUCCESS)
return status;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
if (dbit >= db->maxbno)
db->maxbno += DBLKSIZ * BYTESIZ;
off = OFF_DIR(dirb);
if ((status = apr_file_seek(db->dirf, APR_SET, &off)) == APR_SUCCESS)
status = apr_file_write_full(db->dirf, db->dirbuf, DBLKSIZ, NULL);
return status;
}
/*
* getnext - get the next key in the page, and if done with
* the page, try the next page in sequence
*/
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db)
{
apr_status_t status;
for (;;) {
db->keyptr++;
*key = getnkey(db->pagbuf, db->keyptr);
if (key->dptr != NULL)
return APR_SUCCESS;
/*
* we either run out, or there is nothing on this page..
* try the next one... If we lost our position on the
* file, we will have to seek.
*/
db->keyptr = 0;
if (db->pagbno != db->blkptr++) {
apr_off_t off = OFF_PAG(db->blkptr);
if ((status = apr_file_seek(db->pagf, APR_SET, &off)
!= APR_SUCCESS))
return status;
}
db->pagbno = db->blkptr;
/* ### EOF acceptable here too? */
if ((status = apr_file_read_full(db->pagf, db->pagbuf, PBLKSIZ, NULL))
!= APR_SUCCESS)
return status;
if (!chkpage(db->pagbuf))
return APR_EGENERAL; /* ### need better error */
}
/* NOTREACHED */
}
APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db)
{
/* ### Should we return true if the first lock is a share lock,
* to reflect that apr_sdbm_store and apr_sdbm_delete will fail?
*/
return (db->flags & SDBM_RDONLY) != 0;
}

View File

@ -1,63 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
* status: ex-public domain. keep it that way.
*
* hashing routine
*/
#include "apr_sdbm.h"
#include "sdbm_private.h"
/*
* polynomial conversion ignoring overflows
* [this seems to work remarkably well, in fact better
* then the ndbm hash function. Replace at your own risk]
* use: 65599 nice.
* 65587 even better.
*/
long sdbm_hash(const char *str, int len)
{
register unsigned long n = 0;
#define DUFF /* go ahead and use the loop-unrolled version */
#ifdef DUFF
#define HASHC n = *str++ + 65599 * n
if (len > 0) {
register int loop = (len + 8 - 1) >> 3;
switch(len & (8 - 1)) {
case 0: do {
HASHC; case 7: HASHC;
case 6: HASHC; case 5: HASHC;
case 4: HASHC; case 3: HASHC;
case 2: HASHC; case 1: HASHC;
} while (--loop);
}
}
#else
while (len--)
n = *str++ + 65599 * n;
#endif
return n;
}

View File

@ -1,78 +0,0 @@
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_file_info.h"
#include "apr_file_io.h"
#include "apr_sdbm.h"
#include "sdbm_private.h"
#include "sdbm_tune.h"
/* NOTE: this function blocks until it acquires the lock */
APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type)
{
apr_status_t status;
if (!(type == APR_FLOCK_SHARED || type == APR_FLOCK_EXCLUSIVE))
return APR_EINVAL;
if (db->flags & SDBM_EXCLUSIVE_LOCK) {
++db->lckcnt;
return APR_SUCCESS;
}
else if (db->flags & SDBM_SHARED_LOCK) {
/*
* Cannot promote a shared lock to an exlusive lock
* in a cross-platform compatibile manner.
*/
if (type == APR_FLOCK_EXCLUSIVE)
return APR_EINVAL;
++db->lckcnt;
return APR_SUCCESS;
}
/*
* zero size: either a fresh database, or one with a single,
* unsplit data page: dirpage is all zeros.
*/
if ((status = apr_file_lock(db->dirf, type)) == APR_SUCCESS)
{
apr_finfo_t finfo;
if ((status = apr_file_info_get(&finfo, APR_FINFO_SIZE, db->dirf))
!= APR_SUCCESS) {
(void) apr_file_unlock(db->dirf);
return status;
}
SDBM_INVALIDATE_CACHE(db, finfo);
++db->lckcnt;
if (type == APR_FLOCK_SHARED)
db->flags |= SDBM_SHARED_LOCK;
else if (type == APR_FLOCK_EXCLUSIVE)
db->flags |= SDBM_EXCLUSIVE_LOCK;
}
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db)
{
if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK)))
return APR_EINVAL;
if (--db->lckcnt > 0)
return APR_SUCCESS;
db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK);
return apr_file_unlock(db->dirf);
}

Some files were not shown because too many files have changed in this diff Show More