diff options
| author | dump2file <[email protected]> | 2019-01-22 15:34:32 +0600 |
|---|---|---|
| committer | dump2file <[email protected]> | 2019-01-22 15:34:32 +0600 |
| commit | a01e3a716d8408bb6defd8d5ca7b80b202d4a82f (patch) | |
| tree | 2b5c4a0a55465c59911fb0388e4b2739cdab9f9d | |
| parent | 14ad4a10c2d5e17c9a3de78e0b29065aad4baa37 (diff) | |
1、同步并联版本的自动更新bversion脚本
2、修复ENABLE_STATIC_LINK开关开启后,CMake文件链接的问题
| -rw-r--r-- | CMakeLists.txt | 12 | ||||
| -rw-r--r-- | autorevision.sh | 1268 | ||||
| -rw-r--r-- | cmake/Version.cmake | 43 | ||||
| -rw-r--r-- | dealpkt/g_device.c | 1008 | ||||
| -rw-r--r-- | entry/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | entry/sapp_main.c | 251 | ||||
| -rw-r--r-- | include/support/dictator.h | 1 | ||||
| -rw-r--r-- | support/dictator2/src/dictator.h | 1 |
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 |
