Author: chiiph Date: 2011-03-20 15:40:12 +0000 (Sun, 20 Mar 2011) New Revision: 4538
Added: vidalia/tags/vidalia-0.2.11/ vidalia/tags/vidalia-0.2.11/CMakeLists.txt vidalia/tags/vidalia-0.2.11/INSTALL vidalia/tags/vidalia-0.2.11/config.h.in vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c Removed: vidalia/tags/vidalia-0.2.11/CMakeLists.txt vidalia/tags/vidalia-0.2.11/INSTALL vidalia/tags/vidalia-0.2.11/config.h.in vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.cpp vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.h vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c Log: Tag the 0.2.11 release
Deleted: vidalia/tags/vidalia-0.2.11/CMakeLists.txt =================================================================== --- vidalia/trunk/CMakeLists.txt 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/CMakeLists.txt 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,144 +0,0 @@ -## -## $Id$ -## -## This file is part of Vidalia, and is subject to the license terms in the -## LICENSE file, found in the top level directory of this distribution. If -## you did not receive the LICENSE file with this file, you may obtain it -## from the Vidalia source package distributed by the Vidalia Project at -## http://www.vidalia-project.net/. No part of Vidalia, including this file, -## may be copied, modified, propagated, or distributed except according to -## the terms described in the LICENSE file. -## - - -set(VER_MAJOR "0") -set(VER_MINOR "2") -set(VER_PATCH "11") -set(VERSION "${VER_MAJOR}.${VER_MINOR}.${VER_PATCH}-svn") -message(STATUS "Configuring Vidalia ${VERSION}") -project(Vidalia) - -## Specify the minimim required CMake version -cmake_minimum_required(VERSION 2.4.7) -if (COMMAND cmake_policy) - # Force CMake 2.4 compatibility for handling linker search paths - cmake_policy(SET CMP0003 OLD) -endif(COMMAND cmake_policy) - -## We declare this option here, because it determines the minimum -## required Qt version -option(USE_MARBLE "Enable the KDE Marble-based map widget." OFF) - -## Specify the minimum version of Qt required -set(QT_MIN_VERSION "4.3.0") - -## Specify the Qt libraries used -include(FindQt4) -find_package(Qt4 REQUIRED) -set(QT_USE_QTNETWORK true) -set(QT_USE_QTXML true) -if (USE_MARBLE) - set(QT_USE_QTSVG true) - set(QT_USE_QTWEBKIT true) - set(QT_USE_QTSCRIPT true) - set(QT_USE_QTDBUS true) -endif(USE_MARBLE) -include(${QT_USE_FILE}) -include(${CMAKE_SOURCE_DIR}/cmake/VidaliaMacros.cmake) -include(CheckIncludeFile) -include(CheckIncludeFileCXX) -include(CheckTypeSize) -include(CheckFunctionExists) -if (WIN32) - include(${CMAKE_SOURCE_DIR}/cmake/FindWiX.cmake) -endif(WIN32) -if (MSVC OR UNIX) - include(${CMAKE_SOURCE_DIR}/cmake/FindOpenSSL.cmake) -endif(MSVC OR UNIX) - -if(MSVC_IDE) - set(CMAKE_SUPPRESS_REGENERATION TRUE) - set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) - set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) -endif(MSVC_IDE) - -## Define Vidalia-specific CMake options -if (APPLE) - option(OSX_TIGER_COMPAT "Build an OS X 10.4 Compatible Vidalia." OFF) - if (OSX_TIGER_COMPAT) - set(CMAKE_EXE_LINKER_FLAGS "-mmacosx-version-min=10.4" - CACHE STRING "Flags used by the linker." FORCE) - set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk" - CACHE STRING "isysroot used for universal binary support" FORCE) - endif(OSX_TIGER_COMPAT) - - option(OSX_FAT_BINARY "Build Vidalia as a Universal binary." OFF) - if (OSX_FAT_BINARY) - set(CMAKE_OSX_ARCHITECTURES "ppc;i386" - CACHE STRING "OS X build architectures" FORCE) - set(CMAKE_EXE_LINKER_FLAGS "-mmacosx-version-min=10.4" - CACHE STRING "Flags used by the linker." FORCE) - set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk" - CACHE STRING "isysroot used for universal binary support" FORCE) - endif(OSX_FAT_BINARY) - - option(OSX_FORCE_32BIT "Force a 32-bit build for compatibility." OFF) - if (OSX_FORCE_32BIT) - add_definitions(-m32) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32" - CACHE STRING "Flags used by the linker." FORCE) - endif(OSX_FORCE_32BIT) -endif(APPLE) - -## UPnP support is currently optional (enabled by default) -option(USE_MINIUPNPC "Enable UPnP support using the MiniUPnPc library." ON) - -## Crash reporting via Google Breakpad is optional (disabled by default) -option(USE_BREAKPAD "Enable Google Breakpad crash reporting." OFF) -if (USE_BREAKPAD) - include(${CMAKE_SOURCE_DIR}/cmake/FindBreakpad.cmake) -endif(USE_BREAKPAD) - -## Automatic software update is optional (disabled by default) -if (WIN32) - option(USE_AUTOUPDATE "Enable automatic software update support." OFF) -endif(WIN32) - -## Find the KDE Marble library -if (USE_MARBLE) - include(${CMAKE_SOURCE_DIR}/cmake/FindMarble.cmake) -endif(USE_MARBLE) - -## Find the MaxMind GeoIP library -option(USE_GEOIP "Enable GeoIP lookups via a local MaxMind database" OFF) -if (USE_GEOIP) - include(${CMAKE_SOURCE_DIR}/cmake/FindGeoIP.cmake) -endif(USE_GEOIP) - -## Check for system header files -check_include_file("limits.h" HAVE_LIMITS_H) -check_include_file("sys/limits.h" HAVE_SYS_LIMITS_H) -check_include_file("signal.h" HAVE_SIGNAL_H) - -## Check for the sizes of various data types -check_type_size(int SIZEOF_INT) - -## Check for the existence of some platform-specific functions -if (HAVE_SIGNAL_H) - set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "signal.h") - check_function_exists(sigaction HAVE_SIGACTION) - check_function_exists(signal HAVE_SIGNAL) -endif(HAVE_SIGNAL_H) - -## Write out a configuration file -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/config.h -) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -## Add the actual source directories -add_subdirectory(src) -add_subdirectory(doc) -add_subdirectory(pkg) -
Copied: vidalia/tags/vidalia-0.2.11/CMakeLists.txt (from rev 4537, vidalia/trunk/CMakeLists.txt) =================================================================== --- vidalia/tags/vidalia-0.2.11/CMakeLists.txt (rev 0) +++ vidalia/tags/vidalia-0.2.11/CMakeLists.txt 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,147 @@ +## +## $Id$ +## +## This file is part of Vidalia, and is subject to the license terms in the +## LICENSE file, found in the top level directory of this distribution. If +## you did not receive the LICENSE file with this file, you may obtain it +## from the Vidalia source package distributed by the Vidalia Project at +## http://www.vidalia-project.net/. No part of Vidalia, including this file, +## may be copied, modified, propagated, or distributed except according to +## the terms described in the LICENSE file. +## + + +set(VER_MAJOR "0") +set(VER_MINOR "2") +set(VER_PATCH "11") +set(VERSION "${VER_MAJOR}.${VER_MINOR}.${VER_PATCH}") +message(STATUS "Configuring Vidalia ${VERSION}") +project(Vidalia) + +## Specify the minimim required CMake version +cmake_minimum_required(VERSION 2.4.7) +if (COMMAND cmake_policy) + # Force CMake 2.4 compatibility for handling linker search paths + cmake_policy(SET CMP0003 OLD) +endif(COMMAND cmake_policy) + +## We declare this option here, because it determines the minimum +## required Qt version +option(USE_MARBLE "Enable the KDE Marble-based map widget." OFF) + +## Specify the minimum version of Qt required +set(QT_MIN_VERSION "4.3.0") + +## Specify the Qt libraries used +include(FindQt4) +find_package(Qt4 REQUIRED) +set(QT_USE_QTNETWORK true) +set(QT_USE_QTXML true) +if (USE_MARBLE) + set(QT_USE_QTSVG true) + set(QT_USE_QTWEBKIT true) + set(QT_USE_QTSCRIPT true) + set(QT_USE_QTDBUS true) +endif(USE_MARBLE) +include(${QT_USE_FILE}) +include(${CMAKE_SOURCE_DIR}/cmake/VidaliaMacros.cmake) +include(CheckIncludeFile) +include(CheckIncludeFileCXX) +include(CheckTypeSize) +include(CheckFunctionExists) +if (WIN32) + include(${CMAKE_SOURCE_DIR}/cmake/FindWiX.cmake) +endif(WIN32) +if (MSVC) + include(${CMAKE_SOURCE_DIR}/cmake/FindOpenSSL.cmake) +endif(MSVC) + +if(MSVC_IDE) + set(CMAKE_SUPPRESS_REGENERATION TRUE) + set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) + set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) +endif(MSVC_IDE) + +## Define Vidalia-specific CMake options +if (APPLE) + option(OSX_TIGER_COMPAT "Build an OS X 10.4 Compatible Vidalia." OFF) + if (OSX_TIGER_COMPAT) + set(CMAKE_EXE_LINKER_FLAGS "-mmacosx-version-min=10.4" + CACHE STRING "Flags used by the linker." FORCE) + set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk" + CACHE STRING "isysroot used for universal binary support" FORCE) + endif(OSX_TIGER_COMPAT) + + option(OSX_FAT_BINARY "Build Vidalia as a Universal binary." OFF) + if (OSX_FAT_BINARY) + set(CMAKE_OSX_ARCHITECTURES "ppc;i386" + CACHE STRING "OS X build architectures" FORCE) + set(CMAKE_EXE_LINKER_FLAGS "-mmacosx-version-min=10.4" + CACHE STRING "Flags used by the linker." FORCE) + set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk" + CACHE STRING "isysroot used for universal binary support" FORCE) + endif(OSX_FAT_BINARY) + + option(OSX_FORCE_32BIT "Force a 32-bit build for compatibility." OFF) + if (OSX_FORCE_32BIT) + add_definitions(-m32) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32" + CACHE STRING "Flags used by the linker." FORCE) + endif(OSX_FORCE_32BIT) +endif(APPLE) + +## Define if compiled with Windows 2k support +option(WIN2K "Enable Windows 2k support." OFF) + +## UPnP support is currently optional (enabled by default) +option(USE_MINIUPNPC "Enable UPnP support using the MiniUPnPc library." ON) + +## Crash reporting via Google Breakpad is optional (disabled by default) +option(USE_BREAKPAD "Enable Google Breakpad crash reporting." OFF) +if (USE_BREAKPAD) + include(${CMAKE_SOURCE_DIR}/cmake/FindBreakpad.cmake) +endif(USE_BREAKPAD) + +## Automatic software update is optional (disabled by default) +if (WIN32) + option(USE_AUTOUPDATE "Enable automatic software update support." OFF) +endif(WIN32) + +## Find the KDE Marble library +if (USE_MARBLE) + include(${CMAKE_SOURCE_DIR}/cmake/FindMarble.cmake) +endif(USE_MARBLE) + +## Find the MaxMind GeoIP library +option(USE_GEOIP "Enable GeoIP lookups via a local MaxMind database" OFF) +if (USE_GEOIP) + include(${CMAKE_SOURCE_DIR}/cmake/FindGeoIP.cmake) +endif(USE_GEOIP) + +## Check for system header files +check_include_file("limits.h" HAVE_LIMITS_H) +check_include_file("sys/limits.h" HAVE_SYS_LIMITS_H) +check_include_file("signal.h" HAVE_SIGNAL_H) + +## Check for the sizes of various data types +check_type_size(int SIZEOF_INT) + +## Check for the existence of some platform-specific functions +if (HAVE_SIGNAL_H) + set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "signal.h") + check_function_exists(sigaction HAVE_SIGACTION) + check_function_exists(signal HAVE_SIGNAL) +endif(HAVE_SIGNAL_H) + +## Write out a configuration file +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h +) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +## Add the actual source directories +add_subdirectory(src) +add_subdirectory(doc) +add_subdirectory(pkg) +
Deleted: vidalia/tags/vidalia-0.2.11/INSTALL =================================================================== --- vidalia/trunk/INSTALL 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/INSTALL 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,269 +0,0 @@ - - Instructions for Building and Installing Vidalia from Source - - -Before building and running Vidalia, you will need to have the following -packages installed: - - * Qt >= 4.3 http://qt.nokia.com/downloads - * Tor >= 0.2.0.34 https://www.torproject.org/download.html - * CMake >= 2.4.0 http://www.cmake.org/HTML/Download.html - - -Linux/BSD/Unix --------------- - 1. To configure and compile Vidalia, you can run the following sequence of - commands: - - mkdir build && cd build - cmake .. - make - - 2. When the previous command finishes, Vidalia's binary will be - placed in the build/src/vidalia/ directory. - - 3. Optionally, you can run `make install` to install Vidalia into - your /usr/local/bin/ directory. - - -Mac OS X --------- -CMake on Mac OS X gives you the option of compiling Vidalia from the command -line using standard Unix Makefiles, or generating an Xcode project if you -prefer building from an IDE. - - 1. To build Vidalia from the command line, you can run: - - mkdir build && cd build - cmake .. - make - - Alternatively, you can have CMake generate an Xcode project for Vidalia - by running: - - mkdir xcode && cd xcode - cmake -G Xcode .. - - 2. If you built from the command line, Vidalia's binary will be in an - application bundle located at build/src/vidalia/Vidalia.app. You can copy - Vidalia.app to your Applications folder, if you prefer. - - If you're building from a CMake-generated Xcode project, you can simply - click "Build & Go" in Xcode to build and run Vidalia. Or, you can run - 'xcodebuild' if you prefer building from the command line. - - -Windows with MinGW -------------------- - 1. Make sure the following directories are in your PATH environment - variable: - - * CMake (e.g., "C:\Program Files\CMake 2.4\bin") - * MinGW (e.g., "C:\MinGW\bin") - * Qt (e.g., "C:\Qt\4.3.2\bin") - - 2. Configure Vidalia and generate Makefiles by running: - - mkdir build && cd build - cmake -G "MinGW Makefiles" .. - - There should be no spaces in the path to your build directory. Otherwise, - Vidalia will fail to build. - - 3. Compile Vidalia by running: - - mingw32-make - - -If CMake fails to find your Qt installation, you can explicitly tell CMake -where to find Qt as in the following example: - - cmake -DQT_QMAKE_EXECUTABLE="C:\Qt\4.3.2\bin\qmake.exe" .. - -You would replace "C:\Qt\4.3.2\bin" in the previous command with the actual -path to your Qt installation's qmake.exe binary. - - -Windows with Visual Studio --------------------------- -Starting with Qt 4.3.2, the open source editions of Qt/Win include support for -Visual Studio. Previously, Visual Studio support was limited to commercial -editions of Qt unless you patched Qt's source. - -To build Vidalia under Visual Studio, you will first need to obtain Qt's -source code and compile it with Visual Studio support. The following -directions show how to compile Qt with Visual Studio 2005 support, but a -similar process can be followed for other versions of VS. - - 1. Download and install Visual C++ 2005 Express - - http://www.microsoft.com/express/2005/download/default.aspx - - 2. Download and install the Windows Platform SDK and configure Visual C++ with - the location of the Platform SDK's executable, include, and library - directories. - - http://msdn2.microsoft.com/en-us/express/aa700755.aspx - - It is important to also install the "Microsoft Web Workshop (IE) SDK", even - though that seems irrelevant. - - 3. Download the Qt/Windows open source edition source code and extract it to a - directory with no spaces (e.g., C:\Qt\4.3.3). - - http://qt.nokia.com/downloads/windows-cpp - - 4. Edit the Visual Studio 2005 command prompt environment variables to - include the platform SDK files, by opening - - C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat - - and adding - - C:\Program Files\Microsoft Platform SDK for Windows Servers 2003 R2\Include - - to the INCLUDE variable and - - C:\Program Files\Microsoft Platform SDK for Windows Servers 2003 R2\Lib - - to the LIB variable. Modify the path to the platform SDK files as - appropriate, depending on where you installed Visual Studio and the - Platform SDK in Steps 1 and 2. - - 5. Open the Visual Studio 2005 Command Prompt and 'cd' to the location of - your extracted Qt source code (e.g., C:\Qt\4.3.3). - - 6. Configure Qt with support for your version of Visual Studio. For example, - to configure Qt with support for Visual Studio 2005, you would run: - - configure.exe -debug-and-release -static -fast -platform win32-msvc2005 - - See Qt's README file for more available platform options. - - 7. Compile Qt by running: - - nmake.exe - - (NOTE: This step will take several hours and lots of hard drive space.) - -Once you have Qt compiled with Visual Studio support, you can use CMake to -generate a Visual Studio project file by running - - mkdir build && cd build - cmake -G "Visual Studio 8 2005" .. - -or whatever your particular version of Visual Studio happens to be. -'cmake --help' lists other available generators. - - -Windows with NMake -------------------- -To compile Vidalia from the command line using NMake, you will first need to -follow the steps under the 'Windows with Visual Studio' section for compiling -Qt with Visual Studio support. - -If you want to build Vidalia from the command line, you can have CMake -generate NMake makefiles by running: - - mkdir build && cd build - cmake -G "NMake Makefiles" .. - -You can then compile Vidalia from the command line by simply running: - - nmake - - -Available Configuration Options -------------------------------- -You can customize your Vidalia build by supplying arguments and values to the -`cmake` commands above. Each of the configuration options can be specified on -the command line and follows the format "-D <var>:<type>=<value> - - -DUSE_QSSLSOCKET=0 - - Disable building Vidalia with SSL support. - - -DUSE_MINIUPNPC=0 - - Disable UPnP support in Vidalia. - - -DOSX_FAT_BINARY=1 - - Build Vidalia as a Universal binary. - - -DOSX_TIGER_COMPAT=1 - - Build Vidalia compatible with OS X Tiger (10.4). - - -DOSX_FORCE_32BIT=1 - - Forces a 32-bit build. This is useful on platforms that default to 64-bit - (e.g. Snow Leopard), but only have 32-bit versions of the Qt libraries - available. - - -DQT_QMAKE_EXECUTABLE=/path/to/qmake - - Specifies the location of Qt's 'qmake' binary. - - -DOPENSSL_LIBRARY_DIR=/path/to/openssl - - Specifies the location of OpenSSL's libraries. - - -DCMAKE_INSTALL_PREFIX=/usr/local - - Specifies the install prefix used for `make install`. - - -DCMAKE_BUILD_TYPE=<buildtype> - - Available build types include: "release", "debug", "minsizerel" - - -DUSE_MARBLE=1 - - Replace the flat map with a 3-D sphere using the Marble libraries. - - -DWIX_BINARY_DIR=C:\Path\To\WiX\ - - Specifies the location of your WiX executables, such as candle.exe and - light.exe (optional, Windows-only). - - -For example, to configure CMake to look for Qt in "/usr/local/Qt-4.3.2/bin", -you would run: - - cmake -DQT_QMAKE_EXECUTABLE=/usr/local/Qt-4.3.2/bin/qmake .. - -Don't forget the dot(s) at the end! - -CMake also supports other generators besides Makefiles on certain platforms. -See 'cmake --help' or 'man cmake' (on non-Windows platforms) for more -information about supported generators and configuration options. - - -Additional Build Targets -------------------------- -Vidalia contains a number of additional CMake build targets to assist in -building code documentation and platform-specific packages. The targets are: - - 'dist' Creates a Vidalia source code tarball. - - 'dist-osx' Creates a Vidalia-only Mac OS X .dmg. - - 'dist-osx-bundle' Creates a Vidalia bundle .dmg. See - pkg/osx/build-bundle.txt for additional - information on the CMake options necessary to create - a proper OS X bundle. - - 'dist-osx-split-bundle' Creates a "split" Mac OS X bundle. See - pkg/osx/build-bundle.txt for additional - information on the CMake options necessary to create - a proper OS X bundle. - - 'dist-win32' Creates a Windows .msi package. You will also - need to define -DWIX_BINARY_DIR=<path-to-WiX> - in order to use this build target. - - 'doxygen' Creates the Doxygen-generated code - documentation for Vidalia's source. You must - have Doxygen installed for this target to - function. -
Copied: vidalia/tags/vidalia-0.2.11/INSTALL (from rev 4536, vidalia/trunk/INSTALL) =================================================================== --- vidalia/tags/vidalia-0.2.11/INSTALL (rev 0) +++ vidalia/tags/vidalia-0.2.11/INSTALL 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,280 @@ + + Instructions for Building and Installing Vidalia from Source + + +Before building and running Vidalia, you will need to have the following +packages installed: + + * Qt >= 4.3 http://qt.nokia.com/downloads + * Tor >= 0.2.0.34 https://www.torproject.org/download.html + * CMake >= 2.4.0 http://www.cmake.org/HTML/Download.html + + +Linux/BSD/Unix +-------------- + 1. To configure and compile Vidalia, you can run the following sequence of + commands: + + mkdir build && cd build + cmake .. + make + + 2. When the previous command finishes, Vidalia's binary will be + placed in the build/src/vidalia/ directory. + + 3. Optionally, you can run `make install` to install Vidalia into + your /usr/local/bin/ directory. + + +Mac OS X +-------- +CMake on Mac OS X gives you the option of compiling Vidalia from the command +line using standard Unix Makefiles, or generating an Xcode project if you +prefer building from an IDE. + + 1. To build Vidalia from the command line, you can run: + + mkdir build && cd build + cmake .. + make + + Alternatively, you can have CMake generate an Xcode project for Vidalia + by running: + + mkdir xcode && cd xcode + cmake -G Xcode .. + + 2. If you built from the command line, Vidalia's binary will be in an + application bundle located at build/src/vidalia/Vidalia.app. You can copy + Vidalia.app to your Applications folder, if you prefer. + + If you're building from a CMake-generated Xcode project, you can simply + click "Build & Go" in Xcode to build and run Vidalia. Or, you can run + 'xcodebuild' if you prefer building from the command line. + + +Windows with MinGW +------------------- + 1. Make sure the following directories are in your PATH environment + variable: + + * CMake (e.g., "C:\Program Files\CMake 2.4\bin") + * MinGW (e.g., "C:\MinGW\bin") + * Qt (e.g., "C:\Qt\4.3.2\bin") + + 2. Configure Vidalia and generate Makefiles by running: + + mkdir build && cd build + cmake -G "MinGW Makefiles" .. + + There should be no spaces in the path to your build directory. Otherwise, + Vidalia will fail to build. + + 3. Compile Vidalia by running: + + mingw32-make + + +If CMake fails to find your Qt installation, you can explicitly tell CMake +where to find Qt as in the following example: + + cmake -DQT_QMAKE_EXECUTABLE="C:\Qt\4.3.2\bin\qmake.exe" .. + +You would replace "C:\Qt\4.3.2\bin" in the previous command with the actual +path to your Qt installation's qmake.exe binary. + +If you are trying to build Vidalia for Windows 2000 and earlier, you should +download Windows SDK, copy wspiapi.h header to MinGW include directory and +build vidalia running: + + cmake -DWIN2K .. + +Note: the header as it is in the SDK needs a "_inline" to be replaced to +"__inline" for it to build properly. + + +Windows with Visual Studio +-------------------------- +Starting with Qt 4.3.2, the open source editions of Qt/Win include support for +Visual Studio. Previously, Visual Studio support was limited to commercial +editions of Qt unless you patched Qt's source. + +To build Vidalia under Visual Studio, you will first need to obtain Qt's +source code and compile it with Visual Studio support. The following +directions show how to compile Qt with Visual Studio 2005 support, but a +similar process can be followed for other versions of VS. + + 1. Download and install Visual C++ 2005 Express + + http://www.microsoft.com/express/2005/download/default.aspx + + 2. Download and install the Windows Platform SDK and configure Visual C++ with + the location of the Platform SDK's executable, include, and library + directories. + + http://msdn2.microsoft.com/en-us/express/aa700755.aspx + + It is important to also install the "Microsoft Web Workshop (IE) SDK", even + though that seems irrelevant. + + 3. Download the Qt/Windows open source edition source code and extract it to a + directory with no spaces (e.g., C:\Qt\4.3.3). + + http://qt.nokia.com/downloads/windows-cpp + + 4. Edit the Visual Studio 2005 command prompt environment variables to + include the platform SDK files, by opening + + C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat + + and adding + + C:\Program Files\Microsoft Platform SDK for Windows Servers 2003 R2\Include + + to the INCLUDE variable and + + C:\Program Files\Microsoft Platform SDK for Windows Servers 2003 R2\Lib + + to the LIB variable. Modify the path to the platform SDK files as + appropriate, depending on where you installed Visual Studio and the + Platform SDK in Steps 1 and 2. + + 5. Open the Visual Studio 2005 Command Prompt and 'cd' to the location of + your extracted Qt source code (e.g., C:\Qt\4.3.3). + + 6. Configure Qt with support for your version of Visual Studio. For example, + to configure Qt with support for Visual Studio 2005, you would run: + + configure.exe -debug-and-release -static -fast -platform win32-msvc2005 + + See Qt's README file for more available platform options. + + 7. Compile Qt by running: + + nmake.exe + + (NOTE: This step will take several hours and lots of hard drive space.) + +Once you have Qt compiled with Visual Studio support, you can use CMake to +generate a Visual Studio project file by running + + mkdir build && cd build + cmake -G "Visual Studio 8 2005" .. + +or whatever your particular version of Visual Studio happens to be. +'cmake --help' lists other available generators. + + +Windows with NMake +------------------- +To compile Vidalia from the command line using NMake, you will first need to +follow the steps under the 'Windows with Visual Studio' section for compiling +Qt with Visual Studio support. + +If you want to build Vidalia from the command line, you can have CMake +generate NMake makefiles by running: + + mkdir build && cd build + cmake -G "NMake Makefiles" .. + +You can then compile Vidalia from the command line by simply running: + + nmake + + +Available Configuration Options +------------------------------- +You can customize your Vidalia build by supplying arguments and values to the +`cmake` commands above. Each of the configuration options can be specified on +the command line and follows the format "-D <var>:<type>=<value> + + -DUSE_MINIUPNPC=0 + + Disable UPnP support in Vidalia. + + -DOSX_FAT_BINARY=1 + + Build Vidalia as a Universal binary. + + -DOSX_TIGER_COMPAT=1 + + Build Vidalia compatible with OS X Tiger (10.4). + + -DOSX_FORCE_32BIT=1 + + Forces a 32-bit build. This is useful on platforms that default to 64-bit + (e.g. Snow Leopard), but only have 32-bit versions of the Qt libraries + available. + + -DQT_QMAKE_EXECUTABLE=/path/to/qmake + + Specifies the location of Qt's 'qmake' binary. + + -DOPENSSL_LIBRARY_DIR=/path/to/openssl + + Specifies the location of OpenSSL's libraries for building installer on + Windows. + + -DCMAKE_INSTALL_PREFIX=/usr/local + + Specifies the install prefix used for `make install`. + + -DCMAKE_BUILD_TYPE=<buildtype> + + Available build types include: "release", "debug", "minsizerel" + + -DUSE_MARBLE=1 + + Replace the flat map with a 3-D sphere using the Marble libraries. + + -DWIX_BINARY_DIR=C:\Path\To\WiX\ + + Specifies the location of your WiX executables, such as candle.exe and + light.exe (optional, Windows-only). + + -DWIN2K + + Builds Vidalia using the inlines defined in wspiapi.h header for Windows + 2000 and earlier support. + + +For example, to configure CMake to look for Qt in "/usr/local/Qt-4.3.2/bin", +you would run: + + cmake -DQT_QMAKE_EXECUTABLE=/usr/local/Qt-4.3.2/bin/qmake .. + +Don't forget the dot(s) at the end! + +CMake also supports other generators besides Makefiles on certain platforms. +See 'cmake --help' or 'man cmake' (on non-Windows platforms) for more +information about supported generators and configuration options. + + +Additional Build Targets +------------------------- +Vidalia contains a number of additional CMake build targets to assist in +building code documentation and platform-specific packages. The targets are: + + 'dist' Creates a Vidalia source code tarball. + + 'dist-osx' Creates a Vidalia-only Mac OS X .dmg. + + 'dist-osx-bundle' Creates a Vidalia bundle .dmg. See + pkg/osx/build-bundle.txt for additional + information on the CMake options necessary to create + a proper OS X bundle. + + 'dist-osx-split-bundle' Creates a "split" Mac OS X bundle. See + pkg/osx/build-bundle.txt for additional + information on the CMake options necessary to create + a proper OS X bundle. + + 'dist-win32' Creates a Windows .msi package. You will also + need to define -DWIX_BINARY_DIR=<path-to-WiX> + in order to use this build target. + + 'doxygen' Creates the Doxygen-generated code + documentation for Vidalia's source. You must + have Doxygen installed for this target to + function. +
Deleted: vidalia/tags/vidalia-0.2.11/config.h.in =================================================================== --- vidalia/trunk/config.h.in 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/config.h.in 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,46 +0,0 @@ -/* -** $Id$ -** -** This file is part of Vidalia, and is subject to the license terms in the -** LICENSE file, found in the top level directory of this distribution. If -** you did not receive the LICENSE file with this file, you may obtain it -** from the Vidalia source package distributed by the Vidalia Project at -** http://www.vidalia-project.net/. No part of Vidalia, including this file, -** may be copied, modified, propagated, or distributed except according to -** the terms described in the LICENSE file. -** -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H - -#define VIDALIA_VERSION "@VERSION@" - -#cmakedefine HAVE_LIMITS_H - -#cmakedefine HAVE_SYS_LIMITS_H - -#cmakedefine HAVE_SIGNAL_H - -#cmakedefine HAVE_SIGACTION - -#cmakedefine HAVE_SIGNAL - -#cmakedefine HAVE_GEOIP_H - -#cmakedefine HAVE_GEOIPCITY_H - -#cmakedefine SIZEOF_INT @SIZEOF_INT@ - -#cmakedefine USE_MINIUPNPC - -#cmakedefine USE_AUTOUPDATE - -#cmakedefine USE_MARBLE - -#cmakedefine USE_BREAKPAD - -#cmakedefine USE_GEOIP - -#endif -
Copied: vidalia/tags/vidalia-0.2.11/config.h.in (from rev 4535, vidalia/trunk/config.h.in) =================================================================== --- vidalia/tags/vidalia-0.2.11/config.h.in (rev 0) +++ vidalia/tags/vidalia-0.2.11/config.h.in 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,48 @@ +/* +** $Id$ +** +** This file is part of Vidalia, and is subject to the license terms in the +** LICENSE file, found in the top level directory of this distribution. If +** you did not receive the LICENSE file with this file, you may obtain it +** from the Vidalia source package distributed by the Vidalia Project at +** http://www.vidalia-project.net/. No part of Vidalia, including this file, +** may be copied, modified, propagated, or distributed except according to +** the terms described in the LICENSE file. +** +*/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +#define VIDALIA_VERSION "@VERSION@" + +#cmakedefine HAVE_LIMITS_H + +#cmakedefine HAVE_SYS_LIMITS_H + +#cmakedefine HAVE_SIGNAL_H + +#cmakedefine HAVE_SIGACTION + +#cmakedefine HAVE_SIGNAL + +#cmakedefine HAVE_GEOIP_H + +#cmakedefine HAVE_GEOIPCITY_H + +#cmakedefine SIZEOF_INT @SIZEOF_INT@ + +#cmakedefine USE_MINIUPNPC + +#cmakedefine USE_AUTOUPDATE + +#cmakedefine USE_MARBLE + +#cmakedefine USE_BREAKPAD + +#cmakedefine USE_GEOIP + +#cmakedefine WIN2K + +#endif +
Deleted: vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in =================================================================== --- vidalia/trunk/pkg/rpm/vidalia.spec.in 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,141 +0,0 @@ -Name: vidalia -Version: @VERSION@ -Release: 1%{?dist} -Summary: GUI controller for the Tor Onion Routing Network - -Group: Applications/Internet -License: GPLv2+ -URL: https://www.torproject.org/vidalia/ -Source0: https://www.torproject.org/%%7Bname%7D/dist/%%7Bname%7D-%%7Bversion%7D.tar.g... -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) - -BuildRequires: desktop-file-utils -BuildRequires: openssl-devel -BuildRequires: qt4-devel -BuildRequires: cmake - -Requires: tor -Requires: privoxy -Requires: hicolor-icon-theme - - -%description -Vidalia is a cross-platform controller GUI for Tor, built using the Qt -framework. Vidalia allows you to start and stop Tor, view the status of Tor at -a glance, and monitor Tor's bandwidth usage. Vidalia also makes it easy to -contribute to the Tor network by helping you setup a Tor server, if you wish. - - -%package doc -Summary: Documentation for %{name} -Group: Documentation -BuildRequires: doxygen -Requires: %{name} = %{version}-%{release} - - -%description doc -Doxygen generated documentations for %{name}. - - -%prep -%setup -q - - -%build -%if 0%{?_qt4_bindir:1} -PATH=%{_qt4_bindir}:$PATH; export PATH -%else -PATH=%{_libdir}/qt4/bin:$PATH; export PATH -%endif - -%cmake . - -make %{?_smp_mflags} - -cd doc -doxygen Doxyfile.in - - -%install -rm -rf %{buildroot} - -make install \ - INSTALL="install -p" \ - DESTDIR=%{buildroot} - -install -Dpm0644 doc/%{name}.1 \ - %{buildroot}%{_mandir}/man1/%{name}.1 - - -mkdir -p %{buildroot}%{_docdir}/%{name}-%{version}-doxygen/ - -cp -r src/%{name}/help/ \ - %{buildroot}%{_docdir}/%{name}-%{version}-doxygen/ - - - -%post -touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : - - -%postun -if [ $1 -eq 0 ] ; then - touch --no-create %{_datadir}/icons/hicolor &>/dev/null - gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : -fi - - -%posttrans -gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : - - -%clean -rm -rf %{buildroot} - - -%files -%defattr(-,root,root,-) -%doc CHANGELOG CREDITS HACKING LICENSE LICENSE-GPLV2 LICENSE-GPLV3 LICENSE-OPENSSL README -%{_bindir}/%{name} -%{_mandir}/man1/%{name}* -%{_datadir}/applications/%{name}.desktop -%{_datadir}/icons/hicolor/*/apps/%{name}.png - - -%files doc -%defattr(-,root,root,-) -%{_docdir}/%{name}-%{version}-doxygen/ - - -%changelog -* Fri Jan 29 2010 Erinn Clark erinn@torproject.org - 0.2.7-1 -- New upstream release -- Updated documentation installation process - -* Sat Jun 13 2009 Matt Edman edmanm@vidalia-project.net - 0.2.1-1 -- Added to Vidalia Subversion repository - -* Mon Jun 01 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.13-2 -- Merge builds for fedora and epel - -* Mon Jun 01 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.13-1 -- Update to 0.1.13 -- Adjust to fedora and epel - -* Sun Apr 06 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.12-1 -- New upstream release -- Correct typo in URL -- Add R: hicolor for new handling of icons -- Add update-icon-cache sniplet -- Use summary of upstream for Desktopfile and in spec file -- Create doxygen-documentations - -* Sun Feb 15 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.10-2 -- Correct Qt in Summary -- Correct Qt in desktop-file-source -- Add a german Translation in the desktop-file-source -- Using CMAKE-macro instead of cmake -- Add more files to more documentation - -* Tue Feb 10 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.10-1 -- Initial Package build
Copied: vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in (from rev 4533, vidalia/trunk/pkg/rpm/vidalia.spec.in) =================================================================== --- vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in (rev 0) +++ vidalia/tags/vidalia-0.2.11/pkg/rpm/vidalia.spec.in 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,140 @@ +Name: vidalia +Version: @VERSION@ +Release: 1%{?dist} +Summary: GUI controller for the Tor Onion Routing Network + +Group: Applications/Internet +License: GPLv2+ +URL: https://www.torproject.org/vidalia/ +Source0: https://www.torproject.org/%%7Bname%7D/dist/%%7Bname%7D-%%7Bversion%7D.tar.g... +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: desktop-file-utils +BuildRequires: qt4-devel +BuildRequires: cmake + +Requires: tor +Requires: privoxy +Requires: hicolor-icon-theme + + +%description +Vidalia is a cross-platform controller GUI for Tor, built using the Qt +framework. Vidalia allows you to start and stop Tor, view the status of Tor at +a glance, and monitor Tor's bandwidth usage. Vidalia also makes it easy to +contribute to the Tor network by helping you setup a Tor server, if you wish. + + +%package doc +Summary: Documentation for %{name} +Group: Documentation +BuildRequires: doxygen +Requires: %{name} = %{version}-%{release} + + +%description doc +Doxygen generated documentations for %{name}. + + +%prep +%setup -q + + +%build +%if 0%{?_qt4_bindir:1} +PATH=%{_qt4_bindir}:$PATH; export PATH +%else +PATH=%{_libdir}/qt4/bin:$PATH; export PATH +%endif + +%cmake . + +make %{?_smp_mflags} + +cd doc +doxygen Doxyfile.in + + +%install +rm -rf %{buildroot} + +make install \ + INSTALL="install -p" \ + DESTDIR=%{buildroot} + +install -Dpm0644 doc/%{name}.1 \ + %{buildroot}%{_mandir}/man1/%{name}.1 + + +mkdir -p %{buildroot}%{_docdir}/%{name}-%{version}-doxygen/ + +cp -r src/%{name}/help/ \ + %{buildroot}%{_docdir}/%{name}-%{version}-doxygen/ + + + +%post +touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : + + +%postun +if [ $1 -eq 0 ] ; then + touch --no-create %{_datadir}/icons/hicolor &>/dev/null + gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : +fi + + +%posttrans +gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : + + +%clean +rm -rf %{buildroot} + + +%files +%defattr(-,root,root,-) +%doc CHANGELOG CREDITS HACKING LICENSE LICENSE-GPLV2 LICENSE-GPLV3 README +%{_bindir}/%{name} +%{_mandir}/man1/%{name}* +%{_datadir}/applications/%{name}.desktop +%{_datadir}/icons/hicolor/*/apps/%{name}.png + + +%files doc +%defattr(-,root,root,-) +%{_docdir}/%{name}-%{version}-doxygen/ + + +%changelog +* Fri Jan 29 2010 Erinn Clark erinn@torproject.org - 0.2.7-1 +- New upstream release +- Updated documentation installation process + +* Sat Jun 13 2009 Matt Edman edmanm@vidalia-project.net - 0.2.1-1 +- Added to Vidalia Subversion repository + +* Mon Jun 01 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.13-2 +- Merge builds for fedora and epel + +* Mon Jun 01 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.13-1 +- Update to 0.1.13 +- Adjust to fedora and epel + +* Sun Apr 06 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.12-1 +- New upstream release +- Correct typo in URL +- Add R: hicolor for new handling of icons +- Add update-icon-cache sniplet +- Use summary of upstream for Desktopfile and in spec file +- Create doxygen-documentations + +* Sun Feb 15 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.10-2 +- Correct Qt in Summary +- Correct Qt in desktop-file-source +- Add a german Translation in the desktop-file-source +- Using CMAKE-macro instead of cmake +- Add more files to more documentation + +* Tue Feb 10 2009 Simon Wesp cassmodiah@fedoraproject.org - 0.1.10-1 +- Initial Package build
Deleted: vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt =================================================================== --- vidalia/trunk/src/common/CMakeLists.txt 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,46 +0,0 @@ -## -## $Id$ -## -## This file is part of Vidalia, and is subject to the license terms in the -## LICENSE file, found in the top level directory of this distribution. If -## you did not receive the LICENSE file with this file, you may obtain it -## from the Vidalia source package distributed by the Vidalia Project at -## http://www.vidalia-project.net/. No part of Vidalia, including this file, -## may be copied, modified, propagated, or distributed except according to -## the terms described in the LICENSE file. -## - - -set(common_SRCS - crypto.cpp - file.cpp - html.cpp - Log.cpp - net.cpp - procutil.cpp - stringutil.cpp - TorSocket.cpp - TorSslSocket.cpp -) -qt4_wrap_cpp(common_SRCS - TorSocket.h - TorSslSocket.h -) - -if(WIN32) - set(common_SRCS ${common_SRCS} - win32.cpp - ) -endif(WIN32) - - -add_library(common STATIC ${common_SRCS}) -target_link_libraries(common - ${QT_QTCORE_LIBRARY} - ${QT_QTNETWORK_LIBRARY} -) - -if(OPENSSL_LIBRARIES) - target_link_libraries(common ${OPENSSL_LIBRARIES}) -endif(OPENSSL_LIBRARIES) -
Copied: vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt (from rev 4533, vidalia/trunk/src/common/CMakeLists.txt) =================================================================== --- vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt (rev 0) +++ vidalia/tags/vidalia-0.2.11/src/common/CMakeLists.txt 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,40 @@ +## +## $Id$ +## +## This file is part of Vidalia, and is subject to the license terms in the +## LICENSE file, found in the top level directory of this distribution. If +## you did not receive the LICENSE file with this file, you may obtain it +## from the Vidalia source package distributed by the Vidalia Project at +## http://www.vidalia-project.net/. No part of Vidalia, including this file, +## may be copied, modified, propagated, or distributed except according to +## the terms described in the LICENSE file. +## + + +set(common_SRCS + crypto.cpp + file.cpp + html.cpp + Log.cpp + net.cpp + procutil.cpp + stringutil.cpp + TorSocket.cpp +) +qt4_wrap_cpp(common_SRCS + TorSocket.h +) + +if(WIN32) + set(common_SRCS ${common_SRCS} + win32.cpp + ) +endif(WIN32) + + +add_library(common STATIC ${common_SRCS}) +target_link_libraries(common + ${QT_QTCORE_LIBRARY} + ${QT_QTNETWORK_LIBRARY} +) +
Deleted: vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.cpp =================================================================== --- vidalia/trunk/src/common/TorSslSocket.cpp 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.cpp 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,160 +0,0 @@ -/* -** This file is part of Vidalia, and is subject to the license terms in the -** LICENSE file, found in the top level directory of this distribution. If you -** did not receive the LICENSE file with this file, you may obtain it from the -** Vidalia source package distributed by the Vidalia Project at -** http://www.vidalia-project.net/. No part of Vidalia, including this file, -** may be copied, modified, propagated, or distributed except according to the -** terms described in the LICENSE file. -*/ - -/* -** \file TorSslSocket.cpp -** \version $Id: /local/vidalia/trunk/src/util/torsocket.cpp 1564 2006-12-26T06:06:04.965088Z edmanm $ -** \brief A QSslSocket that makes encrypted requests over Tor -*/ - -#include "TorSslSocket.h" - -#include <QDataStream> -#include <QStringList> - -#define SOCKS_VERSION 0x04 /**< SOCKS version. */ -#define SOCKS_CONNECT 0x01 /**< SOCKS connect command ID. */ -#define SOCKS_FAKE_IP 0x00000001 /**< Bogus IP. */ -#define SOCKS_RESPONSE_LEN 0x08 /**< SOCKS server response length. */ -#define SOCKS_RESPONSE_VERSION 0x00 /**< SOCKS server response version. */ -#define SOCKS_CONNECT_STATUS_OK 0x5A /**< SOCKS server response status. */ - - -/** Constructor. */ -TorSslSocket::TorSslSocket(const QHostAddress &socksAddr, - quint16 socksPort, QObject *parent) -: QSslSocket(parent), - _socksAddr(socksAddr), - _socksPort(socksPort) -{ - QObject::connect(this, SIGNAL(sslErrors(QList<QSslError>)), - this, SLOT(onSslErrors(QList<QSslError>))); - QObject::connect(this, SIGNAL(error(QAbstractSocket::SocketError)), - this, SLOT(onError(QAbstractSocket::SocketError))); - QObject::connect(this, SIGNAL(readyRead()), - this, SLOT(onHandshakeResponse())); - QObject::connect(this, SIGNAL(connected()), - this, SLOT(connectedToProxy())); - QObject::connect(this, SIGNAL(encrypted()), - this, SLOT(onEncrypted())); -} - -/** Connects to the specified hostname and port via Tor. */ -void -TorSslSocket::connectToRemoteHost(const QString &remoteHost, quint16 remotePort, - bool encrypted) -{ - _remoteHost = remoteHost; - _remotePort = remotePort; - _encrypted = encrypted; - QTcpSocket::connectToHost(_socksAddr, _socksPort); -} - -/** Called when a connection error has occurred. */ -void -TorSslSocket::onError(QAbstractSocket::SocketError error) -{ - Q_UNUSED(error); - emit socketError(errorString()); -} - -/** Called when one or more SSL errors occur on the socket. */ -void -TorSslSocket::onSslErrors(const QList<QSslError> &errors) -{ - QStringList errorStrings; - foreach (QSslError error, errors) { - errorStrings << """ + error.errorString() + """; - } - emit socketError(errorStrings.join(",")); -} - -/** Called when a connection has been established to the proxy host and starts - * a Socks4a handshake. */ -void -TorSslSocket::connectedToProxy() -{ - sendSocksHandshake(_remoteHost, _remotePort); -} - -/** Called when an encrypted connection has been established to the remote - * host. */ -void -TorSslSocket::onEncrypted() -{ - emit connectedToRemoteHost(); -} - -/** Sends the first part of a Socks4a handshake, using the remote hostname and - * port specified in the previous call to connectToHost(). The message should - * be formatted as follows: - * - * 0x04 (socks version) - * 0x01 (connect) - * PORT (two bytes, most significant byte first) - * 0x00 0x00 0x00 0x01 (fake IP address: tells proxy to use SOCKS4a) - * 0x00 (empty username field) - * HOSTNAME (target hostname) - * 0x00 (marks the end of the hostname field) - */ -void -TorSslSocket::sendSocksHandshake(const QString &remoteHost, quint16 remotePort) -{ - QDataStream sock(this); - sock << (quint8)SOCKS_VERSION; - sock << (quint8)SOCKS_CONNECT; - sock << (quint16)remotePort; - sock << (quint32)SOCKS_FAKE_IP; - sock << (quint8)0; - sock.writeRawData(qPrintable(remoteHost), remoteHost.length()); - sock << (quint8)0; -} - -/** Handles the second half of the handshake, received from the SOCKS - * proxy server. The response should be formatted as follows: - * - * 0x00 (response version) - * STATUS (0x5A means success; other values mean failure) - * PORT (not set) - * ADDRESS (not set) - */ -void -TorSslSocket::onHandshakeResponse() -{ - QByteArray response; - if (bytesAvailable() >= SOCKS_RESPONSE_LEN) { - /* We've received our response, so stop waiting for it. */ - QObject::disconnect(this, SIGNAL(readyRead()), - this, SLOT(onHandshakeResponse())); - - /* Read the 8-byte response off the socket. */ - response = read(SOCKS_RESPONSE_LEN); - - /* Check to make sure we got a good response from the proxy. */ - if ((uchar)response[0] == (uchar)SOCKS_RESPONSE_VERSION && - (uchar)response[1] == (uchar)SOCKS_CONNECT_STATUS_OK) { - if (_encrypted) { - /* Connection status was okay, so start client encryption. */ - /* We first need to set the peer name to the intended remote host, - * otherwise Qt will use the proxy (e.g., 127.0.0.1) as the peer name - * when validating the server certificate. */ - setPeerName(_remoteHost); - startClientEncryption(); - } else { - /* Caller wanted an unencrypted, unauthenticated, uncool conn. */ - emit connectedToRemoteHost(); - } - } else { - /* Remote connection failed, so close the connection to the proxy. */ - disconnectFromHost(); - } - } -} -
Deleted: vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.h =================================================================== --- vidalia/trunk/src/common/TorSslSocket.h 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/common/TorSslSocket.h 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,71 +0,0 @@ -/* -** This file is part of Vidalia, and is subject to the license terms in the -** LICENSE file, found in the top level directory of this distribution. If you -** did not receive the LICENSE file with this file, you may obtain it from the -** Vidalia source package distributed by the Vidalia Project at -** http://www.vidalia-project.net/. No part of Vidalia, including this file, -** may be copied, modified, propagated, or distributed except according to the -** terms described in the LICENSE file. -*/ - -/* -** \file TorSslSocket.h -** \version $Id: /local/vidalia/trunk/src/util/torsocket.h 1564 2006-12-26T06:06:04.965088Z edmanm $ -** \brief A QSslSocket that makes encrypted requests over Tor -*/ - -#ifndef _TORSSLSOCKET_H -#define _TORSSLSOCKET_H - -#include <QSslSocket> -#include <QHostAddress> - - -class TorSslSocket : public QSslSocket -{ - Q_OBJECT - -public: - /** Constructor. */ - TorSslSocket(const QHostAddress &socksAddr, - quint16 socksPort, QObject *parent = 0); - - /** Connects to the specified hostname and port via Tor. */ - void connectToRemoteHost(const QString &remoteHost, quint16 remotePort, - bool encrypted); - -signals: - /** Emitted when a connection has been established through Tor to the remote - * host specified in a prior call to connectToHost(). */ - void connectedToRemoteHost(); - /** Emitted when a connection error has occurred. */ - void socketError(QString errmsg); - -private slots: - /** Called when the socket is connected to the proxy and sends our - * half of a Socks4a handshake. */ - void connectedToProxy(); - /** Called when an encrypted connection has been established to the remote - * host. */ - void onEncrypted(); - /** Handles the server's response part of a Socks4a handshake. */ - void onHandshakeResponse(); - /** Called when a connection error has occurred. */ - void onError(QAbstractSocket::SocketError error); - /** Called when one or more SSL errors occur on the socket. */ - void onSslErrors(const QList<QSslError> &errors); - -private: - /** Sends the client part of a Socks4a handshake with a proxy server. */ - void sendSocksHandshake(const QString &remoteHost, quint16 remotePort); - - QHostAddress _socksAddr; /**< Address of Tor's SOCKS listener. */ - QString _remoteHost; /**< Remote hostname. */ - quint16 _socksPort; /**< Port of Tor's SOCKS listener. */ - quint16 _remotePort; /**< Remote host port. */ - bool _encrypted; /**< Set to true if the connection to the remote - host should be encrypted. */ -}; - -#endif -
Deleted: vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c =================================================================== --- vidalia/trunk/src/miniupnpc/connecthostport.c 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,221 +0,0 @@ -/* $Id: connecthostport.c,v 1.2 2010/04/05 00:08:15 nanard Exp $ */ -/* Project : miniupnp - * Author : Thomas Bernard - * Copyright (c) 2010 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() */ -/* #define USE_GETHOSTBYNAME */ - -#include <string.h> -#include <stdio.h> -#ifdef WIN32 -#include <winsock2.h> -#include <ws2tcpip.h> -#include <io.h> -#define snprintf _snprintf -#define herror -#define socklen_t int -#else /* #ifdef WIN32 */ -#include <unistd.h> -#include <errno.h> -#define closesocket close -#include <netdb.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) -{ - int s, n; -#ifdef USE_GETHOSTBYNAME - struct sockaddr_in dest; - struct hostent *hp; -#else /* #ifdef USE_GETHOSTBYNAME */ - 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); - n = getaddrinfo(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; -#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; -} -
Copied: vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c (from rev 4535, vidalia/trunk/src/miniupnpc/connecthostport.c) =================================================================== --- vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c (rev 0) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/connecthostport.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,225 @@ +/* $Id: connecthostport.c,v 1.2 2010/04/05 00:08:15 nanard Exp $ */ +/* Project : miniupnp + * Author : Thomas Bernard + * Copyright (c) 2010 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() */ +/* #define USE_GETHOSTBYNAME */ + +#include <string.h> +#include <stdio.h> +#ifdef WIN32 +#include <winsock2.h> +#include <ws2tcpip.h> +#ifdef WIN2K +# define __inline static inline +# include <wspiapi.h> +#endif +#include <io.h> +#define snprintf _snprintf +#define herror +#define socklen_t int +#else /* #ifdef WIN32 */ +#include <unistd.h> +#include <errno.h> +#define closesocket close +#include <netdb.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) +{ + int s, n; +#ifdef USE_GETHOSTBYNAME + struct sockaddr_in dest; + struct hostent *hp; +#else /* #ifdef USE_GETHOSTBYNAME */ + 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); + n = getaddrinfo(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; +#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; +} +
Deleted: vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c =================================================================== --- vidalia/trunk/src/miniupnpc/miniupnpc.c 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,892 +0,0 @@ -/* $Id: miniupnpc.c,v 1.78 2010/04/05 20:36:59 nanard Exp $ */ -/* Project : miniupnp - * Author : Thomas BERNARD - * copyright (c) 2005-2010 Thomas Bernard - * This software is subjet to the conditions detailed in the - * provided LICENSE file. */ -#define __EXTENSIONS__ 1 -#if !defined(MACOSX) && !defined(__sun) -#if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__) -#ifndef __cplusplus -#define _XOPEN_SOURCE 600 -#endif -#endif -#ifndef __BSD_VISIBLE -#define __BSD_VISIBLE 1 -#endif -#endif - -#ifdef __APPLE__ -#define _DARWIN_C_SOURCE -#endif - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#ifdef WIN32 -/* Win32 Specific includes and defines */ -#include <winsock2.h> -#include <ws2tcpip.h> -#include <io.h> -/*#include <IPHlpApi.h>*/ -#define snprintf _snprintf -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#define strncasecmp _memicmp -#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ -#define strncasecmp memicmp -#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ -#define MAXHOSTNAMELEN 64 -#else /* #ifdef WIN32 */ -/* Standard POSIX includes */ -#include <unistd.h> -#if defined(__amigaos__) && !defined(__amigaos4__) -/* Amiga OS 3 specific stuff */ -#define socklen_t int -#else -#include <sys/select.h> -#endif -#if defined(__APPLE__) -#undef _POSIX_C_SOURCE -#endif -#include <sys/socket.h> -#include <sys/types.h> -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#if !defined(__amigaos__) && !defined(__amigaos4__) -#include <poll.h> -#endif -#include <strings.h> -#include <errno.h> -#define closesocket close -#define MINIUPNPC_IGNORE_EINTR -#endif /* #else WIN32 */ -#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT -#include <sys/time.h> -#endif -#if defined(__amigaos__) || defined(__amigaos4__) -/* Amiga OS specific stuff */ -#define TIMEVAL struct timeval -#endif - -#include "miniupnpc.h" -#include "minissdpc.h" -#include "miniwget.h" -#include "minisoap.h" -#include "minixml.h" -#include "upnpcommands.h" -#include "connecthostport.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 - -#define SOAPPREFIX "s" -#define SERVICEPREFIX "u" -#define SERVICEPREFIX2 'u' - -/* root description parsing */ -LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data) -{ - struct xmlparser parser; - /* xmlparser object */ - parser.xmlstart = buffer; - parser.xmlsize = bufsize; - parser.data = data; - parser.starteltfunc = IGDstartelt; - parser.endeltfunc = IGDendelt; - parser.datafunc = IGDdata; - parser.attfunc = 0; - parsexml(&parser); -#ifdef DEBUG - printIGD(data); -#endif -} - -/* getcontentlenfromline() : parse the Content-Length HTTP header line. - * Content-length: nnn */ -static int getcontentlenfromline(const char * p, int n) -{ - static const char contlenstr[] = "content-length"; - const char * p2 = contlenstr; - int a = 0; - while(*p2) - { - if(n==0) - return -1; - if(*p2 != *p && *p2 != (*p + 32)) - return -1; - p++; p2++; n--; - } - if(n==0) - return -1; - if(*p != ':') - return -1; - p++; n--; - while(*p == ' ') - { - if(n==0) - return -1; - p++; n--; - } - while(*p >= '0' && *p <= '9') - { - if(n==0) - return -1; - a = (a * 10) + (*p - '0'); - p++; n--; - } - return a; -} - -/* getContentLengthAndHeaderLength() - * retrieve header length and content length from an HTTP response - * TODO : retrieve Transfer-Encoding: header value, in order to support - * HTTP/1.1, chunked transfer encoding must be supported. */ -static void -getContentLengthAndHeaderLength(char * p, int n, - int * contentlen, int * headerlen) -{ - char * line; - int linelen; - int r; - line = p; - while(line < p + n) - { - linelen = 0; - while(line[linelen] != '\r' && line[linelen] != '\r') - { - if(line+linelen >= p+n) - return; - linelen++; - } - r = getcontentlenfromline(line, linelen); - if(r>0) - *contentlen = r; - line = line + linelen + 2; - if(line[0] == '\r' && line[1] == '\n') - { - *headerlen = (line - p) + 2; - return; - } - } -} - -/* simpleUPnPcommand : - * not so simple ! - * return values : - * 0 - OK - * -1 - error */ -int simpleUPnPcommand(int s, const char * url, const char * service, - const char * action, struct UPNParg * args, - char * buffer, int * bufsize) -{ - char hostname[MAXHOSTNAMELEN+1]; - unsigned short port = 0; - char * path; - char soapact[128]; - char soapbody[2048]; - char * buf; - int buffree; - int n; - int contentlen, headerlen; /* for the response */ - - snprintf(soapact, sizeof(soapact), "%s#%s", service, action); - if(args==NULL) - { - /*soapbodylen = */snprintf(soapbody, sizeof(soapbody), - "<?xml version=\"1.0\"?>\r\n" - "<" SOAPPREFIX ":Envelope " - "xmlns:" SOAPPREFIX "="http://schemas.xmlsoap.org/soap/envelope/%5C" " - SOAPPREFIX ":encodingStyle="http://schemas.xmlsoap.org/soap/encoding/%5C%22%3E" - "<" SOAPPREFIX ":Body>" - "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "="%s">" - "</" SERVICEPREFIX ":%s>" - "</" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>" - "\r\n", action, service, action); - } - else - { - char * p; - const char * pe, * pv; - int soapbodylen; - soapbodylen = snprintf(soapbody, sizeof(soapbody), - "<?xml version=\"1.0\"?>\r\n" - "<" SOAPPREFIX ":Envelope " - "xmlns:" SOAPPREFIX "="http://schemas.xmlsoap.org/soap/envelope/%5C" " - SOAPPREFIX ":encodingStyle="http://schemas.xmlsoap.org/soap/encoding/%5C%22%3E" - "<" SOAPPREFIX ":Body>" - "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "="%s">", - action, service); - p = soapbody + soapbodylen; - while(args->elt) - { - /* check that we are never overflowing the string... */ - if(soapbody + sizeof(soapbody) <= p + 100) - { - /* we keep a margin of at least 100 bytes */ - *bufsize = 0; - return -1; - } - *(p++) = '<'; - pe = args->elt; - while(*pe) - *(p++) = *(pe++); - *(p++) = '>'; - if((pv = args->val)) - { - while(*pv) - *(p++) = *(pv++); - } - *(p++) = '<'; - *(p++) = '/'; - pe = args->elt; - while(*pe) - *(p++) = *(pe++); - *(p++) = '>'; - args++; - } - *(p++) = '<'; - *(p++) = '/'; - *(p++) = SERVICEPREFIX2; - *(p++) = ':'; - pe = action; - while(*pe) - *(p++) = *(pe++); - strncpy(p, "></" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>\r\n", - soapbody + sizeof(soapbody) - p); - } - if(!parseURL(url, hostname, &port, &path)) return -1; - if(s<0) - { - s = connecthostport(hostname, port); - if(s < 0) - { - *bufsize = 0; - return -1; - } - } - - n = soapPostSubmit(s, path, hostname, port, soapact, soapbody); - if(n<=0) { -#ifdef DEBUG - printf("Error sending SOAP request\n"); -#endif - closesocket(s); - return -1; - } - - contentlen = -1; - headerlen = -1; - buf = buffer; - buffree = *bufsize; - *bufsize = 0; - while ((n = ReceiveData(s, buf, buffree, 5000)) > 0) { - buffree -= n; - buf += n; - *bufsize += n; - getContentLengthAndHeaderLength(buffer, *bufsize, - &contentlen, &headerlen); -#ifdef DEBUG - printf("received n=%dbytes bufsize=%d ContLen=%d HeadLen=%d\n", - n, *bufsize, contentlen, headerlen); -#endif - /* break if we received everything */ - if(contentlen > 0 && headerlen > 0 && *bufsize >= contentlen+headerlen) - break; - } - - closesocket(s); - return 0; -} - -/* parseMSEARCHReply() - * the last 4 arguments are filled during the parsing : - * - location/locationsize : "location:" field of the SSDP reply packet - * - st/stsize : "st:" field of the SSDP reply packet. - * The strings are NOT null terminated */ -static void -parseMSEARCHReply(const char * reply, int size, - const char * * location, int * locationsize, - const char * * st, int * stsize) -{ - int a, b, i; - i = 0; - a = i; /* start of the line */ - b = 0; - while(i<size) - { - switch(reply[i]) - { - case ':': - if(b==0) - { - b = i; /* end of the "header" */ - /*for(j=a; j<b; j++) - { - putchar(reply[j]); - } - */ - } - break; - case '\x0a': - case '\x0d': - if(b!=0) - { - /*for(j=b+1; j<i; j++) - { - putchar(reply[j]); - } - putchar('\n');*/ - do { b++; } while(reply[b]==' '); - if(0==strncasecmp(reply+a, "location", 8)) - { - *location = reply+b; - *locationsize = i-b; - } - else if(0==strncasecmp(reply+a, "st", 2)) - { - *st = reply+b; - *stsize = i-b; - } - b = 0; - } - a = i+1; - break; - default: - break; - } - i++; - } -} - -/* port upnp discover : SSDP protocol */ -#define PORT 1900 -#define XSTR(s) STR(s) -#define STR(s) #s -#define UPNP_MCAST_ADDR "239.255.255.250" - -/* upnpDiscover() : - * return a chained list of all devices found or NULL if - * no devices was found. - * It is up to the caller to free the chained list - * delay is in millisecond (poll) */ -LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif, - const char * minissdpdsock, int sameport) -{ - struct UPNPDev * tmp; - struct UPNPDev * devlist = 0; - int opt = 1; - static const char MSearchMsgFmt[] = - "M-SEARCH * HTTP/1.1\r\n" - "HOST: " UPNP_MCAST_ADDR ":" XSTR(PORT) "\r\n" - "ST: %s\r\n" - "MAN: "ssdp:discover"\r\n" - "MX: %u\r\n" - "\r\n"; - static const char * const deviceList[] = { - "urn:schemas-upnp-org:device:InternetGatewayDevice:1", - "urn:schemas-upnp-org:service:WANIPConnection:1", - "urn:schemas-upnp-org:service:WANPPPConnection:1", - "upnp:rootdevice", - 0 - }; - int deviceIndex = 0; - char bufr[1536]; /* reception and emission buffer */ - int sudp; - int n; - struct sockaddr sockudp_r; - unsigned int mx; - int rv; - struct addrinfo hints, *servinfo, *p; -#ifdef WIN32 - /*MIB_IPFORWARDROW ip_forward;*/ -#endif - -#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) - /* first try to get infos from minissdpd ! */ - if(!minissdpdsock) - minissdpdsock = "/var/run/minissdpd.sock"; - while(!devlist && deviceList[deviceIndex]) { - devlist = getDevicesFromMiniSSDPD(deviceList[deviceIndex], - minissdpdsock); - /* We return what we have found if it was not only a rootdevice */ - if(devlist && !strstr(deviceList[deviceIndex], "rootdevice")) - return devlist; - deviceIndex++; - } - deviceIndex = 0; -#endif - /* fallback to direct discovery */ -#ifdef WIN32 - sudp = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); -#else - sudp = socket(PF_INET, SOCK_DGRAM, 0); -#endif - if(sudp < 0) - { - PRINT_SOCKET_ERROR("socket"); - return NULL; - } - /* reception */ - memset(&sockudp_r, 0, sizeof(struct sockaddr)); - if(0/*ipv6*/) { - struct sockaddr_in6 * p = (struct sockaddr_in6 *)&sockudp_r; - p->sin6_family = AF_INET6; - if(sameport) - p->sin6_port = htons(PORT); - p->sin6_addr = in6addr_any;//IN6ADDR_ANY_INIT;/*INADDR_ANY;*/ - } else { - struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_r; - p->sin_family = AF_INET; - if(sameport) - p->sin_port = htons(PORT); - p->sin_addr.s_addr = INADDR_ANY; - } -#if 0 - /* emission */ - memset(&sockudp_w, 0, sizeof(struct sockaddr_in)); - sockudp_w.sin_family = AF_INET; - sockudp_w.sin_port = htons(PORT); - sockudp_w.sin_addr.s_addr = inet_addr(UPNP_MCAST_ADDR); -#endif -#ifdef WIN32 -/* This code could help us to use the right Network interface for - * SSDP multicast traffic */ -/* TODO : Get IP associated with the index given in the ip_forward struct - * in order to give this ip to setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF) */ - /* - if(GetBestRoute(inet_addr("223.255.255.255"), 0, &ip_forward) == NO_ERROR) { - DWORD dwRetVal = 0; - PMIB_IPADDRTABLE pIPAddrTable; - DWORD dwSize = 0; - IN_ADDR IPAddr; - int i; - printf("ifIndex=%lu nextHop=%lx \n", ip_forward.dwForwardIfIndex, ip_forward.dwForwardNextHop); - pIPAddrTable = (MIB_IPADDRTABLE *) malloc(sizeof (MIB_IPADDRTABLE)); - if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { - free(pIPAddrTable); - pIPAddrTable = (MIB_IPADDRTABLE *) malloc(dwSize); - } - if(pIPAddrTable) { - dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 ); - printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries); - for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) { - printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex); - IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr; - printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); - IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask; - printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); - IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr; - printf("\tBroadCast[%d]: \t%s (%ld)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr); - printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize); - printf("\tType and State[%d]:", i); - printf("\n"); - } - free(pIPAddrTable); - pIPAddrTable = NULL; - } - } -*/ -#endif - -#ifdef WIN32 - if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof (opt)) < 0) -#else - if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) < 0) -#endif - { - PRINT_SOCKET_ERROR("setsockopt"); - return NULL; - } - - if(multicastif) - { - struct in_addr mc_if; - mc_if.s_addr = inet_addr(multicastif); - if(0/*ipv6*/) { - } else { - ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; - } - if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) - { - PRINT_SOCKET_ERROR("setsockopt"); - } - } - - /* Avant d'envoyer le paquet on bind pour recevoir la reponse */ - if (bind(sudp, &sockudp_r, 0/*ipv6*/?sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in)) != 0) - { - PRINT_SOCKET_ERROR("bind"); - closesocket(sudp); - return NULL; - } - - /* Calculating maximum response time in seconds */ - mx = ((unsigned int)delay) / 1000u; - /* receiving SSDP response packet */ - for(n = 0;;) - { - if(n == 0) - { - /* sending the SSDP M-SEARCH packet */ - n = snprintf(bufr, sizeof(bufr), - MSearchMsgFmt, deviceList[deviceIndex++], mx); - /*printf("Sending %s", bufr);*/ -#if 0 - n = sendto(sudp, bufr, n, 0, - (struct sockaddr *)&sockudp_w, sizeof(struct sockaddr_in)); - if (n < 0) { - PRINT_SOCKET_ERROR("sendto"); - closesocket(sudp); - return devlist; - } -#endif - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; // AF_INET6 or AF_INET - hints.ai_socktype = SOCK_DGRAM; - /*hints.ai_flags = */ - if ((rv = getaddrinfo(UPNP_MCAST_ADDR, XSTR(PORT), &hints, &servinfo)) != 0) { -#ifdef WIN32 - fprintf(stderr, "getaddrinfo() failed: %d\n", rv); -#else - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); -#endif - return devlist; - } - for(p = servinfo; p; p = p->ai_next) { - n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen); - if (n < 0) { - PRINT_SOCKET_ERROR("sendto"); - continue; - } - } - freeaddrinfo(servinfo); - if(n < 0) { - closesocket(sudp); - return devlist; - } - } - /* Waiting for SSDP REPLY packet to M-SEARCH */ - n = ReceiveData(sudp, bufr, sizeof(bufr), delay); - if (n < 0) { - /* error */ - closesocket(sudp); - return devlist; - } else if (n == 0) { - /* no data or Time Out */ - if (devlist || (deviceList[deviceIndex] == 0)) { - /* no more device type to look for... */ - closesocket(sudp); - return devlist; - } - } else { - const char * descURL=NULL; - int urlsize=0; - const char * st=NULL; - int stsize=0; - /*printf("%d byte(s) :\n%s\n", n, bufr);*/ /* affichage du message */ - parseMSEARCHReply(bufr, n, &descURL, &urlsize, &st, &stsize); - if(st&&descURL) - { - /*printf("M-SEARCH Reply:\nST: %.*s\nLocation: %.*s\n", - stsize, st, urlsize, descURL); */ - 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, descURL, urlsize); - tmp->buffer[urlsize] = '\0'; - memcpy(tmp->buffer + urlsize + 1, st, stsize); - tmp->buffer[urlsize+1+stsize] = '\0'; - devlist = tmp; - } - } - } -} - -/* freeUPNPDevlist() should be used to - * free the chained list returned by upnpDiscover() */ -LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist) -{ - struct UPNPDev * next; - while(devlist) - { - next = devlist->pNext; - free(devlist); - devlist = next; - } -} - -static void -url_cpy_or_cat(char * dst, const char * src, int n) -{ - if( (src[0] == 'h') - &&(src[1] == 't') - &&(src[2] == 't') - &&(src[3] == 'p') - &&(src[4] == ':') - &&(src[5] == '/') - &&(src[6] == '/')) - { - strncpy(dst, src, n); - } - else - { - int l = strlen(dst); - if(src[0] != '/') - dst[l++] = '/'; - if(l<=n) - strncpy(dst + l, src, n - l); - } -} - -/* Prepare the Urls for usage... - */ -LIBSPEC void GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, - const char * descURL) -{ - char * p; - int n1, n2, n3; - n1 = strlen(data->urlbase); - if(n1==0) - n1 = strlen(descURL); - n1 += 2; /* 1 byte more for Null terminator, 1 byte for '/' if needed */ - n2 = n1; n3 = n1; - n1 += strlen(data->first.scpdurl); - n2 += strlen(data->first.controlurl); - n3 += strlen(data->CIF.controlurl); - - urls->ipcondescURL = (char *)malloc(n1); - urls->controlURL = (char *)malloc(n2); - urls->controlURL_CIF = (char *)malloc(n3); - /* maintenant on chope la desc du WANIPConnection */ - if(data->urlbase[0] != '\0') - strncpy(urls->ipcondescURL, data->urlbase, n1); - else - strncpy(urls->ipcondescURL, descURL, n1); - p = strchr(urls->ipcondescURL+7, '/'); - if(p) p[0] = '\0'; - strncpy(urls->controlURL, urls->ipcondescURL, n2); - strncpy(urls->controlURL_CIF, urls->ipcondescURL, n3); - - url_cpy_or_cat(urls->ipcondescURL, data->first.scpdurl, n1); - - url_cpy_or_cat(urls->controlURL, data->first.controlurl, n2); - - url_cpy_or_cat(urls->controlURL_CIF, data->CIF.controlurl, n3); - -#ifdef DEBUG - printf("urls->ipcondescURL='%s' %u n1=%d\n", urls->ipcondescURL, - (unsigned)strlen(urls->ipcondescURL), n1); - printf("urls->controlURL='%s' %u n2=%d\n", urls->controlURL, - (unsigned)strlen(urls->controlURL), n2); - printf("urls->controlURL_CIF='%s' %u n3=%d\n", urls->controlURL_CIF, - (unsigned)strlen(urls->controlURL_CIF), n3); -#endif -} - -LIBSPEC void -FreeUPNPUrls(struct UPNPUrls * urls) -{ - if(!urls) - return; - free(urls->controlURL); - urls->controlURL = 0; - free(urls->ipcondescURL); - urls->ipcondescURL = 0; - free(urls->controlURL_CIF); - urls->controlURL_CIF = 0; -} - - -int ReceiveData(int socket, char * data, int length, int timeout) -{ - int n; -#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) - 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) - { - return 0; - } -#else - 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 - n = recv(socket, data, length, 0); - if(n<0) - { - PRINT_SOCKET_ERROR("recv"); - } - return n; -} - -int -UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data) -{ - char status[64]; - unsigned int uptime; - status[0] = '\0'; - UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, - status, &uptime, NULL); - if(0 == strcmp("Connected", status)) - { - return 1; - } - else - return 0; -} - - -/* 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) -{ - char * descXML; - int descXMLsize = 0; - struct UPNPDev * dev; - int ndev = 0; - int state; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */ - if(!devlist) - { -#ifdef DEBUG - printf("Empty devlist\n"); -#endif - return 0; - } - for(state = 1; state <= 3; state++) - { - for(dev = devlist; dev; dev = dev->pNext) - { - /* we should choose an internet gateway device. - * with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */ - descXML = miniwget_getaddr(dev->descURL, &descXMLsize, - lanaddr, lanaddrlen); - if(descXML) - { - ndev++; - memset(data, 0, sizeof(struct IGDdatas)); - memset(urls, 0, sizeof(struct UPNPUrls)); - parserootdesc(descXML, descXMLsize, data); - free(descXML); - descXML = NULL; - if(0==strcmp(data->CIF.servicetype, - "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1") - || state >= 3 ) - { - GetUPNPUrls(urls, data, dev->descURL); - -#ifdef DEBUG - printf("UPNPIGD_IsConnected(%s) = %d\n", - urls->controlURL, - UPNPIGD_IsConnected(urls, data)); -#endif - if((state >= 2) || UPNPIGD_IsConnected(urls, data)) - return state; - FreeUPNPUrls(urls); - if(data->second.servicetype[0] != '\0') { -#ifdef DEBUG - printf("We tried %s, now we try %s !\n", - data->first.servicetype, data->second.servicetype); -#endif - /* swaping WANPPPConnection and WANIPConnection ! */ - memcpy(&data->tmp, &data->first, sizeof(struct IGDdatas_service)); - memcpy(&data->first, &data->second, sizeof(struct IGDdatas_service)); - memcpy(&data->second, &data->tmp, sizeof(struct IGDdatas_service)); - GetUPNPUrls(urls, data, dev->descURL); -#ifdef DEBUG - printf("UPNPIGD_IsConnected(%s) = %d\n", - urls->controlURL, - UPNPIGD_IsConnected(urls, data)); -#endif - if((state >= 2) || UPNPIGD_IsConnected(urls, data)) - return state; - FreeUPNPUrls(urls); - } - } - memset(data, 0, sizeof(struct IGDdatas)); - } -#ifdef DEBUG - else - { - printf("error getting XML description %s\n", dev->descURL); - } -#endif - } - } - return 0; -} - -/* UPNP_GetIGDFromUrl() - * Used when skipping the discovery process. - * return value : - * 0 - Not ok - * 1 - OK */ -int -UPNP_GetIGDFromUrl(const char * rootdescurl, - struct UPNPUrls * urls, - struct IGDdatas * data, - char * lanaddr, int lanaddrlen) -{ - char * descXML; - int descXMLsize = 0; - descXML = miniwget_getaddr(rootdescurl, &descXMLsize, - lanaddr, lanaddrlen); - if(descXML) { - memset(data, 0, sizeof(struct IGDdatas)); - memset(urls, 0, sizeof(struct UPNPUrls)); - parserootdesc(descXML, descXMLsize, data); - free(descXML); - descXML = NULL; - GetUPNPUrls(urls, data, rootdescurl); - return 1; - } else { - return 0; - } -} -
Copied: vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c (from rev 4535, vidalia/trunk/src/miniupnpc/miniupnpc.c) =================================================================== --- vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c (rev 0) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniupnpc.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,896 @@ +/* $Id: miniupnpc.c,v 1.78 2010/04/05 20:36:59 nanard Exp $ */ +/* Project : miniupnp + * Author : Thomas BERNARD + * copyright (c) 2005-2010 Thomas Bernard + * This software is subjet to the conditions detailed in the + * provided LICENSE file. */ +#define __EXTENSIONS__ 1 +#if !defined(MACOSX) && !defined(__sun) +#if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__) +#ifndef __cplusplus +#define _XOPEN_SOURCE 600 +#endif +#endif +#ifndef __BSD_VISIBLE +#define __BSD_VISIBLE 1 +#endif +#endif + +#ifdef __APPLE__ +#define _DARWIN_C_SOURCE +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#ifdef WIN32 +/* Win32 Specific includes and defines */ +#include <winsock2.h> +#include <ws2tcpip.h> +#ifdef WIN2K +# define __inline static inline +# include <wspiapi.h> +#endif +#include <io.h> +/*#include <IPHlpApi.h>*/ +#define snprintf _snprintf +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#define strncasecmp _memicmp +#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ +#define strncasecmp memicmp +#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ +#define MAXHOSTNAMELEN 64 +#else /* #ifdef WIN32 */ +/* Standard POSIX includes */ +#include <unistd.h> +#if defined(__amigaos__) && !defined(__amigaos4__) +/* Amiga OS 3 specific stuff */ +#define socklen_t int +#else +#include <sys/select.h> +#endif +#if defined(__APPLE__) +#undef _POSIX_C_SOURCE +#endif +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#if !defined(__amigaos__) && !defined(__amigaos4__) +#include <poll.h> +#endif +#include <strings.h> +#include <errno.h> +#define closesocket close +#define MINIUPNPC_IGNORE_EINTR +#endif /* #else WIN32 */ +#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT +#include <sys/time.h> +#endif +#if defined(__amigaos__) || defined(__amigaos4__) +/* Amiga OS specific stuff */ +#define TIMEVAL struct timeval +#endif + +#include "miniupnpc.h" +#include "minissdpc.h" +#include "miniwget.h" +#include "minisoap.h" +#include "minixml.h" +#include "upnpcommands.h" +#include "connecthostport.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 + +#define SOAPPREFIX "s" +#define SERVICEPREFIX "u" +#define SERVICEPREFIX2 'u' + +/* root description parsing */ +LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data) +{ + struct xmlparser parser; + /* xmlparser object */ + parser.xmlstart = buffer; + parser.xmlsize = bufsize; + parser.data = data; + parser.starteltfunc = IGDstartelt; + parser.endeltfunc = IGDendelt; + parser.datafunc = IGDdata; + parser.attfunc = 0; + parsexml(&parser); +#ifdef DEBUG + printIGD(data); +#endif +} + +/* getcontentlenfromline() : parse the Content-Length HTTP header line. + * Content-length: nnn */ +static int getcontentlenfromline(const char * p, int n) +{ + static const char contlenstr[] = "content-length"; + const char * p2 = contlenstr; + int a = 0; + while(*p2) + { + if(n==0) + return -1; + if(*p2 != *p && *p2 != (*p + 32)) + return -1; + p++; p2++; n--; + } + if(n==0) + return -1; + if(*p != ':') + return -1; + p++; n--; + while(*p == ' ') + { + if(n==0) + return -1; + p++; n--; + } + while(*p >= '0' && *p <= '9') + { + if(n==0) + return -1; + a = (a * 10) + (*p - '0'); + p++; n--; + } + return a; +} + +/* getContentLengthAndHeaderLength() + * retrieve header length and content length from an HTTP response + * TODO : retrieve Transfer-Encoding: header value, in order to support + * HTTP/1.1, chunked transfer encoding must be supported. */ +static void +getContentLengthAndHeaderLength(char * p, int n, + int * contentlen, int * headerlen) +{ + char * line; + int linelen; + int r; + line = p; + while(line < p + n) + { + linelen = 0; + while(line[linelen] != '\r' && line[linelen] != '\r') + { + if(line+linelen >= p+n) + return; + linelen++; + } + r = getcontentlenfromline(line, linelen); + if(r>0) + *contentlen = r; + line = line + linelen + 2; + if(line[0] == '\r' && line[1] == '\n') + { + *headerlen = (line - p) + 2; + return; + } + } +} + +/* simpleUPnPcommand : + * not so simple ! + * return values : + * 0 - OK + * -1 - error */ +int simpleUPnPcommand(int s, const char * url, const char * service, + const char * action, struct UPNParg * args, + char * buffer, int * bufsize) +{ + char hostname[MAXHOSTNAMELEN+1]; + unsigned short port = 0; + char * path; + char soapact[128]; + char soapbody[2048]; + char * buf; + int buffree; + int n; + int contentlen, headerlen; /* for the response */ + + snprintf(soapact, sizeof(soapact), "%s#%s", service, action); + if(args==NULL) + { + /*soapbodylen = */snprintf(soapbody, sizeof(soapbody), + "<?xml version=\"1.0\"?>\r\n" + "<" SOAPPREFIX ":Envelope " + "xmlns:" SOAPPREFIX "="http://schemas.xmlsoap.org/soap/envelope/%5C" " + SOAPPREFIX ":encodingStyle="http://schemas.xmlsoap.org/soap/encoding/%5C%22%3E" + "<" SOAPPREFIX ":Body>" + "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "="%s">" + "</" SERVICEPREFIX ":%s>" + "</" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>" + "\r\n", action, service, action); + } + else + { + char * p; + const char * pe, * pv; + int soapbodylen; + soapbodylen = snprintf(soapbody, sizeof(soapbody), + "<?xml version=\"1.0\"?>\r\n" + "<" SOAPPREFIX ":Envelope " + "xmlns:" SOAPPREFIX "="http://schemas.xmlsoap.org/soap/envelope/%5C" " + SOAPPREFIX ":encodingStyle="http://schemas.xmlsoap.org/soap/encoding/%5C%22%3E" + "<" SOAPPREFIX ":Body>" + "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "="%s">", + action, service); + p = soapbody + soapbodylen; + while(args->elt) + { + /* check that we are never overflowing the string... */ + if(soapbody + sizeof(soapbody) <= p + 100) + { + /* we keep a margin of at least 100 bytes */ + *bufsize = 0; + return -1; + } + *(p++) = '<'; + pe = args->elt; + while(*pe) + *(p++) = *(pe++); + *(p++) = '>'; + if((pv = args->val)) + { + while(*pv) + *(p++) = *(pv++); + } + *(p++) = '<'; + *(p++) = '/'; + pe = args->elt; + while(*pe) + *(p++) = *(pe++); + *(p++) = '>'; + args++; + } + *(p++) = '<'; + *(p++) = '/'; + *(p++) = SERVICEPREFIX2; + *(p++) = ':'; + pe = action; + while(*pe) + *(p++) = *(pe++); + strncpy(p, "></" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>\r\n", + soapbody + sizeof(soapbody) - p); + } + if(!parseURL(url, hostname, &port, &path)) return -1; + if(s<0) + { + s = connecthostport(hostname, port); + if(s < 0) + { + *bufsize = 0; + return -1; + } + } + + n = soapPostSubmit(s, path, hostname, port, soapact, soapbody); + if(n<=0) { +#ifdef DEBUG + printf("Error sending SOAP request\n"); +#endif + closesocket(s); + return -1; + } + + contentlen = -1; + headerlen = -1; + buf = buffer; + buffree = *bufsize; + *bufsize = 0; + while ((n = ReceiveData(s, buf, buffree, 5000)) > 0) { + buffree -= n; + buf += n; + *bufsize += n; + getContentLengthAndHeaderLength(buffer, *bufsize, + &contentlen, &headerlen); +#ifdef DEBUG + printf("received n=%dbytes bufsize=%d ContLen=%d HeadLen=%d\n", + n, *bufsize, contentlen, headerlen); +#endif + /* break if we received everything */ + if(contentlen > 0 && headerlen > 0 && *bufsize >= contentlen+headerlen) + break; + } + + closesocket(s); + return 0; +} + +/* parseMSEARCHReply() + * the last 4 arguments are filled during the parsing : + * - location/locationsize : "location:" field of the SSDP reply packet + * - st/stsize : "st:" field of the SSDP reply packet. + * The strings are NOT null terminated */ +static void +parseMSEARCHReply(const char * reply, int size, + const char * * location, int * locationsize, + const char * * st, int * stsize) +{ + int a, b, i; + i = 0; + a = i; /* start of the line */ + b = 0; + while(i<size) + { + switch(reply[i]) + { + case ':': + if(b==0) + { + b = i; /* end of the "header" */ + /*for(j=a; j<b; j++) + { + putchar(reply[j]); + } + */ + } + break; + case '\x0a': + case '\x0d': + if(b!=0) + { + /*for(j=b+1; j<i; j++) + { + putchar(reply[j]); + } + putchar('\n');*/ + do { b++; } while(reply[b]==' '); + if(0==strncasecmp(reply+a, "location", 8)) + { + *location = reply+b; + *locationsize = i-b; + } + else if(0==strncasecmp(reply+a, "st", 2)) + { + *st = reply+b; + *stsize = i-b; + } + b = 0; + } + a = i+1; + break; + default: + break; + } + i++; + } +} + +/* port upnp discover : SSDP protocol */ +#define PORT 1900 +#define XSTR(s) STR(s) +#define STR(s) #s +#define UPNP_MCAST_ADDR "239.255.255.250" + +/* upnpDiscover() : + * return a chained list of all devices found or NULL if + * no devices was found. + * It is up to the caller to free the chained list + * delay is in millisecond (poll) */ +LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif, + const char * minissdpdsock, int sameport) +{ + struct UPNPDev * tmp; + struct UPNPDev * devlist = 0; + int opt = 1; + static const char MSearchMsgFmt[] = + "M-SEARCH * HTTP/1.1\r\n" + "HOST: " UPNP_MCAST_ADDR ":" XSTR(PORT) "\r\n" + "ST: %s\r\n" + "MAN: "ssdp:discover"\r\n" + "MX: %u\r\n" + "\r\n"; + static const char * const deviceList[] = { + "urn:schemas-upnp-org:device:InternetGatewayDevice:1", + "urn:schemas-upnp-org:service:WANIPConnection:1", + "urn:schemas-upnp-org:service:WANPPPConnection:1", + "upnp:rootdevice", + 0 + }; + int deviceIndex = 0; + char bufr[1536]; /* reception and emission buffer */ + int sudp; + int n; + struct sockaddr sockudp_r; + unsigned int mx; + int rv; + struct addrinfo hints, *servinfo, *p; +#ifdef WIN32 + /*MIB_IPFORWARDROW ip_forward;*/ +#endif + +#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) + /* first try to get infos from minissdpd ! */ + if(!minissdpdsock) + minissdpdsock = "/var/run/minissdpd.sock"; + while(!devlist && deviceList[deviceIndex]) { + devlist = getDevicesFromMiniSSDPD(deviceList[deviceIndex], + minissdpdsock); + /* We return what we have found if it was not only a rootdevice */ + if(devlist && !strstr(deviceList[deviceIndex], "rootdevice")) + return devlist; + deviceIndex++; + } + deviceIndex = 0; +#endif + /* fallback to direct discovery */ +#ifdef WIN32 + sudp = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); +#else + sudp = socket(PF_INET, SOCK_DGRAM, 0); +#endif + if(sudp < 0) + { + PRINT_SOCKET_ERROR("socket"); + return NULL; + } + /* reception */ + memset(&sockudp_r, 0, sizeof(struct sockaddr)); + if(0/*ipv6*/) { + struct sockaddr_in6 * p = (struct sockaddr_in6 *)&sockudp_r; + p->sin6_family = AF_INET6; + if(sameport) + p->sin6_port = htons(PORT); + p->sin6_addr = in6addr_any;//IN6ADDR_ANY_INIT;/*INADDR_ANY;*/ + } else { + struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_r; + p->sin_family = AF_INET; + if(sameport) + p->sin_port = htons(PORT); + p->sin_addr.s_addr = INADDR_ANY; + } +#if 0 + /* emission */ + memset(&sockudp_w, 0, sizeof(struct sockaddr_in)); + sockudp_w.sin_family = AF_INET; + sockudp_w.sin_port = htons(PORT); + sockudp_w.sin_addr.s_addr = inet_addr(UPNP_MCAST_ADDR); +#endif +#ifdef WIN32 +/* This code could help us to use the right Network interface for + * SSDP multicast traffic */ +/* TODO : Get IP associated with the index given in the ip_forward struct + * in order to give this ip to setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF) */ + /* + if(GetBestRoute(inet_addr("223.255.255.255"), 0, &ip_forward) == NO_ERROR) { + DWORD dwRetVal = 0; + PMIB_IPADDRTABLE pIPAddrTable; + DWORD dwSize = 0; + IN_ADDR IPAddr; + int i; + printf("ifIndex=%lu nextHop=%lx \n", ip_forward.dwForwardIfIndex, ip_forward.dwForwardNextHop); + pIPAddrTable = (MIB_IPADDRTABLE *) malloc(sizeof (MIB_IPADDRTABLE)); + if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { + free(pIPAddrTable); + pIPAddrTable = (MIB_IPADDRTABLE *) malloc(dwSize); + } + if(pIPAddrTable) { + dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 ); + printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries); + for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) { + printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex); + IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr; + printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); + IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask; + printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); + IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr; + printf("\tBroadCast[%d]: \t%s (%ld)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr); + printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize); + printf("\tType and State[%d]:", i); + printf("\n"); + } + free(pIPAddrTable); + pIPAddrTable = NULL; + } + } +*/ +#endif + +#ifdef WIN32 + if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof (opt)) < 0) +#else + if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) < 0) +#endif + { + PRINT_SOCKET_ERROR("setsockopt"); + return NULL; + } + + if(multicastif) + { + struct in_addr mc_if; + mc_if.s_addr = inet_addr(multicastif); + if(0/*ipv6*/) { + } else { + ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; + } + if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) + { + PRINT_SOCKET_ERROR("setsockopt"); + } + } + + /* Avant d'envoyer le paquet on bind pour recevoir la reponse */ + if (bind(sudp, &sockudp_r, 0/*ipv6*/?sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in)) != 0) + { + PRINT_SOCKET_ERROR("bind"); + closesocket(sudp); + return NULL; + } + + /* Calculating maximum response time in seconds */ + mx = ((unsigned int)delay) / 1000u; + /* receiving SSDP response packet */ + for(n = 0;;) + { + if(n == 0) + { + /* sending the SSDP M-SEARCH packet */ + n = snprintf(bufr, sizeof(bufr), + MSearchMsgFmt, deviceList[deviceIndex++], mx); + /*printf("Sending %s", bufr);*/ +#if 0 + n = sendto(sudp, bufr, n, 0, + (struct sockaddr *)&sockudp_w, sizeof(struct sockaddr_in)); + if (n < 0) { + PRINT_SOCKET_ERROR("sendto"); + closesocket(sudp); + return devlist; + } +#endif + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; // AF_INET6 or AF_INET + hints.ai_socktype = SOCK_DGRAM; + /*hints.ai_flags = */ + if ((rv = getaddrinfo(UPNP_MCAST_ADDR, XSTR(PORT), &hints, &servinfo)) != 0) { +#ifdef WIN32 + fprintf(stderr, "getaddrinfo() failed: %d\n", rv); +#else + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); +#endif + return devlist; + } + for(p = servinfo; p; p = p->ai_next) { + n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen); + if (n < 0) { + PRINT_SOCKET_ERROR("sendto"); + continue; + } + } + freeaddrinfo(servinfo); + if(n < 0) { + closesocket(sudp); + return devlist; + } + } + /* Waiting for SSDP REPLY packet to M-SEARCH */ + n = ReceiveData(sudp, bufr, sizeof(bufr), delay); + if (n < 0) { + /* error */ + closesocket(sudp); + return devlist; + } else if (n == 0) { + /* no data or Time Out */ + if (devlist || (deviceList[deviceIndex] == 0)) { + /* no more device type to look for... */ + closesocket(sudp); + return devlist; + } + } else { + const char * descURL=NULL; + int urlsize=0; + const char * st=NULL; + int stsize=0; + /*printf("%d byte(s) :\n%s\n", n, bufr);*/ /* affichage du message */ + parseMSEARCHReply(bufr, n, &descURL, &urlsize, &st, &stsize); + if(st&&descURL) + { + /*printf("M-SEARCH Reply:\nST: %.*s\nLocation: %.*s\n", + stsize, st, urlsize, descURL); */ + 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, descURL, urlsize); + tmp->buffer[urlsize] = '\0'; + memcpy(tmp->buffer + urlsize + 1, st, stsize); + tmp->buffer[urlsize+1+stsize] = '\0'; + devlist = tmp; + } + } + } +} + +/* freeUPNPDevlist() should be used to + * free the chained list returned by upnpDiscover() */ +LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist) +{ + struct UPNPDev * next; + while(devlist) + { + next = devlist->pNext; + free(devlist); + devlist = next; + } +} + +static void +url_cpy_or_cat(char * dst, const char * src, int n) +{ + if( (src[0] == 'h') + &&(src[1] == 't') + &&(src[2] == 't') + &&(src[3] == 'p') + &&(src[4] == ':') + &&(src[5] == '/') + &&(src[6] == '/')) + { + strncpy(dst, src, n); + } + else + { + int l = strlen(dst); + if(src[0] != '/') + dst[l++] = '/'; + if(l<=n) + strncpy(dst + l, src, n - l); + } +} + +/* Prepare the Urls for usage... + */ +LIBSPEC void GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, + const char * descURL) +{ + char * p; + int n1, n2, n3; + n1 = strlen(data->urlbase); + if(n1==0) + n1 = strlen(descURL); + n1 += 2; /* 1 byte more for Null terminator, 1 byte for '/' if needed */ + n2 = n1; n3 = n1; + n1 += strlen(data->first.scpdurl); + n2 += strlen(data->first.controlurl); + n3 += strlen(data->CIF.controlurl); + + urls->ipcondescURL = (char *)malloc(n1); + urls->controlURL = (char *)malloc(n2); + urls->controlURL_CIF = (char *)malloc(n3); + /* maintenant on chope la desc du WANIPConnection */ + if(data->urlbase[0] != '\0') + strncpy(urls->ipcondescURL, data->urlbase, n1); + else + strncpy(urls->ipcondescURL, descURL, n1); + p = strchr(urls->ipcondescURL+7, '/'); + if(p) p[0] = '\0'; + strncpy(urls->controlURL, urls->ipcondescURL, n2); + strncpy(urls->controlURL_CIF, urls->ipcondescURL, n3); + + url_cpy_or_cat(urls->ipcondescURL, data->first.scpdurl, n1); + + url_cpy_or_cat(urls->controlURL, data->first.controlurl, n2); + + url_cpy_or_cat(urls->controlURL_CIF, data->CIF.controlurl, n3); + +#ifdef DEBUG + printf("urls->ipcondescURL='%s' %u n1=%d\n", urls->ipcondescURL, + (unsigned)strlen(urls->ipcondescURL), n1); + printf("urls->controlURL='%s' %u n2=%d\n", urls->controlURL, + (unsigned)strlen(urls->controlURL), n2); + printf("urls->controlURL_CIF='%s' %u n3=%d\n", urls->controlURL_CIF, + (unsigned)strlen(urls->controlURL_CIF), n3); +#endif +} + +LIBSPEC void +FreeUPNPUrls(struct UPNPUrls * urls) +{ + if(!urls) + return; + free(urls->controlURL); + urls->controlURL = 0; + free(urls->ipcondescURL); + urls->ipcondescURL = 0; + free(urls->controlURL_CIF); + urls->controlURL_CIF = 0; +} + + +int ReceiveData(int socket, char * data, int length, int timeout) +{ + int n; +#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) + 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) + { + return 0; + } +#else + 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 + n = recv(socket, data, length, 0); + if(n<0) + { + PRINT_SOCKET_ERROR("recv"); + } + return n; +} + +int +UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data) +{ + char status[64]; + unsigned int uptime; + status[0] = '\0'; + UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, + status, &uptime, NULL); + if(0 == strcmp("Connected", status)) + { + return 1; + } + else + return 0; +} + + +/* 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) +{ + char * descXML; + int descXMLsize = 0; + struct UPNPDev * dev; + int ndev = 0; + int state; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */ + if(!devlist) + { +#ifdef DEBUG + printf("Empty devlist\n"); +#endif + return 0; + } + for(state = 1; state <= 3; state++) + { + for(dev = devlist; dev; dev = dev->pNext) + { + /* we should choose an internet gateway device. + * with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */ + descXML = miniwget_getaddr(dev->descURL, &descXMLsize, + lanaddr, lanaddrlen); + if(descXML) + { + ndev++; + memset(data, 0, sizeof(struct IGDdatas)); + memset(urls, 0, sizeof(struct UPNPUrls)); + parserootdesc(descXML, descXMLsize, data); + free(descXML); + descXML = NULL; + if(0==strcmp(data->CIF.servicetype, + "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1") + || state >= 3 ) + { + GetUPNPUrls(urls, data, dev->descURL); + +#ifdef DEBUG + printf("UPNPIGD_IsConnected(%s) = %d\n", + urls->controlURL, + UPNPIGD_IsConnected(urls, data)); +#endif + if((state >= 2) || UPNPIGD_IsConnected(urls, data)) + return state; + FreeUPNPUrls(urls); + if(data->second.servicetype[0] != '\0') { +#ifdef DEBUG + printf("We tried %s, now we try %s !\n", + data->first.servicetype, data->second.servicetype); +#endif + /* swaping WANPPPConnection and WANIPConnection ! */ + memcpy(&data->tmp, &data->first, sizeof(struct IGDdatas_service)); + memcpy(&data->first, &data->second, sizeof(struct IGDdatas_service)); + memcpy(&data->second, &data->tmp, sizeof(struct IGDdatas_service)); + GetUPNPUrls(urls, data, dev->descURL); +#ifdef DEBUG + printf("UPNPIGD_IsConnected(%s) = %d\n", + urls->controlURL, + UPNPIGD_IsConnected(urls, data)); +#endif + if((state >= 2) || UPNPIGD_IsConnected(urls, data)) + return state; + FreeUPNPUrls(urls); + } + } + memset(data, 0, sizeof(struct IGDdatas)); + } +#ifdef DEBUG + else + { + printf("error getting XML description %s\n", dev->descURL); + } +#endif + } + } + return 0; +} + +/* UPNP_GetIGDFromUrl() + * Used when skipping the discovery process. + * return value : + * 0 - Not ok + * 1 - OK */ +int +UPNP_GetIGDFromUrl(const char * rootdescurl, + struct UPNPUrls * urls, + struct IGDdatas * data, + char * lanaddr, int lanaddrlen) +{ + char * descXML; + int descXMLsize = 0; + descXML = miniwget_getaddr(rootdescurl, &descXMLsize, + lanaddr, lanaddrlen); + if(descXML) { + memset(data, 0, sizeof(struct IGDdatas)); + memset(urls, 0, sizeof(struct UPNPUrls)); + parserootdesc(descXML, descXMLsize, data); + free(descXML); + descXML = NULL; + GetUPNPUrls(urls, data, rootdescurl); + return 1; + } else { + return 0; + } +} +
Deleted: vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c =================================================================== --- vidalia/trunk/src/miniupnpc/miniwget.c 2011-03-18 11:30:36 UTC (rev 4532) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -1,250 +0,0 @@ -/* $Id: miniwget.c,v 1.36 2010/04/05 12:34:05 nanard Exp $ */ -/* Project : miniupnp - * 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 <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "miniupnpc.h" -#ifdef WIN32 -#include <winsock2.h> -#include <ws2tcpip.h> -#include <io.h> -#define MAXHOSTNAMELEN 64 -#define MIN(x,y) (((x)<(y))?(x):(y)) -#define snprintf _snprintf -#define socklen_t int -#else /* #ifdef WIN32 */ -#include <unistd.h> -#include <sys/param.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 <arpa/inet.h> -#include <netdb.h> -#define closesocket close -/* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions - * during the connect() call */ -#define MINIUPNPC_IGNORE_EINTR -#endif /* #else WIN32 */ -#if defined(__sun) || defined(sun) -#define MIN(x,y) (((x)<(y))?(x):(y)) -#endif - -#include "miniupnpcstrings.h" -#include "miniwget.h" -#include "connecthostport.h" - -/* miniwget2() : - * do all the work. - * Return NULL if something failed. */ -static void * -miniwget2(const char * url, const char * host, - unsigned short port, const char * path, - int * size, char * addr_str, int addr_str_len) -{ - char buf[2048]; - int s; - int n; - int len; - int sent; - - *size = 0; - s = connecthostport(host, port); - if(s < 0) - return NULL; - - /* get address for caller ! */ - if(addr_str) - { - struct sockaddr saddr; - socklen_t saddrlen; - - saddrlen = sizeof(saddr); - if(getsockname(s, &saddr, &saddrlen) < 0) - { - perror("getsockname"); - } - else - { -#if defined(__amigaos__) && !defined(__amigaos4__) - /* using INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); - * But his function make a string with the port : nn.nn.nn.nn:port */ -/* if(WSAAddressToStringA((SOCKADDR *)&saddr, sizeof(saddr), - NULL, addr_str, (DWORD *)&addr_str_len)) - { - printf("WSAAddressToStringA() failed : %d\n", WSAGetLastError()); - }*/ - strncpy(addr_str, inet_ntoa(((struct sockaddr_in *)&saddr)->sin_addr), addr_str_len); -#else - /*inet_ntop(AF_INET, &saddr.sin_addr, addr_str, addr_str_len);*/ - n = getnameinfo(&saddr, saddrlen, - addr_str, addr_str_len, - NULL, 0, - NI_NUMERICHOST | NI_NUMERICSERV); - if(n != 0) { -#ifdef WIN32 - fprintf(stderr, "getnameinfo() failed : %d\n", n); -#else - fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n)); -#endif - } -#endif - } -#ifdef DEBUG - printf("address miniwget : %s\n", addr_str); -#endif - } - - len = snprintf(buf, sizeof(buf), - "GET %s HTTP/1.0\r\n" - "Host: %s:%d\r\n" - "Connection: Close\r\n" - "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" - - "\r\n", - path, host, port); - sent = 0; - /* sending the HTTP request */ - while(sent < len) - { - n = send(s, buf+sent, len-sent, 0); - if(n < 0) - { - perror("send"); - closesocket(s); - return NULL; - } - else - { - sent += n; - } - } - { - /* TODO : in order to support HTTP/1.1, chunked transfer encoding - * must be supported. That means parsing of headers must be - * added. */ - int headers=1; - char * respbuffer = NULL; - int allreadyread = 0; - /*while((n = recv(s, buf, 2048, 0)) > 0)*/ - while((n = ReceiveData(s, buf, 2048, 5000)) > 0) - { - if(headers) - { - int i=0; - while(i<n-3) - { - /* searching for the end of the HTTP headers */ - if(buf[i]=='\r' && buf[i+1]=='\n' - && buf[i+2]=='\r' && buf[i+3]=='\n') - { - headers = 0; /* end */ - if(i<n-4) - { - /* Copy the content into respbuffet */ - respbuffer = (char *)realloc((void *)respbuffer, - allreadyread+(n-i-4)); - memcpy(respbuffer+allreadyread, buf + i + 4, n-i-4); - allreadyread += (n-i-4); - } - break; - } - i++; - } - } - else - { - respbuffer = (char *)realloc((void *)respbuffer, - allreadyread+n); - memcpy(respbuffer+allreadyread, buf, n); - allreadyread += n; - } - } - *size = allreadyread; -#ifdef DEBUG - printf("%d bytes read\n", *size); -#endif - closesocket(s); - return respbuffer; - } -} - -/* parseURL() - * arguments : - * url : source string not modified - * hostname : hostname destination string (size of MAXHOSTNAMELEN+1) - * port : port (destination) - * path : pointer to the path part of the URL - * - * Return values : - * 0 - Failure - * 1 - Success */ -int parseURL(const char * url, char * hostname, unsigned short * port, char * * path) -{ - char * p1, *p2, *p3; - p1 = strstr(url, "://"); - if(!p1) - return 0; - p1 += 3; - if( (url[0]!='h') || (url[1]!='t') - ||(url[2]!='t') || (url[3]!='p')) - return 0; - p2 = strchr(p1, ':'); - p3 = strchr(p1, '/'); - if(!p3) - return 0; - memset(hostname, 0, MAXHOSTNAMELEN + 1); - if(!p2 || (p2>p3)) - { - strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p3-p1))); - *port = 80; - } - else - { - strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1))); - *port = 0; - p2++; - while( (*p2 >= '0') && (*p2 <= '9')) - { - *port *= 10; - *port += (unsigned short)(*p2 - '0'); - p2++; - } - } - *path = p3; - return 1; -} - -void * miniwget(const char * url, int * size) -{ - unsigned short port; - char * path; - /* protocol://host:port/chemin */ - char hostname[MAXHOSTNAMELEN+1]; - *size = 0; - if(!parseURL(url, hostname, &port, &path)) - return NULL; - return miniwget2(url, hostname, port, path, size, 0, 0); -} - -void * miniwget_getaddr(const char * url, int * size, char * addr, int addrlen) -{ - unsigned short port; - char * path; - /* protocol://host:port/chemin */ - char hostname[MAXHOSTNAMELEN+1]; - *size = 0; - if(addr) - addr[0] = '\0'; - if(!parseURL(url, hostname, &port, &path)) - return NULL; - return miniwget2(url, hostname, port, path, size, addr, addrlen); -} -
Copied: vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c (from rev 4535, vidalia/trunk/src/miniupnpc/miniwget.c) =================================================================== --- vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c (rev 0) +++ vidalia/tags/vidalia-0.2.11/src/miniupnpc/miniwget.c 2011-03-20 15:40:12 UTC (rev 4538) @@ -0,0 +1,254 @@ +/* $Id: miniwget.c,v 1.36 2010/04/05 12:34:05 nanard Exp $ */ +/* Project : miniupnp + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "miniupnpc.h" +#ifdef WIN32 +#include <winsock2.h> +#include <ws2tcpip.h> +#ifdef WIN2K +# define __inline static inline +# include <wspiapi.h> +#endif +#include <io.h> +#define MAXHOSTNAMELEN 64 +#define MIN(x,y) (((x)<(y))?(x):(y)) +#define snprintf _snprintf +#define socklen_t int +#else /* #ifdef WIN32 */ +#include <unistd.h> +#include <sys/param.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 <arpa/inet.h> +#include <netdb.h> +#define closesocket close +/* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions + * during the connect() call */ +#define MINIUPNPC_IGNORE_EINTR +#endif /* #else WIN32 */ +#if defined(__sun) || defined(sun) +#define MIN(x,y) (((x)<(y))?(x):(y)) +#endif + +#include "miniupnpcstrings.h" +#include "miniwget.h" +#include "connecthostport.h" + +/* miniwget2() : + * do all the work. + * Return NULL if something failed. */ +static void * +miniwget2(const char * url, const char * host, + unsigned short port, const char * path, + int * size, char * addr_str, int addr_str_len) +{ + char buf[2048]; + int s; + int n; + int len; + int sent; + + *size = 0; + s = connecthostport(host, port); + if(s < 0) + return NULL; + + /* get address for caller ! */ + if(addr_str) + { + struct sockaddr saddr; + socklen_t saddrlen; + + saddrlen = sizeof(saddr); + if(getsockname(s, &saddr, &saddrlen) < 0) + { + perror("getsockname"); + } + else + { +#if defined(__amigaos__) && !defined(__amigaos4__) + /* using INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); + * But his function make a string with the port : nn.nn.nn.nn:port */ +/* if(WSAAddressToStringA((SOCKADDR *)&saddr, sizeof(saddr), + NULL, addr_str, (DWORD *)&addr_str_len)) + { + printf("WSAAddressToStringA() failed : %d\n", WSAGetLastError()); + }*/ + strncpy(addr_str, inet_ntoa(((struct sockaddr_in *)&saddr)->sin_addr), addr_str_len); +#else + /*inet_ntop(AF_INET, &saddr.sin_addr, addr_str, addr_str_len);*/ + n = getnameinfo(&saddr, saddrlen, + addr_str, addr_str_len, + NULL, 0, + NI_NUMERICHOST | NI_NUMERICSERV); + if(n != 0) { +#ifdef WIN32 + fprintf(stderr, "getnameinfo() failed : %d\n", n); +#else + fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n)); +#endif + } +#endif + } +#ifdef DEBUG + printf("address miniwget : %s\n", addr_str); +#endif + } + + len = snprintf(buf, sizeof(buf), + "GET %s HTTP/1.0\r\n" + "Host: %s:%d\r\n" + "Connection: Close\r\n" + "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" + + "\r\n", + path, host, port); + sent = 0; + /* sending the HTTP request */ + while(sent < len) + { + n = send(s, buf+sent, len-sent, 0); + if(n < 0) + { + perror("send"); + closesocket(s); + return NULL; + } + else + { + sent += n; + } + } + { + /* TODO : in order to support HTTP/1.1, chunked transfer encoding + * must be supported. That means parsing of headers must be + * added. */ + int headers=1; + char * respbuffer = NULL; + int allreadyread = 0; + /*while((n = recv(s, buf, 2048, 0)) > 0)*/ + while((n = ReceiveData(s, buf, 2048, 5000)) > 0) + { + if(headers) + { + int i=0; + while(i<n-3) + { + /* searching for the end of the HTTP headers */ + if(buf[i]=='\r' && buf[i+1]=='\n' + && buf[i+2]=='\r' && buf[i+3]=='\n') + { + headers = 0; /* end */ + if(i<n-4) + { + /* Copy the content into respbuffet */ + respbuffer = (char *)realloc((void *)respbuffer, + allreadyread+(n-i-4)); + memcpy(respbuffer+allreadyread, buf + i + 4, n-i-4); + allreadyread += (n-i-4); + } + break; + } + i++; + } + } + else + { + respbuffer = (char *)realloc((void *)respbuffer, + allreadyread+n); + memcpy(respbuffer+allreadyread, buf, n); + allreadyread += n; + } + } + *size = allreadyread; +#ifdef DEBUG + printf("%d bytes read\n", *size); +#endif + closesocket(s); + return respbuffer; + } +} + +/* parseURL() + * arguments : + * url : source string not modified + * hostname : hostname destination string (size of MAXHOSTNAMELEN+1) + * port : port (destination) + * path : pointer to the path part of the URL + * + * Return values : + * 0 - Failure + * 1 - Success */ +int parseURL(const char * url, char * hostname, unsigned short * port, char * * path) +{ + char * p1, *p2, *p3; + p1 = strstr(url, "://"); + if(!p1) + return 0; + p1 += 3; + if( (url[0]!='h') || (url[1]!='t') + ||(url[2]!='t') || (url[3]!='p')) + return 0; + p2 = strchr(p1, ':'); + p3 = strchr(p1, '/'); + if(!p3) + return 0; + memset(hostname, 0, MAXHOSTNAMELEN + 1); + if(!p2 || (p2>p3)) + { + strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p3-p1))); + *port = 80; + } + else + { + strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1))); + *port = 0; + p2++; + while( (*p2 >= '0') && (*p2 <= '9')) + { + *port *= 10; + *port += (unsigned short)(*p2 - '0'); + p2++; + } + } + *path = p3; + return 1; +} + +void * miniwget(const char * url, int * size) +{ + unsigned short port; + char * path; + /* protocol://host:port/chemin */ + char hostname[MAXHOSTNAMELEN+1]; + *size = 0; + if(!parseURL(url, hostname, &port, &path)) + return NULL; + return miniwget2(url, hostname, port, path, size, 0, 0); +} + +void * miniwget_getaddr(const char * url, int * size, char * addr, int addrlen) +{ + unsigned short port; + char * path; + /* protocol://host:port/chemin */ + char hostname[MAXHOSTNAMELEN+1]; + *size = 0; + if(addr) + addr[0] = '\0'; + if(!parseURL(url, hostname, &port, &path)) + return NULL; + return miniwget2(url, hostname, port, path, size, addr, addrlen); +} +
tor-commits@lists.torproject.org