| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| MiniUPnPc | ||
| Copyright (c) 2005-2011, Thomas BERNARD | ||
| 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. | ||
| * The name of the author may not be used to endorse or promote products | ||
| derived from this software without specific prior written permission. | ||
|
|
||
| THIS SOFTWARE IS PROVIDED BY THE 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. | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| Project: miniupnp | ||
| Project web page: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| github: https://github.com/miniupnp/miniupnp | ||
| freecode: http://freecode.com/projects/miniupnp | ||
| Author: Thomas Bernard | ||
| Copyright (c) 2005-2012 Thomas Bernard | ||
| This software is subject to the conditions detailed in the | ||
| LICENSE file provided within this distribution. | ||
|
|
||
|
|
||
| For the comfort of Win32 users, bsdqueue.h is included in the distribution. | ||
| Its licence is included in the header of the file. | ||
| bsdqueue.h is a copy of the sys/queue.h of an OpenBSD system. | ||
|
|
||
|
|
||
| * miniUPnP Client - miniUPnPc * | ||
|
|
||
| To compile, simply run 'gmake' (could be 'make' on your system). | ||
| Under win32, to compile with MinGW, type "mingw32make.bat". | ||
| MS Visual C solution and project files are supplied in the msvc/ subdirectory. | ||
|
|
||
| The compilation is known to work under linux, FreeBSD, | ||
| OpenBSD, MacOS X, AmigaOS and cygwin. | ||
| The official AmigaOS4.1 SDK was used for AmigaOS4 and GeekGadgets for AmigaOS3. | ||
| upx (http://upx.sourceforge.net) is used to compress the win32 .exe files. | ||
|
|
||
| To install the library and headers on the system use : | ||
| > su | ||
| > make install | ||
| > exit | ||
|
|
||
| alternatively, to install into a specific location, use : | ||
| > INSTALLPREFIX=/usr/local make install | ||
|
|
||
| upnpc.c is a sample client using the libminiupnpc. | ||
| To use the libminiupnpc in your application, link it with | ||
| libminiupnpc.a (or .so) and use the following functions found in miniupnpc.h, | ||
| upnpcommands.h and miniwget.h : | ||
| - upnpDiscover() | ||
| - miniwget() | ||
| - parserootdesc() | ||
| - GetUPNPUrls() | ||
| - UPNP_* (calling UPNP methods) | ||
|
|
||
| Note : use #include <miniupnpc/miniupnpc.h> etc... for the includes | ||
| and -lminiupnpc for the link | ||
|
|
||
| Discovery process is speeded up when MiniSSDPd is running on the machine. | ||
|
|
||
|
|
||
| * Python module * | ||
|
|
||
| you can build a python module with 'make pythonmodule' | ||
| and install it with 'make installpythonmodule'. | ||
| setup.py (and setupmingw32.py) are included in the distribution. | ||
|
|
||
|
|
||
| Feel free to contact me if you have any problem : | ||
| e-mail : miniupnp@free.fr | ||
|
|
||
| If you are using libminiupnpc in your application, please | ||
| send me an email ! | ||
|
|
||
| For any question, you can use the web forum : | ||
| http://miniupnp.tuxfamily.org/forum/ | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| 1.8 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,117 @@ | ||
| $Id: apiversions.txt,v 1.2 2013/03/29 14:45:09 nanard Exp $ | ||
|
|
||
| Differences in API between miniUPnPc versions | ||
|
|
||
|
|
||
| ====================== miniUPnPc version 1.8 ====================== | ||
| API version 9 | ||
|
|
||
| miniupnpc.h: | ||
| updated macros : | ||
| #define MINIUPNPC_VERSION "1.8" | ||
| #define MINIUPNPC_API_VERSION 9 | ||
| added "unsigned int scope_id;" to struct UPNPDev | ||
| added scope_id argument to GetUPNPUrls() | ||
|
|
||
|
|
||
|
|
||
| ====================== miniUPnPc version 1.7 ====================== | ||
| API version 8 | ||
|
|
||
| miniupnpc.h : | ||
| add new macros : | ||
| #define MINIUPNPC_VERSION "1.7" | ||
| #define MINIUPNPC_API_VERSION 8 | ||
| add rootdescURL to struct UPNPUrls | ||
|
|
||
|
|
||
|
|
||
| ====================== miniUPnPc version 1.6 ====================== | ||
| API version 8 | ||
|
|
||
| Adding support for IPv6. | ||
| igd_desc_parse.h : | ||
| struct IGDdatas_service : | ||
| add char presentationurl[MINIUPNPC_URL_MAXSIZE]; | ||
| struct IGDdatas : | ||
| add struct IGDdatas_service IPv6FC; | ||
| miniupnpc.h : | ||
| new macros : | ||
| #define UPNPDISCOVER_SUCCESS (0) | ||
| #define UPNPDISCOVER_UNKNOWN_ERROR (-1) | ||
| #define UPNPDISCOVER_SOCKET_ERROR (-101) | ||
| #define UPNPDISCOVER_MEMORY_ERROR (-102) | ||
| simpleUPnPcommand() prototype changed (but is normaly not used by API users) | ||
| add arguments ipv6 and error to upnpDiscover() : | ||
| struct UPNPDev * | ||
| upnpDiscover(int delay, const char * multicastif, | ||
| const char * minissdpdsock, int sameport, | ||
| int ipv6, | ||
| int * error); | ||
| add controlURL_6FC member to struct UPNPUrls : | ||
| struct UPNPUrls { | ||
| char * controlURL; | ||
| char * ipcondescURL; | ||
| char * controlURL_CIF; | ||
| char * controlURL_6FC; | ||
| }; | ||
|
|
||
| upnpcommands.h : | ||
| add leaseDuration argument to UPNP_AddPortMapping() | ||
| add desc, enabled and leaseDuration arguments to UPNP_GetSpecificPortMappingEntry() | ||
| add UPNP_GetListOfPortMappings() function (IGDv2) | ||
| add IGDv2 IPv6 related functions : | ||
| UPNP_GetFirewallStatus() | ||
| UPNP_GetOutboundPinholeTimeout() | ||
| UPNP_AddPinhole() | ||
| UPNP_UpdatePinhole() | ||
| UPNP_DeletePinhole() | ||
| UPNP_CheckPinholeWorking() | ||
| UPNP_GetPinholePackets() | ||
|
|
||
|
|
||
|
|
||
| ====================== miniUPnPc version 1.5 ====================== | ||
| API version 5 | ||
|
|
||
| new function : | ||
| int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); | ||
| new macro in upnpcommands.h : | ||
| #define UPNPCOMMAND_HTTP_ERROR | ||
|
|
||
| ====================== miniUPnPc version 1.4 ====================== | ||
| Same API as version 1.3 | ||
|
|
||
| ====================== miniUPnPc version 1.3 ====================== | ||
| API version 4 | ||
|
|
||
| Use UNSIGNED_INTEGER type for | ||
| UPNP_GetTotalBytesSent(), UPNP_GetTotalBytesReceived(), | ||
| UPNP_GetTotalPacketsSent(), UPNP_GetTotalPacketsReceived() | ||
| Add remoteHost argument to UPNP_AddPortMapping() and UPNP_DeletePortMapping() | ||
|
|
||
| ====================== miniUPnPc version 1.2 ====================== | ||
| API version 3 | ||
|
|
||
| added sameport argument to upnpDiscover() | ||
| struct UPNPDev * | ||
| upnpDiscover(int delay, const char * multicastif, | ||
| const char * minissdpdsock, int sameport); | ||
|
|
||
| ====================== miniUPnPc Version 1.1 ====================== | ||
| Same API as 1.0 | ||
|
|
||
|
|
||
| ====================== miniUPnPc Version 1.0 ====================== | ||
| API version 2 | ||
|
|
||
|
|
||
| struct UPNPDev { | ||
| struct UPNPDev * pNext; | ||
| char * descURL; | ||
| char * st; | ||
| char buffer[2]; | ||
| }; | ||
| struct UPNPDev * upnpDiscover(int delay, const char * multicastif, | ||
| const char * minissdpdsock); | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,164 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup Label="ProjectConfigurations"> | ||
| <ProjectConfiguration Include="Debug|Win32"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>Win32</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Debug|x64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|Win32"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>Win32</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|x64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| </ItemGroup> | ||
| <PropertyGroup Label="Globals"> | ||
| <ProjectGuid>{A680190D-0764-485B-9CF3-A82C5EDD5715}</ProjectGuid> | ||
| <RootNamespace>miniupnpc</RootNamespace> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| <CharacterSet>MultiByte</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| <CharacterSet>MultiByte</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| <WholeProgramOptimization>true</WholeProgramOptimization> | ||
| <CharacterSet>MultiByte</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| <WholeProgramOptimization>true</WholeProgramOptimization> | ||
| <CharacterSet>MultiByte</CharacterSet> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| <ImportGroup Label="ExtensionSettings"> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\CodeGen_Debug.props" /> | ||
| </ImportGroup> | ||
| <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\CodeGen_Debug.props" /> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\CodeGen_Release.props" /> | ||
| </ImportGroup> | ||
| <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\CodeGen_Release.props" /> | ||
| </ImportGroup> | ||
| <PropertyGroup Label="UserMacros" /> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" /> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" /> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" /> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" /> | ||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||
| <ClCompile> | ||
| <WarningLevel>Level3</WarningLevel> | ||
| <Optimization>Disabled</Optimization> | ||
| <PreprocessorDefinitions>_WIN32_WINNT=0x0501;STATICLIB;DEBUG</PreprocessorDefinitions> | ||
| </ClCompile> | ||
| <Link> | ||
| <GenerateDebugInformation>true</GenerateDebugInformation> | ||
| <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| </Link> | ||
| </ItemDefinitionGroup> | ||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | ||
| <ClCompile> | ||
| <WarningLevel>Level3</WarningLevel> | ||
| <Optimization>Disabled</Optimization> | ||
| <PreprocessorDefinitions>_WIN32_WINNT=0x0501;STATICLIB;DEBUG</PreprocessorDefinitions> | ||
| </ClCompile> | ||
| <Link> | ||
| <GenerateDebugInformation>true</GenerateDebugInformation> | ||
| <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| </Link> | ||
| </ItemDefinitionGroup> | ||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||
| <ClCompile> | ||
| <WarningLevel>Level3</WarningLevel> | ||
| <Optimization>MaxSpeed</Optimization> | ||
| <FunctionLevelLinking>true</FunctionLevelLinking> | ||
| <IntrinsicFunctions>true</IntrinsicFunctions> | ||
| <PreprocessorDefinitions>_WIN32_WINNT=0x0501;STATICLIB</PreprocessorDefinitions> | ||
| </ClCompile> | ||
| <Link> | ||
| <GenerateDebugInformation>true</GenerateDebugInformation> | ||
| <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||
| <OptimizeReferences>true</OptimizeReferences> | ||
| <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| </Link> | ||
| </ItemDefinitionGroup> | ||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | ||
| <ClCompile> | ||
| <WarningLevel>Level3</WarningLevel> | ||
| <Optimization>MaxSpeed</Optimization> | ||
| <FunctionLevelLinking>true</FunctionLevelLinking> | ||
| <IntrinsicFunctions>true</IntrinsicFunctions> | ||
| <PreprocessorDefinitions>_WIN32_WINNT=0x0501;STATICLIB</PreprocessorDefinitions> | ||
| </ClCompile> | ||
| <Link> | ||
| <GenerateDebugInformation>true</GenerateDebugInformation> | ||
| <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||
| <OptimizeReferences>true</OptimizeReferences> | ||
| <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| </Link> | ||
| </ItemDefinitionGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="src\bsdqueue.h" /> | ||
| <ClInclude Include="src\codelength.h" /> | ||
| <ClInclude Include="src\connecthostport.h" /> | ||
| <ClInclude Include="src\declspec.h" /> | ||
| <ClInclude Include="src\igd_desc_parse.h" /> | ||
| <ClInclude Include="src\minisoap.h" /> | ||
| <ClInclude Include="src\minissdpc.h" /> | ||
| <ClInclude Include="src\miniupnpc.h" /> | ||
| <ClInclude Include="src\miniupnpcstrings.h" /> | ||
| <ClInclude Include="src\miniupnpctypes.h" /> | ||
| <ClInclude Include="src\miniwget.h" /> | ||
| <ClInclude Include="src\minixml.h" /> | ||
| <ClInclude Include="src\portlistingparse.h" /> | ||
| <ClInclude Include="src\receivedata.h" /> | ||
| <ClInclude Include="src\upnpcommands.h" /> | ||
| <ClInclude Include="src\upnperrors.h" /> | ||
| <ClInclude Include="src\upnpreplyparse.h" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="src\connecthostport.c" /> | ||
| <ClCompile Include="src\igd_desc_parse.c" /> | ||
| <ClCompile Include="src\minisoap.c" /> | ||
| <ClCompile Include="src\miniupnpc.c" /> | ||
| <ClCompile Include="src\miniwget.c" /> | ||
| <ClCompile Include="src\minixml.c" /> | ||
| <ClCompile Include="src\portlistingparse.c" /> | ||
| <ClCompile Include="src\receivedata.c" /> | ||
| <ClCompile Include="src\upnpc.c" /> | ||
| <ClCompile Include="src\upnpcommands.c" /> | ||
| <ClCompile Include="src\upnperrors.c" /> | ||
| <ClCompile Include="src\upnpreplyparse.c" /> | ||
| </ItemGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| <ImportGroup Label="ExtensionTargets"> | ||
| </ImportGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,108 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup> | ||
| <Filter Include="Source Files"> | ||
| <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> | ||
| <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> | ||
| </Filter> | ||
| <Filter Include="Header Files"> | ||
| <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> | ||
| <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> | ||
| </Filter> | ||
| <Filter Include="Resource Files"> | ||
| <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> | ||
| <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | ||
| </Filter> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="src\bsdqueue.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\codelength.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\connecthostport.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\declspec.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\igd_desc_parse.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\minisoap.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\minissdpc.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\miniupnpc.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\miniupnpcstrings.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\miniupnpctypes.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\miniwget.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\minixml.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\portlistingparse.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\receivedata.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\upnpcommands.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\upnperrors.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| <ClInclude Include="src\upnpreplyparse.h"> | ||
| <Filter>Header Files</Filter> | ||
| </ClInclude> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="src\igd_desc_parse.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\minisoap.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\miniupnpc.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\miniwget.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\minixml.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\portlistingparse.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\receivedata.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\upnpc.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\upnpcommands.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\upnperrors.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\upnpreplyparse.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| <ClCompile Include="src\connecthostport.c"> | ||
| <Filter>Source Files</Filter> | ||
| </ClCompile> | ||
| </ItemGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| /* $Id: codelength.h,v 1.4 2012/09/27 15:40:29 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas BERNARD | ||
| * copyright (c) 2005-2011 Thomas Bernard | ||
| * This software is subjet to the conditions detailed in the | ||
| * provided LICENCE file. */ | ||
| #ifndef CODELENGTH_H_INCLUDED | ||
| #define CODELENGTH_H_INCLUDED | ||
|
|
||
| /* Encode length by using 7bit per Byte : | ||
| * Most significant bit of each byte specifies that the | ||
| * following byte is part of the code */ | ||
| #define DECODELENGTH(n, p) n = 0; \ | ||
| do { n = (n << 7) | (*p & 0x7f); } \ | ||
| while((*(p++)&0x80) && (n<(1<<25))); | ||
|
|
||
| #define DECODELENGTH_CHECKLIMIT(n, p, p_limit) \ | ||
| n = 0; \ | ||
| do { \ | ||
| if((p) >= (p_limit)) break; \ | ||
| n = (n << 7) | (*(p) & 0x7f); \ | ||
| } while((*((p)++)&0x80) && (n<(1<<25))); | ||
|
|
||
| #define CODELENGTH(n, p) if(n>=268435456) *(p++) = (n >> 28) | 0x80; \ | ||
| if(n>=2097152) *(p++) = (n >> 21) | 0x80; \ | ||
| if(n>=16384) *(p++) = (n >> 14) | 0x80; \ | ||
| if(n>=128) *(p++) = (n >> 7) | 0x80; \ | ||
| *(p++) = n & 0x7f; | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,250 @@ | ||
| /* $Id: connecthostport.c,v 1.10 2013/05/03 09:05:38 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2010-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. */ | ||
|
|
||
| /* use getaddrinfo() or gethostbyname() | ||
| * uncomment the following line in order to use gethostbyname() */ | ||
| #ifdef NO_GETADDRINFO | ||
| #define USE_GETHOSTBYNAME | ||
| #endif | ||
|
|
||
| #include <string.h> | ||
| #include <stdio.h> | ||
| #ifdef _WIN32 | ||
| #include <winsock2.h> | ||
| #include <ws2tcpip.h> | ||
| #include <io.h> | ||
| #define MAXHOSTNAMELEN 64 | ||
| #define snprintf _snprintf | ||
| #define herror | ||
| #define socklen_t int | ||
| #else /* #ifdef _WIN32 */ | ||
| #include <unistd.h> | ||
| #include <sys/param.h> | ||
| #include <sys/select.h> | ||
| #include <errno.h> | ||
| #define closesocket close | ||
| #include <netdb.h> | ||
| #include <netinet/in.h> | ||
| /* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions | ||
| * during the connect() call */ | ||
| #define MINIUPNPC_IGNORE_EINTR | ||
| #ifndef USE_GETHOSTBYNAME | ||
| #include <sys/types.h> | ||
| #include <sys/socket.h> | ||
| #endif /* #ifndef USE_GETHOSTBYNAME */ | ||
| #endif /* #else _WIN32 */ | ||
|
|
||
| /* definition of PRINT_SOCKET_ERROR */ | ||
| #ifdef _WIN32 | ||
| #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); | ||
| #else | ||
| #define PRINT_SOCKET_ERROR(x) perror(x) | ||
| #endif | ||
|
|
||
| #if defined(__amigaos__) || defined(__amigaos4__) | ||
| #define herror(A) printf("%s\n", A) | ||
| #endif | ||
|
|
||
| #include "connecthostport.h" | ||
|
|
||
| /* connecthostport() | ||
| * return a socket connected (TCP) to the host and port | ||
| * or -1 in case of error */ | ||
| int connecthostport(const char * host, unsigned short port, | ||
| unsigned int scope_id) | ||
| { | ||
| int s, n; | ||
| #ifdef USE_GETHOSTBYNAME | ||
| struct sockaddr_in dest; | ||
| struct hostent *hp; | ||
| #else /* #ifdef USE_GETHOSTBYNAME */ | ||
| char tmp_host[MAXHOSTNAMELEN+1]; | ||
| char port_str[8]; | ||
| struct addrinfo *ai, *p; | ||
| struct addrinfo hints; | ||
| #endif /* #ifdef USE_GETHOSTBYNAME */ | ||
| #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT | ||
| struct timeval timeout; | ||
| #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ | ||
|
|
||
| #ifdef USE_GETHOSTBYNAME | ||
| hp = gethostbyname(host); | ||
| if(hp == NULL) | ||
| { | ||
| herror(host); | ||
| return -1; | ||
| } | ||
| memcpy(&dest.sin_addr, hp->h_addr, sizeof(dest.sin_addr)); | ||
| memset(dest.sin_zero, 0, sizeof(dest.sin_zero)); | ||
| s = socket(PF_INET, SOCK_STREAM, 0); | ||
| if(s < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("socket"); | ||
| return -1; | ||
| } | ||
| #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT | ||
| /* setting a 3 seconds timeout for the connect() call */ | ||
| timeout.tv_sec = 3; | ||
| timeout.tv_usec = 0; | ||
| if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("setsockopt"); | ||
| } | ||
| timeout.tv_sec = 3; | ||
| timeout.tv_usec = 0; | ||
| if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("setsockopt"); | ||
| } | ||
| #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ | ||
| dest.sin_family = AF_INET; | ||
| dest.sin_port = htons(port); | ||
| n = connect(s, (struct sockaddr *)&dest, sizeof(struct sockaddr_in)); | ||
| #ifdef MINIUPNPC_IGNORE_EINTR | ||
| while(n < 0 && errno == EINTR) | ||
| { | ||
| socklen_t len; | ||
| fd_set wset; | ||
| int err; | ||
| FD_ZERO(&wset); | ||
| FD_SET(s, &wset); | ||
| if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR) | ||
| continue; | ||
| /*len = 0;*/ | ||
| /*n = getpeername(s, NULL, &len);*/ | ||
| len = sizeof(err); | ||
| if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) { | ||
| PRINT_SOCKET_ERROR("getsockopt"); | ||
| closesocket(s); | ||
| return -1; | ||
| } | ||
| if(err != 0) { | ||
| errno = err; | ||
| n = -1; | ||
| } | ||
| } | ||
| #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */ | ||
| if(n<0) | ||
| { | ||
| PRINT_SOCKET_ERROR("connect"); | ||
| closesocket(s); | ||
| return -1; | ||
| } | ||
| #else /* #ifdef USE_GETHOSTBYNAME */ | ||
| /* use getaddrinfo() instead of gethostbyname() */ | ||
| memset(&hints, 0, sizeof(hints)); | ||
| /* hints.ai_flags = AI_ADDRCONFIG; */ | ||
| #ifdef AI_NUMERICSERV | ||
| hints.ai_flags = AI_NUMERICSERV; | ||
| #endif | ||
| hints.ai_socktype = SOCK_STREAM; | ||
| hints.ai_family = AF_UNSPEC; /* AF_INET, AF_INET6 or AF_UNSPEC */ | ||
| /* hints.ai_protocol = IPPROTO_TCP; */ | ||
| snprintf(port_str, sizeof(port_str), "%hu", port); | ||
| if(host[0] == '[') | ||
| { | ||
| /* literal ip v6 address */ | ||
| int i, j; | ||
| for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++) | ||
| { | ||
| tmp_host[i] = host[j]; | ||
| if(0 == memcmp(host+j, "%25", 3)) /* %25 is just url encoding for '%' */ | ||
| j+=2; /* skip "25" */ | ||
| } | ||
| tmp_host[i] = '\0'; | ||
| } | ||
| else | ||
| { | ||
| strncpy(tmp_host, host, MAXHOSTNAMELEN); | ||
| } | ||
| tmp_host[MAXHOSTNAMELEN] = '\0'; | ||
| n = getaddrinfo(tmp_host, port_str, &hints, &ai); | ||
| if(n != 0) | ||
| { | ||
| #ifdef _WIN32 | ||
| fprintf(stderr, "getaddrinfo() error : %d\n", n); | ||
| #else | ||
| fprintf(stderr, "getaddrinfo() error : %s\n", gai_strerror(n)); | ||
| #endif | ||
| return -1; | ||
| } | ||
| s = -1; | ||
| for(p = ai; p; p = p->ai_next) | ||
| { | ||
| s = socket(p->ai_family, p->ai_socktype, p->ai_protocol); | ||
| if(s < 0) | ||
| continue; | ||
| if(p->ai_addr->sa_family == AF_INET6 && scope_id > 0) { | ||
| struct sockaddr_in6 * addr6 = (struct sockaddr_in6 *)p->ai_addr; | ||
| addr6->sin6_scope_id = scope_id; | ||
| } | ||
| #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT | ||
| /* setting a 3 seconds timeout for the connect() call */ | ||
| timeout.tv_sec = 3; | ||
| timeout.tv_usec = 0; | ||
| if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("setsockopt"); | ||
| } | ||
| timeout.tv_sec = 3; | ||
| timeout.tv_usec = 0; | ||
| if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("setsockopt"); | ||
| } | ||
| #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ | ||
| n = connect(s, p->ai_addr, p->ai_addrlen); | ||
| #ifdef MINIUPNPC_IGNORE_EINTR | ||
| while(n < 0 && errno == EINTR) | ||
| { | ||
| socklen_t len; | ||
| fd_set wset; | ||
| int err; | ||
| FD_ZERO(&wset); | ||
| FD_SET(s, &wset); | ||
| if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR) | ||
| continue; | ||
| /*len = 0;*/ | ||
| /*n = getpeername(s, NULL, &len);*/ | ||
| len = sizeof(err); | ||
| if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) { | ||
| PRINT_SOCKET_ERROR("getsockopt"); | ||
| closesocket(s); | ||
| freeaddrinfo(ai); | ||
| return -1; | ||
| } | ||
| if(err != 0) { | ||
| errno = err; | ||
| n = -1; | ||
| } | ||
| } | ||
| #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */ | ||
| if(n < 0) | ||
| { | ||
| closesocket(s); | ||
| continue; | ||
| } | ||
| else | ||
| { | ||
| break; | ||
| } | ||
| } | ||
| freeaddrinfo(ai); | ||
| if(s < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("socket"); | ||
| return -1; | ||
| } | ||
| if(n < 0) | ||
| { | ||
| PRINT_SOCKET_ERROR("connect"); | ||
| return -1; | ||
| } | ||
| #endif /* #ifdef USE_GETHOSTBYNAME */ | ||
| return s; | ||
| } | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| /* $Id: connecthostport.h,v 1.3 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Project: miniupnp | ||
| * http://miniupnp.free.fr/ | ||
| * Author: Thomas Bernard | ||
| * Copyright (c) 2010-2012 Thomas Bernard | ||
| * This software is subjects to the conditions detailed | ||
| * in the LICENCE file provided within this distribution */ | ||
| #ifndef CONNECTHOSTPORT_H_INCLUDED | ||
| #define CONNECTHOSTPORT_H_INCLUDED | ||
|
|
||
| /* connecthostport() | ||
| * return a socket connected (TCP) to the host and port | ||
| * or -1 in case of error */ | ||
| int connecthostport(const char * host, unsigned short port, | ||
| unsigned int scope_id); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| #ifndef DECLSPEC_H_INCLUDED | ||
| #define DECLSPEC_H_INCLUDED | ||
| #define LIBSPEC | ||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,125 @@ | ||
| /* $Id: igd_desc_parse.c,v 1.14 2011/04/11 09:19:24 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * http://miniupnp.free.fr/ | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005-2010 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. */ | ||
|
|
||
| #include "igd_desc_parse.h" | ||
| #include <stdio.h> | ||
| #include <string.h> | ||
|
|
||
| /* Start element handler : | ||
| * update nesting level counter and copy element name */ | ||
| void IGDstartelt(void * d, const char * name, int l) | ||
| { | ||
| struct IGDdatas * datas = (struct IGDdatas *)d; | ||
| memcpy( datas->cureltname, name, l); | ||
| datas->cureltname[l] = '\0'; | ||
| datas->level++; | ||
| if( (l==7) && !memcmp(name, "service", l) ) { | ||
| datas->tmp.controlurl[0] = '\0'; | ||
| datas->tmp.eventsuburl[0] = '\0'; | ||
| datas->tmp.scpdurl[0] = '\0'; | ||
| datas->tmp.servicetype[0] = '\0'; | ||
| } | ||
| } | ||
|
|
||
| /* End element handler : | ||
| * update nesting level counter and update parser state if | ||
| * service element is parsed */ | ||
| void IGDendelt(void * d, const char * name, int l) | ||
| { | ||
| struct IGDdatas * datas = (struct IGDdatas *)d; | ||
| datas->level--; | ||
| /*printf("endelt %2d %.*s\n", datas->level, l, name);*/ | ||
| if( (l==7) && !memcmp(name, "service", l) ) | ||
| { | ||
| /* | ||
| if( datas->state < 1 | ||
| && !strcmp(datas->servicetype, | ||
| // "urn:schemas-upnp-org:service:WANIPConnection:1") ) | ||
| "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) | ||
| datas->state ++; | ||
| */ | ||
| if(0==strcmp(datas->tmp.servicetype, | ||
| "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) { | ||
| memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service)); | ||
| } else if(0==strcmp(datas->tmp.servicetype, | ||
| "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1")) { | ||
| memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service)); | ||
| } else if(0==strcmp(datas->tmp.servicetype, | ||
| "urn:schemas-upnp-org:service:WANIPConnection:1") | ||
| || 0==strcmp(datas->tmp.servicetype, | ||
| "urn:schemas-upnp-org:service:WANPPPConnection:1") ) { | ||
| if(datas->first.servicetype[0] == '\0') { | ||
| memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service)); | ||
| } else { | ||
| memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* Data handler : | ||
| * copy data depending on the current element name and state */ | ||
| void IGDdata(void * d, const char * data, int l) | ||
| { | ||
| struct IGDdatas * datas = (struct IGDdatas *)d; | ||
| char * dstmember = 0; | ||
| /*printf("%2d %s : %.*s\n", | ||
| datas->level, datas->cureltname, l, data); */ | ||
| if( !strcmp(datas->cureltname, "URLBase") ) | ||
| dstmember = datas->urlbase; | ||
| else if( !strcmp(datas->cureltname, "presentationURL") ) | ||
| dstmember = datas->presentationurl; | ||
| else if( !strcmp(datas->cureltname, "serviceType") ) | ||
| dstmember = datas->tmp.servicetype; | ||
| else if( !strcmp(datas->cureltname, "controlURL") ) | ||
| dstmember = datas->tmp.controlurl; | ||
| else if( !strcmp(datas->cureltname, "eventSubURL") ) | ||
| dstmember = datas->tmp.eventsuburl; | ||
| else if( !strcmp(datas->cureltname, "SCPDURL") ) | ||
| dstmember = datas->tmp.scpdurl; | ||
| /* else if( !strcmp(datas->cureltname, "deviceType") ) | ||
| dstmember = datas->devicetype_tmp;*/ | ||
| if(dstmember) | ||
| { | ||
| if(l>=MINIUPNPC_URL_MAXSIZE) | ||
| l = MINIUPNPC_URL_MAXSIZE-1; | ||
| memcpy(dstmember, data, l); | ||
| dstmember[l] = '\0'; | ||
| } | ||
| } | ||
|
|
||
| void printIGD(struct IGDdatas * d) | ||
| { | ||
| printf("urlbase = '%s'\n", d->urlbase); | ||
| printf("WAN Device (Common interface config) :\n"); | ||
| /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/ | ||
| printf(" serviceType = '%s'\n", d->CIF.servicetype); | ||
| printf(" controlURL = '%s'\n", d->CIF.controlurl); | ||
| printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl); | ||
| printf(" SCPDURL = '%s'\n", d->CIF.scpdurl); | ||
| printf("primary WAN Connection Device (IP or PPP Connection):\n"); | ||
| /*printf(" deviceType = '%s'\n", d->first.devicetype);*/ | ||
| printf(" servicetype = '%s'\n", d->first.servicetype); | ||
| printf(" controlURL = '%s'\n", d->first.controlurl); | ||
| printf(" eventSubURL = '%s'\n", d->first.eventsuburl); | ||
| printf(" SCPDURL = '%s'\n", d->first.scpdurl); | ||
| printf("secondary WAN Connection Device (IP or PPP Connection):\n"); | ||
| /*printf(" deviceType = '%s'\n", d->second.devicetype);*/ | ||
| printf(" servicetype = '%s'\n", d->second.servicetype); | ||
| printf(" controlURL = '%s'\n", d->second.controlurl); | ||
| printf(" eventSubURL = '%s'\n", d->second.eventsuburl); | ||
| printf(" SCPDURL = '%s'\n", d->second.scpdurl); | ||
| printf("WAN IPv6 Firewall Control :\n"); | ||
| /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/ | ||
| printf(" servicetype = '%s'\n", d->IPv6FC.servicetype); | ||
| printf(" controlURL = '%s'\n", d->IPv6FC.controlurl); | ||
| printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl); | ||
| printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl); | ||
| } | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| /* $Id: igd_desc_parse.h,v 1.11 2012/10/16 16:49:02 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * http://miniupnp.free.fr/ | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005-2010 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. | ||
| * */ | ||
| #ifndef IGD_DESC_PARSE_H_INCLUDED | ||
| #define IGD_DESC_PARSE_H_INCLUDED | ||
|
|
||
| /* Structure to store the result of the parsing of UPnP | ||
| * descriptions of Internet Gateway Devices */ | ||
| #define MINIUPNPC_URL_MAXSIZE (128) | ||
| struct IGDdatas_service { | ||
| char controlurl[MINIUPNPC_URL_MAXSIZE]; | ||
| char eventsuburl[MINIUPNPC_URL_MAXSIZE]; | ||
| char scpdurl[MINIUPNPC_URL_MAXSIZE]; | ||
| char servicetype[MINIUPNPC_URL_MAXSIZE]; | ||
| /*char devicetype[MINIUPNPC_URL_MAXSIZE];*/ | ||
| }; | ||
|
|
||
| struct IGDdatas { | ||
| char cureltname[MINIUPNPC_URL_MAXSIZE]; | ||
| char urlbase[MINIUPNPC_URL_MAXSIZE]; | ||
| char presentationurl[MINIUPNPC_URL_MAXSIZE]; | ||
| int level; | ||
| /*int state;*/ | ||
| /* "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" */ | ||
| struct IGDdatas_service CIF; | ||
| /* "urn:schemas-upnp-org:service:WANIPConnection:1" | ||
| * "urn:schemas-upnp-org:service:WANPPPConnection:1" */ | ||
| struct IGDdatas_service first; | ||
| /* if both WANIPConnection and WANPPPConnection are present */ | ||
| struct IGDdatas_service second; | ||
| /* "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1" */ | ||
| struct IGDdatas_service IPv6FC; | ||
| /* tmp */ | ||
| struct IGDdatas_service tmp; | ||
| }; | ||
|
|
||
| void IGDstartelt(void *, const char *, int); | ||
| void IGDendelt(void *, const char *, int); | ||
| void IGDdata(void *, const char *, int); | ||
| void printIGD(struct IGDdatas *); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,121 @@ | ||
| /* $Id: minisoap.c,v 1.22 2012/01/21 13:30:31 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. | ||
| * | ||
| * Minimal SOAP implementation for UPnP protocol. | ||
| */ | ||
| #include <stdio.h> | ||
| #include <string.h> | ||
| #ifdef _WIN32 | ||
| #include <io.h> | ||
| #include <winsock2.h> | ||
| #define snprintf _snprintf | ||
| #else | ||
| #include <unistd.h> | ||
| #include <sys/types.h> | ||
| #include <sys/socket.h> | ||
| #endif | ||
| #include "minisoap.h" | ||
| #include "miniupnpcstrings.h" | ||
|
|
||
| /* only for malloc */ | ||
| #include <stdlib.h> | ||
|
|
||
| #ifdef _WIN32 | ||
| #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); | ||
| #else | ||
| #define PRINT_SOCKET_ERROR(x) perror(x) | ||
| #endif | ||
|
|
||
| /* httpWrite sends the headers and the body to the socket | ||
| * and returns the number of bytes sent */ | ||
| static int | ||
| httpWrite(int fd, const char * body, int bodysize, | ||
| const char * headers, int headerssize) | ||
| { | ||
| int n = 0; | ||
| /*n = write(fd, headers, headerssize);*/ | ||
| /*if(bodysize>0) | ||
| n += write(fd, body, bodysize);*/ | ||
| /* Note : my old linksys router only took into account | ||
| * soap request that are sent into only one packet */ | ||
| char * p; | ||
| /* TODO: AVOID MALLOC */ | ||
| p = malloc(headerssize+bodysize); | ||
| if(!p) | ||
| return 0; | ||
| memcpy(p, headers, headerssize); | ||
| memcpy(p+headerssize, body, bodysize); | ||
| /*n = write(fd, p, headerssize+bodysize);*/ | ||
| n = send(fd, p, headerssize+bodysize, 0); | ||
| if(n<0) { | ||
| PRINT_SOCKET_ERROR("send"); | ||
| } | ||
| /* disable send on the socket */ | ||
| /* draytek routers dont seems to like that... */ | ||
| #if 0 | ||
| #ifdef _WIN32 | ||
| if(shutdown(fd, SD_SEND)<0) { | ||
| #else | ||
| if(shutdown(fd, SHUT_WR)<0) { /*SD_SEND*/ | ||
| #endif | ||
| PRINT_SOCKET_ERROR("shutdown"); | ||
| } | ||
| #endif | ||
| free(p); | ||
| return n; | ||
| } | ||
|
|
||
| /* self explanatory */ | ||
| int soapPostSubmit(int fd, | ||
| const char * url, | ||
| const char * host, | ||
| unsigned short port, | ||
| const char * action, | ||
| const char * body, | ||
| const char * httpversion) | ||
| { | ||
| int bodysize; | ||
| char headerbuf[512]; | ||
| int headerssize; | ||
| char portstr[8]; | ||
| bodysize = (int)strlen(body); | ||
| /* We are not using keep-alive HTTP connections. | ||
| * HTTP/1.1 needs the header Connection: close to do that. | ||
| * This is the default with HTTP/1.0 | ||
| * Using HTTP/1.1 means we need to support chunked transfer-encoding : | ||
| * When using HTTP/1.1, the router "BiPAC 7404VNOX" always use chunked | ||
| * transfer encoding. */ | ||
| /* Connection: Close is normally there only in HTTP/1.1 but who knows */ | ||
| portstr[0] = '\0'; | ||
| if(port != 80) | ||
| snprintf(portstr, sizeof(portstr), ":%hu", port); | ||
| headerssize = snprintf(headerbuf, sizeof(headerbuf), | ||
| "POST %s HTTP/%s\r\n" | ||
| "Host: %s%s\r\n" | ||
| "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" | ||
| "Content-Length: %d\r\n" | ||
| "Content-Type: text/xml\r\n" | ||
| "SOAPAction: \"%s\"\r\n" | ||
| "Connection: Close\r\n" | ||
| "Cache-Control: no-cache\r\n" /* ??? */ | ||
| "Pragma: no-cache\r\n" | ||
| "\r\n", | ||
| url, httpversion, host, portstr, bodysize, action); | ||
| #ifdef DEBUG | ||
| /*printf("SOAP request : headersize=%d bodysize=%d\n", | ||
| headerssize, bodysize); | ||
| */ | ||
| printf("SOAP request : POST %s HTTP/%s - Host: %s%s\n", | ||
| url, httpversion, host, portstr); | ||
| printf("SOAPAction: \"%s\" - Content-Length: %d\n", action, bodysize); | ||
| printf("Headers :\n%s", headerbuf); | ||
| printf("Body :\n%s\n", body); | ||
| #endif | ||
| return httpWrite(fd, body, bodysize, headerbuf, headerssize); | ||
| } | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| /* $Id: minisoap.h,v 1.5 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. */ | ||
| #ifndef MINISOAP_H_INCLUDED | ||
| #define MINISOAP_H_INCLUDED | ||
|
|
||
| /*int httpWrite(int, const char *, int, const char *);*/ | ||
| int soapPostSubmit(int, const char *, const char *, unsigned short, | ||
| const char *, const char *, const char *); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,133 @@ | ||
| /* $Id: minissdpc.c,v 1.16 2012/03/05 19:42:46 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Web : http://miniupnp.free.fr/ | ||
| * Author : Thomas BERNARD | ||
| * copyright (c) 2005-2012 Thomas Bernard | ||
| * This software is subjet to the conditions detailed in the | ||
| * provided LICENCE file. */ | ||
| /*#include <syslog.h>*/ | ||
| #include <stdio.h> | ||
| #include <string.h> | ||
| #include <stdlib.h> | ||
| #include <unistd.h> | ||
| #include <sys/types.h> | ||
| #if defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__) | ||
| #ifdef _WIN32 | ||
| #include <winsock2.h> | ||
| #include <ws2tcpip.h> | ||
| #include <io.h> | ||
| #include <winsock.h> | ||
| #include <stdint.h> | ||
| #endif | ||
| #if defined(__amigaos__) || defined(__amigaos4__) | ||
| #include <sys/socket.h> | ||
| #endif | ||
| #if defined(__amigaos__) | ||
| #define uint16_t unsigned short | ||
| #endif | ||
| /* Hack */ | ||
| #define UNIX_PATH_LEN 108 | ||
| struct sockaddr_un { | ||
| uint16_t sun_family; | ||
| char sun_path[UNIX_PATH_LEN]; | ||
| }; | ||
| #else | ||
| #include <sys/socket.h> | ||
| #include <sys/un.h> | ||
| #endif | ||
|
|
||
| #include "minissdpc.h" | ||
| #include "miniupnpc.h" | ||
|
|
||
| #include "codelength.h" | ||
|
|
||
| struct UPNPDev * | ||
| getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath) | ||
| { | ||
| struct UPNPDev * tmp; | ||
| struct UPNPDev * devlist = NULL; | ||
| unsigned char buffer[2048]; | ||
| ssize_t n; | ||
| unsigned char * p; | ||
| unsigned char * url; | ||
| unsigned int i; | ||
| unsigned int urlsize, stsize, usnsize, l; | ||
| int s; | ||
| struct sockaddr_un addr; | ||
|
|
||
| s = socket(AF_UNIX, SOCK_STREAM, 0); | ||
| if(s < 0) | ||
| { | ||
| /*syslog(LOG_ERR, "socket(unix): %m");*/ | ||
| perror("socket(unix)"); | ||
| return NULL; | ||
| } | ||
| addr.sun_family = AF_UNIX; | ||
| strncpy(addr.sun_path, socketpath, sizeof(addr.sun_path)); | ||
| /* TODO : check if we need to handle the EINTR */ | ||
| if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) | ||
| { | ||
| /*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/ | ||
| close(s); | ||
| return NULL; | ||
| } | ||
| stsize = strlen(devtype); | ||
| buffer[0] = 1; /* request type 1 : request devices/services by type */ | ||
| p = buffer + 1; | ||
| l = stsize; CODELENGTH(l, p); | ||
| if(p + stsize > buffer + sizeof(buffer)) | ||
| { | ||
| /* devtype is too long ! */ | ||
| close(s); | ||
| return NULL; | ||
| } | ||
| memcpy(p, devtype, stsize); | ||
| p += stsize; | ||
| if(write(s, buffer, p - buffer) < 0) | ||
| { | ||
| /*syslog(LOG_ERR, "write(): %m");*/ | ||
| perror("minissdpc.c: write()"); | ||
| close(s); | ||
| return NULL; | ||
| } | ||
| n = read(s, buffer, sizeof(buffer)); | ||
| if(n<=0) | ||
| { | ||
| perror("minissdpc.c: read()"); | ||
| close(s); | ||
| return NULL; | ||
| } | ||
| p = buffer + 1; | ||
| for(i = 0; i < buffer[0]; i++) | ||
| { | ||
| if(p+2>=buffer+sizeof(buffer)) | ||
| break; | ||
| DECODELENGTH(urlsize, p); | ||
| if(p+urlsize+2>=buffer+sizeof(buffer)) | ||
| break; | ||
| url = p; | ||
| p += urlsize; | ||
| DECODELENGTH(stsize, p); | ||
| if(p+stsize+2>=buffer+sizeof(buffer)) | ||
| break; | ||
| tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize); | ||
| tmp->pNext = devlist; | ||
| tmp->descURL = tmp->buffer; | ||
| tmp->st = tmp->buffer + 1 + urlsize; | ||
| memcpy(tmp->buffer, url, urlsize); | ||
| tmp->buffer[urlsize] = '\0'; | ||
| memcpy(tmp->buffer + urlsize + 1, p, stsize); | ||
| p += stsize; | ||
| tmp->buffer[urlsize+1+stsize] = '\0'; | ||
| devlist = tmp; | ||
| /* added for compatibility with recent versions of MiniSSDPd | ||
| * >= 2007/12/19 */ | ||
| DECODELENGTH(usnsize, p); | ||
| p += usnsize; | ||
| if(p>buffer + sizeof(buffer)) | ||
| break; | ||
| } | ||
| close(s); | ||
| return devlist; | ||
| } | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| /* $Id: minissdpc.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Project: miniupnp | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * Author: Thomas Bernard | ||
| * Copyright (c) 2005-2007 Thomas Bernard | ||
| * This software is subjects to the conditions detailed | ||
| * in the LICENCE file provided within this distribution */ | ||
| #ifndef MINISSDPC_H_INCLUDED | ||
| #define MINISSDPC_H_INCLUDED | ||
|
|
||
| struct UPNPDev * | ||
| getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| LIBRARY | ||
| ; miniupnpc library | ||
|
|
||
| EXPORTS | ||
| ; miniupnpc | ||
| upnpDiscover | ||
| freeUPNPDevlist | ||
| parserootdesc | ||
| UPNP_GetValidIGD | ||
| UPNP_GetIGDFromUrl | ||
| GetUPNPUrls | ||
| FreeUPNPUrls | ||
| ; miniwget | ||
| miniwget | ||
| miniwget_getaddr | ||
| ; upnpcommands | ||
| UPNP_GetTotalBytesSent | ||
| UPNP_GetTotalBytesReceived | ||
| UPNP_GetTotalPacketsSent | ||
| UPNP_GetTotalPacketsReceived | ||
| UPNP_GetStatusInfo | ||
| UPNP_GetConnectionTypeInfo | ||
| UPNP_GetExternalIPAddress | ||
| UPNP_GetLinkLayerMaxBitRates | ||
| UPNP_AddPortMapping | ||
| UPNP_DeletePortMapping | ||
| UPNP_GetPortMappingNumberOfEntries | ||
| UPNP_GetSpecificPortMappingEntry | ||
| UPNP_GetGenericPortMappingEntry | ||
| UPNP_GetListOfPortMappings | ||
| UPNP_AddPinhole | ||
| UPNP_CheckPinholeWorking | ||
| UPNP_UpdatePinhole | ||
| UPNP_GetPinholePackets | ||
| UPNP_DeletePinhole | ||
| UPNP_GetFirewallStatus | ||
| UPNP_GetOutboundPinholeTimeout | ||
| ; upnperrors | ||
| strupnperror | ||
| ; portlistingparse | ||
| ParsePortListing | ||
| FreePortListing |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,130 @@ | ||
| /* $Id: miniupnpc.h,v 1.32 2013/02/06 14:44:42 nanard Exp $ */ | ||
| /* Project: miniupnp | ||
| * http://miniupnp.free.fr/ | ||
| * Author: Thomas Bernard | ||
| * Copyright (c) 2005-2012 Thomas Bernard | ||
| * This software is subjects to the conditions detailed | ||
| * in the LICENCE file provided within this distribution */ | ||
| #ifndef MINIUPNPC_H_INCLUDED | ||
| #define MINIUPNPC_H_INCLUDED | ||
|
|
||
| #include "declspec.h" | ||
| #include "igd_desc_parse.h" | ||
|
|
||
| /* error codes : */ | ||
| #define UPNPDISCOVER_SUCCESS (0) | ||
| #define UPNPDISCOVER_UNKNOWN_ERROR (-1) | ||
| #define UPNPDISCOVER_SOCKET_ERROR (-101) | ||
| #define UPNPDISCOVER_MEMORY_ERROR (-102) | ||
|
|
||
| /* versions : */ | ||
| #define MINIUPNPC_VERSION "1.8.20130503" | ||
| #define MINIUPNPC_API_VERSION 9 | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* Structures definitions : */ | ||
| struct UPNParg { const char * elt; const char * val; }; | ||
|
|
||
| char * | ||
| simpleUPnPcommand(int, const char *, const char *, | ||
| const char *, struct UPNParg *, | ||
| int *); | ||
|
|
||
| struct UPNPDev { | ||
| struct UPNPDev * pNext; | ||
| char * descURL; | ||
| char * st; | ||
| unsigned int scope_id; | ||
| char buffer[2]; | ||
| }; | ||
|
|
||
| /* upnpDiscover() | ||
| * discover UPnP devices on the network. | ||
| * The discovered devices are returned as a chained list. | ||
| * It is up to the caller to free the list with freeUPNPDevlist(). | ||
| * delay (in millisecond) is the maximum time for waiting any device | ||
| * response. | ||
| * If available, device list will be obtained from MiniSSDPd. | ||
| * Default path for minissdpd socket will be used if minissdpdsock argument | ||
| * is NULL. | ||
| * If multicastif is not NULL, it will be used instead of the default | ||
| * multicast interface for sending SSDP discover packets. | ||
| * If sameport is not null, SSDP packets will be sent from the source port | ||
| * 1900 (same as destination port) otherwise system assign a source port. */ | ||
| LIBSPEC struct UPNPDev * | ||
| upnpDiscover(int delay, const char * multicastif, | ||
| const char * minissdpdsock, int sameport, | ||
| int ipv6, | ||
| int * error); | ||
| /* freeUPNPDevlist() | ||
| * free list returned by upnpDiscover() */ | ||
| LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist); | ||
|
|
||
| /* parserootdesc() : | ||
| * parse root XML description of a UPnP device and fill the IGDdatas | ||
| * structure. */ | ||
| LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *); | ||
|
|
||
| /* structure used to get fast access to urls | ||
| * controlURL: controlURL of the WANIPConnection | ||
| * ipcondescURL: url of the description of the WANIPConnection | ||
| * controlURL_CIF: controlURL of the WANCommonInterfaceConfig | ||
| * controlURL_6FC: controlURL of the WANIPv6FirewallControl | ||
| */ | ||
| struct UPNPUrls { | ||
| char * controlURL; | ||
| char * ipcondescURL; | ||
| char * controlURL_CIF; | ||
| char * controlURL_6FC; | ||
| char * rootdescURL; | ||
| }; | ||
|
|
||
| /* UPNP_GetValidIGD() : | ||
| * return values : | ||
| * 0 = NO IGD found | ||
| * 1 = A valid connected IGD has been found | ||
| * 2 = A valid IGD has been found but it reported as | ||
| * not connected | ||
| * 3 = an UPnP device has been found but was not recognized as an IGD | ||
| * | ||
| * In any non zero return case, the urls and data structures | ||
| * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to | ||
| * free allocated memory. | ||
| */ | ||
| LIBSPEC int | ||
| UPNP_GetValidIGD(struct UPNPDev * devlist, | ||
| struct UPNPUrls * urls, | ||
| struct IGDdatas * data, | ||
| char * lanaddr, int lanaddrlen); | ||
|
|
||
| /* UPNP_GetIGDFromUrl() | ||
| * Used when skipping the discovery process. | ||
| * return value : | ||
| * 0 - Not ok | ||
| * 1 - OK */ | ||
| LIBSPEC int | ||
| UPNP_GetIGDFromUrl(const char * rootdescurl, | ||
| struct UPNPUrls * urls, | ||
| struct IGDdatas * data, | ||
| char * lanaddr, int lanaddrlen); | ||
|
|
||
| LIBSPEC void | ||
| GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, | ||
| const char *, unsigned int); | ||
|
|
||
| LIBSPEC void | ||
| FreeUPNPUrls(struct UPNPUrls *); | ||
|
|
||
| /* return 0 or 1 */ | ||
| LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); | ||
|
|
||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| /* $Id: miniupnpcstrings.h.in,v 1.5 2012/10/16 16:48:26 nanard Exp $ */ | ||
| /* Project: miniupnp | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * Author: Thomas Bernard | ||
| * Copyright (c) 2005-2011 Thomas Bernard | ||
| * This software is subjects to the conditions detailed | ||
| * in the LICENCE file provided within this distribution */ | ||
| #ifndef MINIUPNPCSTRINGS_H_INCLUDED | ||
| #define MINIUPNPCSTRINGS_H_INCLUDED | ||
|
|
||
| #if defined(_WIN32) | ||
| #define OS_STRING "Windows" | ||
| #elif defined(__linux__) | ||
| #define OS_STRING "Linux" | ||
| #elif defined(__OSX__) | ||
| #define OS_STRING "Mac OS X" | ||
| #elif defined(__APPLE__) | ||
| #define OS_STRING "Mac OS X" | ||
| #elif defined(__DARWIN__) | ||
| #define OS_STRING "Darwin" | ||
| #else | ||
| #define OS_STRING "Generic" | ||
| #endif | ||
| #define MINIUPNPC_VERSION_STRING "1.7" | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /* $Id: miniupnpctypes.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Miniupnp project : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2011 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided within this distribution */ | ||
| #ifndef MINIUPNPCTYPES_H_INCLUDED | ||
| #define MINIUPNPCTYPES_H_INCLUDED | ||
|
|
||
| #if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) | ||
| #define UNSIGNED_INTEGER unsigned long long | ||
| #define STRTOUI strtoull | ||
| #else | ||
| #define UNSIGNED_INTEGER unsigned int | ||
| #define STRTOUI strtoul | ||
| #endif | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| /* $Id: miniwget.h,v 1.8 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. | ||
| * */ | ||
| #ifndef MINIWGET_H_INCLUDED | ||
| #define MINIWGET_H_INCLUDED | ||
|
|
||
| #include "declspec.h" | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| LIBSPEC void * getHTTPResponse(int s, int * size); | ||
|
|
||
| LIBSPEC void * miniwget(const char *, int *, unsigned int); | ||
|
|
||
| LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int); | ||
|
|
||
| int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,216 @@ | ||
| /* $Id: minixml.c,v 1.10 2012/03/05 19:42:47 nanard Exp $ */ | ||
| /* minixml.c : the minimum size a xml parser can be ! */ | ||
| /* Project : miniupnp | ||
| * webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * Author : Thomas Bernard | ||
| Copyright (c) 2005-2011, Thomas BERNARD | ||
| 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. | ||
| * The name of the author may not be used to endorse or promote products | ||
| derived from this software without specific prior written permission. | ||
| THIS SOFTWARE IS PROVIDED BY THE 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. | ||
| */ | ||
| #include <string.h> | ||
| #include "minixml.h" | ||
|
|
||
| /* parseatt : used to parse the argument list | ||
| * return 0 (false) in case of success and -1 (true) if the end | ||
| * of the xmlbuffer is reached. */ | ||
| static int parseatt(struct xmlparser * p) | ||
| { | ||
| const char * attname; | ||
| int attnamelen; | ||
| const char * attvalue; | ||
| int attvaluelen; | ||
| while(p->xml < p->xmlend) | ||
| { | ||
| if(*p->xml=='/' || *p->xml=='>') | ||
| return 0; | ||
| if( !IS_WHITE_SPACE(*p->xml) ) | ||
| { | ||
| char sep; | ||
| attname = p->xml; | ||
| attnamelen = 0; | ||
| while(*p->xml!='=' && !IS_WHITE_SPACE(*p->xml) ) | ||
| { | ||
| attnamelen++; p->xml++; | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| } | ||
| while(*(p->xml++) != '=') | ||
| { | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| } | ||
| while(IS_WHITE_SPACE(*p->xml)) | ||
| { | ||
| p->xml++; | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| } | ||
| sep = *p->xml; | ||
| if(sep=='\'' || sep=='\"') | ||
| { | ||
| p->xml++; | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| attvalue = p->xml; | ||
| attvaluelen = 0; | ||
| while(*p->xml != sep) | ||
| { | ||
| attvaluelen++; p->xml++; | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| } | ||
| } | ||
| else | ||
| { | ||
| attvalue = p->xml; | ||
| attvaluelen = 0; | ||
| while( !IS_WHITE_SPACE(*p->xml) | ||
| && *p->xml != '>' && *p->xml != '/') | ||
| { | ||
| attvaluelen++; p->xml++; | ||
| if(p->xml >= p->xmlend) | ||
| return -1; | ||
| } | ||
| } | ||
| /*printf("%.*s='%.*s'\n", | ||
| attnamelen, attname, attvaluelen, attvalue);*/ | ||
| if(p->attfunc) | ||
| p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen); | ||
| } | ||
| p->xml++; | ||
| } | ||
| return -1; | ||
| } | ||
|
|
||
| /* parseelt parse the xml stream and | ||
| * call the callback functions when needed... */ | ||
| static void parseelt(struct xmlparser * p) | ||
| { | ||
| int i; | ||
| const char * elementname; | ||
| while(p->xml < (p->xmlend - 1)) | ||
| { | ||
| if((p->xml)[0]=='<' && (p->xml)[1]!='?') | ||
| { | ||
| i = 0; elementname = ++p->xml; | ||
| while( !IS_WHITE_SPACE(*p->xml) | ||
| && (*p->xml!='>') && (*p->xml!='/') | ||
| ) | ||
| { | ||
| i++; p->xml++; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| /* to ignore namespace : */ | ||
| if(*p->xml==':') | ||
| { | ||
| i = 0; | ||
| elementname = ++p->xml; | ||
| } | ||
| } | ||
| if(i>0) | ||
| { | ||
| if(p->starteltfunc) | ||
| p->starteltfunc(p->data, elementname, i); | ||
| if(parseatt(p)) | ||
| return; | ||
| if(*p->xml!='/') | ||
| { | ||
| const char * data; | ||
| i = 0; data = ++p->xml; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| while( IS_WHITE_SPACE(*p->xml) ) | ||
| { | ||
| i++; p->xml++; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| } | ||
| if(memcmp(p->xml, "<![CDATA[", 9) == 0) | ||
| { | ||
| /* CDATA handling */ | ||
| p->xml += 9; | ||
| data = p->xml; | ||
| i = 0; | ||
| while(memcmp(p->xml, "]]>", 3) != 0) | ||
| { | ||
| i++; p->xml++; | ||
| if ((p->xml + 3) >= p->xmlend) | ||
| return; | ||
| } | ||
| if(i>0 && p->datafunc) | ||
| p->datafunc(p->data, data, i); | ||
| while(*p->xml!='<') | ||
| { | ||
| p->xml++; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| } | ||
| } | ||
| else | ||
| { | ||
| while(*p->xml!='<') | ||
| { | ||
| i++; p->xml++; | ||
| if ((p->xml + 1) >= p->xmlend) | ||
| return; | ||
| } | ||
| if(i>0 && p->datafunc && *(p->xml + 1) == '/') | ||
| p->datafunc(p->data, data, i); | ||
| } | ||
| } | ||
| } | ||
| else if(*p->xml == '/') | ||
| { | ||
| i = 0; elementname = ++p->xml; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| while((*p->xml != '>')) | ||
| { | ||
| i++; p->xml++; | ||
| if (p->xml >= p->xmlend) | ||
| return; | ||
| } | ||
| if(p->endeltfunc) | ||
| p->endeltfunc(p->data, elementname, i); | ||
| p->xml++; | ||
| } | ||
| } | ||
| else | ||
| { | ||
| p->xml++; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* the parser must be initialized before calling this function */ | ||
| void parsexml(struct xmlparser * parser) | ||
| { | ||
| parser->xml = parser->xmlstart; | ||
| parser->xmlend = parser->xmlstart + parser->xmlsize; | ||
| parseelt(parser); | ||
| } | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| /* $Id: minixml.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* minimal xml parser | ||
| * | ||
| * Project : miniupnp | ||
| * Website : http://miniupnp.free.fr/ | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. | ||
| * */ | ||
| #ifndef MINIXML_H_INCLUDED | ||
| #define MINIXML_H_INCLUDED | ||
| #define IS_WHITE_SPACE(c) ((c==' ') || (c=='\t') || (c=='\r') || (c=='\n')) | ||
|
|
||
| /* if a callback function pointer is set to NULL, | ||
| * the function is not called */ | ||
| struct xmlparser { | ||
| const char *xmlstart; | ||
| const char *xmlend; | ||
| const char *xml; /* pointer to current character */ | ||
| int xmlsize; | ||
| void * data; | ||
| void (*starteltfunc) (void *, const char *, int); | ||
| void (*endeltfunc) (void *, const char *, int); | ||
| void (*datafunc) (void *, const char *, int); | ||
| void (*attfunc) (void *, const char *, int, const char *, int); | ||
| }; | ||
|
|
||
| /* parsexml() | ||
| * the xmlparser structure must be initialized before the call | ||
| * the following structure members have to be initialized : | ||
| * xmlstart, xmlsize, data, *func | ||
| * xml is for internal usage, xmlend is computed automatically */ | ||
| void parsexml(struct xmlparser *); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,159 @@ | ||
| /* $Id: portlistingparse.c,v 1.6 2012/05/29 10:26:51 nanard Exp $ */ | ||
| /* MiniUPnP project | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * (c) 2011 Thomas Bernard | ||
| * This software is subject to the conditions detailed | ||
| * in the LICENCE file provided within the distribution */ | ||
| #include <string.h> | ||
| #include <stdlib.h> | ||
| #include "portlistingparse.h" | ||
| #include "minixml.h" | ||
|
|
||
| /* list of the elements */ | ||
| static const struct { | ||
| const portMappingElt code; | ||
| const char * const str; | ||
| } elements[] = { | ||
| { PortMappingEntry, "PortMappingEntry"}, | ||
| { NewRemoteHost, "NewRemoteHost"}, | ||
| { NewExternalPort, "NewExternalPort"}, | ||
| { NewProtocol, "NewProtocol"}, | ||
| { NewInternalPort, "NewInternalPort"}, | ||
| { NewInternalClient, "NewInternalClient"}, | ||
| { NewEnabled, "NewEnabled"}, | ||
| { NewDescription, "NewDescription"}, | ||
| { NewLeaseTime, "NewLeaseTime"}, | ||
| { PortMappingEltNone, NULL} | ||
| }; | ||
|
|
||
| /* Helper function */ | ||
| static UNSIGNED_INTEGER | ||
| atoui(const char * p, int l) | ||
| { | ||
| UNSIGNED_INTEGER r = 0; | ||
| while(l > 0 && *p) | ||
| { | ||
| if(*p >= '0' && *p <= '9') | ||
| r = r*10 + (*p - '0'); | ||
| else | ||
| break; | ||
| p++; | ||
| l--; | ||
| } | ||
| return r; | ||
| } | ||
|
|
||
| /* Start element handler */ | ||
| static void | ||
| startelt(void * d, const char * name, int l) | ||
| { | ||
| int i; | ||
| struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; | ||
| pdata->curelt = PortMappingEltNone; | ||
| for(i = 0; elements[i].str; i++) | ||
| { | ||
| if(memcmp(name, elements[i].str, l) == 0) | ||
| { | ||
| pdata->curelt = elements[i].code; | ||
| break; | ||
| } | ||
| } | ||
| if(pdata->curelt == PortMappingEntry) | ||
| { | ||
| struct PortMapping * pm; | ||
| pm = calloc(1, sizeof(struct PortMapping)); | ||
| LIST_INSERT_HEAD( &(pdata->head), pm, entries); | ||
| } | ||
| } | ||
|
|
||
| /* End element handler */ | ||
| static void | ||
| endelt(void * d, const char * name, int l) | ||
| { | ||
| struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; | ||
| (void)name; | ||
| (void)l; | ||
| pdata->curelt = PortMappingEltNone; | ||
| } | ||
|
|
||
| /* Data handler */ | ||
| static void | ||
| data(void * d, const char * data, int l) | ||
| { | ||
| struct PortMapping * pm; | ||
| struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; | ||
| pm = pdata->head.lh_first; | ||
| if(!pm) | ||
| return; | ||
| if(l > 63) | ||
| l = 63; | ||
| switch(pdata->curelt) | ||
| { | ||
| case NewRemoteHost: | ||
| memcpy(pm->remoteHost, data, l); | ||
| pm->remoteHost[l] = '\0'; | ||
| break; | ||
| case NewExternalPort: | ||
| pm->externalPort = (unsigned short)atoui(data, l); | ||
| break; | ||
| case NewProtocol: | ||
| if(l > 3) | ||
| l = 3; | ||
| memcpy(pm->protocol, data, l); | ||
| pm->protocol[l] = '\0'; | ||
| break; | ||
| case NewInternalPort: | ||
| pm->internalPort = (unsigned short)atoui(data, l); | ||
| break; | ||
| case NewInternalClient: | ||
| memcpy(pm->internalClient, data, l); | ||
| pm->internalClient[l] = '\0'; | ||
| break; | ||
| case NewEnabled: | ||
| pm->enabled = (unsigned char)atoui(data, l); | ||
| break; | ||
| case NewDescription: | ||
| memcpy(pm->description, data, l); | ||
| pm->description[l] = '\0'; | ||
| break; | ||
| case NewLeaseTime: | ||
| pm->leaseTime = atoui(data, l); | ||
| break; | ||
| default: | ||
| break; | ||
| } | ||
| } | ||
|
|
||
|
|
||
| /* Parse the PortMappingList XML document for IGD version 2 | ||
| */ | ||
| void | ||
| ParsePortListing(const char * buffer, int bufsize, | ||
| struct PortMappingParserData * pdata) | ||
| { | ||
| struct xmlparser parser; | ||
|
|
||
| memset(pdata, 0, sizeof(struct PortMappingParserData)); | ||
| LIST_INIT(&(pdata->head)); | ||
| /* init xmlparser */ | ||
| parser.xmlstart = buffer; | ||
| parser.xmlsize = bufsize; | ||
| parser.data = pdata; | ||
| parser.starteltfunc = startelt; | ||
| parser.endeltfunc = endelt; | ||
| parser.datafunc = data; | ||
| parser.attfunc = 0; | ||
| parsexml(&parser); | ||
| } | ||
|
|
||
| void | ||
| FreePortListing(struct PortMappingParserData * pdata) | ||
| { | ||
| struct PortMapping * pm; | ||
| while((pm = pdata->head.lh_first) != NULL) | ||
| { | ||
| LIST_REMOVE(pm, entries); | ||
| free(pm); | ||
| } | ||
| } | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,71 @@ | ||
| /* $Id: portlistingparse.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* MiniUPnP project | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * (c) 2011-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed | ||
| * in the LICENCE file provided within the distribution */ | ||
| #ifndef PORTLISTINGPARSE_H_INCLUDED | ||
| #define PORTLISTINGPARSE_H_INCLUDED | ||
|
|
||
| #include "declspec.h" | ||
| /* for the definition of UNSIGNED_INTEGER */ | ||
| #include "miniupnpctypes.h" | ||
|
|
||
| #if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__) | ||
| #include "bsdqueue.h" | ||
| #else | ||
| #include <sys/queue.h> | ||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* sample of PortMappingEntry : | ||
| <p:PortMappingEntry> | ||
| <p:NewRemoteHost>202.233.2.1</p:NewRemoteHost> | ||
| <p:NewExternalPort>2345</p:NewExternalPort> | ||
| <p:NewProtocol>TCP</p:NewProtocol> | ||
| <p:NewInternalPort>2345</p:NewInternalPort> | ||
| <p:NewInternalClient>192.168.1.137</p:NewInternalClient> | ||
| <p:NewEnabled>1</p:NewEnabled> | ||
| <p:NewDescription>dooom</p:NewDescription> | ||
| <p:NewLeaseTime>345</p:NewLeaseTime> | ||
| </p:PortMappingEntry> | ||
| */ | ||
| typedef enum { PortMappingEltNone, | ||
| PortMappingEntry, NewRemoteHost, | ||
| NewExternalPort, NewProtocol, | ||
| NewInternalPort, NewInternalClient, | ||
| NewEnabled, NewDescription, | ||
| NewLeaseTime } portMappingElt; | ||
|
|
||
| struct PortMapping { | ||
| LIST_ENTRY(PortMapping) entries; | ||
| UNSIGNED_INTEGER leaseTime; | ||
| unsigned short externalPort; | ||
| unsigned short internalPort; | ||
| char remoteHost[64]; | ||
| char internalClient[64]; | ||
| char description[64]; | ||
| char protocol[4]; | ||
| unsigned char enabled; | ||
| }; | ||
|
|
||
| struct PortMappingParserData { | ||
| LIST_HEAD(portmappinglisthead, PortMapping) head; | ||
| portMappingElt curelt; | ||
| }; | ||
|
|
||
| LIBSPEC void | ||
| ParsePortListing(const char * buffer, int bufsize, | ||
| struct PortMappingParserData * pdata); | ||
|
|
||
| LIBSPEC void | ||
| FreePortListing(struct PortMappingParserData * pdata); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| /* $Id: receivedata.c,v 1.4 2012/06/23 22:34:47 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Website : http://miniupnp.free.fr/ | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2011-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided in this distribution. */ | ||
|
|
||
| #include <stdio.h> | ||
| #ifdef _WIN32 | ||
| #include <winsock2.h> | ||
| #include <ws2tcpip.h> | ||
| #else | ||
| #include <unistd.h> | ||
| #if defined(__amigaos__) && !defined(__amigaos4__) | ||
| #define socklen_t int | ||
| #else /* #if defined(__amigaos__) && !defined(__amigaos4__) */ | ||
| #include <sys/select.h> | ||
| #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */ | ||
| #include <sys/socket.h> | ||
| #include <netinet/in.h> | ||
| #if !defined(__amigaos__) && !defined(__amigaos4__) | ||
| #include <poll.h> | ||
| #endif | ||
| #include <errno.h> | ||
| #define MINIUPNPC_IGNORE_EINTR | ||
| #endif | ||
|
|
||
| #ifdef _WIN32 | ||
| #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); | ||
| #else | ||
| #define PRINT_SOCKET_ERROR(x) perror(x) | ||
| #endif | ||
|
|
||
| #include "receivedata.h" | ||
|
|
||
| int | ||
| receivedata(int socket, | ||
| char * data, int length, | ||
| int timeout, unsigned int * scope_id) | ||
| { | ||
| #if MINIUPNPC_GET_SRC_ADDR | ||
| struct sockaddr_storage src_addr; | ||
| socklen_t src_addr_len = sizeof(src_addr); | ||
| #endif | ||
| int n; | ||
| #if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) | ||
| /* using poll */ | ||
| struct pollfd fds[1]; /* for the poll */ | ||
| #ifdef MINIUPNPC_IGNORE_EINTR | ||
| do { | ||
| #endif | ||
| fds[0].fd = socket; | ||
| fds[0].events = POLLIN; | ||
| n = poll(fds, 1, timeout); | ||
| #ifdef MINIUPNPC_IGNORE_EINTR | ||
| } while(n < 0 && errno == EINTR); | ||
| #endif | ||
| if(n < 0) { | ||
| PRINT_SOCKET_ERROR("poll"); | ||
| return -1; | ||
| } else if(n == 0) { | ||
| /* timeout */ | ||
| return 0; | ||
| } | ||
| #else /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */ | ||
| /* using select under _WIN32 and amigaos */ | ||
| fd_set socketSet; | ||
| TIMEVAL timeval; | ||
| FD_ZERO(&socketSet); | ||
| FD_SET(socket, &socketSet); | ||
| timeval.tv_sec = timeout / 1000; | ||
| timeval.tv_usec = (timeout % 1000) * 1000; | ||
| n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval); | ||
| if(n < 0) { | ||
| PRINT_SOCKET_ERROR("select"); | ||
| return -1; | ||
| } else if(n == 0) { | ||
| return 0; | ||
| } | ||
| #endif | ||
| #if MINIUPNPC_GET_SRC_ADDR | ||
| n = recvfrom(socket, data, length, 0, | ||
| (struct sockaddr *)&src_addr, &src_addr_len); | ||
| #else | ||
| n = recv(socket, data, length, 0); | ||
| #endif | ||
| if(n<0) { | ||
| PRINT_SOCKET_ERROR("recv"); | ||
| } | ||
| #if MINIUPNPC_GET_SRC_ADDR | ||
| if (src_addr.ss_family == AF_INET6) { | ||
| const struct sockaddr_in6 * src_addr6 = (struct sockaddr_in6 *)&src_addr; | ||
| #ifdef DEBUG | ||
| printf("scope_id=%u\n", src_addr6->sin6_scope_id); | ||
| #endif | ||
| if(scope_id) | ||
| *scope_id = src_addr6->sin6_scope_id; | ||
| } | ||
| #endif | ||
| return n; | ||
| } | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /* $Id: receivedata.h,v 1.4 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Project: miniupnp | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * Author: Thomas Bernard | ||
| * Copyright (c) 2011-2012 Thomas Bernard | ||
| * This software is subjects to the conditions detailed | ||
| * in the LICENCE file provided within this distribution */ | ||
| #ifndef RECEIVEDATA_H_INCLUDED | ||
| #define RECEIVEDATA_H_INCLUDED | ||
|
|
||
| /* Reads data from the specified socket. | ||
| * Returns the number of bytes read if successful, zero if no bytes were | ||
| * read or if we timed out. Returns negative if there was an error. */ | ||
| int receivedata(int socket, | ||
| char * data, int length, | ||
| int timeout, unsigned int * scope_id); | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,271 @@ | ||
| /* $Id: upnpcommands.h,v 1.25 2012/09/27 15:42:10 nanard Exp $ */ | ||
| /* Miniupnp project : http://miniupnp.free.fr/ | ||
| * Author : Thomas Bernard | ||
| * Copyright (c) 2005-2011 Thomas Bernard | ||
| * This software is subject to the conditions detailed in the | ||
| * LICENCE file provided within this distribution */ | ||
| #ifndef UPNPCOMMANDS_H_INCLUDED | ||
| #define UPNPCOMMANDS_H_INCLUDED | ||
|
|
||
| #include "upnpreplyparse.h" | ||
| #include "portlistingparse.h" | ||
| #include "declspec.h" | ||
| #include "miniupnpctypes.h" | ||
|
|
||
| /* MiniUPnPc return codes : */ | ||
| #define UPNPCOMMAND_SUCCESS (0) | ||
| #define UPNPCOMMAND_UNKNOWN_ERROR (-1) | ||
| #define UPNPCOMMAND_INVALID_ARGS (-2) | ||
| #define UPNPCOMMAND_HTTP_ERROR (-3) | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| LIBSPEC UNSIGNED_INTEGER | ||
| UPNP_GetTotalBytesSent(const char * controlURL, | ||
| const char * servicetype); | ||
|
|
||
| LIBSPEC UNSIGNED_INTEGER | ||
| UPNP_GetTotalBytesReceived(const char * controlURL, | ||
| const char * servicetype); | ||
|
|
||
| LIBSPEC UNSIGNED_INTEGER | ||
| UPNP_GetTotalPacketsSent(const char * controlURL, | ||
| const char * servicetype); | ||
|
|
||
| LIBSPEC UNSIGNED_INTEGER | ||
| UPNP_GetTotalPacketsReceived(const char * controlURL, | ||
| const char * servicetype); | ||
|
|
||
| /* UPNP_GetStatusInfo() | ||
| * status and lastconnerror are 64 byte buffers | ||
| * Return values : | ||
| * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR | ||
| * or a UPnP Error code */ | ||
| LIBSPEC int | ||
| UPNP_GetStatusInfo(const char * controlURL, | ||
| const char * servicetype, | ||
| char * status, | ||
| unsigned int * uptime, | ||
| char * lastconnerror); | ||
|
|
||
| /* UPNP_GetConnectionTypeInfo() | ||
| * argument connectionType is a 64 character buffer | ||
| * Return Values : | ||
| * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR | ||
| * or a UPnP Error code */ | ||
| LIBSPEC int | ||
| UPNP_GetConnectionTypeInfo(const char * controlURL, | ||
| const char * servicetype, | ||
| char * connectionType); | ||
|
|
||
| /* UPNP_GetExternalIPAddress() call the corresponding UPNP method. | ||
| * if the third arg is not null the value is copied to it. | ||
| * at least 16 bytes must be available | ||
| * | ||
| * Return values : | ||
| * 0 : SUCCESS | ||
| * NON ZERO : ERROR Either an UPnP error code or an unknown error. | ||
| * | ||
| * possible UPnP Errors : | ||
| * 402 Invalid Args - See UPnP Device Architecture section on Control. | ||
| * 501 Action Failed - See UPnP Device Architecture section on Control. */ | ||
| LIBSPEC int | ||
| UPNP_GetExternalIPAddress(const char * controlURL, | ||
| const char * servicetype, | ||
| char * extIpAdd); | ||
|
|
||
| /* UPNP_GetLinkLayerMaxBitRates() | ||
| * call WANCommonInterfaceConfig:1#GetCommonLinkProperties | ||
| * | ||
| * return values : | ||
| * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR | ||
| * or a UPnP Error Code. */ | ||
| LIBSPEC int | ||
| UPNP_GetLinkLayerMaxBitRates(const char* controlURL, | ||
| const char* servicetype, | ||
| unsigned int * bitrateDown, | ||
| unsigned int * bitrateUp); | ||
|
|
||
| /* UPNP_AddPortMapping() | ||
| * if desc is NULL, it will be defaulted to "libminiupnpc" | ||
| * remoteHost is usually NULL because IGD don't support it. | ||
| * | ||
| * Return values : | ||
| * 0 : SUCCESS | ||
| * NON ZERO : ERROR. Either an UPnP error code or an unknown error. | ||
| * | ||
| * List of possible UPnP errors for AddPortMapping : | ||
| * errorCode errorDescription (short) - Description (long) | ||
| * 402 Invalid Args - See UPnP Device Architecture section on Control. | ||
| * 501 Action Failed - See UPnP Device Architecture section on Control. | ||
| * 715 WildCardNotPermittedInSrcIP - The source IP address cannot be | ||
| * wild-carded | ||
| * 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded | ||
| * 718 ConflictInMappingEntry - The port mapping entry specified conflicts | ||
| * with a mapping assigned previously to another client | ||
| * 724 SamePortValuesRequired - Internal and External port values | ||
| * must be the same | ||
| * 725 OnlyPermanentLeasesSupported - The NAT implementation only supports | ||
| * permanent lease times on port mappings | ||
| * 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard | ||
| * and cannot be a specific IP address or DNS name | ||
| * 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and | ||
| * cannot be a specific port value */ | ||
| LIBSPEC int | ||
| UPNP_AddPortMapping(const char * controlURL, const char * servicetype, | ||
| const char * extPort, | ||
| const char * inPort, | ||
| const char * inClient, | ||
| const char * desc, | ||
| const char * proto, | ||
| const char * remoteHost, | ||
| const char * leaseDuration); | ||
|
|
||
| /* UPNP_DeletePortMapping() | ||
| * Use same argument values as what was used for AddPortMapping(). | ||
| * remoteHost is usually NULL because IGD don't support it. | ||
| * Return Values : | ||
| * 0 : SUCCESS | ||
| * NON ZERO : error. Either an UPnP error code or an undefined error. | ||
| * | ||
| * List of possible UPnP errors for DeletePortMapping : | ||
| * 402 Invalid Args - See UPnP Device Architecture section on Control. | ||
| * 714 NoSuchEntryInArray - The specified value does not exist in the array */ | ||
| LIBSPEC int | ||
| UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, | ||
| const char * extPort, const char * proto, | ||
| const char * remoteHost); | ||
|
|
||
| /* UPNP_GetPortMappingNumberOfEntries() | ||
| * not supported by all routers */ | ||
| LIBSPEC int | ||
| UPNP_GetPortMappingNumberOfEntries(const char* controlURL, | ||
| const char* servicetype, | ||
| unsigned int * num); | ||
|
|
||
| /* UPNP_GetSpecificPortMappingEntry() | ||
| * retrieves an existing port mapping | ||
| * params : | ||
| * in extPort | ||
| * in proto | ||
| * out intClient (16 bytes) | ||
| * out intPort (6 bytes) | ||
| * out desc (80 bytes) | ||
| * out enabled (4 bytes) | ||
| * out leaseDuration (16 bytes) | ||
| * | ||
| * return value : | ||
| * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR | ||
| * or a UPnP Error Code. */ | ||
| LIBSPEC int | ||
| UPNP_GetSpecificPortMappingEntry(const char * controlURL, | ||
| const char * servicetype, | ||
| const char * extPort, | ||
| const char * proto, | ||
| char * intClient, | ||
| char * intPort, | ||
| char * desc, | ||
| char * enabled, | ||
| char * leaseDuration); | ||
|
|
||
| /* UPNP_GetGenericPortMappingEntry() | ||
| * params : | ||
| * in index | ||
| * out extPort (6 bytes) | ||
| * out intClient (16 bytes) | ||
| * out intPort (6 bytes) | ||
| * out protocol (4 bytes) | ||
| * out desc (80 bytes) | ||
| * out enabled (4 bytes) | ||
| * out rHost (64 bytes) | ||
| * out duration (16 bytes) | ||
| * | ||
| * return value : | ||
| * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR | ||
| * or a UPnP Error Code. | ||
| * | ||
| * Possible UPNP Error codes : | ||
| * 402 Invalid Args - See UPnP Device Architecture section on Control. | ||
| * 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds | ||
| */ | ||
| LIBSPEC int | ||
| UPNP_GetGenericPortMappingEntry(const char * controlURL, | ||
| const char * servicetype, | ||
| const char * index, | ||
| char * extPort, | ||
| char * intClient, | ||
| char * intPort, | ||
| char * protocol, | ||
| char * desc, | ||
| char * enabled, | ||
| char * rHost, | ||
| char * duration); | ||
|
|
||
| /* UPNP_GetListOfPortMappings() Available in IGD v2 | ||
| * | ||
| * | ||
| * Possible UPNP Error codes : | ||
| * 606 Action not Authorized | ||
| * 730 PortMappingNotFound - no port mapping is found in the specified range. | ||
| * 733 InconsistantParameters - NewStartPort and NewEndPort values are not | ||
| * consistent. | ||
| */ | ||
| LIBSPEC int | ||
| UPNP_GetListOfPortMappings(const char * controlURL, | ||
| const char * servicetype, | ||
| const char * startPort, | ||
| const char * endPort, | ||
| const char * protocol, | ||
| const char * numberOfPorts, | ||
| struct PortMappingParserData * data); | ||
|
|
||
| /* IGD:2, functions for service WANIPv6FirewallControl:1 */ | ||
| LIBSPEC int | ||
| UPNP_GetFirewallStatus(const char * controlURL, | ||
| const char * servicetype, | ||
| int * firewallEnabled, | ||
| int * inboundPinholeAllowed); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype, | ||
| const char * remoteHost, | ||
| const char * remotePort, | ||
| const char * intClient, | ||
| const char * intPort, | ||
| const char * proto, | ||
| int * opTimeout); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_AddPinhole(const char * controlURL, const char * servicetype, | ||
| const char * remoteHost, | ||
| const char * remotePort, | ||
| const char * intClient, | ||
| const char * intPort, | ||
| const char * proto, | ||
| const char * leaseTime, | ||
| char * uniqueID); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_UpdatePinhole(const char * controlURL, const char * servicetype, | ||
| const char * uniqueID, | ||
| const char * leaseTime); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, | ||
| const char * uniqueID, int * isWorking); | ||
|
|
||
| LIBSPEC int | ||
| UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, | ||
| const char * uniqueID, int * packets); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| /* $Id: upnperrors.c,v 1.6 2012/03/15 01:02:03 nanard Exp $ */ | ||
| /* Project : miniupnp | ||
| * Author : Thomas BERNARD | ||
| * copyright (c) 2007 Thomas Bernard | ||
| * All Right reserved. | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * This software is subjet to the conditions detailed in the | ||
| * provided LICENCE file. */ | ||
| #include <string.h> | ||
| #include "upnperrors.h" | ||
| #include "upnpcommands.h" | ||
| #include "miniupnpc.h" | ||
|
|
||
| const char * strupnperror(int err) | ||
| { | ||
| const char * s = NULL; | ||
| switch(err) { | ||
| case UPNPCOMMAND_SUCCESS: | ||
| s = "Success"; | ||
| break; | ||
| case UPNPCOMMAND_UNKNOWN_ERROR: | ||
| s = "Miniupnpc Unknown Error"; | ||
| break; | ||
| case UPNPCOMMAND_INVALID_ARGS: | ||
| s = "Miniupnpc Invalid Arguments"; | ||
| break; | ||
| case UPNPDISCOVER_SOCKET_ERROR: | ||
| s = "Miniupnpc Socket error"; | ||
| break; | ||
| case UPNPDISCOVER_MEMORY_ERROR: | ||
| s = "Miniupnpc Memory allocation error"; | ||
| break; | ||
| case 401: | ||
| s = "Invalid Action"; | ||
| break; | ||
| case 402: | ||
| s = "Invalid Args"; | ||
| break; | ||
| case 501: | ||
| s = "Action Failed"; | ||
| break; | ||
| case 606: | ||
| s = "Action not authorized"; | ||
| break; | ||
| case 701: | ||
| s = "PinholeSpaceExhausted"; | ||
| break; | ||
| case 702: | ||
| s = "FirewallDisabled"; | ||
| break; | ||
| case 703: | ||
| s = "InboundPinholeNotAllowed"; | ||
| break; | ||
| case 704: | ||
| s = "NoSuchEntry"; | ||
| break; | ||
| case 705: | ||
| s = "ProtocolNotSupported"; | ||
| break; | ||
| case 706: | ||
| s = "InternalPortWildcardingNotAllowed"; | ||
| break; | ||
| case 707: | ||
| s = "ProtocolWildcardingNotAllowed"; | ||
| break; | ||
| case 708: | ||
| s = "WildcardNotPermittedInSrcIP"; | ||
| break; | ||
| case 709: | ||
| s = "NoPacketSent"; | ||
| break; | ||
| case 713: | ||
| s = "SpecifiedArrayIndexInvalid"; | ||
| break; | ||
| case 714: | ||
| s = "NoSuchEntryInArray"; | ||
| break; | ||
| case 715: | ||
| s = "WildCardNotPermittedInSrcIP"; | ||
| break; | ||
| case 716: | ||
| s = "WildCardNotPermittedInExtPort"; | ||
| break; | ||
| case 718: | ||
| s = "ConflictInMappingEntry"; | ||
| break; | ||
| case 724: | ||
| s = "SamePortValuesRequired"; | ||
| break; | ||
| case 725: | ||
| s = "OnlyPermanentLeasesSupported"; | ||
| break; | ||
| case 726: | ||
| s = "RemoteHostOnlySupportsWildcard"; | ||
| break; | ||
| case 727: | ||
| s = "ExternalPortOnlySupportsWildcard"; | ||
| break; | ||
| default: | ||
| s = "UnknownError"; | ||
| break; | ||
| } | ||
| return s; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| /* $Id: upnperrors.h,v 1.4 2012/09/27 15:42:11 nanard Exp $ */ | ||
| /* (c) 2007 Thomas Bernard | ||
| * All rights reserved. | ||
| * MiniUPnP Project. | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * This software is subjet to the conditions detailed in the | ||
| * provided LICENCE file. */ | ||
| #ifndef UPNPERRORS_H_INCLUDED | ||
| #define UPNPERRORS_H_INCLUDED | ||
|
|
||
| #include "declspec.h" | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* strupnperror() | ||
| * Return a string description of the UPnP error code | ||
| * or NULL for undefinded errors */ | ||
| LIBSPEC const char * strupnperror(int err); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| /* $Id: upnpreplyparse.c,v 1.12 2012/03/05 19:42:48 nanard Exp $ */ | ||
| /* MiniUPnP project | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * (c) 2006-2011 Thomas Bernard | ||
| * This software is subject to the conditions detailed | ||
| * in the LICENCE file provided within the distribution */ | ||
|
|
||
| #include <stdlib.h> | ||
| #include <string.h> | ||
| #include <stdio.h> | ||
|
|
||
| #include "upnpreplyparse.h" | ||
| #include "minixml.h" | ||
|
|
||
| static void | ||
| NameValueParserStartElt(void * d, const char * name, int l) | ||
| { | ||
| struct NameValueParserData * data = (struct NameValueParserData *)d; | ||
| if(l>63) | ||
| l = 63; | ||
| memcpy(data->curelt, name, l); | ||
| data->curelt[l] = '\0'; | ||
| } | ||
|
|
||
| static void | ||
| NameValueParserGetData(void * d, const char * datas, int l) | ||
| { | ||
| struct NameValueParserData * data = (struct NameValueParserData *)d; | ||
| struct NameValue * nv; | ||
| if(strcmp(data->curelt, "NewPortListing") == 0) | ||
| { | ||
| /* specific case for NewPortListing which is a XML Document */ | ||
| data->portListing = malloc(l + 1); | ||
| if(!data->portListing) | ||
| { | ||
| /* malloc error */ | ||
| return; | ||
| } | ||
| memcpy(data->portListing, datas, l); | ||
| data->portListing[l] = '\0'; | ||
| data->portListingLength = l; | ||
| } | ||
| else | ||
| { | ||
| /* standard case. Limited to 63 chars strings */ | ||
| nv = malloc(sizeof(struct NameValue)); | ||
| if(l>63) | ||
| l = 63; | ||
| strncpy(nv->name, data->curelt, 64); | ||
| nv->name[63] = '\0'; | ||
| memcpy(nv->value, datas, l); | ||
| nv->value[l] = '\0'; | ||
| LIST_INSERT_HEAD( &(data->head), nv, entries); | ||
| } | ||
| } | ||
|
|
||
| void | ||
| ParseNameValue(const char * buffer, int bufsize, | ||
| struct NameValueParserData * data) | ||
| { | ||
| struct xmlparser parser; | ||
| LIST_INIT(&(data->head)); | ||
| data->portListing = NULL; | ||
| data->portListingLength = 0; | ||
| /* init xmlparser object */ | ||
| parser.xmlstart = buffer; | ||
| parser.xmlsize = bufsize; | ||
| parser.data = data; | ||
| parser.starteltfunc = NameValueParserStartElt; | ||
| parser.endeltfunc = 0; | ||
| parser.datafunc = NameValueParserGetData; | ||
| parser.attfunc = 0; | ||
| parsexml(&parser); | ||
| } | ||
|
|
||
| void | ||
| ClearNameValueList(struct NameValueParserData * pdata) | ||
| { | ||
| struct NameValue * nv; | ||
| if(pdata->portListing) | ||
| { | ||
| free(pdata->portListing); | ||
| pdata->portListing = NULL; | ||
| pdata->portListingLength = 0; | ||
| } | ||
| while((nv = pdata->head.lh_first) != NULL) | ||
| { | ||
| LIST_REMOVE(nv, entries); | ||
| free(nv); | ||
| } | ||
| } | ||
|
|
||
| char * | ||
| GetValueFromNameValueList(struct NameValueParserData * pdata, | ||
| const char * Name) | ||
| { | ||
| struct NameValue * nv; | ||
| char * p = NULL; | ||
| for(nv = pdata->head.lh_first; | ||
| (nv != NULL) && (p == NULL); | ||
| nv = nv->entries.le_next) | ||
| { | ||
| if(strcmp(nv->name, Name) == 0) | ||
| p = nv->value; | ||
| } | ||
| return p; | ||
| } | ||
|
|
||
| #if 0 | ||
| /* useless now that minixml ignores namespaces by itself */ | ||
| char * | ||
| GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata, | ||
| const char * Name) | ||
| { | ||
| struct NameValue * nv; | ||
| char * p = NULL; | ||
| char * pname; | ||
| for(nv = pdata->head.lh_first; | ||
| (nv != NULL) && (p == NULL); | ||
| nv = nv->entries.le_next) | ||
| { | ||
| pname = strrchr(nv->name, ':'); | ||
| if(pname) | ||
| pname++; | ||
| else | ||
| pname = nv->name; | ||
| if(strcmp(pname, Name)==0) | ||
| p = nv->value; | ||
| } | ||
| return p; | ||
| } | ||
| #endif | ||
|
|
||
| /* debug all-in-one function | ||
| * do parsing then display to stdout */ | ||
| #ifdef DEBUG | ||
| void | ||
| DisplayNameValueList(char * buffer, int bufsize) | ||
| { | ||
| struct NameValueParserData pdata; | ||
| struct NameValue * nv; | ||
| ParseNameValue(buffer, bufsize, &pdata); | ||
| for(nv = pdata.head.lh_first; | ||
| nv != NULL; | ||
| nv = nv->entries.le_next) | ||
| { | ||
| printf("%s = %s\n", nv->name, nv->value); | ||
| } | ||
| ClearNameValueList(&pdata); | ||
| } | ||
| #endif | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| /* $Id: upnpreplyparse.h,v 1.14 2012/09/27 15:42:11 nanard Exp $ */ | ||
| /* MiniUPnP project | ||
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | ||
| * (c) 2006-2012 Thomas Bernard | ||
| * This software is subject to the conditions detailed | ||
| * in the LICENCE file provided within the distribution */ | ||
|
|
||
| #ifndef UPNPREPLYPARSE_H_INCLUDED | ||
| #define UPNPREPLYPARSE_H_INCLUDED | ||
|
|
||
| #if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__) | ||
| #include "bsdqueue.h" | ||
| #else | ||
| #include <sys/queue.h> | ||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| struct NameValue { | ||
| LIST_ENTRY(NameValue) entries; | ||
| char name[64]; | ||
| char value[64]; | ||
| }; | ||
|
|
||
| struct NameValueParserData { | ||
| LIST_HEAD(listhead, NameValue) head; | ||
| char curelt[64]; | ||
| char * portListing; | ||
| int portListingLength; | ||
| }; | ||
|
|
||
| /* ParseNameValue() */ | ||
| void | ||
| ParseNameValue(const char * buffer, int bufsize, | ||
| struct NameValueParserData * data); | ||
|
|
||
| /* ClearNameValueList() */ | ||
| void | ||
| ClearNameValueList(struct NameValueParserData * pdata); | ||
|
|
||
| /* GetValueFromNameValueList() */ | ||
| char * | ||
| GetValueFromNameValueList(struct NameValueParserData * pdata, | ||
| const char * Name); | ||
|
|
||
| /* GetValueFromNameValueListIgnoreNS() */ | ||
| char * | ||
| GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata, | ||
| const char * Name); | ||
|
|
||
| /* DisplayNameValueList() */ | ||
| #ifdef DEBUG | ||
| void | ||
| DisplayNameValueList(char * buffer, int bufsize); | ||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif | ||
|
|