summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordump2file <[email protected]>2019-01-22 15:34:32 +0600
committerdump2file <[email protected]>2019-01-22 15:34:32 +0600
commita01e3a716d8408bb6defd8d5ca7b80b202d4a82f (patch)
tree2b5c4a0a55465c59911fb0388e4b2739cdab9f9d
parent14ad4a10c2d5e17c9a3de78e0b29065aad4baa37 (diff)
1、同步并联版本的自动更新bversion脚本
2、修复ENABLE_STATIC_LINK开关开启后,CMake文件链接的问题
-rw-r--r--CMakeLists.txt12
-rw-r--r--autorevision.sh1268
-rw-r--r--cmake/Version.cmake43
-rw-r--r--dealpkt/g_device.c1008
-rw-r--r--entry/CMakeLists.txt19
-rw-r--r--entry/sapp_main.c251
-rw-r--r--include/support/dictator.h1
-rw-r--r--support/dictator2/src/dictator.h1
8 files changed, 1967 insertions, 636 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8cb043d..1114455 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,13 +1,16 @@
cmake_minimum_required(VERSION 2.8)
+set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
+include(Version)
+
set(CMAKE_MACOSX_RPATH 0)
#set(CMAKE_INSTALL_PREFIX /home/ceiec/sapp/)
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/run/)
#static link option
-option(ENABLE_STATIC_LINK "Enable static link" FALSE)
+option(ENABLE_STATIC_LINK "Enable static link" TRUE)
#ASAN option
option(ENABLE_SANITIZE_ADDRESS "Enable AddressSanitizer" FALSE)
@@ -93,10 +96,17 @@ endif()
option(OPT_USE_DICTATOR "Use Dictator2 memory allocator" OFF)
option(OPT_USE_TXMEM "Use Dictator2 for TileGX memory allocator" OFF)
option(OPT_USE_TCMALLOC "Use TCmalloc memory allocator" OFF)
+option(OPT_USE_TCMALLOC_MINI "Use TCmalloc memory allocator" OFF)
option(OPT_USE_JEMALLOC "Use JEmalloc memory allocator" OFF)
if(OPT_USE_DICTATOR)
set(MEM_POOL_DEFINITIONS -DUSE_MEM_POOL=1)
+elseif(OPT_USE_TCMALLOC_MINI)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltcmalloc_minimal -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
+elseif(OPT_USE_TCMALLOC)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltcmalloc -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
+elseif(OPT_USE_JEMALLOC)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ljemalloc -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
endif()
add_definitions(${CAPTURE_DEFINITIONS} ${MEM_POOL_DEFINITIONS} -D__FAVOR_BSD=1
diff --git a/autorevision.sh b/autorevision.sh
new file mode 100644
index 0000000..3baa179
--- /dev/null
+++ b/autorevision.sh
@@ -0,0 +1,1268 @@
+#!/bin/sh
+
+# Copyright (c) 2012 - 2016 dak180 and contributors. See
+# https://opensource.org/licenses/mit-license.php or the included
+# COPYING.md for licence terms.
+#
+# autorevision - extracts metadata about the head version from your
+# repository.
+
+# Usage message.
+arUsage() {
+ cat > "/dev/stderr" << EOF
+usage: autorevision {-t output-type | -s symbol} [-o cache-file [-f] ] [-V]
+ Options include:
+ -t output-type = specify output type
+ -s symbol = specify symbol output
+ -o cache-file = specify cache file location
+ -f = force the use of cache data
+ -U = check for untracked files in svn
+ -V = emit version and exit
+ -? = help message
+
+The following are valid output types:
+ clojure = clojure file
+ c = C/C++ file
+ h = Header for use with c/c++
+ hpp = Alternate C++ header strings with namespace
+ ini = INI file
+ java = Java file
+ javaprop = Java properties file
+ js = javascript file
+ json = JSON file
+ lua = Lua file
+ m4 = m4 file
+ matlab = matlab file
+ octave = octave file
+ php = PHP file
+ pl = Perl file
+ py = Python file
+ rpm = rpm file
+ scheme = scheme file
+ sh = Bash sytax
+ swift = Swift file
+ tex = (La)TeX file
+ xcode = Header useful for populating info.plist files
+ cmake = CMake file
+
+
+The following are valid symbols:
+ VCS_TYPE
+ VCS_BASENAME
+ VCS_UUID
+ VCS_NUM
+ VCS_DATE
+ VCS_BRANCH
+ VCS_TAG
+ VCS_TICK
+ VCS_EXTRA
+ VCS_FULL_HASH
+ VCS_SHORT_HASH
+ VCS_WC_MODIFIED
+ VCS_ACTION_STAMP
+EOF
+ exit 1
+}
+
+# Config
+ARVERSION="&&ARVERSION&&"
+TARGETFILE="/dev/stdout"
+while getopts ":t:o:s:VfU" OPTION; do
+ case "${OPTION}" in
+ t)
+ AFILETYPE="${OPTARG}"
+ ;;
+ o)
+ CACHEFILE="${OPTARG}"
+ ;;
+ f)
+ CACHEFORCE="1"
+ ;;
+ s)
+ VAROUT="${OPTARG}"
+ ;;
+ U)
+ UNTRACKEDFILES="1"
+ ;;
+ V)
+ echo "autorevision ${ARVERSION}"
+ exit 0
+ ;;
+ ?)
+ # If an unknown flag is used (or -?):
+ arUsage
+ ;;
+ esac
+done
+
+if [ ! -z "${VAROUT}" ] && [ ! -z "${AFILETYPE}" ]; then
+ # If both -s and -t are specified:
+ echo "error: Improper argument combination." 1>&2
+ exit 1
+elif [ -z "${VAROUT}" ] && [ -z "${AFILETYPE}" ]; then
+ # If neither -s or -t are specified:
+ arUsage
+elif [ -z "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then
+ # If -f is specified without -o:
+ arUsage
+elif [ ! -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then
+ # If we are forced to use the cache but it does not exist.
+ echo "error: Cache forced but no cache found." 1>&2
+ exit 1
+fi
+
+# Make sure that the path we are given is one we can source
+# (dash, we are looking at you).
+if [ ! -z "${CACHEFILE}" ] && ! echo "${CACHEFILE}" | grep -q '^\.*/'; then
+ CACHEFILE="./${CACHEFILE}"
+fi
+
+GENERATED_HEADER="Generated by autorevision - do not hand-hack!"
+
+# Functions to extract data from different repo types.
+# For git repos
+# shellcheck disable=SC2039,SC2164,SC2155
+gitRepo() {
+ local oldPath="${PWD}"
+
+ cd "$(git rev-parse --show-toplevel)"
+
+ VCS_TYPE="git"
+
+ VCS_BASENAME="$(basename "${PWD}")"
+
+ VCS_UUID="$(git rev-list --max-parents=0 --date-order --reverse HEAD 2>/dev/null | sed -n 1p)"
+ if [ -z "${VCS_UUID}" ]; then
+ VCS_UUID="$(git rev-list --topo-order HEAD | tail -n 1)"
+ fi
+
+ # Is the working copy clean?
+ test -z "$(git status --untracked-files=normal --porcelain)"
+ VCS_WC_MODIFIED="${?}"
+
+ # Enumeration of changesets
+ VCS_NUM="$(git rev-list --count HEAD 2>/dev/null)"
+ if [ -z "${VCS_NUM}" ]; then
+ echo "warning: Counting the number of revisions may be slower due to an outdated git version less than 1.7.2.3. If something breaks, please update it." 1>&2
+ VCS_NUM="$(git rev-list HEAD | wc -l)"
+ fi
+
+ # This may be a git-svn remote. If so, report the Subversion revision.
+ if [ -z "$(git config svn-remote.svn.url 2>/dev/null)" ]; then
+ # The full revision hash
+ VCS_FULL_HASH="$(git rev-parse HEAD)"
+
+ # The short hash
+ VCS_SHORT_HASH="$(echo "${VCS_FULL_HASH}" | cut -b 1-7)"
+ else
+ # The git-svn revision number
+ VCS_FULL_HASH="$(git svn find-rev HEAD)"
+ VCS_SHORT_HASH="${VCS_FULL_HASH}"
+ fi
+
+ # Current branch
+ VCS_BRANCH="$(git rev-parse --symbolic-full-name --verify "$(git name-rev --name-only --no-undefined HEAD 2>/dev/null)" 2>/dev/null | sed -e 's:refs/heads/::' | sed -e 's:refs/::')"
+
+ # Cache the description
+ local DESCRIPTION="$(git describe --long --tags 2>/dev/null)"
+
+ # Current or last tag ancestor (empty if no tags)
+ VCS_TAG="$(echo "${DESCRIPTION}" | sed -e "s:-g${VCS_SHORT_HASH}\$::" -e 's:-[0-9]*$::')"
+
+ # Distance to last tag or an alias of VCS_NUM if there is no tag
+ if [ ! -z "${DESCRIPTION}" ]; then
+ VCS_TICK="$(echo "${DESCRIPTION}" | sed -e "s:${VCS_TAG}-::" -e "s:-g${VCS_SHORT_HASH}::")"
+ else
+ VCS_TICK="${VCS_NUM}"
+ fi
+
+ # Date of the current commit
+ VCS_DATE="$(TZ=UTC git show -s --date=iso-strict-local --pretty=format:%ad | sed -e 's|+00:00|Z|')"
+ if [ -z "${VCS_DATE}" ]; then
+ echo "warning: Action stamps require git version 2.7+." 1>&2
+ VCS_DATE="$(git log -1 --pretty=format:%ci | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')"
+ local ASdis="1"
+ fi
+
+ # Action Stamp
+ if [ -z "${ASdis}" ]; then
+ VCS_ACTION_STAMP="${VCS_DATE}!$(git show -s --pretty=format:%cE)"
+ else
+ VCS_ACTION_STAMP=""
+ fi
+
+ cd "${oldPath}"
+}
+
+# For hg repos
+# shellcheck disable=SC2039,SC2164
+hgRepo() {
+ local oldPath="${PWD}"
+
+ cd "$(hg root)"
+
+ VCS_TYPE="hg"
+
+ VCS_BASENAME="$(basename "${PWD}")"
+
+ VCS_UUID="$(hg log -r "0" -l 1 --template '{node}\n')"
+
+ # Is the working copy clean?
+ test -z "$(hg status -duram)"
+ VCS_WC_MODIFIED="${?}"
+
+ # Enumeration of changesets
+ VCS_NUM="$(hg id -n | tr -d '+')"
+
+ # The full revision hash
+ VCS_FULL_HASH="$(hg log -r "${VCS_NUM}" -l 1 --template '{node}\n')"
+
+ # The short hash
+ VCS_SHORT_HASH="$(hg id -i | tr -d '+')"
+
+ # Current bookmark (bookmarks are roughly equivalent to git's branches)
+ # or branch if no bookmark
+ VCS_BRANCH="$(hg id -B | cut -d ' ' -f 1)"
+ # Fall back to the branch if there are no bookmarks
+ if [ -z "${VCS_BRANCH}" ]; then
+ VCS_BRANCH="$(hg id -b)"
+ fi
+
+ # Current or last tag ancestor (excluding auto tags, empty if no tags)
+ VCS_TAG="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttag}\n' 2>/dev/null | sed -e 's:qtip::' -e 's:tip::' -e 's:qbase::' -e 's:qparent::' -e "s:$(hg --config 'extensions.color=' --config 'extensions.mq=' --color never qtop 2>/dev/null)::" | cut -d ' ' -f 1)"
+
+ # Distance to last tag or an alias of VCS_NUM if there is no tag
+ if [ ! -z "${VCS_TAG}" ]; then
+ VCS_TICK="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttagdistance}\n' 2>/dev/null)"
+ else
+ VCS_TICK="${VCS_NUM}"
+ fi
+
+ # Date of the current commit
+ VCS_DATE="$(hg log -r "${VCS_NUM}" -l 1 --template '{date|isodatesec}\n' 2>/dev/null | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')"
+
+ # Action Stamp
+ VCS_ACTION_STAMP="$(TZ=UTC hg log -r "${VCS_NUM}" -l 1 --template '{date|localdate|rfc3339date}\n' 2>/dev/null | sed -e 's|+00:00|Z|')!$(hg log -r "${VCS_NUM}" -l 1 --template '{author|email}\n' 2>/dev/null)"
+
+ cd "${oldPath}"
+}
+
+# For bzr repos
+# shellcheck disable=SC2039,SC2164
+bzrRepo() {
+ local oldPath="${PWD}"
+
+ cd "$(bzr root)"
+
+ VCS_TYPE="bzr"
+
+ VCS_BASENAME="$(basename "${PWD}")"
+
+ # Currently unimplemented because more investigation is needed.
+ VCS_UUID=""
+
+ # Is the working copy clean?
+ bzr version-info --custom --template='{clean}\n' | grep -q '1'
+ VCS_WC_MODIFIED="${?}"
+
+ # Enumeration of changesets
+ VCS_NUM="$(bzr revno)"
+
+ # The full revision hash
+ VCS_FULL_HASH="$(bzr version-info --custom --template='{revision_id}\n')"
+
+ # The short hash
+ VCS_SHORT_HASH="${VCS_NUM}"
+
+ # Nick of the current branch
+ VCS_BRANCH="$(bzr nick)"
+
+ # Current or last tag ancestor (excluding auto tags, empty if no tags)
+ VCS_TAG="$(bzr tags --sort=time | sed '/?$/d' | tail -n1 | cut -d ' ' -f1)"
+
+ # Distance to last tag or an alias of VCS_NUM if there is no tag
+ if [ ! -z "${VCS_TAG}" ]; then
+ VCS_TICK="$(bzr log --line -r "tag:${VCS_TAG}.." | tail -n +2 | wc -l | sed -e 's:^ *::')"
+ else
+ VCS_TICK="${VCS_NUM}"
+ fi
+
+ # Date of the current commit
+ VCS_DATE="$(bzr version-info --custom --template='{date}\n' | sed -e 's: :T:' -e 's: ::')"
+
+ # Action Stamp
+ # Currently unimplemented because more investigation is needed.
+ VCS_ACTION_STAMP=""
+
+ cd "${oldPath}"
+}
+
+# For svn repos
+# shellcheck disable=SC2039,SC2164,SC2155
+svnRepo() {
+ local oldPath="${PWD}"
+
+ VCS_TYPE="svn"
+
+ case "${PWD}" in
+ /*trunk*|/*branches*|/*tags*)
+ local fn="${PWD}"
+ while [ "$(basename "${fn}")" != 'trunk' ] && [ "$(basename "${fn}")" != 'branches' ] && [ "$(basename "${fn}")" != 'tags' ] && [ "$(basename "${fn}")" != '/' ]; do
+ local fn="$(dirname "${fn}")"
+ done
+ local fn="$(dirname "${fn}")"
+ if [ "${fn}" = '/' ]; then
+ VCS_BASENAME="$(basename "${PWD}")"
+ else
+ VCS_BASENAME="$(basename "${fn}")"
+ fi
+ ;;
+ *) VCS_BASENAME="$(basename "${PWD}")" ;;
+ esac
+
+ VCS_UUID="$(svn info --xml | sed -n -e 's:<uuid>::' -e 's:</uuid>::p')"
+
+ # Cache svnversion output
+ local SVNVERSION="$(svnversion)"
+
+ # Is the working copy clean?
+ echo "${SVNVERSION}" | grep -q "M"
+ case "${?}" in
+ 0)
+ VCS_WC_MODIFIED="1"
+ ;;
+ 1)
+ if [ ! -z "${UNTRACKEDFILES}" ]; then
+ # `svnversion` does not detect untracked files and `svn status` is really slow, so only run it if we really have to.
+ if [ -z "$(svn status)" ]; then
+ VCS_WC_MODIFIED="0"
+ else
+ VCS_WC_MODIFIED="1"
+ fi
+ else
+ VCS_WC_MODIFIED="0"
+ fi
+ ;;
+ esac
+
+ # Enumeration of changesets
+ VCS_NUM="$(echo "${SVNVERSION}" | cut -d : -f 1 | sed -e 's:M::' -e 's:S::' -e 's:P::')"
+
+ # The full revision hash
+ VCS_FULL_HASH="${SVNVERSION}"
+
+ # The short hash
+ VCS_SHORT_HASH="${VCS_NUM}"
+
+ # Current branch
+ case "${PWD}" in
+ /*trunk*|/*branches*|/*tags*)
+ local lastbase=""
+ local fn="${PWD}"
+ while :
+ do
+ base="$(basename "${fn}")"
+ if [ "${base}" = 'trunk' ]; then
+ VCS_BRANCH='trunk'
+ break
+ elif [ "${base}" = 'branches' ] || [ "${base}" = 'tags' ]; then
+ VCS_BRANCH="${lastbase}"
+ break
+ elif [ "${base}" = '/' ]; then
+ VCS_BRANCH=""
+ break
+ fi
+ local lastbase="${base}"
+ local fn="$(dirname "${fn}")"
+ done
+ ;;
+ *) VCS_BRANCH="" ;;
+ esac
+
+ # Current or last tag ancestor (empty if no tags). But "current
+ # tag" can't be extracted reliably because Subversion doesn't
+ # have tags the way other VCSes do.
+ VCS_TAG=""
+ VCS_TICK=""
+
+ # Date of the current commit
+ VCS_DATE="$(svn info --xml | sed -n -e 's:<date>::' -e 's:</date>::p')"
+
+ # Action Stamp
+ VCS_ACTION_STAMP="${VCS_DATE}!$(svn log --xml -l 1 -r "${VCS_SHORT_HASH}" | sed -n -e 's:<author>::' -e 's:</author>::p')"
+
+ cd "${oldPath}"
+}
+
+
+# Functions to output data in different formats.
+# For bash output
+shOutput() {
+ cat > "${TARGETFILE}" << EOF
+# ${GENERATED_HEADER}
+
+VCS_TYPE="${VCS_TYPE}"
+VCS_BASENAME="${VCS_BASENAME}"
+VCS_UUID="${VCS_UUID}"
+VCS_NUM="${VCS_NUM}"
+VCS_DATE="${VCS_DATE}"
+VCS_BRANCH="${VCS_BRANCH}"
+VCS_TAG="${VCS_TAG}"
+VCS_TICK="${VCS_TICK}"
+VCS_EXTRA="${VCS_EXTRA}"
+
+VCS_ACTION_STAMP="${VCS_ACTION_STAMP}"
+VCS_FULL_HASH="${VCS_FULL_HASH}"
+VCS_SHORT_HASH="${VCS_SHORT_HASH}"
+
+VCS_WC_MODIFIED="${VCS_WC_MODIFIED}"
+
+# end
+EOF
+}
+
+# For source C output
+cOutput() {
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+
+const char *VCS_TYPE = "${VCS_TYPE}";
+const char *VCS_BASENAME = "${VCS_BASENAME}";
+const char *VCS_UUID = "${VCS_UUID}";
+const int VCS_NUM = ${VCS_NUM};
+const char *VCS_DATE = "${VCS_DATE}";
+const char *VCS_BRANCH = "${VCS_BRANCH}";
+const char *VCS_TAG = "${VCS_TAG}";
+const int VCS_TICK = ${VCS_TICK};
+const char *VCS_EXTRA = "${VCS_EXTRA}";
+
+const char *VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}";
+const char *VCS_FULL_HASH = "${VCS_FULL_HASH}";
+const char *VCS_SHORT_HASH = "${VCS_SHORT_HASH}";
+
+const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+
+/* end */
+EOF
+}
+
+# For header output
+hOutput() {
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+#ifndef AUTOREVISION_H
+#define AUTOREVISION_H
+
+#define VCS_TYPE "${VCS_TYPE}"
+#define VCS_BASENAME "${VCS_BASENAME}"
+#define VCS_UUID "${VCS_UUID}"
+#define VCS_NUM ${VCS_NUM}
+#define VCS_DATE "${VCS_DATE}"
+#define VCS_BRANCH "${VCS_BRANCH}"
+#define VCS_TAG "${VCS_TAG}"
+#define VCS_TICK ${VCS_TICK}
+#define VCS_EXTRA "${VCS_EXTRA}"
+
+#define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}"
+#define VCS_FULL_HASH "${VCS_FULL_HASH}"
+#define VCS_SHORT_HASH "${VCS_SHORT_HASH}"
+
+#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED}
+
+#endif
+
+/* end */
+EOF
+}
+
+# A header output for use with xcode to populate info.plist strings
+xcodeOutput() {
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+#ifndef AUTOREVISION_H
+#define AUTOREVISION_H
+
+#define VCS_TYPE ${VCS_TYPE}
+#define VCS_BASENAME ${VCS_BASENAME}
+#define VCS_UUID ${VCS_UUID}
+#define VCS_NUM ${VCS_NUM}
+#define VCS_DATE ${VCS_DATE}
+#define VCS_BRANCH ${VCS_BRANCH}
+#define VCS_TAG ${VCS_TAG}
+#define VCS_TICK ${VCS_TICK}
+#define VCS_EXTRA ${VCS_EXTRA}
+
+#define VCS_ACTION_STAMP ${VCS_ACTION_STAMP}
+#define VCS_FULL_HASH ${VCS_FULL_HASH}
+#define VCS_SHORT_HASH ${VCS_SHORT_HASH}
+
+#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED}
+
+#endif
+
+/* end */
+EOF
+}
+
+# For Swift output
+swiftOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ # For values that may not exist depending on the type of repo we
+ # have read from, set them to `nil` when they are empty.
+ if [ -z "${VCS_UUID}" ]; then
+ VCS_UUID="nil"
+ else
+ VCS_UUID="\"${VCS_UUID}\""
+ fi
+ if [ -z "${VCS_TAG}" ]; then
+ VCS_TAG="nil"
+ else
+ VCS_TAG="\"${VCS_TAG}\""
+ fi
+ : "${VCS_TICK:="nil"}"
+ if [ -z "${VCS_EXTRA}" ]; then
+ VCS_EXTRA="nil"
+ else
+ VCS_EXTRA="\"${VCS_EXTRA}\""
+ fi
+ if [ -z "${VCS_ACTION_STAMP}" ]; then
+ VCS_ACTION_STAMP="nil"
+ else
+ VCS_ACTION_STAMP="\"${VCS_ACTION_STAMP}\""
+ fi
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+
+let VCS_TYPE = "${VCS_TYPE}"
+let VCS_BASENAME = "${VCS_BASENAME}"
+let VCS_UUID: String? = ${VCS_UUID}
+let VCS_NUM: Int = ${VCS_NUM}
+let VCS_DATE = "${VCS_DATE}"
+let VCS_BRANCH: String = "${VCS_BRANCH}"
+let VCS_TAG: String? = ${VCS_TAG}
+let VCS_TICK: Int? = ${VCS_TICK}
+let VCS_EXTRA: String? = ${VCS_EXTRA}
+
+let VCS_ACTION_STAMP: String? = ${VCS_ACTION_STAMP}
+let VCS_FULL_HASH: String = "${VCS_FULL_HASH}"
+let VCS_SHORT_HASH: String = "${VCS_SHORT_HASH}"
+
+let VCS_WC_MODIFIED: Bool = ${VCS_WC_MODIFIED}
+
+/* end */
+EOF
+}
+
+# For Python output
+pyOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="False" ;;
+ 1) VCS_WC_MODIFIED="True" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+# ${GENERATED_HEADER}
+
+VCS_TYPE = "${VCS_TYPE}"
+VCS_BASENAME = "${VCS_BASENAME}"
+VCS_UUID = "${VCS_UUID}"
+VCS_NUM = ${VCS_NUM}
+VCS_DATE = "${VCS_DATE}"
+VCS_BRANCH = "${VCS_BRANCH}"
+VCS_TAG = "${VCS_TAG}"
+VCS_TICK = ${VCS_TICK}
+VCS_EXTRA = "${VCS_EXTRA}"
+
+VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"
+VCS_FULL_HASH = "${VCS_FULL_HASH}"
+VCS_SHORT_HASH = "${VCS_SHORT_HASH}"
+
+VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}
+
+# end
+EOF
+}
+
+# For Perl output
+plOutput() {
+ cat << EOF
+# ${GENERATED_HEADER}
+
+\$VCS_TYPE = '${VCS_TYPE}';
+\$VCS_BASENAME = '${VCS_BASENAME}';
+\$VCS_UUID = '${VCS_UUID}';
+\$VCS_NUM = ${VCS_NUM};
+\$VCS_DATE = '${VCS_DATE}';
+\$VCS_BRANCH = '${VCS_BRANCH}';
+\$VCS_TAG = '${VCS_TAG}';
+\$VCS_TICK = ${VCS_TICK};
+\$VCS_EXTRA = '${VCS_EXTRA}';
+
+\$VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}';
+\$VCS_FULL_HASH = '${VCS_FULL_HASH}';
+\$VCS_SHORT_HASH = '${VCS_SHORT_HASH}';
+
+\$VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+
+# end
+1;
+EOF
+}
+
+# For lua output
+luaOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+-- ${GENERATED_HEADER}
+
+VCS_TYPE = "${VCS_TYPE}"
+VCS_BASENAME = "${VCS_BASENAME}"
+VCS_UUID = "${VCS_UUID}"
+VCS_NUM = ${VCS_NUM}
+VCS_DATE = "${VCS_DATE}"
+VCS_BRANCH = "${VCS_BRANCH}"
+VCS_TAG = "${VCS_TAG}"
+VCS_TICK = ${VCS_TICK}
+VCS_EXTRA = "${VCS_EXTRA}"
+
+VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"
+VCS_FULL_HASH = "${VCS_FULL_HASH}"
+VCS_SHORT_HASH = "${VCS_SHORT_HASH}"
+
+VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}
+
+-- end
+EOF
+}
+
+# For php output
+phpOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+<?php
+# ${GENERATED_HEADER}
+
+return array(
+ "VCS_TYPE" => "${VCS_TYPE}",
+ "VCS_BASENAME" => "${VCS_BASENAME}",
+ "VCS_UUID" => "${VCS_UUID}",
+ "VCS_NUM" => ${VCS_NUM},
+ "VCS_DATE" => "${VCS_DATE}",
+ "VCS_BRANCH" => "${VCS_BRANCH}",
+ "VCS_TAG" => "${VCS_TAG}",
+ "VCS_TICK" => ${VCS_TICK},
+ "VCS_EXTRA" => "${VCS_EXTRA}",
+ "VCS_ACTION_STAMP" => "${VCS_ACTION_STAMP}",
+ "VCS_FULL_HASH" => "${VCS_FULL_HASH}",
+ "VCS_SHORT_HASH" => "${VCS_SHORT_HASH}",
+ "VCS_WC_MODIFIED" => ${VCS_WC_MODIFIED}
+);
+
+# end
+?>
+EOF
+}
+
+# For ini output
+iniOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+; ${GENERATED_HEADER}
+[VCS]
+VCS_TYPE = "${VCS_TYPE}"
+VCS_BASENAME = "${VCS_BASENAME}"
+VCS_UUID = "${VCS_UUID}"
+VCS_NUM = ${VCS_NUM}
+VCS_DATE = "${VCS_DATE}"
+VCS_BRANCH = "${VCS_BRANCH}"
+VCS_TAG = "${VCS_TAG}"
+VCS_TICK = ${VCS_TICK}
+VCS_EXTRA = "${VCS_EXTRA}"
+VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"
+VCS_FULL_HASH = "${VCS_FULL_HASH}"
+VCS_SHORT_HASH = "${VCS_SHORT_HASH}"
+VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}
+; end
+EOF
+}
+
+# For javascript output
+jsOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 1) VCS_WC_MODIFIED="true" ;;
+ 0) VCS_WC_MODIFIED="false" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+/** ${GENERATED_HEADER} */
+
+var autorevision = {
+ VCS_TYPE: "${VCS_TYPE}",
+ VCS_BASENAME: "${VCS_BASENAME}",
+ VCS_UUID: "${VCS_UUID}",
+ VCS_NUM: ${VCS_NUM},
+ VCS_DATE: "${VCS_DATE}",
+ VCS_BRANCH: "${VCS_BRANCH}",
+ VCS_TAG: "${VCS_TAG}",
+ VCS_TICK: ${VCS_TICK},
+ VCS_EXTRA: "${VCS_EXTRA}",
+
+ VCS_ACTION_STAMP: "${VCS_ACTION_STAMP}",
+ VCS_FULL_HASH: "${VCS_FULL_HASH}",
+ VCS_SHORT_HASH: "${VCS_SHORT_HASH}",
+
+ VCS_WC_MODIFIED: ${VCS_WC_MODIFIED}
+};
+
+/** Node.js compatibility */
+if (typeof module !== 'undefined') {
+ module.exports = autorevision;
+}
+
+/** end */
+EOF
+}
+
+# For JSON output
+jsonOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 1) VCS_WC_MODIFIED="true" ;;
+ 0) VCS_WC_MODIFIED="false" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+{
+ "_comment": "${GENERATED_HEADER}",
+ "VCS_TYPE": "${VCS_TYPE}",
+ "VCS_BASENAME": "${VCS_BASENAME}",
+ "VCS_UUID": "${VCS_UUID}",
+ "VCS_NUM": ${VCS_NUM},
+ "VCS_DATE": "${VCS_DATE}",
+ "VCS_BRANCH":"${VCS_BRANCH}",
+ "VCS_TAG": "${VCS_TAG}",
+ "VCS_TICK": ${VCS_TICK},
+ "VCS_EXTRA": "${VCS_EXTRA}",
+
+ "VCS_ACTION_STAMP": "${VCS_ACTION_STAMP}",
+ "VCS_FULL_HASH": "${VCS_FULL_HASH}",
+ "VCS_SHORT_HASH": "${VCS_SHORT_HASH}",
+
+ "VCS_WC_MODIFIED": ${VCS_WC_MODIFIED}
+}
+EOF
+}
+
+# For Java output
+javaOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 1) VCS_WC_MODIFIED="true" ;;
+ 0) VCS_WC_MODIFIED="false" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+
+public class autorevision {
+ public static final String VCS_TYPE = "${VCS_TYPE}";
+ public static final String VCS_BASENAME = "${VCS_BASENAME}";
+ public static final String VCS_UUID = "${VCS_UUID}";
+ public static final long VCS_NUM = ${VCS_NUM};
+ public static final String VCS_DATE = "${VCS_DATE}";
+ public static final String VCS_BRANCH = "${VCS_BRANCH}";
+ public static final String VCS_TAG = "${VCS_TAG}";
+ public static final long VCS_TICK = ${VCS_TICK};
+ public static final String VCS_EXTRA = "${VCS_EXTRA}";
+
+ public static final String VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}";
+ public static final String VCS_FULL_HASH = "${VCS_FULL_HASH}";
+ public static final String VCS_SHORT_HASH = "${VCS_SHORT_HASH}";
+
+ public static final boolean VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+}
+EOF
+}
+
+# For Java properties output
+javapropOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 1) VCS_WC_MODIFIED="true" ;;
+ 0) VCS_WC_MODIFIED="false" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+# ${GENERATED_HEADER}
+
+VCS_TYPE=${VCS_TYPE}
+VCS_BASENAME=${VCS_BASENAME}
+VCS_UUID=${VCS_UUID}
+VCS_NUM=${VCS_NUM}
+VCS_DATE=${VCS_DATE}
+VCS_BRANCH=${VCS_BRANCH}
+VCS_TAG=${VCS_TAG}
+VCS_TICK=${VCS_TICK}
+VCS_EXTRA=${VCS_EXTRA}
+
+VCS_ACTION_STAMP=${VCS_ACTION_STAMP}
+VCS_FULL_HASH=${VCS_FULL_HASH}
+VCS_SHORT_HASH=${VCS_SHORT_HASH}
+
+VCS_WC_MODIFIED=${VCS_WC_MODIFIED}
+EOF
+}
+
+# For m4 output
+m4Output() {
+ cat > "${TARGETFILE}" << EOF
+dnl ${GENERATED_HEADER}
+define(\`VCS_TYPE', \`${VCS_TYPE}')dnl
+define(\`VCS_BASENAME', \`${VCS_BASENAME}')dnl
+define(\`VCS_UUID', \`${VCS_UUID}')dnl
+define(\`VCS_NUM', \`${VCS_NUM}')dnl
+define(\`VCS_DATE', \`${VCS_DATE}')dnl
+define(\`VCS_BRANCH', \`${VCS_BRANCH}')dnl
+define(\`VCS_TAG', \`${VCS_TAG}')dnl
+define(\`VCS_TICK', \`${VCS_TICK}')dnl
+define(\`VCS_EXTRA', \`${VCS_EXTRA}')dnl
+define(\`VCS_ACTIONSTAMP', \`${VCS_ACTION_STAMP}')dnl
+define(\`VCS_FULLHASH', \`${VCS_FULL_HASH}')dnl
+define(\`VCS_SHORTHASH', \`${VCS_SHORT_HASH}')dnl
+define(\`VCS_WC_MODIFIED', \`${VCS_WC_MODIFIED}')dnl
+EOF
+}
+
+# For (La)TeX output
+texOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+% ${GENERATED_HEADER}
+\def \vcsType {${VCS_TYPE}}
+\def \vcsBasename {${VCS_BASENAME}}
+\def \vcsUUID {${VCS_UUID}}
+\def \vcsNum {${VCS_NUM}}
+\def \vcsDate {${VCS_DATE}}
+\def \vcsBranch {${VCS_BRANCH}}
+\def \vcsTag {${VCS_TAG}}
+\def \vcsTick {${VCS_TICK}}
+\def \vcsExtra {${VCS_EXTRA}}
+\def \vcsACTIONSTAMP {${VCS_ACTION_STAMP}}
+\def \vcsFullHash {${VCS_FULL_HASH}}
+\def \vcsShortHash {${VCS_SHORT_HASH}}
+\def \vcsWCModified {${VCS_WC_MODIFIED}}
+\endinput
+EOF
+}
+
+# For scheme output
+schemeOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="#f" ;;
+ 1) VCS_WC_MODIFIED="#t" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+;; ${GENERATED_HEADER}
+(define VCS_TYPE "${VCS_TYPE}")
+(define VCS_BASENAME "${VCS_BASENAME}")
+(define VCS_UUID "${VCS_UUID}")
+(define VCS_NUM ${VCS_NUM})
+(define VCS_DATE "${VCS_DATE}")
+(define VCS_BRANCH "${VCS_BRANCH}")
+(define VCS_TAG "${VCS_TAG}")
+(define VCS_TICK ${VCS_TICK})
+(define VCS_EXTRA "${VCS_EXTRA}")
+
+(define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}")
+(define VCS_FULL_HASH "${VCS_FULL_HASH}")
+(define VCS_SHORT_HASH "${VCS_SHORT_HASH}")
+
+(define VCS_WC_MODIFIED ${VCS_WC_MODIFIED})
+;; end
+EOF
+}
+
+# For clojure output
+clojureOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="false" ;;
+ 1) VCS_WC_MODIFIED="true" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+;; ${GENERATED_HEADER}
+(def VCS_TYPE "${VCS_TYPE}")
+(def VCS_BASENAME "${VCS_BASENAME}")
+(def VCS_UUID "${VCS_UUID}")
+(def VCS_NUM ${VCS_NUM})
+(def VCS_DATE "${VCS_DATE}")
+(def VCS_BRANCH "${VCS_BRANCH}")
+(def VCS_TAG "${VCS_TAG}")
+(def VCS_TICK ${VCS_TICK})
+(def VCS_EXTRA "${VCS_EXTRA}")
+
+(def VCS_ACTION_STAMP "${VCS_ACTION_STAMP}")
+(def VCS_FULL_HASH "${VCS_FULL_HASH}")
+(def VCS_SHORT_HASH "${VCS_SHORT_HASH}")
+
+(def VCS_WC_MODIFIED ${VCS_WC_MODIFIED})
+;; end
+EOF
+}
+
+# For rpm spec file output
+rpmOutput() {
+ cat > "${TARGETFILE}" << EOF
+# ${GENERATED_HEADER}
+$([ "${VCS_TYPE}" ] && echo "%define vcs_type ${VCS_TYPE}")
+$([ "${VCS_BASENAME}" ] && echo "%define vcs_basename ${VCS_BASENAME}")
+$([ "${VCS_UUID}" ] && echo "%define vcs_uuid ${VCS_UUID}")
+$([ "${VCS_NUM}" ] && echo "%define vcs_num ${VCS_NUM}")
+$([ "${VCS_DATE}" ] && echo "%define vcs_date ${VCS_DATE}")
+$([ "${VCS_BRANCH}" ] && echo "%define vcs_branch ${VCS_BRANCH}")
+$([ "${VCS_TAG}" ] && echo "%define vcs_tag ${VCS_TAG}")
+$([ "${VCS_TICK}" ] && echo "%define vcs_tick ${VCS_TICK}")
+$([ "${VCS_EXTRA}" ] && echo "%define vcs_extra ${VCS_EXTRA}")
+
+$([ "${VCS_ACTION_STAMP}" ] && echo "%define vcs_action_stamp ${VCS_ACTION_STAMP}")
+$([ "${VCS_FULL_HASH}" ] && echo "%define vcs_full_hash ${VCS_FULL_HASH}")
+$([ "${VCS_SHORT_HASH}" ] && echo "%define vcs_short_hash ${VCS_SHORT_HASH}")
+
+$([ "${VCS_WC_MODIFIED}" ] && echo "%define vcs_wc_modified ${VCS_WC_MODIFIED}")
+# end
+EOF
+}
+
+# shellcheck disable=SC2155,SC2039
+hppOutput() {
+ local NAMESPACE="$(echo "${VCS_BASENAME}" | sed -e 's:_::g' | tr '[:lower:]' '[:upper:]')"
+ cat > "${TARGETFILE}" << EOF
+/* ${GENERATED_HEADER} */
+
+#ifndef ${NAMESPACE}_AUTOREVISION_H
+#define ${NAMESPACE}_AUTOREVISION_H
+
+#include <string>
+
+namespace $(echo "${NAMESPACE}" | tr '[:upper:]' '[:lower:]')
+{
+ const std::string VCS_TYPE = "${VCS_TYPE}";
+ const std::string VCS_BASENAME = "${VCS_BASENAME}";
+ const std::string VCS_UUID = "${VCS_UUID}";
+ const int VCS_NUM = ${VCS_NUM};
+ const std::string VCS_DATE = "${VCS_DATE}";
+ const std::string VCS_BRANCH = "${VCS_BRANCH}";
+ const std::string VCS_TAG = "${VCS_TAG}";
+ const int VCS_TICK = ${VCS_TICK};
+ const std::string VCS_EXTRA = "${VCS_EXTRA}";
+
+ const std::string VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}";
+ const std::string VCS_FULL_HASH = "${VCS_FULL_HASH}";
+ const std::string VCS_SHORT_HASH = "${VCS_SHORT_HASH}";
+
+ const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+}
+
+#endif
+
+/* end */
+EOF
+}
+
+matlabOutput() {
+ case "${VCS_WC_MODIFIED}" in
+ 0) VCS_WC_MODIFIED="FALSE" ;;
+ 1) VCS_WC_MODIFIED="TRUE" ;;
+ esac
+ cat > "${TARGETFILE}" << EOF
+% ${GENERATED_HEADER}
+
+VCS_TYPE = '${VCS_TYPE}';
+VCS_BASENAME = '${VCS_BASENAME}';
+VCS_UUID = '${VCS_UUID}';
+VCS_NUM = ${VCS_NUM};
+VCS_DATE = '${VCS_DATE}';
+VCS_BRANCH = '${VCS_BRANCH}';
+VCS_TAG = '${VCS_TAG}';
+VCS_TICK = ${VCS_TICK};
+VCS_EXTRA = '${VCS_EXTRA}';
+
+VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}';
+VCS_FULL_HASH = '${VCS_FULL_HASH}';
+VCS_SHORT_HASH = '${VCS_SHORT_HASH}';
+
+VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+
+% end
+EOF
+}
+
+octaveOutput() {
+ cat > "${TARGETFILE}" << EOF
+% ${GENERATED_HEADER}
+
+VCS_TYPE = '${VCS_TYPE}';
+VCS_BASENAME = '${VCS_BASENAME}';
+VCS_UUID = '${VCS_UUID}';
+VCS_NUM = ${VCS_NUM};
+VCS_DATE = '${VCS_DATE}';
+VCS_BRANCH = '${VCS_BRANCH}';
+VCS_TAG = '${VCS_TAG}';
+VCS_TICK = ${VCS_TICK};
+VCS_EXTRA = '${VCS_EXTRA}';
+
+VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}';
+VCS_FULL_HASH = '${VCS_FULL_HASH}';
+VCS_SHORT_HASH = '${VCS_SHORT_HASH}';
+
+VCS_WC_MODIFIED = ${VCS_WC_MODIFIED};
+
+% end
+EOF
+}
+
+cmakeOutput() {
+ cat > "${TARGETFILE}" << EOF
+# ${GENERATED_HEADER}
+
+set(VCS_TYPE ${VCS_TYPE})
+set(VCS_BASENAME ${VCS_BASENAME})
+set(VCS_UUID ${VCS_UUID})
+set(VCS_NUM ${VCS_NUM})
+set(VCS_DATE ${VCS_DATE})
+set(VCS_BRANCH ${VCS_BRANCH})
+set(VCS_TAG ${VCS_TAG})
+set(VCS_TICK ${VCS_TICK})
+set(VCS_EXTRA ${VCS_EXTRA})
+
+set(VCS_ACTION_STAMP ${VCS_ACTION_STAMP})
+set(VCS_FULL_HASH ${VCS_FULL_HASH})
+set(VCS_SHORT_HASH ${VCS_SHORT_HASH})
+
+set(VCS_WC_MODIFIED ${VCS_WC_MODIFIED})
+
+# end
+EOF
+}
+
+
+# Helper functions
+# Count path segments
+# shellcheck disable=SC2039
+pathSegment() {
+ local pathz="${1}"
+ local depth="0"
+
+ if [ ! -z "${pathz}" ]; then
+ # Continue until we are at / or there are no path separators left.
+ while [ ! "${pathz}" = "/" ] && [ ! "${pathz}" = "$(echo "${pathz}" | sed -e 's:/::')" ]; do
+ pathz="$(dirname "${pathz}")"
+ depth="$((depth+1))"
+ done
+ fi
+ echo "${depth}"
+}
+
+# Largest of four numbers
+# shellcheck disable=SC2039
+multiCompare() {
+ local larger="${1}"
+ local numA="${2}"
+ local numB="${3}"
+ local numC="${4}"
+
+ [ "${numA}" -gt "${larger}" ] && larger="${numA}"
+ [ "${numB}" -gt "${larger}" ] && larger="${numB}"
+ [ "${numC}" -gt "${larger}" ] && larger="${numC}"
+ echo "${larger}"
+}
+
+# Test for repositories
+# shellcheck disable=SC2155,SC2039
+repoTest() {
+ REPONUM="0"
+ if [ ! -z "$(git rev-parse HEAD 2>/dev/null)" ]; then
+ local gitPath="$(git rev-parse --show-toplevel)"
+ local gitDepth="$(pathSegment "${gitPath}")"
+ REPONUM="$((REPONUM+1))"
+ else
+ local gitDepth="0"
+ fi
+ if [ ! -z "$(hg root 2>/dev/null)" ]; then
+ local hgPath="$(hg root 2>/dev/null)"
+ local hgDepth="$(pathSegment "${hgPath}")"
+ REPONUM="$((REPONUM+1))"
+ else
+ local hgDepth="0"
+ fi
+ if [ ! -z "$(bzr root 2>/dev/null)" ]; then
+ local bzrPath="$(bzr root 2>/dev/null)"
+ local bzrDepth="$(pathSegment "${bzrPath}")"
+ REPONUM="$((REPONUM+1))"
+ else
+ local bzrDepth="0"
+ fi
+ if [ ! -z "$(svn info 2>/dev/null)" ]; then
+ local stringz="<wcroot-abspath>"
+ local stringx="</wcroot-abspath>"
+ local svnPath="$(svn info --xml | sed -n -e "s:${stringz}::" -e "s:${stringx}::p")"
+ # An old enough svn will not be able give us a path; default
+ # to 1 for that case.
+ if [ -z "${svnPath}" ]; then
+ local svnDepth="1"
+ else
+ local svnDepth="$(pathSegment "${svnPath}")"
+ fi
+ REPONUM="$((REPONUM+1))"
+ else
+ local svnDepth="0"
+ fi
+
+ # Do not do more work then we have to.
+ if [ "${REPONUM}" = "0" ]; then
+ return
+ fi
+
+ # Figure out which repo is the deepest and use it.
+ local wonRepo="$(multiCompare "${gitDepth}" "${hgDepth}" "${bzrDepth}" "${svnDepth}")"
+ if [ "${wonRepo}" = "${gitDepth}" ]; then
+ gitRepo
+ elif [ "${wonRepo}" = "${hgDepth}" ]; then
+ hgRepo
+ elif [ "${wonRepo}" = "${bzrDepth}" ]; then
+ bzrRepo
+ elif [ "${wonRepo}" = "${svnDepth}" ]; then
+ svnRepo
+ fi
+}
+
+
+
+# Detect which repos we are in and gather data.
+# shellcheck source=/dev/null
+if [ -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then
+ # When requested only read from the cache to populate our symbols.
+ . "${CACHEFILE}"
+else
+ # If a value is not set through the environment set VCS_EXTRA to nothing.
+ : "${VCS_EXTRA:=""}"
+ repoTest
+
+ if [ -f "${CACHEFILE}" ] && [ "${REPONUM}" = "0" ]; then
+ # We are not in a repo; try to use a previously generated cache to populate our symbols.
+ . "${CACHEFILE}"
+ # Do not overwrite the cache if we know we are not going to write anything new.
+ CACHEFORCE="1"
+ elif [ "${REPONUM}" = "0" ]; then
+ echo "error: No repo or cache detected." 1>&2
+ exit 1
+ fi
+fi
+
+
+# -s output is handled here.
+if [ ! -z "${VAROUT}" ]; then
+ if [ "${VAROUT}" = "VCS_TYPE" ]; then
+ echo "${VCS_TYPE}"
+ elif [ "${VAROUT}" = "VCS_BASENAME" ]; then
+ echo "${VCS_BASENAME}"
+ elif [ "${VAROUT}" = "VCS_NUM" ]; then
+ echo "${VCS_NUM}"
+ elif [ "${VAROUT}" = "VCS_DATE" ]; then
+ echo "${VCS_DATE}"
+ elif [ "${VAROUT}" = "VCS_BRANCH" ]; then
+ echo "${VCS_BRANCH}"
+ elif [ "${VAROUT}" = "VCS_TAG" ]; then
+ echo "${VCS_TAG}"
+ elif [ "${VAROUT}" = "VCS_TICK" ]; then
+ echo "${VCS_TICK}"
+ elif [ "${VAROUT}" = "VCS_FULL_HASH" ]; then
+ echo "${VCS_FULL_HASH}"
+ elif [ "${VAROUT}" = "VCS_SHORT_HASH" ]; then
+ echo "${VCS_SHORT_HASH}"
+ elif [ "${VAROUT}" = "VCS_WC_MODIFIED" ]; then
+ echo "${VCS_WC_MODIFIED}"
+ elif [ "${VAROUT}" = "VCS_ACTION_STAMP" ]; then
+ echo "${VCS_ACTION_STAMP}"
+ else
+ echo "error: Not a valid output symbol." 1>&2
+ exit 1
+ fi
+fi
+
+
+# Detect requested output type and use it.
+if [ ! -z "${AFILETYPE}" ]; then
+ if [ "${AFILETYPE}" = "c" ]; then
+ cOutput
+ elif [ "${AFILETYPE}" = "h" ]; then
+ hOutput
+ elif [ "${AFILETYPE}" = "xcode" ]; then
+ xcodeOutput
+ elif [ "${AFILETYPE}" = "swift" ]; then
+ swiftOutput
+ elif [ "${AFILETYPE}" = "sh" ]; then
+ shOutput
+ elif [ "${AFILETYPE}" = "py" ] || [ "${AFILETYPE}" = "python" ]; then
+ pyOutput
+ elif [ "${AFILETYPE}" = "pl" ] || [ "${AFILETYPE}" = "perl" ]; then
+ plOutput
+ elif [ "${AFILETYPE}" = "lua" ]; then
+ luaOutput
+ elif [ "${AFILETYPE}" = "php" ]; then
+ phpOutput
+ elif [ "${AFILETYPE}" = "ini" ]; then
+ iniOutput
+ elif [ "${AFILETYPE}" = "js" ]; then
+ jsOutput
+ elif [ "${AFILETYPE}" = "json" ]; then
+ jsonOutput
+ elif [ "${AFILETYPE}" = "java" ]; then
+ javaOutput
+ elif [ "${AFILETYPE}" = "javaprop" ]; then
+ javapropOutput
+ elif [ "${AFILETYPE}" = "tex" ]; then
+ texOutput
+ elif [ "${AFILETYPE}" = "m4" ]; then
+ m4Output
+ elif [ "${AFILETYPE}" = "scheme" ]; then
+ schemeOutput
+ elif [ "${AFILETYPE}" = "clojure" ]; then
+ clojureOutput
+ elif [ "${AFILETYPE}" = "rpm" ]; then
+ rpmOutput
+ elif [ "${AFILETYPE}" = "hpp" ]; then
+ hppOutput
+ elif [ "${AFILETYPE}" = "matlab" ]; then
+ matlabOutput
+ elif [ "${AFILETYPE}" = "octave" ]; then
+ octaveOutput
+ elif [ "${AFILETYPE}" = "cmake" ]; then
+ cmakeOutput
+ else
+ echo "error: Not a valid output type." 1>&2
+ exit 1
+ fi
+fi
+
+
+# If requested, make a cache file.
+if [ ! -z "${CACHEFILE}" ] && [ ! "${CACHEFORCE}" = "1" ]; then
+ TARGETFILE="${CACHEFILE}.tmp"
+ shOutput
+
+ # Check to see if there have been any actual changes.
+ if [ ! -f "${CACHEFILE}" ]; then
+ mv -f "${CACHEFILE}.tmp" "${CACHEFILE}"
+ elif cmp -s "${CACHEFILE}.tmp" "${CACHEFILE}"; then
+ rm -f "${CACHEFILE}.tmp"
+ else
+ mv -f "${CACHEFILE}.tmp" "${CACHEFILE}"
+ fi
+fi
diff --git a/cmake/Version.cmake b/cmake/Version.cmake
new file mode 100644
index 0000000..0af0ab6
--- /dev/null
+++ b/cmake/Version.cmake
@@ -0,0 +1,43 @@
+
+# Using autorevision.sh to generate version information
+
+set(__SOURCE_AUTORESIVISION ${CMAKE_SOURCE_DIR}/autorevision.sh)
+set(__AUTORESIVISION ${CMAKE_BINARY_DIR}/autorevision.sh)
+set(__VERSION_CACHE ${CMAKE_SOURCE_DIR}/version.txt)
+set(__VERSION_CONFIG ${CMAKE_BINARY_DIR}/version.cmake)
+
+file(COPY ${__SOURCE_AUTORESIVISION} DESTINATION ${CMAKE_BINARY_DIR}
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
+ WORLD_READ WORLD_EXECUTE)
+
+# execute autorevision.sh to generate version information
+execute_process(COMMAND ${__AUTORESIVISION} -t cmake -o ${__VERSION_CACHE}
+ OUTPUT_FILE ${__VERSION_CONFIG} ERROR_QUIET)
+include(${__VERSION_CONFIG})
+
+# extract major, minor, patch version from git tag
+string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" SAPP_VERSION_MAJOR "${VCS_TAG}")
+string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" SAPP_VERSION_MINOR "${VCS_TAG}")
+string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" SAPP_VERSION_PATCH "${VCS_TAG}")
+
+if(NOT SAPP_VERSION_MAJOR)
+ set(SAPP_VERSION_MAJOR 3)
+endif()
+
+if(NOT SAPP_VERSION_MINOR)
+ set(SAPP_VERSION_MINOR 0)
+endif()
+
+if(NOT SAPP_VERSION_PATCH)
+ set(SAPP_VERSION_PATCH 0)
+endif()
+
+set(SAPP_VERSION "${SAPP_VERSION_MAJOR}.${SAPP_VERSION_MINOR}.${SAPP_VERSION_PATCH}")
+set(SAPP_VERSION_BUILD "${VCS_SHORT_HASH}")
+
+# print information
+message(STATUS "Sapp Version: ${SAPP_VERSION}-${SAPP_VERSION_BUILD}")
+
+set(SAPP_GIT_VERSION
+ "${SAPP_VERSION}-${CMAKE_BUILD_TYPE}-${SAPP_VERSION_BUILD}-${VCS_BRANCH}-${VCS_TAG}-${VCS_DATE}")
+add_definitions(-DGITVER=\"${SAPP_GIT_VERSION}\")
diff --git a/dealpkt/g_device.c b/dealpkt/g_device.c
index d1f9413..4b337fc 100644
--- a/dealpkt/g_device.c
+++ b/dealpkt/g_device.c
@@ -1,504 +1,504 @@
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <pthread.h>
-#ifndef __FAVOR_BSD
-#define __FAVOR_BSD 1
-#endif
-
-#include <arpa/inet.h>
-#include <netinet/udp.h>
-#include "stream_manage.h"
-#include "logger.h"
-#include "packet_io.h"
-#include "g_device.h"
-#include "mesa_net.h"
-#include "packet_io_internal.h"
-#include "sendpacket.h"
-#include "deal_ipv4.h"
-#include "MESA_prof_load.h"
-
-extern int g_topology_mode;
-
-char pcap_gdev_card[128]; /* 2012-08-14 LiJia add, �����豸ģʽ�£������������ƣ�ͨ����sendto_gdev_cardһ�� */
-char sendto_gdev_card[128]; /* ���������豸�Ĵ���ģʽ���������ݽӿ����� */
-unsigned char sendto_gdev_card_mac[6]; /* �������ݽӿڵ�MAC��ַ */
-int sendto_gdev_card_ip = 0; /* �������ݽӿڵ�IP��ַ, ������ */
-char config_gdev_card_ip[20] = {}; /* �������ļ��ж���ķ������ݽӿ�IP�� �ӿ�û������IP��ַʱʹ�� */
-extern char g_up_dev_name[DEV_NAME_STR_LEN]; /* Ĭ�ϲ������� */
-
-#define GDEV_LOG_NAME "gdev_ip.log"
-#define GDEV_LOG_MAX_NUM (128)
-
-
-
-int GDEV_IP_NUM = 0;
-//static struct gdev_status GDEV_IP_LOG[GDEV_LOG_MAX_NUM];
-//static pthread_mutex_t GDEV_IP_LOG_MUTEX;
-//static unsigned int gdev_log_write_counter = 1; /* ���ڼ�������ij��ֵʱ��д�ļ� */
-
-
-extern char *timet_to_str(time_t timet, char *time_str, int time_str_len);
-
-extern char *timet_to_str(time_t timet, char *time_str, int time_str_len);
-extern int sendpacket_build_icmpv4_echo(u_int8_t type, u_int8_t code, u_int16_t sum,
- u_int16_t id, u_int16_t seq, u_int8_t *payload, u_int32_t payload_s, unsigned char *buf);
-extern FILE *packet_io_open_log_file(const char *log_file_name, const char *mode);
-extern int MESA_get_dev_ipv4(const char *device, int *ip_add);
-extern int MESA_get_dev_mac(const char *device, unsigned char mac[6]);
-
-/* �Ƿ�ΪIPv6˽�е�ַ */
-inline int is_private_addr_v6(struct in6_addr ip6_add)
-{
- /* Link-Local address, first 10 bits is 1111111010 */
- if((ip6_add.s6_addr[0] == 0xFE)
- && ((ip6_add.s6_addr[1] & 0xC0) == 0x80))
- {
- return 1;
- }
-
- /* Site-Local address, first 10 bits is 1111111011 */
- if((ip6_add.s6_addr[0] == 0xFE)
- && ((ip6_add.s6_addr[1]&0xC0) == 0xC0))
- {
- return 1;
- }
-
- return 0;
-}
-
-/* �Ƿ�ΪIPv6�鲥��ַ */
-inline int is_multicast_addr_v6(struct in6_addr ip6_add)
-{
- /* IPv6 multicast address first 8 bits is 11111111 */
- if(ip6_add.s6_addr[0] == 0xFF)
- {
- return 1;
- }
-
- return 0;
-}
-
-static int gdev_check_ipv6_pkt(struct mesa_ip6_hdr *a_packet)
-{
- /* 2012-11-01 add, �������豸ģʽ�£��������鲥��ַ���� */
-
-
-/*
- if(is_private_addr_v6(a_packet->ip6_dst))
- {
- return DROP;
- }
-*/
- if(is_multicast_addr_v6(a_packet->ip6_dst))
- {
- return DROP;
- }
-
- return PASS;
-}
-
-static int gdev_check_ipv4_pkt(struct mesa_ip4_hdr *a_packet)
-{
-
-/*
- if(is_private_addr_v4(ntohl(a_packet->ip_dst.s_addr)))
- {
- return DROP;
- }
-
-*/
- if(is_multicast_addr_v4(ntohl(a_packet->ip_dst.s_addr)))
- {
- return DROP;
- }
-
- return PASS;
-}
-
-int gdev_check_pkt(int addr_type, void *pkt_data)
-{
- int ret = PASS;
-
- switch(addr_type)
- {
- case __ADDR_TYPE_IP_PAIR_V4:
- ret = gdev_check_ipv4_pkt((struct mesa_ip4_hdr *)pkt_data);
- break;
-
- case __ADDR_TYPE_IP_PAIR_V6:
- ret = gdev_check_ipv6_pkt((struct mesa_ip6_hdr *)pkt_data);
- break;
-
- default:
- ret = PASS;
- break;
- }
-
- return ret;
-}
-
-/* �����豸�������ARPЭ��
- return value:
- 1: is gdev keepalive pkt;
- 0: not gdev keepalive pkt;
-*/
-static int gdev_keepalive_arp(const raw_pkt_t *raw_pkt, int thread_id, unsigned char dir,unsigned char *send_buf)
-{
- const struct mesa_ethernet_hdr *raw_eth_hdr = (struct mesa_ethernet_hdr *)raw_pkt->raw_pkt_data;
- struct mesa_arp_hdr *arp_hdr = (struct mesa_arp_hdr *)((char *)raw_eth_hdr + ETHERNET_HDR_LEN);
- struct mesa_ethernet_hdr *send_eth_hdr;
-
- /* һЩ�������� */
- if(ntohs(raw_eth_hdr->ether_type) != ETHERTYPE_ARP){
- return -1;
- }
-
- if(memcmp(&sendto_gdev_card_ip, arp_hdr->ar_tpa, sizeof(int)) != 0){
- return -1;
- }
-
- sendpacket_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, arp_hdr->ar_hln, arp_hdr->ar_pln,
- ARPOP_REPLY, (u_char *)sendto_gdev_card_mac, arp_hdr->ar_tpa,
- arp_hdr->ar_sha, arp_hdr->ar_spa,
- NULL, 0,
- send_buf + ETHERNET_HDR_LEN);
-
- send_eth_hdr = (struct mesa_ethernet_hdr * )send_buf;
- memcpy(send_eth_hdr->ether_dhost, raw_eth_hdr->ether_shost, ETHER_ADDR_LEN);
- memcpy(send_eth_hdr->ether_shost, sendto_gdev_card_mac, ETHER_ADDR_LEN);
- send_eth_hdr->ether_type = ntohs(ETHERTYPE_ARP);
-
- return sizeof(struct mesa_arp_hdr) + sizeof(struct mesa_ethernet_hdr);
-}
-
-
-/* �����豸�������ICMPЭ�� */
-#if 0 /* ����IP����ʵ�� */
-static int gdev_keepalive_icmp(const raw_pkt_t *raw_pkt, int thread_id, unsigned char dir, unsigned char *send_buf)
-{
- struct mesa_ethernet_hdr *eth_hdr = (struct mesa_ethernet_hdr *)raw_pkt->raw_pkt_data;
- struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)((char *)eth_hdr + SENDPACKET_ETH_H);
- struct mesa_icmp_echo_hdr *icmp_hdr = (struct mesa_icmp_echo_hdr *)((char *)eth_hdr + SENDPACKET_ETH_H + ip_hdr->ip_hl*4);
- unsigned char *icmp_payload;
- int icmp_payload_len;
-
- /* һЩ�������� */
- if(ntohs(eth_hdr->ether_type) != ETHERTYPE_IP){
- return -1;
- }
-
- if(ip_hdr->ip_p != IPPROTO_ICMP){
- return -1;
- }
-
- if(icmp_hdr->icmp_type != ICMP_ECHO){
- return -1;
- }
-
- if(memcmp(&ip_hdr->ip_dst.s_addr, &sendto_gdev_card_ip, sizeof(int)) != 0){
- return -1;
- }
-
- icmp_payload = (unsigned char *)icmp_hdr + sizeof(struct mesa_icmp_echo_hdr);
- icmp_payload_len = ntohs(ip_hdr->ip_len) - ip_hdr->ip_hl*4 - sizeof(struct mesa_icmp_echo_hdr);
-
-
- sendpacket_build_icmpv4_echo(ICMP_ECHOREPLY, 0, 0,
- ntohs(icmp_hdr->icd_id),
- ntohs(icmp_hdr->icd_seq),
- icmp_payload,
- icmp_payload_len,
- send_buf + SENDPACKET_ETH_H + SENDPACKET_IP_H);
-
- sendpacket_build_ipv4(icmp_payload_len + sizeof(struct mesa_icmp_echo_hdr),
- 0, 0x1234, 0, 64, IPPROTO_ICMP,
- ip_hdr->ip_dst.s_addr,
- ip_hdr->ip_src.s_addr,
- NULL, 0,
- send_buf + SENDPACKET_ETH_H);
- memcpy(send_buf + SENDPACKET_ETH_H+SENDPACKET_IP_H+sizeof(struct mesa_icmp_echo_hdr),
- icmp_payload,
- icmp_payload_len);
-
-
- sendpacket_do_checksum(send_buf + SENDPACKET_ETH_H,
- IPPROTO_IP,
- SENDPACKET_IP_H);
-
- sendpacket_do_checksum(send_buf + SENDPACKET_ETH_H,
- IPPROTO_ICMP,
- icmp_payload_len + sizeof(struct mesa_icmp_echo_hdr));
-
- return ntohs(ip_hdr->ip_len);
-}
-#endif
-
-
-
-/* ���ں������豸��������
- �������豸���ӵĽӿ�һ��û��·�ɺ�IP��ַ, ��Ҫ���ʹ�mac���ԭʼ��.
-
- return value:
- >0: is gdev keepalive pkt;
- 0: not gdev keepalive pkt;
- -1: error;
-*/
-int gdev_keepalive(const raw_pkt_t *raw_pkt, int thread_id, int pro_type, unsigned char dir)
-{
- int ret = -1;
- MESA_send_handle *snd_handle = NULL;
- //int low_layer_type;
-
- if(g_topology_mode != NET_CONN_SERIAL_GDEV){
- return 0;
- }
-
- snd_handle = packet_io_get_send_handle(thread_id);
- if(NULL == snd_handle){
- return -1;
- }
- snd_handle->send_buf = packet_io_get_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
- if(NULL == snd_handle->send_buf){
- return 0;
- }
-
- switch(pro_type)
- {
-#if 0 /* ����IP����ʵ�� */
- case GDEV_KEEPALIVE_TYPE_ICMP:
- ret = gdev_keepalive_icmp(raw_pkt, thread_id, dir, snd_handle->send_buf);
- low_layer_type = __ADDR_TYPE_IP_PAIR_V4;
- break;
-#endif
- case GDEV_KEEPALIVE_TYPE_ARP:
- ret = gdev_keepalive_arp(raw_pkt, thread_id, dir, snd_handle->send_buf);
- //low_layer_type = ADDR_TYPE_ARP;
- break;
-
-#if 0 /* ����UDP����ʵ�� */
- case GDEV_KEEPALIVE_TYPE_BFD:
- ret = gdev_keepalive_bfd(raw_pkt, thread_id, dir, snd_handle->send_buf);
- low_layer_type = __ADDR_TYPE_IP_PAIR_V4;
- break;
-#endif
- default:
- goto err;
- break;
- }
-
- if(ret < 0){
- goto err;
- }
-
- /*
- TODO:
- arpЭ���MAC��ַ����ת����ע��һ��, ԭʼ����Ŀ��MAC��ȫFF, ��Ҫ��ȷ�޸�ԴMACΪ����IP,
- ����ʹ��packet_io_sendϵ�к���,
- Ҫʹ��packet_io_send_raw()����.
- */
-
- ret = packet_io_send_raw(thread_id, (char *)snd_handle->send_buf,
- sizeof(struct mesa_arp_hdr) + sizeof(struct mesa_ethernet_hdr),
- 0);
-
- packet_io_free_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
- return ret;
-
-err:
- packet_io_free_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
- return -1;
-}
-
-#if 0
-static void gdev_status_insert(int index, unsigned char *data, char keepalive_type)
-{
- struct mesa_ethernet_hdr *eth_hdr = (struct mesa_ethernet_hdr *)data;
- struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)(data + SENDPACKET_ETH_H);
-
- GDEV_IP_LOG[index].gdev_ip = ip_hdr->ip_src.s_addr;
- memcpy(GDEV_IP_LOG[index].gdev_mac, eth_hdr->ether_shost, 6);
- GDEV_IP_LOG[index].last_time = g_CurrentTime;
-
- if(GDEV_KEEPALIVE_TYPE_ICMP == keepalive_type)
- {
- GDEV_IP_LOG[index].gdev_keepalive_str = (char *)"ICMP";
- }
- else if(GDEV_KEEPALIVE_TYPE_BFD == keepalive_type)
- {
- GDEV_IP_LOG[index].gdev_keepalive_str =(char *)"BFD";
- }
- else
- {
- GDEV_IP_LOG[index].gdev_keepalive_str =(char *) "Uknown";
- }
-
- GDEV_IP_NUM++;
-}
-
-
-
-void gdev_keepalive_log(void )
-{
- int i;
- char local_ip_str[16];
- char gdev_ip_str[16];
- char time_now_str[32];
-
- FILE *gdev_status_fp = NULL;// to do packet_io_open_log_file("gdev_keepalive.log", "w+");
- if(NULL == gdev_status_fp)
- {
- return;
- }
-
- if(0 == GDEV_IP_NUM) /* ��ǰ������ */
- {
- return;
- }
-
- fprintf(gdev_status_fp, "%-20s %-16s %-16s %-20s %-20s\n", "Last update time", "Local-ip", "Gdev-ip", "Gdev-mac", "Gdev-keepalive-type");
-
- for(i = 0; GDEV_IP_LOG[i].gdev_ip != 0 && i < GDEV_LOG_MAX_NUM; i++)
- {
- // to do timet_to_str
- //timet_to_str(GDEV_IP_LOG[i].last_time, time_now_str, 32);
- fprintf(gdev_status_fp, "%-20s ", time_now_str);
- inet_ntop(AF_INET, &sendto_gdev_card_ip, local_ip_str, 16);
- inet_ntop(AF_INET, &GDEV_IP_LOG[i].gdev_ip, gdev_ip_str, 16);
- fprintf(gdev_status_fp, "%-16s %-16s ", local_ip_str, gdev_ip_str);
- fprintf(gdev_status_fp, "%02x-%02x-%02x-%02x-%02x-%02x ",
- GDEV_IP_LOG[i].gdev_mac[0],
- GDEV_IP_LOG[i].gdev_mac[1],
- GDEV_IP_LOG[i].gdev_mac[2],
- GDEV_IP_LOG[i].gdev_mac[3],
- GDEV_IP_LOG[i].gdev_mac[4],
- GDEV_IP_LOG[i].gdev_mac[5]);
- fprintf(gdev_status_fp, "%-20s\n", GDEV_IP_LOG[i].gdev_keepalive_str);
- }
-
- return;
-}
-#endif
-
-#if 0
-static void gdev_status_update(unsigned char *data, char keepalive_type)
-{
- int i;
- struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)(data + SENDPACKET_ETH_H);
- unsigned int gdev_ip = ip_hdr->ip_src.s_addr;
-
- pthread_mutex_lock(&GDEV_IP_LOG_MUTEX);
-
- for(i = 0; i < GDEV_LOG_MAX_NUM; i++)
- {
- if(gdev_ip == GDEV_IP_LOG[i].gdev_ip) /* �Ѿ������˼�¼,����ʱ�� */
- {
- GDEV_IP_LOG[i].last_time = g_CurrentTime;
- goto exit;
- }
-
- if(0 == GDEV_IP_LOG[i].gdev_ip)
- {
- gdev_status_insert(i, data, keepalive_type);
- goto exit;
- }
- }
-
- if(GDEV_LOG_MAX_NUM == i)
- {
- //to do
- //MESA_runtime_log(RLOG_LV_INFO, "gdev_status", "Too many gdev ip!\n");
- }
-
-
-exit:
- pthread_mutex_unlock(&GDEV_IP_LOG_MUTEX);
- return;
-}
-
-
-
-/* 2012-08-03 LiJia add, ��¼����ͨ�ŵ����������豸��IP��MAC�ͱ���Э�����Ϣ��
- Bug: �������������ping���������޷�����һ̨��ͨPC���������豸��Ҳ���¼����־��.
-*/
-int gdev_log_init(void)
-{
- if(GDEV_STATUS_SWITCH)
- {
- pthread_mutex_init(&GDEV_IP_LOG_MUTEX, NULL);
- }
-
- return 0;
-}
-#endif
-
-#ifdef CAPTURE_MODE_DPDK_VXLAN
-/* ��ʱ���DPDK-RTE�޷�ʹ��ʱ, �޷���ȡmac��ַ������ */
-int dpdk_get_mac_addr(unsigned int port, uint8_t mac_addr[6]) ;
-#endif
-
-
-#if 0
-int gdev_init(void)
-{
- char gdev_ip_str[32];
- char gdev_device[128];
-
- if(g_topology_mode != NET_CONN_SERIAL_GDEV){
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/gdev.conf", (char *)"Module", (char *)"sendto_gdev_ip", gdev_ip_str, 32, (char *)"");
- MESA_load_profile_string_def((char *)"conf/gdev.conf", (char *)"Module", (char *)"sendto_gdev_card", gdev_device, 128, (char *)"");
-
- if('\0' == gdev_device[0]){
- printf("Can't get sendto_gdev_card in %s!\n", "conf/gdev.conf");
- assert(0);
- }
-
- if('\0' == gdev_ip_str[0]){
- if(MESA_get_dev_ipv4(gdev_device, &sendto_gdev_card_ip) < 0){
- printf("Can't get gdev ip in %s!\n", "conf/gdev.conf");
- assert(0);
- }
- }
-
- if(inet_pton(AF_INET, gdev_ip_str, &sendto_gdev_card_ip) <= 0){
- printf("gdev ip in %s is invalid!\n", "conf/gdev.conf");
- assert(0);
- }
-
- if(0 == sendto_gdev_card_ip){
- printf("Can't get %s ip address!\n", sendto_gdev_card);
- assert(0);
- }
-
-#if (0 == IOMODE_MARSIO)
- if(MESA_get_dev_mac(gdev_device, sendto_gdev_card_mac) < 0){
-#ifdef CAPTURE_MODE_DPDK_VXLAN
- dpdk_get_mac_addr(0, sendto_gdev_card_mac);
- if(memcmp(empty_mac_addr, sendto_gdev_card_mac, 6) == 0){
- printf("Can't get gdev interface %s MAC!\n", sendto_gdev_card);
- assert(0);
- }
-#else
- printf("Can't get gdev interface %s MAC!\n", sendto_gdev_card);
- assert(0);
-#endif
- }
-#endif
-
- if(GDEV_STATUS_SWITCH)
- {
- gdev_log_init();
- }
-
- return 0;
-}
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <pthread.h>
+#ifndef __FAVOR_BSD
+#define __FAVOR_BSD 1
+#endif
+
+#include <arpa/inet.h>
+#include <netinet/udp.h>
+#include "stream_manage.h"
+#include "logger.h"
+#include "packet_io.h"
+#include "g_device.h"
+#include "mesa_net.h"
+#include "packet_io_internal.h"
+#include "sendpacket.h"
+#include "deal_ipv4.h"
+#include "MESA_prof_load.h"
+
+extern int g_topology_mode;
+
+char pcap_gdev_card[128]; /* 2012-08-14 LiJia add, �����豸ģʽ�£������������ƣ�ͨ����sendto_gdev_cardһ�� */
+char sendto_gdev_card[128]; /* ���������豸�Ĵ���ģʽ���������ݽӿ����� */
+unsigned char sendto_gdev_card_mac[6]; /* �������ݽӿڵ�MAC��ַ */
+int sendto_gdev_card_ip = 0; /* �������ݽӿڵ�IP��ַ, ������ */
+char config_gdev_card_ip[20] = {}; /* �������ļ��ж���ķ������ݽӿ�IP�� �ӿ�û������IP��ַʱʹ�� */
+extern char g_up_dev_name[DEV_NAME_STR_LEN]; /* Ĭ�ϲ������� */
+
+#define GDEV_LOG_NAME "gdev_ip.log"
+#define GDEV_LOG_MAX_NUM (128)
+
+
+
+int GDEV_IP_NUM = 0;
+//static struct gdev_status GDEV_IP_LOG[GDEV_LOG_MAX_NUM];
+//static pthread_mutex_t GDEV_IP_LOG_MUTEX;
+//static unsigned int gdev_log_write_counter = 1; /* ���ڼ�������ij��ֵʱ��д�ļ� */
+
+
+extern char *timet_to_str(time_t timet, char *time_str, int time_str_len);
+
+extern char *timet_to_str(time_t timet, char *time_str, int time_str_len);
+extern int sendpacket_build_icmpv4_echo(u_int8_t type, u_int8_t code, u_int16_t sum,
+ u_int16_t id, u_int16_t seq, u_int8_t *payload, u_int32_t payload_s, unsigned char *buf);
+extern FILE *packet_io_open_log_file(const char *log_file_name, const char *mode);
+extern int MESA_get_dev_ipv4(const char *device, int *ip_add);
+extern int MESA_get_dev_mac(const char *device, unsigned char mac[6]);
+
+/* �Ƿ�ΪIPv6˽�е�ַ */
+inline int is_private_addr_v6(struct in6_addr ip6_add)
+{
+ /* Link-Local address, first 10 bits is 1111111010 */
+ if((ip6_add.s6_addr[0] == 0xFE)
+ && ((ip6_add.s6_addr[1] & 0xC0) == 0x80))
+ {
+ return 1;
+ }
+
+ /* Site-Local address, first 10 bits is 1111111011 */
+ if((ip6_add.s6_addr[0] == 0xFE)
+ && ((ip6_add.s6_addr[1]&0xC0) == 0xC0))
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* �Ƿ�ΪIPv6�鲥��ַ */
+int is_multicast_addr_v6(struct in6_addr ip6_add)
+{
+ /* IPv6 multicast address first 8 bits is 11111111 */
+ if(ip6_add.s6_addr[0] == 0xFF)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int gdev_check_ipv6_pkt(struct mesa_ip6_hdr *a_packet)
+{
+ /* 2012-11-01 add, �������豸ģʽ�£��������鲥��ַ���� */
+
+
+/*
+ if(is_private_addr_v6(a_packet->ip6_dst))
+ {
+ return DROP;
+ }
+*/
+ if(is_multicast_addr_v6(a_packet->ip6_dst))
+ {
+ return DROP;
+ }
+
+ return PASS;
+}
+
+static int gdev_check_ipv4_pkt(struct mesa_ip4_hdr *a_packet)
+{
+
+/*
+ if(is_private_addr_v4(ntohl(a_packet->ip_dst.s_addr)))
+ {
+ return DROP;
+ }
+
+*/
+ if(is_multicast_addr_v4(ntohl(a_packet->ip_dst.s_addr)))
+ {
+ return DROP;
+ }
+
+ return PASS;
+}
+
+int gdev_check_pkt(int addr_type, void *pkt_data)
+{
+ int ret = PASS;
+
+ switch(addr_type)
+ {
+ case __ADDR_TYPE_IP_PAIR_V4:
+ ret = gdev_check_ipv4_pkt((struct mesa_ip4_hdr *)pkt_data);
+ break;
+
+ case __ADDR_TYPE_IP_PAIR_V6:
+ ret = gdev_check_ipv6_pkt((struct mesa_ip6_hdr *)pkt_data);
+ break;
+
+ default:
+ ret = PASS;
+ break;
+ }
+
+ return ret;
+}
+
+/* �����豸�������ARPЭ��
+ return value:
+ 1: is gdev keepalive pkt;
+ 0: not gdev keepalive pkt;
+*/
+static int gdev_keepalive_arp(const raw_pkt_t *raw_pkt, int thread_id, unsigned char dir,unsigned char *send_buf)
+{
+ const struct mesa_ethernet_hdr *raw_eth_hdr = (struct mesa_ethernet_hdr *)raw_pkt->raw_pkt_data;
+ struct mesa_arp_hdr *arp_hdr = (struct mesa_arp_hdr *)((char *)raw_eth_hdr + ETHERNET_HDR_LEN);
+ struct mesa_ethernet_hdr *send_eth_hdr;
+
+ /* һЩ�������� */
+ if(ntohs(raw_eth_hdr->ether_type) != ETHERTYPE_ARP){
+ return -1;
+ }
+
+ if(memcmp(&sendto_gdev_card_ip, arp_hdr->ar_tpa, sizeof(int)) != 0){
+ return -1;
+ }
+
+ sendpacket_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, arp_hdr->ar_hln, arp_hdr->ar_pln,
+ ARPOP_REPLY, (u_char *)sendto_gdev_card_mac, arp_hdr->ar_tpa,
+ arp_hdr->ar_sha, arp_hdr->ar_spa,
+ NULL, 0,
+ send_buf + ETHERNET_HDR_LEN);
+
+ send_eth_hdr = (struct mesa_ethernet_hdr * )send_buf;
+ memcpy(send_eth_hdr->ether_dhost, raw_eth_hdr->ether_shost, ETHER_ADDR_LEN);
+ memcpy(send_eth_hdr->ether_shost, sendto_gdev_card_mac, ETHER_ADDR_LEN);
+ send_eth_hdr->ether_type = ntohs(ETHERTYPE_ARP);
+
+ return sizeof(struct mesa_arp_hdr) + sizeof(struct mesa_ethernet_hdr);
+}
+
+
+/* �����豸�������ICMPЭ�� */
+#if 0 /* ����IP����ʵ�� */
+static int gdev_keepalive_icmp(const raw_pkt_t *raw_pkt, int thread_id, unsigned char dir, unsigned char *send_buf)
+{
+ struct mesa_ethernet_hdr *eth_hdr = (struct mesa_ethernet_hdr *)raw_pkt->raw_pkt_data;
+ struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)((char *)eth_hdr + SENDPACKET_ETH_H);
+ struct mesa_icmp_echo_hdr *icmp_hdr = (struct mesa_icmp_echo_hdr *)((char *)eth_hdr + SENDPACKET_ETH_H + ip_hdr->ip_hl*4);
+ unsigned char *icmp_payload;
+ int icmp_payload_len;
+
+ /* һЩ�������� */
+ if(ntohs(eth_hdr->ether_type) != ETHERTYPE_IP){
+ return -1;
+ }
+
+ if(ip_hdr->ip_p != IPPROTO_ICMP){
+ return -1;
+ }
+
+ if(icmp_hdr->icmp_type != ICMP_ECHO){
+ return -1;
+ }
+
+ if(memcmp(&ip_hdr->ip_dst.s_addr, &sendto_gdev_card_ip, sizeof(int)) != 0){
+ return -1;
+ }
+
+ icmp_payload = (unsigned char *)icmp_hdr + sizeof(struct mesa_icmp_echo_hdr);
+ icmp_payload_len = ntohs(ip_hdr->ip_len) - ip_hdr->ip_hl*4 - sizeof(struct mesa_icmp_echo_hdr);
+
+
+ sendpacket_build_icmpv4_echo(ICMP_ECHOREPLY, 0, 0,
+ ntohs(icmp_hdr->icd_id),
+ ntohs(icmp_hdr->icd_seq),
+ icmp_payload,
+ icmp_payload_len,
+ send_buf + SENDPACKET_ETH_H + SENDPACKET_IP_H);
+
+ sendpacket_build_ipv4(icmp_payload_len + sizeof(struct mesa_icmp_echo_hdr),
+ 0, 0x1234, 0, 64, IPPROTO_ICMP,
+ ip_hdr->ip_dst.s_addr,
+ ip_hdr->ip_src.s_addr,
+ NULL, 0,
+ send_buf + SENDPACKET_ETH_H);
+ memcpy(send_buf + SENDPACKET_ETH_H+SENDPACKET_IP_H+sizeof(struct mesa_icmp_echo_hdr),
+ icmp_payload,
+ icmp_payload_len);
+
+
+ sendpacket_do_checksum(send_buf + SENDPACKET_ETH_H,
+ IPPROTO_IP,
+ SENDPACKET_IP_H);
+
+ sendpacket_do_checksum(send_buf + SENDPACKET_ETH_H,
+ IPPROTO_ICMP,
+ icmp_payload_len + sizeof(struct mesa_icmp_echo_hdr));
+
+ return ntohs(ip_hdr->ip_len);
+}
+#endif
+
+
+
+/* ���ں������豸��������
+ �������豸���ӵĽӿ�һ��û��·�ɺ�IP��ַ, ��Ҫ���ʹ�mac���ԭʼ��.
+
+ return value:
+ >0: is gdev keepalive pkt;
+ 0: not gdev keepalive pkt;
+ -1: error;
+*/
+int gdev_keepalive(const raw_pkt_t *raw_pkt, int thread_id, int pro_type, unsigned char dir)
+{
+ int ret = -1;
+ MESA_send_handle *snd_handle = NULL;
+ //int low_layer_type;
+
+ if(g_topology_mode != NET_CONN_SERIAL_GDEV){
+ return 0;
+ }
+
+ snd_handle = packet_io_get_send_handle(thread_id);
+ if(NULL == snd_handle){
+ return -1;
+ }
+ snd_handle->send_buf = packet_io_get_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
+ if(NULL == snd_handle->send_buf){
+ return 0;
+ }
+
+ switch(pro_type)
+ {
+#if 0 /* ����IP����ʵ�� */
+ case GDEV_KEEPALIVE_TYPE_ICMP:
+ ret = gdev_keepalive_icmp(raw_pkt, thread_id, dir, snd_handle->send_buf);
+ low_layer_type = __ADDR_TYPE_IP_PAIR_V4;
+ break;
+#endif
+ case GDEV_KEEPALIVE_TYPE_ARP:
+ ret = gdev_keepalive_arp(raw_pkt, thread_id, dir, snd_handle->send_buf);
+ //low_layer_type = ADDR_TYPE_ARP;
+ break;
+
+#if 0 /* ����UDP����ʵ�� */
+ case GDEV_KEEPALIVE_TYPE_BFD:
+ ret = gdev_keepalive_bfd(raw_pkt, thread_id, dir, snd_handle->send_buf);
+ low_layer_type = __ADDR_TYPE_IP_PAIR_V4;
+ break;
+#endif
+ default:
+ goto err;
+ break;
+ }
+
+ if(ret < 0){
+ goto err;
+ }
+
+ /*
+ TODO:
+ arpЭ���MAC��ַ����ת����ע��һ��, ԭʼ����Ŀ��MAC��ȫFF, ��Ҫ��ȷ�޸�ԴMACΪ����IP,
+ ����ʹ��packet_io_sendϵ�к���,
+ Ҫʹ��packet_io_send_raw()����.
+ */
+
+ ret = packet_io_send_raw(thread_id, (char *)snd_handle->send_buf,
+ sizeof(struct mesa_arp_hdr) + sizeof(struct mesa_ethernet_hdr),
+ 0);
+
+ packet_io_free_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
+ return ret;
+
+err:
+ packet_io_free_sendbuf(SEND_TYPE_LINK_INJECT, thread_id);
+ return -1;
+}
+
+#if 0
+static void gdev_status_insert(int index, unsigned char *data, char keepalive_type)
+{
+ struct mesa_ethernet_hdr *eth_hdr = (struct mesa_ethernet_hdr *)data;
+ struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)(data + SENDPACKET_ETH_H);
+
+ GDEV_IP_LOG[index].gdev_ip = ip_hdr->ip_src.s_addr;
+ memcpy(GDEV_IP_LOG[index].gdev_mac, eth_hdr->ether_shost, 6);
+ GDEV_IP_LOG[index].last_time = g_CurrentTime;
+
+ if(GDEV_KEEPALIVE_TYPE_ICMP == keepalive_type)
+ {
+ GDEV_IP_LOG[index].gdev_keepalive_str = (char *)"ICMP";
+ }
+ else if(GDEV_KEEPALIVE_TYPE_BFD == keepalive_type)
+ {
+ GDEV_IP_LOG[index].gdev_keepalive_str =(char *)"BFD";
+ }
+ else
+ {
+ GDEV_IP_LOG[index].gdev_keepalive_str =(char *) "Uknown";
+ }
+
+ GDEV_IP_NUM++;
+}
+
+
+
+void gdev_keepalive_log(void )
+{
+ int i;
+ char local_ip_str[16];
+ char gdev_ip_str[16];
+ char time_now_str[32];
+
+ FILE *gdev_status_fp = NULL;// to do packet_io_open_log_file("gdev_keepalive.log", "w+");
+ if(NULL == gdev_status_fp)
+ {
+ return;
+ }
+
+ if(0 == GDEV_IP_NUM) /* ��ǰ������ */
+ {
+ return;
+ }
+
+ fprintf(gdev_status_fp, "%-20s %-16s %-16s %-20s %-20s\n", "Last update time", "Local-ip", "Gdev-ip", "Gdev-mac", "Gdev-keepalive-type");
+
+ for(i = 0; GDEV_IP_LOG[i].gdev_ip != 0 && i < GDEV_LOG_MAX_NUM; i++)
+ {
+ // to do timet_to_str
+ //timet_to_str(GDEV_IP_LOG[i].last_time, time_now_str, 32);
+ fprintf(gdev_status_fp, "%-20s ", time_now_str);
+ inet_ntop(AF_INET, &sendto_gdev_card_ip, local_ip_str, 16);
+ inet_ntop(AF_INET, &GDEV_IP_LOG[i].gdev_ip, gdev_ip_str, 16);
+ fprintf(gdev_status_fp, "%-16s %-16s ", local_ip_str, gdev_ip_str);
+ fprintf(gdev_status_fp, "%02x-%02x-%02x-%02x-%02x-%02x ",
+ GDEV_IP_LOG[i].gdev_mac[0],
+ GDEV_IP_LOG[i].gdev_mac[1],
+ GDEV_IP_LOG[i].gdev_mac[2],
+ GDEV_IP_LOG[i].gdev_mac[3],
+ GDEV_IP_LOG[i].gdev_mac[4],
+ GDEV_IP_LOG[i].gdev_mac[5]);
+ fprintf(gdev_status_fp, "%-20s\n", GDEV_IP_LOG[i].gdev_keepalive_str);
+ }
+
+ return;
+}
+#endif
+
+#if 0
+static void gdev_status_update(unsigned char *data, char keepalive_type)
+{
+ int i;
+ struct mesa_ip4_hdr *ip_hdr = (struct mesa_ip4_hdr *)(data + SENDPACKET_ETH_H);
+ unsigned int gdev_ip = ip_hdr->ip_src.s_addr;
+
+ pthread_mutex_lock(&GDEV_IP_LOG_MUTEX);
+
+ for(i = 0; i < GDEV_LOG_MAX_NUM; i++)
+ {
+ if(gdev_ip == GDEV_IP_LOG[i].gdev_ip) /* �Ѿ������˼�¼,����ʱ�� */
+ {
+ GDEV_IP_LOG[i].last_time = g_CurrentTime;
+ goto exit;
+ }
+
+ if(0 == GDEV_IP_LOG[i].gdev_ip)
+ {
+ gdev_status_insert(i, data, keepalive_type);
+ goto exit;
+ }
+ }
+
+ if(GDEV_LOG_MAX_NUM == i)
+ {
+ //to do
+ //MESA_runtime_log(RLOG_LV_INFO, "gdev_status", "Too many gdev ip!\n");
+ }
+
+
+exit:
+ pthread_mutex_unlock(&GDEV_IP_LOG_MUTEX);
+ return;
+}
+
+
+
+/* 2012-08-03 LiJia add, ��¼����ͨ�ŵ����������豸��IP��MAC�ͱ���Э�����Ϣ��
+ Bug: �������������ping���������޷�����һ̨��ͨPC���������豸��Ҳ���¼����־��.
+*/
+int gdev_log_init(void)
+{
+ if(GDEV_STATUS_SWITCH)
+ {
+ pthread_mutex_init(&GDEV_IP_LOG_MUTEX, NULL);
+ }
+
+ return 0;
+}
+#endif
+
+#ifdef CAPTURE_MODE_DPDK_VXLAN
+/* ��ʱ���DPDK-RTE�޷�ʹ��ʱ, �޷���ȡmac��ַ������ */
+int dpdk_get_mac_addr(unsigned int port, uint8_t mac_addr[6]) ;
+#endif
+
+
+#if 0
+int gdev_init(void)
+{
+ char gdev_ip_str[32];
+ char gdev_device[128];
+
+ if(g_topology_mode != NET_CONN_SERIAL_GDEV){
+ return 0;
+ }
+
+ MESA_load_profile_string_def((char *)"conf/gdev.conf", (char *)"Module", (char *)"sendto_gdev_ip", gdev_ip_str, 32, (char *)"");
+ MESA_load_profile_string_def((char *)"conf/gdev.conf", (char *)"Module", (char *)"sendto_gdev_card", gdev_device, 128, (char *)"");
+
+ if('\0' == gdev_device[0]){
+ printf("Can't get sendto_gdev_card in %s!\n", "conf/gdev.conf");
+ assert(0);
+ }
+
+ if('\0' == gdev_ip_str[0]){
+ if(MESA_get_dev_ipv4(gdev_device, &sendto_gdev_card_ip) < 0){
+ printf("Can't get gdev ip in %s!\n", "conf/gdev.conf");
+ assert(0);
+ }
+ }
+
+ if(inet_pton(AF_INET, gdev_ip_str, &sendto_gdev_card_ip) <= 0){
+ printf("gdev ip in %s is invalid!\n", "conf/gdev.conf");
+ assert(0);
+ }
+
+ if(0 == sendto_gdev_card_ip){
+ printf("Can't get %s ip address!\n", sendto_gdev_card);
+ assert(0);
+ }
+
+#if (0 == IOMODE_MARSIO)
+ if(MESA_get_dev_mac(gdev_device, sendto_gdev_card_mac) < 0){
+#ifdef CAPTURE_MODE_DPDK_VXLAN
+ dpdk_get_mac_addr(0, sendto_gdev_card_mac);
+ if(memcmp(empty_mac_addr, sendto_gdev_card_mac, 6) == 0){
+ printf("Can't get gdev interface %s MAC!\n", sendto_gdev_card);
+ assert(0);
+ }
+#else
+ printf("Can't get gdev interface %s MAC!\n", sendto_gdev_card);
+ assert(0);
+#endif
+ }
+#endif
+
+ if(GDEV_STATUS_SWITCH)
+ {
+ gdev_log_init();
+ }
+
+ return 0;
+}
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/entry/CMakeLists.txt b/entry/CMakeLists.txt
index 92d3833..97b9faf 100644
--- a/entry/CMakeLists.txt
+++ b/entry/CMakeLists.txt
@@ -11,10 +11,21 @@ include_directories(${CMAKE_SOURCE_DIR}/packet_io)
add_executable(sapp sapp_init.c sapp_main.c sapp_global_val.c)
target_link_libraries(sapp nsl pthread dl m pcap)
-target_link_libraries(sapp MESA_handle_logger MESA_prof_load sapp_assistant gdev_assistant)
+target_link_libraries(sapp MESA_handle_logger MESA_prof_load)
-set(SAPP_MODULES -Wl,--whole-archive iknow timestamp_record dictator2 md5 symbol_check MESA_sleep MESA_socket_wrap packet_io dealpkt project plugctrl -Wl,--no-whole-archive)
-target_link_libraries(sapp ${SAPP_MODULES} ${SAPP_DEPEND_DYN_LIB})
+
+set(SAPP_MODULES iknow timestamp_record md5 symbol_check MESA_sleep MESA_socket_wrap packet_io dealpkt project plugctrl)
+if(OPT_USE_DICTATOR)
+ set(SAPP_MODULES ${SAPP_MODULES} dictator2 )
+endif()
+
+if(ENABLE_STATIC_LINK)
+ set(SAPP_MODULES ${SAPP_MODULES} sapp_assistant gdev_assistant )
+else()
+ target_link_libraries(sapp sapp_assistant gdev_assistant)
+endif()
+
+target_link_libraries(sapp -Wl,--whole-archive ${SAPP_MODULES} -Wl,--no-whole-archive ${SAPP_DEPEND_DYN_LIB})
if(CAPTURE_MODE MATCHES "PAG")
target_link_libraries(sapp pag)
@@ -34,7 +45,7 @@ endif()
# Target Install
install(TARGETS sapp DESTINATION ${CMAKE_SOURCE_DIR}/run/)
-install(FILES ${CMAKE_SOURCE_DIR}/build/inner_plug/libsapp_assistant.so DESTINATION /opt/MESA/lib)
+#install(FILES ${CMAKE_SOURCE_DIR}/build/inner_plug/libsapp_assistant.so DESTINATION /opt/MESA/lib)
#install(DIRECTORY conf/ DESTINATION ${CMAKE_SOURCE_DIR}/run/conf)
#install(DIRECTORY log/ DESTINATION ${CMAKE_SOURCE_DIR}/run/log)
diff --git a/entry/sapp_main.c b/entry/sapp_main.c
index 4f61dde..b18d7ff 100644
--- a/entry/sapp_main.c
+++ b/entry/sapp_main.c
@@ -1,125 +1,126 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <time.h>
-#include <fcntl.h>
-#include <execinfo.h>
-#include <pthread.h>
-#include "stream_internal.h"
-#include "stream_manage.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-const unsigned char MESA_art_log[] =
-{
- 0x50, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D, 0x0A, 0x20, 0x20, 0x20,
- 0x20, 0x5F, 0x5F, 0x20, 0x20, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F,
- 0x5F, 0x5F, 0x5F, 0x20, 0x5F, 0x5F, 0x5F, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x2F, 0x20, 0x20, 0x7C,
- 0x2F, 0x20, 0x20, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x5F, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x2F, 0x2F,
- 0x20, 0x20, 0x20, 0x7C, 0x0D, 0x0A, 0x20, 0x20, 0x2F, 0x20, 0x2F, 0x7C, 0x5F, 0x2F, 0x20, 0x2F,
- 0x20, 0x5F, 0x5F, 0x2F, 0x20, 0x20, 0x5C, 0x5F, 0x5F, 0x20, 0x5C, 0x2F, 0x20, 0x2F, 0x7C, 0x20,
- 0x7C, 0x0D, 0x0A, 0x20, 0x2F, 0x20, 0x2F, 0x20, 0x20, 0x2F, 0x20, 0x2F, 0x20, 0x2F, 0x5F, 0x5F,
- 0x5F, 0x20, 0x5F, 0x5F, 0x5F, 0x2F, 0x20, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x20, 0x7C, 0x0D, 0x0A,
- 0x2F, 0x5F, 0x2F, 0x20, 0x20, 0x2F, 0x5F, 0x2F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x2F ,0x2F, 0x5F,
- 0x5F, 0x5F, 0x5F, 0x2F, 0x5F, 0x2F, 0x20, 0x20, 0x7C, 0x5F, 0x7C, 0x0D, 0x0A, 0x00/* EOF */
-};
-
-int MESA_platform_init(int argc, char *argv[]);
-void MESA_platform_run(void);
-extern int sapp_args_v;
-int dpdk_init(int argc, char **argv);
-
-static void dump_backtrace(int max_depth, const char *path) {
- /*
- NOTE:
- �˴�һ��Ҫʹ��ջ����ڴ�, ����malloc���ܻ������,
- ���жϴ��������е��������ܺ����������̳߳�ͻ, ����������������!!!!
- */
- static char stack_trace[65536];
-
- int stack_depth = backtrace((void **)stack_trace, max_depth);
- int fp = open(path, O_APPEND|O_RDWR|O_CREAT, 0444);
- if(fp < 0)return;
- time_t t = time(NULL);
- char time_str[64];
- ctime_r(&t, time_str);
- const char *spilt_str = "---------------------------------------------------";
- write(fp, spilt_str, strlen(spilt_str));
- write(fp, time_str, strlen(time_str));
- backtrace_symbols_fd((void **)stack_trace, stack_depth, fp);
- close(fp);
- return;
-}
-
-static void signal_handler(int signo)
-{
- time_t last_time = time(NULL);
-
- while(time(NULL) < last_time + 10); /* wait 10 second, for DPDK IO module detect this process is not running */
- signal(signo, SIG_DFL);
- //dump_backtrace(128, "./sapp_bt.log");
- kill(getpid(), signo);
-}
-
-static void signal_take_over(void)
-{
- if(0 == sapp_global_single.signal_take_over_sw){
- return;
- }
-
- signal(SIGABRT, signal_handler);
- signal(SIGSEGV, signal_handler);
- signal(SIGBUS, signal_handler);
-}
-
-
-
-int main(int argc, char *argv[])
-{
- if((argc == 2) && (strncasecmp(argv[1], "-v", 2) == 0)){
- printf("Platform version: %d\n", sapp_args_v);
- exit(0);
- }
-
- int i;
-
- for(i = 0; (i < sizeof(MESA_art_log)) && (MESA_art_log[i] != 0); i ++){
- //putchar(MESA_log[i]);
- printf("%c", MESA_art_log[i]);
- }
- printf("\n");
- sapp_runtime_log(30, "\n\n%s", MESA_art_log);
-
-#if SAPP_INSECTICIDE
- printf("\033[33m[Warning]This sapp is a temp version for solve confounded bug!\033[0m\n");
- sleep(1);
-#endif
-
-#if COMPAT_PAPP_FOR_BENCHMARK
- printf("\033[33m[Warning]This sapp is a emasculate version for compare with papp, in other word, it's papp!\033[0m\n");
- sleep(1);
-#endif
-
- if(MESA_platform_init(argc, argv) < 0){
- exit(1);
- }
-
- signal_take_over();
-
- MESA_platform_run();
-
- return 0;
-}
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+#include <execinfo.h>
+#include <pthread.h>
+#include "stream_internal.h"
+#include "stream_manage.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const unsigned char MESA_art_log[] =
+{
+ 0x50, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x5F, 0x5F, 0x20, 0x20, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F,
+ 0x5F, 0x5F, 0x5F, 0x20, 0x5F, 0x5F, 0x5F, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x2F, 0x20, 0x20, 0x7C,
+ 0x2F, 0x20, 0x20, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x5F, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x2F, 0x2F,
+ 0x20, 0x20, 0x20, 0x7C, 0x0D, 0x0A, 0x20, 0x20, 0x2F, 0x20, 0x2F, 0x7C, 0x5F, 0x2F, 0x20, 0x2F,
+ 0x20, 0x5F, 0x5F, 0x2F, 0x20, 0x20, 0x5C, 0x5F, 0x5F, 0x20, 0x5C, 0x2F, 0x20, 0x2F, 0x7C, 0x20,
+ 0x7C, 0x0D, 0x0A, 0x20, 0x2F, 0x20, 0x2F, 0x20, 0x20, 0x2F, 0x20, 0x2F, 0x20, 0x2F, 0x5F, 0x5F,
+ 0x5F, 0x20, 0x5F, 0x5F, 0x5F, 0x2F, 0x20, 0x2F, 0x20, 0x5F, 0x5F, 0x5F, 0x20, 0x7C, 0x0D, 0x0A,
+ 0x2F, 0x5F, 0x2F, 0x20, 0x20, 0x2F, 0x5F, 0x2F, 0x5F, 0x5F, 0x5F, 0x5F, 0x5F, 0x2F ,0x2F, 0x5F,
+ 0x5F, 0x5F, 0x5F, 0x2F, 0x5F, 0x2F, 0x20, 0x20, 0x7C, 0x5F, 0x7C, 0x0D, 0x0A, 0x00/* EOF */
+};
+
+int MESA_platform_init(int argc, char *argv[]);
+void MESA_platform_run(void);
+extern int sapp_args_v;
+int dpdk_init(int argc, char **argv);
+
+static void dump_backtrace(int max_depth, const char *path) {
+ /*
+ NOTE:
+ �˴�һ��Ҫʹ��ջ����ڴ�, ����malloc���ܻ������,
+ ���жϴ��������е��������ܺ����������̳߳�ͻ, ����������������!!!!
+ */
+ static char stack_trace[65536];
+
+ int stack_depth = backtrace((void **)stack_trace, max_depth);
+ int fp = open(path, O_APPEND|O_RDWR|O_CREAT, 0444);
+ if(fp < 0)return;
+ time_t t = time(NULL);
+ char time_str[64];
+ ctime_r(&t, time_str);
+ const char *spilt_str = "---------------------------------------------------";
+ write(fp, spilt_str, strlen(spilt_str));
+ write(fp, time_str, strlen(time_str));
+ backtrace_symbols_fd((void **)stack_trace, stack_depth, fp);
+ close(fp);
+ return;
+}
+
+static void signal_handler(int signo)
+{
+ time_t last_time = time(NULL);
+
+ while(time(NULL) < last_time + 10); /* wait 10 second, for DPDK IO module detect this process is not running */
+ signal(signo, SIG_DFL);
+ //dump_backtrace(128, "./sapp_bt.log");
+ kill(getpid(), signo);
+}
+
+static void signal_take_over(void)
+{
+ if(0 == sapp_global_single.signal_take_over_sw){
+ return;
+ }
+
+ signal(SIGABRT, signal_handler);
+ signal(SIGSEGV, signal_handler);
+ signal(SIGBUS, signal_handler);
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ if((argc == 2) && (strncasecmp(argv[1], "-v", 2) == 0)){
+ const char *sapp_version = GITVER;
+ printf("Platform version: %s\n", sapp_version);
+ exit(0);
+ }
+
+ int i;
+
+ for(i = 0; (i < sizeof(MESA_art_log)) && (MESA_art_log[i] != 0); i ++){
+ //putchar(MESA_log[i]);
+ printf("%c", MESA_art_log[i]);
+ }
+ printf("\n");
+ sapp_runtime_log(30, "\n\n%s", MESA_art_log);
+
+#if SAPP_INSECTICIDE
+ printf("\033[33m[Warning]This sapp is a temp version for solve confounded bug!\033[0m\n");
+ sleep(1);
+#endif
+
+#if COMPAT_PAPP_FOR_BENCHMARK
+ printf("\033[33m[Warning]This sapp is a emasculate version for compare with papp, in other word, it's papp!\033[0m\n");
+ sleep(1);
+#endif
+
+ if(MESA_platform_init(argc, argv) < 0){
+ exit(1);
+ }
+
+ signal_take_over();
+
+ MESA_platform_run();
+
+ return 0;
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/include/support/dictator.h b/include/support/dictator.h
index 9ff4444..5a95132 100644
--- a/include/support/dictator.h
+++ b/include/support/dictator.h
@@ -21,7 +21,6 @@ void *__dictator_calloc(int t_seq,size_t nmemb, size_t size);
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
-void *calloc(size_t nmemb, size_t size);
void free(void *p);
#ifdef __cplusplus
diff --git a/support/dictator2/src/dictator.h b/support/dictator2/src/dictator.h
index 9ff4444..5a95132 100644
--- a/support/dictator2/src/dictator.h
+++ b/support/dictator2/src/dictator.h
@@ -21,7 +21,6 @@ void *__dictator_calloc(int t_seq,size_t nmemb, size_t size);
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
-void *calloc(size_t nmemb, size_t size);
void free(void *p);
#ifdef __cplusplus