diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1cb9978 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 2.8.1) +project(libtins) + +# The version number. +SET(LIBTINS_VERSION_MAJOR 3) +SET(LIBTINS_VERSION_MINOR 0) +SET(LIBTINS_CPP_VERSION "${LIBTINS_VERSION_MAJOR}.${LIBTINS_VERSION_MINOR}") + +# Required Packages +SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +FIND_PACKAGE(PCAP REQUIRED) + +# Default compilation settings +SET(CMAKE_CXX_FLAGS "-Wall ${CXX11_COMPILER_FLAGS}") + +# Compilation options +OPTION(LIBTINS_ENABLE_CXX11 "Compile libtins with c++11 features" OFF) +IF(LIBTINS_ENABLE_CXX11) + SET(HAVE_CXX11 ON) + INCLUDE(CheckCXX11Features) + IF(CXX11_COMPILER_FLAGS AND HAS_CXX11_NULLPTR AND HAS_CXX11_AUTO) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_COMPILER_FLAGS}") + ELSE(CXX11_COMPILER_FLAGS AND HAS_CXX11_NULLPTR AND HAS_CXX11_AUTO) + MESSAGE(FATAL_ERROR "C++11 features requested but the compiler does not support them!") + ENDIF(CXX11_COMPILER_FLAGS AND HAS_CXX11_NULLPTR AND HAS_CXX11_AUTO) +ENDIF(LIBTINS_ENABLE_CXX11) + +OPTION(LIBTINS_ENABLE_DOT11 "Compile libtins with IEEE 802.11 support" ON) +OPTION(LIBTINS_ENABLE_WPA2 "Compile libtins with WPA2 decryption features (requires OpenSSL)" OFF) +IF(LIBTINS_ENABLE_DOT11) + SET(HAVE_DOT11 ON) + IF(LIBTINS_ENABLE_WPA2) + FIND_PACKAGE(OpenSSL REQUIRED) + SET(HAVE_WPA2_DECRYPTION ON) + ENDIF(LIBTINS_ENABLE_WPA2) +ENDIF(LIBTINS_ENABLE_DOT11) + +SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) + +# Congiguration file +CONFIGURE_FILE( + "${PROJECT_SOURCE_DIR}/include/config.h.in" + "${PROJECT_SOURCE_DIR}/include/config.h" +) + +ADD_SUBDIRECTORY(include) +ADD_SUBDIRECTORY(src) + +# Add all targets to the build-tree export set +EXPORT(TARGETS tins + FILE "${PROJECT_BINARY_DIR}/libtinsTargets.cmake") +# Export the package for use from the build-tree +# (this registers the build-tree with a global CMake-registry) +EXPORT(PACKAGE libtins) +# Create the jsoncppConfig.cmake and libtinsConfigVersion.cmake files +# for the build tree +SET(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include") +CONFIGURE_FILE(libtinsConfig.cmake.in + "${PROJECT_BINARY_DIR}/libtinsConfig.cmake" @ONLY) +CONFIGURE_FILE(libtinsConfigVersion.cmake.in + "${PROJECT_BINARY_DIR}/libtinsConfigVersion.cmake" @ONLY) +# Install the libtinsConfig.cmake and libtinsConfigVersion.cmake +INSTALL(FILES + "${PROJECT_BINARY_DIR}/libtinsConfig.cmake" + "${PROJECT_BINARY_DIR}/libtinsConfigVersion.cmake" + DESTINATION CMake + COMPONENT dev) +# Install the export set for use with the install-tree +INSTALL(EXPORT libtinsTargets + DESTINATION CMake + COMPONENT dev) diff --git a/cmake/Modules/CheckCXX11Features.cmake b/cmake/Modules/CheckCXX11Features.cmake new file mode 100644 index 0000000..05c986c --- /dev/null +++ b/cmake/Modules/CheckCXX11Features.cmake @@ -0,0 +1,142 @@ +# - Check which parts of the C++11 standard the compiler supports +# +# When found it will set the following variables +# +# CXX11_COMPILER_FLAGS - the compiler flags needed to get C++11 features +# +# HAS_CXX11_AUTO - auto keyword +# HAS_CXX11_AUTO_RET_TYPE - function declaration with deduced return types +# HAS_CXX11_CLASS_OVERRIDE - override and final keywords for classes and methods +# HAS_CXX11_CONSTEXPR - constexpr keyword +# HAS_CXX11_CSTDINT_H - cstdint header +# HAS_CXX11_DECLTYPE - decltype keyword +# HAS_CXX11_FUNC - __func__ preprocessor constant +# HAS_CXX11_INITIALIZER_LIST - initializer list +# HAS_CXX11_LAMBDA - lambdas +# HAS_CXX11_LIB_REGEX - regex library +# HAS_CXX11_LONG_LONG - long long signed & unsigned types +# HAS_CXX11_NULLPTR - nullptr +# HAS_CXX11_RVALUE_REFERENCES - rvalue references +# HAS_CXX11_SIZEOF_MEMBER - sizeof() non-static members +# HAS_CXX11_STATIC_ASSERT - static_assert() +# HAS_CXX11_VARIADIC_TEMPLATES - variadic templates + +#============================================================================= +# Copyright 2011,2012 Rolf Eike Beer +# Copyright 2012 Andreas Weis +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# +# Each feature may have up to 3 checks, every one of them in it's own file +# FEATURE.cpp - example that must build and return 0 when run +# FEATURE_fail.cpp - example that must build, but may not return 0 when run +# FEATURE_fail_compile.cpp - example that must fail compilation +# +# The first one is mandatory, the latter 2 are optional and do not depend on +# each other (i.e. only one may be present). +# + +if (NOT CMAKE_CXX_COMPILER_LOADED) + message(FATAL_ERROR "CheckCXX11Features modules only works if language CXX is enabled") +endif () + +cmake_minimum_required(VERSION 2.8.3) + +# +### Check for needed compiler flags +# +include(CheckCXXCompilerFlag) +check_cxx_compiler_flag("-std=c++11" _HAS_CXX11_FLAG) +if (NOT _HAS_CXX11_FLAG) + check_cxx_compiler_flag("-std=c++0x" _HAS_CXX0X_FLAG) +endif () + +if (_HAS_CXX11_FLAG) + set(CXX11_COMPILER_FLAGS "-std=c++11") +elseif (_HAS_CXX0X_FLAG) + set(CXX11_COMPILER_FLAGS "-std=c++0x") +endif () + +function(cxx11_check_feature FEATURE_NAME RESULT_VAR) + if (NOT DEFINED ${RESULT_VAR}) + set(_bindir "${CMAKE_CURRENT_BINARY_DIR}/cxx11_${FEATURE_NAME}") + + set(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/CheckCXX11Features/cxx11-test-${FEATURE_NAME}) + set(_LOG_NAME "\"${FEATURE_NAME}\"") + message(STATUS "Checking C++11 support for ${_LOG_NAME}") + + set(_SRCFILE "${_SRCFILE_BASE}.cpp") + set(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp") + set(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp") + + if (CROSS_COMPILING) + try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}" + COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") + if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) + try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}" + COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") + endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) + else (CROSS_COMPILING) + try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR + "${_bindir}" "${_SRCFILE}" + COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") + if (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) + set(${RESULT_VAR} TRUE) + else (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) + set(${RESULT_VAR} FALSE) + endif (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) + if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) + try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR + "${_bindir}_fail" "${_SRCFILE_FAIL}" + COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") + if (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) + set(${RESULT_VAR} TRUE) + else (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) + set(${RESULT_VAR} FALSE) + endif (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) + endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) + endif (CROSS_COMPILING) + if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE}) + try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}" + COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") + if (_TMP_RESULT) + set(${RESULT_VAR} FALSE) + else (_TMP_RESULT) + set(${RESULT_VAR} TRUE) + endif (_TMP_RESULT) + endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE}) + + if (${RESULT_VAR}) + message(STATUS "Checking C++11 support for ${_LOG_NAME}: works") + else (${RESULT_VAR}) + message(STATUS "Checking C++11 support for ${_LOG_NAME}: not supported") + endif (${RESULT_VAR}) + set(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}") + endif (NOT DEFINED ${RESULT_VAR}) +endfunction(cxx11_check_feature) + +cxx11_check_feature("__func__" HAS_CXX11_FUNC) +cxx11_check_feature("auto" HAS_CXX11_AUTO) +cxx11_check_feature("auto_ret_type" HAS_CXX11_AUTO_RET_TYPE) +cxx11_check_feature("class_override_final" HAS_CXX11_CLASS_OVERRIDE) +cxx11_check_feature("constexpr" HAS_CXX11_CONSTEXPR) +cxx11_check_feature("cstdint" HAS_CXX11_CSTDINT_H) +cxx11_check_feature("decltype" HAS_CXX11_DECLTYPE) +cxx11_check_feature("initializer_list" HAS_CXX11_INITIALIZER_LIST) +cxx11_check_feature("lambda" HAS_CXX11_LAMBDA) +cxx11_check_feature("long_long" HAS_CXX11_LONG_LONG) +cxx11_check_feature("nullptr" HAS_CXX11_NULLPTR) +cxx11_check_feature("regex" HAS_CXX11_LIB_REGEX) +cxx11_check_feature("rvalue-references" HAS_CXX11_RVALUE_REFERENCES) +cxx11_check_feature("sizeof_member" HAS_CXX11_SIZEOF_MEMBER) +cxx11_check_feature("static_assert" HAS_CXX11_STATIC_ASSERT) +cxx11_check_feature("variadic_templates" HAS_CXX11_VARIADIC_TEMPLATES) diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-__func__.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-__func__.cpp new file mode 100644 index 0000000..3bfd8a8 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-__func__.cpp @@ -0,0 +1,8 @@ +int main(void) +{ + if (!__func__) + return 1; + if (!(*__func__)) + return 1; + return 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-auto.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-auto.cpp new file mode 100644 index 0000000..948648e --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-auto.cpp @@ -0,0 +1,12 @@ + +int main() +{ + auto i = 5; + auto f = 3.14159f; + auto d = 3.14159; + bool ret = ( + (sizeof(f) < sizeof(d)) && + (sizeof(i) == sizeof(int)) + ); + return ret ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp new file mode 100644 index 0000000..3c0e3f2 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp @@ -0,0 +1,7 @@ +int main(void) +{ + // must fail because there is no initializer + auto i; + + return 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp new file mode 100644 index 0000000..937b683 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp @@ -0,0 +1,8 @@ +auto foo(int i) -> int { + return i - 1; +} + +int main() +{ + return foo(1); +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp new file mode 100644 index 0000000..f5870b1 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp @@ -0,0 +1,21 @@ +class base { +public: + virtual int foo(int a) + { return 4 + a; } + int bar(int a) final + { return a - 2; } +}; + +class sub final : public base { +public: + virtual int foo(int a) override + { return 8 + 2 * a; }; +}; + +int main(void) +{ + base b; + sub s; + + return (b.foo(2) * 2 == s.foo(2)) ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp new file mode 100644 index 0000000..bc00b27 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp @@ -0,0 +1,25 @@ +class base { +public: + virtual int foo(int a) + { return 4 + a; } + virtual int bar(int a) final + { return a - 2; } +}; + +class sub final : public base { +public: + virtual int foo(int a) override + { return 8 + 2 * a; }; + virtual int bar(int a) + { return a; } +}; + +class impossible : public sub { }; + +int main(void) +{ + base b; + sub s; + + return 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp new file mode 100644 index 0000000..ed62451 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp @@ -0,0 +1,19 @@ +constexpr int square(int x) +{ + return x*x; +} + +constexpr int the_answer() +{ + return 42; +} + +int main() +{ + int test_arr[square(3)]; + bool ret = ( + (square(the_answer()) == 1764) && + (sizeof(test_arr)/sizeof(test_arr[0]) == 9) + ); + return ret ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp new file mode 100644 index 0000000..ca2c72d --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp @@ -0,0 +1,11 @@ +#include + +int main() +{ + bool test = + (sizeof(int8_t) == 1) && + (sizeof(int16_t) == 2) && + (sizeof(int32_t) == 4) && + (sizeof(int64_t) == 8); + return test ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-decltype.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-decltype.cpp new file mode 100644 index 0000000..0dbb1cc --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-decltype.cpp @@ -0,0 +1,10 @@ +bool check_size(int i) +{ + return sizeof(int) == sizeof(decltype(i)); +} + +int main() +{ + bool ret = check_size(42); + return ret ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp new file mode 100644 index 0000000..35e6c38 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp @@ -0,0 +1,27 @@ +#include + +class seq { +public: + seq(std::initializer_list list); + + int length() const; +private: + std::vector m_v; +}; + +seq::seq(std::initializer_list list) + : m_v(list) +{ +} + +int seq::length() const +{ + return m_v.size(); +} + +int main(void) +{ + seq a = {18, 20, 2, 0, 4, 7}; + + return (a.length() == 6) ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-lambda.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-lambda.cpp new file mode 100644 index 0000000..4c33ed5 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-lambda.cpp @@ -0,0 +1,5 @@ +int main() +{ + int ret = 0; + return ([&ret]() -> int { return ret; })(); +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-long_long.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-long_long.cpp new file mode 100644 index 0000000..0911127 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-long_long.cpp @@ -0,0 +1,7 @@ +int main(void) +{ + long long l; + unsigned long long ul; + + return ((sizeof(l) >= 8) && (sizeof(ul) >= 8)) ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp new file mode 100644 index 0000000..9f41071 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp @@ -0,0 +1,6 @@ +int main(void) +{ + void *v = nullptr; + + return v ? 1 : 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp new file mode 100644 index 0000000..6a002bc --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp @@ -0,0 +1,6 @@ +int main(void) +{ + int i = nullptr; + + return 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-regex.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-regex.cpp new file mode 100644 index 0000000..2fe01c4 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-regex.cpp @@ -0,0 +1,26 @@ +#include +#include + +int parse_line(std::string const& line) +{ + std::string tmp; + if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+//(-)?(\\d)+(\\s)+"))) { + tmp = std::regex_replace(line, std::regex("(-)?(\\d)+//(-)?(\\d)+"), std::string("V")); + } else if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+/(-)?(\\d)+(\\s)+"))) { + tmp = std::regex_replace(line, std::regex("(-)?(\\d)+/(-)?(\\d)+"), std::string("V")); + } else if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+/(-)?(\\d)+/(-)?(\\d)+(\\s)+"))) { + tmp = std::regex_replace(line, std::regex("(-)?(\\d)+/(-)?(\\d)+/(-)?(\\d)+"), std::string("V")); + } else { + tmp = std::regex_replace(line, std::regex("(-)?(\\d)+"), std::string("V")); + } + return static_cast(std::count(tmp.begin(), tmp.end(), 'V')); +} + +int main() +{ + bool test = (parse_line("f 7/7/7 -3/3/-3 2/-2/2") == 3) && + (parse_line("f 7//7 3//-3 -2//2") == 3) && + (parse_line("f 7/7 3/-3 -2/2") == 3) && + (parse_line("f 7 3 -2") == 3); + return test ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp new file mode 100644 index 0000000..e6e7e5a --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp @@ -0,0 +1,57 @@ +#include + +class rvmove { +public: + void *ptr; + char *array; + + rvmove() + : ptr(0), + array(new char[10]) + { + ptr = this; + } + + rvmove(rvmove &&other) + : ptr(other.ptr), + array(other.array) + { + other.array = 0; + other.ptr = 0; + } + + ~rvmove() + { + assert(((ptr != 0) && (array != 0)) || ((ptr == 0) && (array == 0))); + delete[] array; + } + + rvmove &operator=(rvmove &&other) + { + delete[] array; + ptr = other.ptr; + array = other.array; + other.array = 0; + other.ptr = 0; + return *this; + } + + static rvmove create() + { + return rvmove(); + } +private: + rvmove(const rvmove &); + rvmove &operator=(const rvmove &); +}; + +int main() +{ + rvmove mine; + if (mine.ptr != &mine) + return 1; + mine = rvmove::create(); + if (mine.ptr == &mine) + return 1; + return 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp new file mode 100644 index 0000000..4902fc7 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp @@ -0,0 +1,14 @@ +struct foo { + char bar; + int baz; +}; + +int main(void) +{ + bool ret = ( + (sizeof(foo::bar) == 1) && + (sizeof(foo::baz) >= sizeof(foo::bar)) && + (sizeof(foo) >= sizeof(foo::bar) + sizeof(foo::baz)) + ); + return ret ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp new file mode 100644 index 0000000..0348c2c --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp @@ -0,0 +1,9 @@ +struct foo { + int baz; + double bar; +}; + +int main(void) +{ + return (sizeof(foo::bar) == 4) ? 0 : 1; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp new file mode 100644 index 0000000..47c2fef --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp @@ -0,0 +1,5 @@ +int main(void) +{ + static_assert(0 < 1, "your ordering of integers is screwed"); + return 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp new file mode 100644 index 0000000..362fcdd --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp @@ -0,0 +1,5 @@ +int main(void) +{ + static_assert(1 < 0, "your ordering of integers is screwed"); + return 0; +} diff --git a/cmake/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp b/cmake/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp new file mode 100644 index 0000000..4518e88 --- /dev/null +++ b/cmake/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp @@ -0,0 +1,23 @@ +int Accumulate() +{ + return 0; +} + +template +int Accumulate(T v, Ts... vs) +{ + return v + Accumulate(vs...); +} + +template +int CountElements() +{ + return sizeof...(Is); +} + +int main() +{ + int acc = Accumulate(1, 2, 3, 4, -5); + int count = CountElements<1,2,3,4,5>(); + return ((acc == 5) && (count == 5)) ? 0 : 1; +} diff --git a/cmake/Modules/FindPCAP.cmake b/cmake/Modules/FindPCAP.cmake new file mode 100644 index 0000000..e5049bf --- /dev/null +++ b/cmake/Modules/FindPCAP.cmake @@ -0,0 +1,74 @@ +# - Try to find libpcap include dirs and libraries +# +# Usage of this module as follows: +# +# find_package(PCAP) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# PCAP_ROOT_DIR Set this variable to the root installation of +# libpcap if the module has problems finding the +# proper installation path. +# +# Variables defined by this module: +# +# PCAP_FOUND System has libpcap, include and library dirs found +# PCAP_INCLUDE_DIR The libpcap include directories. +# PCAP_LIBRARY The libpcap library (possibly includes a thread +# library e.g. required by pf_ring's libpcap) +# HAVE_PF_RING If a found version of libpcap supports PF_RING + +find_path(PCAP_ROOT_DIR + NAMES include/pcap.h +) + +find_path(PCAP_INCLUDE_DIR + NAMES pcap.h + HINTS ${PCAP_ROOT_DIR}/include +) + +find_library(PCAP_LIBRARY + NAMES pcap + HINTS ${PCAP_ROOT_DIR}/lib +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PCAP DEFAULT_MSG + PCAP_LIBRARY + PCAP_INCLUDE_DIR +) + +include(CheckCSourceCompiles) +set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) +check_c_source_compiles("int main() { return 0; }" PCAP_LINKS_SOLO) +set(CMAKE_REQUIRED_LIBRARIES) + +# check if linking against libpcap also needs to link against a thread library +if (NOT PCAP_LINKS_SOLO) + find_package(Threads) + if (THREADS_FOUND) + set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) + check_c_source_compiles("int main() { return 0; }" PCAP_NEEDS_THREADS) + set(CMAKE_REQUIRED_LIBRARIES) + endif () + if (THREADS_FOUND AND PCAP_NEEDS_THREADS) + set(_tmp ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) + list(REMOVE_DUPLICATES _tmp) + set(PCAP_LIBRARY ${_tmp} + CACHE STRING "Libraries needed to link against libpcap" FORCE) + else () + message(FATAL_ERROR "Couldn't determine how to link against libpcap") + endif () +endif () + +include(CheckFunctionExists) +set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) +check_function_exists(pcap_get_pfring_id HAVE_PF_RING) +set(CMAKE_REQUIRED_LIBRARIES) + +mark_as_advanced( + PCAP_ROOT_DIR + PCAP_INCLUDE_DIR + PCAP_LIBRARY +) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt new file mode 100644 index 0000000..58baacb --- /dev/null +++ b/include/CMakeLists.txt @@ -0,0 +1,2 @@ +FILE(GLOB INCLUDE_FILES "*.h") +INSTALL(FILES ${INCLUDE_FILES} DESTINATION include/tins) \ No newline at end of file diff --git a/include/config.h.in b/include/config.h.in index 023aea3..cec4227 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1,89 +1,9 @@ -/* include/config.h.in. Generated from configure.ac by autoheader. */ -/* define if the compiler supports basic C++11 syntax */ -#undef HAVE_CXX11 - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H +/* Define if the compiler supports basic C++11 syntax */ +#cmakedefine HAVE_CXX11 /* Have IEEE 802.11 support */ -#undef HAVE_DOT11 - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `crypto' library (-lcrypto). */ -#undef HAVE_LIBCRYPTO - -/* Define to 1 if you have the `pcap' library (-lpcap). */ -#undef HAVE_LIBPCAP - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_AES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_EVP_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_HMAC_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_PCAP_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H +#cmakedefine HAVE_DOT11 /* Have WPA2 decryption library */ -#undef HAVE_WPA2_DECRYPTION - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Version number of package */ -#undef VERSION +#cmakedefine HAVE_WPA2_DECRYPTION diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..c6176a3 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,145 @@ +OPTION(LIBTINS_BUILD_SHARED "Build libtins as a shared library." ON) +IF(LIBTINS_BUILD_SHARED) + SET(LIBTINS_TYPE SHARED) +ELSE(LIBTINS_BUILD_SHARED) + SET(LIBTINS_TYPE STATIC) +ENDIF(LIBTINS_BUILD_SHARED) + + +SET(LIBTINS_INCLUDE_DIR ../include) + +INCLUDE_DIRECTORIES(${LIBTINS_INCLUDE_DIR}) + +SET(PUBLIC_HEADERS + ${LIBTINS_INCLUDE_DIR}/internals.h + ${LIBTINS_INCLUDE_DIR}/dhcpv6.h + ${LIBTINS_INCLUDE_DIR}/dot11.h + ${LIBTINS_INCLUDE_DIR}/dot1q.h + ${LIBTINS_INCLUDE_DIR}/dot3.h + ${LIBTINS_INCLUDE_DIR}/small_uint.h + ${LIBTINS_INCLUDE_DIR}/ip.h + ${LIBTINS_INCLUDE_DIR}/ipsec.h + ${LIBTINS_INCLUDE_DIR}/eapol.h + ${LIBTINS_INCLUDE_DIR}/tcp_stream.h + ${LIBTINS_INCLUDE_DIR}/pppoe.h + ${LIBTINS_INCLUDE_DIR}/handshake_capturer.h + ${LIBTINS_INCLUDE_DIR}/ipv6.h + ${LIBTINS_INCLUDE_DIR}/icmpv6.h + ${LIBTINS_INCLUDE_DIR}/ieee802_3.h + ${LIBTINS_INCLUDE_DIR}/endianness.h + ${LIBTINS_INCLUDE_DIR}/rsn_information.h + ${LIBTINS_INCLUDE_DIR}/loopback.h + ${LIBTINS_INCLUDE_DIR}/ethernetII.h + ${LIBTINS_INCLUDE_DIR}/crypto.h + ${LIBTINS_INCLUDE_DIR}/packet.h + ${LIBTINS_INCLUDE_DIR}/llc.h + ${LIBTINS_INCLUDE_DIR}/ip_reassembler.h + ${LIBTINS_INCLUDE_DIR}/icmp.h + ${LIBTINS_INCLUDE_DIR}/hw_address.h + ${LIBTINS_INCLUDE_DIR}/packet_writer.h + ${LIBTINS_INCLUDE_DIR}/macros.h + ${LIBTINS_INCLUDE_DIR}/arp.h + ${LIBTINS_INCLUDE_DIR}/ip_address.h + ${LIBTINS_INCLUDE_DIR}/pdu.h + ${LIBTINS_INCLUDE_DIR}/packet_sender.h + ${LIBTINS_INCLUDE_DIR}/bootp.h + ${LIBTINS_INCLUDE_DIR}/network_interface.h + ${LIBTINS_INCLUDE_DIR}/sll.h + ${LIBTINS_INCLUDE_DIR}/ppi.h + ${LIBTINS_INCLUDE_DIR}/radiotap.h + ${LIBTINS_INCLUDE_DIR}/dns.h + ${LIBTINS_INCLUDE_DIR}/rawpdu.h + ${LIBTINS_INCLUDE_DIR}/sniffer.h + ${LIBTINS_INCLUDE_DIR}/snap.h + ${LIBTINS_INCLUDE_DIR}/pdu_cacher.h + ${LIBTINS_INCLUDE_DIR}/dhcp.h + ${LIBTINS_INCLUDE_DIR}/timestamp.h + ${LIBTINS_INCLUDE_DIR}/tcp.h + ${LIBTINS_INCLUDE_DIR}/pdu_option.h + ${LIBTINS_INCLUDE_DIR}/tins.h + ${LIBTINS_INCLUDE_DIR}/udp.h + ${LIBTINS_INCLUDE_DIR}/ipv6_address.h + ${LIBTINS_INCLUDE_DIR}/constants.h + ${LIBTINS_INCLUDE_DIR}/utils.h + ${LIBTINS_INCLUDE_DIR}/cxxstd.h + ${LIBTINS_INCLUDE_DIR}/stp.h + ${LIBTINS_INCLUDE_DIR}/exceptions.h + ${LIBTINS_INCLUDE_DIR}/address_range.h + ${LIBTINS_INCLUDE_DIR}/pdu_allocator.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_base.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_beacon.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_data.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_mgmt.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_assoc.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_auth.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_probe.h + ${LIBTINS_INCLUDE_DIR}/dot11/dot11_control.h + ${LIBTINS_INCLUDE_DIR}/config.h +) + +ADD_LIBRARY( + tins ${LIBTINS_TYPE} + arp.cpp + bootp.cpp + handshake_capturer.cpp + stp.cpp + pppoe.cpp + crypto.cpp + dhcp.cpp + dhcpv6.cpp + dns.cpp + dot3.cpp + dot1q.cpp + eapol.cpp + ethernetII.cpp + icmp.cpp + icmpv6.cpp + internals.cpp + ip_reassembler.cpp + ip.cpp + ip_address.cpp + ipv6.cpp + ipv6_address.cpp + ipsec.cpp + llc.cpp + loopback.cpp + network_interface.cpp + packet_sender.cpp + packet_writer.cpp + ppi.cpp + pdu.cpp + radiotap.cpp + address_range.cpp + rawpdu.cpp + rsn_information.cpp + sll.cpp + snap.cpp + sniffer.cpp + tcp.cpp + tcp_stream.cpp + udp.cpp + utils.cpp + dot11/dot11_base.cpp + dot11/dot11_data.cpp + dot11/dot11_mgmt.cpp + dot11/dot11_beacon.cpp + dot11/dot11_assoc.cpp + dot11/dot11_auth.cpp + dot11/dot11_probe.cpp + dot11/dot11_control.cpp +) + +TARGET_LINK_LIBRARIES(tins pcap) + +SET_TARGET_PROPERTIES(tins PROPERTIES OUTPUT_NAME tins ) +SET_TARGET_PROPERTIES(tins PROPERTIES VERSION ${LIBTINS_CPP_VERSION} SOVERSION ${LIBTINS_CPP_VERSION} ) +SET_TARGET_PROPERTIES(tins PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) + +# Install instructions for this target +INSTALL( + TARGETS tins + EXPORT libtinsTargets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + PUBLIC_HEADER DESTINATION include/tins COMPONENT dev +)