mirror of
https://github.com/EttusResearch/uhd.git
synced 2026-10-25 17:36:10 +00:00
Combined dissectors and added Wireshark 2 support
This commit is contained in:
parent
62f38b8f06
commit
fe7fe8b6ce
2
tools/chdr-dissector/.gitignore
vendored
2
tools/chdr-dissector/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
build/
|
||||
*~
|
||||
@ -1,9 +0,0 @@
|
||||
#ifdef PACKAGE
|
||||
#undef PACKAGE
|
||||
#endif
|
||||
#define PACKAGE "chdr"
|
||||
#ifdef VERSION
|
||||
#undef VERSION
|
||||
#endif
|
||||
#define VERSION "0.0.0.1"
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
#include "winver.h"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION @RC_MODULE_VERSION@
|
||||
PRODUCTVERSION @RC_VERSION@
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Ettus Research LLC\0"
|
||||
VALUE "FileDescription", "@PACKAGE@ dissector\0"
|
||||
VALUE "FileVersion", "@MODULE_VERSION@\0"
|
||||
VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2013 Ettus Research LLC\0"
|
||||
VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
|
||||
VALUE "ProductName", "Wireshark\0"
|
||||
VALUE "ProductVersion", "@VERSION@\0"
|
||||
VALUE "Comments", "Build with @MSVC_VARIANT@\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
2
tools/dissectors/.gitignore
vendored
Normal file
2
tools/dissectors/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
build
|
||||
moduleinfo.h
|
||||
@ -19,10 +19,8 @@
|
||||
########################################################################
|
||||
# Project setup
|
||||
########################################################################
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(chdr-dissector C)
|
||||
set(chdr-dissector_VERSION_MAJOR 0)
|
||||
set(chdr-dissector_VERSION_MINOR 0)
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
project(ettus-dissector C)
|
||||
enable_testing()
|
||||
|
||||
#select the release build type by default to get optimization flags
|
||||
@ -57,40 +55,52 @@ endif()
|
||||
# Setup the include and linker paths
|
||||
########################################################################
|
||||
include_directories(
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
${WIRESHARK_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
#link_directories(
|
||||
# ${Boost_LIBRARY_DIRS}
|
||||
#)
|
||||
set(CMAKE_INSTALL_LIBDIR ~/.wireshark)
|
||||
|
||||
# Set component parameters
|
||||
set(CHDR_DISSECTOR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR} CACHE INTERNAL "" FORCE)
|
||||
set(ETTUS_DISSECTOR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR} CACHE INTERNAL "" FORCE)
|
||||
set(ETTUS_DISSECTOR_NAME "chdr" CACHE STRING "Select a dissector to build")
|
||||
|
||||
set(CHDR_PLUGIN_SRC ${CMAKE_SOURCE_DIR}/packet-chdr.c)
|
||||
function(generate_ettus_dissector DISSECTOR_NAME)
|
||||
|
||||
set(PLUGIN_C_GENERATOR ${CMAKE_SOURCE_DIR}/make-dissector-reg.py)
|
||||
set(PLUGIN_C plugin.c)
|
||||
set(ETTUS_PLUGIN_SRC ${CMAKE_SOURCE_DIR}/packet-${DISSECTOR_NAME}.c)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PLUGIN_C}
|
||||
DEPENDS ${CHDR_PLUGIN_SRC}
|
||||
COMMAND ${PLUGIN_C_GENERATOR} ${CMAKE_SOURCE_DIR} plugin ${CHDR_PLUGIN_SRC}
|
||||
COMMENT "Generating ${PLUGIN_C}"
|
||||
)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/moduleinfo.h.in
|
||||
${CMAKE_BINARY_DIR}/moduleinfo.h
|
||||
)
|
||||
|
||||
add_library(chdr-plugin MODULE
|
||||
${PLUGIN_C}
|
||||
moduleinfo.h
|
||||
${CHDR_PLUGIN_SRC}
|
||||
)
|
||||
set_target_properties(chdr-plugin PROPERTIES PREFIX "")
|
||||
set_target_properties(chdr-plugin PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
target_link_libraries(chdr-plugin wireshark)
|
||||
set(PLUGIN_C_GENERATOR ${CMAKE_SOURCE_DIR}/make-dissector-reg.py)
|
||||
set(PLUGIN_C plugin.c)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PLUGIN_C}
|
||||
DEPENDS ${ETTUS_PLUGIN_SRC}
|
||||
COMMAND ${PLUGIN_C_GENERATOR} ${CMAKE_SOURCE_DIR} plugin ${ETTUS_PLUGIN_SRC}
|
||||
COMMENT "Generating ${PLUGIN_C}"
|
||||
)
|
||||
|
||||
set(ETTUS_TARGET_NAME "${DISSECTOR_NAME}-plugin")
|
||||
add_library(${ETTUS_TARGET_NAME} MODULE
|
||||
${PLUGIN_C}
|
||||
moduleinfo.h
|
||||
${ETTUS_PLUGIN_SRC}
|
||||
)
|
||||
set_target_properties(${ETTUS_TARGET_NAME} PROPERTIES PREFIX "")
|
||||
set_target_properties(${ETTUS_TARGET_NAME} PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
target_link_libraries(${ETTUS_TARGET_NAME} wireshark)
|
||||
|
||||
install(TARGETS ${ETTUS_TARGET_NAME}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins NAMELINK_SKIP
|
||||
)
|
||||
|
||||
endfunction(generate_ettus_dissector)
|
||||
|
||||
generate_ettus_dissector("${ETTUS_DISSECTOR_NAME}")
|
||||
|
||||
install(TARGETS chdr-plugin
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins NAMELINK_SKIP
|
||||
)
|
||||
@ -1,9 +1,10 @@
|
||||
#ifdef PACKAGE
|
||||
#undef PACKAGE
|
||||
#endif
|
||||
#define PACKAGE "octo"
|
||||
#define PACKAGE "@ETTUS_DISSECTOR_NAME@"
|
||||
|
||||
#ifdef VERSION
|
||||
#undef VERSION
|
||||
#endif
|
||||
#define VERSION "0.0.0.1"
|
||||
#define VERSION "0.0.0.2"
|
||||
|
||||
@ -463,8 +463,13 @@ void proto_register_chdr(void)
|
||||
void proto_reg_handoff_chdr(void)
|
||||
{
|
||||
/* register heuristic dissector for use with USB */
|
||||
#if VERSION_MAJOR == 1
|
||||
heur_dissector_add("usb.bulk", heur_dissect_chdr, proto_chdr);
|
||||
|
||||
#elif VERSION_MAJOR == 2
|
||||
heur_dissector_add("usb.bulk", heur_dissect_chdr, "USB dissector", "usb_bulk", proto_chdr, HEURISTIC_ENABLE);
|
||||
#else
|
||||
#error Wireshark version not found or not compatible
|
||||
#endif
|
||||
/* register dissector for UDP packets */
|
||||
static dissector_handle_t chdr_handle;
|
||||
chdr_handle = create_dissector_handle(dissect_chdr, proto_chdr);
|
||||
@ -123,8 +123,13 @@ static void dissect_zpu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
if (len >= 12)
|
||||
{
|
||||
proto_tree_add_item(zpu_tree, hf_zpu_addr, tvb, 8, 4, ENC_NA);
|
||||
|
||||
#if VERSION_MAJOR == 1
|
||||
guint8 *bytes = tvb_get_string(tvb, 8, 4);
|
||||
#elif VERSION_MAJOR == 2
|
||||
guint8 *bytes = tvb_get_string(wmem_packet_scope(), tvb, 8, 4);
|
||||
#else
|
||||
#error Wireshark version not found or not compatible
|
||||
#endif
|
||||
unsigned int addr = 0;
|
||||
memcpy(&addr, bytes, 4);
|
||||
/* TODO proper endianness handling */
|
||||
@ -16,11 +16,11 @@ BEGIN
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Ettus Research LLC\0"
|
||||
VALUE "CompanyName", "Ettus Research (National Instruments)\0"
|
||||
VALUE "FileDescription", "@PACKAGE@ dissector\0"
|
||||
VALUE "FileVersion", "@MODULE_VERSION@\0"
|
||||
VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2013 Ettus Research LLC\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2013 Ettus Research (National Instruments)\0"
|
||||
VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
|
||||
VALUE "ProductName", "Wireshark\0"
|
||||
VALUE "ProductVersion", "@VERSION@\0"
|
||||
2
tools/octoclock-dissector/.gitignore
vendored
2
tools/octoclock-dissector/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
build/
|
||||
*~
|
||||
@ -1,96 +0,0 @@
|
||||
# Copyright 2010-2016 Ettus Research LLC
|
||||
#
|
||||
# GNU Radio is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU Radio is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU Radio; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
# Boston, MA 02110-1301, USA.
|
||||
|
||||
|
||||
########################################################################
|
||||
# Project setup
|
||||
########################################################################
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(octoclock-dissector C)
|
||||
set(octoclock-dissector_VERSION_MAJOR 0)
|
||||
set(octoclock-dissector_VERSION_MINOR 7)
|
||||
enable_testing()
|
||||
|
||||
#select the release build type by default to get optimization flags
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
message(STATUS "Build type not specified: defaulting to release.")
|
||||
endif(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||
|
||||
########################################################################
|
||||
# Compiler specific setup
|
||||
########################################################################
|
||||
#if(CMAKE_COMPILER_IS_GNUC AND NOT WIN32)
|
||||
# #http://gcc.gnu.org/wiki/Visibility
|
||||
# add_definitions(-fvisibility=visible)
|
||||
#endif()
|
||||
|
||||
find_package(GLIB2)
|
||||
if(NOT GLIB2_FOUND)
|
||||
message(FATAL_ERROR "Glib not found")
|
||||
endif()
|
||||
|
||||
find_package(Wireshark)
|
||||
if(NOT WIRESHARK_FOUND)
|
||||
message(FATAL_ERROR "Wireshark dev package not found")
|
||||
endif()
|
||||
|
||||
|
||||
########################################################################
|
||||
# Setup the include and linker paths
|
||||
########################################################################
|
||||
include_directories(
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
${WIRESHARK_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
#link_directories(
|
||||
# ${Boost_LIBRARY_DIRS}
|
||||
#)
|
||||
set(CMAKE_INSTALL_LIBDIR ~/.wireshark)
|
||||
|
||||
# Set component parameters
|
||||
set(octoclock_DISSECTOR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR} CACHE INTERNAL "" FORCE)
|
||||
|
||||
set(octoclock_PLUGIN_SRC ${CMAKE_SOURCE_DIR}/packet-octoclock.c)
|
||||
|
||||
set(PLUGIN_C_GENERATOR ${CMAKE_SOURCE_DIR}/make-dissector-reg.py)
|
||||
set(PLUGIN_C plugin.c)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PLUGIN_C}
|
||||
DEPENDS ${octoclock_PLUGIN_SRC}
|
||||
COMMAND ${PLUGIN_C_GENERATOR} ${CMAKE_SOURCE_DIR} plugin ${octoclock_PLUGIN_SRC}
|
||||
COMMENT "Generating ${PLUGIN_C}"
|
||||
)
|
||||
|
||||
add_library(octoclock-plugin MODULE
|
||||
${PLUGIN_C}
|
||||
moduleinfo.h
|
||||
${octoclock_PLUGIN_SRC}
|
||||
)
|
||||
set_target_properties(octoclock-plugin PROPERTIES PREFIX "")
|
||||
set_target_properties(octoclock-plugin PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
target_link_libraries(octoclock-plugin wireshark)
|
||||
|
||||
install(TARGETS octoclock-plugin
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins NAMELINK_SKIP
|
||||
)
|
||||
@ -1,238 +0,0 @@
|
||||
#
|
||||
# $Id: FindGLIB2.cmake 34248 2010-09-25 15:38:12Z jmayer $
|
||||
#
|
||||
# - Try to find GLib2
|
||||
# Once done this will define
|
||||
#
|
||||
# GLIB2_FOUND - system has GLib2
|
||||
# GLIB2_INCLUDE_DIRS - the GLib2 include directory
|
||||
# GLIB2_LIBRARIES - Link these to use GLib2
|
||||
#
|
||||
# HAVE_GLIB_GREGEX_H glib has gregex.h header and
|
||||
# supports g_regex_match_simple
|
||||
#
|
||||
# Copyright (c) 2006 Andreas Schneider <mail@cynapses.org>
|
||||
# Copyright (c) 2006 Philippe Bernery <philippe.bernery@gmail.com>
|
||||
# Copyright (c) 2007 Daniel Gollub <gollub@b1-systems.de>
|
||||
# Copyright (c) 2007 Alban Browaeys <prahal@yahoo.com>
|
||||
# Copyright (c) 2008 Michael Bell <michael.bell@web.de>
|
||||
# Copyright (c) 2008-2009 Bjoern Ricks <bjoern.ricks@googlemail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New
|
||||
# BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
|
||||
IF (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS )
|
||||
# in cache already
|
||||
SET(GLIB2_FOUND TRUE)
|
||||
ELSE (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS )
|
||||
|
||||
INCLUDE(FindPkgConfig)
|
||||
|
||||
## Glib
|
||||
IF ( GLIB2_FIND_REQUIRED )
|
||||
SET( _pkgconfig_REQUIRED "REQUIRED" )
|
||||
ELSE ( GLIB2_FIND_REQUIRED )
|
||||
SET( _pkgconfig_REQUIRED "" )
|
||||
ENDIF ( GLIB2_FIND_REQUIRED )
|
||||
|
||||
IF ( GLIB2_MIN_VERSION )
|
||||
PKG_SEARCH_MODULE( GLIB2 ${_pkgconfig_REQUIRED} glib-2.0>=${GLIB2_MIN_VERSION} )
|
||||
ELSE ( GLIB2_MIN_VERSION )
|
||||
PKG_SEARCH_MODULE( GLIB2 ${_pkgconfig_REQUIRED} glib-2.0 )
|
||||
ENDIF ( GLIB2_MIN_VERSION )
|
||||
IF ( PKG_CONFIG_FOUND )
|
||||
IF ( GLIB2_FOUND )
|
||||
SET ( GLIB2_CORE_FOUND TRUE )
|
||||
ELSE ( GLIB2_FOUND )
|
||||
SET ( GLIB2_CORE_FOUND FALSE )
|
||||
ENDIF ( GLIB2_FOUND )
|
||||
ENDIF ( PKG_CONFIG_FOUND )
|
||||
|
||||
# Look for glib2 include dir and libraries w/o pkgconfig
|
||||
IF ( NOT GLIB2_FOUND AND NOT PKG_CONFIG_FOUND )
|
||||
FIND_PATH(
|
||||
_glibconfig_include_DIR
|
||||
NAMES
|
||||
glibconfig.h
|
||||
PATHS
|
||||
/opt/gnome/lib64
|
||||
/opt/gnome/lib
|
||||
/opt/lib/
|
||||
/opt/local/lib
|
||||
/sw/lib/
|
||||
/usr/lib64
|
||||
/usr/lib
|
||||
/usr/local/include
|
||||
${CMAKE_LIBRARY_PATH}
|
||||
PATH_SUFFIXES
|
||||
glib-2.0/include
|
||||
)
|
||||
|
||||
FIND_PATH(
|
||||
_glib2_include_DIR
|
||||
NAMES
|
||||
glib.h
|
||||
PATHS
|
||||
/opt/gnome/include
|
||||
/opt/local/include
|
||||
/sw/include
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
PATH_SUFFIXES
|
||||
glib-2.0
|
||||
)
|
||||
|
||||
#MESSAGE(STATUS "Glib headers: ${_glib2_include_DIR}")
|
||||
|
||||
FIND_LIBRARY(
|
||||
_glib2_link_DIR
|
||||
NAMES
|
||||
glib-2.0
|
||||
glib
|
||||
PATHS
|
||||
/opt/gnome/lib
|
||||
/opt/local/lib
|
||||
/sw/lib
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
)
|
||||
IF ( _glib2_include_DIR AND _glib2_link_DIR )
|
||||
SET ( _glib2_FOUND TRUE )
|
||||
ENDIF ( _glib2_include_DIR AND _glib2_link_DIR )
|
||||
|
||||
|
||||
IF ( _glib2_FOUND )
|
||||
SET ( GLIB2_INCLUDE_DIRS ${_glib2_include_DIR} ${_glibconfig_include_DIR} )
|
||||
SET ( GLIB2_LIBRARIES ${_glib2_link_DIR} )
|
||||
SET ( GLIB2_CORE_FOUND TRUE )
|
||||
ELSE ( _glib2_FOUND )
|
||||
SET ( GLIB2_CORE_FOUND FALSE )
|
||||
ENDIF ( _glib2_FOUND )
|
||||
|
||||
# Handle dependencies
|
||||
# libintl
|
||||
IF ( NOT LIBINTL_FOUND )
|
||||
FIND_PATH(LIBINTL_INCLUDE_DIR
|
||||
NAMES
|
||||
libintl.h
|
||||
PATHS
|
||||
/opt/gnome/include
|
||||
/opt/local/include
|
||||
/sw/include
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(LIBINTL_LIBRARY
|
||||
NAMES
|
||||
intl
|
||||
PATHS
|
||||
/opt/gnome/lib
|
||||
/opt/local/lib
|
||||
/sw/lib
|
||||
/usr/local/lib
|
||||
/usr/lib
|
||||
)
|
||||
|
||||
IF (LIBINTL_LIBRARY AND LIBINTL_INCLUDE_DIR)
|
||||
SET (LIBINTL_FOUND TRUE)
|
||||
ENDIF (LIBINTL_LIBRARY AND LIBINTL_INCLUDE_DIR)
|
||||
ENDIF ( NOT LIBINTL_FOUND )
|
||||
|
||||
# libiconv
|
||||
IF ( NOT LIBICONV_FOUND )
|
||||
FIND_PATH(LIBICONV_INCLUDE_DIR
|
||||
NAMES
|
||||
iconv.h
|
||||
PATHS
|
||||
/opt/gnome/include
|
||||
/opt/local/include
|
||||
/opt/local/include
|
||||
/sw/include
|
||||
/sw/include
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
PATH_SUFFIXES
|
||||
glib-2.0
|
||||
)
|
||||
|
||||
FIND_LIBRARY(LIBICONV_LIBRARY
|
||||
NAMES
|
||||
iconv
|
||||
PATHS
|
||||
/opt/gnome/lib
|
||||
/opt/local/lib
|
||||
/sw/lib
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
)
|
||||
|
||||
IF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR)
|
||||
SET (LIBICONV_FOUND TRUE)
|
||||
ENDIF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR)
|
||||
ENDIF ( NOT LIBICONV_FOUND )
|
||||
|
||||
IF (LIBINTL_FOUND)
|
||||
SET (GLIB2_LIBRARIES ${GLIB2_LIBRARIES} ${LIBINTL_LIBRARY})
|
||||
SET (GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS} ${LIBINTL_INCLUDE_DIR})
|
||||
ENDIF (LIBINTL_FOUND)
|
||||
|
||||
IF (LIBICONV_FOUND)
|
||||
SET (GLIB2_LIBRARIES ${GLIB2_LIBRARIES} ${LIBICONV_LIBRARY})
|
||||
SET (GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS} ${LIBICONV_INCLUDE_DIR})
|
||||
ENDIF (LIBICONV_FOUND)
|
||||
|
||||
ENDIF ( NOT GLIB2_FOUND AND NOT PKG_CONFIG_FOUND )
|
||||
##
|
||||
|
||||
IF (GLIB2_CORE_FOUND AND GLIB2_INCLUDE_DIRS AND GLIB2_LIBRARIES)
|
||||
SET (GLIB2_FOUND TRUE)
|
||||
ENDIF (GLIB2_CORE_FOUND AND GLIB2_INCLUDE_DIRS AND GLIB2_LIBRARIES)
|
||||
|
||||
IF (GLIB2_FOUND)
|
||||
IF (NOT GLIB2_FIND_QUIETLY)
|
||||
MESSAGE (STATUS "Found GLib2: ${GLIB2_LIBRARIES} ${GLIB2_INCLUDE_DIRS}")
|
||||
ENDIF (NOT GLIB2_FIND_QUIETLY)
|
||||
ELSE (GLIB2_FOUND)
|
||||
IF (GLIB2_FIND_REQUIRED)
|
||||
MESSAGE (SEND_ERROR "Could not find GLib2")
|
||||
ENDIF (GLIB2_FIND_REQUIRED)
|
||||
ENDIF (GLIB2_FOUND)
|
||||
|
||||
# show the GLIB2_INCLUDE_DIRS and GLIB2_LIBRARIES variables only in the advanced view
|
||||
MARK_AS_ADVANCED(GLIB2_INCLUDE_DIRS GLIB2_LIBRARIES)
|
||||
MARK_AS_ADVANCED(LIBICONV_INCLUDE_DIR LIBICONV_LIBRARY)
|
||||
MARK_AS_ADVANCED(LIBINTL_INCLUDE_DIR LIBINTL_LIBRARY)
|
||||
|
||||
ENDIF (GLIB2_LIBRARIES AND GLIB2_INCLUDE_DIRS)
|
||||
|
||||
IF ( WIN32 )
|
||||
# include libiconv for win32
|
||||
IF ( NOT LIBICONV_FOUND )
|
||||
FIND_PATH(LIBICONV_INCLUDE_DIR iconv.h PATH_SUFFIXES glib-2.0)
|
||||
|
||||
FIND_LIBRARY(LIBICONV_LIBRARY NAMES iconv)
|
||||
|
||||
IF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR)
|
||||
SET (LIBICONV_FOUND TRUE)
|
||||
ENDIF (LIBICONV_LIBRARY AND LIBICONV_INCLUDE_DIR)
|
||||
ENDIF ( NOT LIBICONV_FOUND )
|
||||
IF (LIBICONV_FOUND)
|
||||
SET (GLIB2_LIBRARIES ${GLIB2_LIBRARIES} ${LIBICONV_LIBRARY})
|
||||
SET (GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS} ${LIBICONV_INCLUDE_DIR})
|
||||
ENDIF (LIBICONV_FOUND)
|
||||
ENDIF ( WIN32 )
|
||||
|
||||
IF ( GLIB2_FOUND )
|
||||
# Check if system has a newer version of glib
|
||||
# which supports g_regex_match_simple
|
||||
INCLUDE( CheckIncludeFiles )
|
||||
SET( CMAKE_REQUIRED_INCLUDES ${GLIB2_INCLUDE_DIRS} )
|
||||
CHECK_INCLUDE_FILES ( glib/gregex.h HAVE_GLIB_GREGEX_H )
|
||||
CHECK_INCLUDE_FILES ( glib/gchecksum.h HAVE_GLIB_GCHECKSUM_H )
|
||||
# Reset CMAKE_REQUIRED_INCLUDES
|
||||
SET( CMAKE_REQUIRED_INCLUDES "" )
|
||||
ENDIF( GLIB2_FOUND )
|
||||
@ -1,28 +0,0 @@
|
||||
#
|
||||
# Try to find the wireshark library and its includes
|
||||
#
|
||||
# This snippet sets the following variables:
|
||||
# WIRESHARK_FOUND True if wireshark library got found
|
||||
# WIRESHARK_INCLUDE_DIRS Location of the wireshark headers
|
||||
# WIRESHARK_LIBRARIES List of libraries to use wireshark
|
||||
#
|
||||
# Copyright (c) 2011 Reinhold Kainhofer <reinhold@kainhofer.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New
|
||||
# BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
# wireshark does not install its library with pkg-config information,
|
||||
# so we need to manually find the libraries and headers
|
||||
|
||||
FIND_PATH( WIRESHARK_INCLUDE_DIRS epan/column.h PATH_SUFFIXES wireshark )
|
||||
FIND_LIBRARY( WIRESHARK_LIBRARIES wireshark )
|
||||
|
||||
# Report results
|
||||
IF ( WIRESHARK_LIBRARIES AND WIRESHARK_INCLUDE_DIRS )
|
||||
SET( WIRESHARK_FOUND 1 )
|
||||
ELSE ( WIRESHARK_LIBRARIES AND WIRESHARK_INCLUDE_DIRS )
|
||||
MESSAGE( SEND_ERROR "Could NOT find the wireshark library and headers" )
|
||||
ENDIF ( WIRESHARK_LIBRARIES AND WIRESHARK_INCLUDE_DIRS )
|
||||
|
||||
@ -1,305 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Looks for registration routines in the protocol dissectors,
|
||||
# and assembles C code to call all the routines.
|
||||
#
|
||||
# This is a Python version of the make-reg-dotc shell script.
|
||||
# Running the shell script on Win32 is very very slow because of
|
||||
# all the process-launching that goes on --- multiple greps and
|
||||
# seds for each input file. I wrote this python version so that
|
||||
# less processes would have to be started.
|
||||
#
|
||||
# $Id: make-dissector-reg.py 30447 2009-10-09 20:47:18Z krj $
|
||||
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import pickle
|
||||
from stat import *
|
||||
|
||||
VERSION_KEY = '_VERSION'
|
||||
CUR_VERSION = '$Id: make-dissector-reg.py 30447 2009-10-09 20:47:18Z krj $'
|
||||
|
||||
#
|
||||
# The first argument is the directory in which the source files live.
|
||||
#
|
||||
srcdir = sys.argv[1]
|
||||
|
||||
#
|
||||
# The second argument is either "plugin" or "dissectors"; if it's
|
||||
# "plugin", we build a plugin.c for a plugin, and if it's
|
||||
# "dissectors", we build a register.c for libwireshark.
|
||||
#
|
||||
registertype = sys.argv[2]
|
||||
if registertype == "plugin" or registertype == "plugin_wtap":
|
||||
tmp_filename = "plugin.c-tmp"
|
||||
final_filename = "plugin.c"
|
||||
cache_filename = None
|
||||
preamble = """\
|
||||
/*
|
||||
* Do not modify this file.
|
||||
*
|
||||
* It is created automatically by Makefile or Makefile.nmake.
|
||||
*/
|
||||
"""
|
||||
elif registertype == "dissectors":
|
||||
tmp_filename = "register.c-tmp"
|
||||
final_filename = "register.c"
|
||||
cache_filename = "register-cache.pkl"
|
||||
preamble = """\
|
||||
/*
|
||||
* Do not modify this file.
|
||||
*
|
||||
* It is created automatically by the "register.c" target in
|
||||
* epan/dissectors/Makefile or Makefile.nmake using information in
|
||||
* epan/dissectors/register-cache.pkl.
|
||||
*
|
||||
* You can force this file to be regenerated completely by deleting
|
||||
* it along with epan/dissectors/register-cache.pkl.
|
||||
*/
|
||||
"""
|
||||
else:
|
||||
print "Unknown output type '%s'" % registertype
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
#
|
||||
# All subsequent arguments are the files to scan.
|
||||
#
|
||||
files = sys.argv[3:]
|
||||
|
||||
# Create the proper list of filenames
|
||||
filenames = []
|
||||
for file in files:
|
||||
if os.path.isfile(file):
|
||||
filenames.append(file)
|
||||
else:
|
||||
filenames.append(os.path.join(srcdir, file))
|
||||
|
||||
if len(filenames) < 1:
|
||||
print "No files found"
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Look through all files, applying the regex to each line.
|
||||
# If the pattern matches, save the "symbol" section to the
|
||||
# appropriate array.
|
||||
regs = {
|
||||
'proto_reg': [],
|
||||
'handoff_reg': [],
|
||||
'wtap_register': [],
|
||||
}
|
||||
|
||||
# For those that don't know Python, r"" indicates a raw string,
|
||||
# devoid of Python escapes.
|
||||
proto_regex0 = r"^(?P<symbol>proto_register_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
proto_regex1 = r"void\s+(?P<symbol>proto_register_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
|
||||
handoff_regex0 = r"^(?P<symbol>proto_reg_handoff_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
handoff_regex1 = r"void\s+(?P<symbol>proto_reg_handoff_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
|
||||
wtap_reg_regex0 = r"^(?P<symbol>wtap_register_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
wtap_reg_regex1 = r"void\s+(?P<symbol>wtap_register_[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
|
||||
# This table drives the pattern-matching and symbol-harvesting
|
||||
patterns = [
|
||||
( 'proto_reg', re.compile(proto_regex0) ),
|
||||
( 'proto_reg', re.compile(proto_regex1) ),
|
||||
( 'handoff_reg', re.compile(handoff_regex0) ),
|
||||
( 'handoff_reg', re.compile(handoff_regex1) ),
|
||||
( 'wtap_register', re.compile(wtap_reg_regex0) ),
|
||||
( 'wtap_register', re.compile(wtap_reg_regex1) ),
|
||||
]
|
||||
|
||||
# Open our registration symbol cache
|
||||
cache = None
|
||||
if cache_filename:
|
||||
try:
|
||||
cache_file = open(cache_filename, 'rb')
|
||||
cache = pickle.load(cache_file)
|
||||
cache_file.close()
|
||||
if not cache.has_key(VERSION_KEY) or cache[VERSION_KEY] != CUR_VERSION:
|
||||
cache = {VERSION_KEY: CUR_VERSION}
|
||||
except:
|
||||
cache = {VERSION_KEY: CUR_VERSION}
|
||||
|
||||
# Grep
|
||||
for filename in filenames:
|
||||
file = open(filename)
|
||||
cur_mtime = os.fstat(file.fileno())[ST_MTIME]
|
||||
if cache and cache.has_key(filename):
|
||||
cdict = cache[filename]
|
||||
if cur_mtime == cdict['mtime']:
|
||||
# print "Pulling %s from cache" % (filename)
|
||||
regs['proto_reg'].extend(cdict['proto_reg'])
|
||||
regs['handoff_reg'].extend(cdict['handoff_reg'])
|
||||
regs['wtap_register'].extend(cdict['wtap_register'])
|
||||
file.close()
|
||||
continue
|
||||
# We don't have a cache entry
|
||||
if cache is not None:
|
||||
cache[filename] = {
|
||||
'mtime': cur_mtime,
|
||||
'proto_reg': [],
|
||||
'handoff_reg': [],
|
||||
'wtap_register': [],
|
||||
}
|
||||
# print "Searching %s" % (filename)
|
||||
for line in file.readlines():
|
||||
for action in patterns:
|
||||
regex = action[1]
|
||||
match = regex.search(line)
|
||||
if match:
|
||||
symbol = match.group("symbol")
|
||||
sym_type = action[0]
|
||||
regs[sym_type].append(symbol)
|
||||
if cache is not None:
|
||||
# print "Caching %s for %s: %s" % (sym_type, filename, symbol)
|
||||
cache[filename][sym_type].append(symbol)
|
||||
file.close()
|
||||
|
||||
if cache is not None and cache_filename is not None:
|
||||
cache_file = open(cache_filename, 'wb')
|
||||
pickle.dump(cache, cache_file)
|
||||
cache_file.close()
|
||||
|
||||
# Make sure we actually processed something
|
||||
if len(regs['proto_reg']) < 1:
|
||||
print "No protocol registrations found"
|
||||
sys.exit(1)
|
||||
|
||||
# Sort the lists to make them pretty
|
||||
regs['proto_reg'].sort()
|
||||
regs['handoff_reg'].sort()
|
||||
regs['wtap_register'].sort()
|
||||
|
||||
reg_code = open(tmp_filename, "w")
|
||||
|
||||
reg_code.write(preamble)
|
||||
|
||||
# Make the routine to register all protocols
|
||||
if registertype == "plugin" or registertype == "plugin_wtap":
|
||||
reg_code.write("""
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <gmodule.h>
|
||||
|
||||
#include "moduleinfo.h"
|
||||
|
||||
#ifndef ENABLE_STATIC
|
||||
G_MODULE_EXPORT const gchar version[] = VERSION;
|
||||
|
||||
/* Start the functions we need for the plugin stuff */
|
||||
|
||||
G_MODULE_EXPORT void
|
||||
plugin_register (void)
|
||||
{
|
||||
""");
|
||||
else:
|
||||
reg_code.write("""
|
||||
#include "register.h"
|
||||
void
|
||||
register_all_protocols(register_cb cb, gpointer client_data)
|
||||
{
|
||||
""");
|
||||
|
||||
for symbol in regs['proto_reg']:
|
||||
if registertype == "plugin" or registertype == "plugin_wtap":
|
||||
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol)
|
||||
else:
|
||||
line = " {extern void %s (void); if(cb) (*cb)(RA_REGISTER, \"%s\", client_data); %s ();}\n" % (symbol, symbol, symbol)
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("}\n")
|
||||
|
||||
|
||||
# Make the routine to register all protocol handoffs
|
||||
if registertype == "plugin" or registertype == "plugin_wtap":
|
||||
reg_code.write("""
|
||||
G_MODULE_EXPORT void
|
||||
plugin_reg_handoff(void)
|
||||
{
|
||||
""");
|
||||
else:
|
||||
reg_code.write("""
|
||||
void
|
||||
register_all_protocol_handoffs(register_cb cb, gpointer client_data)
|
||||
{
|
||||
""");
|
||||
|
||||
for symbol in regs['handoff_reg']:
|
||||
if registertype == "plugin" or registertype == "plugin_wtap":
|
||||
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol)
|
||||
else:
|
||||
line = " {extern void %s (void); if(cb) (*cb)(RA_HANDOFF, \"%s\", client_data); %s ();}\n" % (symbol, symbol, symbol)
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("}\n")
|
||||
|
||||
if registertype == "plugin":
|
||||
reg_code.write("#endif\n");
|
||||
elif registertype == "plugin_wtap":
|
||||
reg_code.write("""
|
||||
G_MODULE_EXPORT void
|
||||
register_wtap_module(void)
|
||||
{
|
||||
""");
|
||||
|
||||
for symbol in regs['wtap_register']:
|
||||
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol)
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("}\n");
|
||||
reg_code.write("#endif\n");
|
||||
else:
|
||||
reg_code.write("""
|
||||
static gulong proto_reg_count(void)
|
||||
{
|
||||
""");
|
||||
|
||||
line = " return %d;\n" % len(regs['proto_reg'])
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("""
|
||||
}
|
||||
""");
|
||||
reg_code.write("""
|
||||
static gulong handoff_reg_count(void)
|
||||
{
|
||||
""");
|
||||
|
||||
line = " return %d;\n" % len(regs['handoff_reg'])
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("""
|
||||
}
|
||||
""");
|
||||
reg_code.write("""
|
||||
gulong register_count(void)
|
||||
{
|
||||
""");
|
||||
|
||||
line = " return proto_reg_count() + handoff_reg_count();"
|
||||
reg_code.write(line)
|
||||
|
||||
reg_code.write("""
|
||||
}\n
|
||||
""");
|
||||
|
||||
|
||||
# Close the file
|
||||
reg_code.close()
|
||||
|
||||
# Remove the old final_file if it exists.
|
||||
try:
|
||||
os.stat(final_filename)
|
||||
os.remove(final_filename)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
# Move from tmp file to final file
|
||||
os.rename(tmp_filename, final_filename)
|
||||
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
#include "winver.h"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION @RC_MODULE_VERSION@
|
||||
PRODUCTVERSION @RC_VERSION@
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Ettus Research\0"
|
||||
VALUE "FileDescription", "@PACKAGE@ dissector\0"
|
||||
VALUE "FileVersion", "@MODULE_VERSION@\0"
|
||||
VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2016 Ettus Research\0"
|
||||
VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
|
||||
VALUE "ProductName", "Wireshark\0"
|
||||
VALUE "ProductVersion", "@VERSION@\0"
|
||||
VALUE "Comments", "Build with @MSVC_VARIANT@\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
2
tools/zpu-dissector/.gitignore
vendored
2
tools/zpu-dissector/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
build/
|
||||
*~
|
||||
@ -1,96 +0,0 @@
|
||||
# Copyright 2010-2013 Ettus Research LLC
|
||||
#
|
||||
# GNU Radio is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU Radio is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU Radio; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
# Boston, MA 02110-1301, USA.
|
||||
|
||||
|
||||
########################################################################
|
||||
# Project setup
|
||||
########################################################################
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(zpu-dissector C)
|
||||
set(zpu-dissector_VERSION_MAJOR 0)
|
||||
set(zpu-dissector_VERSION_MINOR 0)
|
||||
enable_testing()
|
||||
|
||||
#select the release build type by default to get optimization flags
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
message(STATUS "Build type not specified: defaulting to release.")
|
||||
endif(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||
|
||||
########################################################################
|
||||
# Compiler specific setup
|
||||
########################################################################
|
||||
#if(CMAKE_COMPILER_IS_GNUC AND NOT WIN32)
|
||||
# #http://gcc.gnu.org/wiki/Visibility
|
||||
# add_definitions(-fvisibility=visible)
|
||||
#endif()
|
||||
|
||||
find_package(GLIB2)
|
||||
if(NOT GLIB2_FOUND)
|
||||
message(FATAL_ERROR "Glib not found")
|
||||
endif()
|
||||
|
||||
find_package(Wireshark)
|
||||
if(NOT WIRESHARK_FOUND)
|
||||
message(FATAL_ERROR "Wireshark dev package not found")
|
||||
endif()
|
||||
|
||||
|
||||
########################################################################
|
||||
# Setup the include and linker paths
|
||||
########################################################################
|
||||
include_directories(
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
${WIRESHARK_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
#link_directories(
|
||||
# ${Boost_LIBRARY_DIRS}
|
||||
#)
|
||||
set(CMAKE_INSTALL_LIBDIR ~/.wireshark)
|
||||
|
||||
# Set component parameters
|
||||
set(ZPU_DISSECTOR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR} CACHE INTERNAL "" FORCE)
|
||||
|
||||
set(ZPU_PLUGIN_SRC ${CMAKE_SOURCE_DIR}/packet-zpu.c)
|
||||
|
||||
set(PLUGIN_C_GENERATOR ${CMAKE_SOURCE_DIR}/make-dissector-reg.py)
|
||||
set(PLUGIN_C plugin.c)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PLUGIN_C}
|
||||
DEPENDS ${ZPU_PLUGIN_SRC}
|
||||
COMMAND ${PLUGIN_C_GENERATOR} ${CMAKE_SOURCE_DIR} plugin ${ZPU_PLUGIN_SRC}
|
||||
COMMENT "Generating ${PLUGIN_C}"
|
||||
)
|
||||
|
||||
add_library(zpu-plugin MODULE
|
||||
${PLUGIN_C}
|
||||
moduleinfo.h
|
||||
${ZPU_PLUGIN_SRC}
|
||||
)
|
||||
set_target_properties(zpu-plugin PROPERTIES PREFIX "")
|
||||
set_target_properties(zpu-plugin PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
target_link_libraries(zpu-plugin wireshark)
|
||||
|
||||
install(TARGETS zpu-plugin
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins NAMELINK_SKIP
|
||||
)
|
||||
@ -1 +0,0 @@
|
||||
../chdr-dissector/cmake
|
||||
@ -1 +0,0 @@
|
||||
../chdr-dissector/make-dissector-reg.py
|
||||
@ -1,9 +0,0 @@
|
||||
#ifdef PACKAGE
|
||||
#undef PACKAGE
|
||||
#endif
|
||||
#define PACKAGE "zpu"
|
||||
#ifdef VERSION
|
||||
#undef VERSION
|
||||
#endif
|
||||
#define VERSION "0.0.0.1"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user