Merge branch 'master' of git.sangoma.com:smg_freeswitch
This commit is contained in:
commit
ed11f2fed7
|
@ -230,12 +230,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_teletone",
|
|||
{204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2008.vcproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2008.vcproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940} = {23B4D303-79FC-49E0-89E2-2280E7E28940}
|
||||
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {4043FC6A-9A30-4577-8AD5-9B233C9575D8}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_odbc", "src\mod\languages\mod_spidermonkey\mod_spidermonkey_odbc.2008.vcproj", "{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}"
|
||||
|
@ -664,6 +662,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\ap
|
|||
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2008.vcproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
All|Win32 = All|Win32
|
||||
|
@ -1139,17 +1139,6 @@ Global
|
|||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.Build.0 = Release|Win32
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.ActiveCfg = Release|x64
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.Build.0 = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.Build.0 = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.Build.0 = Release|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.Build.0 = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
|
||||
|
@ -2137,6 +2126,15 @@ Global
|
|||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Release|x64.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
@ -602,12 +602,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_teletone",
|
|||
{204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2008.vcproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2008.vcproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940} = {23B4D303-79FC-49E0-89E2-2280E7E28940}
|
||||
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {4043FC6A-9A30-4577-8AD5-9B233C9575D8}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_odbc", "src\mod\languages\mod_spidermonkey\mod_spidermonkey_odbc.2008.vcproj", "{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}"
|
||||
|
@ -983,11 +981,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\S
|
|||
{1F0A8A77-E661-418F-BB92-82172AE43803} = {1F0A8A77-E661-418F-BB92-82172AE43803}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_file_string", "src\mod\formats\mod_file_string\mod_file_string.2008.vcproj", "{70564D74-199A-4452-9C60-19ED5F242F0D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2008.vcproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
|
||||
|
@ -1135,6 +1128,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openssl", "libs\win32\opens
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2008.vcproj", "{42E721FD-43D6-4B04-A34B-42567199FFB8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2008.vcproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
All|Win32 = All|Win32
|
||||
|
@ -1604,20 +1599,17 @@ Global
|
|||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.Build.0 = Release|Win32
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64
|
||||
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|Win32.ActiveCfg = Release|x64
|
||||
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64.ActiveCfg = Release|x64
|
||||
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64.Build.0 = Release|x64
|
||||
|
@ -2493,17 +2485,6 @@ Global
|
|||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|Win32.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.Build.0 = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.Build.0 = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.Build.0 = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.Build.0 = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
|
||||
|
@ -2848,6 +2829,17 @@ Global
|
|||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{42E721FD-43D6-4B04-A34B-42567199FFB8}.Release|x64.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -2905,7 +2897,6 @@ Global
|
|||
{2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A}
|
||||
{EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
|
||||
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000}
|
||||
|
@ -2940,7 +2931,6 @@ Global
|
|||
{204FA0DE-305D-4414-AE2E-F195A23F390D} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
|
@ -2969,6 +2959,7 @@ Global
|
|||
{9778F1C0-09BC-4698-8EBC-BD982247209A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{B376D494-D7DD-4B2A-99E2-52916D5A8CD8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A} = {C120A020-773F-4EA3-923F-B67AF28B750D}
|
||||
{4F92B672-DADB-4047-8D6A-4BB3796733FD} = {C120A020-773F-4EA3-923F-B67AF28B750D}
|
||||
{2DEE4895-1134-439C-B688-52203E57D878} = {C120A020-773F-4EA3-923F-B67AF28B750D}
|
||||
|
|
|
@ -54,6 +54,9 @@ EndProject
|
|||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2010.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpcre", "libs\win32\pcre\libpcre.2010.vcxproj", "{8D04B550-D240-4A44-8A18-35DA3F7038D9}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94} = {1CED5987-A529-46DC-B30F-870D85FF9C94}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2010.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}"
|
||||
EndProject
|
||||
|
@ -85,8 +88,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_core_db",
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_teletone", "src\mod\languages\mod_spidermonkey\mod_spidermonkey_teletone.2010.vcxproj", "{8F992C49-6C51-412F-B2A3-34EAB708EB65}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2010.vcxproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2010.vcxproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_odbc", "src\mod\languages\mod_spidermonkey\mod_spidermonkey_odbc.2010.vcxproj", "{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}"
|
||||
|
@ -251,8 +252,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\S
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2010.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_file_string", "src\mod\formats\mod_file_string\mod_file_string.2010.vcxproj", "{70564D74-199A-4452-9C60-19ED5F242F0D}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2010.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2010.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}"
|
||||
|
@ -317,6 +316,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openssl", "libs\win32\opens
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2010.vcxproj", "{B889A18E-70A7-44B5-B2C9-47798D4F43B3}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2010.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpcre Generate pcre_chartables.c", "libs\win32\pcre\pcre_chartables.c.2010.vcxproj", "{1CED5987-A529-46DC-B30F-870D85FF9C94}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
All|Win32 = All|Win32
|
||||
|
@ -781,17 +784,6 @@ Global
|
|||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.Build.0 = Release|Win32
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.ActiveCfg = Release|x64
|
||||
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.Build.0 = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.Build.0 = Debug|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.Build.0 = Release|Win32
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
|
||||
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.Build.0 = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
|
||||
|
@ -1645,17 +1637,6 @@ Global
|
|||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|Win32.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.Build.0 = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.Build.0 = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.Build.0 = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.Build.0 = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
|
||||
|
@ -1990,6 +1971,24 @@ Global
|
|||
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|Win32.ActiveCfg = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|Win32.Build.0 = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x64.ActiveCfg = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.Build.0 = Release|Win32
|
||||
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x64.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
@ -631,8 +631,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\S
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2010.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_file_string", "src\mod\formats\mod_file_string\mod_file_string.2010.vcxproj", "{70564D74-199A-4452-9C60-19ED5F242F0D}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2010.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2010.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}"
|
||||
|
@ -709,6 +707,8 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup", "w32\Setup\Setup.wi
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pt", "src\mod\say\mod_say_pt\mod_say_pt.2010.vcxproj", "{7C22BDFF-CC09-400C-8A09-660733980028}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2010.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
All|Win32 = All|Win32
|
||||
|
@ -1494,11 +1494,15 @@ Global
|
|||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64 Setup.Build.0 = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x86 Setup.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64 Setup.ActiveCfg = Debug|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x86 Setup.ActiveCfg = Release|Win32
|
||||
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|Win32.ActiveCfg = Release|x64
|
||||
|
@ -2965,24 +2969,6 @@ Global
|
|||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x86 Setup.ActiveCfg = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|Win32.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.Build.0 = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64 Setup.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64 Setup.Build.0 = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x86 Setup.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.Build.0 = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64 Setup.ActiveCfg = Debug|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x86 Setup.ActiveCfg = Debug|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.Build.0 = Release|Win32
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.Build.0 = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x86 Setup.ActiveCfg = Release|Win32
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
|
||||
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
|
||||
|
@ -3630,6 +3616,23 @@ Global
|
|||
{7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.Build.0 = Release|x64
|
||||
{7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{7C22BDFF-CC09-400C-8A09-660733980028}.Release|x86 Setup.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64 Setup.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x86 Setup.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64 Setup.ActiveCfg = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x86 Setup.ActiveCfg = Debug|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x86 Setup.ActiveCfg = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -3688,7 +3691,6 @@ Global
|
|||
{2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{70564D74-199A-4452-9C60-19ED5F242F0D} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
|
||||
{CBD81696-EFB4-4D2F-8451-1B8DAA86155A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{89385C74-5860-4174-9CAF-A39E7C48909C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
|
@ -3734,6 +3736,7 @@ Global
|
|||
{56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{E4D29906-8B73-4F8A-B5F4-CA8BFA648F5A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
|
||||
{EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
|
||||
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000}
|
||||
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF} = {0C808854-54D1-4230-BFF5-77B5FD905000}
|
||||
|
|
|
@ -12,4 +12,5 @@ m4_include([build/config/sched_setaffinity.m4])
|
|||
m4_include([libs/apr/build/apr_common.m4])
|
||||
m4_include([libs/sofia-sip/m4/sac-pkg-config.m4])
|
||||
m4_include([libs/sofia-sip/m4/sac-openssl.m4])
|
||||
m4_include([libs/iksemel/build/libgnutls.m4])
|
||||
m4_include([build/config/libcurl.m4])
|
||||
|
|
|
@ -27,6 +27,7 @@ INSTALL=@INSTALL@
|
|||
GETLIB=@GETLIB@
|
||||
LIBTOOL=@LIBTOOL@
|
||||
AR=@AR@
|
||||
LIBGNUTLS_LIBS=@LIBGNUTLS_LIBS@
|
||||
LTINSTALL=$(LIBTOOL) --quiet --mode=install $(INSTALL)
|
||||
LTUNINSTALL=$(LIBTOOL) --mode=uninstall rm -f
|
||||
CCLD = $(CC)
|
||||
|
|
|
@ -76,6 +76,7 @@ endpoints/mod_loopback
|
|||
#asr_tts/mod_tts_commandline
|
||||
#event_handlers/mod_event_multicast
|
||||
event_handlers/mod_event_socket
|
||||
#event_handlers/mod_event_zmq
|
||||
event_handlers/mod_cdr_csv
|
||||
event_handlers/mod_cdr_sqlite
|
||||
#event_handlers/mod_cdr_pg_csv
|
||||
|
@ -87,7 +88,6 @@ formats/mod_sndfile
|
|||
#formats/mod_shout
|
||||
formats/mod_local_stream
|
||||
formats/mod_tone_stream
|
||||
formats/mod_file_string
|
||||
#formats/mod_portaudio_stream
|
||||
#formats/mod_shell_stream
|
||||
#languages/mod_python
|
||||
|
@ -108,10 +108,11 @@ say/mod_say_en
|
|||
#say/mod_say_it
|
||||
#say/mod_say_nl
|
||||
#say/mod_say_pt
|
||||
say/mod_say_ru
|
||||
#say/mod_say_ru
|
||||
#say/mod_say_zh
|
||||
#say/mod_say_hu
|
||||
#say/mod_say_th
|
||||
#say/mod_say_he
|
||||
#timers/mod_timerfd
|
||||
|
||||
## Experimental Modules (don't cry if they're broken)
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
<!-- <load module="mod_cdr_sqlite"/> -->
|
||||
<!-- <load module="mod_event_multicast"/> -->
|
||||
<load module="mod_event_socket"/>
|
||||
<!-- <load module="mod_event_zmq"/> -->
|
||||
<!-- <load module="mod_zeroconf"/> -->
|
||||
<!-- <load module="mod_erlang_event"/> -->
|
||||
<!-- <load module="mod_snmp"/> -->
|
||||
|
@ -92,7 +93,6 @@
|
|||
<!--For local streams (play all the files in a directory)-->
|
||||
<load module="mod_local_stream"/>
|
||||
<load module="mod_tone_stream"/>
|
||||
<load module="mod_file_string"/>
|
||||
|
||||
<!-- Timers -->
|
||||
<!-- <load module="mod_timerfd"/> -->
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
<X-PRE-PROCESS cmd="include" data="lang/en/*.xml"/>
|
||||
<X-PRE-PROCESS cmd="include" data="lang/fr/*.xml"/>
|
||||
<X-PRE-PROCESS cmd="include" data="lang/ru/*.xml"/>
|
||||
<X-PRE-PROCESS cmd="include" data="lang/he/*.xml"/>
|
||||
</macros>
|
||||
</section>
|
||||
</document>
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<include><!--This line will be ignored it's here to validate the xml and is optional -->
|
||||
|
||||
|
||||
<macro name="demo_ivr_count">
|
||||
<input pattern="^(\d+)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-you_have.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-messages.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="demo_ivr_main_menu" pause="100"> <!-- See conf/autoload_config/ivr.conf.xml for an example on how to use this macro in an IVR -->
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<!-- string together several existing sound files to create one long greeting -->
|
||||
<action function="play-file" data="ivr/ivr-welcome_to_freeswitch.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-this_ivr_will_let_you_test_features.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-you_may_exit_by_hanging_up.wav"/>
|
||||
<!-- note that you can do more than just play files, e.g. have pauses and do TTS -->
|
||||
|
||||
<!-- Menu option 1: Call FreeSWITCH conference-->
|
||||
<action function="play-file" data="ivr/ivr-enter_ext_pound.wav"/>
|
||||
<action function="play-file" data="silence_stream://1500"/>
|
||||
<action function="play-file" data="ivr/ivr-to_call_the_freeswitch_conference.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/1.wav"/>
|
||||
|
||||
<!-- Menu option 2: Do FreeSWITCH echo test -->
|
||||
<action function="play-file" data="ivr/ivr-to_do_a_freeswitch_echo_test.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/2.wav"/>
|
||||
|
||||
<!-- Menu option 3: Listen to Music on Hold -->
|
||||
<action function="play-file" data="ivr/ivr-to_listen_to_moh.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/3.wav"/>
|
||||
|
||||
<!-- Menu option 4: Register for ClueCon -->
|
||||
<action function="play-file" data="ivr/ivr-register_for_cluecon.wav"/>
|
||||
<action function="play-file" data="digits/4.wav"/>
|
||||
|
||||
<!-- Menu option 5: Listen to screaming monkeys -->
|
||||
<action function="play-file" data="ivr/ivr-to_hear_screaming_monkeys.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/5.wav"/>
|
||||
|
||||
<!-- Menu option 6: Hear a sample submenu -->
|
||||
<action function="play-file" data="ivr/ivr-to_hear_sample_submenu.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/6.wav"/>
|
||||
|
||||
<!-- Menu option 9: Repeat these options -->
|
||||
<action function="play-file" data="ivr/ivr-to_repeat_these_options.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/9.wav"/>
|
||||
<action function="play-file" data="silence_stream://2000"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<!-- The following macro is the same as demo_ivr_main_menu except it is the "short" version -->
|
||||
<!-- The short version has all the options but not the initial greeting -->
|
||||
<macro name="demo_ivr_main_menu_short" pause="100">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<!-- Menu option 1: Call FreeSWITCH conference-->
|
||||
<action function="play-file" data="silence_stream://1000"/>
|
||||
<action function="play-file" data="ivr/ivr-to_call_the_freeswitch_conference.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/1.wav"/>
|
||||
|
||||
<!-- Menu option 2: Do FreeSWITCH echo test -->
|
||||
<action function="play-file" data="ivr/ivr-to_do_a_freeswitch_echo_test.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/2.wav"/>
|
||||
|
||||
<!-- Menu option 3: Listen to Music on Hold -->
|
||||
<action function="play-file" data="ivr/ivr-to_listen_to_moh.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/3.wav"/>
|
||||
|
||||
<!-- Menu option 4: Hear a sample submenu -->
|
||||
<action function="play-file" data="ivr/ivr-to_hear_sample_submenu.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/4.wav"/>
|
||||
|
||||
<!-- Menu option 5: Listen to screaming monkeys -->
|
||||
<action function="play-file" data="ivr/ivr-to_hear_screaming_monkeys.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/5.wav"/>
|
||||
|
||||
<!-- Menu option 9: Repeat these options -->
|
||||
<action function="play-file" data="ivr/ivr-to_repeat_these_options.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/9.wav"/>
|
||||
<action function="play-file" data="silence_stream://2000"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<!-- The following macro is the "long" greeting for the demo_ivr_sub_menu -->
|
||||
<macro name="demo_ivr_sub_menu">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="ivr/ivr-welcome_to_freeswitch.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-sample_submenu.wav"/>
|
||||
|
||||
<!-- Menu option *: Return to top menu -->
|
||||
<action function="play-file" data="ivr/ivr-to_return_to_previous_menu.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/star.wav"/>
|
||||
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<!-- The following macro is the same as demo_ivr_sub_menu except it is the "short" version -->
|
||||
<!-- The short version has all the options but not the initial greeting -->
|
||||
<macro name="demo_ivr_sub_menu_short">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<!-- Menu option *: Return to top menu -->
|
||||
<action function="play-file" data="ivr/ivr-to_return_to_previous_menu.wav"/>
|
||||
<action function="play-file" data="ivr/ivr-please.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="play-file" data="digits/star.wav"/>
|
||||
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
</include><!--This line will be ignored it's here to validate the xml and is optional -->
|
|
@ -0,0 +1,71 @@
|
|||
<include><!--This line will be ignored it's here to validate the xml and is optional -->
|
||||
<macro name="msgcount">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="execute" data="sleep(1000)"/>
|
||||
<action function="play-file" data="voicemail/vm-you_have.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="voicemail/vm-messages.wav"/>
|
||||
<!-- or -->
|
||||
<!--<action function="speak-text" data="you have $1 messages"/>-->
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="saydate">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="current_date_time"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="timespec">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="time_measurement"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="ip-addr">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="say" data="$1" method="iterated" type="ip_address"/>
|
||||
<action function="say" data="$1" method="pronounced" type="ip_address"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="spell">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="spell-phonetic">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="name_phonetic"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<macro name="tts-timeleft">
|
||||
<!-- The parser will visit each <input> tag and execute the actions in <match> or <nomatch> depending on the pattern param -->
|
||||
<!-- If the function "break" is encountered all parsing will cease -->
|
||||
<input pattern="(\d+):(\d+)">
|
||||
<match>
|
||||
<action function="speak-text" data="You have $1 minutes, $2 seconds remaining $strftime(%Y-%m-%d)"/>
|
||||
<action function="break"/>
|
||||
</match>
|
||||
<nomatch>
|
||||
<action function="speak-text" data="That input was invalid."/>
|
||||
</nomatch>
|
||||
</input>
|
||||
<input pattern="(\d+) min (\d+) sec">
|
||||
<match>
|
||||
<action function="speak-text" data="You have $1 minutes, $2 seconds remaining $strftime(%Y-%m-%d)"/>
|
||||
</match>
|
||||
<nomatch>
|
||||
<action function="speak-text" data="That input was invalid."/>
|
||||
</nomatch>
|
||||
</input>
|
||||
</macro>
|
||||
</include><!--This line will be ignored it's here to validate the xml and is optional -->
|
|
@ -0,0 +1,121 @@
|
|||
<include><!--This line will be ignored it's here to validate the xml and is optional -->
|
||||
<macro name="directory_intro">
|
||||
<input pattern="^(last_name)" break_on_match="false">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-enter_person.wav"/>
|
||||
<action function="play-file" data="directory/dir-last_name.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(first_name)" break_on_match="false">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-enter_person.wav"/>
|
||||
<action function="play-file" data="directory/dir-first_name.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(last_name):([0-9#*])$" break_on_match="false">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-to_search_by.wav"/>
|
||||
<action function="play-file" data="directory/dir-first_name.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(first_name):([0-9#*])$" break_on_match="false">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-to_search_by.wav"/>
|
||||
<action function="play-file" data="directory/dir-last_name.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_min_search_digits">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-specify_mininum.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="directory/dir-letters_of_person_name.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_count">
|
||||
<input pattern="^0$" break_on_match="true">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-no_matching_results.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="directory/dir-result_match.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_count_too_large">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-too_many_result.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_last">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-no_more_results.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_item">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-result_number.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_at">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-at_extension.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_menu">
|
||||
<input pattern="^([0-9#*]),([0-9#*]),([0-9#*]),([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="directory/dir-to_select_entry.wav"/>
|
||||
<action function="play-file" data="directory/dir-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="directory/dir-for_next.wav"/>
|
||||
<action function="play-file" data="directory/dir-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="directory/dir-for_prev.wav"/>
|
||||
<action function="play-file" data="directory/dir-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="directory/dir-start_new_search.wav"/>
|
||||
<action function="play-file" data="directory/dir-press.wav"/>
|
||||
<action function="say" data="$4" method="pronounced" type="name_spelled"/>
|
||||
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="directory_result_say_name">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
</include><!--This line will be ignored it's here to validate the xml and is optional -->
|
|
@ -0,0 +1,7 @@
|
|||
<include>
|
||||
<language name="he" sound-path="$${sounds_dir}/he/daniel" tts-engine="cepstral" tts-voice="daniel">
|
||||
<X-PRE-PROCESS cmd="include" data="demo/*.xml"/> <!-- Note: this now grabs whole subdir, previously grabbed only demo.xml -->
|
||||
<X-PRE-PROCESS cmd="include" data="vm/sounds.xml"/>
|
||||
<X-PRE-PROCESS cmd="include" data="dir/sounds.xml"/>
|
||||
</language>
|
||||
</include>
|
|
@ -0,0 +1,404 @@
|
|||
<include><!--This line will be ignored it's here to validate the xml and is optional -->
|
||||
<macro name="voicemail_enter_id">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-enter_id.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_enter_pass">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-enter_pass.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_fail_auth">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-fail_auth.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_hello">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<!--<action function="play-file" data="voicemail/vm-hello.wav"/> -->
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_goodbye">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-goodbye.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_abort">
|
||||
<input pattern="(.*)">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-abort.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_message_count">
|
||||
<input pattern="^(1):(.*)$" break_on_match="true">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-you_have.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="voicemail/vm-$2.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-message.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(\d+):(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-you_have.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="voicemail/vm-$2.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-messages.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_menu">
|
||||
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<!-- To listen to new messages -->
|
||||
<action function="play-file" data="voicemail/vm-listen_new.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To listen to saved messages -->
|
||||
<action function="play-file" data="voicemail/vm-listen_saved.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- For advanced options -->
|
||||
<action function="play-file" data="voicemail/vm-advanced.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To exit -->
|
||||
<action function="play-file" data="voicemail/vm-to_exit.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$4" method="pronounced" type="name_phonetic"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_config_menu">
|
||||
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<!-- To record a greeting -->
|
||||
<action function="play-file" data="voicemail/vm-to_record_greeting.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To choose greeting -->
|
||||
<action function="play-file" data="voicemail/vm-choose_greeting.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To record your name -->
|
||||
<action function="play-file" data="voicemail/vm-record_name2.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To change password -->
|
||||
<action function="play-file" data="voicemail/vm-change_password.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$4" method="pronounced" type="name_spelled"/>
|
||||
<action function="execute" data="sleep(100)"/>
|
||||
|
||||
<!-- To return to main menu -->
|
||||
<action function="play-file" data="voicemail/vm-main_menu.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$5" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_record_name">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-record_name1.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_record_file_check">
|
||||
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-listen_to_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-save_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-rerecord.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_record_urgent_check">
|
||||
<input pattern="^([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-mark-urgent.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-continue.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_forward_prepend">
|
||||
<input pattern="^([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-forward_add_intro.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-send_message_now.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_forward_message_enter_extension">
|
||||
<input pattern="^([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-forward_enter_ext.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-followed_by.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_invalid_extension">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-that_was_an_invalid_ext.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_listen_file_check">
|
||||
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-listen_to_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-save_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-delete_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-forward_to_email.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$4" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-return_call.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$5" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-to_forward.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$6" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-listen_to_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-save_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-delete_recording.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$3" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-return_call.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$5" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-to_forward.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-press.wav"/>
|
||||
<action function="say" data="$6" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_choose_greeting">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-choose_greeting_choose.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_choose_greeting_fail">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-choose_greeting_fail.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_record_greeting">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-record_greeting.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_record_message">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-record_message.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_greeting_selected">
|
||||
<input pattern="^(\d+)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-greeting.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
<action function="play-file" data="voicemail/vm-selected.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_play_greeting">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-person.wav"/>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
<action function="play-file" data="voicemail/vm-not_available.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_say_number">
|
||||
<input pattern="^(\d+)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="items"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_say_message_number">
|
||||
<input pattern="^([a-z]+):(\d+)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-$1.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-message_number.wav"/>
|
||||
<action function="say" data="$2" method="pronounced" type="items"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_say_phone_number">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_say_name">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
<!-- Note: Update this to marked-urgent,emailed and saved once new sound files are recorded -->
|
||||
<macro name="voicemail_ack">
|
||||
<input pattern="^(too-small)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-too-small.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(deleted)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-message.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-$1.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(saved)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-message.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-$1.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(emailed)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-message.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-$1.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
<input pattern="^(marked-urgent)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-message.wav"/>
|
||||
<action function="play-file" data="voicemail/vm-$1.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_say_date">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$1" method="pronounced" type="current_date_time"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="voicemail_disk_quota_exceeded">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="voicemail/vm-mailbox_full.wav"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="valet_announce_ext">
|
||||
<input pattern="^([^\:]+):(.*)$">
|
||||
<match>
|
||||
<action function="say" data="$2" method="pronounced" type="name_spelled"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="valet_lot_full">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="tone_stream://%(275,10,600);%(275,100,300)"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
|
||||
<macro name="valet_lot_empty">
|
||||
<input pattern="^(.*)$">
|
||||
<match>
|
||||
<action function="play-file" data="tone_stream://%(275,10,600);%(275,100,300)"/>
|
||||
</match>
|
||||
</input>
|
||||
</macro>
|
||||
</include><!--This line will be ignored it's here to validate the xml and is optional -->
|
|
@ -47,8 +47,8 @@
|
|||
Sometimes, in extremely rare edge cases, the Sofia SIP stack may stop
|
||||
responding. These options allow you to enable and control a watchdog
|
||||
on the Sofia SIP stack so that if it stops responding for the
|
||||
specified number of milliseconds, it will cause FreeSWITCH to shut
|
||||
down immediately. This is useful if you run in an HA environment and
|
||||
specified number of milliseconds, it will cause FreeSWITCH to crash
|
||||
immediately. This is useful if you run in an HA environment and
|
||||
need to ensure automated recovery from such a condition. Note that if
|
||||
your server is idle a lot, the watchdog may fire due to not receiving
|
||||
any SIP messages. Thus, if you expect your system to be idle, you
|
||||
|
@ -57,6 +57,8 @@
|
|||
globally for all profiles. So, if you run in an HA environment with a
|
||||
master and slave, you should use the CLI to make sure the watchdog is
|
||||
only enabled on the master.
|
||||
If such crash occurs, FreeSWITCH will dump core if allowed. The
|
||||
stacktrace will include function watchdog_triggered_abort().
|
||||
-->
|
||||
<param name="watchdog-enabled" value="no"/>
|
||||
<param name="watchdog-step-timeout" value="30000"/>
|
||||
|
|
|
@ -199,15 +199,32 @@
|
|||
<X-PRE-PROCESS cmd="set" data="default_areacode=918"/>
|
||||
<X-PRE-PROCESS cmd="set" data="default_country=US"/>
|
||||
|
||||
<X-PRE-PROCESS cmd="set" data="uk-ring=%(400,200,400,450);%(400,2200,400,450)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="us-ring=%(2000,4000,440.0,480.0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="fr-ring=%(1500,3500,440.0,0.0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="rs-ring=%(1000,4000,425.0,0.0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="ru-ring=%(800,3200,425,0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="de-ring=%(1000,4000,425,0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="dz-ring=%(1500,3500,425.0,0.0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="pl-ring=%(1000,4000,425,0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="il-ring=%(1000,2000,425.0,0)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="be-ring=%(1000,3000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="ca-ring=%(2000,4000,440,480)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="cn-ring=%(1000,4000,450)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="cy-ring=%(1500,3000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="cz-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="de-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="dk-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="dz-ring=%(1500,3500,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="eg-ring=%(2000,1000,475,375)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="fi-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="fr-ring=%(1500,3500,440)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="hk-ring=%(400,200,440,480);%(400,3000,440,480)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="hu-ring=%(1250,3750,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="il-ring=%(1000,3000,400)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="in-ring=%(400,200,425,375);%(400,2000,425,375)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="jp-ring=%(1000,2000,420,380)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="ko-ring=%(1000,2000,440,480)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="pk-ring=%(1000,2000,400)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="pl-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="ro-ring=%(1850,4150,475,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="rs-ring=%(1000,4000,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="ru-ring=%(800,3200,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="sa-ring=%(1200,4600,425)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="tr-ring=%(2000,4000,450)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="uk-ring=%(400,200,400,450);%(400,2000,400,450)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="us-ring=%(2000,4000,440,480)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)"/>
|
||||
<X-PRE-PROCESS cmd="set" data="sit=%(274,0,913.8);%(274,0,1370.6);%(380,0,1776.7)"/>
|
||||
<!--
|
||||
|
|
|
@ -144,6 +144,8 @@ if test "${enable_optimizer}" = "yes" ; then
|
|||
AX_CC_MAXOPT
|
||||
fi
|
||||
|
||||
AX_PATH_LIBGNUTLS()
|
||||
|
||||
# set defaults for use on all platforms
|
||||
SWITCH_AM_CFLAGS="-I${switch_srcdir}/src/include -I${switch_builddir}/src/include -I${switch_srcdir}/libs/libteletone/src"
|
||||
SWITCH_AM_CXXFLAGS="-I${switch_srcdir}/src/include -I${switch_builddir}/src/include -I${switch_srcdir}/libs/libteletone/src"
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
freeswitch (1.0.head-git.master.20110402.1-1) unstable; urgency=low
|
||||
|
||||
* Added Hebrew lang package
|
||||
|
||||
-- Michal Bielicki <michal.bielicki@seventhsignal.de> Sat, 02 Apr 2011 03:12:02 +0200
|
||||
|
||||
freeswitch (1.0.head-git.master.20110330.1-1) unstable; urgency=low
|
||||
|
||||
* removed mod_file_string since it has been merged into dptoolsa
|
||||
|
||||
-- Michal Bielicki <michal.bielicki@seventhsignal.de> Wed, 30 Mar 2011 11:39:02 +0200
|
||||
|
||||
freeswitch (1.0.head~git.master.20101222.1-1) unstable; urgency=low
|
||||
|
||||
* cleaning work
|
||||
|
|
|
@ -250,6 +250,19 @@ Description: Russian language files for FreeSWITCH
|
|||
This package contains the mod_say_ru module and available language
|
||||
configuration files.
|
||||
|
||||
Package: freeswitch-lang-he
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
|
||||
Description: Hebrew language files for FreeSWITCH
|
||||
FreeSWITCH is an open source telephony platform designed to facilitate the
|
||||
creation of voice and chat driven products scaling from a soft-phone up to a
|
||||
soft-switch. It can be used as a simple switching engine, a PBX, a media
|
||||
gateway or a media server to host IVR applications using simple scripts or XML
|
||||
to control the callflow.
|
||||
.
|
||||
This package contains the mod_say_he module and available language
|
||||
configuration files.
|
||||
|
||||
Package: freeswitch-freetdm
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
/opt/freeswitch/conf/lang/he/demo/demo-ivr.xml
|
||||
/opt/freeswitch/conf/lang/he/demo/demo.xml
|
||||
/opt/freeswitch/conf/lang/he/dir/sounds.xml
|
||||
/opt/freeswitch/conf/lang/he/he.xml
|
||||
/opt/freeswitch/conf/lang/he/vm/sounds.xml
|
|
@ -0,0 +1,6 @@
|
|||
opt/freeswitch/conf/lang/he/demo/demo-ivr.xml
|
||||
opt/freeswitch/conf/lang/he/demo/demo.xml
|
||||
opt/freeswitch/conf/lang/he/dir/sounds.xml
|
||||
opt/freeswitch/conf/lang/he/he.xml
|
||||
opt/freeswitch/conf/lang/he/vm/sounds.xml
|
||||
opt/freeswitch/mod/mod_say_he.so*
|
|
@ -129,7 +129,6 @@ opt/freeswitch/mod/mod_esf.so*
|
|||
opt/freeswitch/mod/mod_event_*.so*
|
||||
opt/freeswitch/mod/mod_expr.so*
|
||||
opt/freeswitch/mod/mod_fifo.so*
|
||||
opt/freeswitch/mod/mod_file_string.so*
|
||||
opt/freeswitch/mod/mod_flite.so*
|
||||
opt/freeswitch/mod/mod_fsv.so*
|
||||
opt/freeswitch/mod/mod_hash.so*
|
||||
|
|
|
@ -24,11 +24,11 @@ export DIALPLANS_MODULES= dialplans/mod_dialplan_asterisk dialplans/mod_dialplan
|
|||
export ENDPOINTS_MODULES= endpoints/mod_dingaling endpoints/mod_portaudio endpoints/mod_sofia endpoints/mod_loopback \
|
||||
../../libs/freetdm/mod_freetdm endpoints/mod_skypopen endpoints/mod_skinny
|
||||
export EVENT_HANDLERS_MODULES=event_handlers/mod_event_multicast event_handlers/mod_event_socket event_handlers/mod_cdr_csv
|
||||
export FORMATS_MODULES= formats/mod_file_string formats/mod_local_stream formats/mod_native_file formats/mod_portaudio_stream \
|
||||
export FORMATS_MODULES= formats/mod_local_stream formats/mod_native_file formats/mod_portaudio_stream \
|
||||
formats/mod_shout formats/mod_sndfile formats/mod_tone_stream
|
||||
export LANGUAGES_MODULES=languages/mod_spidermonkey languages/mod_perl languages/mod_lua languages/mod_python
|
||||
export LOGGERS_MODULES=loggers/mod_console loggers/mod_logfile loggers/mod_syslog
|
||||
export SAY_MODULES=say/mod_say_en say/mod_say_it say/mod_say_de say/mod_say_fr say/mod_say_es say/mod_say_nl say/mod_say_ru
|
||||
export SAY_MODULES=say/mod_say_en say/mod_say_it say/mod_say_de say/mod_say_fr say/mod_say_es say/mod_say_nl say/mod_say_ru say/mod_say_he
|
||||
export XML_INT_MODULES=xml_int/mod_xml_rpc xml_int/mod_xml_curl xml_int/mod_xml_cdr
|
||||
export TIMER_MODULES=timers/mod_timerfd
|
||||
|
||||
|
|
|
@ -205,16 +205,27 @@ freeswitch (1.0.7)
|
|||
core: use strdup instead of core_session_strdup in hangup hook (r:3a10d6a1)
|
||||
core: fix jb + no timer situations (r:61d3c56f)
|
||||
core: Add events PLAYBACK_START and PLAYBACK_STOP, plus some minor improvments for RECORD_STOP (r:bc397ab6/FS-2971)
|
||||
core: Fix event queue from needlessly filling up (r:2044a749/FS-3105)
|
||||
core: Fix issue that was preventing the sqlite handles from being recycled properly (r:11451c10/FS-3106)
|
||||
core: clear timestamp when generating a fake empty frame to fix edge-case sending the same timestamp over and over (r:08496cd7)
|
||||
core: wait for state change to avoid race (r:f33e9c6e/FS-2966)
|
||||
core: Fix freeswitch.session in Lua, etc. (r:0ba25358/FS-3119)
|
||||
core: try to reduce contention by not creating handles with the global mutex locked (r:b3a2fa1c)
|
||||
core: add limits to simo open sql handles (r:61cdf0da)
|
||||
core: Fix db locks affecting mod_callcenter (r:8da371c7/FS-3127)
|
||||
core: improve flow of dtmf through a bridge when timer is disabled (r:59da356d)
|
||||
embedded languages: Provide core level support for conditional Set Global Variable (r:c017c24b/FSCORE-612)
|
||||
embedded languages: add insertFile front end to switch_ivr_insert_file and reswig (r:c4e350ab)
|
||||
fs_cli: block control-z from fs cli and print a warning how to exit properly (r:dc436b82)
|
||||
fs_cli: skip blocking writes on fs_cli to avoid backing up event socket (r:2ec2a9b0)
|
||||
fs_cli: let ctl-c work until you are connected (r:986f258d)
|
||||
fs_cli: add -i --interrupt to fs_cli to allow control-c to exit the program (r:e7b3c3b1)
|
||||
lang: Improve French phrase files (FSCONFIG-23)
|
||||
lang: Update langs - Add pt_PT, update es to have es_ES and es_MX, update mod_say_es and add mod_say_pt (FS-2937) (r:c81a9448/FS-2937)
|
||||
libapr: Fix issue where after a bridge with a member, uuid of Agent is set to single quote character ' (r:3fee704d/FS-2738)
|
||||
libdingaling: fix race on shutdown causing crash (FSMOD-47)
|
||||
libdingaling: Fix crash in new GV interface when exceeding 24 calls (r:be00609a/FS-2171)
|
||||
libdingaling: fix crash when GV call ends (r:687140b5/FS-3139)
|
||||
libesl: Fix potential race condition (ESL-36)
|
||||
libesl: Add /uuid command to fs_cli to filter logs by uuid
|
||||
libesl: Increase buffer in fs_cli for Win (r:d1d6be88/FSCORE-611)
|
||||
|
@ -238,6 +249,7 @@ freeswitch (1.0.7)
|
|||
libesl: null terminate buffer after reading from the socket to prevent cross-over to old data that confuses the parser and throws off framing (r:e8a10558/ESL-56)
|
||||
libesl: add optional job-uuid param to bgapi in oop mod (r:e96acac3)
|
||||
libesl: fix linger support in esl client lib (r:0444626b)
|
||||
libesl: fix segfault (r:30813ca5/FS-3130)
|
||||
libfreetdm: implemented freetdm config nodes and ss7 initial configuration
|
||||
libfreetdm: fix codec for CAS signaling (r:b76e7f18)
|
||||
libfreetdm: freetdm: ss7- added support for incoming group blocks, started adding support for ansi (r:c219a73c)
|
||||
|
@ -252,6 +264,7 @@ freeswitch (1.0.7)
|
|||
libsofiasip: Fix T.38 bug in sofia_glue (r:2843f1ad/MODSOFIA-94)
|
||||
libsofiasip: VS2010 sofia posix problem (r:46dd24c2/SFSIP-220)
|
||||
libsofiasip: set minimum initital sip t1 timer to 1000ms to work around race condition on retry timer firing before all the things that are supposed to be handled by the timer are set. The base resolution on this timer is 500ms, so doubling up makes sure we always hit the initial retry timer on the next run, where everything should be set. The side effect was, 1/2 the time on a request that did not get immediate response, the timer would be fired and cleared, but the action (sending retry) was never done, and a new timer was not set, causing the request to just sit zombied and never retry. A better solution would be to find and correct the race condition so the timer is never set to early and we never hit this condition. (r:20c2740c)
|
||||
libsofiasip: fix bad assert (r:56404641/FS-3133)
|
||||
libspandsp: Fixed a typo in spandsp's msvc/inttypes.h Updated sig_tone processing in spandsp to the latest, to allow moy to proceed with his signaling work.
|
||||
libspandsp: removed a saturate16 from spandsp that was causing problems fixed a typo in the MSVC inttypes.h file for spandsp
|
||||
libspandsp: Changes to the signaling tone detector to detect concurrent 2400Hz + 2600Hz tones. This passes voice immunity and other key tests, but it bounces a bit when transitions like 2400 -> 2400+2600 -> 2600 occur. Transitions between tone off and tone on are clean. (r:bc13e944)
|
||||
|
@ -335,6 +348,9 @@ freeswitch (1.0.7)
|
|||
mod_conference: don't switch to CS_SOFT_EXECUTE before setting the current extension (r:4b5bcba0)
|
||||
mod_conference: play files saying vol level in conf in lieu of making a function of say modules to return file_string urls (we need that) (r:94b680fb)
|
||||
mod_conference: fire auto gain level events (r:d8ef36ed)
|
||||
mod_conference: clear talk flag when you mute (r:b7419add)
|
||||
mod_conference: fix pthread mutex lock error and add some tab completion and help messages from cli (r:547d5393/FS-3095)
|
||||
mod_conference: Use the channel's sound_prefix if it's not set in the conference's config (r:0911ed74/FS-3124)
|
||||
mod_curl: use method=post when post requested (r:c6a4ddd0/FSMOD-69)
|
||||
mod_db: fix stack corruption (MODAPP-407)
|
||||
mod_dialplan_xml: Add in the INFO log the caller id number when processing a request (Currenly only show the caller name) (r:e1df5e13)
|
||||
|
@ -531,6 +547,8 @@ freeswitch (1.0.7)
|
|||
mod_sndfile: Add support for .alaw and .ulaw to mod_sndfile (r:facf09b8/MODFORM-41)
|
||||
mod_sndfile: return break in mod_sndfile when seek returns failure (r:564dc7e4)
|
||||
mod_snmp: initial checkin of mod_snmp (r:6e2b1bd3)
|
||||
mod_snmp: fix segfault when getting channel list (r:b6b4e6b5/FS-3114)
|
||||
mod_snmp: fix segv when snmpwalking ringing channels, fix segv in snmp getBulkRequest (r:9c4c1e81/FS-3120)
|
||||
mod_sofia: Send SIP MESSAGE to unregistered users by prefixing sip: to user@domain
|
||||
mod_sofia: fix callee being updated with callee information
|
||||
mod_sofia: set appearance-index in update statement for SLA
|
||||
|
@ -665,6 +683,12 @@ freeswitch (1.0.7)
|
|||
mod_sofia: segfault with sofia_contact when invalid parameters are given (r:4e60f14a/FS-3072)
|
||||
mod_sofia: Fix minupnpd nat_map updated IP not getting set in SIP profiles (r:e7acd4d1/FS-3054)
|
||||
mod_sofia: add sip_execute_on_image variable similar to execute_on_answer etc so you can run t38_gateway or rxfax etc when you get a T.38 re-invite but no CNG tone or you want to ignore the tone and only react when getting a T.38 re-invite (r:53fc3f7f)
|
||||
mod_sofia: add sip_jitter_buffer_during_bridge which you can set to true to keep a jitter buffer on both ends of the call when you are NormT (r:01073a79)
|
||||
mod_sofia: fix race condition in sofia recover for atom processors (r:3eeb4995/FS-3117)
|
||||
mod_sofia: improve codec ordering in ep_codec_string (r:8fe24a29/FS-3121)
|
||||
mod_sofia: Send BYE to endpoints that lose race even if they answered (r:8c3651fa/FS-640)
|
||||
mod_sofia: do not renegotiate codecs on hold re-invites (r:bfd0ba97)
|
||||
mod_sofia: add rtp-notimer-during-bridge (alternative to rtp-autoflush-during-bridge (r:2a35dfb5)
|
||||
mod_spandsp: initial checkin of mod_fax/mod_voipcodecs merge into mod_spandsp (r:fa9a59a8)
|
||||
mod_spandsp: rework of new mod_spandsp to have functions broken up into different c files (r:65400642)
|
||||
mod_spandsp: improve duplicate digit detection and add 'min_dup_digit_spacing_ms' channel variable for use with the dtmf detector (r:eab4f246/FSMOD-45)
|
||||
|
@ -689,6 +713,7 @@ freeswitch (1.0.7)
|
|||
mod_valet_parking: add event data to valet parking hold event
|
||||
mod_valet_parking: add event for Valet Parking action exit
|
||||
mod_valet_parking: pass hold class on transfer (r:76a065ec)
|
||||
mod_valet_parking: add valet_announce_slot variable (r:293d7254)
|
||||
mod_voicemail: Fix vm_prefs profile lock (MODAPP-417)
|
||||
mod_voicemail: add 'vm-enabled' param (default true)
|
||||
mod_voicemail: fix vm msg being deleted when pressing key to forward to email (MODAPP-403)
|
||||
|
|
|
@ -429,6 +429,12 @@
|
|||
<!-- The following phrases still need to be recorded -->
|
||||
<prompt phrase="You are caller number one. Of course, *every* caller is number one in our book so you may be waiting a while." filename="ivr-youre_number_one.wav"/>
|
||||
<prompt phrase="...has called emergency services" filename="ivr-has_called_emergency_services.wav"/>
|
||||
<prompt phrase="There are..." filename="ivr-there_are.wav"/>
|
||||
<prompt phrase="Enter the number of listeners at this location, then press pound." filename="conf-number_of_listeners.wav"/>
|
||||
<prompt phrase="...listeners in this conference." filename="conf-listeners_in_conference.wav"/>
|
||||
<prompt phrase="...members in this conference." filename="conf-members_in_conference.wav"/>
|
||||
<prompt phrase="Please enter the source telephone number, then press pound." filename="ivr-enter_source_telephone_number.wav"/>
|
||||
<prompt phrase="Please enter the destination telephone number, then press pound." filename="ivr-enter_destination_telephone_number.wav"/>
|
||||
</ivr>
|
||||
<misc>
|
||||
<prompt phrase="This call has been secured" filename="call_secured.wav"/>
|
||||
|
|
|
@ -316,16 +316,20 @@
|
|||
<currency>
|
||||
<prompt phrase="и" filename="and.wav"/>
|
||||
<prompt phrase="Цент" filename="cent.wav"/>
|
||||
<prompt phrase="Цента" filename="centa.wav"/>
|
||||
<prompt phrase="центральный" filename="central.wav"/>
|
||||
<prompt phrase="Центов в минуту" filename="cents-per-minute.wav"/>
|
||||
<prompt phrase="Центов" filename="centov.wav"/>
|
||||
<prompt phrase="Центы" filename="cents.wav"/>
|
||||
<prompt phrase="Доллар" filename="dollar.wav"/>
|
||||
<prompt phrase="Долларов" filename="dollars.wav"/>
|
||||
<prompt phrase="Доллара" filename="dollara.wav"/>
|
||||
<prompt phrase="Доллары" filename="dollari.wav"/>
|
||||
<prompt phrase="Минус" filename="minus.wav"/>
|
||||
<prompt phrase="Отрицательный" filename="negative.wav"/>
|
||||
<prompt phrase="Копеек" filename="kopeck-i.wav"/>
|
||||
<prompt phrase="Копейки" filename="kopeck-i.wav"/>
|
||||
<prompt phrase="Копейка" filename="kopeck.wav"/>
|
||||
<prompt phrase="Копейки" filename="kopecks.wav"/>
|
||||
<prompt phrase="Копеек" filename="kopecks.wav"/>
|
||||
<prompt phrase="Рубль" filename="ruble.wav"/>
|
||||
<prompt phrase="Рубля" filename="ruble-a.wav"/>
|
||||
<prompt phrase="Рублей" filename="rubles.wav"/>
|
||||
|
@ -395,6 +399,7 @@
|
|||
<prompt phrase="срочное сообщение сохранено" filename="vm-urgent-saved.wav"/>
<!--urgent saved -->
|
||||
<prompt phrase="сохранено" filename="vm-saved.wav"/>
<!--saved -->
|
||||
<prompt phrase="сохранённых" filename="vm-savedx.wav"/>
<!--saved -->
|
||||
<prompt phrase="сохранное" filename="vm-save.wav"/>
<!--saved -->
|
||||
<prompt phrase="сообщение" filename="vm-message.wav"/>
<!--message -->
|
||||
<prompt phrase="сообщений" filename="vm-messagex.wav"/>
<!--messages -->
|
||||
<prompt phrase="сообщения" filename="vm-messages.wav"/>
<!-- message -->
|
||||
|
@ -431,26 +436,39 @@
|
|||
<prompt phrase="пожалуйста, введите добавочный номер для отправки сообщения" filename="vm-forward_enter_ext.wav"/>
<!--please, enter the extention to forward this message to -->
|
||||
<prompt phrase="Неправильный добавочный номер" filename="vm-that_was_an_invalid_ext.wav"/>
<!-- -->
|
||||
<prompt phrase="Почтовый ящик переполнен. Пожалуйста перезвоните позже" filename="vm-mailbox_full.wav"/>
<!-- That mailbox is full. Please try your call again later. -->
|
||||
<!-- Дописать-->
|
||||
<prompt phrase="Ваш персональный номер, он же пин, используется для предотвращения доступа другими к вашим голосовым сообщениям. Хотите сменить его сейчас?" filename="vm-tutorial_change_pin.wav"/><!--Your personal identification number, or 'pin', is used to prevent others from accessing your voicemail messages. Would you like to change it now? -->
|
||||
<prompt phrase="Вызываемый абонент сейчас недоступен и не имеет голосовой почты" filename="vm-not_available_no_voicemail.wav"/> <!-- The person you are trying to reach is not available and does not have voicemail.-->
|
||||
<prompt phrase="Добро пожаловать в Вашу новую голосовую почту. Для того, что бы прослушать инструкцию и настроить вашу голосовую почту, нажмите 1. Чтобы пропустить этот шаг, нажмите 2" filename="vm-tutorial_yes_no.wav"/><!-- Welcome to your new voicemail. To listen to a tutorial and setup your voice mail box, press 1. To skip, press 2.-->
|
||||
<prompt phrase="Необходимо записать Ваше имя и фамилию. Эта запись используется системой, включая справочник организации" filename="vm-tutorial_record_name.wav"/><!--I need to record your first and last name. This recording is used throughout the system, including in the company directory.-->
|
||||
<!-- Дописать-->
|
||||
|
||||
</voicemail>
|
||||
<directory>
|
||||
<!-- The following phrases still need to be recorded -->
|
||||
<prompt phrase="Пожалуйста, введите первые буквы имени абонента" filename="dir-enter-person.wav"/> <!--Please enter the first few letters of the persons-->
|
||||
<prompt phrase="Пожалуйста, введите первые буквы имени абонента" filename="dir-enter_person.wav"/> <!--Please enter the first few letters of the persons-->
|
||||
<prompt phrase="Фамилии" filename="dir-last_name.wav"/> <!--last name.-->
|
||||
<prompt phrase="Искать по ..." filename="dir-to_search_by.wav"/><!--To search by-->
|
||||
<prompt phrase="Имени" filename="dir-first_name.wav"/><!--first name.-->
|
||||
<prompt phrase="По Вашему запросу ничего не найдено, попробуйте еще раз" filename="dir-no_match_entry.wav"/><!--Your search matched no results, try again.-->
|
||||
<prompt phrase="По Вашему запросу ничего не найдено" filename="dir-no_match_entry.wav"/><!--Your search matched no results.-->
|
||||
<prompt phrase="результаты Вашего запроса" filename="dir-result_match.wav"/><!--results matched your search.-->
|
||||
<prompt phrase="По Вашему запросу найдено слишком много вариантов, пожалуйста, попробуйте уточнить запрос" filename="dir-to_many_result.wav"/><!--Your search returned too many results, please try again.-->
|
||||
<prompt phrase="нет больше вариантов" filename="dir-no_more_result.wav"/><!--No more results.-->
|
||||
<prompt phrase="По Вашему запросу найдено слишком много вариантов, пожалуйста, попробуйте уточнить запрос" filename="dir-too_many_result.wav"/><!--Your search returned too many results, please try again.-->
|
||||
<prompt phrase="нет больше вариантов" filename="dir-no_more_results.wav"/><!--No more results.-->
|
||||
<prompt phrase="Номер варианта" filename="dir-result_number.wav"/><!--Result number.-->
|
||||
<prompt phrase="добавочный номер" filename="dir-at_extension.wav"/><!--at extension-->
|
||||
<prompt phrase="Для выбора этой записи" filename="dir-to_select_entry.wav"/><!--To select this entry-->
|
||||
<prompt phrase="Для выбора следующей записи" filename="dir-for_next.wav"/><!--For the next entry-->
|
||||
<prompt phrase="Для выбора предыдущей записи" filename="dir-for_prev.wav"/><!--For the previous entry-->
|
||||
<prompt phrase="Для начала нового поиска" filename="dir-to_make_new_search.wav"/><!--To start a new search-->
|
||||
<prompt phrase="Вам необходимо указать минимум ..." filename="dir-specify_mininum_first.wav"/><!--You need to specify a minimum of-->
|
||||
<prompt phrase="букв имени абонента, попробуйте снова" filename="dir-letters_of_person_name.wav"/><!--letters of the person name, try again.-->
|
||||
<prompt phrase="Для начала нового поиска" filename="dir-start_new_search.wav"/><!--To start a new search-->
|
||||
<prompt phrase="Вам необходимо указать минимум ..." filename="dir-specify_mininum.wav"/><!--You need to specify a minimum of-->
|
||||
<prompt phrase="букв имени абонента" filename="dir-letters_of_person_name.wav"/><!--letters of the person name.-->
|
||||
<prompt phrase="нажмите" filename="dir-press.wav"/> <!--press vm-press.wav-->
|
||||
<prompt phrase="Попробуйте снова" filename="dir-please_try_again.wav"/>^<!-- Please try again. ivr-please_try_again.wav-->
|
||||
<!--дописать-->
|
||||
<prompt phrase="Пожалуйста, введите первые буквы имени или фамилии абонента" filename="dir-enter_person_first_or_last.wav"/><!-- Please enter the first few letters of the person's first or last name-->
|
||||
<prompt phrase="нет результатов по запросу." filename="dir-no_matching_results.wav"/><!-- There were no matching results.-->
|
||||
<!--дописать-->
|
||||
|
||||
</directory>
|
||||
|
||||
|
||||
|
@ -460,7 +478,7 @@
|
|||
<prompt phrase="Ваш микрофон отключен" filename="conf-muted.wav"/>
<!-- You are now muted. -->
|
||||
<prompt phrase="Ваш микрофон включён" filename="conf-unmuted.wav"/>
<!-- You are now unmuted. -->
|
||||
<prompt phrase="Вы единственный участник конференции" filename="conf-alone.wav"/>
<!-- You are currently the only person in this conference. -->
|
||||
<prompt phrase="NULL" filename="conf-perpetual.wav" type="tone"/>
<!-- -->
|
||||
<prompt phrase="NULL" filename="conf-perpetual.wav" type="music"/>
|
||||
<prompt phrase="NULL" filename="conf-enter.wav" type="tone"/>
<!-- -->
|
||||
<prompt phrase="NULL" filename="conf-exit.wav" type="tone"/>
<!-- -->
|
||||
<prompt phrase="Вы были отключены от конференции" filename="conf-kicked.wav"/>
<!-- You have been kicked from this conference. -->
|
||||
|
@ -471,6 +489,15 @@
|
|||
<prompt phrase="Неправильный пин-код, попробуйте снова" filename="conf-bad-pin.wav"/>
<!-- Invalid pin number, try again. -->
|
||||
<prompt phrase="До свидания" filename="conf-goodbye.wav"/>
<!-- goodbye -->
|
||||
<prompt phrase="Добро пожаловать в конференцию" filename="conf-welcome.wav"/>
<!--Welcome to the conference. -->
|
||||
<!-- дописать -->
|
||||
<prompt phrase="Пожалуйста, введите номер конференции, завершив нажатием на клавишу решетка" filename="conf-enter_conf_number.wav"/> <!-- Please enter the conference number, followed by the pound key -->
|
||||
<prompt phrase="Ваш микрофон уже выключен." filename="conf-you_are_already_muted.wav"/> <!-- You are already muted. -->
|
||||
<prompt phrase="Звук и микрофон сейчас выключены." filename="conf-you_are_now_bidirectionally_muted.wav"/> <!-- You are now bi-directionally muted. -->
|
||||
<prompt phrase="...Вошёл в конференцию." filename="conf-has_joined.wav"/> <!-- ...has entered the conference. -->
|
||||
<prompt phrase="Введите ПИН код конференции, завершив нажатием на клавишу решётка." filename="conf-enter_conf_pin.wav"/> <!-- Enter the conference PIN number, followed by the pound key. -->
|
||||
<prompt phrase="...Покинул конференцию." filename="conf-has_left.wav"/> <!-- ...has left the conference. -->
|
||||
<!-- дописать -->
|
||||
|
||||
</conference>
|
||||
<ivr>
|
||||
<prompt phrase="Номер счета" filename="ivr-account_number.wav"/>
<!-- Account number -->
|
||||
|
@ -479,11 +506,11 @@
|
|||
<prompt phrase="Пожалуйста, введите добавочный номер абонента завершив нажатием на клавишу решётка" filename="ivr-enter_ext.wav"/>
<!-- Please enter an extension followed by the pound sign-->
|
||||
<prompt phrase="Для этого абонента" filename="ivr-for_this_person.wav"/>
<!-- For this person -->
|
||||
<prompt phrase="Пожалуйста, оставайтесь на линии, идет соединение" filename="ivr-hold_connect_call.wav"/>
<!-- Please hold while I connect your call -->
|
||||
<prompt phrase="Извините" filename="ivr-im_sorry.wav"/>
<!-- I'm sorry -->
|
||||
<prompt phrase="Пожалуйста" filename="ivr-please.wav"/>
<!-- Please -->
|
||||
<prompt phrase="Пожалуйста, перезвоните нам в …" filename="ivr-please_return_our_call_at.wav"/>
<!-- Please return our call at -->
|
||||
<prompt phrase="относительно номера ссылки" filename="ivr-regarding_reference_number.wav"/>
<!-- Regarding reference number -->
|
||||
<prompt phrase="Это пример голосового подменю" filename="ivr-sample_submenu.wav"/>
<!-- This is a sample IVR submenu... -->
|
||||
<prompt phrase="Извините" filename="ivr-im_sorry.wav"/> <!-- I'm sorry -->
|
||||
<prompt phrase="Пожалуйста" filename="ivr-please.wav"/><!-- Please -->
|
||||
<prompt phrase="Пожалуйста, перезвоните нам в …" filename="ivr-please_return_our_call_at.wav"/><!-- Please return our call at -->
|
||||
<prompt phrase="относительно номера ссылки" filename="ivr-regarding_reference_number.wav"/><!-- Regarding reference number -->
|
||||
<prompt phrase="Это пример голосового подменю" filename="ivr-sample_submenu.wav"/><!-- This is a sample IVR submenu... -->
|
||||
<prompt phrase="Пожалуйста, представьтесь после сигнала" filename="ivr-say_name.wav"/>
<!-- Please say your name after the tone -->
|
||||
<prompt phrase="Перенаправить на голосовую почту" filename="ivr-send_to_voicemail.wav"/>
<!-- Send this caller to voicemail -->
|
||||
<prompt phrase="Для разговора с представителем по обслуживанию клиентов" filename="ivr-speak_to_a_customer_service_representative.wav"/>
<!-- To speak to a customer service representative -->
|
||||
|
@ -508,7 +535,7 @@
|
|||
<prompt phrase="Вызов" filename="ivr-call.wav"/>
<!-- call -->
|
||||
<prompt phrase="Вы можете" filename="ivr-you_may.wav"/>
<!-- You may -->
|
||||
<prompt phrase="Здравствуйте" filename="ivr-hello.wav"/>
<!-- hello -->
|
||||
<prompt phrase="Используя клавиатуру телефона…" filename="ivr-use_telephone_keypad.wav"/>
<!-- Using your telephone keypad... -->
|
||||
<prompt phrase="Используя клавиатуру телефона…" filename="ivr-using_telephone_keypad.wav"/>
<!-- Using your telephone keypad... переименовать ivr-use_telephone_keypad.wav -->
|
||||
<prompt phrase="Пожалуйста, назовите имя сотрудника, которому пытаетесь дозвониться" filename="ivr-spell_name.wav"/>
<!-- please spell the name of the person you are trying to reach. -->
|
||||
<prompt phrase="Сначала фамилия" filename="ivr-last_name_first.wav"/>
<!--Last name firs -->
|
||||
<prompt phrase="Сначала имя" filename="ivr-first_name_first.wav"/>
<!--First name first -->
|
||||
|
@ -545,7 +572,7 @@
|
|||
<prompt phrase="Меньше чем..." filename="ivr-less_than.wav" attr="Needs_to_be_recorded!"/><!-- "Less than..."-->
|
||||
<prompt phrase="Начать запись" filename="ivr-begin_recording.wav " attr="Needs_to_be_recorded!"/><!--"Begin recording." -->
|
||||
<prompt phrase="Переадресация звонков была отменена" filename="ivr-call_forwarding_has_been_cancelled.wav" attr="Needs_to_be_recorded!"/><!--"Call forwarding has been cancelled." -->
|
||||
<prompt phrase="Переадресация звонков была настроена" filename="ivr-call_forwarding_has_been_set.wav " attr="Needs_to_be_recorded!"/><!--"Call forwarding has been set." -->
|
||||
<prompt phrase="Переадресация звонков была настроена" filename="ivr-call_forwarding_has_been_set.wav" attr="Needs_to_be_recorded!"/><!--"Call forwarding has been set." -->
|
||||
<prompt phrase="Пожалуйста, введите номер телефона" filename="ivr-please_enter_the_phone_number.wav" attr="Needs_to_be_recorded!"/><!--"Please enter the phone number." -->
|
||||
<prompt phrase="Пожалуйста, назовите свое имя и цель Вашего звонка" filename="ivr-please_state_your_name_and_reason_for_calling.wav " attr="Needs_to_be_recorded!"/><!--"Please state your name and the reason for your call." -->
|
||||
<prompt phrase="Что бы принять звонок нажмите 1, чтобы отклонить звонок нажмите 2. Для отправки голосовой почты нажмите 3" filename="ivr-accept_reject_voicemail.wav" attr="Needs_to_be_recorded!"/><!--"To accept, press 1. To reject, press 2. To send to voicemail, press 3." -->
|
||||
|
@ -554,17 +581,66 @@
|
|||
<prompt phrase="Пожалуйста, оставайтесь на линии. Ваш звонок будет принят немедленно" filename="ivr-stay_on_line_call_answered_momentarily.wav" attr="Needs_to_be_recorded!"/><!--"Please stay on the line. You call will be answered momentarily." -->
|
||||
<prompt phrase="Ваш звонок был переведен" filename="ivr-call_being_transferred.wav" attr="Needs_to_be_recorded!"/><!--"Your call is being transferred." filename="ivr-call_being_transferred.wav" -->
|
||||
<prompt phrase="Пожалуйста, наслаждайтесь музыкой, пока Ваш вонок переводится" filename="ivr-enjoy_music_while_transfer.wav" attr="Needs_to_be_recorded!"/> <!--"Please enjoy the music while your call is being transferred." -->
|
||||
|
||||
|
||||
<!-- Дописать -->
|
||||
<prompt phrase="...покинул здание." filename="ivr-has_left_the_building.wav"/> <!-- ...has left the building. -->
|
||||
<prompt phrase="Добро пожаловать в..." filename="ivr-welcome_to.wav"/> <!-- Welcome to... -->
|
||||
<prompt phrase="У вас есть звонок от..." filename="ivr-call_from.wav"/> <!-- You have a call from... -->
|
||||
<prompt phrase="Подождите, пожалуйста." filename="ivr-one_moment_please.wav"/> <!-- One moment please. -->
|
||||
<prompt phrase="Режим не беспокоить был отменён." filename="ivr-dnd_cancelled.wav"/> <!-- Do not disturb has been cancelled. -->
|
||||
<prompt phrase="Доброе утро." filename="ivr-good_morning.wav"/> <!-- Good morning. -->
|
||||
<prompt phrase="Если нет, нажмите..." filename="ivr-if_not_press.wav"/> <!-- If not, press... -->
|
||||
<prompt phrase="Для справочника, нажмите..." filename="ivr-for_directory_press.wav"/> <!-- For a directory, press... -->
|
||||
<prompt phrase="Добрый вечер." filename="ivr-good_evening.wav"/> <!-- Good evening. -->
|
||||
<prompt phrase="Нажмите любую другую цифру..." filename="ivr-any_other_digit.wav"/> <!-- Press any other digit... -->
|
||||
<prompt phrase="Введите первые буквы имени абонента." filename="ivr-enter_letters_first_or_last_name.wav"/> <!-- Enter the first few letters of the person's first or last name. dir-enter_person.wav -->
|
||||
<prompt phrase="Пожалуйста введите..." filename="ivr-please_enter_the.wav"/> <!-- Please enter the... -->
|
||||
<prompt phrase="Пожалуйста, введите первые буквы фамилии абонента" filename="ivr-enter_letters_last_name.wav"/> <!-- Enter the first few letters of the person's last name. -->
|
||||
<prompt phrase="Вы вошли..." filename="ivr-you_entered.wav"/> <!-- You entered... -->
|
||||
<prompt phrase="для..." filename="ivr-for.wav"/> <!-- For... не нужно -->
|
||||
<prompt phrase="Внутренний номер..." filename="ivr-extension_number.wav"/> <!-- Extension number... -->
|
||||
<prompt phrase="Остаток на счёте составляет..." filename="ivr-account_balance_is.wav"/> <!-- The account balance is... -->
|
||||
<prompt phrase="Когда закончите нажмите клавишу решётка." filename="ivr-finished_pound_hash_key.wav"/> <!-- When you are finished, press the pound or hash key. -->
|
||||
<prompt phrase="...вызвал аварийные службы" filename="ivr-has_called_emergency_services.wav"/> <!-- ...has called emergency services -->
|
||||
<prompt phrase="Пожалуйста, укажите ваше имя и причину вашего звонка." filename="ivr-please_state_your_name_and_reason_for_calling.wav"/> <!-- Please state your name and the reason for your call. -->
|
||||
<prompt phrase="Если это правильно, нажмите..." filename="ivr-if_correct_press.wav"/> <!-- If this is correct, press... -->
|
||||
<prompt phrase="Добро пожаловать." filename="ivr-welcome.wav"/> <!-- Welcome. -->
|
||||
<prompt phrase="Пожалуйста введите номер очереди,завершив нажатием на клавишу решетка." filename="ivr-enter_queue_number.wav"/> <!-- Please enter the queue number, followed by the pound or hash sign. -->
|
||||
<prompt phrase="...завершив нажатием на клавишу решетка." filename="ivr-followed_by_pound.wav"/> <!-- ...followed by the pound or hash key. -->
|
||||
<prompt phrase="Этот телефон не предназначен для совершения внешних звонков." filename="ivr-phone_is_unassigned.wav"/> <!-- This phone is unassigned and may not be used to make external calls. -->
|
||||
<prompt phrase="Номер." filename="ivr-number.wav"/> <!-- Number. -->
|
||||
<prompt phrase="Нету вызовов ожидающих в этой очереди." filename="ivr-no_calls_waiting_in_queue.wav"/> <!-- There are no calls waiting in this queue. -->
|
||||
<prompt phrase="...Файлы..." filename="ivr-files-.wav"/> <!-- ...files... -->
|
||||
<prompt phrase="...файл..." filename="ivr-file.wav"/> <!-- ...file... -->
|
||||
<prompt phrase="Нажмите один для ДА. Нажмите два для НЕТ." filename="ivr-one_yes_two_no.wav"/> <!-- Press one for yes. Press two for no. -->
|
||||
<prompt phrase="Это меню не содержит никаких элементов. Пожалуйста, обратитесь к администратору." filename="ivr-no_menu_items.wav"/> <!-- This menu has no items. Please contact the administrator. -->
|
||||
<prompt phrase="Поздравляем! Этот телефон настроен правильно и теперь могут быть установлен пользователю." filename="ivr-phone_is_configured_properly.wav"/> <!-- Congratulations! This phone is configured properly and may now be assigned to a user. -->
|
||||
<prompt phrase="Этот телефон не правильно настроен." filename="ivr-phone_not_configured.wav"/> <!-- This phone is not configured properly. -->
|
||||
<prompt phrase="Добрый день." filename="ivr-good_afternoon.wav"/> <!-- Good afternoon. -->
|
||||
<prompt phrase="Спасибо за звонок. Если вы знаете внутренний номер телефона, пожалуйста, введите его сейчас или набрать девять для каталога." filename="ivr-generic_greeting.wav"/> <!-- Thank you for calling. If you know your party's extension, please enter it now, or dial nine for a directory. -->
|
||||
<prompt phrase="Спасибо." filename="ivr-Thank_you.wav"/> <!-- Thank you. -->
|
||||
<prompt phrase="Если это правильно нажмите один. Если нет, нажмите 2" filename="ivr-if_correct_one_if_not_two.wav"/> <!-- If this is correct, press 1. If not, press 2. -->
|
||||
<!-- Дописать -->
|
||||
|
||||
|
||||
|
||||
|
||||
</ivr>
|
||||
<misc>
|
||||
<prompt phrase="Этот звонок шифруется" filename="call_secured.wav"/>
<!-- This call has been secured -->
|
||||
<prompt phrase="завершаемый нажатием на клавишу решетка" filename="vm-followed_by.wav"/>
<!-- Followed by pound -->
|
||||
<prompt phrase="завершаемый нажатием на клавишу решетка" filename="followed.wav"/>
<!-- Followed by pound -->
|
||||
<prompt phrase="Если вы этот человек" filename="if_you_are_this_person.wav"/>
<!-- If you are this person -->
|
||||
<prompt phrase="Если вы хотите" filename="if_you_would_like_to.wav"/>
<!-- If you would like to -->
|
||||
<prompt phrase="Предоставьте номер ссылки" filename="provide_reference_number.wav"/>
<!-- Provide reference number -->
|
||||
<prompt phrase="Пожалуйста, введите добавочный номер на который хотите перевести звонок" filename="transfer1.wav"/>
<!-- Please enter extension you want to transfer to -->
|
||||
<prompt phrase="Перевод" filename="transfer2.wav"/>
<!-- Transfer -->
|
||||
<prompt phrase="Мы пытаемся связаться" filename="we_are_trying_to_reach.wav"/>
<!-- We are trying to reach -->
|
||||
<prompt phrase="Мы пытаемся связаться..." filename="we_are_trying_to_reach.wav"/>
<!-- We are trying to reach -->
|
||||
<prompt phrase="Произошла ошибка, пожалуйста обратитесь к администратору" filename="error.wav"/>
<!-- An error has occurred please contact the administrator -->
|
||||
<!-- Записать-->
|
||||
<prompt phrase="Ваш звонок будет завершен через" filename="misc-your_call_will_be_terminated_in.wav"/>
|
||||
<prompt phrase="Ваш звонок был завершён" filename="misc-your_call_has_been_terminated.wav"/>
|
||||
<!-- Записать-->
|
||||
</misc>
|
||||
<base256>
|
||||
<!-- base256 prompts for SAS -->
|
||||
|
|
|
@ -277,25 +277,36 @@ English language phrases module and directory structure for say module and voice
|
|||
|
||||
%package lang-ru
|
||||
Summary: Provides russian language dependand modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/LibrariesRequires: %{name} = %{version}-%{release}
|
||||
Group: System/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description lang-ru
|
||||
Russian language phrases module and directory structure for say module and voicemail
|
||||
|
||||
%package lang-fr
|
||||
Summary: Provides french language dependand modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/LibrariesRequires: %{name} = %{version}-%{release}
|
||||
Summary: Provides french language dependend modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description lang-fr
|
||||
French language phrases module and directory structure for say module and voicemail
|
||||
|
||||
%package lang-de
|
||||
Summary: Provides german language dependand modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/LibrariesRequires: %{name} = %{version}-%{release}
|
||||
Summary: Provides german language dependend modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description lang-de
|
||||
German language phrases module and directory structure for say module and voicemail
|
||||
|
||||
%package lang-he
|
||||
Summary: Provides hebrew language dependend modules and speech config for the FreeSWITCH Open Source telephone platform.
|
||||
Group: System/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description lang-he
|
||||
Hebrew language phrases module and directory structure for say module and voicemail
|
||||
|
||||
|
||||
%package freetdm
|
||||
Summary: Provides a unified interface to hardware TDM cards and ss7 stacks for FreeSWITCH
|
||||
|
@ -473,7 +484,7 @@ EVENT_HANDLERS_MODULES="event_handlers/mod_cdr_csv event_handlers/mod_cdr_sqlite
|
|||
# File and Audio Format Handlers
|
||||
#
|
||||
######################################################################################################################
|
||||
FORMATS_MODULES="formats/mod_file_string formats/mod_local_stream formats/mod_native_file formats/mod_portaudio_stream \
|
||||
FORMATS_MODULES="formats/mod_local_stream formats/mod_native_file formats/mod_portaudio_stream \
|
||||
formats/mod_shout formats/mod_sndfile formats/mod_tone_stream"
|
||||
|
||||
######################################################################################################################
|
||||
|
@ -499,7 +510,7 @@ PASSTHRU_CODEC_MODULES="codecs/mod_amr codecs/mod_amrwb codecs/mod_g723_1 codecs
|
|||
# Phrase engine language modules
|
||||
#
|
||||
######################################################################################################################
|
||||
SAY_MODULES="say/mod_say_de say/mod_say_en say/mod_say_fr say/mod_say_ru"
|
||||
SAY_MODULES="say/mod_say_de say/mod_say_en say/mod_say_fr say/mod_say_he say/mod_say_ru"
|
||||
######################################################################################################################
|
||||
#
|
||||
# Timers
|
||||
|
@ -891,7 +902,6 @@ fi
|
|||
%{prefix}/mod/mod_event_socket.so*
|
||||
%{prefix}/mod/mod_expr.so*
|
||||
%{prefix}/mod/mod_fifo.so*
|
||||
%{prefix}/mod/mod_file_string.so*
|
||||
%{prefix}/mod/mod_flite.so*
|
||||
%{prefix}/mod/mod_fsv.so*
|
||||
%{prefix}/mod/mod_hash.so*
|
||||
|
@ -1092,12 +1102,27 @@ fi
|
|||
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/lang/ru/dir/*.xml
|
||||
%{prefix}/mod/mod_say_ru.so*
|
||||
|
||||
%files lang-he
|
||||
%defattr(-, freeswitch, daemon)
|
||||
%dir %attr(0750, freeswitch, daemon) %{prefix}/conf/lang/he/
|
||||
%dir %attr(0750, freeswitch, daemon) %{prefix}/conf/lang/he/demo
|
||||
%dir %attr(0750, freeswitch, daemon) %{prefix}/conf/lang/he/vm
|
||||
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/lang/he/*.xml
|
||||
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/lang/he/demo/*.xml
|
||||
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/lang/he/vm/*.xml
|
||||
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/lang/he/dir/*.xml
|
||||
%{prefix}/mod/mod_say_he.so*
|
||||
|
||||
######################################################################################################################
|
||||
#
|
||||
# Changelog
|
||||
#
|
||||
######################################################################################################################
|
||||
%changelog
|
||||
* Fri Apr 01 2011 - michal.bielicki@seventhsignal.de
|
||||
- added hebrew language stuff
|
||||
* Wed Mar 30 2011 - michal.bielicki@seventhsignal.de
|
||||
- removed mod_file_string since it has been merged into dptools
|
||||
* Wed Feb 16 2011 - michal.bielicki@seventhsignal.de
|
||||
- added mod_skinny
|
||||
- added sangoma libraries
|
||||
|
|
|
@ -263,6 +263,19 @@
|
|||
/js/nsprpub/pr/tests/dll/Makefile
|
||||
/js/src/jsautocfg.h
|
||||
/js/src/perlconnect/Makefile.PL
|
||||
/ldns/Makefile
|
||||
/ldns/doc/ldns_manpages
|
||||
/ldns/include/
|
||||
/ldns/ldns/config.h
|
||||
/ldns/ldns/net.h
|
||||
/ldns/ldns/util.h
|
||||
/ldns/lib
|
||||
/ldns/libtool
|
||||
/ldns/linktest
|
||||
/ldns/linktest.dSYM/
|
||||
/ldns/packaging/ldns-config
|
||||
/ldns/packaging/libldns.pc
|
||||
/ldns-1.6.9/
|
||||
/libdingaling/Makefile
|
||||
/libdingaling/Makefile.in
|
||||
/libdingaling/aclocal.m4
|
||||
|
@ -346,6 +359,7 @@
|
|||
/libg722_1/tests/Makefile
|
||||
/libg722_1/tests/Makefile.in
|
||||
/libg722_1/tests/regression_tests.sh
|
||||
/libg722_1/g722_1.pc
|
||||
/libsndfile/Cfg/compile
|
||||
/libsndfile/Cfg/config.guess
|
||||
/libsndfile/Cfg/config.sub
|
||||
|
@ -1126,3 +1140,6 @@ BuildLog*.htm
|
|||
/win32/celt/*/*/libcelt.log
|
||||
/win32/libg722_1/*/*/libg722_1.log
|
||||
/win32/libshout/*/*/libshout.log
|
||||
openssl_manifest.rc
|
||||
libeay32_manifest.rc
|
||||
ssleay32_manifest.rc
|
||||
|
|
|
@ -31,6 +31,24 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
/* Use select on windows and poll everywhere else.
|
||||
Select is the devil. Especially if you are doing a lot of small socket connections.
|
||||
If your FD number is bigger than 1024 you will silently create memory corruption.
|
||||
|
||||
If you have build errors on your platform because you don't have poll find a way to detect it and #define ESL_USE_SELECT and #undef ESL_USE_POLL
|
||||
All of this will be upgraded to autoheadache eventually.
|
||||
*/
|
||||
|
||||
/* TBD for win32 figure out how to tell if you have WSAPoll (vista or higher) and use it when available by #defining ESL_USE_WSAPOLL (see below) */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define FD_SETSIZE 8192
|
||||
#define ESL_USE_SELECT
|
||||
#else
|
||||
#define ESL_USE_POLL
|
||||
#endif
|
||||
|
||||
#include <esl.h>
|
||||
#ifndef WIN32
|
||||
#define closesocket(x) close(x)
|
||||
|
@ -42,6 +60,10 @@
|
|||
#pragma warning (default:6386)
|
||||
#endif
|
||||
|
||||
#ifdef ESL_USE_POLL
|
||||
#include <poll.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Written by Marc Espie, public domain */
|
||||
#define ESL_CTYPE_NUM_CHARS 256
|
||||
|
@ -614,6 +636,143 @@ ESL_DECLARE(esl_status_t) esl_listen(const char *host, esl_port_t port, esl_list
|
|||
|
||||
}
|
||||
|
||||
|
||||
/* USE WSAPoll on vista or higher */
|
||||
#ifdef ESL_USE_WSAPOLL
|
||||
ESL_DECLARE(int) esl_wait_sock(esl_socket_t sock, uint32_t ms, esl_poll_t flags)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef ESL_USE_SELECT
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 6262 ) /* warning C6262: Function uses '98348' bytes of stack: exceeds /analyze:stacksize'16384'. Consider moving some data to heap */
|
||||
#endif
|
||||
ESL_DECLARE(int) esl_wait_sock(esl_socket_t sock, uint32_t ms, esl_poll_t flags)
|
||||
{
|
||||
int s = 0, r = 0;
|
||||
fd_set rfds;
|
||||
fd_set wfds;
|
||||
fd_set efds;
|
||||
struct timeval tv;
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&wfds);
|
||||
FD_ZERO(&efds);
|
||||
|
||||
/* Wouldn't you rather know?? */
|
||||
assert(sock <= FD_SETSIZE);
|
||||
|
||||
|
||||
if ((flags & ESL_POLL_READ)) {
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(sock, &rfds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(sock, &rfds);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_WRITE)) {
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(sock, &wfds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(sock, &wfds);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_ERROR)) {
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(sock, &efds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(sock, &efds);
|
||||
#endif
|
||||
}
|
||||
|
||||
tv.tv_sec = ms / 1000;
|
||||
tv.tv_usec = (ms % 1000) * ms;
|
||||
|
||||
s = select(sock + 1, (flags & ESL_POLL_READ) ? &rfds : NULL, (flags & ESL_POLL_WRITE) ? &wfds : NULL, (flags & ESL_POLL_ERROR) ? &efds : NULL, &tv);
|
||||
|
||||
if (s < 0) {
|
||||
r = s;
|
||||
} else if (s > 0) {
|
||||
if ((flags & ESL_POLL_READ) && FD_ISSET(sock, &rfds)) {
|
||||
r |= ESL_POLL_READ;
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_WRITE) && FD_ISSET(sock, &wfds)) {
|
||||
r |= ESL_POLL_WRITE;
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_ERROR) && FD_ISSET(sock, &efds)) {
|
||||
r |= ESL_POLL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
|
||||
}
|
||||
#ifdef WIN32
|
||||
#pragma warning( pop )
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ESL_USE_POLL
|
||||
ESL_DECLARE(int) esl_wait_sock(esl_socket_t sock, uint32_t ms, esl_poll_t flags)
|
||||
{
|
||||
struct pollfd pfds[2] = { { 0 } };
|
||||
int s = 0, r = 0;
|
||||
|
||||
pfds[0].fd = sock;
|
||||
|
||||
if ((flags & ESL_POLL_READ)) {
|
||||
pfds[0].events |= POLLIN;
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_WRITE)) {
|
||||
pfds[0].events |= POLLOUT;
|
||||
}
|
||||
|
||||
if ((flags & ESL_POLL_ERROR)) {
|
||||
pfds[0].events |= POLLERR;
|
||||
}
|
||||
|
||||
s = poll(pfds, 1, ms);
|
||||
|
||||
if (s < 0) {
|
||||
r = s;
|
||||
} else if (s > 0) {
|
||||
if ((pfds[0].revents & POLLIN)) {
|
||||
r |= ESL_POLL_READ;
|
||||
}
|
||||
if ((pfds[0].revents & POLLOUT)) {
|
||||
r |= ESL_POLL_WRITE;
|
||||
}
|
||||
if ((pfds[0].revents & POLLERR)) {
|
||||
r |= ESL_POLL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *host, esl_port_t port, const char *user, const char *password, uint32_t timeout)
|
||||
{
|
||||
char sendbuf[256];
|
||||
|
@ -681,30 +840,17 @@ ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *
|
|||
rval = connect(handle->sock, (struct sockaddr*)&handle->sockaddr, sizeof(handle->sockaddr));
|
||||
|
||||
if (timeout) {
|
||||
fd_set wfds;
|
||||
struct timeval tv;
|
||||
int r;
|
||||
|
||||
tv.tv_sec = timeout / 1000;
|
||||
tv.tv_usec = (timeout % 1000) * 1000;
|
||||
FD_ZERO(&wfds);
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(handle->sock, &wfds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(handle->sock, &wfds);
|
||||
#endif
|
||||
|
||||
r = select(handle->sock + 1, NULL, &wfds, NULL, &tv);
|
||||
r = esl_wait_sock(handle->sock, timeout, ESL_POLL_WRITE);
|
||||
|
||||
if (r <= 0) {
|
||||
snprintf(handle->err, sizeof(handle->err), "Connection timed out");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!FD_ISSET(handle->sock, &wfds)) {
|
||||
if (!(r & ESL_POLL_WRITE)) {
|
||||
snprintf(handle->err, sizeof(handle->err), "Connection timed out");
|
||||
goto fail;
|
||||
}
|
||||
|
@ -823,9 +969,7 @@ ESL_DECLARE(esl_status_t) esl_disconnect(esl_handle_t *handle)
|
|||
|
||||
ESL_DECLARE(esl_status_t) esl_recv_event_timed(esl_handle_t *handle, uint32_t ms, int check_q, esl_event_t **save_event)
|
||||
{
|
||||
fd_set rfds, efds;
|
||||
struct timeval tv = { 0 };
|
||||
int max, activity;
|
||||
int activity;
|
||||
esl_status_t status = ESL_SUCCESS;
|
||||
|
||||
if (!ms) {
|
||||
|
@ -845,55 +989,24 @@ ESL_DECLARE(esl_status_t) esl_recv_event_timed(esl_handle_t *handle, uint32_t ms
|
|||
esl_mutex_unlock(handle->mutex);
|
||||
}
|
||||
|
||||
tv.tv_usec = ms * 1000;
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&efds);
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(handle->sock, &rfds);
|
||||
FD_SET(handle->sock, &efds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(handle->sock, &rfds);
|
||||
FD_SET(handle->sock, &efds);
|
||||
#endif
|
||||
|
||||
max = handle->sock + 1;
|
||||
activity = esl_wait_sock(handle->sock, ms, ESL_POLL_READ|ESL_POLL_ERROR);
|
||||
|
||||
if ((activity = select(max, &rfds, NULL, &efds, &tv)) < 0) {
|
||||
if (activity < 0) {
|
||||
handle->connected = 0;
|
||||
return ESL_FAIL;
|
||||
}
|
||||
|
||||
if (activity == 0 || !FD_ISSET(handle->sock, &rfds) || (esl_mutex_trylock(handle->mutex) != ESL_SUCCESS)) {
|
||||
if (activity == 0 || !(activity & ESL_POLL_READ) || (esl_mutex_trylock(handle->mutex) != ESL_SUCCESS)) {
|
||||
return ESL_BREAK;
|
||||
}
|
||||
|
||||
tv.tv_usec = 0;
|
||||
activity = esl_wait_sock(handle->sock, ms, ESL_POLL_READ|ESL_POLL_ERROR);
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&efds);
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4127 )
|
||||
FD_SET(handle->sock, &rfds);
|
||||
FD_SET(handle->sock, &efds);
|
||||
#pragma warning( pop )
|
||||
#else
|
||||
FD_SET(handle->sock, &rfds);
|
||||
FD_SET(handle->sock, &efds);
|
||||
#endif
|
||||
|
||||
activity = select(max, &rfds, NULL, &efds, &tv);
|
||||
|
||||
if (activity < 0) {
|
||||
handle->connected = 0;
|
||||
status = ESL_FAIL;
|
||||
} else if (activity > 0 && FD_ISSET(handle->sock, &rfds)) {
|
||||
} else if (activity > 0 && (activity & ESL_POLL_READ)) {
|
||||
if (esl_recv_event(handle, check_q, save_event)) {
|
||||
status = ESL_FAIL;
|
||||
}
|
||||
|
|
|
@ -46,6 +46,11 @@ extern "C" {
|
|||
typedef struct esl_event_header esl_event_header_t;
|
||||
typedef struct esl_event esl_event_t;
|
||||
|
||||
typedef enum {
|
||||
ESL_POLL_READ = (1 << 0),
|
||||
ESL_POLL_WRITE = (1 << 1),
|
||||
ESL_POLL_ERROR = (1 << 2)
|
||||
} esl_poll_t;
|
||||
|
||||
typedef enum {
|
||||
ESL_EVENT_TYPE_PLAIN,
|
||||
|
@ -446,6 +451,8 @@ ESL_DECLARE(esl_status_t) esl_filter(esl_handle_t *handle, const char *header, c
|
|||
*/
|
||||
ESL_DECLARE(esl_status_t) esl_events(esl_handle_t *handle, esl_event_type_t etype, const char *value);
|
||||
|
||||
ESL_DECLARE(int) esl_wait_sock(esl_socket_t sock, uint32_t ms, esl_poll_t flags);
|
||||
|
||||
#define esl_recv(_h) esl_recv_event(_h, 0, NULL)
|
||||
#define esl_recv_timed(_h, _ms) esl_recv_event_timed(_h, _ms, 0, NULL)
|
||||
|
||||
|
|
|
@ -1264,6 +1264,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
|||
caller_data.ani.plan = (uint8_t)atoi(sipvar);
|
||||
}
|
||||
|
||||
/* Used by ftmod_sangoma_ss7 only */
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-ANI-NADI");
|
||||
if (sipvar) {
|
||||
ftdm_usrmsg_add_var(&usrmsg, "ss7_clg_nadi", sipvar);
|
||||
}
|
||||
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-ANI2");
|
||||
if (sipvar) {
|
||||
ftdm_set_string(caller_data.aniII, sipvar);
|
||||
|
@ -1284,6 +1290,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
|||
caller_data.dnis.plan = (uint8_t)atoi(sipvar);
|
||||
}
|
||||
|
||||
/* Used by ftmod_sangoma_ss7 only */
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-DNIS-NADI");
|
||||
if (sipvar) {
|
||||
ftdm_usrmsg_add_var(&usrmsg, "ss7_clg_nadi", sipvar);
|
||||
}
|
||||
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS");
|
||||
if (sipvar) {
|
||||
ftdm_set_string(caller_data.rdnis.digits, sipvar);
|
||||
|
@ -1299,6 +1311,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
|||
caller_data.rdnis.plan = (uint8_t)atoi(sipvar);
|
||||
}
|
||||
|
||||
/* Used by ftmod_sangoma_ss7 only */
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-NADI");
|
||||
if (sipvar) {
|
||||
ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_nadi", sipvar);
|
||||
}
|
||||
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Screen");
|
||||
if (sipvar) {
|
||||
caller_data.screen = (uint8_t)atoi(sipvar);
|
||||
|
@ -1308,6 +1326,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
|||
if (sipvar) {
|
||||
caller_data.pres = (uint8_t)atoi(sipvar);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) {
|
||||
|
@ -1568,7 +1588,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
|||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS", "%s", channel_caller_data->rdnis.digits);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-TON", "%d", channel_caller_data->rdnis.type);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan);
|
||||
|
||||
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres);
|
||||
}
|
||||
|
@ -3818,7 +3838,7 @@ SWITCH_STANDARD_API(ft_function)
|
|||
"dial_regex: %s\n"
|
||||
"fail_dial_regex: %s\n"
|
||||
"hold_music: %s\n"
|
||||
"analog_options %s\n",
|
||||
"analog_options: %s\n",
|
||||
j,
|
||||
ftdm_span_get_name(SPAN_CONFIG[j].span),
|
||||
SPAN_CONFIG[j].type,
|
||||
|
@ -3844,7 +3864,7 @@ SWITCH_STANDARD_API(ft_function)
|
|||
"dial_regex: %s\n"
|
||||
"fail_dial_regex: %s\n"
|
||||
"hold_music: %s\n"
|
||||
"analog_options %s\n",
|
||||
"analog_options: %s\n",
|
||||
j,
|
||||
ftdm_span_get_name(SPAN_CONFIG[j].span),
|
||||
SPAN_CONFIG[j].type,
|
||||
|
@ -4298,7 +4318,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
|
|||
SWITCH_ADD_API(commands_api_interface, "ftdm", "FreeTDM commands", ft_function, FT_SYNTAX);
|
||||
switch_console_set_complete("add ftdm start");
|
||||
switch_console_set_complete("add ftdm stop");
|
||||
switch_console_set_complete("add ftdm retart");
|
||||
switch_console_set_complete("add ftdm restart");
|
||||
switch_console_set_complete("add ftdm dump");
|
||||
switch_console_set_complete("add ftdm sigstatus get");
|
||||
switch_console_set_complete("add ftdm sigstatus set");
|
||||
|
|
|
@ -3563,6 +3563,16 @@ static FIO_WRITE_FUNCTION(ftdm_raw_write)
|
|||
static FIO_READ_FUNCTION(ftdm_raw_read)
|
||||
{
|
||||
ftdm_status_t status = ftdmchan->fio->read(ftdmchan, data, datalen);
|
||||
|
||||
if (status == FTDM_SUCCESS && ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USE_RX_GAIN)
|
||||
&& (ftdmchan->native_codec == FTDM_CODEC_ALAW || ftdmchan->native_codec == FTDM_CODEC_ULAW)) {
|
||||
int i = 0;
|
||||
unsigned char *rdata = data;
|
||||
for (i = 0; i < *datalen; i++) {
|
||||
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
|
||||
}
|
||||
}
|
||||
|
||||
if (status == FTDM_SUCCESS && ftdmchan->fds[FTDM_READ_TRACE_INDEX] > -1) {
|
||||
ftdm_size_t dlen = *datalen;
|
||||
if ((ftdm_size_t)write(ftdmchan->fds[FTDM_READ_TRACE_INDEX], data, (int)dlen) != dlen) {
|
||||
|
@ -3730,7 +3740,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
|||
ftdm_status_t status = FTDM_FAIL;
|
||||
fio_codec_t codec_func = NULL;
|
||||
ftdm_size_t max = *datalen;
|
||||
unsigned i = 0;
|
||||
|
||||
ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "ftdmchan is null\n");
|
||||
ftdm_assert_return(ftdmchan->fio != NULL, FTDM_FAIL, "No I/O module attached to ftdmchan\n");
|
||||
|
@ -3769,13 +3778,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USE_RX_GAIN)
|
||||
&& (ftdmchan->native_codec == FTDM_CODEC_ALAW || ftdmchan->native_codec == FTDM_CODEC_ULAW)) {
|
||||
unsigned char *rdata = data;
|
||||
for (i = 0; i < *datalen; i++) {
|
||||
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
|
||||
}
|
||||
}
|
||||
handle_tone_generation(ftdmchan);
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
|
||||
|
|
|
@ -149,24 +149,19 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
|||
|
||||
|
||||
switch (sta->t.usta.alarm.cause) {
|
||||
/******************************************************************/
|
||||
case (LCM_CAUSE_UNKNOWN):
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s\n",
|
||||
buf,
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event));
|
||||
break;
|
||||
/******************************************************************/
|
||||
case (LCM_CAUSE_MGMT_INITIATED):
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s[MGMT] %s\n",
|
||||
buf,
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event));
|
||||
break;
|
||||
/******************************************************************/
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s (***unknown cause***)\n",
|
||||
buf,
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event));
|
||||
break;
|
||||
case (LCM_CAUSE_MGMT_INITIATED):
|
||||
ftdm_log(FTDM_LOG_DEBUG,"[MTP2]%s[MGMT] cause:%s event:%s\n",
|
||||
buf,
|
||||
DECODE_LCM_CAUSE(sta->t.usta.alarm.cause),
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event));
|
||||
break;
|
||||
case (LCM_CAUSE_UNKNOWN):
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_DEBUG,"[MTP2]%s cause:%s event:%s\n",
|
||||
buf,
|
||||
DECODE_LCM_CAUSE(sta->t.usta.alarm.cause),
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event));
|
||||
break;
|
||||
/******************************************************************/
|
||||
} /* switch (sta->t.usta.alarm.cause) */
|
||||
break;
|
||||
|
@ -211,7 +206,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
|||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n",
|
||||
ftdm_log(FTDM_LOG_DEBUG,"[MTP2]%s %s : %s\n",
|
||||
buf,
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event),
|
||||
DECODE_DISC_REASON(sta->t.usta.evntParm[1]));
|
||||
|
@ -402,7 +397,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta)
|
|||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP3]%s %s(%d) : %s(%d)\n",
|
||||
ftdm_log(FTDM_LOG_DEBUG,"[MTP3]%s %s(%d) : %s(%d)\n",
|
||||
buf,
|
||||
DECODE_LSN_EVENT(sta->t.usta.alarm.event),
|
||||
sta->t.usta.alarm.event,
|
||||
|
@ -421,7 +416,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta)
|
|||
break;
|
||||
/**************************************************************************/
|
||||
case (STLNKSET):
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP3][LNKSET:%d] %s : %s\n",
|
||||
ftdm_log(FTDM_LOG_DEBUG,"[MTP3][LNKSET:%d] %s : %s\n",
|
||||
sta->hdr.elmId.elmntInst1,
|
||||
DECODE_LSN_EVENT(sta->t.usta.alarm.event),
|
||||
DECODE_LSN_CAUSE(sta->t.usta.alarm.cause));
|
||||
|
|
|
@ -316,8 +316,11 @@ typedef struct sng_isup_ckt {
|
|||
uint32_t typeCntrl;
|
||||
uint32_t ssf;
|
||||
uint32_t switchType;
|
||||
|
||||
uint32_t clg_nadi;
|
||||
uint32_t cld_nadi;
|
||||
uint8_t rdnis_nadi;
|
||||
|
||||
uint32_t min_digits;
|
||||
void *obj;
|
||||
uint16_t t3;
|
||||
|
@ -786,8 +789,12 @@ uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum
|
|||
uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
||||
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||
uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
|
||||
|
||||
|
||||
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
ftdm_status_t copy_tknStr_to_sngss7(char* str, TknStr *tknStr, TknU8 *oddEven);
|
||||
|
||||
int check_for_state_change(ftdm_channel_t *ftdmchan);
|
||||
int check_cics_in_range(sngss7_chan_data_t *sngss7_info);
|
||||
|
|
|
@ -182,8 +182,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
|||
/* copy down the called number information */
|
||||
copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
|
||||
|
||||
/* copy down the calling number information */
|
||||
|
||||
/* copy down the calling number information */
|
||||
copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum);
|
||||
|
||||
/* check if the user would like a custom NADI value for the calling Pty Num */
|
||||
|
@ -195,7 +194,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
|||
iam.cgPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].clg_nadi;
|
||||
SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLG, using \"%d\"\n", iam.cgPtyNum.natAddrInd.val);
|
||||
}
|
||||
|
||||
|
||||
cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
|
||||
if ((cld_nadi != NULL) && (*cld_nadi)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called NADI value \"%s\"\n", cld_nadi);
|
||||
|
@ -244,6 +243,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
|||
} /* if (subAddrIE[0] != '0') */
|
||||
}
|
||||
|
||||
copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum);
|
||||
|
||||
/* check if the user would like us to send a cld_sub-address */
|
||||
cld_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_subaddr");
|
||||
if ((cld_subAddr != NULL) && (*cld_subAddr)) {
|
||||
|
|
|
@ -43,13 +43,6 @@ uint32_t sngss7_id;
|
|||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
||||
uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
||||
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||
uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||
|
||||
int check_for_state_change(ftdm_channel_t *ftdmchan);
|
||||
int check_cics_in_range(sngss7_chan_data_t *sngss7_info);
|
||||
int check_for_reset(sngss7_chan_data_t *sngss7_info);
|
||||
|
@ -134,11 +127,12 @@ uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
|
|||
cgPtyNum->niInd.val = 0x00;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->addrSig.pres = PRSNT_NODEF;
|
||||
|
||||
|
||||
/* atoi will search through memory starting from the pointer it is given until
|
||||
* it finds the \0...since tmp is on the stack it will start going through the
|
||||
* possibly causing corruption. Hard code a \0 to prevent this
|
||||
*/
|
||||
|
||||
tmp[1] = '\0';
|
||||
k = 0;
|
||||
j = 0;
|
||||
|
@ -334,8 +328,68 @@ uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
|
||||
ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum)
|
||||
{
|
||||
const char* val = NULL;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
|
||||
uint8_t len = strlen(caller_data->rdnis.digits);
|
||||
if (!len) {
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number %s\n", caller_data->rdnis.digits);
|
||||
|
||||
redirgNum->eh.pres = PRSNT_NODEF;
|
||||
|
||||
/* Nature of address indicator */
|
||||
redirgNum->natAddr.pres = PRSNT_NODEF;
|
||||
|
||||
val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_nadi");
|
||||
if (!ftdm_strlen_zero(val)) {
|
||||
redirgNum->natAddr.val = atoi(val);
|
||||
} else {
|
||||
redirgNum->natAddr.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].rdnis_nadi;
|
||||
}
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number NADI:%d\n", redirgNum->natAddr.val);
|
||||
|
||||
/* Screening indicator */
|
||||
redirgNum->scrInd.pres = PRSNT_NODEF;
|
||||
val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_screen_ind");
|
||||
if (!ftdm_strlen_zero(val)) {
|
||||
redirgNum->scrInd.val = atoi(val);
|
||||
} else {
|
||||
redirgNum->scrInd.val = FTDM_SCREENING_VERIFIED_PASSED;
|
||||
}
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Screening Ind:%d\n", redirgNum->scrInd.val);
|
||||
|
||||
/* Address presentation restricted ind */
|
||||
redirgNum->presRest.pres = PRSNT_NODEF;
|
||||
|
||||
val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_pres_ind");
|
||||
if (!ftdm_strlen_zero(val)) {
|
||||
redirgNum->presRest.val = atoi(val);
|
||||
} else {
|
||||
redirgNum->presRest.val = FTDM_PRES_ALLOWED;
|
||||
}
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Address Presentation Restricted Ind:%d\n", redirgNum->presRest.val);
|
||||
|
||||
/* Numbering plan */
|
||||
redirgNum->numPlan.pres = PRSNT_NODEF;
|
||||
|
||||
val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_plan");
|
||||
if (!ftdm_strlen_zero(val)) {
|
||||
redirgNum->numPlan.val = atoi(val);
|
||||
} else {
|
||||
redirgNum->numPlan.val = caller_data->rdnis.plan;
|
||||
}
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Numbering plan:%d\n", redirgNum->numPlan.val);
|
||||
|
||||
return copy_tknStr_to_sngss7(caller_data->rdnis.digits, &redirgNum->addrSig, &redirgNum->oddEven);
|
||||
}
|
||||
|
||||
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
|
@ -362,14 +416,14 @@ uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
|||
|
||||
} else {
|
||||
SS7_ERROR("Asked to copy tknStr that is not present!\n");
|
||||
return 1;
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
{
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
|
@ -382,7 +436,7 @@ uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
|||
/* confirm that we found an acceptable length */
|
||||
if ( j > 25 ) {
|
||||
SS7_ERROR("string length exceeds maxium value...aborting append!\n");
|
||||
return 1;
|
||||
return FTDM_FAIL;
|
||||
} /* if ( j > 25 ) */
|
||||
|
||||
/* copy in digits */
|
||||
|
@ -405,12 +459,100 @@ uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
|||
} /* if ((oddEven.pres == 1) && (oddEven.val == 1)) */
|
||||
} else {
|
||||
SS7_ERROR("Asked to copy tknStr that is not present!\n");
|
||||
return 1;
|
||||
return FTDM_FAIL;
|
||||
} /* if (str.pres == 1) */
|
||||
|
||||
return 0;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
ftdm_status_t copy_tknStr_to_sngss7(char* val, TknStr *tknStr, TknU8 *oddEven)
|
||||
{
|
||||
char tmp[2];
|
||||
int k = 0;
|
||||
int j = 0;
|
||||
uint8_t flag = 0;
|
||||
uint8_t odd = 0;
|
||||
|
||||
uint8_t lower = 0x0;
|
||||
uint8_t upper = 0x0;
|
||||
|
||||
tknStr->pres = PRSNT_NODEF;
|
||||
|
||||
/* atoi will search through memory starting from the pointer it is given until
|
||||
* it finds the \0...since tmp is on the stack it will start going through the
|
||||
* possibly causing corruption. Hard code a \0 to prevent this
|
||||
*/
|
||||
tmp[1] = '\0';
|
||||
|
||||
while (1) {
|
||||
/* grab a digit from the ftdm digits */
|
||||
tmp[0] = val[k];
|
||||
|
||||
/* check if the digit is a number and that is not null */
|
||||
while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
/* move on to the next value */
|
||||
k++;
|
||||
tmp[0] = val[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
/* check if tmp is null or a digit */
|
||||
if (tmp[0] != '\0') {
|
||||
/* push it into the lower nibble */
|
||||
lower = strtol(&tmp[0], (char **)NULL, 16);
|
||||
/* move to the next digit */
|
||||
k++;
|
||||
/* grab a digit from the ftdm digits */
|
||||
tmp[0] = val[k];
|
||||
|
||||
/* check if the digit is a number and that is not null */
|
||||
while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
k++;
|
||||
tmp[0] = val[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
/* check if tmp is null or a digit */
|
||||
if (tmp[0] != '\0') {
|
||||
/* push the digit into the upper nibble */
|
||||
upper = (strtol(&tmp[0], (char **)NULL, 16)) << 4;
|
||||
} else {
|
||||
/* there is no upper ... fill in 0 */
|
||||
upper = 0x0;
|
||||
/* throw the odd flag */
|
||||
odd = 1;
|
||||
/* throw the end flag */
|
||||
flag = 1;
|
||||
} /* if (tmp != '\0') */
|
||||
} else {
|
||||
/* keep the odd flag down */
|
||||
odd = 0;
|
||||
/* break right away since we don't need to write the digits */
|
||||
break;
|
||||
}
|
||||
|
||||
/* push the digits into the trillium structure */
|
||||
tknStr->val[j] = upper | lower;
|
||||
|
||||
/* increment the trillium pointer */
|
||||
j++;
|
||||
|
||||
/* if the flag is up we're through all the digits */
|
||||
if (flag) break;
|
||||
|
||||
/* move to the next digit */
|
||||
k++;
|
||||
} /* while(1) */
|
||||
|
||||
tknStr->len = j;
|
||||
oddEven->pres = PRSNT_NODEF;
|
||||
oddEven->val = odd;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
int check_for_state_change(ftdm_channel_t *ftdmchan)
|
||||
{
|
||||
|
|
|
@ -122,6 +122,7 @@ typedef struct sng_ccSpan
|
|||
uint32_t ssf;
|
||||
uint32_t clg_nadi;
|
||||
uint32_t cld_nadi;
|
||||
uint32_t rdnis_nadi;
|
||||
uint32_t min_digits;
|
||||
uint32_t t3;
|
||||
uint32_t t12;
|
||||
|
@ -1841,6 +1842,7 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
|
|||
int num_parms = cc_span->n_parameters;
|
||||
int flag_clg_nadi = 0;
|
||||
int flag_cld_nadi = 0;
|
||||
int flag_rdnis_nadi = 0;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
|
@ -1912,16 +1914,17 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
|
|||
flag_clg_nadi = 1;
|
||||
sng_ccSpan.clg_nadi = atoi(parm->val);
|
||||
SS7_DEBUG("Found default CLG_NADI parm->value = %d\n", sng_ccSpan.clg_nadi);
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(parm->var, "cld_nadi")) {
|
||||
/**********************************************************************/
|
||||
/* throw the flag so that we know we got this optional parameter */
|
||||
flag_cld_nadi = 1;
|
||||
sng_ccSpan.cld_nadi = atoi(parm->val);
|
||||
SS7_DEBUG("Found default CLD_NADI parm->value = %d\n", sng_ccSpan.cld_nadi);
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(parm->var, "rdnis_nadi")) {
|
||||
/* throw the flag so that we know we got this optional parameter */
|
||||
flag_rdnis_nadi = 1;
|
||||
sng_ccSpan.rdnis_nadi = atoi(parm->val);
|
||||
SS7_DEBUG("Found default RDNIS_NADI parm->value = %d\n", sng_ccSpan.rdnis_nadi);
|
||||
} else if (!strcasecmp(parm->var, "obci_bita")) {
|
||||
/**********************************************************************/
|
||||
if (*parm->val == '1') {
|
||||
sngss7_set_options(&sng_ccSpan, SNGSS7_ACM_OBCI_BITA);
|
||||
SS7_DEBUG("Found Optional Backwards Indicator: Bit A (early media) enable option\n");
|
||||
|
@ -2012,6 +2015,11 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
|
|||
sng_ccSpan.clg_nadi = 0x03;
|
||||
}
|
||||
|
||||
if (!flag_rdnis_nadi) {
|
||||
/* default the nadi value to national */
|
||||
sng_ccSpan.rdnis_nadi = 0x03;
|
||||
}
|
||||
|
||||
/* pull up the SSF and Switchtype from the isup interface */
|
||||
sng_ccSpan.ssf = g_ftdm_sngss7_data.cfg.isupIntf[sng_ccSpan.isupInf].ssf;
|
||||
sng_ccSpan.switchType = g_ftdm_sngss7_data.cfg.isupIntf[sng_ccSpan.isupInf].switchType;
|
||||
|
@ -2901,6 +2909,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
|||
g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits;
|
||||
|
|
|
@ -291,7 +291,7 @@ typedef enum {
|
|||
FTDM_USER_LAYER1_PROT_ALAW = 0x03,
|
||||
FTDM_USER_LAYER1_PROT_INVALID
|
||||
} ftdm_user_layer1_prot_t;
|
||||
#define USER_LAYER1_PROT_STRINGS "V.110", "u-law", "a-law", "Invalid"
|
||||
#define USER_LAYER1_PROT_STRINGS "V.110", "ulaw", "alaw", "Invalid"
|
||||
FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t)
|
||||
|
||||
/*! Calling Party Category */
|
||||
|
|
|
@ -0,0 +1,584 @@
|
|||
1.6.9 2011-03-16
|
||||
* Fix creating NSEC(3) bitmaps: make array size 65536,
|
||||
don't add doubles.
|
||||
* Fix printout of escaped binary in TXT records.
|
||||
* Parsing TXT records: don't skip starting whitespace that is quoted.
|
||||
* bugfix #358: Check if memory was successfully allocated in
|
||||
ldns_rdf2str().
|
||||
* Added more memory allocation checks in host2str.c
|
||||
* python wrapper for ldns_fetch_valid_domain_keys by Bedrich Kosata.
|
||||
* fix to compile python wrapper with swig 2.0.2.
|
||||
* Don't fallback to SHA-1 when creating NSEC3 hash with another
|
||||
algorithm identifier, fail instead (no other algorithm identifiers
|
||||
are assigned yet).
|
||||
|
||||
1.6.8 2011-01-24
|
||||
* Fix ldns zone, so that $TTL definition match RFC 2308.
|
||||
* Fix lots of missing checks on allocation failures and parse of
|
||||
NSEC with many types and max parse length in hosts_frm_fp routine
|
||||
and off by one in read_anchor_file routine (thanks Dan Kaminsky and
|
||||
Justin Ferguson).
|
||||
* bugfix #335: Drill: Print both SHA-1 and SHA-256 corresponding DS
|
||||
records.
|
||||
* Print correct WHEN in query packet (is not always 1-1-1970)
|
||||
* ldns-test-edns: new example tool that detects EDNS support.
|
||||
* fix ldns_resolver_send without openssl.
|
||||
* bugfix #342: patch for support for more CERT key types (RFC4398).
|
||||
* bugfix #351: fix udp_send hang if UDP checksum error.
|
||||
* fix set_bit (from NSEC3 sign) patch from Jan Komissar.
|
||||
|
||||
1.6.7 2010-11-08
|
||||
* EXPERIMENTAL ecdsa implementation, please do not enable on real
|
||||
servers.
|
||||
* GOST code enabled by default (RFC 5933).
|
||||
* bugfix #326: ignore whitespace between directives and their values.
|
||||
* Header comment to advertise ldns_axfr_complete to check for
|
||||
successfully completed zone transfers.
|
||||
* read resolv.conf skips interface labels, e.g. %eth0.
|
||||
* Fix drill verify NSEC3 denials.
|
||||
* Use closesocket() on windows.
|
||||
* Add ldns_get_signing_algorithm_by_name that understand aliases,
|
||||
names changed to RFC names and aliases for compatibility added.
|
||||
* bugfix: don't print final dot if the domain is relative.
|
||||
* bugfix: resolver search continue when packet rcode != NOERROR.
|
||||
* bugfix: resolver push all domains in search directive to list.
|
||||
* bugfix: resolver search by default includes the root domain.
|
||||
* bugfix: tcp read could fail on single octet recv.
|
||||
* bugfix: read of RR in unknown syntax with missing fields.
|
||||
* added ldns_pkt_tsig_sign_next() and ldns_pkt_tsig_verify_next()
|
||||
to sign and verify TSIG RRs on subsequent messages
|
||||
(section 4.4, RFC 2845, thanks to Michael Sheldon).
|
||||
* bugfix: signer sigs nsecs with zsks only.
|
||||
* bugfix #333: fix ldns_dname_absolute for name ending with backslash.
|
||||
|
||||
1.6.6 2010-08-09
|
||||
* Fix ldns_rr_clone to copy question rrs properly.
|
||||
* Fix ldns_sign_zone(_nsec3) to clone the soa for the new zone.
|
||||
* Fix ldns_wire2dname size check from reading 1 byte beyond buffer end.
|
||||
* Fix ldns_wire2dname from reading 1 byte beyond end for pointer.
|
||||
* Fix crash using GOST for particular platform configurations.
|
||||
* extern C declarations used in the header file.
|
||||
* Removed debug fprintf from resolver.c.
|
||||
* ldns-signzone checks if public key file is for the right zone.
|
||||
* NETLDNS, .NET port of ldns functionality, by Alex Nicoll, in contrib.
|
||||
* Fix handling of comments in resolv.conf parse.
|
||||
* GOST code enabled if SSL recent, RFC 5933.
|
||||
* bugfix #317: segfault util.c ldns_init_random() fixed.
|
||||
* Fix ldns_tsig_mac_new: allocate enough memory for the hash, fix use of
|
||||
b64_pton_calculate_size.
|
||||
* Fix ldns_dname_cat: size calculation and handling of realloc().
|
||||
* Fix ldns_rr_pop_rdf: fix handling of realloc().
|
||||
* Fix ldns-signzone for single type key scheme: sign whole zone if there
|
||||
are only KSKs.
|
||||
* Fix ldns_resolver: also close socket if AXFR failed (if you don't,
|
||||
it would block subsequent transfers (thanks Roland van Rijswijk).
|
||||
* Fix drill: allow for a secure trace if you use DS records as trust
|
||||
anchors (thanks Jan Komissar).
|
||||
|
||||
1.6.5 2010-06-15
|
||||
* Catch \X where X is a digit as an error.
|
||||
* Fix segfault when ip6 ldns resolver only has ip4 servers.
|
||||
* Fix NSEC record after DNSKEY at zone apex not properly signed.
|
||||
* Fix syntax error if last label too long and no dot at end of domain.
|
||||
* Fix parse of \# syntax with space for type LOC.
|
||||
* Fix ldns_dname_absolute for escape sequences, fixes some parse errs.
|
||||
* bugfix #297: linking ssl, bug due to patch submitted as #296.
|
||||
* bugfix #299: added missing declarations to host2str.h
|
||||
* ldns-compare-zones -s to not exclude SOA record from comparison.
|
||||
* --disable-rpath fix
|
||||
* fix ldns_pkt_empty(), reported by Alex Nicoll.
|
||||
* fix ldns_resolver_new_frm_fp not ignore lines after a comment.
|
||||
* python code for ldns_rr.new_question_frm_str()
|
||||
* Fix ldns_dnssec_verify_denial: the signature selection routine.
|
||||
* Type TALINK parsed (draft-ietf-dnsop-trust-history).
|
||||
* bugfix #304: fixed dead loop in ldns_tcp_read_wire() and
|
||||
ldns_tcp_read_wire_timeout().
|
||||
* GOST support with correct algorithm numbers. The plan is to make it
|
||||
enabled if openssl support is detected, but it is disabled by
|
||||
default in this release because the RFC is not ready.
|
||||
* Fixed comment in rbtree.h about being first member and data ptr.
|
||||
* Fixed possibly leak in case of out of memory in ldns_native2rdf...
|
||||
* ldns_dname_is_wildcard added.
|
||||
* Fixed: signatures over wildcards had the wrong labelcount.
|
||||
* Fixed ldns_verify() inconsistent return values.
|
||||
* Fixed ldns_resolver to copy and free tsig name, data and algorithm.
|
||||
* Fixed ldns_resolver to push search onto searchlist.
|
||||
* A ldns resolver now defaults to a non-recursive resolver that handles
|
||||
the TC bit.
|
||||
* ldns_resolver_print() prints more details.
|
||||
* Fixed ldns_rdf2buffer_str_time(), which did not print timestamps
|
||||
on 64bit systems.
|
||||
* Make ldns_resolver_nameservers_randomize() more random.
|
||||
* bugfix #310: POSIX specifies NULL second argument of gettimeofday.
|
||||
* fix compiler warnings from llvm clang compiler.
|
||||
* bugfix #309: ldns_pkt_clone did not clone the tsig_rr.
|
||||
* Fix gentoo ebuild for drill, 'no m4 directory'.
|
||||
* bugfix #313: drill trace on an empty nonterminal continuation.
|
||||
|
||||
1.6.4 2010-01-20
|
||||
* Imported pyldns contribution by Zdenek Vasicek and Karel Slany.
|
||||
Changed its configure and Makefile to fit into ldns.
|
||||
Added its dname_* methods to the rdf_* class (as is the ldns API).
|
||||
Changed swig destroy of ldns_buffer class to ldns_buffer_free.
|
||||
Declared ldns_pkt_all and ldns_pkt_all_noquestion so swig sees them.
|
||||
* Bugfix: parse PTR target of .tomhendrikx.nl with error not crash.
|
||||
* Bugfix: handle escaped characters in TXT rdata.
|
||||
* bug292: no longer crash on malformed domain names where a label is
|
||||
on position 255, which was a buffer overflow by one.
|
||||
* Fix ldns_get_rr_list_hosts_frm_fp_l (strncpy to strlcpy change),
|
||||
which fixes resolv.conf reading badly terminated string buffers.
|
||||
* Fix ldns_pkt_set_random_id to be more random, and a little faster,
|
||||
it did not do value 0 statistically correctly.
|
||||
* Fix ldns_rdf2native_sockaddr_storage to set sockaddr type to zeroes,
|
||||
for portability.
|
||||
* bug295: nsec3-hash routine no longer case sensitive.
|
||||
* bug298: drill failed nsec3 denial of existence proof.
|
||||
|
||||
1.6.3 2009-12-04
|
||||
* Bugfix: allow for unknown resource records in zonefile with rdlen=0.
|
||||
* Bugfix: also mark an RR as question if it comes from the wire
|
||||
* Bugfix: NSEC3 bitmap contained NSEC
|
||||
* Bugfix: Inherit class when creating signatures
|
||||
|
||||
1.6.2 2009-11-12
|
||||
* Fix Makefile patch from Havard Eidnes, better install.sh usage.
|
||||
* Fix parse error on SOA serial of 2910532839.
|
||||
Fix print of ';' and readback of '\;' in names, also for '\\'.
|
||||
Fix parse of '\(' and '\)' in names. Also for file read. Also '\.'
|
||||
* Fix signature creation when TTLs are different for RRs in RRset.
|
||||
* bug273: fix so EDNS rdata is included in pkt to wire conversion.
|
||||
* bug274: fix use of c++ keyword 'class' for RR class in the code.
|
||||
* bug275: fix memory leak of packet edns rdata.
|
||||
* Fix timeout procedure for TCP and AXFR on Solaris.
|
||||
* Fix occasional NSEC bitmap bogus
|
||||
* Fix rr comparing (was in reversed order since 1.6.0)
|
||||
* bug278: fix parsing HINFO rdata (and other cases).
|
||||
* Fix previous owner name: also pick up if owner name is @.
|
||||
* RFC5702: enabled sha2 functions by default. This requires OpenSSL 0.9.8 or higher.
|
||||
Reason for this default is the root to be signed with RSASHA256.
|
||||
* Fix various LDNS RR parsing issues: IPSECKEY, WKS, NSAP, very long lines
|
||||
* Fix: Make ldns_dname_is_subdomain case insensitive.
|
||||
* Fix ldns-verify-zone so that address records at zone NS set are not considered glue
|
||||
(Or glue records fall below delegation)
|
||||
* Fix LOC RR altitude printing.
|
||||
* Feature: Added period (e.g. '3m6d') support at explicit TTLs.
|
||||
* Feature: DNSKEY rrset by default signed with minimal signatures
|
||||
but -A option for ldns-signzone to sign it with all keys.
|
||||
This makes the DNSKEY responses smaller for signed domains.
|
||||
|
||||
1.6.1 2009-09-14
|
||||
* --enable-gost : use the GOST algorithm (experimental).
|
||||
* Added some missing options to drill manpage
|
||||
* Some fixes to --without-ssl option
|
||||
* Fixed quote parsing withing strings
|
||||
* Bitmask fix in EDNS handling
|
||||
* Fixed non-fqdn domain name completion for rdata field domain
|
||||
names of length 1
|
||||
* Fixed chain validation with SHA256 DS records
|
||||
|
||||
1.6.0
|
||||
Additions:
|
||||
* Addition of an ldns-config script which gives cflags and libs
|
||||
values, for use in configure scripts for applications that use
|
||||
use ldns. Can be disabled with ./configure --disable-ldns-config
|
||||
* Added direct sha1, sha256, and sha512 support in ldns.
|
||||
With these functions, all NSEC3 functionality can still be
|
||||
used, even if ldns is built without OpenSSL. Thanks to OpenBSD,
|
||||
Steve Reid, and Aaron D. Gifford for the code.
|
||||
* Added reading/writing support for the SPF Resource Record
|
||||
* Base32 functions are now exported
|
||||
Bugfixes:
|
||||
* ldns_is_rrset did not go through the complete rrset, but
|
||||
only compared the first two records. Thanks to Olafur
|
||||
Gudmundsson for report and patch
|
||||
* Fixed a small memory bug in ldns_rr_list_subtype_by_rdf(),
|
||||
thanks to Marius Rieder for finding an patching this.
|
||||
* --without-ssl should now work. Make sure that examples/ and
|
||||
drill also get the --without-ssl flag on their configure, if
|
||||
this is used.
|
||||
* Some malloc() return value checks have been added
|
||||
* NSEC3 creation has been improved wrt to empty nonterminals,
|
||||
and opt-out.
|
||||
* Fixed a bug in the parser when reading large NSEC3 salt
|
||||
values.
|
||||
* Made the allowed length for domain names on wire
|
||||
and presentation format the same.
|
||||
Example tools:
|
||||
* ldns-key2ds can now also generate DS records for keys without
|
||||
the SEP flag
|
||||
* ldns-signzone now equalizes the TTL of the DNSKEY RRset (to
|
||||
the first non-default DNSKEY TTL value it sees)
|
||||
|
||||
1.5.1
|
||||
Example tools:
|
||||
* ldns-signzone was broken in 1.5.0 for multiple keys, this
|
||||
has been repaired
|
||||
|
||||
Build system:
|
||||
* Removed a small erroneous output warning in
|
||||
examples/configure and drill/configure
|
||||
|
||||
1.5.0
|
||||
Bug fixes:
|
||||
* fixed a possible memory overflow in the RR parser
|
||||
* build flag fix for Sun Studio
|
||||
* fixed a building race condition in the copying of header
|
||||
files
|
||||
* EDNS0 extended rcode; the correct assembled code number
|
||||
is now printed (still in the EDNS0 field, though)
|
||||
* ldns_pkt_rr no longer leaks memory (in fact, it no longer
|
||||
copies anything all)
|
||||
|
||||
API addition:
|
||||
* ldns_key now has support for 'external' data, in which
|
||||
case the OpenSSL EVP structures are not used;
|
||||
ldns_key_set_external_key() and ldns_key_external_key()
|
||||
* added ldns_key_get_file_base_name() which creates a
|
||||
'default' filename base string for key storage, of the
|
||||
form "K<zone>+<algorithm>+<keytag>"
|
||||
* the ldns_dnssec_* family of structures now have deep_free()
|
||||
functions, which also free the ldns_rr's contained in them
|
||||
* there is now an ldns_match_wildcard() function, which checks
|
||||
whether a domain name matches a wildcard name
|
||||
* ldns_sign_public has been split up; this resulted in the
|
||||
addition of ldns_create_empty_rrsig() and
|
||||
ldns_sign_public_buffer()
|
||||
|
||||
Examples:
|
||||
* ldns-signzone can now automatically add DNSKEY records when
|
||||
using an OpenSSL engine, as it already did when using key
|
||||
files
|
||||
* added new example tool: ldns-nsec3-hash
|
||||
* ldns-dpa can now filter on specific query name and types
|
||||
* ldnsd has fixes for the zone name, a fix for the return
|
||||
value of recvfrom(), and an memory initialization fix
|
||||
(Thanks to Colm MacCárthaigh for the patch)
|
||||
* Fixed memory leaks in ldnsd
|
||||
|
||||
|
||||
|
||||
1.4.1
|
||||
Bug fixes:
|
||||
* fixed a build issue where ldns lib existence was done too early
|
||||
* removed unnecessary check for pcap.h
|
||||
* NSEC3 optout flag now correctly printed in string output
|
||||
* inttypes.h moved to configured inclusion
|
||||
* fixed NSEC3 type bitmaps for empty nonterminals and unsigned
|
||||
delegations
|
||||
|
||||
API addition:
|
||||
* for that last fix, we added a new function
|
||||
ldns_dname_add_from() that can clone parts of a dname
|
||||
|
||||
1.4.0
|
||||
Bug fixes:
|
||||
* sig chase return code fix (patch from Rafael Justo, bug id 189)
|
||||
* rdata.c memory leaks on error and allocation checks fixed (patch
|
||||
from Shane Kerr, bug id 188)
|
||||
* zone.c memory leaks on error and allocation checks fixed (patch
|
||||
from Shane Kerr, bug id 189)
|
||||
* ldns-zplit output and error messages fixed (patch from Shane Kerr,
|
||||
bug id 190)
|
||||
* Fixed potential buffer overflow in ldns_str2rdf_dname
|
||||
* Signing code no longer signs delegation NS rrsets
|
||||
* Some minor configure/makefile updates
|
||||
* Fixed a bug in the randomness initialization
|
||||
* Fixed a bug in the reading of resolv.conf
|
||||
* Fixed a bug concerning whitespace in zone data (with patch from Ondrej
|
||||
Sury, bug 213)
|
||||
* Fixed a small fallback problem in axfr client code
|
||||
|
||||
API CHANGES:
|
||||
* added 2str convenience functions:
|
||||
- ldns_rr_type2str
|
||||
- ldns_rr_class2str
|
||||
- ldns_rr_type2buffer_str
|
||||
- ldns_rr_class2buffer_str
|
||||
* buffer2str() is now called ldns_buffer2str
|
||||
* base32 and base64 function names are now also prepended with ldns_
|
||||
* ldns_rr_new_frm_str() now returns an error on missing RDATA fields.
|
||||
Since you cannot read QUESTION section RRs with this anymore,
|
||||
there is now a function called ldns_rr_new_question_frm_str()
|
||||
|
||||
LIBRARY FEATURES:
|
||||
* DS RRs string representation now add bubblebabble in a comment
|
||||
(patch from Jakob Schlyter)
|
||||
* DLV RR type added
|
||||
* TCP fallback system has been improved
|
||||
* HMAC-SHA256 TSIG support has been added.
|
||||
* TTLS are now correcly set in NSEC(3) records when signing zones
|
||||
|
||||
EXAMPLE TOOLS:
|
||||
* New example: ldns-revoke to revoke DNSKEYs according to RFC5011
|
||||
* ldns-testpkts has been fixed and updated
|
||||
* ldns-signzone now has the option to not add the DNSKEY
|
||||
* ldns-signzone now has an (full zone only) opt-out option for
|
||||
NSEC3
|
||||
* ldns-keygen can create HMAC-SHA1 and HMAC-SHA256 symmetric keys
|
||||
* ldns-walk output has been fixed
|
||||
* ldns-compare-zones has been fixed, and now has an option
|
||||
to show all differences (-a)
|
||||
* ldns-read-zone now has an option to print DNSSEC records only
|
||||
|
||||
1.3
|
||||
Base library:
|
||||
|
||||
* Added a new family of functions based around ldns_dnssec_zone,
|
||||
which is a new structure that keeps a zone sorted through an
|
||||
rbtree and links signatures and NSEC(3) records directly to their
|
||||
RRset. These functions all start with ldns_dnssec_
|
||||
|
||||
* ldns_zone_sign and ldns_zone_sign_nsec3 are now deprecated, but
|
||||
have been changed to internally use the new
|
||||
ldns_dnssec_zone_sign(_nsec3)
|
||||
|
||||
* Moved some ldns_buffer functions inline, so a clean rebuild of
|
||||
applications relying on those is needed (otherwise you'll get
|
||||
linker errors)
|
||||
* ldns_dname_label now returns one extra (zero)
|
||||
byte, so it can be seen as an fqdn.
|
||||
* NSEC3 type code update for signing algorithms.
|
||||
* DSA key generation of DNSKEY RRs fixed (one byte too small).
|
||||
|
||||
* Added support for RSA/SHA256 and RSA/SHA512, as specified in
|
||||
draft-ietf-dnsext-dnssec-rsasha256-04. The typecodes are not
|
||||
final, and this feature is not enabled by default. It can be
|
||||
enabled at compilation time with the flag --with-sha2
|
||||
|
||||
* Added 2wire_canonical family of functions that lowercase dnames
|
||||
in rdata fields in resource records of the types in the list in
|
||||
rfc3597
|
||||
|
||||
* Added base32 conversion functions.
|
||||
|
||||
* Fixed DSA RRSIG conversion when calling OpenSSL
|
||||
|
||||
Drill:
|
||||
|
||||
* Chase output is completely different, it shows, in ascii, the
|
||||
relations in the trust hierarchy.
|
||||
|
||||
Examples:
|
||||
* Added ldns-verify-zone, that can verify the internal DNSSEC records
|
||||
of a signed BIND-style zone file
|
||||
|
||||
* ldns-keygen now takes an -a argument specifying the algorithm,
|
||||
instead of -R or -D. -a list show a list of supported algorithms
|
||||
|
||||
* ldns-keygen now defaults to the exponent RSA_F4 instead of RSA_3
|
||||
for RSA key generation
|
||||
|
||||
* ldns-signzone now has support for HSMs
|
||||
* ldns-signzone uses the new ldns_dnssec_ structures and functions
|
||||
which improves its speed, and output; RRSIGS are now placed
|
||||
directly after their RRset, NSEC(3) records directly after the
|
||||
name they handle
|
||||
|
||||
Contrib:
|
||||
* new contrib/ dir with user contributions
|
||||
* added compilation script for solaris (thanks to Jakob Schlyter)
|
||||
|
||||
28 Nov 2007 1.2.2:
|
||||
* Added support for HMAC-MD5 keys in generator
|
||||
* Added a new example tool (written by Ondrej Sury): ldns-compare-zones
|
||||
* ldns-keygen now checks key sizes for rfc conformancy
|
||||
* ldns-signzone outputs SSL error if present
|
||||
* Fixed manpages (thanks to Ondrej Sury)
|
||||
* Fixed Makefile for -j <x>
|
||||
* Fixed a $ORIGIN error when reading zones
|
||||
* Fixed another off-by-one error
|
||||
|
||||
03 Oct 2007 1.2.1:
|
||||
* Fixed an offset error in rr comparison
|
||||
* Fixed ldns-read-zone exit code
|
||||
* Added check for availability of SHA256 hashing algorithm
|
||||
* Fixed ldns-key2ds -2 argument
|
||||
* Fixed $ORIGIN bug in .key files
|
||||
* Output algorithms as an integer instead of their mnemonic
|
||||
* Fixed a memory leak in dnssec code when SHA256 is not available
|
||||
* Updated fedora .spec file
|
||||
|
||||
11 Apr 2007 1.2.0:
|
||||
* canonicalization of rdata in DNSSEC functions now adheres to the
|
||||
rr type list in rfc3597, not rfc4035, which will be updated
|
||||
(see http://www.ops.ietf.org/lists/namedroppers/namedroppers.2007/msg00183.html)
|
||||
* ldns-walk now support dnames with maximum label length
|
||||
* ldnsd now takes an extra argument containing the address to listen on
|
||||
* signing no longer signs every rrset with KSK's, but only the DNSKEY rrset
|
||||
* ported to Solaris 10
|
||||
* added ldns_send_buffer() function
|
||||
* added ldns-testpkts fake packet server
|
||||
* added ldns-notify to send NOTIFY packets
|
||||
* ldns-dpa can now accurately calculate the number of matches per
|
||||
second
|
||||
* libtool is now used for compilation too (still gcc, but not directly)
|
||||
* Bugfixes:
|
||||
- TSIG signing buffer size
|
||||
- resolv.conf reading (comments)
|
||||
- dname comparison off by one error
|
||||
- typo in keyfetchers output file name fixed (a . too much)
|
||||
- fixed zone file parser when comments contain ( or )
|
||||
- fixed LOC RR type
|
||||
- fixed CERT RR type
|
||||
|
||||
Drill:
|
||||
* drill prints error on failed axfr.
|
||||
* drill now accepts mangled packets with -f
|
||||
* old -c option (use tcp) changed to -t
|
||||
* -c option to specify alternative resolv.conf file added
|
||||
* feedback of signature chase improved
|
||||
* chaser now stops at root when no trusted keys are found
|
||||
instead of looping forever trying to find the DS for .
|
||||
* Fixed bugs:
|
||||
- wildcard on multiple labels signature verification
|
||||
- error in -f packet writing for malformed packets
|
||||
- made KSK check more resilient
|
||||
|
||||
7 Jul 2006: 1.1.0: ldns-team
|
||||
* Added tutorials and an introduction to the documentation
|
||||
* Added include/ and lib/ dirs so that you can compile against ldns
|
||||
without installing ldns on your system
|
||||
* Makefile updates
|
||||
* Starting usage of assert throughout the library to catch illegal calls
|
||||
* Solaris 9 testing was carried out. Ldns now compiles on that
|
||||
platform; some gnuism were identified and fixed.
|
||||
* The ldns_zone structure was stress tested. The current setup
|
||||
(ie. just a list of rrs) can scale to zone file in order of
|
||||
megabytes. Sorting such zone is still difficult.
|
||||
* Reading multiline b64 encoded rdata works.
|
||||
* OpenSSL was made optional, configure --without-ssl.
|
||||
Ofcourse all dnssec/tsig related functions are disabled
|
||||
* Building of examples and drill now happens with the same
|
||||
defines as the building of ldns itself.
|
||||
* Preliminary sha-256 support was added. Currently is your
|
||||
OpenSSL supports it, it is supported in the DS creation.
|
||||
* ldns_resolver_search was implemented
|
||||
* Fixed a lot of bugs
|
||||
|
||||
Drill:
|
||||
* -r was killed in favor of -o <header bit mnemonic> which
|
||||
allows for a header bits setting (and maybe more in the
|
||||
future)
|
||||
* DNSSEC is never automaticaly set, even when you query
|
||||
for DNSKEY/RRSIG or DS.
|
||||
* Implement a crude RTT check, it now distinguishes between
|
||||
reachable and unreachable.
|
||||
* A form of secure tracing was added
|
||||
* Secure Chasing has been improved
|
||||
* -x does a reverse lookup for the given IP address
|
||||
|
||||
Examples:
|
||||
* ldns-dpa was added to the examples - this is the Dns Packet
|
||||
Analyzer tool.
|
||||
* ldnsd - as very, very simple nameserver impl.
|
||||
* ldns-zsplit - split zones for parrallel signing
|
||||
* ldns-zcat - cat split zones back together
|
||||
* ldns-keyfetcher - Fetches DNSKEY records with a few (non-strong,
|
||||
non-DNSSEC) anti-spoofing techniques.
|
||||
* ldns-walk - 'Walks' a DNSSEC signed zone
|
||||
* Added an all-static target to the makefile so you can use examples
|
||||
without installing the library
|
||||
* When building in the source tree or in a direct subdirectory of
|
||||
the build dir, configure does not need --with-ldns=../ anymore
|
||||
|
||||
Code:
|
||||
* All networking code was moved to net.c
|
||||
* rdata.c: added asserts to the rdf set/get functions
|
||||
* const keyword was added to pointer arguments that
|
||||
aren't changed
|
||||
|
||||
API:
|
||||
Changed:
|
||||
* renamed ldns/dns.h to ldns/ldns.h
|
||||
* ldns_rr_new_frm_str() is extented with an extra variable which
|
||||
in common use may be NULL. This trickles through to:
|
||||
o ldns_rr_new_frm_fp
|
||||
o ldns_rr_new_frm_fp_l
|
||||
Which also get an extra variable
|
||||
Also the function has been changed to return a status message.
|
||||
The compiled RR is returned in the first argument.
|
||||
* ldns_zone_new_frm_fp_l() and ldns_zone_new_frm_fp() are
|
||||
changed to return a status msg.
|
||||
* ldns_key_new_frm_fp is changed to return ldns_status and
|
||||
the actual key list in the first argument
|
||||
* ldns_rdata_new_frm_fp[_l]() are changed to return a status.
|
||||
the rdf is return in the first argument
|
||||
* ldns_resolver_new_frm_fp: same treatment: return status and
|
||||
the new resolver in the first argument
|
||||
* ldns_pkt_query_new_frm_str(): same: return status and the
|
||||
packet in the first arg
|
||||
* tsig.h: internal used functions are now static:
|
||||
ldns_digest_name and ldns_tsig_mac_new
|
||||
* ldns_key_rr2ds has an extra argument to specify the hash to
|
||||
use.
|
||||
* ldns_pkt_rcode() is renamed to ldns_pkt_get_rcode, ldns_pkt_rcode
|
||||
is now the rcode type, like ldns_pkt_opcode
|
||||
New:
|
||||
* ldns_resolver_searchlist_count: return the searchlist counter
|
||||
* ldns_zone_sort: Sort a zone
|
||||
* ldns_bgsend(): background send, returns a socket.
|
||||
* ldns_pkt_empty(): check is a packet is empty
|
||||
* ldns_rr_list_pop_rr_list(): pop multiple rr's from another rr_list
|
||||
* ldns_rr_list_push_rr_list(): push multiple rr's to an rr_list
|
||||
* ldns_rr_list_compare(): compare 2 ldns_rr_lists
|
||||
* ldns_pkt_push_rr_list: rr_list equiv for rr
|
||||
* ldns_pkt_safe_push_rr_list: rr_list equiv for rr
|
||||
Removed:
|
||||
* ldns_resolver_bgsend(): was not used in 1.0.0 and is not used now
|
||||
* ldns_udp_server_connect(): was faulty and isn't really part of
|
||||
the core ldns idea any how.
|
||||
* ldns_rr_list_insert_rr(): obsoleted, because not used.
|
||||
* char *_when was removed from the ldns_pkt structure
|
||||
|
||||
18 Oct 2005: 1.0.0: ldns-team
|
||||
* Commited a patch from Håkan Olsson
|
||||
* Added UPDATE support (Jakob Schlyter and Håkan Olsson)
|
||||
* License change: ldns is now BSD licensed
|
||||
* ldns now depends on SSL
|
||||
* Networking code cleanup, added (some) server udp/tcp support
|
||||
* A zone type is introduced. Currently this is a list
|
||||
of RRs, so it will not scale well.
|
||||
* [beta] Zonefile parsing was added
|
||||
* [tools] Drill was added to ldns - see drill/
|
||||
* [tools] experimental signer was added
|
||||
* [building] better check for ssl
|
||||
* [building] major revision of build system
|
||||
* [building] added rpm .spec in packaging/ (thanks to Paul Wouters)
|
||||
* [building] A lot of cleanup in the build scripts (thanks to Jakob Schlyter
|
||||
and Paul Wouters)
|
||||
|
||||
28 Jul 2005: 0.70: ldns-team
|
||||
* [func] ldns_pkt_get_section now returns copies from the rrlists
|
||||
in the packet. This can be freed by the user program
|
||||
* [code] added ldns_ prefixes to function from util.h
|
||||
* [inst] removed documentation from default make install
|
||||
* Usual fixes in documentation and code
|
||||
|
||||
20 Jun 2005: 0.66: ldns-team
|
||||
Rel. Focus: drill-pre2 uses some functions which are
|
||||
not in 0.65
|
||||
* dnssec_cd bit function was added
|
||||
* Zone infrastructure was added
|
||||
* Usual fixes in documentation and code
|
||||
|
||||
13 Jun 2005: 0.65: ldns-team
|
||||
* Repository is online at:
|
||||
http://www.nlnetlabs.nl/ldns/svn/
|
||||
* Apply reference copying throuhgout ldns, except in 2
|
||||
places in the ldns_resolver structure (._domain and
|
||||
._nameservers)
|
||||
* Usual array of bugfixes
|
||||
* Documentation added
|
||||
* keygen.c added as an example for DNSSEC programming
|
||||
|
||||
23 May 2005: 0.60: ldns-team
|
||||
* Removed config.h from the header installed files
|
||||
(you're not supposed to include that in a libary)
|
||||
* Further tweaking
|
||||
- DNSSEC signing/verification works
|
||||
- Assorted bug fixes and tweaks (memory management)
|
||||
|
||||
May 2005: 0.50: ldns-team
|
||||
* First usable release
|
||||
* Basic DNS functionality works
|
||||
* DNSSEC validation works
|
|
@ -0,0 +1,26 @@
|
|||
Copyright (c) 2005,2006, NLnetLabs
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of NLnetLabs nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,368 @@
|
|||
# Standard installation pathnames
|
||||
# See the file LICENSE for the license
|
||||
SHELL = @SHELL@
|
||||
VERSION = @PACKAGE_VERSION@
|
||||
version_info = @LIBTOOL_VERSION_INFO@
|
||||
srcdir = @srcdir@
|
||||
basesrcdir = $(shell basename `pwd`)
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
mandir = @mandir@
|
||||
datarootdir = @datarootdir@
|
||||
datadir = @datadir@
|
||||
libdir = @libdir@
|
||||
includedir = @includedir@
|
||||
doxygen = @doxygen@
|
||||
pywrapdir = ${srcdir}/contrib/python
|
||||
swig = @swig@
|
||||
python_site =@PYTHON_SITE_PKG@
|
||||
pyldns_inst =@PYLDNS@
|
||||
pyldns_uninst =@PYLDNS@
|
||||
ifeq "$(pyldns_inst)" "pyldns"
|
||||
pyldns_inst=install-@PYLDNS@
|
||||
pyldns_uninst=uninstall-@PYLDNS@
|
||||
else
|
||||
pyldns_inst=
|
||||
pyldns_uninst=
|
||||
endif
|
||||
glibtool = @libtool@
|
||||
libtool = ./libtool
|
||||
ifdef glibtool
|
||||
libtool = $(glibtool)
|
||||
endif
|
||||
|
||||
CC = @CC@
|
||||
ifeq "$(srcdir)" "."
|
||||
CPPFLAGS = $(strip -I. @CPPFLAGS@ @DEFS@)
|
||||
else
|
||||
CPPFLAGS = $(strip -I. -I$(srcdir) @CPPFLAGS@ @DEFS@)
|
||||
endif
|
||||
CFLAGS = $(strip @CFLAGS@)
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
|
||||
PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
|
||||
LIBSSL_CPPFLAGS = @LIBSSL_CPPFLAGS@
|
||||
LIBSSL_LDFLAGS = @LIBSSL_LDFLAGS@
|
||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||
RUNTIME_PATH = @RUNTIME_PATH@
|
||||
DATE = $(shell date +%Y%m%d)
|
||||
LIBTOOL = $(libtool) --tag=CC --quiet
|
||||
INSTALL_LDNS_CONFIG = @INSTALL_LDNS_CONFIG@
|
||||
|
||||
LINT = splint
|
||||
LINTFLAGS=+quiet -weak -warnposix -unrecog -Din_addr_t=uint32_t -Du_int=unsigned -Du_char=uint8_t -preproc -Drlimit=rlimit64 -D__gnuc_va_list=va_list
|
||||
#-Dglob64=glob -Dglobfree64=globfree
|
||||
# compat with openssl linux edition.
|
||||
LINTFLAGS+="-DBN_ULONG=unsigned long" -Dkrb5_int32=int "-Dkrb5_ui_4=unsigned int" -DPQ_64BIT=uint64_t -DRC4_INT=unsigned -fixedformalarray -D"ENGINE=unsigned" -D"RSA=unsigned" -D"DSA=unsigned" -D"EVP_PKEY=unsigned" -D"EVP_MD=unsigned" -D"SSL=unsigned" -D"SSL_CTX=unsigned" -D"X509=unsigned" -D"RC4_KEY=unsigned" -D"EVP_MD_CTX=unsigned" -D"EC_KEY=unsigned" -D"EC_POINT=unsigned" -D"EC_GROUP=unsigned"
|
||||
# compat with NetBSD
|
||||
ifeq "$(shell uname)" "NetBSD"
|
||||
LINTFLAGS+="-D__RENAME(x)=" -D_NETINET_IN_H_
|
||||
endif
|
||||
# compat with OpenBSD
|
||||
LINTFLAGS+="-Dsigset_t=long"
|
||||
# FreeBSD8
|
||||
LINTFLAGS+="-D__uint16_t=uint16_t"
|
||||
|
||||
INSTALL = $(srcdir)/install-sh
|
||||
|
||||
LIBDNS_SOURCES = rdata.c util.c rr.c packet.c wire2host.c \
|
||||
host2str.c buffer.c str2host.c tsig.c resolver.c \
|
||||
net.c host2wire.c dname.c dnssec.c dnssec_verify.c \
|
||||
keys.c higher.c rr_functions.c parse.c update.c \
|
||||
error.c zone.c dnssec_zone.c dnssec_sign.c rbtree.c \
|
||||
sha1.c sha2.c
|
||||
LIBDNS_HEADERS = $(srcdir)/ldns/error.h \
|
||||
$(srcdir)/ldns/packet.h \
|
||||
$(srcdir)/ldns/common.h \
|
||||
$(srcdir)/ldns/rdata.h \
|
||||
$(srcdir)/ldns/rr.h \
|
||||
$(srcdir)/ldns/wire2host.h \
|
||||
$(srcdir)/ldns/host2str.h \
|
||||
$(srcdir)/ldns/host2wire.h \
|
||||
$(srcdir)/ldns/str2host.h \
|
||||
$(srcdir)/ldns/buffer.h \
|
||||
$(srcdir)/ldns/resolver.h \
|
||||
$(srcdir)/ldns/dname.h \
|
||||
$(srcdir)/ldns/dnssec.h \
|
||||
$(srcdir)/ldns/dnssec_verify.h \
|
||||
$(srcdir)/ldns/dnssec_sign.h \
|
||||
$(srcdir)/ldns/keys.h \
|
||||
$(srcdir)/ldns/higher.h \
|
||||
$(srcdir)/ldns/parse.h \
|
||||
$(srcdir)/ldns/rr_functions.h \
|
||||
$(srcdir)/ldns/ldns.h \
|
||||
$(srcdir)/ldns/zone.h \
|
||||
$(srcdir)/ldns/dnssec_zone.h \
|
||||
$(srcdir)/ldns/update.h \
|
||||
$(srcdir)/ldns/tsig.h \
|
||||
$(srcdir)/ldns/rbtree.h \
|
||||
$(srcdir)/ldns/sha1.h \
|
||||
$(srcdir)/ldns/sha2.h
|
||||
LIBDNS_OBJECTS = $(LIBDNS_SOURCES:.c=.o) $(LIBOBJS)
|
||||
LIBDNS_LOBJECTS = $(LIBDNS_SOURCES:.c=.lo) $(LIBOBJS:.o=.lo)
|
||||
|
||||
ALL_SOURCES = $(LIBDNS_SOURCES)
|
||||
|
||||
COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS)
|
||||
COMP_LIB = $(LIBTOOL) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS)
|
||||
LINK = $(CC) $(strip $(CFLAGS) $(LDFLAGS) $(LIBS))
|
||||
LINK_LIB = $(LIBTOOL) --mode=link $(CC) $(strip $(CFLAGS) $(LDFLAGS) $(LIBS) -version-number $(version_info) -no-undefined)
|
||||
|
||||
%.o: $(srcdir)/%.c $(LIBDNS_HEADERS) ldns/net.h ldns/util.h ldns/config.h
|
||||
$(COMP_LIB) $(LIBSSL_CPPFLAGS) -c $<
|
||||
|
||||
.PHONY: clean realclean docclean manpages doc lint all lib pyldns test
|
||||
.PHONY: install uninstall install-doc uninstall-doc uninstall-pyldns
|
||||
.PHONY: install-h uninstall-h install-lib uninstall-lib install-pyldns
|
||||
|
||||
all: copy-headers lib linktest manpages @PYLDNS@
|
||||
|
||||
linktest: $(srcdir)/linktest.c $(LIBDNS_HEADERS) ldns/net.h ldns/util.h ldns/config.h libldns.la
|
||||
$(LIBTOOL) --mode=link $(CC) $(srcdir)/linktest.c $(CPPFLAGS) $(LIBSSL_CPPFLAGS) $(CFLAGS) -lldns $(LIBS) -o linktest
|
||||
|
||||
lib: libldns.la
|
||||
if [ ! -d lib ] ; then ln -s .libs lib ; fi ;
|
||||
|
||||
lib-export-all: libldns.la-export-all
|
||||
if [ ! -d lib ] ; then ln -s .libs lib ; fi ;
|
||||
|
||||
libldns.la: $(LIBDNS_OBJECTS)
|
||||
$(LINK_LIB) $(LIBSSL_LDFLAGS) $(LIBSSL_LIBS) --export-symbols $(srcdir)/ldns_symbols.def -o libldns.la $(LIBDNS_LOBJECTS) -rpath $(libdir) $(RUNTIME_PATH)
|
||||
|
||||
libldns.la-export-all: $(LIBDNS_OBJECTS)
|
||||
$(LINK_LIB) -o libldns.la $(LIBDNS_LOBJECTS) -rpath $(libdir) $(RUNTIME_PATH)
|
||||
|
||||
$(addprefix include/ldns/, $(notdir $(LIBDNS_HEADERS))): include/ldns/%.h: $(srcdir)/ldns/%.h
|
||||
@if [ ! -d include ] ; then ($(INSTALL) -d include || echo "include exists") ; fi ;
|
||||
@if [ ! -d include/ldns ] ; then (cd include; ln -s ../ldns ./ldns || echo "include/ldns exists") ; fi ;
|
||||
$(INSTALL) -c -m 644 $< ./include/ldns/
|
||||
|
||||
include/ldns/util.h include/ldns/net.h include/ldns/config.h: include/ldns/%.h: ./ldns/%.h
|
||||
@if [ ! -d include ] ; then ($(INSTALL) -d include || echo "include exists") ; fi ;
|
||||
@if [ ! -d include/ldns ] ; then (cd include; ln -s ../ldns ./ldns || echo "include/ldns exists") ; fi ;
|
||||
$(INSTALL) -c -m 644 $< ./include/ldns/
|
||||
|
||||
copy-headers: $(addprefix include/ldns/, $(notdir $(LIBDNS_HEADERS))) include/ldns/util.h include/ldns/net.h include/ldns/config.h
|
||||
|
||||
mancheck:
|
||||
sh -c 'find . -name \*.\[13\] -exec troff -z {} \;' 2>&1 | sed "s/^\.\///" | sed "s/\(:[0\-9]\+:\)/\1 warning:/g"
|
||||
|
||||
doxygen: manpages
|
||||
$(INSTALL) -d doc
|
||||
ifdef doxygen
|
||||
# if we are not in base we need to copy some html files too
|
||||
if [ ! -e doc/header.html ] ; then \
|
||||
$(INSTALL) -c -m 644 $(srcdir)/doc/header.html doc/ ; \
|
||||
fi ;
|
||||
$(doxygen) $(srcdir)/libdns.doxygen
|
||||
endif
|
||||
|
||||
manpages: $(srcdir)/doc/function_manpages
|
||||
$(INSTALL) -d doc
|
||||
cat $(srcdir)/ldns/*.h | $(srcdir)/doc/doxyparse.pl -m $(srcdir)/doc/function_manpages 2>&1 | \
|
||||
grep -v ^doxygen | grep -v ^cat > doc/ldns_manpages
|
||||
|
||||
pyldns: _ldns.la
|
||||
|
||||
$(pywrapdir)/ldns_wrapper.c: $(pywrapdir)/ldns.i $(wildcard $(pywrapdir)/*.i) $(LIBDNS_HEADERS) ldns/util.h ldns/config.h
|
||||
$(swig) -python -o $@ $(CPPFLAGS) $(PYTHON_CPPFLAGS) $<
|
||||
|
||||
ldns_wrapper.lo: $(pywrapdir)/ldns_wrapper.c $(LIBDNS_HEADERS) ldns/util.h ldns/config.h
|
||||
$(COMP_LIB) -I./include/ldns $(PYTHON_CPPFLAGS) -c $< -o $@
|
||||
|
||||
_ldns.la: ldns_wrapper.lo libldns.la
|
||||
$(LIBTOOL) --tag=CC --mode=link $(CC) $(strip $(CFLAGS) $(PYTHON_CFLAGS) $(LDFLAGS) $(PYTHON_LDFLAGS) -module -version-number $(version_info) -no-undefined -o $@ $< -rpath $(python_site) -L. -L.libs -lldns $(LIBS))
|
||||
|
||||
install: install-h install-lib install-config install-manpages $(pyldns_inst)
|
||||
|
||||
uninstall: uninstall-manpages uninstall-h uninstall-lib $(pyldns_uninst)
|
||||
|
||||
destclean: uninstall
|
||||
|
||||
install-config:
|
||||
if [ $(INSTALL_LDNS_CONFIG) = "yes" ] ; then \
|
||||
$(INSTALL) -d $(DESTDIR)$(bindir); \
|
||||
$(INSTALL) -c -m 755 packaging/ldns-config $(DESTDIR)$(bindir)/; \
|
||||
fi
|
||||
|
||||
install-manpages: manpages
|
||||
${INSTALL} -d $(DESTDIR)$(mandir)/man3
|
||||
for f in doc/man/man3/*; do \
|
||||
${INSTALL} -c -m 444 $$f $(DESTDIR)$(mandir)/man3/; \
|
||||
done
|
||||
|
||||
uninstall-manpages:
|
||||
for i in `cat doc/ldns_manpages`; do \
|
||||
rm -f $(DESTDIR)$(mandir)/man3/$$i.3 ; done
|
||||
rmdir -p $(DESTDIR)$(mandir)/man3 || echo "ok, dir already gone"
|
||||
|
||||
install-h: lib
|
||||
$(INSTALL) -m 755 -d $(DESTDIR)$(includedir)/ldns
|
||||
for i in $(LIBDNS_HEADERS); do \
|
||||
$(INSTALL) -c -m 644 $$i $(DESTDIR)$(includedir)/ldns/; done
|
||||
$(INSTALL) -c -m 644 include/ldns/util.h $(DESTDIR)$(includedir)/ldns/
|
||||
$(INSTALL) -c -m 644 include/ldns/net.h $(DESTDIR)$(includedir)/ldns/
|
||||
|
||||
uninstall-h:
|
||||
for i in $(LIBDNS_HEADERS); do \
|
||||
rm -f $(DESTDIR)$(includedir)/$$i; done
|
||||
[ ! -d $(DESTDIR)$(includedir)/ldns ] || rmdir -p $(DESTDI)$(includedir)/ldns || echo "ok, dir already gone"
|
||||
exit 0
|
||||
|
||||
install-lib: lib
|
||||
$(INSTALL) -m 755 -d $(DESTDIR)$(libdir)
|
||||
$(LIBTOOL) --mode=install cp libldns.la $(DESTDIR)$(libdir)
|
||||
$(LIBTOOL) --mode=finish $(DESTDIR)$(libdir)
|
||||
|
||||
uninstall-lib:
|
||||
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/libldns.la
|
||||
rmdir -p $(DESTDIR)$(libdir) || echo "ok, dir already gone"
|
||||
|
||||
install-pyldns: @PYLDNS@
|
||||
$(INSTALL) -m 755 -d $(DESTDIR)$(python_site)/ldns
|
||||
$(INSTALL) -c -m 644 $(pywrapdir)/ldns.py $(DESTDIR)$(python_site)/ldns.py
|
||||
$(LIBTOOL) --mode=install cp _ldns.la $(DESTDIR)$(python_site)
|
||||
$(LIBTOOL) --mode=finish $(DESTDIR)$(python_site)
|
||||
|
||||
uninstall-pyldns:
|
||||
rm -f $(DESTDIR)$(python_site)/ldns/*
|
||||
rmdir -p $(DESTDIR)$(python_site)/ldns
|
||||
|
||||
clean:
|
||||
rm -f *.o *.d *.lo
|
||||
rm -f *~
|
||||
rm -rf autom4te.cache/
|
||||
rm -f tags
|
||||
rm -f *.key
|
||||
rm -f *.ds
|
||||
rm -f *.private
|
||||
rm -rf include/
|
||||
rm -rf lib
|
||||
rm -rf .libs
|
||||
rm -f linktest
|
||||
rm -f $(pywrapdir)/ldns_wrapper.c $(pywrapdir)/ldns.py
|
||||
|
||||
distclean: clean docclean libclean
|
||||
rm -f ltmain.sh
|
||||
|
||||
realclean: clean docclean libclean
|
||||
rm -f config.status
|
||||
rm -f config.log
|
||||
rm -f Makefile
|
||||
rm -f ldns/config.h.in
|
||||
rm -f ldns/config.h
|
||||
rm -f ldns/util.h
|
||||
rm -f config.h.in
|
||||
rm -f configure
|
||||
rm -f config.sub
|
||||
rm -f config.guess
|
||||
rm -f ltmain.sh
|
||||
|
||||
docclean:
|
||||
rm -rf doc/html/
|
||||
rm -rf doc/man/
|
||||
rm -rf doc/latex/
|
||||
rm -f doc/*.txt
|
||||
rm -f doc/*.tex
|
||||
rm -f doc/ldns_manpages
|
||||
|
||||
libclean:
|
||||
$(LIBTOOL) --mode clean rm -f libldns.la
|
||||
$(LIBTOOL) --mode clean rm -f libldns.a
|
||||
$(LIBTOOL) --mode clean rm -f libldns.so
|
||||
$(LIBTOOL) --mode clean rm -f libldns.so.*
|
||||
$(LIBTOOL) --mode clean rm -f _ldns.la
|
||||
rm -rf ldns/net.h ldns/util.h ldns/config.h
|
||||
rm -rf *.lo
|
||||
rm -rf .libs
|
||||
rm -rf libtool
|
||||
|
||||
## No need for changes here
|
||||
|
||||
lint:
|
||||
for i in $(LIBDNS_SOURCES); do \
|
||||
$(LINT) $(LINTFLAGS) -I. -I$(srcdir) $(srcdir)/$$i ; \
|
||||
if [ $$? -ne 0 ] ; then exit 1 ; fi ; \
|
||||
done
|
||||
|
||||
tags: $(srcdir)/*.c ldns/*.[ch]
|
||||
ctags -f $(srcdir)/tags $(srcdir)/*.[ch] ldns/*.[ch]
|
||||
|
||||
b64_pton$U.o: $(srcdir)/compat/b64_pton.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/b64_pton.c -o $@
|
||||
|
||||
b64_ntop$U.o: $(srcdir)/compat/b64_ntop.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/b64_ntop.c -o $@
|
||||
|
||||
b32_pton$U.o: $(srcdir)/compat/b32_pton.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/b32_pton.c -o $@
|
||||
|
||||
b32_ntop$U.o: $(srcdir)/compat/b32_ntop.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/b32_ntop.c -o $@
|
||||
|
||||
malloc$U.o: $(srcdir)/compat/malloc.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/malloc.c -o $@
|
||||
|
||||
realloc$U.o: $(srcdir)/compat/realloc.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/realloc.c -o $@
|
||||
|
||||
timegm$U.o: $(srcdir)/compat/timegm.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/timegm.c -o $@
|
||||
|
||||
isblank$U.o: $(srcdir)/compat/isblank.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/isblank.c -o $@
|
||||
|
||||
isasciik$U.o: $(srcdir)/compat/isascii.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/isascii.c -o $@
|
||||
|
||||
strlcpy$U.o: $(srcdir)/compat/strlcpy.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/strlcpy.c -o $@
|
||||
|
||||
memmove$U.o: $(srcdir)/compat/memmove.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/memmove.c -o $@
|
||||
|
||||
inet_pton$U.o: $(srcdir)/compat/inet_pton.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/inet_pton.c -o $@
|
||||
|
||||
inet_aton$U.o: $(srcdir)/compat/inet_aton.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/inet_aton.c -o $@
|
||||
|
||||
inet_ntop$U.o: $(srcdir)/compat/inet_ntop.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/inet_ntop.c -o $@
|
||||
|
||||
snprintf$U.o: $(srcdir)/compat/snprintf.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/snprintf.c -o $@
|
||||
|
||||
fake-rfc2553$U.o: $(srcdir)/compat/fake-rfc2553.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/fake-rfc2553.c -o $@
|
||||
|
||||
gmtime_r$U.o: $(srcdir)/compat/gmtime_r.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/gmtime_r.c -o $@
|
||||
|
||||
ctime_r$U.o: $(srcdir)/compat/ctime_r.c
|
||||
$(COMP_LIB) -c $(srcdir)/compat/ctime_r.c -o $@
|
||||
|
||||
# Automatic dependencies.
|
||||
%.d: $(srcdir)/%.c
|
||||
$(SHELL) -ec '$(CC) -MM $(CPPFLAGS) $< \
|
||||
| sed '\''s!\(.*\)\.o[ :]*!$(dir $@)\1.o $@ : !g'\'' > $@; \
|
||||
[ -s $@ ] || rm -f $@'
|
||||
|
||||
allclean: test-clean clean
|
||||
|
||||
test-clean:
|
||||
tpkg -b test clean
|
||||
|
||||
test:
|
||||
if test -x "`which bash`"; then bash test/test_all.sh; else sh test/test_all.sh; fi
|
||||
|
||||
#-include $(ALL_SOURCES:.c=.d)
|
||||
|
||||
# Recreate symbols file, only needed when API changes
|
||||
# make clean first (and after this make clean; make again)
|
||||
symbols: lib-export-all
|
||||
nm -g lib/libldns.so | cut -d " " -f 3 | grep ldns | sort > $(srcdir)/ldns_symbols.def
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
|
||||
Contents:
|
||||
REQUIREMENTS
|
||||
INSTALLATION
|
||||
libdns
|
||||
examples
|
||||
drill
|
||||
INFORMATION FOR SPECIFIC OPERATING SYSTEMS
|
||||
Mac OS X
|
||||
Solaris
|
||||
Your Support
|
||||
|
||||
Project page:
|
||||
http://www.nlnetlabs.nl/ldns/
|
||||
On that page you can also subscribe to the ldns mailing list.
|
||||
|
||||
* Development
|
||||
ldns is mainly developed on Linux and FreeBSD. It is regularly tested to
|
||||
compile on other systems like Solaris and Mac OS X.
|
||||
|
||||
REQUIREMENTS
|
||||
- OpenSSL (Optional, but needed for features like DNSSEC)
|
||||
- libpcap (Optional, but needed for examples/ldns-dpa)
|
||||
- (GNU) libtool (in OSX, that's glibtool, not libtool)
|
||||
- GNU make
|
||||
|
||||
INSTALLATION
|
||||
1. Unpack the tarball
|
||||
2. cd ldns-<VERSION>
|
||||
3. ./configure
|
||||
4. gmake (it needs gnu make to compile, on systems where GNU make is the
|
||||
default you can just use 'make')
|
||||
5. sudo gmake install
|
||||
6. Optional. (cd examples; ./configure; gmake), make example programs included.
|
||||
7. Optional. (cd drill; ./configure; gmake; gmake install), to build drill.
|
||||
|
||||
You can configure and compile it in a separate build directory.
|
||||
|
||||
* Examples
|
||||
There are some examples and dns related tools in the examples/ directory.
|
||||
These can be built with:
|
||||
1. cd examples/
|
||||
2. ./configure [--with-ldns=<path to ldns installation or build>]
|
||||
3. gmake
|
||||
|
||||
* Drill
|
||||
Drill can be built with:
|
||||
1. cd drill/
|
||||
2. ./configure [--with-ldns=<path to ldns installation or build>]
|
||||
3. gmake
|
||||
|
||||
Note that you need to set LD_LIBRARY_PATH if you want to run the binaries
|
||||
and you have not installed the library to a system directory. You can use
|
||||
the make target all-static for the examples to run them if you don't want to
|
||||
install the library.
|
||||
|
||||
|
||||
* Building from subversion repository
|
||||
|
||||
If you are building from the repository you will need to have (gnu)
|
||||
autotools like libtool and autoreconf installed. A list of all the commands
|
||||
needed to build everything can be found in README.svn. Note that the actual
|
||||
commands may be a little bit different on your machine. Most notable, you'll need to run libtoolize (or glibtoolize), if you skip this step, you'll get an error about missing config.sub.
|
||||
|
||||
* Developers
|
||||
ldns is developed by the ldns team at NLnet Labs. This team currently
|
||||
consists of:
|
||||
o Wouter Wijngaards
|
||||
o Matthijs Mekking
|
||||
|
||||
Former main developers:
|
||||
o Jelte Jansen
|
||||
o Miek Gieben
|
||||
|
||||
* Credits
|
||||
We have received patches from the following people, thanks!
|
||||
o Erik Rozendaal
|
||||
o Håkan Olsson
|
||||
o Jakob Schlyter
|
||||
o Paul Wouters
|
||||
o Simon Vallet
|
||||
o Ondřej Surý
|
||||
|
||||
|
||||
IFORMATION FOR SPECIFIC OPERATING SYSTEMS
|
||||
|
||||
MAC OS X
|
||||
|
||||
For MACOSX 10.4 and later, it seems that you have to set the
|
||||
MACOSX_DEPLOYMENT_TARGET environment variable to 10.4 before running
|
||||
make. Apparently it defaults to 10.1.
|
||||
|
||||
This appears to be a known problem in 10.2 to 10.4, see:
|
||||
http://developer.apple.com/qa/qa2001/qa1233.html
|
||||
for more information.
|
||||
|
||||
|
||||
SOLARIS
|
||||
|
||||
In Solaris multi-architecture systems (that have both 32-bit and
|
||||
64-bit support), it can be a bit taxing to convince the system to
|
||||
compile in 64-bit mode. Jakob Schlyter has kindly contributed a build
|
||||
script that sets the right build and link options. You can find it in
|
||||
contrib/build-solaris.sh
|
||||
|
||||
|
||||
Your Support
|
||||
NLnet Labs offers all of its software products as open source, most are
|
||||
published under a BDS license. You can download them, not only from the
|
||||
NLnet Labs website but also through the various OS distributions for
|
||||
which NSD, ldns, and Unbound are packaged. We therefore have little idea
|
||||
who uses our software in production environments and have no direct ties
|
||||
with 'our customers'.
|
||||
|
||||
Therefore, we ask you to contact us at users@NLnetLabs.nl and tell us
|
||||
whether you use one of our products in your production environment,
|
||||
what that environment looks like, and maybe even share some praise.
|
||||
We would like to refer to the fact that your organization is using our
|
||||
products. We will only do that if you explicitly allow us. In all other
|
||||
cases we will keep the information you share with us to ourselves.
|
||||
|
||||
In addition to the moral support you can also support us
|
||||
financially. NLnet Labs is a recognized not-for-profit charity foundation
|
||||
that is chartered to develop open-source software and open-standards
|
||||
for the Internet. If you use our software to satisfaction please express
|
||||
that by giving us a donation. For small donations PayPal can be used. For
|
||||
larger and regular donations please contact us at users@NLnetLabs.nl. Also
|
||||
see http://www.nlnetlabs.nl/labs/contributors/.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
ldns - snapshot releases
|
||||
|
||||
Snapshot releases are not official released. They can be released to
|
||||
interested parties for development.
|
||||
|
||||
Snapshots can be recognized from the date in the the tar file name.
|
||||
|
||||
They should not be used for packaging in distributions.
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
# The ldns subversion repository can found at:
|
||||
# www.nlnetlabs.nl/ldns/svn/
|
||||
|
||||
# small list of commands to build all on a linux system
|
||||
# libtoolize is needed for most other targets
|
||||
|
||||
# on Solaris, and other systems that may not have
|
||||
# the default 'automake' and 'aclocal' script aliases,
|
||||
# the correct versions may need to be set. On those
|
||||
# systems, the 'autoreconf' line should be changed to:
|
||||
# AUTOMAKE=automake-1.10 ACLOCAL=aclocal-1.10 autoreconf
|
||||
# (and these systems probably need gmake instead of make)
|
||||
|
||||
# older versions of libtoolize do not support --install
|
||||
# so you might need to remove that (with newer versions
|
||||
# it is needed)
|
||||
libtoolize -c --install
|
||||
autoreconf --install
|
||||
./configure
|
||||
make
|
||||
make doc # needs doxygen for the html pages
|
||||
(cd examples && autoreconf && ./configure && make)
|
||||
(cd drill && autoreconf && ./configure && make)
|
||||
(cd pcat && autoreconf && ./configure && make)
|
||||
(cd examples/nsd-test && autoreconf && ./configure && make)
|
|
@ -0,0 +1,122 @@
|
|||
# ===========================================================================
|
||||
# http://autoconf-archive.cryp.to/ac_pkg_swig.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AC_PROG_SWIG([major.minor.micro])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro searches for a SWIG installation on your system. If found you
|
||||
# should call SWIG via $(SWIG). You can use the optional first argument to
|
||||
# check if the version of the available SWIG is greater than or equal to
|
||||
# the value of the argument. It should have the format: N[.N[.N]] (N is a
|
||||
# number between 0 and 999. Only the first N is mandatory.)
|
||||
#
|
||||
# If the version argument is given (e.g. 1.3.17), AC_PROG_SWIG checks that
|
||||
# the swig package is this version number or higher.
|
||||
#
|
||||
# In configure.in, use as:
|
||||
#
|
||||
# AC_PROG_SWIG(1.3.17)
|
||||
# SWIG_ENABLE_CXX
|
||||
# SWIG_MULTI_MODULE_SUPPORT
|
||||
# SWIG_PYTHON
|
||||
#
|
||||
# LAST MODIFICATION
|
||||
#
|
||||
# 2008-04-12
|
||||
#
|
||||
# COPYLEFT
|
||||
#
|
||||
# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>
|
||||
# Copyright (c) 2008 Alan W. Irwin <irwin@beluga.phys.uvic.ca>
|
||||
# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>
|
||||
# Copyright (c) 2008 Andrew Collier <colliera@ukzn.ac.za>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation; either version 2 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Macro Archive. When you make and
|
||||
# distribute a modified version of the Autoconf Macro, you may extend this
|
||||
# special exception to the GPL to apply to your modified version as well.
|
||||
|
||||
AC_DEFUN([AC_PROG_SWIG],[
|
||||
AC_PATH_PROG([SWIG],[swig])
|
||||
if test -z "$SWIG" ; then
|
||||
AC_MSG_WARN([cannot find 'swig' program. You should look at http://www.swig.org])
|
||||
SWIG='echo "Error: SWIG is not installed. You should look at http://www.swig.org" ; false'
|
||||
elif test -n "$1" ; then
|
||||
AC_MSG_CHECKING([for SWIG version])
|
||||
[swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`]
|
||||
AC_MSG_RESULT([$swig_version])
|
||||
if test -n "$swig_version" ; then
|
||||
# Calculate the required version number components
|
||||
[required=$1]
|
||||
[required_major=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_major" ; then
|
||||
[required_major=0]
|
||||
fi
|
||||
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
|
||||
[required_minor=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_minor" ; then
|
||||
[required_minor=0]
|
||||
fi
|
||||
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
|
||||
[required_patch=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_patch" ; then
|
||||
[required_patch=0]
|
||||
fi
|
||||
# Calculate the available version number components
|
||||
[available=$swig_version]
|
||||
[available_major=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_major" ; then
|
||||
[available_major=0]
|
||||
fi
|
||||
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
|
||||
[available_minor=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_minor" ; then
|
||||
[available_minor=0]
|
||||
fi
|
||||
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
|
||||
[available_patch=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_patch" ; then
|
||||
[available_patch=0]
|
||||
fi
|
||||
if test $available_major -ne $required_major \
|
||||
-o $available_minor -ne $required_minor \
|
||||
-o $available_patch -lt $required_patch ; then
|
||||
AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version. You should look at http://www.swig.org])
|
||||
SWIG='echo "Error: SWIG version >= $1 is required. You have '"$swig_version"'. You should look at http://www.swig.org" ; false'
|
||||
else
|
||||
AC_MSG_NOTICE([SWIG executable is '$SWIG'])
|
||||
SWIG_LIB=`$SWIG -swiglib`
|
||||
AC_MSG_NOTICE([SWIG library directory is '$SWIG_LIB'])
|
||||
fi
|
||||
else
|
||||
AC_MSG_WARN([cannot determine SWIG version])
|
||||
SWIG='echo "Error: Cannot determine SWIG version. You should look at http://www.swig.org" ; false'
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([SWIG_LIB])
|
||||
])
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,200 @@
|
|||
AC_DEFUN([AC_PYTHON_DEVEL],[
|
||||
#
|
||||
# Allow the use of a (user set) custom python version
|
||||
#
|
||||
AC_ARG_VAR([PYTHON_VERSION],[The installed Python
|
||||
version to use, for example '2.3'. This string
|
||||
will be appended to the Python interpreter
|
||||
canonical name.])
|
||||
|
||||
AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]])
|
||||
if test -z "$PYTHON"; then
|
||||
AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path])
|
||||
PYTHON_VERSION=""
|
||||
fi
|
||||
|
||||
if test -z "$PYTHON_VERSION"; then
|
||||
PYTHON_VERSION=`$PYTHON -c "import sys, string; \
|
||||
print string.split(sys.version)[[0]]"`
|
||||
fi
|
||||
|
||||
#
|
||||
# Check for a version of Python >= 2.1.0
|
||||
#
|
||||
AC_MSG_CHECKING([for a version of Python >= '2.1.0'])
|
||||
ac_supports_python_ver=`$PYTHON -c "import sys, string; \
|
||||
ver = string.split(sys.version)[[0]]; \
|
||||
print ver >= '2.1.0'"`
|
||||
if test "$ac_supports_python_ver" != "True"; then
|
||||
if test -z "$PYTHON_NOVERSIONCHECK"; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_FAILURE([
|
||||
This version of the AC@&t@_PYTHON_DEVEL macro
|
||||
doesn't work properly with versions of Python before
|
||||
2.1.0. You may need to re-run configure, setting the
|
||||
variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG,
|
||||
PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
|
||||
Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
|
||||
to something else than an empty string.
|
||||
])
|
||||
else
|
||||
AC_MSG_RESULT([skip at user request])
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
fi
|
||||
|
||||
#
|
||||
# if the macro parameter ``version'' is set, honour it
|
||||
#
|
||||
if test -n "$1"; then
|
||||
AC_MSG_CHECKING([for a version of Python $1])
|
||||
ac_supports_python_ver=`$PYTHON -c "import sys, string; \
|
||||
ver = string.split(sys.version)[[0]]; \
|
||||
print ver $1"`
|
||||
if test "$ac_supports_python_ver" = "True"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([this package requires Python $1.
|
||||
If you have it installed, but it isn't the default Python
|
||||
interpreter in your system path, please pass the PYTHON_VERSION
|
||||
variable to configure. See ``configure --help'' for reference.
|
||||
])
|
||||
PYTHON_VERSION=""
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# Check if you have distutils, else fail
|
||||
#
|
||||
AC_MSG_CHECKING([for the distutils Python package])
|
||||
ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
|
||||
if test -z "$ac_distutils_result"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([cannot import Python module "distutils".
|
||||
Please check your Python installation. The error was:
|
||||
$ac_distutils_result])
|
||||
PYTHON_VERSION=""
|
||||
fi
|
||||
|
||||
#
|
||||
# Check for Python include path
|
||||
#
|
||||
AC_MSG_CHECKING([for Python include path])
|
||||
if test -z "$PYTHON_CPPFLAGS"; then
|
||||
python_path=`$PYTHON -c "import distutils.sysconfig; \
|
||||
print distutils.sysconfig.get_python_inc();"`
|
||||
if test -n "${python_path}"; then
|
||||
python_path="-I$python_path"
|
||||
fi
|
||||
PYTHON_CPPFLAGS=$python_path
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_CPPFLAGS])
|
||||
AC_SUBST([PYTHON_CPPFLAGS])
|
||||
|
||||
#
|
||||
# Check for Python library path
|
||||
#
|
||||
AC_MSG_CHECKING([for Python library path])
|
||||
if test -z "$PYTHON_LDFLAGS"; then
|
||||
# (makes two attempts to ensure we've got a version number
|
||||
# from the interpreter)
|
||||
py_version=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
from string import join; \
|
||||
print join(get_config_vars('VERSION'))"`
|
||||
if test "$py_version" = "[None]"; then
|
||||
if test -n "$PYTHON_VERSION"; then
|
||||
py_version=$PYTHON_VERSION
|
||||
else
|
||||
py_version=`$PYTHON -c "import sys; \
|
||||
print sys.version[[:3]]"`
|
||||
fi
|
||||
fi
|
||||
|
||||
PYTHON_LDFLAGS=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
from string import join; \
|
||||
print '-L' + get_python_lib(0,1), \
|
||||
'-L' + os.path.dirname(get_python_lib(0,1)), \
|
||||
'-lpython';"`$py_version
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_LDFLAGS])
|
||||
AC_SUBST([PYTHON_LDFLAGS])
|
||||
|
||||
#
|
||||
# Check for site packages
|
||||
#
|
||||
AC_MSG_CHECKING([for Python site-packages path])
|
||||
if test -z "$PYTHON_SITE_PKG"; then
|
||||
PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
|
||||
print distutils.sysconfig.get_python_lib(0,0);"`
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_SITE_PKG])
|
||||
AC_SUBST([PYTHON_SITE_PKG])
|
||||
|
||||
#
|
||||
# libraries which must be linked in when embedding
|
||||
#
|
||||
AC_MSG_CHECKING(python extra libraries)
|
||||
if test -z "$PYTHON_EXTRA_LIBS"; then
|
||||
PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
|
||||
conf = distutils.sysconfig.get_config_var; \
|
||||
print conf('LOCALMODLIBS'), conf('LIBS')"`
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_EXTRA_LIBS])
|
||||
AC_SUBST(PYTHON_EXTRA_LIBS)
|
||||
|
||||
#
|
||||
# linking flags needed when embedding
|
||||
#
|
||||
AC_MSG_CHECKING(python extra linking flags)
|
||||
if test -z "$PYTHON_EXTRA_LDFLAGS"; then
|
||||
PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \
|
||||
conf = distutils.sysconfig.get_config_var; \
|
||||
print conf('LINKFORSHARED')"`
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS])
|
||||
AC_SUBST(PYTHON_EXTRA_LDFLAGS)
|
||||
|
||||
#
|
||||
# final check to see if everything compiles alright
|
||||
#
|
||||
AC_MSG_CHECKING([consistency of all components of python development environment])
|
||||
AC_LANG_PUSH([C])
|
||||
# save current global flags
|
||||
LIBS="$ac_save_LIBS $PYTHON_LDFLAGS"
|
||||
CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
|
||||
AC_TRY_LINK([
|
||||
#include <Python.h>
|
||||
],[
|
||||
Py_Initialize();
|
||||
],[pythonexists=yes],[pythonexists=no])
|
||||
|
||||
AC_MSG_RESULT([$pythonexists])
|
||||
|
||||
if test ! "$pythonexists" = "yes"; then
|
||||
AC_MSG_ERROR([
|
||||
Could not link test program to Python. Maybe the main Python library has been
|
||||
installed in some non-standard library path. If so, pass it to configure,
|
||||
via the LDFLAGS environment variable.
|
||||
Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib"
|
||||
============================================================================
|
||||
ERROR!
|
||||
You probably have to install the development version of the Python package
|
||||
for your distribution. The exact name of this package varies among them.
|
||||
============================================================================
|
||||
])
|
||||
PYTHON_VERSION=""
|
||||
fi
|
||||
AC_LANG_POP
|
||||
# turn back to default flags
|
||||
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
|
||||
#
|
||||
# all done!
|
||||
#
|
||||
])
|
||||
|
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
* buffer.c -- generic memory buffer .
|
||||
*
|
||||
* Copyright (c) 2001-2008, NLnet Labs. All rights reserved.
|
||||
*
|
||||
* See LICENSE for the license.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <ldns/ldns.h>
|
||||
#include <ldns/buffer.h>
|
||||
|
||||
ldns_buffer *
|
||||
ldns_buffer_new(size_t capacity)
|
||||
{
|
||||
ldns_buffer *buffer = LDNS_MALLOC(ldns_buffer);
|
||||
|
||||
if (!buffer) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer->_data = (uint8_t *) LDNS_XMALLOC(uint8_t, capacity);
|
||||
if (!buffer->_data) {
|
||||
LDNS_FREE(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer->_position = 0;
|
||||
buffer->_limit = buffer->_capacity = capacity;
|
||||
buffer->_fixed = 0;
|
||||
buffer->_status = LDNS_STATUS_OK;
|
||||
|
||||
ldns_buffer_invariant(buffer);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void
|
||||
ldns_buffer_new_frm_data(ldns_buffer *buffer, void *data, size_t size)
|
||||
{
|
||||
assert(data != NULL);
|
||||
|
||||
buffer->_position = 0;
|
||||
buffer->_limit = buffer->_capacity = size;
|
||||
buffer->_fixed = 0;
|
||||
buffer->_data = LDNS_XMALLOC(uint8_t, size);
|
||||
if(!buffer->_data) {
|
||||
buffer->_status = LDNS_STATUS_MEM_ERR;
|
||||
return;
|
||||
}
|
||||
memcpy(buffer->_data, data, size);
|
||||
buffer->_status = LDNS_STATUS_OK;
|
||||
|
||||
ldns_buffer_invariant(buffer);
|
||||
}
|
||||
|
||||
bool
|
||||
ldns_buffer_set_capacity(ldns_buffer *buffer, size_t capacity)
|
||||
{
|
||||
void *data;
|
||||
|
||||
ldns_buffer_invariant(buffer);
|
||||
assert(buffer->_position <= capacity);
|
||||
|
||||
data = (uint8_t *) LDNS_XREALLOC(buffer->_data, uint8_t, capacity);
|
||||
if (!data) {
|
||||
buffer->_status = LDNS_STATUS_MEM_ERR;
|
||||
return false;
|
||||
} else {
|
||||
buffer->_data = data;
|
||||
buffer->_limit = buffer->_capacity = capacity;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ldns_buffer_reserve(ldns_buffer *buffer, size_t amount)
|
||||
{
|
||||
ldns_buffer_invariant(buffer);
|
||||
assert(!buffer->_fixed);
|
||||
if (buffer->_capacity < buffer->_position + amount) {
|
||||
size_t new_capacity = buffer->_capacity * 3 / 2;
|
||||
|
||||
if (new_capacity < buffer->_position + amount) {
|
||||
new_capacity = buffer->_position + amount;
|
||||
}
|
||||
if (!ldns_buffer_set_capacity(buffer, new_capacity)) {
|
||||
buffer->_status = LDNS_STATUS_MEM_ERR;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
buffer->_limit = buffer->_capacity;
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
int written = 0;
|
||||
size_t remaining;
|
||||
|
||||
if (ldns_buffer_status_ok(buffer)) {
|
||||
ldns_buffer_invariant(buffer);
|
||||
assert(buffer->_limit == buffer->_capacity);
|
||||
|
||||
remaining = ldns_buffer_remaining(buffer);
|
||||
va_start(args, format);
|
||||
written = vsnprintf((char *) ldns_buffer_current(buffer), remaining,
|
||||
format, args);
|
||||
va_end(args);
|
||||
if (written == -1) {
|
||||
buffer->_status = LDNS_STATUS_INTERNAL_ERR;
|
||||
return -1;
|
||||
} else if ((size_t) written >= remaining) {
|
||||
if (!ldns_buffer_reserve(buffer, (size_t) written + 1)) {
|
||||
buffer->_status = LDNS_STATUS_MEM_ERR;
|
||||
return -1;
|
||||
}
|
||||
va_start(args, format);
|
||||
written = vsnprintf((char *) ldns_buffer_current(buffer),
|
||||
ldns_buffer_remaining(buffer), format, args);
|
||||
va_end(args);
|
||||
if (written == -1) {
|
||||
buffer->_status = LDNS_STATUS_INTERNAL_ERR;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
buffer->_position += written;
|
||||
}
|
||||
return written;
|
||||
}
|
||||
|
||||
void
|
||||
ldns_buffer_free(ldns_buffer *buffer)
|
||||
{
|
||||
if (!buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
LDNS_FREE(buffer->_data);
|
||||
|
||||
LDNS_FREE(buffer);
|
||||
}
|
||||
|
||||
void *
|
||||
ldns_buffer_export(ldns_buffer *buffer)
|
||||
{
|
||||
buffer->_fixed = 1;
|
||||
return buffer->_data;
|
||||
}
|
||||
|
||||
int
|
||||
ldns_bgetc(ldns_buffer *buffer)
|
||||
{
|
||||
if (!ldns_buffer_available_at(buffer, buffer->_position, sizeof(uint8_t))) {
|
||||
ldns_buffer_set_position(buffer, ldns_buffer_limit(buffer));
|
||||
/* ldns_buffer_rewind(buffer);*/
|
||||
return EOF;
|
||||
}
|
||||
return (int)ldns_buffer_read_u8(buffer);
|
||||
}
|
||||
|
||||
void
|
||||
ldns_buffer_copy(ldns_buffer* result, ldns_buffer* from)
|
||||
{
|
||||
size_t tocopy = ldns_buffer_limit(from);
|
||||
|
||||
if(tocopy > ldns_buffer_capacity(result))
|
||||
tocopy = ldns_buffer_capacity(result);
|
||||
ldns_buffer_clear(result);
|
||||
ldns_buffer_write(result, ldns_buffer_begin(from), tocopy);
|
||||
ldns_buffer_flip(result);
|
||||
}
|
|
@ -0,0 +1,335 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 1998 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static const char Base32[] =
|
||||
"abcdefghijklmnopqrstuvwxyz234567";
|
||||
/* "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";*/
|
||||
/* 00000000001111111111222222222233
|
||||
01234567890123456789012345678901*/
|
||||
static const char Base32_extended_hex[] =
|
||||
/* "0123456789ABCDEFGHIJKLMNOPQRSTUV";*/
|
||||
"0123456789abcdefghijklmnopqrstuv";
|
||||
static const char Pad32 = '=';
|
||||
|
||||
/* (From RFC3548 and draft-josefsson-rfc3548bis-00.txt)
|
||||
5. Base 32 Encoding
|
||||
|
||||
The Base 32 encoding is designed to represent arbitrary sequences of
|
||||
octets in a form that needs to be case insensitive but need not be
|
||||
humanly readable.
|
||||
|
||||
A 33-character subset of US-ASCII is used, enabling 5 bits to be
|
||||
represented per printable character. (The extra 33rd character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 40-bit groups of input bits as output
|
||||
strings of 8 encoded characters. Proceeding from left to right, a
|
||||
40-bit input group is formed by concatenating 5 8bit input groups.
|
||||
These 40 bits are then treated as 8 concatenated 5-bit groups, each
|
||||
of which is translated into a single digit in the base 32 alphabet.
|
||||
When encoding a bit stream via the base 32 encoding, the bit stream
|
||||
must be presumed to be ordered with the most-significant-bit first.
|
||||
That is, the first bit in the stream will be the high-order bit in
|
||||
the first 8bit byte, and the eighth bit will be the low-order bit in
|
||||
the first 8bit byte, and so on.
|
||||
|
||||
Each 5-bit group is used as an index into an array of 32 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string. These characters, identified in Table 3, below, are
|
||||
selected from US-ASCII digits and uppercase letters.
|
||||
|
||||
Table 3: The Base 32 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 9 J 18 S 27 3
|
||||
1 B 10 K 19 T 28 4
|
||||
2 C 11 L 20 U 29 5
|
||||
3 D 12 M 21 V 30 6
|
||||
4 E 13 N 22 W 31 7
|
||||
5 F 14 O 23 X
|
||||
6 G 15 P 24 Y (pad) =
|
||||
7 H 16 Q 25 Z
|
||||
8 I 17 R 26 2
|
||||
|
||||
|
||||
Special processing is performed if fewer than 40 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a body. When fewer than 40 input bits
|
||||
are available in an input group, zero bits are added (on the right)
|
||||
to form an integral number of 5-bit groups. Padding at the end of
|
||||
the data is performed using the "=" character. Since all base 32
|
||||
input is an integral number of octets, only the following cases can
|
||||
arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral multiple of 40
|
||||
bits; here, the final unit of encoded output will be an integral
|
||||
multiple of 8 characters with no "=" padding,
|
||||
|
||||
(2) the final quantum of encoding input is exactly 8 bits; here, the
|
||||
final unit of encoded output will be two characters followed by six
|
||||
"=" padding characters,
|
||||
|
||||
(3) the final quantum of encoding input is exactly 16 bits; here, the
|
||||
final unit of encoded output will be four characters followed by four
|
||||
"=" padding characters,
|
||||
|
||||
(4) the final quantum of encoding input is exactly 24 bits; here, the
|
||||
final unit of encoded output will be five characters followed by
|
||||
three "=" padding characters, or
|
||||
|
||||
(5) the final quantum of encoding input is exactly 32 bits; here, the
|
||||
final unit of encoded output will be seven characters followed by one
|
||||
"=" padding character.
|
||||
|
||||
|
||||
6. Base 32 Encoding with Extended Hex Alphabet
|
||||
|
||||
The following description of base 32 is due to [7]. This encoding
|
||||
should not be regarded as the same as the "base32" encoding, and
|
||||
should not be referred to as only "base32".
|
||||
|
||||
One property with this alphabet, that the base64 and base32 alphabet
|
||||
lack, is that encoded data maintain its sort order when the encoded
|
||||
data is compared bit-wise.
|
||||
|
||||
This encoding is identical to the previous one, except for the
|
||||
alphabet. The new alphabet is found in table 4.
|
||||
|
||||
Table 4: The "Extended Hex" Base 32 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 0 9 9 18 I 27 R
|
||||
1 1 10 A 19 J 28 S
|
||||
2 2 11 B 20 K 29 T
|
||||
3 3 12 C 21 L 30 U
|
||||
4 4 13 D 22 M 31 V
|
||||
5 5 14 E 23 N
|
||||
6 6 15 F 24 O (pad) =
|
||||
7 7 16 G 25 P
|
||||
8 8 17 H 26 Q
|
||||
|
||||
*/
|
||||
|
||||
|
||||
int
|
||||
ldns_b32_ntop_ar(uint8_t const *src, size_t srclength, char *target, size_t targsize, const char B32_ar[]) {
|
||||
size_t datalength = 0;
|
||||
uint8_t input[5];
|
||||
uint8_t output[8];
|
||||
size_t i;
|
||||
memset(output, 0, 8);
|
||||
|
||||
while (4 < srclength) {
|
||||
input[0] = *src++;
|
||||
input[1] = *src++;
|
||||
input[2] = *src++;
|
||||
input[3] = *src++;
|
||||
input[4] = *src++;
|
||||
srclength -= 5;
|
||||
|
||||
output[0] = (input[0] & 0xf8) >> 3;
|
||||
output[1] = ((input[0] & 0x07) << 2) + ((input[1] & 0xc0) >> 6);
|
||||
output[2] = (input[1] & 0x3e) >> 1;
|
||||
output[3] = ((input[1] & 0x01) << 4) + ((input[2] & 0xf0) >> 4);
|
||||
output[4] = ((input[2] & 0x0f) << 1) + ((input[3] & 0x80) >> 7);
|
||||
output[5] = (input[3] & 0x7c) >> 2;
|
||||
output[6] = ((input[3] & 0x03) << 3) + ((input[4] & 0xe0) >> 5);
|
||||
output[7] = (input[4] & 0x1f);
|
||||
|
||||
assert(output[0] < 32);
|
||||
assert(output[1] < 32);
|
||||
assert(output[2] < 32);
|
||||
assert(output[3] < 32);
|
||||
assert(output[4] < 32);
|
||||
assert(output[5] < 32);
|
||||
assert(output[6] < 32);
|
||||
assert(output[7] < 32);
|
||||
|
||||
if (datalength + 8 > targsize) {
|
||||
return (-1);
|
||||
}
|
||||
target[datalength++] = B32_ar[output[0]];
|
||||
target[datalength++] = B32_ar[output[1]];
|
||||
target[datalength++] = B32_ar[output[2]];
|
||||
target[datalength++] = B32_ar[output[3]];
|
||||
target[datalength++] = B32_ar[output[4]];
|
||||
target[datalength++] = B32_ar[output[5]];
|
||||
target[datalength++] = B32_ar[output[6]];
|
||||
target[datalength++] = B32_ar[output[7]];
|
||||
}
|
||||
|
||||
/* Now we worry about padding. */
|
||||
if (0 != srclength) {
|
||||
/* Get what's left. */
|
||||
input[0] = input[1] = input[2] = input[3] = input[4] = (uint8_t) '\0';
|
||||
for (i = 0; i < srclength; i++)
|
||||
input[i] = *src++;
|
||||
|
||||
output[0] = (input[0] & 0xf8) >> 3;
|
||||
assert(output[0] < 32);
|
||||
if (srclength >= 1) {
|
||||
output[1] = ((input[0] & 0x07) << 2) + ((input[1] & 0xc0) >> 6);
|
||||
assert(output[1] < 32);
|
||||
output[2] = (input[1] & 0x3e) >> 1;
|
||||
assert(output[2] < 32);
|
||||
}
|
||||
if (srclength >= 2) {
|
||||
output[3] = ((input[1] & 0x01) << 4) + ((input[2] & 0xf0) >> 4);
|
||||
assert(output[3] < 32);
|
||||
}
|
||||
if (srclength >= 3) {
|
||||
output[4] = ((input[2] & 0x0f) << 1) + ((input[3] & 0x80) >> 7);
|
||||
assert(output[4] < 32);
|
||||
output[5] = (input[3] & 0x7c) >> 2;
|
||||
assert(output[5] < 32);
|
||||
}
|
||||
if (srclength >= 4) {
|
||||
output[6] = ((input[3] & 0x03) << 3) + ((input[4] & 0xe0) >> 5);
|
||||
assert(output[6] < 32);
|
||||
}
|
||||
|
||||
|
||||
if (datalength + 1 > targsize) {
|
||||
return (-2);
|
||||
}
|
||||
target[datalength++] = B32_ar[output[0]];
|
||||
if (srclength >= 1) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[1]];
|
||||
if (srclength == 1 && output[2] == 0) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[2]];
|
||||
}
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
}
|
||||
if (srclength >= 2) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[3]];
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
}
|
||||
if (srclength >= 3) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[4]];
|
||||
if (srclength == 3 && output[5] == 0) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[5]];
|
||||
}
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
}
|
||||
if (srclength >= 4) {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = B32_ar[output[6]];
|
||||
} else {
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
}
|
||||
if (datalength + 1 > targsize) { return (-2); }
|
||||
target[datalength++] = Pad32;
|
||||
}
|
||||
if (datalength+1 > targsize) {
|
||||
return (int) (datalength);
|
||||
}
|
||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */
|
||||
return (int) (datalength);
|
||||
}
|
||||
|
||||
int
|
||||
ldns_b32_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
|
||||
return ldns_b32_ntop_ar(src, srclength, target, targsize, Base32);
|
||||
}
|
||||
|
||||
/* deprecated, here for backwards compatibility */
|
||||
int
|
||||
b32_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
|
||||
return ldns_b32_ntop_ar(src, srclength, target, targsize, Base32);
|
||||
}
|
||||
|
||||
int
|
||||
ldns_b32_ntop_extended_hex(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
|
||||
return ldns_b32_ntop_ar(src, srclength, target, targsize, Base32_extended_hex);
|
||||
}
|
||||
|
||||
/* deprecated, here for backwards compatibility */
|
||||
int
|
||||
b32_ntop_extended_hex(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
|
||||
return ldns_b32_ntop_ar(src, srclength, target, targsize, Base32_extended_hex);
|
||||
}
|
||||
|
|
@ -0,0 +1,389 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 1998 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";*/
|
||||
static const char Base32[] =
|
||||
"abcdefghijklmnopqrstuvwxyz234567";
|
||||
/* "0123456789ABCDEFGHIJKLMNOPQRSTUV";*/
|
||||
static const char Base32_extended_hex[] =
|
||||
"0123456789abcdefghijklmnopqrstuv";
|
||||
static const char Pad32 = '=';
|
||||
|
||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
||||
5. Base 32 Encoding
|
||||
|
||||
The Base 32 encoding is designed to represent arbitrary sequences of
|
||||
octets in a form that needs to be case insensitive but need not be
|
||||
humanly readable.
|
||||
|
||||
A 33-character subset of US-ASCII is used, enabling 5 bits to be
|
||||
represented per printable character. (The extra 33rd character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 40-bit groups of input bits as output
|
||||
strings of 8 encoded characters. Proceeding from left to right, a
|
||||
40-bit input group is formed by concatenating 5 8bit input groups.
|
||||
These 40 bits are then treated as 8 concatenated 5-bit groups, each
|
||||
of which is translated into a single digit in the base 32 alphabet.
|
||||
When encoding a bit stream via the base 32 encoding, the bit stream
|
||||
must be presumed to be ordered with the most-significant-bit first.
|
||||
That is, the first bit in the stream will be the high-order bit in
|
||||
the first 8bit byte, and the eighth bit will be the low-order bit in
|
||||
the first 8bit byte, and so on.
|
||||
|
||||
Each 5-bit group is used as an index into an array of 32 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string. These characters, identified in Table 3, below, are
|
||||
selected from US-ASCII digits and uppercase letters.
|
||||
|
||||
Table 3: The Base 32 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 9 J 18 S 27 3
|
||||
1 B 10 K 19 T 28 4
|
||||
2 C 11 L 20 U 29 5
|
||||
3 D 12 M 21 V 30 6
|
||||
4 E 13 N 22 W 31 7
|
||||
5 F 14 O 23 X
|
||||
6 G 15 P 24 Y (pad) =
|
||||
7 H 16 Q 25 Z
|
||||
8 I 17 R 26 2
|
||||
|
||||
|
||||
Special processing is performed if fewer than 40 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a body. When fewer than 40 input bits
|
||||
are available in an input group, zero bits are added (on the right)
|
||||
to form an integral number of 5-bit groups. Padding at the end of
|
||||
the data is performed using the "=" character. Since all base 32
|
||||
input is an integral number of octets, only the following cases can
|
||||
arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral multiple of 40
|
||||
bits; here, the final unit of encoded output will be an integral
|
||||
multiple of 8 characters with no "=" padding,
|
||||
|
||||
(2) the final quantum of encoding input is exactly 8 bits; here, the
|
||||
final unit of encoded output will be two characters followed by six
|
||||
"=" padding characters,
|
||||
|
||||
(3) the final quantum of encoding input is exactly 16 bits; here, the
|
||||
final unit of encoded output will be four characters followed by four
|
||||
"=" padding characters,
|
||||
|
||||
(4) the final quantum of encoding input is exactly 24 bits; here, the
|
||||
final unit of encoded output will be five characters followed by
|
||||
three "=" padding characters, or
|
||||
|
||||
(5) the final quantum of encoding input is exactly 32 bits; here, the
|
||||
final unit of encoded output will be seven characters followed by one
|
||||
"=" padding character.
|
||||
|
||||
|
||||
6. Base 32 Encoding with Extended Hex Alphabet
|
||||
|
||||
The following description of base 32 is due to [7]. This encoding
|
||||
should not be regarded as the same as the "base32" encoding, and
|
||||
should not be referred to as only "base32".
|
||||
|
||||
One property with this alphabet, that the base32 and base32 alphabet
|
||||
lack, is that encoded data maintain its sort order when the encoded
|
||||
data is compared bit-wise.
|
||||
|
||||
This encoding is identical to the previous one, except for the
|
||||
alphabet. The new alphabet is found in table 4.
|
||||
|
||||
Table 4: The "Extended Hex" Base 32 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 0 9 9 18 I 27 R
|
||||
1 1 10 A 19 J 28 S
|
||||
2 2 11 B 20 K 29 T
|
||||
3 3 12 C 21 L 30 U
|
||||
4 4 13 D 22 M 31 V
|
||||
5 5 14 E 23 N
|
||||
6 6 15 F 24 O (pad) =
|
||||
7 7 16 G 25 P
|
||||
8 8 17 H 26 Q
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
/* skips all whitespace anywhere.
|
||||
converts characters, four at a time, starting at (or after)
|
||||
src from base - 32 numbers into three 8 bit bytes in the target area.
|
||||
it returns the number of data bytes stored at the target, or -1 on error.
|
||||
*/
|
||||
|
||||
int
|
||||
ldns_b32_pton_ar(char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize, const char B32_ar[])
|
||||
{
|
||||
int tarindex, state, ch;
|
||||
char *pos;
|
||||
int i = 0;
|
||||
|
||||
state = 0;
|
||||
tarindex = 0;
|
||||
|
||||
while ((ch = *src++) != '\0' && (i == 0 || i < (int) hashed_owner_str_len)) {
|
||||
i++;
|
||||
ch = tolower(ch);
|
||||
if (isspace((unsigned char)ch)) /* Skip whitespace anywhere. */
|
||||
continue;
|
||||
|
||||
if (ch == Pad32)
|
||||
break;
|
||||
|
||||
pos = strchr(B32_ar, ch);
|
||||
if (pos == 0) {
|
||||
/* A non-base32 character. */
|
||||
return (-ch);
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
if (target) {
|
||||
if ((size_t)tarindex >= targsize) {
|
||||
return (-2);
|
||||
}
|
||||
target[tarindex] = (pos - B32_ar) << 3;
|
||||
}
|
||||
state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-3);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) >> 2;
|
||||
target[tarindex+1] = ((pos - B32_ar) & 0x03)
|
||||
<< 6 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-4);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) << 1;
|
||||
}
|
||||
/*tarindex++;*/
|
||||
state = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-5);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) >> 4;
|
||||
target[tarindex+1] = ((pos - B32_ar) & 0x0f) << 4 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 4;
|
||||
break;
|
||||
case 4:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-6);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) >> 1;
|
||||
target[tarindex+1] = ((pos - B32_ar) & 0x01)
|
||||
<< 7 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 5;
|
||||
break;
|
||||
case 5:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-7);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) << 2;
|
||||
}
|
||||
state = 6;
|
||||
break;
|
||||
case 6:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-8);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar) >> 3;
|
||||
target[tarindex+1] = ((pos - B32_ar) & 0x07)
|
||||
<< 5 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 7;
|
||||
break;
|
||||
case 7:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize) {
|
||||
return (-9);
|
||||
}
|
||||
target[tarindex] |= (pos - B32_ar);
|
||||
}
|
||||
tarindex++;
|
||||
state = 0;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We are done decoding Base-32 chars. Let's see if we ended
|
||||
* on a byte boundary, and/or with erroneous trailing characters.
|
||||
*/
|
||||
|
||||
if (ch == Pad32) { /* We got a pad char. */
|
||||
ch = *src++; /* Skip it, get next. */
|
||||
switch (state) {
|
||||
case 0: /* Invalid = in first position */
|
||||
case 1: /* Invalid = in second position */
|
||||
return (-10);
|
||||
|
||||
case 2: /* Valid, means one byte of info */
|
||||
case 3:
|
||||
/* Skip any number of spaces. */
|
||||
for ((void)NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace((unsigned char)ch))
|
||||
break;
|
||||
/* Make sure there is another trailing = sign. */
|
||||
if (ch != Pad32) {
|
||||
return (-11);
|
||||
}
|
||||
ch = *src++; /* Skip the = */
|
||||
/* Fall through to "single trailing =" case. */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 4: /* Valid, means two bytes of info */
|
||||
case 5:
|
||||
case 6:
|
||||
/*
|
||||
* We know this char is an =. Is there anything but
|
||||
* whitespace after it?
|
||||
*/
|
||||
for ((void)NULL; ch != '\0'; ch = *src++)
|
||||
if (!(isspace((unsigned char)ch) || ch == '=')) {
|
||||
return (-12);
|
||||
}
|
||||
|
||||
case 7: /* Valid, means three bytes of info */
|
||||
/*
|
||||
* We know this char is an =. Is there anything but
|
||||
* whitespace after it?
|
||||
*/
|
||||
for ((void)NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace((unsigned char)ch)) {
|
||||
return (-13);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now make sure for cases 2 and 3 that the "extra"
|
||||
* bits that slopped past the last full byte were
|
||||
* zeros. If we don't check them, they become a
|
||||
* subliminal channel.
|
||||
*/
|
||||
if (target && target[tarindex] != 0) {
|
||||
return (-14);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* We ended by seeing the end of the string. Make sure we
|
||||
* have no partial bytes lying around.
|
||||
*/
|
||||
if (state != 0)
|
||||
return (-15);
|
||||
}
|
||||
|
||||
return (tarindex);
|
||||
}
|
||||
|
||||
int
|
||||
ldns_b32_pton(char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize)
|
||||
{
|
||||
return ldns_b32_pton_ar(src, hashed_owner_str_len, target, targsize, Base32);
|
||||
}
|
||||
|
||||
/* deprecated, here for backwards compatibility */
|
||||
int
|
||||
b32_pton(char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize)
|
||||
{
|
||||
return ldns_b32_pton_ar(src, hashed_owner_str_len, target, targsize, Base32);
|
||||
}
|
||||
|
||||
int
|
||||
ldns_b32_pton_extended_hex(char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize)
|
||||
{
|
||||
return ldns_b32_pton_ar(src, hashed_owner_str_len, target, targsize, Base32_extended_hex);
|
||||
}
|
||||
|
||||
/* deprecated, here for backwards compatibility */
|
||||
int
|
||||
b32_pton_extended_hex(char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize)
|
||||
{
|
||||
return ldns_b32_pton_ar(src, hashed_owner_str_len, target, targsize, Base32_extended_hex);
|
||||
}
|
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 1998 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define Assert(Cond) if (!(Cond)) abort()
|
||||
|
||||
static const char Base64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
static const char Pad64 = '=';
|
||||
|
||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
||||
The following encoding technique is taken from RFC 1521 by Borenstein
|
||||
and Freed. It is reproduced here in a slightly edited form for
|
||||
convenience.
|
||||
|
||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
||||
represented per printable character. (The extra 65th character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 24-bit groups of input bits as output
|
||||
strings of 4 encoded characters. Proceeding from left to right, a
|
||||
24-bit input group is formed by concatenating 3 8-bit input groups.
|
||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
||||
of which is translated into a single digit in the base64 alphabet.
|
||||
|
||||
Each 6-bit group is used as an index into an array of 64 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string.
|
||||
|
||||
Table 1: The Base64 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 17 R 34 i 51 z
|
||||
1 B 18 S 35 j 52 0
|
||||
2 C 19 T 36 k 53 1
|
||||
3 D 20 U 37 l 54 2
|
||||
4 E 21 V 38 m 55 3
|
||||
5 F 22 W 39 n 56 4
|
||||
6 G 23 X 40 o 57 5
|
||||
7 H 24 Y 41 p 58 6
|
||||
8 I 25 Z 42 q 59 7
|
||||
9 J 26 a 43 r 60 8
|
||||
10 K 27 b 44 s 61 9
|
||||
11 L 28 c 45 t 62 +
|
||||
12 M 29 d 46 u 63 /
|
||||
13 N 30 e 47 v
|
||||
14 O 31 f 48 w (pad) =
|
||||
15 P 32 g 49 x
|
||||
16 Q 33 h 50 y
|
||||
|
||||
Special processing is performed if fewer than 24 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a quantity. When fewer than 24 input
|
||||
bits are available in an input group, zero bits are added (on the
|
||||
right) to form an integral number of 6-bit groups. Padding at the
|
||||
end of the data is performed using the '=' character.
|
||||
|
||||
Since all base64 input is an integral number of octets, only the
|
||||
-------------------------------------------------
|
||||
following cases can arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral
|
||||
multiple of 24 bits; here, the final unit of encoded
|
||||
output will be an integral multiple of 4 characters
|
||||
with no "=" padding,
|
||||
(2) the final quantum of encoding input is exactly 8 bits;
|
||||
here, the final unit of encoded output will be two
|
||||
characters followed by two "=" padding characters, or
|
||||
(3) the final quantum of encoding input is exactly 16 bits;
|
||||
here, the final unit of encoded output will be three
|
||||
characters followed by one "=" padding character.
|
||||
*/
|
||||
|
||||
int
|
||||
ldns_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
|
||||
size_t datalength = 0;
|
||||
uint8_t input[3];
|
||||
uint8_t output[4];
|
||||
size_t i;
|
||||
|
||||
if (srclength == 0) {
|
||||
if (targsize > 0) {
|
||||
target[0] = '\0';
|
||||
return 0;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
while (2 < srclength) {
|
||||
input[0] = *src++;
|
||||
input[1] = *src++;
|
||||
input[2] = *src++;
|
||||
srclength -= 3;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
output[3] = input[2] & 0x3f;
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
Assert(output[3] < 64);
|
||||
|
||||
if (datalength + 4 > targsize) {
|
||||
return (-1);
|
||||
}
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
target[datalength++] = Base64[output[2]];
|
||||
target[datalength++] = Base64[output[3]];
|
||||
}
|
||||
|
||||
/* Now we worry about padding. */
|
||||
if (0 != srclength) {
|
||||
/* Get what's left. */
|
||||
input[0] = input[1] = input[2] = (uint8_t) '\0';
|
||||
for (i = 0; i < srclength; i++)
|
||||
input[i] = *src++;
|
||||
|
||||
output[0] = input[0] >> 2;
|
||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
||||
Assert(output[0] < 64);
|
||||
Assert(output[1] < 64);
|
||||
Assert(output[2] < 64);
|
||||
|
||||
if (datalength + 4 > targsize) {
|
||||
return (-2);
|
||||
}
|
||||
target[datalength++] = Base64[output[0]];
|
||||
target[datalength++] = Base64[output[1]];
|
||||
if (srclength == 1) {
|
||||
target[datalength++] = Pad64;
|
||||
} else {
|
||||
target[datalength++] = Base64[output[2]];
|
||||
}
|
||||
target[datalength++] = Pad64;
|
||||
}
|
||||
if (datalength >= targsize) {
|
||||
return (-3);
|
||||
}
|
||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */
|
||||
return (int) (datalength);
|
||||
}
|
|
@ -0,0 +1,262 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 1998 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
||||
*
|
||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
||||
* permission under its copyrights to use, copy, modify, and distribute this
|
||||
* Software with or without fee, provided that the above copyright notice and
|
||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
||||
* not be used in connection with the marketing of any product incorporating
|
||||
* the Software or modifications thereof, without specific, written prior
|
||||
* permission.
|
||||
*
|
||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
||||
* under its patents, if any, for the use, sale or manufacture of products to
|
||||
* the extent that such products are used for performing Domain Name System
|
||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
||||
* granted for any product per se or for any other function of any product.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define Assert(Cond) if (!(Cond)) abort()
|
||||
|
||||
static const char Base64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
static const char Pad64 = '=';
|
||||
|
||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
||||
The following encoding technique is taken from RFC 1521 by Borenstein
|
||||
and Freed. It is reproduced here in a slightly edited form for
|
||||
convenience.
|
||||
|
||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
||||
represented per printable character. (The extra 65th character, "=",
|
||||
is used to signify a special processing function.)
|
||||
|
||||
The encoding process represents 24-bit groups of input bits as output
|
||||
strings of 4 encoded characters. Proceeding from left to right, a
|
||||
24-bit input group is formed by concatenating 3 8-bit input groups.
|
||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
||||
of which is translated into a single digit in the base64 alphabet.
|
||||
|
||||
Each 6-bit group is used as an index into an array of 64 printable
|
||||
characters. The character referenced by the index is placed in the
|
||||
output string.
|
||||
|
||||
Table 1: The Base64 Alphabet
|
||||
|
||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
||||
0 A 17 R 34 i 51 z
|
||||
1 B 18 S 35 j 52 0
|
||||
2 C 19 T 36 k 53 1
|
||||
3 D 20 U 37 l 54 2
|
||||
4 E 21 V 38 m 55 3
|
||||
5 F 22 W 39 n 56 4
|
||||
6 G 23 X 40 o 57 5
|
||||
7 H 24 Y 41 p 58 6
|
||||
8 I 25 Z 42 q 59 7
|
||||
9 J 26 a 43 r 60 8
|
||||
10 K 27 b 44 s 61 9
|
||||
11 L 28 c 45 t 62 +
|
||||
12 M 29 d 46 u 63 /
|
||||
13 N 30 e 47 v
|
||||
14 O 31 f 48 w (pad) =
|
||||
15 P 32 g 49 x
|
||||
16 Q 33 h 50 y
|
||||
|
||||
Special processing is performed if fewer than 24 bits are available
|
||||
at the end of the data being encoded. A full encoding quantum is
|
||||
always completed at the end of a quantity. When fewer than 24 input
|
||||
bits are available in an input group, zero bits are added (on the
|
||||
right) to form an integral number of 6-bit groups. Padding at the
|
||||
end of the data is performed using the '=' character.
|
||||
|
||||
Since all base64 input is an integral number of octets, only the
|
||||
-------------------------------------------------
|
||||
following cases can arise:
|
||||
|
||||
(1) the final quantum of encoding input is an integral
|
||||
multiple of 24 bits; here, the final unit of encoded
|
||||
output will be an integral multiple of 4 characters
|
||||
with no "=" padding,
|
||||
(2) the final quantum of encoding input is exactly 8 bits;
|
||||
here, the final unit of encoded output will be two
|
||||
characters followed by two "=" padding characters, or
|
||||
(3) the final quantum of encoding input is exactly 16 bits;
|
||||
here, the final unit of encoded output will be three
|
||||
characters followed by one "=" padding character.
|
||||
*/
|
||||
|
||||
/* skips all whitespace anywhere.
|
||||
converts characters, four at a time, starting at (or after)
|
||||
src from base - 64 numbers into three 8 bit bytes in the target area.
|
||||
it returns the number of data bytes stored at the target, or -1 on error.
|
||||
*/
|
||||
|
||||
int
|
||||
ldns_b64_pton(char const *src, uint8_t *target, size_t targsize)
|
||||
{
|
||||
int tarindex, state, ch;
|
||||
char *pos;
|
||||
|
||||
state = 0;
|
||||
tarindex = 0;
|
||||
|
||||
if (strlen(src) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
while ((ch = *src++) != '\0') {
|
||||
if (isspace((unsigned char)ch)) /* Skip whitespace anywhere. */
|
||||
continue;
|
||||
|
||||
if (ch == Pad64)
|
||||
break;
|
||||
|
||||
pos = strchr(Base64, ch);
|
||||
if (pos == 0) {
|
||||
/* A non-base64 character. */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
if (target) {
|
||||
if ((size_t)tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] = (pos - Base64) << 2;
|
||||
}
|
||||
state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 4;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x0f)
|
||||
<< 4 ;
|
||||
}
|
||||
tarindex++;
|
||||
state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (target) {
|
||||
if ((size_t)tarindex + 1 >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64) >> 2;
|
||||
target[tarindex+1] = ((pos - Base64) & 0x03)
|
||||
<< 6;
|
||||
}
|
||||
tarindex++;
|
||||
state = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (target) {
|
||||
if ((size_t)tarindex >= targsize)
|
||||
return (-1);
|
||||
target[tarindex] |= (pos - Base64);
|
||||
}
|
||||
tarindex++;
|
||||
state = 0;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We are done decoding Base-64 chars. Let's see if we ended
|
||||
* on a byte boundary, and/or with erroneous trailing characters.
|
||||
*/
|
||||
|
||||
if (ch == Pad64) { /* We got a pad char. */
|
||||
ch = *src++; /* Skip it, get next. */
|
||||
switch (state) {
|
||||
case 0: /* Invalid = in first position */
|
||||
case 1: /* Invalid = in second position */
|
||||
return (-1);
|
||||
|
||||
case 2: /* Valid, means one byte of info */
|
||||
/* Skip any number of spaces. */
|
||||
for ((void)NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace((unsigned char)ch))
|
||||
break;
|
||||
/* Make sure there is another trailing = sign. */
|
||||
if (ch != Pad64)
|
||||
return (-1);
|
||||
ch = *src++; /* Skip the = */
|
||||
/* Fall through to "single trailing =" case. */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 3: /* Valid, means two bytes of info */
|
||||
/*
|
||||
* We know this char is an =. Is there anything but
|
||||
* whitespace after it?
|
||||
*/
|
||||
for ((void)NULL; ch != '\0'; ch = *src++)
|
||||
if (!isspace((unsigned char)ch))
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Now make sure for cases 2 and 3 that the "extra"
|
||||
* bits that slopped past the last full byte were
|
||||
* zeros. If we don't check them, they become a
|
||||
* subliminal channel.
|
||||
*/
|
||||
if (target && target[tarindex] != 0)
|
||||
return (-1);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* We ended by seeing the end of the string. Make sure we
|
||||
* have no partial bytes lying around.
|
||||
*/
|
||||
if (state != 0)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (tarindex);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TIME_H
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
char *ctime_r(const time_t *timep, char *buf)
|
||||
{
|
||||
/* no thread safety. */
|
||||
char* result = ctime(timep);
|
||||
if(buf && result)
|
||||
strcpy(buf, result);
|
||||
return result;
|
||||
}
|
|
@ -0,0 +1,231 @@
|
|||
/* From openssh 4.3p2 filename openbsd-compat/fake-rfc2553.h */
|
||||
/*
|
||||
* Copyright (C) 2000-2003 Damien Miller. All rights reserved.
|
||||
* Copyright (C) 1999 WIDE Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the project nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pseudo-implementation of RFC2553 name / address resolution functions
|
||||
*
|
||||
* But these functions are not implemented correctly. The minimum subset
|
||||
* is implemented for ssh use only. For example, this routine assumes
|
||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||
*/
|
||||
|
||||
#include <ldns/config.h>
|
||||
#include <ldns/common.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "compat/fake-rfc2553.h"
|
||||
|
||||
#ifndef HAVE_GETNAMEINFO
|
||||
int getnameinfo(const struct sockaddr *sa, size_t ATTR_UNUSED(salen), char *host,
|
||||
size_t hostlen, char *serv, size_t servlen, int flags)
|
||||
{
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
|
||||
struct hostent *hp;
|
||||
char tmpserv[16];
|
||||
|
||||
if (serv != NULL) {
|
||||
snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
|
||||
if (strlcpy(serv, tmpserv, servlen) >= servlen)
|
||||
return (EAI_MEMORY);
|
||||
}
|
||||
|
||||
if (host != NULL) {
|
||||
if (flags & NI_NUMERICHOST) {
|
||||
if (strlcpy(host, inet_ntoa(sin->sin_addr),
|
||||
hostlen) >= hostlen)
|
||||
return (EAI_MEMORY);
|
||||
else
|
||||
return (0);
|
||||
} else {
|
||||
hp = gethostbyaddr((char *)&sin->sin_addr,
|
||||
sizeof(struct in_addr), AF_INET);
|
||||
if (hp == NULL)
|
||||
return (EAI_NODATA);
|
||||
|
||||
if (strlcpy(host, hp->h_name, hostlen) >= hostlen)
|
||||
return (EAI_MEMORY);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
#endif /* !HAVE_GETNAMEINFO */
|
||||
|
||||
#ifndef HAVE_GAI_STRERROR
|
||||
#ifdef HAVE_CONST_GAI_STRERROR_PROTO
|
||||
const char *
|
||||
#else
|
||||
char *
|
||||
#endif
|
||||
gai_strerror(int err)
|
||||
{
|
||||
switch (err) {
|
||||
case EAI_NODATA:
|
||||
return ("no address associated with name");
|
||||
case EAI_MEMORY:
|
||||
return ("memory allocation failure.");
|
||||
case EAI_NONAME:
|
||||
return ("nodename nor servname provided, or not known");
|
||||
default:
|
||||
return ("unknown/invalid error.");
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_GAI_STRERROR */
|
||||
|
||||
#ifndef HAVE_FREEADDRINFO
|
||||
void
|
||||
freeaddrinfo(struct addrinfo *ai)
|
||||
{
|
||||
struct addrinfo *next;
|
||||
|
||||
for(; ai != NULL;) {
|
||||
next = ai->ai_next;
|
||||
free(ai);
|
||||
ai = next;
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_FREEADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
static struct
|
||||
addrinfo *malloc_ai(int port, u_long addr, const struct addrinfo *hints)
|
||||
{
|
||||
struct addrinfo *ai;
|
||||
|
||||
ai = malloc(sizeof(*ai) + sizeof(struct sockaddr_in));
|
||||
if (ai == NULL)
|
||||
return (NULL);
|
||||
|
||||
memset(ai, '\0', sizeof(*ai) + sizeof(struct sockaddr_in));
|
||||
|
||||
ai->ai_addr = (struct sockaddr *)(ai + 1);
|
||||
/* XXX -- ssh doesn't use sa_len */
|
||||
ai->ai_addrlen = sizeof(struct sockaddr_in);
|
||||
ai->ai_addr->sa_family = ai->ai_family = AF_INET;
|
||||
|
||||
((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
|
||||
((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
|
||||
|
||||
/* XXX: the following is not generally correct, but does what we want */
|
||||
if (hints->ai_socktype)
|
||||
ai->ai_socktype = hints->ai_socktype;
|
||||
else
|
||||
ai->ai_socktype = SOCK_STREAM;
|
||||
|
||||
if (hints->ai_protocol)
|
||||
ai->ai_protocol = hints->ai_protocol;
|
||||
|
||||
return (ai);
|
||||
}
|
||||
|
||||
int
|
||||
getaddrinfo(const char *hostname, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
struct hostent *hp;
|
||||
struct servent *sp;
|
||||
struct in_addr in;
|
||||
int i;
|
||||
long int port;
|
||||
u_long addr;
|
||||
|
||||
port = 0;
|
||||
if (servname != NULL) {
|
||||
char *cp;
|
||||
|
||||
port = strtol(servname, &cp, 10);
|
||||
if (port > 0 && port <= 65535 && *cp == '\0')
|
||||
port = htons(port);
|
||||
else if ((sp = getservbyname(servname, NULL)) != NULL)
|
||||
port = sp->s_port;
|
||||
else
|
||||
port = 0;
|
||||
}
|
||||
|
||||
if (hints && hints->ai_flags & AI_PASSIVE) {
|
||||
addr = htonl(0x00000000);
|
||||
if (hostname && inet_aton(hostname, &in) != 0)
|
||||
addr = in.s_addr;
|
||||
*res = malloc_ai(port, addr, hints);
|
||||
if (*res == NULL)
|
||||
return (EAI_MEMORY);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!hostname) {
|
||||
*res = malloc_ai(port, htonl(0x7f000001), hints);
|
||||
if (*res == NULL)
|
||||
return (EAI_MEMORY);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (inet_aton(hostname, &in)) {
|
||||
*res = malloc_ai(port, in.s_addr, hints);
|
||||
if (*res == NULL)
|
||||
return (EAI_MEMORY);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Don't try DNS if AI_NUMERICHOST is set */
|
||||
if (hints && hints->ai_flags & AI_NUMERICHOST)
|
||||
return (EAI_NONAME);
|
||||
|
||||
hp = gethostbyname(hostname);
|
||||
if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
|
||||
struct addrinfo *cur, *prev;
|
||||
|
||||
cur = prev = *res = NULL;
|
||||
for (i = 0; hp->h_addr_list[i]; i++) {
|
||||
struct in_addr *in = (struct in_addr *)hp->h_addr_list[i];
|
||||
|
||||
cur = malloc_ai(port, in->s_addr, hints);
|
||||
if (cur == NULL) {
|
||||
if (*res != NULL)
|
||||
freeaddrinfo(*res);
|
||||
return (EAI_MEMORY);
|
||||
}
|
||||
if (prev)
|
||||
prev->ai_next = cur;
|
||||
else
|
||||
*res = cur;
|
||||
|
||||
prev = cur;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (EAI_NODATA);
|
||||
}
|
||||
#endif /* !HAVE_GETADDRINFO */
|
|
@ -0,0 +1,187 @@
|
|||
/* From openssh 4.3p2 filename openbsd-compat/fake-rfc2553.h */
|
||||
/*
|
||||
* Copyright (C) 2000-2003 Damien Miller. All rights reserved.
|
||||
* Copyright (C) 1999 WIDE Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the project nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pseudo-implementation of RFC2553 name / address resolution functions
|
||||
*
|
||||
* But these functions are not implemented correctly. The minimum subset
|
||||
* is implemented for ssh use only. For example, this routine assumes
|
||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||
*/
|
||||
|
||||
#ifndef _FAKE_RFC2553_H
|
||||
#define _FAKE_RFC2553_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef _MSC_VER
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* First, socket and INET6 related definitions
|
||||
*/
|
||||
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
|
||||
#ifndef _SS_MAXSIZE
|
||||
# define _SS_MAXSIZE 128 /* Implementation specific max size */
|
||||
# define _SS_PADSIZE (_SS_MAXSIZE - sizeof (struct sockaddr))
|
||||
struct sockaddr_storage {
|
||||
struct sockaddr ss_sa;
|
||||
char __ss_pad2[_SS_PADSIZE];
|
||||
};
|
||||
# define ss_family ss_sa.sa_family
|
||||
#endif /* _SS_MAXSIZE */
|
||||
#endif /* !HAVE_STRUCT_SOCKADDR_STORAGE */
|
||||
|
||||
#ifndef IN6_IS_ADDR_LOOPBACK
|
||||
# define IN6_IS_ADDR_LOOPBACK(a) \
|
||||
(((uint32_t *)(a))[0] == 0 && ((uint32_t *)(a))[1] == 0 && \
|
||||
((uint32_t *)(a))[2] == 0 && ((uint32_t *)(a))[3] == htonl(1))
|
||||
#endif /* !IN6_IS_ADDR_LOOPBACK */
|
||||
|
||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||
struct in6_addr {
|
||||
uint8_t s6_addr[16];
|
||||
};
|
||||
#endif /* !HAVE_STRUCT_IN6_ADDR */
|
||||
|
||||
#ifndef HAVE_STRUCT_SOCKADDR_IN6
|
||||
struct sockaddr_in6 {
|
||||
unsigned short sin6_family;
|
||||
uint16_t sin6_port;
|
||||
uint32_t sin6_flowinfo;
|
||||
struct in6_addr sin6_addr;
|
||||
};
|
||||
#endif /* !HAVE_STRUCT_SOCKADDR_IN6 */
|
||||
|
||||
#ifndef AF_INET6
|
||||
/* Define it to something that should never appear */
|
||||
#define AF_INET6 AF_MAX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Next, RFC2553 name / address resolution API
|
||||
*/
|
||||
|
||||
#ifndef NI_NUMERICHOST
|
||||
# define NI_NUMERICHOST (1)
|
||||
#endif
|
||||
#ifndef NI_NAMEREQD
|
||||
# define NI_NAMEREQD (1<<1)
|
||||
#endif
|
||||
#ifndef NI_NUMERICSERV
|
||||
# define NI_NUMERICSERV (1<<2)
|
||||
#endif
|
||||
|
||||
#ifndef AI_PASSIVE
|
||||
# define AI_PASSIVE (1)
|
||||
#endif
|
||||
#ifndef AI_CANONNAME
|
||||
# define AI_CANONNAME (1<<1)
|
||||
#endif
|
||||
#ifndef AI_NUMERICHOST
|
||||
# define AI_NUMERICHOST (1<<2)
|
||||
#endif
|
||||
|
||||
#ifndef NI_MAXSERV
|
||||
# define NI_MAXSERV 32
|
||||
#endif /* !NI_MAXSERV */
|
||||
#ifndef NI_MAXHOST
|
||||
# define NI_MAXHOST 1025
|
||||
#endif /* !NI_MAXHOST */
|
||||
|
||||
#ifndef INT_MAX
|
||||
#define INT_MAX 0xffffffff
|
||||
#endif
|
||||
|
||||
#ifndef EAI_NODATA
|
||||
# define EAI_NODATA (INT_MAX - 1)
|
||||
#endif
|
||||
#ifndef EAI_MEMORY
|
||||
# define EAI_MEMORY (INT_MAX - 2)
|
||||
#endif
|
||||
#ifndef EAI_NONAME
|
||||
# define EAI_NONAME (INT_MAX - 3)
|
||||
#endif
|
||||
#ifndef EAI_SYSTEM
|
||||
# define EAI_SYSTEM (INT_MAX - 4)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_ADDRINFO
|
||||
struct addrinfo {
|
||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
|
||||
int ai_family; /* PF_xxx */
|
||||
int ai_socktype; /* SOCK_xxx */
|
||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||
size_t ai_addrlen; /* length of ai_addr */
|
||||
char *ai_canonname; /* canonical name for hostname */
|
||||
struct sockaddr *ai_addr; /* binary address */
|
||||
struct addrinfo *ai_next; /* next structure in linked list */
|
||||
};
|
||||
#endif /* !HAVE_STRUCT_ADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
#ifdef getaddrinfo
|
||||
# undef getaddrinfo
|
||||
#endif
|
||||
#define getaddrinfo(a,b,c,d) (ssh_getaddrinfo(a,b,c,d))
|
||||
int getaddrinfo(const char *, const char *,
|
||||
const struct addrinfo *, struct addrinfo **);
|
||||
#endif /* !HAVE_GETADDRINFO */
|
||||
|
||||
#if !defined(HAVE_GAI_STRERROR) && !defined(HAVE_CONST_GAI_STRERROR_PROTO)
|
||||
#define gai_strerror(a) (ssh_gai_strerror(a))
|
||||
char *gai_strerror(int);
|
||||
#endif /* !HAVE_GAI_STRERROR */
|
||||
|
||||
#ifndef HAVE_FREEADDRINFO
|
||||
#define freeaddrinfo(a) (ssh_freeaddrinfo(a))
|
||||
void freeaddrinfo(struct addrinfo *);
|
||||
#endif /* !HAVE_FREEADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETNAMEINFO
|
||||
#define getnameinfo(a,b,c,d,e,f,g) (ssh_getnameinfo(a,b,c,d,e,f,g))
|
||||
int getnameinfo(const struct sockaddr *, size_t, char *, size_t,
|
||||
char *, size_t, int);
|
||||
#endif /* !HAVE_GETNAMEINFO */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_FAKE_RFC2553_H */
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
#include <ldns/config.h>
|
||||
|
||||
#ifndef HAVE_GETTIMEOFDAY
|
||||
|
||||
#include < time.h >
|
||||
#include < windows.h>
|
||||
#include <compat/gettimeofday.h>
|
||||
|
||||
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
|
||||
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
|
||||
#else
|
||||
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
|
||||
#endif
|
||||
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
FILETIME ft;
|
||||
unsigned __int64 tmpres = 0;
|
||||
static int tzflag;
|
||||
|
||||
if (NULL != tv)
|
||||
{
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
|
||||
tmpres |= ft.dwHighDateTime;
|
||||
tmpres <<= 32;
|
||||
tmpres |= ft.dwLowDateTime;
|
||||
|
||||
/*converting file time to unix epoch*/
|
||||
tmpres /= 10; /*convert into microseconds*/
|
||||
tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
||||
tv->tv_sec = (long)(tmpres / 1000000UL);
|
||||
tv->tv_usec = (long)(tmpres % 1000000UL);
|
||||
}
|
||||
|
||||
if (NULL != tz)
|
||||
{
|
||||
if (!tzflag)
|
||||
{
|
||||
_tzset();
|
||||
tzflag++;
|
||||
}
|
||||
tz->tz_minuteswest = _timezone / 60;
|
||||
tz->tz_dsttime = _daylight;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
#ifndef HAVE_GETTIMEOFDAY
|
||||
|
||||
struct timezone
|
||||
{
|
||||
int tz_minuteswest; /* minutes W of Greenwich */
|
||||
int tz_dsttime; /* type of dst correction */
|
||||
};
|
||||
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,14 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TIME_H
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
struct tm *gmtime_r(const time_t *timep, struct tm *result)
|
||||
{
|
||||
/* no thread safety. */
|
||||
*result = *gmtime(timep);
|
||||
return result;
|
||||
}
|
|
@ -0,0 +1,184 @@
|
|||
/* From openssh4.3p2 compat/inet_aton.c */
|
||||
/*
|
||||
* Copyright (c) 1983, 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* -
|
||||
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies, and that
|
||||
* the name of Digital Equipment Corporation not be used in advertising or
|
||||
* publicity pertaining to distribution of the document or software without
|
||||
* specific, written prior permission.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
|
||||
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
|
||||
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
* -
|
||||
* --Copyright--
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/net/inet_addr.c */
|
||||
|
||||
#include <ldns/config.h>
|
||||
|
||||
#if !defined(HAVE_INET_ATON)
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#include <ctype.h>
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Ascii internet address interpretation routine.
|
||||
* The value returned is in network order.
|
||||
*/
|
||||
in_addr_t
|
||||
inet_addr(const char *cp)
|
||||
{
|
||||
struct in_addr val;
|
||||
|
||||
if (inet_aton(cp, &val))
|
||||
return (val.s_addr);
|
||||
return (INADDR_NONE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check whether "cp" is a valid ascii representation
|
||||
* of an Internet address and convert to a binary address.
|
||||
* Returns 1 if the address is valid, 0 if not.
|
||||
* This replaces inet_addr, the return value from which
|
||||
* cannot distinguish between failure and a local broadcast address.
|
||||
*/
|
||||
int
|
||||
inet_aton(const char *cp, struct in_addr *addr)
|
||||
{
|
||||
uint32_t val;
|
||||
int base, n;
|
||||
char c;
|
||||
unsigned int parts[4];
|
||||
unsigned int *pp = parts;
|
||||
|
||||
c = *cp;
|
||||
for (;;) {
|
||||
/*
|
||||
* Collect number up to ``.''.
|
||||
* Values are specified as for C:
|
||||
* 0x=hex, 0=octal, isdigit=decimal.
|
||||
*/
|
||||
if (!isdigit((int) c))
|
||||
return (0);
|
||||
val = 0; base = 10;
|
||||
if (c == '0') {
|
||||
c = *++cp;
|
||||
if (c == 'x' || c == 'X')
|
||||
base = 16, c = *++cp;
|
||||
else
|
||||
base = 8;
|
||||
}
|
||||
for (;;) {
|
||||
if (isascii((int) c) && isdigit((int) c)) {
|
||||
val = (val * base) + (c - '0');
|
||||
c = *++cp;
|
||||
} else if (base == 16 && isascii((int) c) && isxdigit((int) c)) {
|
||||
val = (val << 4) |
|
||||
(c + 10 - (islower((int) c) ? 'a' : 'A'));
|
||||
c = *++cp;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
if (c == '.') {
|
||||
/*
|
||||
* Internet format:
|
||||
* a.b.c.d
|
||||
* a.b.c (with c treated as 16 bits)
|
||||
* a.b (with b treated as 24 bits)
|
||||
*/
|
||||
if (pp >= parts + 3)
|
||||
return (0);
|
||||
*pp++ = val;
|
||||
c = *++cp;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Check for trailing characters.
|
||||
*/
|
||||
if (c != '\0' && (!isascii((int) c) || !isspace((int) c)))
|
||||
return (0);
|
||||
/*
|
||||
* Concoct the address according to
|
||||
* the number of parts specified.
|
||||
*/
|
||||
n = pp - parts + 1;
|
||||
switch (n) {
|
||||
|
||||
case 0:
|
||||
return (0); /* initial nondigit */
|
||||
|
||||
case 1: /* a -- 32 bits */
|
||||
break;
|
||||
|
||||
case 2: /* a.b -- 8.24 bits */
|
||||
if ((val > 0xffffff) || (parts[0] > 0xff))
|
||||
return (0);
|
||||
val |= parts[0] << 24;
|
||||
break;
|
||||
|
||||
case 3: /* a.b.c -- 8.8.16 bits */
|
||||
if ((val > 0xffff) || (parts[0] > 0xff) || (parts[1] > 0xff))
|
||||
return (0);
|
||||
val |= (parts[0] << 24) | (parts[1] << 16);
|
||||
break;
|
||||
|
||||
case 4: /* a.b.c.d -- 8.8.8.8 bits */
|
||||
if ((val > 0xff) || (parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff))
|
||||
return (0);
|
||||
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
|
||||
break;
|
||||
}
|
||||
if (addr)
|
||||
addr->s_addr = htonl(val);
|
||||
return (1);
|
||||
}
|
||||
|
||||
#endif /* !defined(HAVE_INET_ATON) */
|
|
@ -0,0 +1,218 @@
|
|||
/* From openssh 4.3p2 compat/inet_ntop.c */
|
||||
/* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/net/inet_ntop.c */
|
||||
|
||||
#include <ldns/config.h>
|
||||
|
||||
#ifndef HAVE_INET_NTOP
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef IN6ADDRSZ
|
||||
#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
|
||||
#endif
|
||||
|
||||
#ifndef INT16SZ
|
||||
#define INT16SZ 2 /* for systems without 16-bit ints */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* WARNING: Don't even consider trying to compile this on a system where
|
||||
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
|
||||
*/
|
||||
|
||||
static const char *inet_ntop4(const u_char *src, char *dst, size_t size);
|
||||
static const char *inet_ntop6(const u_char *src, char *dst, size_t size);
|
||||
|
||||
/* char *
|
||||
* inet_ntop(af, src, dst, size)
|
||||
* convert a network format address to presentation format.
|
||||
* return:
|
||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
const char *
|
||||
inet_ntop(int af, const void *src, char *dst, size_t size)
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_ntop4(src, dst, size));
|
||||
case AF_INET6:
|
||||
return (inet_ntop6(src, dst, size));
|
||||
default:
|
||||
#ifdef EAFNOSUPPORT
|
||||
errno = EAFNOSUPPORT;
|
||||
#else
|
||||
errno = ENOSYS;
|
||||
#endif
|
||||
return (NULL);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* const char *
|
||||
* inet_ntop4(src, dst, size)
|
||||
* format an IPv4 address, more or less like inet_ntoa()
|
||||
* return:
|
||||
* `dst' (as a const)
|
||||
* notes:
|
||||
* (1) uses no statics
|
||||
* (2) takes a u_char* not an in_addr as input
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
inet_ntop4(const u_char *src, char *dst, size_t size)
|
||||
{
|
||||
static const char fmt[] = "%u.%u.%u.%u";
|
||||
char tmp[sizeof "255.255.255.255"];
|
||||
int l;
|
||||
|
||||
l = snprintf(tmp, size, fmt, src[0], src[1], src[2], src[3]);
|
||||
if (l <= 0 || l >= (int)size) {
|
||||
errno = ENOSPC;
|
||||
return (NULL);
|
||||
}
|
||||
strlcpy(dst, tmp, size);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
/* const char *
|
||||
* inet_ntop6(src, dst, size)
|
||||
* convert IPv6 binary address into presentation (printable) format
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
inet_ntop6(const u_char *src, char *dst, size_t size)
|
||||
{
|
||||
/*
|
||||
* Note that int32_t and int16_t need only be "at least" large enough
|
||||
* to contain a value of the specified size. On some systems, like
|
||||
* Crays, there is no such thing as an integer variable with 16 bits.
|
||||
* Keep this in mind if you think this function should have been coded
|
||||
* to use pointer overlays. All the world's not a VAX.
|
||||
*/
|
||||
char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
|
||||
char *tp, *ep;
|
||||
struct { int base, len; } best, cur;
|
||||
u_int words[IN6ADDRSZ / INT16SZ];
|
||||
int i;
|
||||
int advance;
|
||||
|
||||
/*
|
||||
* Preprocess:
|
||||
* Copy the input (bytewise) array into a wordwise array.
|
||||
* Find the longest run of 0x00's in src[] for :: shorthanding.
|
||||
*/
|
||||
memset(words, '\0', sizeof words);
|
||||
for (i = 0; i < IN6ADDRSZ; i++)
|
||||
words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
|
||||
best.base = -1;
|
||||
cur.base = -1;
|
||||
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
|
||||
if (words[i] == 0) {
|
||||
if (cur.base == -1)
|
||||
cur.base = i, cur.len = 1;
|
||||
else
|
||||
cur.len++;
|
||||
} else {
|
||||
if (cur.base != -1) {
|
||||
if (best.base == -1 || cur.len > best.len)
|
||||
best = cur;
|
||||
cur.base = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cur.base != -1) {
|
||||
if (best.base == -1 || cur.len > best.len)
|
||||
best = cur;
|
||||
}
|
||||
if (best.base != -1 && best.len < 2)
|
||||
best.base = -1;
|
||||
|
||||
/*
|
||||
* Format the result.
|
||||
*/
|
||||
tp = tmp;
|
||||
ep = tmp + sizeof(tmp);
|
||||
for (i = 0; i < (IN6ADDRSZ / INT16SZ) && tp < ep; i++) {
|
||||
/* Are we inside the best run of 0x00's? */
|
||||
if (best.base != -1 && i >= best.base &&
|
||||
i < (best.base + best.len)) {
|
||||
if (i == best.base) {
|
||||
if (tp + 1 >= ep)
|
||||
return (NULL);
|
||||
*tp++ = ':';
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/* Are we following an initial run of 0x00s or any real hex? */
|
||||
if (i != 0) {
|
||||
if (tp + 1 >= ep)
|
||||
return (NULL);
|
||||
*tp++ = ':';
|
||||
}
|
||||
/* Is this address an encapsulated IPv4? */
|
||||
if (i == 6 && best.base == 0 &&
|
||||
(best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
|
||||
if (!inet_ntop4(src+12, tp, (size_t)(ep - tp)))
|
||||
return (NULL);
|
||||
tp += strlen(tp);
|
||||
break;
|
||||
}
|
||||
advance = snprintf(tp, ep - tp, "%x", words[i]);
|
||||
if (advance <= 0 || advance >= ep - tp)
|
||||
return (NULL);
|
||||
tp += advance;
|
||||
}
|
||||
/* Was it a trailing run of 0x00's? */
|
||||
if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) {
|
||||
if (tp + 1 >= ep)
|
||||
return (NULL);
|
||||
*tp++ = ':';
|
||||
}
|
||||
if (tp + 1 >= ep)
|
||||
return (NULL);
|
||||
*tp++ = '\0';
|
||||
|
||||
/*
|
||||
* Check for overflow, copy, and we're done.
|
||||
*/
|
||||
if ((size_t)(tp - tmp) > size) {
|
||||
errno = ENOSPC;
|
||||
return (NULL);
|
||||
}
|
||||
strlcpy(dst, tmp, size);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
#endif /* !HAVE_INET_NTOP */
|
|
@ -0,0 +1,230 @@
|
|||
/* $KAME: inet_pton.c,v 1.5 2001/08/20 02:32:40 itojun Exp $ */
|
||||
|
||||
/* Copyright (c) 1996 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <ldns/config.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* WARNING: Don't even consider trying to compile this on a system where
|
||||
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
|
||||
*/
|
||||
|
||||
static int inet_pton4 (const char *src, uint8_t *dst);
|
||||
static int inet_pton6 (const char *src, uint8_t *dst);
|
||||
|
||||
/*
|
||||
*
|
||||
* The definitions we might miss.
|
||||
*
|
||||
*/
|
||||
#ifndef NS_INT16SZ
|
||||
#define NS_INT16SZ 2
|
||||
#endif
|
||||
|
||||
#ifndef NS_IN6ADDRSZ
|
||||
#define NS_IN6ADDRSZ 16
|
||||
#endif
|
||||
|
||||
#ifndef NS_INADDRSZ
|
||||
#define NS_INADDRSZ 4
|
||||
#endif
|
||||
|
||||
/* int
|
||||
* inet_pton(af, src, dst)
|
||||
* convert from presentation format (which usually means ASCII printable)
|
||||
* to network format (which is usually some kind of binary format).
|
||||
* return:
|
||||
* 1 if the address was valid for the specified address family
|
||||
* 0 if the address wasn't valid (`dst' is untouched in this case)
|
||||
* -1 if some other error occurred (`dst' is untouched in this case, too)
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
int
|
||||
inet_pton(af, src, dst)
|
||||
int af;
|
||||
const char *src;
|
||||
void *dst;
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_pton4(src, dst));
|
||||
case AF_INET6:
|
||||
return (inet_pton6(src, dst));
|
||||
default:
|
||||
#ifdef EAFNOSUPPORT
|
||||
errno = EAFNOSUPPORT;
|
||||
#else
|
||||
errno = ENOSYS;
|
||||
#endif
|
||||
return (-1);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* int
|
||||
* inet_pton4(src, dst)
|
||||
* like inet_aton() but without all the hexadecimal and shorthand.
|
||||
* return:
|
||||
* 1 if `src' is a valid dotted quad, else 0.
|
||||
* notice:
|
||||
* does not touch `dst' unless it's returning 1.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static int
|
||||
inet_pton4(src, dst)
|
||||
const char *src;
|
||||
uint8_t *dst;
|
||||
{
|
||||
static const char digits[] = "0123456789";
|
||||
int saw_digit, octets, ch;
|
||||
uint8_t tmp[NS_INADDRSZ], *tp;
|
||||
|
||||
saw_digit = 0;
|
||||
octets = 0;
|
||||
*(tp = tmp) = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr(digits, ch)) != NULL) {
|
||||
uint32_t new = *tp * 10 + (pch - digits);
|
||||
|
||||
if (new > 255)
|
||||
return (0);
|
||||
*tp = new;
|
||||
if (! saw_digit) {
|
||||
if (++octets > 4)
|
||||
return (0);
|
||||
saw_digit = 1;
|
||||
}
|
||||
} else if (ch == '.' && saw_digit) {
|
||||
if (octets == 4)
|
||||
return (0);
|
||||
*++tp = 0;
|
||||
saw_digit = 0;
|
||||
} else
|
||||
return (0);
|
||||
}
|
||||
if (octets < 4)
|
||||
return (0);
|
||||
|
||||
memcpy(dst, tmp, NS_INADDRSZ);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* int
|
||||
* inet_pton6(src, dst)
|
||||
* convert presentation level address to network order binary form.
|
||||
* return:
|
||||
* 1 if `src' is a valid [RFC1884 2.2] address, else 0.
|
||||
* notice:
|
||||
* (1) does not touch `dst' unless it's returning 1.
|
||||
* (2) :: in a full address is silently ignored.
|
||||
* credit:
|
||||
* inspired by Mark Andrews.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static int
|
||||
inet_pton6(src, dst)
|
||||
const char *src;
|
||||
uint8_t *dst;
|
||||
{
|
||||
static const char xdigits_l[] = "0123456789abcdef",
|
||||
xdigits_u[] = "0123456789ABCDEF";
|
||||
uint8_t tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
|
||||
const char *xdigits, *curtok;
|
||||
int ch, saw_xdigit;
|
||||
uint32_t val;
|
||||
|
||||
memset((tp = tmp), '\0', NS_IN6ADDRSZ);
|
||||
endp = tp + NS_IN6ADDRSZ;
|
||||
colonp = NULL;
|
||||
/* Leading :: requires some special handling. */
|
||||
if (*src == ':')
|
||||
if (*++src != ':')
|
||||
return (0);
|
||||
curtok = src;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
|
||||
pch = strchr((xdigits = xdigits_u), ch);
|
||||
if (pch != NULL) {
|
||||
val <<= 4;
|
||||
val |= (pch - xdigits);
|
||||
if (val > 0xffff)
|
||||
return (0);
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
if (ch == ':') {
|
||||
curtok = src;
|
||||
if (!saw_xdigit) {
|
||||
if (colonp)
|
||||
return (0);
|
||||
colonp = tp;
|
||||
continue;
|
||||
}
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (uint8_t) (val >> 8) & 0xff;
|
||||
*tp++ = (uint8_t) val & 0xff;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
continue;
|
||||
}
|
||||
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
|
||||
inet_pton4(curtok, tp) > 0) {
|
||||
tp += NS_INADDRSZ;
|
||||
saw_xdigit = 0;
|
||||
break; /* '\0' was seen by inet_pton4(). */
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
if (saw_xdigit) {
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (uint8_t) (val >> 8) & 0xff;
|
||||
*tp++ = (uint8_t) val & 0xff;
|
||||
}
|
||||
if (colonp != NULL) {
|
||||
/*
|
||||
* Since some memmove()'s erroneously fail to handle
|
||||
* overlapping regions, we'll do the shift by hand.
|
||||
*/
|
||||
const int n = tp - colonp;
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= n; i++) {
|
||||
endp[- i] = colonp[n - i];
|
||||
colonp[n - i] = 0;
|
||||
}
|
||||
tp = endp;
|
||||
}
|
||||
if (tp != endp)
|
||||
return (0);
|
||||
memcpy(dst, tmp, NS_IN6ADDRSZ);
|
||||
return (1);
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/* Just a replacement, if the original isascii is not
|
||||
present */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
|
||||
int isascii(int c);
|
||||
|
||||
/* true if character is ascii. */
|
||||
int
|
||||
isascii(int c)
|
||||
{
|
||||
return c >= 0 && c < 128;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/* Just a replacement, if the original isblank is not
|
||||
present */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
|
||||
int isblank(int c);
|
||||
|
||||
/* true if character is a blank (space or tab). C99. */
|
||||
int
|
||||
isblank(int c)
|
||||
{
|
||||
return (c == ' ') || (c == '\t');
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
/* Just a replacement, if the original malloc is not
|
||||
GNU-compliant. See autoconf documentation. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
#undef malloc
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
void *malloc ();
|
||||
#endif
|
||||
|
||||
/* Allocate an N-byte block of memory from the heap.
|
||||
If N is zero, allocate a 1-byte block. */
|
||||
|
||||
void *
|
||||
rpl_malloc (size_t n)
|
||||
{
|
||||
if (n == 0)
|
||||
n = 1;
|
||||
return malloc (n);
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* memmove.c: memmove compat implementation.
|
||||
*
|
||||
* Copyright (c) 2001-2008, NLnet Labs. All rights reserved.
|
||||
*
|
||||
* See LICENSE for the license.
|
||||
*/
|
||||
|
||||
#include <ldns/config.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
void *memmove(void *dest, const void *src, size_t n);
|
||||
|
||||
void *memmove(void *dest, const void *src, size_t n)
|
||||
{
|
||||
uint8_t* from = (uint8_t*) src;
|
||||
uint8_t* to = (uint8_t*) dest;
|
||||
|
||||
if (from == to || n == 0)
|
||||
return dest;
|
||||
if (to > from && to-from < (int)n) {
|
||||
/* to overlaps with from */
|
||||
/* <from......> */
|
||||
/* <to........> */
|
||||
/* copy in reverse, to avoid overwriting from */
|
||||
int i;
|
||||
for(i=n-1; i>=0; i--)
|
||||
to[i] = from[i];
|
||||
return dest;
|
||||
}
|
||||
if (from > to && from-to < (int)n) {
|
||||
/* to overlaps with from */
|
||||
/* <from......> */
|
||||
/* <to........> */
|
||||
/* copy forwards, to avoid overwriting from */
|
||||
size_t i;
|
||||
for(i=0; i<n; i++)
|
||||
to[i] = from[i];
|
||||
return dest;
|
||||
}
|
||||
memcpy(dest, src, n);
|
||||
return dest;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,32 @@
|
|||
/* Just a replacement, if the original malloc is not
|
||||
GNU-compliant. Based on malloc.c */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
#undef realloc
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
void *realloc (void*, size_t);
|
||||
void *malloc (size_t);
|
||||
#endif
|
||||
|
||||
/* Changes allocation to new sizes, copies over old data.
|
||||
* if oldptr is NULL, does a malloc.
|
||||
* if size is zero, allocate 1-byte block....
|
||||
* (does not return NULL and free block)
|
||||
*/
|
||||
|
||||
void *
|
||||
rpl_realloc (void* ptr, size_t n)
|
||||
{
|
||||
if (n == 0)
|
||||
n = 1;
|
||||
if(ptr == 0) {
|
||||
return malloc(n);
|
||||
}
|
||||
return realloc(ptr, n);
|
||||
}
|
||||
|
|
@ -0,0 +1,770 @@
|
|||
#include <ldns/config.h>
|
||||
|
||||
#ifndef HAVE_SNPRINTF
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Define this as a fall through, HAVE_STDARG_H is probably already set */
|
||||
|
||||
#define HAVE_VARARGS_H
|
||||
|
||||
/**************************************************************
|
||||
* Original:
|
||||
* Patrick Powell Tue Apr 11 09:48:21 PDT 1995
|
||||
* A bombproof version of doprnt (dopr) included.
|
||||
* Sigh. This sort of thing is always nasty do deal with. Note that
|
||||
* the version here does not include floating point...
|
||||
*
|
||||
* snprintf() is used instead of sprintf() as it does limit checks
|
||||
* for string length. This covers a nasty loophole.
|
||||
*
|
||||
* The other functions are there to prevent NULL pointers from
|
||||
* causing nast effects.
|
||||
*
|
||||
* More Recently:
|
||||
* Brandon Long (blong@fiction.net) 9/15/96 for mutt 0.43
|
||||
* This was ugly. It is still ugly. I opted out of floating point
|
||||
* numbers, but the formatter understands just about everything
|
||||
* from the normal C string format, at least as far as I can tell from
|
||||
* the Solaris 2.5 printf(3S) man page.
|
||||
*
|
||||
* Brandon Long (blong@fiction.net) 10/22/97 for mutt 0.87.1
|
||||
* Ok, added some minimal floating point support, which means this
|
||||
* probably requires libm on most operating systems. Don't yet
|
||||
* support the exponent (e,E) and sigfig (g,G). Also, fmtint()
|
||||
* was pretty badly broken, it just wasn't being exercised in ways
|
||||
* which showed it, so that's been fixed. Also, formated the code
|
||||
* to mutt conventions, and removed dead code left over from the
|
||||
* original. Also, there is now a builtin-test, just compile with:
|
||||
* gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
|
||||
* and run snprintf for results.
|
||||
*
|
||||
**************************************************************/
|
||||
|
||||
|
||||
/* varargs declarations: */
|
||||
|
||||
#if defined(HAVE_STDARG_H)
|
||||
# include <stdarg.h>
|
||||
# define HAVE_STDARGS /* let's hope that works everywhere (mj) */
|
||||
# define VA_LOCAL_DECL va_list ap
|
||||
# define VA_START(f) va_start(ap, f)
|
||||
# define VA_SHIFT(v,t) ; /* no-op for ANSI */
|
||||
# define VA_END va_end(ap)
|
||||
#else
|
||||
# if defined(HAVE_VARARGS_H)
|
||||
# include <varargs.h>
|
||||
# undef HAVE_STDARGS
|
||||
# define VA_LOCAL_DECL va_list ap
|
||||
# define VA_START(f) va_start(ap) /* f is ignored! */
|
||||
# define VA_SHIFT(v,t) v = va_arg(ap,t)
|
||||
# define VA_END va_end(ap)
|
||||
# else
|
||||
/*XX ** NO VARARGS ** XX*/
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int snprintf (char *str, size_t count, const char *fmt, ...);
|
||||
int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
|
||||
|
||||
static void dopr (char *buffer, size_t maxlen, const char *format,
|
||||
va_list args);
|
||||
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||
char *value, int flags, int min, int max);
|
||||
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||
long value, int base, int min, int max, int flags);
|
||||
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||
long double fvalue, int min, int max, int flags);
|
||||
static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
|
||||
|
||||
int vsnprintf (char *str, size_t count, const char *fmt, va_list args)
|
||||
{
|
||||
str[0] = 0;
|
||||
dopr(str, count, fmt, args);
|
||||
return(strlen(str));
|
||||
}
|
||||
|
||||
/* VARARGS3 */
|
||||
#ifdef HAVE_STDARGS
|
||||
int snprintf (char *str,size_t count,const char *fmt,...)
|
||||
#else
|
||||
int snprintf (va_alist) va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifndef HAVE_STDARGS
|
||||
char *str;
|
||||
size_t count;
|
||||
char *fmt;
|
||||
#endif
|
||||
VA_LOCAL_DECL;
|
||||
|
||||
VA_START (fmt);
|
||||
VA_SHIFT (str, char *);
|
||||
VA_SHIFT (count, size_t );
|
||||
VA_SHIFT (fmt, char *);
|
||||
(void) vsnprintf(str, count, fmt, ap);
|
||||
VA_END;
|
||||
return(strlen(str));
|
||||
}
|
||||
|
||||
/*
|
||||
* dopr(): poor man's version of doprintf
|
||||
*/
|
||||
|
||||
/* format read states */
|
||||
#define DP_S_DEFAULT 0
|
||||
#define DP_S_FLAGS 1
|
||||
#define DP_S_MIN 2
|
||||
#define DP_S_DOT 3
|
||||
#define DP_S_MAX 4
|
||||
#define DP_S_MOD 5
|
||||
#define DP_S_CONV 6
|
||||
#define DP_S_DONE 7
|
||||
|
||||
/* format flags - Bits */
|
||||
#define DP_F_MINUS 1
|
||||
#define DP_F_PLUS 2
|
||||
#define DP_F_SPACE 4
|
||||
#define DP_F_NUM 8
|
||||
#define DP_F_ZERO 16
|
||||
#define DP_F_UP 32
|
||||
|
||||
/* Conversion Flags */
|
||||
#define DP_C_SHORT 1
|
||||
#define DP_C_LONG 2
|
||||
#define DP_C_LDOUBLE 3
|
||||
|
||||
#define char_to_int(p) (p - '0')
|
||||
#define MAX(p,q) ((p >= q) ? p : q)
|
||||
|
||||
static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
||||
{
|
||||
char ch;
|
||||
long value;
|
||||
long double fvalue;
|
||||
char *strvalue;
|
||||
int min;
|
||||
int max;
|
||||
int state;
|
||||
int flags;
|
||||
int cflags;
|
||||
size_t currlen;
|
||||
|
||||
state = DP_S_DEFAULT;
|
||||
currlen = flags = cflags = min = 0;
|
||||
max = -1;
|
||||
ch = *format++;
|
||||
|
||||
while (state != DP_S_DONE)
|
||||
{
|
||||
if ((ch == '\0') || (currlen >= maxlen))
|
||||
state = DP_S_DONE;
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case DP_S_DEFAULT:
|
||||
if (ch == '%')
|
||||
state = DP_S_FLAGS;
|
||||
else
|
||||
dopr_outch (buffer, &currlen, maxlen, ch);
|
||||
ch = *format++;
|
||||
break;
|
||||
case DP_S_FLAGS:
|
||||
switch (ch)
|
||||
{
|
||||
case '-':
|
||||
flags |= DP_F_MINUS;
|
||||
ch = *format++;
|
||||
break;
|
||||
case '+':
|
||||
flags |= DP_F_PLUS;
|
||||
ch = *format++;
|
||||
break;
|
||||
case ' ':
|
||||
flags |= DP_F_SPACE;
|
||||
ch = *format++;
|
||||
break;
|
||||
case '#':
|
||||
flags |= DP_F_NUM;
|
||||
ch = *format++;
|
||||
break;
|
||||
case '0':
|
||||
flags |= DP_F_ZERO;
|
||||
ch = *format++;
|
||||
break;
|
||||
default:
|
||||
state = DP_S_MIN;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DP_S_MIN:
|
||||
if (isdigit((int) ch))
|
||||
{
|
||||
min = 10*min + char_to_int (ch);
|
||||
ch = *format++;
|
||||
}
|
||||
else if (ch == '*')
|
||||
{
|
||||
min = va_arg (args, int);
|
||||
ch = *format++;
|
||||
state = DP_S_DOT;
|
||||
}
|
||||
else
|
||||
state = DP_S_DOT;
|
||||
break;
|
||||
case DP_S_DOT:
|
||||
if (ch == '.')
|
||||
{
|
||||
state = DP_S_MAX;
|
||||
ch = *format++;
|
||||
}
|
||||
else
|
||||
state = DP_S_MOD;
|
||||
break;
|
||||
case DP_S_MAX:
|
||||
if (isdigit((int) ch))
|
||||
{
|
||||
if (max < 0)
|
||||
max = 0;
|
||||
max = 10*max + char_to_int (ch);
|
||||
ch = *format++;
|
||||
}
|
||||
else if (ch == '*')
|
||||
{
|
||||
max = va_arg (args, int);
|
||||
ch = *format++;
|
||||
state = DP_S_MOD;
|
||||
}
|
||||
else
|
||||
state = DP_S_MOD;
|
||||
break;
|
||||
case DP_S_MOD:
|
||||
/* Currently, we don't support Long Long, bummer */
|
||||
switch (ch)
|
||||
{
|
||||
case 'h':
|
||||
cflags = DP_C_SHORT;
|
||||
ch = *format++;
|
||||
break;
|
||||
case 'l':
|
||||
cflags = DP_C_LONG;
|
||||
ch = *format++;
|
||||
break;
|
||||
case 'L':
|
||||
cflags = DP_C_LDOUBLE;
|
||||
ch = *format++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
state = DP_S_CONV;
|
||||
break;
|
||||
case DP_S_CONV:
|
||||
switch (ch)
|
||||
{
|
||||
case 'd':
|
||||
case 'i':
|
||||
if (cflags == DP_C_SHORT)
|
||||
value = va_arg (args, int);
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = va_arg (args, long int);
|
||||
else
|
||||
value = va_arg (args, int);
|
||||
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
||||
break;
|
||||
case 'o':
|
||||
flags &= ~DP_F_PLUS;
|
||||
if (cflags == DP_C_SHORT)
|
||||
value = va_arg (args, unsigned int);
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = va_arg (args, unsigned long int);
|
||||
else
|
||||
value = va_arg (args, unsigned int);
|
||||
fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
|
||||
break;
|
||||
case 'u':
|
||||
flags &= ~DP_F_PLUS;
|
||||
if (cflags == DP_C_SHORT)
|
||||
value = va_arg (args, unsigned int);
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = va_arg (args, unsigned long int);
|
||||
else
|
||||
value = va_arg (args, unsigned int);
|
||||
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
||||
break;
|
||||
case 'X':
|
||||
flags |= DP_F_UP;
|
||||
case 'x':
|
||||
flags &= ~DP_F_PLUS;
|
||||
if (cflags == DP_C_SHORT)
|
||||
value = va_arg (args, unsigned int);
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = va_arg (args, unsigned long int);
|
||||
else
|
||||
value = va_arg (args, unsigned int);
|
||||
fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
|
||||
break;
|
||||
case 'f':
|
||||
if (cflags == DP_C_LDOUBLE)
|
||||
fvalue = va_arg (args, long double);
|
||||
else
|
||||
fvalue = va_arg (args, double);
|
||||
/* um, floating point? */
|
||||
fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
|
||||
break;
|
||||
case 'E':
|
||||
flags |= DP_F_UP;
|
||||
case 'e':
|
||||
if (cflags == DP_C_LDOUBLE)
|
||||
fvalue = va_arg (args, long double);
|
||||
else
|
||||
fvalue = va_arg (args, double);
|
||||
break;
|
||||
case 'G':
|
||||
flags |= DP_F_UP;
|
||||
case 'g':
|
||||
if (cflags == DP_C_LDOUBLE)
|
||||
fvalue = va_arg (args, long double);
|
||||
else
|
||||
fvalue = va_arg (args, double);
|
||||
break;
|
||||
case 'c':
|
||||
dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
|
||||
break;
|
||||
case 's':
|
||||
strvalue = va_arg (args, char *);
|
||||
if (max < 0)
|
||||
max = maxlen; /* ie, no max */
|
||||
fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
|
||||
break;
|
||||
case 'p':
|
||||
strvalue = va_arg (args, void *);
|
||||
fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
|
||||
break;
|
||||
case 'n':
|
||||
if (cflags == DP_C_SHORT)
|
||||
{
|
||||
short int *num;
|
||||
num = va_arg (args, short int *);
|
||||
*num = currlen;
|
||||
}
|
||||
else if (cflags == DP_C_LONG)
|
||||
{
|
||||
long int *num;
|
||||
num = va_arg (args, long int *);
|
||||
*num = currlen;
|
||||
}
|
||||
else
|
||||
{
|
||||
int *num;
|
||||
num = va_arg (args, int *);
|
||||
*num = currlen;
|
||||
}
|
||||
break;
|
||||
case '%':
|
||||
dopr_outch (buffer, &currlen, maxlen, ch);
|
||||
break;
|
||||
case 'w':
|
||||
/* not supported yet, treat as next char */
|
||||
ch = *format++;
|
||||
break;
|
||||
default:
|
||||
/* Unknown, skip */
|
||||
break;
|
||||
}
|
||||
ch = *format++;
|
||||
state = DP_S_DEFAULT;
|
||||
flags = cflags = min = 0;
|
||||
max = -1;
|
||||
break;
|
||||
case DP_S_DONE:
|
||||
break;
|
||||
default:
|
||||
/* hmm? */
|
||||
break; /* some picky compilers need this */
|
||||
}
|
||||
}
|
||||
if (currlen < maxlen - 1)
|
||||
buffer[currlen] = '\0';
|
||||
else
|
||||
buffer[maxlen - 1] = '\0';
|
||||
}
|
||||
|
||||
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||
char *value, int flags, int min, int max)
|
||||
{
|
||||
int padlen, strln; /* amount to pad */
|
||||
int cnt = 0;
|
||||
|
||||
if (value == 0)
|
||||
{
|
||||
value = (char *) "<NULL>";
|
||||
}
|
||||
|
||||
for (strln = 0; value[strln]; ++strln); /* strlen */
|
||||
padlen = min - strln;
|
||||
if (padlen < 0)
|
||||
padlen = 0;
|
||||
if (flags & DP_F_MINUS)
|
||||
padlen = -padlen; /* Left Justify */
|
||||
|
||||
while ((padlen > 0) && (cnt < max))
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
--padlen;
|
||||
++cnt;
|
||||
}
|
||||
while (*value && (cnt < max))
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, *value++);
|
||||
++cnt;
|
||||
}
|
||||
while ((padlen < 0) && (cnt < max))
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
++padlen;
|
||||
++cnt;
|
||||
}
|
||||
}
|
||||
|
||||
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
|
||||
|
||||
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||
long value, int base, int min, int max, int flags)
|
||||
{
|
||||
int signvalue = 0;
|
||||
unsigned long uvalue;
|
||||
char convert[20];
|
||||
int place = 0;
|
||||
int spadlen = 0; /* amount to space pad */
|
||||
int zpadlen = 0; /* amount to zero pad */
|
||||
int caps = 0;
|
||||
|
||||
if (max < 0)
|
||||
max = 0;
|
||||
|
||||
uvalue = value;
|
||||
if( value < 0 ) {
|
||||
signvalue = '-';
|
||||
uvalue = -value;
|
||||
}
|
||||
else
|
||||
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
|
||||
signvalue = '+';
|
||||
else
|
||||
if (flags & DP_F_SPACE)
|
||||
signvalue = ' ';
|
||||
|
||||
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
||||
|
||||
do {
|
||||
convert[place++] =
|
||||
(caps? "0123456789ABCDEF":"0123456789abcdef")
|
||||
[uvalue % (unsigned)base ];
|
||||
uvalue = (uvalue / (unsigned)base );
|
||||
} while(uvalue && (place < 20));
|
||||
if (place == 20) place--;
|
||||
convert[place] = 0;
|
||||
|
||||
zpadlen = max - place;
|
||||
spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);
|
||||
if (zpadlen < 0) zpadlen = 0;
|
||||
if (spadlen < 0) spadlen = 0;
|
||||
if (flags & DP_F_ZERO)
|
||||
{
|
||||
zpadlen = MAX(zpadlen, spadlen);
|
||||
spadlen = 0;
|
||||
}
|
||||
if (flags & DP_F_MINUS)
|
||||
spadlen = -spadlen; /* Left Justifty */
|
||||
|
||||
#ifdef DEBUG_SNPRINTF
|
||||
dprint (1, (debugfile, "zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
|
||||
zpadlen, spadlen, min, max, place));
|
||||
#endif
|
||||
|
||||
/* Spaces */
|
||||
while (spadlen > 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
--spadlen;
|
||||
}
|
||||
|
||||
/* Sign */
|
||||
if (signvalue)
|
||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||
|
||||
/* Zeros */
|
||||
if (zpadlen > 0)
|
||||
{
|
||||
while (zpadlen > 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, '0');
|
||||
--zpadlen;
|
||||
}
|
||||
}
|
||||
|
||||
/* Digits */
|
||||
while (place > 0)
|
||||
dopr_outch (buffer, currlen, maxlen, convert[--place]);
|
||||
|
||||
/* Left Justified spaces */
|
||||
while (spadlen < 0) {
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
++spadlen;
|
||||
}
|
||||
}
|
||||
|
||||
static long double abs_val (long double value)
|
||||
{
|
||||
long double result = value;
|
||||
|
||||
if (value < 0)
|
||||
result = -value;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static double pow10 (double exp)
|
||||
{
|
||||
long double result = 1;
|
||||
|
||||
while (exp)
|
||||
{
|
||||
result *= 10;
|
||||
exp--;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static double round (double value)
|
||||
{
|
||||
long intpart;
|
||||
|
||||
intpart = value;
|
||||
value = value - intpart;
|
||||
if (value >= 0.5)
|
||||
intpart++;
|
||||
|
||||
return intpart;
|
||||
}
|
||||
|
||||
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||
long double fvalue, int min, int max, int flags)
|
||||
{
|
||||
int signvalue = 0;
|
||||
long double ufvalue;
|
||||
char iconvert[20];
|
||||
char fconvert[20];
|
||||
int iplace = 0;
|
||||
int fplace = 0;
|
||||
int padlen = 0; /* amount to pad */
|
||||
int zpadlen = 0;
|
||||
int caps = 0;
|
||||
long intpart;
|
||||
long fracpart;
|
||||
|
||||
/*
|
||||
* AIX manpage says the default is 0, but Solaris says the default
|
||||
* is 6, and sprintf on AIX defaults to 6
|
||||
*/
|
||||
if (max < 0)
|
||||
max = 6;
|
||||
|
||||
ufvalue = abs_val (fvalue);
|
||||
|
||||
if (fvalue < 0)
|
||||
signvalue = '-';
|
||||
else
|
||||
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
|
||||
signvalue = '+';
|
||||
else
|
||||
if (flags & DP_F_SPACE)
|
||||
signvalue = ' ';
|
||||
|
||||
#if 0
|
||||
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
||||
#endif
|
||||
|
||||
intpart = ufvalue;
|
||||
|
||||
/*
|
||||
* Sorry, we only support 9 digits past the decimal because of our
|
||||
* conversion method
|
||||
*/
|
||||
if (max > 9)
|
||||
max = 9;
|
||||
|
||||
/* We "cheat" by converting the fractional part to integer by
|
||||
* multiplying by a factor of 10
|
||||
*/
|
||||
fracpart = round ((pow10 (max)) * (ufvalue - intpart));
|
||||
|
||||
if (fracpart >= pow10 (max))
|
||||
{
|
||||
intpart++;
|
||||
fracpart -= pow10 (max);
|
||||
}
|
||||
|
||||
#ifdef DEBUG_SNPRINTF
|
||||
dprint (1, (debugfile, "fmtfp: %f =? %d.%d\n", fvalue, intpart, fracpart));
|
||||
#endif
|
||||
|
||||
/* Convert integer part */
|
||||
do {
|
||||
iconvert[iplace++] =
|
||||
(caps? "0123456789ABCDEF":"0123456789abcdef")[intpart % 10];
|
||||
intpart = (intpart / 10);
|
||||
} while(intpart && (iplace < 20));
|
||||
if (iplace == 20) iplace--;
|
||||
iconvert[iplace] = 0;
|
||||
|
||||
/* Convert fractional part */
|
||||
do {
|
||||
fconvert[fplace++] =
|
||||
(caps? "0123456789ABCDEF":"0123456789abcdef")[fracpart % 10];
|
||||
fracpart = (fracpart / 10);
|
||||
} while(fracpart && (fplace < 20));
|
||||
if (fplace == 20) fplace--;
|
||||
fconvert[fplace] = 0;
|
||||
|
||||
/* -1 for decimal point, another -1 if we are printing a sign */
|
||||
padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
|
||||
zpadlen = max - fplace;
|
||||
if (zpadlen < 0)
|
||||
zpadlen = 0;
|
||||
if (padlen < 0)
|
||||
padlen = 0;
|
||||
if (flags & DP_F_MINUS)
|
||||
padlen = -padlen; /* Left Justifty */
|
||||
|
||||
if ((flags & DP_F_ZERO) && (padlen > 0))
|
||||
{
|
||||
if (signvalue)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||
--padlen;
|
||||
signvalue = 0;
|
||||
}
|
||||
while (padlen > 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, '0');
|
||||
--padlen;
|
||||
}
|
||||
}
|
||||
while (padlen > 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
--padlen;
|
||||
}
|
||||
if (signvalue)
|
||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||
|
||||
while (iplace > 0)
|
||||
dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
|
||||
|
||||
/*
|
||||
* Decimal point. This should probably use locale to find the correct
|
||||
* char to print out.
|
||||
*/
|
||||
dopr_outch (buffer, currlen, maxlen, '.');
|
||||
|
||||
while (zpadlen > 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, '0');
|
||||
--zpadlen;
|
||||
}
|
||||
|
||||
while (fplace > 0)
|
||||
dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
|
||||
|
||||
while (padlen < 0)
|
||||
{
|
||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||
++padlen;
|
||||
}
|
||||
}
|
||||
|
||||
static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
|
||||
{
|
||||
if (*currlen < maxlen)
|
||||
buffer[(*currlen)++] = c;
|
||||
}
|
||||
|
||||
#ifdef TEST_SNPRINTF
|
||||
#ifndef LONG_STRING
|
||||
#define LONG_STRING 1024
|
||||
#endif
|
||||
int main (void)
|
||||
{
|
||||
char buf1[LONG_STRING];
|
||||
char buf2[LONG_STRING];
|
||||
char *fp_fmt[] = {
|
||||
"%-1.5f",
|
||||
"%1.5f",
|
||||
"%123.9f",
|
||||
"%10.5f",
|
||||
"% 10.5f",
|
||||
"%+22.9f",
|
||||
"%+4.9f",
|
||||
"%01.3f",
|
||||
"%4f",
|
||||
"%3.1f",
|
||||
"%3.2f",
|
||||
NULL
|
||||
};
|
||||
double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
|
||||
0.9996, 1.996, 4.136, 0};
|
||||
char *int_fmt[] = {
|
||||
"%-1.5d",
|
||||
"%1.5d",
|
||||
"%123.9d",
|
||||
"%5.5d",
|
||||
"%10.5d",
|
||||
"% 10.5d",
|
||||
"%+22.33d",
|
||||
"%01.3d",
|
||||
"%4d",
|
||||
NULL
|
||||
};
|
||||
long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
|
||||
int x, y;
|
||||
int fail = 0;
|
||||
int num = 0;
|
||||
|
||||
printf ("Testing snprintf format codes against system sprintf...\n");
|
||||
|
||||
for (x = 0; fp_fmt[x] != NULL ; x++)
|
||||
for (y = 0; fp_nums[y] != 0 ; y++)
|
||||
{
|
||||
snprintf (buf1, sizeof (buf1), fp_fmt[x], fp_nums[y]);
|
||||
sprintf (buf2, fp_fmt[x], fp_nums[y]);
|
||||
if (strcmp (buf1, buf2))
|
||||
{
|
||||
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
||||
fp_fmt[x], buf1, buf2);
|
||||
fail++;
|
||||
}
|
||||
num++;
|
||||
}
|
||||
|
||||
for (x = 0; int_fmt[x] != NULL ; x++)
|
||||
for (y = 0; int_nums[y] != 0 ; y++)
|
||||
{
|
||||
snprintf (buf1, sizeof (buf1), int_fmt[x], int_nums[y]);
|
||||
sprintf (buf2, int_fmt[x], int_nums[y]);
|
||||
if (strcmp (buf1, buf2))
|
||||
{
|
||||
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
||||
int_fmt[x], buf1, buf2);
|
||||
fail++;
|
||||
}
|
||||
num++;
|
||||
}
|
||||
printf ("%d tests failed out of %d.\n", fail, num);
|
||||
}
|
||||
#endif /* SNPRINTF_TEST */
|
||||
|
||||
#endif /* !HAVE_SNPRINTF */
|
|
@ -0,0 +1,57 @@
|
|||
/* from openssh 4.3p2 compat/strlcpy.c */
|
||||
/*
|
||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */
|
||||
|
||||
#include <ldns/config.h>
|
||||
#ifndef HAVE_STRLCPY
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Copy src to string dst of size siz. At most siz-1 characters
|
||||
* will be copied. Always NUL terminates (unless siz == 0).
|
||||
* Returns strlen(src); if retval >= siz, truncation occurred.
|
||||
*/
|
||||
size_t
|
||||
strlcpy(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
size_t n = siz;
|
||||
|
||||
/* Copy as many bytes as will fit */
|
||||
if (n != 0 && --n != 0) {
|
||||
do {
|
||||
if ((*d++ = *s++) == 0)
|
||||
break;
|
||||
} while (--n != 0);
|
||||
}
|
||||
|
||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||
if (n == 0) {
|
||||
if (siz != 0)
|
||||
*d = '\0'; /* NUL-terminate dst */
|
||||
while (*s++)
|
||||
;
|
||||
}
|
||||
|
||||
return(s - src - 1); /* count does not include NUL */
|
||||
}
|
||||
|
||||
#endif /* !HAVE_STRLCPY */
|
|
@ -0,0 +1,31 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include <ldns/config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
time_t
|
||||
timegm (struct tm *tm) {
|
||||
time_t ret;
|
||||
char *tz;
|
||||
|
||||
tz = getenv("TZ");
|
||||
putenv((char*)"TZ=");
|
||||
tzset();
|
||||
ret = mktime(tm);
|
||||
if (tz) {
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof(buf), "TZ=%s", tz);
|
||||
putenv(tz);
|
||||
}
|
||||
else
|
||||
putenv((char*)"TZ");
|
||||
tzset();
|
||||
return ret;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,488 @@
|
|||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.56)
|
||||
sinclude(acx_nlnetlabs.m4)
|
||||
|
||||
# must be numbers. ac_defun because of later processing.
|
||||
m4_define([VERSION_MAJOR],[1])
|
||||
m4_define([VERSION_MINOR],[6])
|
||||
m4_define([VERSION_MICRO],[9])
|
||||
AC_INIT(ldns, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), libdns@nlnetlabs.nl, libdns)
|
||||
AC_CONFIG_SRCDIR([packet.c])
|
||||
# needed to build correct soname
|
||||
AC_SUBST(LIBTOOL_VERSION_INFO, VERSION_MAJOR:VERSION_MINOR:VERSION_MICRO)
|
||||
AC_SUBST(LDNS_VERSION_MAJOR, [VERSION_MAJOR])
|
||||
AC_SUBST(LDNS_VERSION_MINOR, [VERSION_MINOR])
|
||||
AC_SUBST(LDNS_VERSION_MICRO, [VERSION_MICRO])
|
||||
|
||||
OURCPPFLAGS=''
|
||||
CPPFLAGS=${CPPFLAGS:-${OURCPPFLAGS}}
|
||||
CFLAGS="$CFLAGS"
|
||||
|
||||
AC_AIX
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
AC_DEFINE(WINVER, 0x0502, [the version of the windows API enabled])
|
||||
|
||||
ACX_CHECK_COMPILER_FLAG(std=c99, [C99FLAG="-std=c99"])
|
||||
ACX_CHECK_COMPILER_FLAG(xc99, [C99FLAG="-xc99"])
|
||||
|
||||
# routine to copy files
|
||||
# argument 1 is a list of files (relative to the source dir)
|
||||
# argument 2 is a destination directory (relative to the current
|
||||
# working directory
|
||||
AC_DEFUN([COPY_FILES],
|
||||
[
|
||||
for file in $1; do
|
||||
sh $srcdir/install-sh -m 644 $file $2
|
||||
done
|
||||
])
|
||||
|
||||
# copy all .h files in the dir at argument 1
|
||||
# (relative to source) to the dir at argument 2
|
||||
# (relative to current dir)
|
||||
AC_DEFUN([COPY_HEADER_FILES],
|
||||
[
|
||||
echo "copying header files"
|
||||
COPY_FILES($srcdir/$1/*.h, $2)
|
||||
])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_LANG_C
|
||||
ACX_CHECK_COMPILER_FLAG(g, [CFLAGS="-g $CFLAGS"])
|
||||
ACX_CHECK_COMPILER_FLAG(O2, [CFLAGS="-O2 $CFLAGS"])
|
||||
ACX_CHECK_COMPILER_FLAG(Wall, [CFLAGS="-Wall $CFLAGS"])
|
||||
ACX_CHECK_COMPILER_FLAG(W, [CFLAGS="-W $CFLAGS"])
|
||||
ACX_CHECK_COMPILER_FLAG(Wwrite-strings, [CFLAGS="-Wwrite-strings $CFLAGS"])
|
||||
|
||||
AC_CHECK_HEADERS([getopt.h time.h],,, [AC_INCLUDES_DEFAULT])
|
||||
|
||||
# MinGW32 tests
|
||||
AC_CHECK_HEADERS([winsock2.h ws2tcpip.h],,, [AC_INCLUDES_DEFAULT])
|
||||
# end mingw32 tests
|
||||
|
||||
ACX_DETERMINE_EXT_FLAGS_UNBOUND
|
||||
|
||||
AC_C_INLINE
|
||||
AC_CHECK_TYPE(int8_t, char)
|
||||
AC_CHECK_TYPE(int16_t, short)
|
||||
AC_CHECK_TYPE(int32_t, int)
|
||||
AC_CHECK_TYPE(int64_t, long long)
|
||||
AC_CHECK_TYPE(uint8_t, unsigned char)
|
||||
AC_CHECK_TYPE(uint16_t, unsigned short)
|
||||
AC_CHECK_TYPE(uint32_t, unsigned int)
|
||||
AC_CHECK_TYPE(uint64_t, unsigned long long)
|
||||
|
||||
# my own checks
|
||||
AC_CHECK_PROG(doxygen, doxygen, doxygen)
|
||||
|
||||
# check to see if libraries are needed for these functions.
|
||||
AC_SEARCH_LIBS([socket], [socket])
|
||||
AC_SEARCH_LIBS([inet_pton], [nsl])
|
||||
|
||||
# check for python
|
||||
AC_ARG_WITH(pyldns, AC_HELP_STRING([--with-pyldns],
|
||||
[generate python library, or --without-pyldns to disable Python support.]),
|
||||
[],[ withval="no" ])
|
||||
ldns_have_python=no
|
||||
if test x_$withval != x_no; then
|
||||
sinclude(acx_python.m4)
|
||||
ac_save_LIBS="$LIBS" dnl otherwise AC_PYTHON_DEVEL thrashes $LIBS
|
||||
AC_PYTHON_DEVEL
|
||||
if test ! -z "$PYTHON_VERSION"; then
|
||||
if test `$PYTHON -c "print '$PYTHON_VERSION' >= '2.4.0'"` = "False"; then
|
||||
AC_ERROR([Python version >= 2.4.0 is required])
|
||||
fi
|
||||
# Have Python
|
||||
AC_DEFINE(HAVE_PYTHON,1,[Define if you have Python libraries and header files.])
|
||||
ldns_have_python=yes
|
||||
fi
|
||||
|
||||
# check for swig
|
||||
if test x_$ldns_have_python != x_no; then
|
||||
sinclude(ac_pkg_swig.m4)
|
||||
AC_PROG_SWIG
|
||||
if test ! -x "$SWIG"; then
|
||||
AC_ERROR([failed to find swig tool, install it, or do not build pyldns])
|
||||
else
|
||||
AC_DEFINE(HAVE_SWIG,1,[Define if you have Swig libraries and header files.])
|
||||
AC_SUBST(PYLDNS, "pyldns")
|
||||
AC_SUBST(swig, "$SWIG")
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT([*** don't have Python, skipping Swig, no pyldns ***])
|
||||
fi
|
||||
fi
|
||||
|
||||
# Use libtool
|
||||
ACX_LIBTOOL_C_ONLY
|
||||
|
||||
tmp_CPPFLAGS=$CPPFLAGS
|
||||
tmp_LDFLAGS=$LDFLAGS
|
||||
tmp_LIBS=$LIBS
|
||||
|
||||
ACX_WITH_SSL_OPTIONAL
|
||||
|
||||
AC_CHECK_FUNCS([EVP_sha256])
|
||||
|
||||
# for macosx, see if glibtool exists and use that
|
||||
# BSD's need to know the version...
|
||||
#AC_CHECK_PROG(glibtool, glibtool, [glibtool], )
|
||||
#AC_CHECK_PROGS(libtool, [libtool15 libtool], [./libtool])
|
||||
|
||||
AC_ARG_ENABLE(sha2, AC_HELP_STRING([--disable-sha2], [Disable SHA256 and SHA512 RRSIG support]))
|
||||
case "$enable_sha2" in
|
||||
no)
|
||||
;;
|
||||
yes|*)
|
||||
if test "x$HAVE_SSL" != "xyes"; then
|
||||
AC_MSG_ERROR([SHA2 enabled, but no SSL support])
|
||||
fi
|
||||
AC_MSG_CHECKING(for SHA256 and SHA512)
|
||||
AC_CHECK_FUNC(SHA256_Init, [], [
|
||||
AC_MSG_ERROR([No SHA2 functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-sha2])
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([USE_SHA2], [1], [Define this to enable SHA256 and SHA512 support.])
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(gost, AC_HELP_STRING([--disable-gost], [Disable GOST support]))
|
||||
case "$enable_gost" in
|
||||
no)
|
||||
;;
|
||||
*) dnl default
|
||||
if test "x$HAVE_SSL" != "xyes"; then
|
||||
AC_MSG_ERROR([GOST enabled, but no SSL support])
|
||||
fi
|
||||
AC_MSG_CHECKING(for GOST)
|
||||
AC_CHECK_FUNC(EVP_PKEY_set_type_str, [],[AC_MSG_ERROR([OpenSSL >= 1.0.0 is needed for GOST support or rerun with --disable-gost])])
|
||||
AC_CHECK_FUNC(EC_KEY_new, [], [AC_MSG_ERROR([No ECC functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-gost])])
|
||||
AC_DEFINE_UNQUOTED([USE_GOST], [1], [Define this to enable GOST support.])
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(ecdsa, AC_HELP_STRING([--enable-ecdsa], [Enable ECDSA support, experimental]))
|
||||
case "$enable_ecdsa" in
|
||||
yes)
|
||||
if test "x$HAVE_SSL" != "xyes"; then
|
||||
AC_MSG_ERROR([ECDSA enabled, but no SSL support])
|
||||
fi
|
||||
AC_CHECK_FUNC(ECDSA_sign, [], [AC_MSG_ERROR([OpenSSL does not support ECDSA])])
|
||||
AC_CHECK_FUNC(SHA384_Init, [], [AC_MSG_ERROR([OpenSSL does not support SHA384])])
|
||||
AC_CHECK_DECLS([NID_X9_62_prime256v1, NID_secp384r1], [], [AC_MSG_ERROR([OpenSSL does not support the ECDSA curve])], [AC_INCLUDES_DEFAULT
|
||||
#include <openssl/evp.h>
|
||||
])
|
||||
# we now know we have ECDSA and the required curves.
|
||||
AC_DEFINE_UNQUOTED([USE_ECDSA], [1], [Define this to enable ECDSA support.])
|
||||
AC_WARN([
|
||||
*****************************************************************
|
||||
*** YOU HAVE ENABLED ECDSA WHICH IS EXPERIMENTAL AT THIS TIME ***
|
||||
*** PLEASE DO NOT USE THIS ON THE PUBLIC INTERNET ***
|
||||
*****************************************************************])
|
||||
;;
|
||||
no)
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(LIBSSL_CPPFLAGS)
|
||||
AC_SUBST(LIBSSL_LDFLAGS)
|
||||
AC_SUBST(LIBSSL_LIBS)
|
||||
CPPFLAGS=$tmp_CPPFLAGS
|
||||
LDFLAGS=$tmp_LDFLAGS
|
||||
LIBS=$tmp_LIBS
|
||||
|
||||
# add option to disable installation of ldns-config script
|
||||
AC_ARG_ENABLE(ldns-config, [ --disable-ldns-config disable installation of ldns-config (default=enabled)],
|
||||
enable_ldns_config=$enableval, enable_ldns_config=yes)
|
||||
if test "x$enable_ldns_config" = xyes; then
|
||||
INSTALL_LDNS_CONFIG="yes"
|
||||
else
|
||||
INSTALL_LDNS_CONFIG="no"
|
||||
fi
|
||||
AC_SUBST(INSTALL_LDNS_CONFIG)
|
||||
|
||||
# add option to disable the evil rpath
|
||||
ACX_ARG_RPATH
|
||||
|
||||
#AC_TRY_RUN(
|
||||
#[
|
||||
#int main()
|
||||
#{
|
||||
#short one = 1;
|
||||
#char *cp = (char*)&one;
|
||||
#if ( *cp == 0 )
|
||||
#return(0);
|
||||
#else
|
||||
#return(1);
|
||||
#}
|
||||
#], [],[
|
||||
#AC_DEFINE(CONFCHECK_LITTLE_ENDIAN, 1, [system appears to be little-endian])
|
||||
#],[])
|
||||
|
||||
# should define WORDS_BIGENDIAN if the system is big-endian
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
#AC_HEADER_SYS_WAIT
|
||||
#AC_CHECK_HEADERS([getopt.h fcntl.h stdlib.h string.h strings.h unistd.h])
|
||||
# do the very minimum - we can always extend this
|
||||
AC_CHECK_HEADERS([getopt.h stdarg.h stdbool.h openssl/ssl.h netinet/in.h time.h arpa/inet.h netdb.h],,, [AC_INCLUDES_DEFAULT])
|
||||
AC_CHECK_HEADERS(sys/param.h sys/mount.h,,,
|
||||
[AC_INCLUDES_DEFAULT
|
||||
[
|
||||
#if HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
]
|
||||
])
|
||||
AC_CHECK_HEADER(sys/socket.h,
|
||||
[
|
||||
include_sys_socket_h='#include <sys/socket.h>'
|
||||
AC_DEFINE(HAVE_SYS_SOCKET_H, 1, [define if you have sys/socket.h])
|
||||
],[
|
||||
include_sys_socket_h=''
|
||||
],[AC_INCLUDES_DEFAULT
|
||||
[
|
||||
#if HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
]
|
||||
])
|
||||
AC_SUBST(include_sys_socket_h)
|
||||
AC_CHECK_HEADER(inttypes.h,
|
||||
[
|
||||
include_inttypes_h='#include <inttypes.h>'
|
||||
AC_DEFINE(HAVE_INTTYPES_H, 1, [define if you have inttypes.h])
|
||||
],[
|
||||
include_inttypes_h=''
|
||||
],[AC_INCLUDES_DEFAULT
|
||||
])
|
||||
AC_SUBST(include_inttypes_h)
|
||||
AC_CHECK_HEADER(sys/types.h,
|
||||
[
|
||||
include_systypes_h='#include <sys/types.h>'
|
||||
AC_DEFINE(HAVE_SYS_TYPES_H, 1, [define if you have sys/types.h])
|
||||
],[
|
||||
include_systypes_h=''
|
||||
],[AC_INCLUDES_DEFAULT
|
||||
])
|
||||
AC_SUBST(include_systypes_h)
|
||||
AC_CHECK_HEADER(unistd.h,
|
||||
[
|
||||
include_unistd_h='#include <unistd.h>'
|
||||
AC_DEFINE(HAVE_UNISTD_H, 1, [define if you have unistd.h])
|
||||
],[
|
||||
include_unistd_h=''
|
||||
],[AC_INCLUDES_DEFAULT
|
||||
])
|
||||
AC_SUBST(include_unistd_h)
|
||||
|
||||
ACX_TYPE_SOCKLEN_T
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
AC_CHECK_TYPE(in_addr_t, [], [AC_DEFINE([in_addr_t], [uint32_t], [in_addr_t])], [
|
||||
#if HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#if HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
#endif])
|
||||
AC_CHECK_TYPE(in_port_t, [], [AC_DEFINE([in_port_t], [uint16_t], [in_port_t])], [
|
||||
#if HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#if HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
#endif])
|
||||
ACX_CHECK_SS_FAMILY
|
||||
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
|
||||
AC_REPLACE_FUNCS(b64_pton)
|
||||
AC_REPLACE_FUNCS(b64_ntop)
|
||||
AC_REPLACE_FUNCS(b32_pton)
|
||||
AC_REPLACE_FUNCS(b32_ntop)
|
||||
AC_REPLACE_FUNCS(timegm)
|
||||
AC_REPLACE_FUNCS(gmtime_r)
|
||||
AC_REPLACE_FUNCS(ctime_r)
|
||||
AC_REPLACE_FUNCS(isblank)
|
||||
AC_REPLACE_FUNCS(isascii)
|
||||
AC_REPLACE_FUNCS(inet_aton)
|
||||
AC_REPLACE_FUNCS(inet_pton)
|
||||
AC_REPLACE_FUNCS(inet_ntop)
|
||||
AC_REPLACE_FUNCS(snprintf)
|
||||
AC_REPLACE_FUNCS(strlcpy)
|
||||
AC_REPLACE_FUNCS(memmove)
|
||||
AC_CHECK_FUNCS([endprotoent endservent sleep random fcntl strtoul])
|
||||
|
||||
ACX_CHECK_GETADDRINFO_WITH_INCLUDES
|
||||
if test $ac_cv_func_getaddrinfo = no; then
|
||||
AC_LIBOBJ([fake-rfc2553])
|
||||
fi
|
||||
if test "$USE_WINSOCK" = 1; then
|
||||
AC_CHECK_TOOL(WINDRES, windres)
|
||||
fi
|
||||
ACX_FUNC_IOCTLSOCKET
|
||||
|
||||
#AC_SEARCH_LIBS(RSA_new, [crypto])
|
||||
|
||||
ACX_CHECK_FORMAT_ATTRIBUTE
|
||||
ACX_CHECK_UNUSED_ATTRIBUTE
|
||||
|
||||
# check OSX deployment target which is needed
|
||||
if echo $build_os | grep darwin > /dev/null; then
|
||||
export MACOSX_DEPLOYMENT_TARGET="10.4"
|
||||
fi
|
||||
|
||||
AC_DEFINE([SYSCONFDIR], [sysconfdir], [System configuration dir])
|
||||
|
||||
AH_BOTTOM([
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
|
||||
#ifndef BYTE_ORDER
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#else
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
#if STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
]
|
||||
AHX_CONFIG_W32_FD_SET_T
|
||||
)
|
||||
|
||||
AH_BOTTOM([
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef B64_PTON
|
||||
int ldns_b64_ntop(uint8_t const *src, size_t srclength,
|
||||
char *target, size_t targsize);
|
||||
/**
|
||||
* calculates the size needed to store the result of b64_ntop
|
||||
*/
|
||||
/*@unused@*/
|
||||
static inline size_t ldns_b64_ntop_calculate_size(size_t srcsize)
|
||||
{
|
||||
return ((((srcsize + 2) / 3) * 4) + 1);
|
||||
}
|
||||
#endif /* !B64_PTON */
|
||||
#ifndef B64_NTOP
|
||||
int ldns_b64_pton(char const *src, uint8_t *target, size_t targsize);
|
||||
/**
|
||||
* calculates the size needed to store the result of ldns_b64_pton
|
||||
*/
|
||||
/*@unused@*/
|
||||
static inline size_t ldns_b64_pton_calculate_size(size_t srcsize)
|
||||
{
|
||||
return (((((srcsize + 3) / 4) * 3)) + 1);
|
||||
}
|
||||
#endif /* !B64_NTOP */
|
||||
|
||||
#ifndef HAVE_SLEEP
|
||||
/* use windows sleep, in millisecs, instead */
|
||||
#define sleep(x) Sleep((x)*1000)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RANDOM
|
||||
#define srandom(x) srand(x)
|
||||
#define random(x) rand(x)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_TIMEGM
|
||||
#include <time.h>
|
||||
time_t timegm (struct tm *tm);
|
||||
#endif /* !TIMEGM */
|
||||
#ifndef HAVE_GMTIME_R
|
||||
struct tm *gmtime_r(const time_t *timep, struct tm *result);
|
||||
#endif
|
||||
#ifndef HAVE_ISBLANK
|
||||
int isblank(int c);
|
||||
#endif /* !HAVE_ISBLANK */
|
||||
#ifndef HAVE_ISASCII
|
||||
int isascii(int c);
|
||||
#endif /* !HAVE_ISASCII */
|
||||
#ifndef HAVE_SNPRINTF
|
||||
#include <stdarg.h>
|
||||
int snprintf (char *str, size_t count, const char *fmt, ...);
|
||||
int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
|
||||
#endif /* HAVE_SNPRINTF */
|
||||
#ifndef HAVE_INET_PTON
|
||||
int inet_pton(int af, const char* src, void* dst);
|
||||
#endif /* HAVE_INET_PTON */
|
||||
#ifndef HAVE_INET_NTOP
|
||||
const char *inet_ntop(int af, const void *src, char *dst, size_t size);
|
||||
#endif
|
||||
#ifndef HAVE_INET_ATON
|
||||
int inet_aton(const char *cp, struct in_addr *addr);
|
||||
#endif
|
||||
#ifndef HAVE_MEMMOVE
|
||||
void *memmove(void *dest, const void *src, size_t n);
|
||||
#endif
|
||||
#ifndef HAVE_STRLCPY
|
||||
size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
#include "compat/fake-rfc2553.h"
|
||||
#endif
|
||||
#ifndef HAVE_STRTOUL
|
||||
#define strtoul (unsigned long)strtol
|
||||
#endif
|
||||
])
|
||||
|
||||
AC_CONFIG_FILES([Makefile ldns/net.h ldns/util.h packaging/libldns.pc packaging/ldns-config])
|
||||
|
||||
AC_CONFIG_HEADER([ldns/config.h])
|
||||
AC_OUTPUT
|
||||
COPY_HEADER_FILES(ldns/, ldns/)
|
||||
|
||||
AC_CONFIG_SUBDIRS([drill])
|
|
@ -0,0 +1,10 @@
|
|||
NETLDNS is a functionality port of NLnet Labs' LDNS to the .NET
|
||||
2.0 framework, contributed by Alex Nicoll of the Carnegie Mellon
|
||||
University Software Engineering Institute. NETLDNS is released
|
||||
under the BSD license. NETLDNS uses Mihnea Radulescu's BigInteger
|
||||
Library (http://www.codeproject.com/KB/cs/BigInteger_Library.aspx)
|
||||
from CodeProject to help with key manipulation. Please contact Alex at
|
||||
anicoll@cert.org with inquiries or requests for newer versions.
|
||||
|
||||
This project is not supported by NLnet Labs.
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# $Id: build-solaris.sh 2597 2008-04-15 08:39:58Z jelte $
|
||||
|
||||
|
||||
PREFIX=/opt/ldns
|
||||
OPENSSL=/usr/sfw
|
||||
SUDO=sudo
|
||||
|
||||
MAKE_PROGRAM=gmake
|
||||
MAKE_ARGS="-j 4"
|
||||
|
||||
OBJ32=obj32
|
||||
OBJ64=obj64
|
||||
|
||||
SRCDIR=`pwd`
|
||||
|
||||
|
||||
test -d $OBJ32 && $SUDO rm -fr $OBJ32
|
||||
mkdir $OBJ32
|
||||
|
||||
export CFLAGS=""
|
||||
export LDFLAGS="-L${OPENSSL}/lib -R${OPENSSL}/lib"
|
||||
|
||||
(cd $OBJ32; \
|
||||
${SRCDIR}/configure --with-ssl=${OPENSSL} --prefix=${PREFIX} --libdir=${PREFIX}/lib; \
|
||||
$MAKE_PROGRAM $MAKE_ARGS)
|
||||
|
||||
if [ `isainfo -k` = amd64 ]; then
|
||||
test -d $OBJ64 && $SUDO rm -fr $OBJ64
|
||||
mkdir $OBJ64
|
||||
|
||||
export CFLAGS="-m64"
|
||||
export LDFLAGS="-L${OPENSSL}/lib/amd64 -R${OPENSSL}/lib/amd64"
|
||||
|
||||
(cd $OBJ64; \
|
||||
${SRCDIR}/configure --with-ssl=${OPENSSL} --prefix=${PREFIX} --libdir=${PREFIX}/lib/amd64; \
|
||||
$MAKE_PROGRAM $MAKE_ARGS)
|
||||
fi
|
||||
|
||||
# optionally install
|
||||
#
|
||||
if [ x$1 = xinstall ]; then
|
||||
(cd $OBJ32; $SUDO $MAKE_PROGRAM install-h)
|
||||
(cd $OBJ32; $SUDO $MAKE_PROGRAM install-doc)
|
||||
(cd $OBJ32; $SUDO $MAKE_PROGRAM install-lib)
|
||||
if [ `isainfo -k` = amd64 ]; then
|
||||
(cd $OBJ64; $SUDO $MAKE_PROGRAM install-lib)
|
||||
fi
|
||||
fi
|
|
@ -0,0 +1,27 @@
|
|||
Copyright (c) 2009, Zdenek Vasicek (vasicek AT fit.vutbr.cz)
|
||||
Karel Slany (slany AT fit.vutbr.cz)
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the organization nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,67 @@
|
|||
# Makefile: compilation of sources and documentation, test environment
|
||||
#
|
||||
# Copyright (c) 2009, Zdenek Vasicek (vasicek AT fit.vutbr.cz)
|
||||
# Karel Slany (slany AT fit.vutbr.cz)
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the organization nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from this
|
||||
# software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " testenv to make test environment and run bash "
|
||||
@echo " usefull in case you don't want to install ldns but want to test examples"
|
||||
@echo " doc to make documentation"
|
||||
@echo " clean clean all"
|
||||
|
||||
../../Makefile: ../../configure
|
||||
cd ../.. && ./configure --with-python
|
||||
|
||||
_ldns.so: ../../Makefile
|
||||
$(MAKE) -C ../..
|
||||
|
||||
../../.libs/ldns.so.1: ../../Makefile
|
||||
$(MAKE) -C ../..
|
||||
|
||||
clean:
|
||||
rm -rdf examples/ldns
|
||||
rm -f _ldns.so ldns_wrapper.o
|
||||
$(MAKE) -C ../.. clean
|
||||
|
||||
testenv: ../../.libs/libldns.so.1 _ldns.so
|
||||
rm -rdf examples/ldns
|
||||
cd examples && mkdir ldns && ln -s ../../ldns.py ldns/__init__.py && ln -s ../../_ldns.so ldns/_ldns.so && ln -s ../../../../.libs/libldns.so.1 ldns/libldns.so.1 && ls -la
|
||||
@echo "Run a script by typing ./script_name.py"
|
||||
cd examples && LD_LIBRARY_PATH=ldns bash
|
||||
rm -rdf examples/ldns
|
||||
|
||||
doc: ../../.libs/ldns.so.1 _ldns.so
|
||||
$(MAKE) -C docs html
|
||||
|
||||
#for development only
|
||||
swig: ldns.i
|
||||
swig -python -o ldns_wrapper.c -I../.. ldns.i
|
||||
gcc -c ldns_wrapper.c -O9 -fPIC -I../.. -I../../ldns -I/usr/include/python2.5 -I. -o ldns_wrapper.o
|
||||
ld -shared ldns_wrapper.o -L../../.libs -lldns -o _ldns.so
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||
|
||||
.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " pickle to make pickle files (usable by e.g. sphinx-web)"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " changes to make an overview over all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
|
||||
clean:
|
||||
-rm -rf build/*
|
||||
|
||||
html:
|
||||
mkdir -p build/html build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in build/html."
|
||||
|
||||
pickle:
|
||||
mkdir -p build/pickle build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files or run"
|
||||
@echo " sphinx-web build/pickle"
|
||||
@echo "to start the sphinx-web server."
|
||||
|
||||
web: pickle
|
||||
|
||||
htmlhelp:
|
||||
mkdir -p build/htmlhelp build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in build/htmlhelp."
|
||||
|
||||
latex:
|
||||
mkdir -p build/latex build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in build/latex."
|
||||
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
|
||||
"run these through (pdf)latex."
|
||||
|
||||
changes:
|
||||
mkdir -p build/changes build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes
|
||||
@echo
|
||||
@echo "The overview file is in build/changes."
|
||||
|
||||
linkcheck:
|
||||
mkdir -p build/linkcheck build/doctrees
|
||||
LD_LIBRARY_PATH=../../../.libs $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) build/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in build/linkcheck/output.txt."
|
|
@ -0,0 +1,180 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Unbound documentation build configuration file, created by
|
||||
# sphinx-quickstart on Fri Jan 2 19:14:13 2009.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its containing dir.
|
||||
#
|
||||
# The contents of this file are pickled, so don't put values in the namespace
|
||||
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||
#
|
||||
# All configuration values have a default value; values that are commented out
|
||||
# serve to show the default value.
|
||||
|
||||
import sys, os
|
||||
|
||||
# If your extensions are in another directory, add it here. If the directory
|
||||
# is relative to the documentation root, use os.path.abspath to make it
|
||||
# absolute, like shown here.
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),'../../')))
|
||||
#print sys.path
|
||||
|
||||
# General configuration
|
||||
# ---------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General substitutions.
|
||||
project = 'pyLDNS'
|
||||
copyright = '2009, Karel Slany, Zdenek Vasicek'
|
||||
|
||||
# The default replacements for |version| and |release|, also used in various
|
||||
# other places throughout the built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '1.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '1.0.0'
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of documents that shouldn't be included in the build.
|
||||
#unused_docs = []
|
||||
|
||||
# List of directories, relative to source directories, that shouldn't be searched
|
||||
# for source files.
|
||||
#exclude_dirs = []
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
|
||||
# Options for HTML output
|
||||
# -----------------------
|
||||
|
||||
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||
# given in html_static_path.
|
||||
html_style = 'default.css'
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (within the static path) to place at the top of
|
||||
# the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
html_use_modindex = False
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
html_split_index = False
|
||||
|
||||
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||
html_copy_source = False
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = ''
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'ldnsdoc'
|
||||
|
||||
|
||||
# Options for LaTeX output
|
||||
# ------------------------
|
||||
|
||||
# The paper size ('letter' or 'a4').
|
||||
#latex_paper_size = 'letter'
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#latex_font_size = '10pt'
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, document class [howto/manual]).
|
||||
latex_documents = [
|
||||
('index', 'ldns-doc.tex', 'LDNS Documentation',
|
||||
'Karel Slany, Zdenek Vasicek', 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#latex_preamble = ''
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_use_modindex = True
|
|
@ -0,0 +1,68 @@
|
|||
Resolving the MX records
|
||||
==============================
|
||||
|
||||
This basic example shows how to create a resolver which asks for MX records which contain the information about mail servers.
|
||||
|
||||
::
|
||||
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# MX is a small program that prints out the mx records for a particular domain
|
||||
#
|
||||
import ldns
|
||||
|
||||
resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
|
||||
|
||||
dname = ldns.ldns_dname("nic.cz")
|
||||
|
||||
pkt = resolver.query(dname, ldns.LDNS_RR_TYPE_MX, ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD)
|
||||
if (pkt):
|
||||
mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
|
||||
if (mx):
|
||||
mx.sort()
|
||||
print mx
|
||||
|
||||
Resolving step by step
|
||||
------------------------
|
||||
|
||||
First of all we import :mod:`ldns` extension module which make LDNS functions and classes accessible::
|
||||
|
||||
import ldns
|
||||
|
||||
If importing fails, it means that Python cannot find the module or ldns library.
|
||||
|
||||
Then we create the resolver by :meth:`ldns.ldns_resolver.new_frm_file` constructor ::
|
||||
|
||||
resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
|
||||
|
||||
and domain name variable dname::
|
||||
|
||||
dname = ldns.ldns_dname("nic.cz")
|
||||
|
||||
To create a resolver you may also use::
|
||||
|
||||
resolver = ldns.ldns_resolver.new_frm_file(None)
|
||||
|
||||
which behaves in the same manner as the command above.
|
||||
|
||||
In the third step we tell the resolver to query for our domain, type MX, of class IN::
|
||||
|
||||
pkt = resolver.query(dname, ldns.LDNS_RR_TYPE_MX, ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD)
|
||||
|
||||
The function should return a packet if everything goes well and this packet will contain resource records we asked for.
|
||||
Note that there exists a simplier way. Instead of using a dname variable, we can use a string which will be automatically converted.
|
||||
::
|
||||
|
||||
pkt = resolver.query("fit.vutbr.cz", ldns.LDNS_RR_TYPE_MX, ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD)
|
||||
|
||||
Now, we test whether the resolver returns a packet and then get all RRs of type MX from the answer packet and store them in list mx::
|
||||
|
||||
if (pkt):
|
||||
mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
|
||||
|
||||
If this list is not empty, we sort and print the content to stdout::
|
||||
|
||||
if (mx):
|
||||
mx.sort()
|
||||
print mx
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
import ldns
|
||||
import sys
|
||||
|
||||
debug = True
|
||||
|
||||
# Check args
|
||||
argc = len(sys.argv)
|
||||
name = "www.nic.cz"
|
||||
if argc < 2:
|
||||
print "Usage:", sys.argv[0], "domain [resolver_addr]"
|
||||
sys.exit(1)
|
||||
else:
|
||||
name = sys.argv[1]
|
||||
|
||||
# Create resolver
|
||||
resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
|
||||
resolver.set_dnssec(True)
|
||||
|
||||
# Custom resolver
|
||||
if argc > 2:
|
||||
# Clear previous nameservers
|
||||
ns = resolver.pop_nameserver()
|
||||
while ns != None:
|
||||
ns = resolver.pop_nameserver()
|
||||
ip = ldns.ldns_rdf.new_frm_str(sys.argv[2], ldns.LDNS_RDF_TYPE_A)
|
||||
resolver.push_nameserver(ip)
|
||||
|
||||
# Resolve DNS name
|
||||
pkt = resolver.query(name, ldns.LDNS_RR_TYPE_A, ldns.LDNS_RR_CLASS_IN)
|
||||
if pkt and pkt.answer():
|
||||
|
||||
# Debug
|
||||
if debug:
|
||||
print "NS returned:", pkt.get_rcode(), "(AA: %d AD: %d)" % ( pkt.ad(), pkt.ad() )
|
||||
|
||||
# SERVFAIL indicated bogus name
|
||||
if pkt.get_rcode() is ldns.LDNS_RCODE_SERVFAIL:
|
||||
print name, "is bogus"
|
||||
|
||||
# Check AD (Authenticated) bit
|
||||
if pkt.get_rcode() is ldns.LDNS_RCODE_NOERROR:
|
||||
if pkt.ad(): print name, "is secure"
|
||||
else: print name, "is insecure"
|
|
@ -0,0 +1,100 @@
|
|||
.. _ex_dnssec:
|
||||
|
||||
Querying DNS-SEC validators
|
||||
===========================
|
||||
|
||||
This basic example shows how to query validating resolver and
|
||||
evaluate answer.
|
||||
|
||||
Resolving step by step
|
||||
------------------------
|
||||
|
||||
For DNS queries, we need to initialize ldns resolver (covered in previous example).
|
||||
|
||||
::
|
||||
|
||||
# Create resolver
|
||||
resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
|
||||
resolver.set_dnssec(True)
|
||||
|
||||
# Custom resolver
|
||||
if argc > 2:
|
||||
# Clear previous nameservers
|
||||
ns = resolver.pop_nameserver()
|
||||
while ns != None:
|
||||
ns = resolver.pop_nameserver()
|
||||
ip = ldns.ldns_rdf.new_frm_str(sys.argv[2], ldns.LDNS_RDF_TYPE_A)
|
||||
resolver.push_nameserver(ip)
|
||||
|
||||
Note the second line :meth:`resolver.set_dnssec`, which enables DNSSEC OK bit
|
||||
in queries in order to get meaningful results.
|
||||
|
||||
As we have resolver initialized, we can start querying for domain names :
|
||||
|
||||
::
|
||||
|
||||
# Resolve DNS name
|
||||
pkt = resolver.query(name, ldns.LDNS_RR_TYPE_A, ldns.LDNS_RR_CLASS_IN)
|
||||
if pkt and pkt.answer():
|
||||
|
||||
Now we evaluate result, where two flags are crucial :
|
||||
|
||||
* Return code
|
||||
* AD flag (authenticated)
|
||||
|
||||
When return code is `SERVFAIL`, it means that validating resolver marked requested
|
||||
name as **bogus** (or bad configuration).
|
||||
|
||||
**AD** flag is set if domain name is authenticated **(secure)** or false if
|
||||
it's insecure.
|
||||
|
||||
Complete source code
|
||||
--------------------
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-dnssec.py
|
||||
:language: python
|
||||
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
In order to get meaningful results, you have to enter IP address of validating
|
||||
resolver or setup your own (see howto).
|
||||
|
||||
Execute `./example2.py` with options `domain name` and `resolver IP`,
|
||||
example:
|
||||
|
||||
::
|
||||
|
||||
user@localhost# ./example2.py www.dnssec.cz 127.0.0.1 # Secure (Configured Unbound running on localhost)
|
||||
user@localhost# ./example2.py www.rhybar.cz 127.0.0.1 # Bogus
|
||||
|
||||
Howto setup Unbound as validating resolver
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Install Unbound according to instructions.
|
||||
Modify following options in `unbound.conf` (located in `/etc` or `/usr/local/etc`)/
|
||||
|
||||
|
||||
Uncomment `module-config` and set `validator` before iterator.
|
||||
|
||||
::
|
||||
|
||||
module-config: "validator iterator"
|
||||
|
||||
Download DLV keys and update path in `unbound.conf`::
|
||||
|
||||
# DLV keys
|
||||
# Download from http://ftp.isc.org/www/dlv/dlv.isc.org.key
|
||||
dlv-anchor-file: "/usr/local/etc/unbound/dlv.isc.org.key"
|
||||
|
||||
Update trusted keys (`.cz` for example)::
|
||||
|
||||
# Trusted keys
|
||||
# For current key, see www.dnssec.cz
|
||||
trusted-keys-file: "/usr/local/etc/unbound/trusted.key"
|
||||
|
||||
Now you should have well configured Unbound, so run it::
|
||||
|
||||
user@localhost# unbound -dv
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
High-level functions
|
||||
===========================
|
||||
|
||||
This basic example shows how to get name by addr and vice versa.
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-higher.py
|
||||
:language: python
|
|
@ -0,0 +1,7 @@
|
|||
AXFR client with IDN support
|
||||
===============================
|
||||
|
||||
This example shows how to get AXFR working and how to get involved Internationalized Domain Names (IDN)
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-axfr.py
|
||||
:language: python
|
|
@ -0,0 +1,14 @@
|
|||
Examine the results
|
||||
===============================
|
||||
|
||||
This example shows how to go through the obtained results
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-mx2.py
|
||||
:language: python
|
||||
|
||||
This snippet of code prints::
|
||||
|
||||
nic.cz. 1761 IN MX 20 mx.cznic.org.
|
||||
nic.cz. 1761 IN MX 10 mail.nic.cz.
|
||||
nic.cz. 1761 IN MX 15 mail4.nic.cz.
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
Read zone file
|
||||
===============================
|
||||
|
||||
This example shows how to read the content of a zone file
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-zone.py
|
||||
:language: python
|
||||
|
||||
Zone file ``zone.txt``:
|
||||
|
||||
.. literalinclude:: ../../../examples/zone.txt
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
Generate public/private key pair
|
||||
=======================================
|
||||
|
||||
This example shows how generate keys for DNSSEC (i.e. for signing a zone file according DNSSECbis).
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-keygen.py
|
||||
:language: python
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
Signing of a zone file
|
||||
===============================
|
||||
|
||||
This example shows how to sign the content of the given zone file
|
||||
|
||||
.. literalinclude:: ../../../examples/ldns-signzone.py
|
||||
:language: python
|
||||
|
||||
In order to be able sign a zone file, you have to generate a key-pair using ``ldns-keygen.py``. Don't forget to modify tag number.
|
||||
|
||||
Signing consists of three steps
|
||||
|
||||
1. In the first step, the content of a zone file is readed and parsed. This can be done using :class:`ldns.ldns_zone` class.
|
||||
|
||||
2. In the second step, the private and public key is readed and public key is inserted into zone (as DNSKEY).
|
||||
|
||||
3. In the last step, the DNSSEC zone instace is created and all the RRs from zone file are copied here. Then, all the records are signed using :meth:`ldns.ldns_zone.sign` method. If the signing was successfull, the content of DNSSEC zone is written to a file.
|
|
@ -0,0 +1,12 @@
|
|||
Tutorials
|
||||
==============================
|
||||
|
||||
Here you can find a set of simple applications which utilizes the ldns library in Python environment.
|
||||
|
||||
`Tutorials`
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
example*
|
|
@ -0,0 +1,22 @@
|
|||
PyLDNS documentation
|
||||
=======================================
|
||||
|
||||
PyLDNS provides an `LDNS`_ wrapper (Python extension module) - the thinnest layer over the library possible. Everything you can do from the C API, you can do from Python, but with less effort. The purpose of porting LDNS library to Python is to simplify DNS programming and usage of LDNS, however, still preserve the performance of this library as the speed represents the main benefit of LDNS. The proposed object approach allows the users to be concentrated at the essential part of application only and don't bother with deallocation of objects and so on.
|
||||
|
||||
.. _LDNS: http://www.nlnetlabs.nl/projects/ldns/
|
||||
|
||||
Contents
|
||||
----------
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
install.rst
|
||||
examples/index.rst
|
||||
modules/ldns
|
||||
|
||||
Indices and tables
|
||||
-------------------
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`search`
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
Installation
|
||||
===================================
|
||||
|
||||
**Prerequisites**
|
||||
|
||||
Python 2.4 or higher, SWIG 1.3 or higher, GNU make
|
||||
|
||||
**Download**
|
||||
|
||||
You can download the source codes `here`_.
|
||||
The latest release is 1.4.1, Jan 15, 2009.
|
||||
|
||||
.. _here: ldns-1.4.1-py.tar.gz
|
||||
|
||||
**Compiling**
|
||||
|
||||
After downloading, you can compile the library by doing::
|
||||
|
||||
> tar -xzf ldns-1.4.1-py.tar.gz
|
||||
> cd ldns-1.4.1
|
||||
> ./configure --with-pyldns
|
||||
> make
|
||||
|
||||
You need GNU make to compile pyLDNS; SWIG and Python development libraries to compile extension module.
|
||||
|
||||
|
||||
**Testing**
|
||||
|
||||
If the compilation is successfull, you can test the python LDNS extension module by::
|
||||
|
||||
> cd contrib/python
|
||||
> make testenv
|
||||
> ./ldns-mx.py
|
||||
|
||||
This will start a new shell, during which the symbolic links will be working.
|
||||
When you exit the shell, then symbolic links will be deleted.
|
||||
|
||||
In ``contrib/examples`` you can find many simple applications in python which demostrates the capabilities of LDNS library.
|
||||
|
||||
**Installation**
|
||||
|
||||
To install libraries and extension type::
|
||||
|
||||
> cd ldns-1.4.1
|
||||
> make install
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
LDNS module documentation
|
||||
================================
|
||||
|
||||
Here you can find the documentation of pyLDNS extension module. This module consists of several classes and a couple of functions.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
ldns_resolver
|
||||
ldns_pkt
|
||||
ldns_rr
|
||||
ldns_rdf
|
||||
ldns_dname
|
||||
ldns_rr_list
|
||||
ldns_zone
|
||||
ldns_key
|
||||
ldns_key_list
|
||||
ldns_buffer
|
||||
ldns_dnssec
|
||||
ldns_func
|
||||
|
||||
|
||||
|
||||
|
||||
**Differences against libLDNS**
|
||||
|
||||
* You don't need to use ldns-compare functions, instances can be compared using standard operators <, >, = ::
|
||||
|
||||
if (some_rr.owner() == another_rr.rdf(1)):
|
||||
pass
|
||||
|
||||
* Classes contain static methods that create new instances, the name of these methods starts with the new\_ prefix (e.g. :meth:`ldns.ldns_pkt.new_frm_file`).
|
||||
|
||||
* Is it possible to print the content of an object using ``print objinst`` (see :meth:`ldns.ldns_resolver.get_addr_by_name`).
|
||||
|
||||
* Classes contain write_to_buffer method that writes the content into buffer.
|
||||
|
||||
* All the methods that consume parameter of (const ldns_rdf) type allows to use string instead (see :meth:`ldns.ldns_resolver.query`).
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
Class ldns_buffer
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_buffer
|
||||
------------------------------
|
||||
.. autoclass:: ldns_buffer
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,11 @@
|
|||
Class ldns_dname
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_dname
|
||||
------------------------------
|
||||
.. autoclass:: ldns_dname
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,28 @@
|
|||
Class ldns_dnssec_zone
|
||||
================================
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_dnssec_zone
|
||||
------------------------------
|
||||
.. autoclass:: ldns_dnssec_zone
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
||||
Class ldns_dnssec_name
|
||||
------------------------------
|
||||
.. autoclass:: ldns_dnssec_name
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
||||
Class ldns_dnssec_rrsets
|
||||
------------------------------
|
||||
.. autoclass:: ldns_dnssec_rrsets
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
||||
Class ldns_dnssec_rrs
|
||||
------------------------------
|
||||
.. autoclass:: ldns_dnssec_rrs
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,253 @@
|
|||
Various functions
|
||||
================================
|
||||
|
||||
Here you can find list of functions that are not assigned to the classes.
|
||||
These functions have the same parameters as LDNS functions of the same name.
|
||||
You are encouraged to read the LDNS documentation.
|
||||
|
||||
**List of functions**
|
||||
|
||||
* ldns_algorithm2buffer_str
|
||||
* ldns_bget_keyword_data
|
||||
* ldns_bget_token
|
||||
* ldns_bgetc
|
||||
* ldns_bskipcs
|
||||
* ldns_bubblebabble
|
||||
* ldns_buffer2pkt_wire
|
||||
* ldns_buffer2str
|
||||
* ldns_calc_keytag
|
||||
* ldns_calc_keytag_raw
|
||||
* ldns_cert_algorithm2buffer_str
|
||||
* ldns_convert_dsa_rrsig_asn12rdf
|
||||
* ldns_convert_dsa_rrsig_rdf2asn1
|
||||
* ldns_create_nsec
|
||||
* ldns_create_nsec3
|
||||
* ldns_dname2buffer_wire
|
||||
* ldns_dname2canonical
|
||||
* ldns_dnssec_build_data_chain
|
||||
* ldns_dnssec_chain_nsec3_list
|
||||
* ldns_dnssec_create_nsec
|
||||
* ldns_dnssec_create_nsec3
|
||||
* ldns_dnssec_create_nsec_bitmap
|
||||
* ldns_dnssec_data_chain_deep_free
|
||||
* ldns_dnssec_data_chain_free
|
||||
* ldns_dnssec_data_chain_new
|
||||
* ldns_dnssec_data_chain_print
|
||||
* ldns_dnssec_default_add_to_signatures
|
||||
* ldns_dnssec_default_delete_signatures
|
||||
* ldns_dnssec_default_leave_signatures
|
||||
* ldns_dnssec_default_replace_signatures
|
||||
* ldns_dnssec_derive_trust_tree
|
||||
* ldns_dnssec_derive_trust_tree_dnskey_rrset
|
||||
* ldns_dnssec_derive_trust_tree_ds_rrset
|
||||
* ldns_dnssec_derive_trust_tree_no_sig
|
||||
* ldns_dnssec_derive_trust_tree_normal_rrset
|
||||
* ldns_dnssec_get_dnskey_for_rrsig
|
||||
* ldns_dnssec_get_rrsig_for_name_and_type
|
||||
* ldns_dnssec_nsec3_closest_encloser
|
||||
* ldns_dnssec_pkt_get_rrsigs_for_name_and_type
|
||||
* ldns_dnssec_pkt_get_rrsigs_for_type
|
||||
* ldns_dnssec_pkt_has_rrsigs
|
||||
* ldns_dnssec_remove_signatures
|
||||
* ldns_dnssec_trust_tree_add_parent
|
||||
* ldns_dnssec_trust_tree_contains_keys
|
||||
* ldns_dnssec_trust_tree_depth
|
||||
* ldns_dnssec_trust_tree_free
|
||||
* ldns_dnssec_trust_tree_new
|
||||
* ldns_dnssec_trust_tree_print
|
||||
* ldns_dnssec_verify_denial
|
||||
* ldns_dnssec_verify_denial_nsec3
|
||||
* ldns_fetch_valid_domain_keys
|
||||
* ldns_fget_keyword_data
|
||||
* ldns_fget_keyword_data_l
|
||||
* ldns_fget_token
|
||||
* ldns_fget_token_l
|
||||
* ldns_fskipcs
|
||||
* ldns_fskipcs_l
|
||||
* ldns_get_bit
|
||||
* ldns_get_bit_r
|
||||
* ldns_get_errorstr_by_id
|
||||
* ldns_get_rr_class_by_name
|
||||
* ldns_get_rr_list_addr_by_name
|
||||
* ldns_get_rr_list_hosts_frm_file
|
||||
* ldns_get_rr_list_hosts_frm_fp
|
||||
* ldns_get_rr_list_hosts_frm_fp_l
|
||||
* ldns_get_rr_list_name_by_addr
|
||||
* ldns_get_rr_type_by_name
|
||||
* ldns_getaddrinfo
|
||||
* ldns_hexdigit_to_int
|
||||
* ldns_hexstring_to_data
|
||||
* ldns_init_random
|
||||
* ldns_int_to_hexdigit
|
||||
* ldns_is_rrset
|
||||
* ldns_key2buffer_str
|
||||
* ldns_key2rr
|
||||
* ldns_key2str
|
||||
* ldns_lookup_by_id
|
||||
* ldns_lookup_by_name
|
||||
* ldns_native2rdf_int16
|
||||
* ldns_native2rdf_int16_data
|
||||
* ldns_native2rdf_int32
|
||||
* ldns_native2rdf_int8
|
||||
* ldns_nsec3_add_param_rdfs
|
||||
* ldns_nsec3_algorithm
|
||||
* ldns_nsec3_bitmap
|
||||
* ldns_nsec3_flags
|
||||
* ldns_nsec3_hash_name
|
||||
* ldns_nsec3_hash_name_frm_nsec3
|
||||
* ldns_nsec3_iterations
|
||||
* ldns_nsec3_next_owner
|
||||
* ldns_nsec3_optout
|
||||
* ldns_nsec3_salt
|
||||
* ldns_nsec3_salt_data
|
||||
* ldns_nsec3_salt_length
|
||||
* ldns_nsec_bitmap_covers_type
|
||||
* ldns_nsec_covers_name
|
||||
* ldns_nsec_get_bitmap
|
||||
* ldns_nsec_type_check
|
||||
* ldns_octet
|
||||
* ldns_pkt2buffer_str
|
||||
* ldns_pkt2buffer_wire
|
||||
* ldns_pkt2str
|
||||
* ldns_pkt2wire
|
||||
* ldns_pktheader2buffer_str
|
||||
* ldns_power
|
||||
* ldns_print_rr_rdf
|
||||
* ldns_rbtree_create
|
||||
* ldns_rbtree_delete
|
||||
* ldns_rbtree_find_less_equal
|
||||
* ldns_rbtree_first
|
||||
* ldns_rbtree_free
|
||||
* ldns_rbtree_init
|
||||
* ldns_rbtree_insert
|
||||
* ldns_rbtree_insert_vref
|
||||
* ldns_rbtree_last
|
||||
* ldns_rbtree_next
|
||||
* ldns_rbtree_previous
|
||||
* ldns_rbtree_search
|
||||
* ldns_rdf2buffer_str
|
||||
* ldns_rdf2buffer_str_a
|
||||
* ldns_rdf2buffer_str_aaaa
|
||||
* ldns_rdf2buffer_str_alg
|
||||
* ldns_rdf2buffer_str_apl
|
||||
* ldns_rdf2buffer_str_b64
|
||||
* ldns_rdf2buffer_str_cert_alg
|
||||
* ldns_rdf2buffer_str_class
|
||||
* ldns_rdf2buffer_str_dname
|
||||
* ldns_rdf2buffer_str_hex
|
||||
* ldns_rdf2buffer_str_int16
|
||||
* ldns_rdf2buffer_str_int16_data
|
||||
* ldns_rdf2buffer_str_ipseckey
|
||||
* ldns_rdf2buffer_str_loc
|
||||
* ldns_rdf2buffer_str_nsap
|
||||
* ldns_rdf2buffer_str_nsec
|
||||
* ldns_rdf2buffer_str_period
|
||||
* ldns_rdf2buffer_str_str
|
||||
* ldns_rdf2buffer_str_tsig
|
||||
* ldns_rdf2buffer_str_tsigtime
|
||||
* ldns_rdf2buffer_str_type
|
||||
* ldns_rdf2buffer_str_unknown
|
||||
* ldns_rdf2buffer_str_wks
|
||||
* ldns_rdf2buffer_wire
|
||||
* ldns_rdf2buffer_wire_canonical
|
||||
* ldns_rdf2native_int16
|
||||
* ldns_rdf2native_int32
|
||||
* ldns_rdf2native_int8
|
||||
* ldns_rdf2native_sockaddr_storage
|
||||
* ldns_rdf2native_time_t
|
||||
* ldns_rdf2rr_type
|
||||
* ldns_rdf2str
|
||||
* ldns_rdf2wire
|
||||
* ldns_read_anchor_file
|
||||
* ldns_read_uint16
|
||||
* ldns_read_uint32
|
||||
* ldns_rr2buffer_str
|
||||
* ldns_rr2buffer_wire
|
||||
* ldns_rr2buffer_wire_canonical
|
||||
* ldns_rr2canonical
|
||||
* ldns_rr2str
|
||||
* ldns_rr2wire
|
||||
* ldns_rrsig2buffer_wire
|
||||
* ldns_send
|
||||
* ldns_send_buffer
|
||||
* ldns_set_bit
|
||||
* ldns_sign_public
|
||||
* ldns_sockaddr_storage2rdf
|
||||
* ldns_str2period
|
||||
* ldns_str2rdf_a
|
||||
* ldns_str2rdf_aaaa
|
||||
* ldns_str2rdf_alg
|
||||
* ldns_str2rdf_apl
|
||||
* ldns_str2rdf_b32_ext
|
||||
* ldns_str2rdf_b64
|
||||
* ldns_str2rdf_cert_alg
|
||||
* ldns_str2rdf_class
|
||||
* ldns_str2rdf_dname
|
||||
* ldns_str2rdf_hex
|
||||
* ldns_str2rdf_int16
|
||||
* ldns_str2rdf_int32
|
||||
* ldns_str2rdf_int8
|
||||
* ldns_str2rdf_loc
|
||||
* ldns_str2rdf_nsap
|
||||
* ldns_str2rdf_nsec
|
||||
* ldns_str2rdf_nsec3_salt
|
||||
* ldns_str2rdf_period
|
||||
* ldns_str2rdf_service
|
||||
* ldns_str2rdf_str
|
||||
* ldns_str2rdf_time
|
||||
* ldns_str2rdf_tsig
|
||||
* ldns_str2rdf_type
|
||||
* ldns_str2rdf_unknown
|
||||
* ldns_str2rdf_wks
|
||||
* ldns_tcp_bgsend
|
||||
* ldns_tcp_connect
|
||||
* ldns_tcp_read_wire
|
||||
* ldns_tcp_send
|
||||
* ldns_tcp_send_query
|
||||
* ldns_traverse_postorder
|
||||
* ldns_tsig_algorithm
|
||||
* ldns_tsig_keydata
|
||||
* ldns_tsig_keydata_clone
|
||||
* ldns_tsig_keyname
|
||||
* ldns_tsig_keyname_clone
|
||||
* ldns_udp_bgsend
|
||||
* ldns_udp_connect
|
||||
* ldns_udp_read_wire
|
||||
* ldns_udp_send
|
||||
* ldns_udp_send_query
|
||||
* ldns_update_pkt_new
|
||||
* ldns_update_pkt_tsig_add
|
||||
* ldns_update_prcount
|
||||
* ldns_update_set_adcount
|
||||
* ldns_update_set_prcount
|
||||
* ldns_update_set_upcount
|
||||
* ldns_update_soa_mname
|
||||
* ldns_update_soa_zone_mname
|
||||
* ldns_update_upcount
|
||||
* ldns_update_zocount
|
||||
* ldns_validate_domain_dnskey
|
||||
* ldns_validate_domain_ds
|
||||
* ldns_verify
|
||||
* ldns_verify_rrsig
|
||||
* ldns_verify_rrsig_buffers
|
||||
* ldns_verify_rrsig_buffers_raw
|
||||
* ldns_verify_rrsig_dsa
|
||||
* ldns_verify_rrsig_dsa_raw
|
||||
* ldns_verify_rrsig_keylist
|
||||
* ldns_verify_rrsig_rsamd5
|
||||
* ldns_verify_rrsig_rsamd5_raw
|
||||
* ldns_verify_rrsig_rsasha1
|
||||
* ldns_verify_rrsig_rsasha1_raw
|
||||
* ldns_verify_rrsig_rsasha256_raw
|
||||
* ldns_verify_rrsig_rsasha512_raw
|
||||
* ldns_verify_trusted
|
||||
* ldns_version
|
||||
* ldns_wire2dname
|
||||
* ldns_wire2pkt
|
||||
* ldns_wire2rdf
|
||||
* ldns_wire2rr
|
||||
* ldns_write_uint16
|
||||
* ldns_write_uint32
|
||||
* ldns_write_uint64_as_uint48
|
||||
* mktime_from_utc
|
||||
* qsort_rr_compare_nsec3
|
|
@ -0,0 +1,11 @@
|
|||
Class ldns_key
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_key
|
||||
------------------------------
|
||||
.. autoclass:: ldns_key
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,11 @@
|
|||
Class ldns_key_list
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_key_list
|
||||
------------------------------
|
||||
.. autoclass:: ldns_key_list
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,11 @@
|
|||
Class ldns_pkt
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_pkt
|
||||
------------------------------
|
||||
.. autoclass:: ldns_pkt
|
||||
:members:
|
||||
:undoc-members:
|
|
@ -0,0 +1,47 @@
|
|||
Class ldns_rdf
|
||||
================================
|
||||
|
||||
|
||||
.. automodule:: ldns
|
||||
|
||||
Class ldns_rdf
|
||||
------------------------------
|
||||
.. autoclass:: ldns_rdf
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
||||
Predefined constants
|
||||
------------------------------
|
||||
|
||||
**RDF TYPE**
|
||||
* LDNS_RDF_TYPE_NONE,
|
||||
* LDNS_RDF_TYPE_DNAME,
|
||||
* LDNS_RDF_TYPE_INT8,
|
||||
* LDNS_RDF_TYPE_INT16,
|
||||
* LDNS_RDF_TYPE_INT32,
|
||||
* LDNS_RDF_TYPE_A,
|
||||
* LDNS_RDF_TYPE_AAAA,
|
||||
* LDNS_RDF_TYPE_STR,
|
||||
* LDNS_RDF_TYPE_APL,
|
||||
* LDNS_RDF_TYPE_B32_EXT,
|
||||
* LDNS_RDF_TYPE_B64,
|
||||
* LDNS_RDF_TYPE_HEX,
|
||||
* LDNS_RDF_TYPE_NSEC,
|
||||
* LDNS_RDF_TYPE_TYPE,
|
||||
* LDNS_RDF_TYPE_CLASS,
|
||||
* LDNS_RDF_TYPE_CERT_ALG,
|
||||
* LDNS_RDF_TYPE_ALG,
|
||||
* LDNS_RDF_TYPE_UNKNOWN,
|
||||
* LDNS_RDF_TYPE_TIME,
|
||||
* LDNS_RDF_TYPE_PERIOD,
|
||||
* LDNS_RDF_TYPE_TSIGTIME,
|
||||
* LDNS_RDF_TYPE_TSIG,
|
||||
* LDNS_RDF_TYPE_INT16_DATA,
|
||||
* LDNS_RDF_TYPE_SERVICE,
|
||||
* LDNS_RDF_TYPE_LOC,
|
||||
* LDNS_RDF_TYPE_WKS,
|
||||
* LDNS_RDF_TYPE_NSAP,
|
||||
* LDNS_RDF_TYPE_IPSECKEY,
|
||||
* LDNS_RDF_TYPE_NSEC3_SALT,
|
||||
* LDNS_RDF_TYPE_NSEC3_NEXT_OWNER
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue