From 0bccd072ef2e9aaec7af30a770231d9b3e5c2dae Mon Sep 17 00:00:00 2001 From: huangxin Date: Tue, 8 Oct 2019 09:05:52 +0800 Subject: [PATCH] =?UTF-8?q?Mod=20=20aaa-12=20=E5=A2=9E=E5=8A=A0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E3=80=81=E8=AF=A6=E7=BB=86=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20RCA=EF=BC=9A=20SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Ahuangxin=20=E6=A3=80=E8=A7=86=E4=BA=BA?= =?UTF-8?q?=EF=BC=9Ahuangxin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/common.Makefile | 1070 +++++++++-------- Product/common/common.h | 5 +- Product/user/object_manager/json_interface.c | 100 +- Product/user/object_manager/json_interface.h | 14 +- .../user/object_manager/json_test/search.json | 7 + Product/user/object_manager/main.c | 269 ++++- Product/user/object_manager/regex_table.c | 169 ++- Product/user/object_manager/regex_table.h | 1 + 8 files changed, 1034 insertions(+), 601 deletions(-) create mode 100644 Product/user/object_manager/json_test/search.json diff --git a/Common/common.Makefile b/Common/common.Makefile index 8b540e6b1..8abcd3673 100755 --- a/Common/common.Makefile +++ b/Common/common.Makefile @@ -1,533 +1,537 @@ -# 调试,打印当前 MAKE 运行环境和配置信息 -ifeq ($(SHOW_MAKE_EVENT), TRUE) -$(info MAKEFILES:$(MAKEFILES)) -$(info MAKEFILES_LIST:$(MAKEFILES_LIST)) -$(info SHELL:$(SHELL)) -$(info MAKESHELL:$(MAKESHELL)) -$(info MAKE:$(MAKE)) -$(info MAKELEVEL:$(MAKELEVEL)) -$(info MAKECMDGOALS:$(MAKECMDGOALS)) -$(info SUFFIXES:$(SUFFIXES)) -$(info LIBPATTERNS:$(.LIBPATTERNS)) -$(info Make $(TARGET_OBJ): $(CURDIR)) -endif - -# 定义 Make 解析命令的 bash -SHELL := /bin/bash - -# 构建信息开关,是否显示 gcc、ld 等命令执行的命令行消息,默认关闭 -ENABLE_MAKE_LOG ?= FALSE - -# 调试信息分离开关,默认开启 -TARGET_STRIP ?= TRUE - -ifeq ($(TARGET_TYPE), KO) -ARM64_CROSS_LD := aarch64-linux-gnu-ld -LINUX_CROSS_LD := ld -else -ARM64_CROSS_LD := $(ARM64_CROSS_CC) -LINUX_CROSS_LD := $(CC) -endif - -# 检查必要的环境变量是否设置 -ifeq ($(PLAT_ARM64), TRUE) - -# ARM64 SDK 环境变量 -ifeq ($(SDKTARGETSYSROOT), ) -$(error Unknown SDKTARGETSYSROOT environment Of [$(SDKTARGETSYSROOT)], It's must be set to current environment used ) -else -ifneq ($(SDKTARGETSYSROOT), $(wildcard $(SDKTARGETSYSROOT))) -$(error Directory $(SDKTARGETSYSROOT) not exists, Please check it first.) -endif -endif - -endif - -ifeq ($(TARGET_OBJ), DRV) - -# 华晨 ARM64 平台已经编译成功的内核路径,供编译驱动使用 -ifeq ($(HUACHENG_ARM64_KERNEL), ) -$(error Unknown HUACHENG_ARM64_KERNEL environment Of [$(HUACHENG_ARM64_KERNEL)], It's must be set to current environment used ) -else -ifneq ($(HUACHENG_ARM64_KERNEL), $(wildcard $(HUACHENG_ARM64_KERNEL))) -$(error Directory $(HUACHENG_ARM64_KERNEL) not exists, Please check it first.) -endif -endif - -# 华晨 LINUX 平台已经编译成功的内核路径,供编译驱动使用 -ifeq ($(HUACHENG_LINUX_KERNEL), ) -$(error Unknown HUACHENG_LINUX_KERNEL environment Of [$(HUACHENG_LINUX_KERNEL)], It's must be set to current environment used ) -else -ifneq ($(HUACHENG_LINUX_KERNEL), $(wildcard $(HUACHENG_LINUX_KERNEL))) -$(error Directory $(HUACHENG_LINUX_KERNEL) not exists, Please check it first.) -endif -endif - -endif - -# @符号添加在执行的命令前,则该命令不会在控制台上打印这条命令执行的信息 -ifeq ($(ENABLE_MAKE_LOG), TRUE) -MLOG := -else -MLOG ?= @ -endif - -# 判断构建模式 debug/release -ifeq ($(DEBUG), TRUE) -TARGET_OUT_DIR ?= debug/ -else -TARGET_OUT_DIR ?= release/ -endif - -# 设置安装路径的相对路径 -ifeq ($(DIR), ) -INSTALL_ROOT := $(addprefix ../,../_install/$(TARGET_OUT_DIR)) -else -INSTALL_ROOT := $(addprefix ../,$(DIR)/$(TARGET_OUT_DIR)) -endif - -# 定义常用命令 -RM = rm -rf -MKDIR = mkdir -p -CP = cp -f - -ifeq ($(findstring bash, $(SHELL)),) -ECHO_COLOR = echo -else -ECHO_COLOR = echo -e -endif - -# 根据环境变量获取内核路径 -ifeq ($(TARGET_OBJ), DRV) -ARM64_KERNEL := $(HUACHENG_ARM64_KERNEL) -LINUX_KERNEL := $(HUACHENG_LINUX_KERNEL) -endif - -# 设置 ARM64 平台 SDK 头文件和库文件路径 -ARM64_SDK_INCLUDE := $(SDKTARGETSYSROOT)/usr/include -ARM64_SDK_LIBDIR := $(SDKTARGETSYSROOT)/usr/lib - -# 设置平台安装子目录 -CPU_ARM64_DIR := ARM64 -CPU_LINUX_DIR := LINUX - -# 根据类型设置生成目标的扩展名 -ifeq ($(TARGET_TYPE), KO) -TARGET_EXT := .ko -else ifeq ($(TARGET_TYPE), DLL) -TARGET_EXT := .so -else ifeq ($(TARGET_TYPE), SDK) -TARGET_EXT := .so -else ifeq ($(TARGET_TYPE), LIB) -TARGET_EXT := .a -else ifeq ($(TARGET_TYPE), EXE) -TARGET_EXT := .exe -else ifeq ($(TARGET_TYPE), SH) -UNMAKE_PROCESS := TRUE -else -$(error Unknown TARGET_TYPE Value Of [$(TARGET_TYPE)], It's Must Be Set Of KO/EXE/DLL/LIB/SDK) -endif - -# 如果生成类型为库文件,则在生成目标的文件名前加上 lib 前缀 -ifeq ($(TARGET_TYPE), LIB) -TARGET_PREFIX := lib -else ifeq ($(TARGET_TYPE), SDK) -TARGET_PREFIX := lib -else -TARGET_PREFIX := -endif - -# 定义各个类型关键字段控制台显示颜色 -ifneq ($(MAKE_TARGET), ) -MAKECMD_COLOR := \033[36;48m\033[1m$(shell env printf "%-10s" {$(MAKE_TARGET)}) \033[0m -else -MAKECMD_COLOR := -endif - -CLEAN_COLOR := $(MAKECMD_COLOR)\033[31;48m\033[1m[CLEAN]\033[0m -PATH_COLOR := \033[34;48m\033[1m($(CURDIR))\033[0m -INSTALL_PATH_COLOR := \033[34;48m\033[1m(TO $(INSTALL_ROOT))\033[0m -INSTALL_COLOR := \033[36;48m\033[1m[INSTALL]\033[0m -PRE_INSTALL_COLOR := \033[36;48m\033[1m[PRE INSTALL]\033[0m -INSTALL_USER_ITEM_COLOR := \033[36;48m\033[1m[INSTALL USER ITEMS]\033[0m -INSTALL_MULT_PLAT_COLOR := \033[36;48m\033[1m[INSTALL MULTPLATFORM ITEMS]\033[0m -INSTALL_IDK_ITEM_COLOR := \033[36;48m\033[1m[INSTALL IDK ITEMS]\033[0m - - -TARGET_TYPE_COLOR := \t\033[35;48m\033[1m$(shell env printf "%5s" [$(TARGET_TYPE)])\033[0m -TARGET_OBJ_COLOR := \t\033[34;48m\033[1m$(shell env printf "%5s" [$(TARGET_OBJ)])\033[0m -TARGET_MIX_COLOR := $(TARGET_TYPE_COLOR)$(TARGET_OBJ_COLOR) -PLAT_ARM64_COLOR := $(MAKECMD_COLOR)\033[32;48m\033[1m$(shell env printf "%-8s" [ARM64])\033[0m$(TARGET_MIX_COLOR) -PLAT_LINUX_COLOR := $(MAKECMD_COLOR)\033[32;48m\033[1m$(shell env printf "%-8s" [LINUX])\033[0m$(TARGET_MIX_COLOR) - -# debug 模式 gcc 以 g3 参数添加调试信息 -ifeq ($(DEBUG), TRUE) -DEBUG_CFLAGS := -g3 -endif - -# 设置 gcc 编译优化等级参数 -#DEBUG_CFLAGS += -O2 - -LINUX_EXTFLAG += $(DEBUG_CFLAGS) - -# 如果视编译警告为错误,开启此开关 -ifeq ($(DISABLE_WARRING), TRUE) -LINUX_EXTFLAG += -w -endif - -TARGET_BOX ?= $(TARGET_NAME) - -# 设置编译参数 -ifeq ($(TARGET_OBJ), DRV) - -ifeq ($(PLAT_LINUX), TRUE) -LINUX_SYSTEM = $(shell $(CC) -print-file-name=include) -endif - -ifeq ($(PLAT_ARM64), TRUE) -ARM64_SYSTEM = $(shell $(ARM64_CROSS_CC) -print-file-name=include) -endif - -# linux 内核模块编译参数,提取自 x86 模块编译命令行 -LINUX_DRV_CFLAGS := -nostdinc -isystem $(LINUX_SYSTEM) \ - -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \ - -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security \ - -std=gnu89 -fno-PIE -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -falign-jumps=1 \ - -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup \ - -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args \ - -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 \ - -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 \ - -DCONFIG_AS_AVX512=1 -DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -pipe -Wno-sign-compare \ - -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register \ - -DRETPOLINE -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation \ - -Wno-format-overflow -Wno-int-in-bool-context -Wno-attribute-alias \ - --param=allow-store-data-races=0 -DCC_HAVE_ASM_GOTO -Wframe-larger-than=1024 \ - -fstack-protector-strong -Wno-unused-but-set-variable -Wno-unused-const-variable \ - -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments \ - -g -gdwarf-4 -pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign \ - -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack \ - -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types \ - -DMODULE -DKBUILD_BASENAME='"$(TARGET_NAME).mod"' -DKBUILD_MODNAME='"$(TARGET_NAME)"' - -LINUX_EXTFLAG += $(DEBUG_CFLAGS) $(LINUX_DRV_CFLAGS) \ - -I$(LINUX_KERNEL)/arch/x86/include \ - -I$(LINUX_KERNEL)/arch/x86/include/generated/uapi \ - -I$(LINUX_KERNEL)/arch/x86/include/generated \ - -I$(LINUX_KERNEL)/include -I$(LINUX_KERNEL)/arch/x86/include/uapi \ - -I$(LINUX_KERNEL)/include/uapi \ - -I$(LINUX_KERNEL)/include/generated/uapi \ - -include $(LINUX_KERNEL)/include/linux/kconfig.h - -# ARM64 linux 内核模块编译参数,提取自 arm 模块编译命令行 -ARM64_DRV_CFLAGS := -nostdinc -isystem $(ARM64_SYSTEM) -mabi=lp64 -Werror=designated-init \ - -D__KERNEL__ -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \ - -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 \ - -fno-PIE -mgeneral-regs-only -DCONFIG_AS_LSE=1 -fno-asynchronous-unwind-tables -mpc-relative-literal-loads \ - -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow \ - -Wno-int-in-bool-context -O2 --param=allow-store-data-races=0 -DCC_HAVE_ASM_GOTO -Wframe-larger-than=2048 \ - -fno-stack-protector -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-omit-frame-pointer \ - -fno-optimize-sibling-calls -fno-var-tracking-assignments -g -Wdeclaration-after-statement -Wno-pointer-sign \ - -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack \ - -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types \ - -DKBUILD_BASENAME='"$(TARGET_NAME).mod"' -DKBUILD_MODNAME='"$(TARGET_NAME)"' -DMODULE -mcmodel=large - -ARM64_EXTFLAG += $(DEBUG_CFLAGS) $(ARM64_DRV_CFLAGS) \ - -I$(ARM64_KERNEL)/arch/arm64/include \ - -I$(ARM64_KERNEL)/arch/arm64/include/generated/uapi \ - -I$(ARM64_KERNEL)/arch/arm64/include/generated \ - -I$(ARM64_KERNEL)/include \ - -I$(ARM64_KERNEL)/arch/arm64/include/uapi \ - -I$(ARM64_KERNEL)/include/uapi \ - -I$(ARM64_KERNEL)/include/generated/uapi \ - -include $(ARM64_KERNEL)/include/linux/kconfig.h - -# x86 Linux 内核模块链接参数,提取自 x86 模块连接命令行 -LINUX_DRV_LDFLAGS = -r -m elf_x86_64 -z max-page-size=0x200000 -T $(LINUX_KERNEL)/scripts/module-common.lds --build-id -# arm64 Linux 内核模块链接参数,提取自 arm64 模块连接命令行 -ARM64_DRV_LDFLAGS = -EL -r -maarch64linux -T $(ARM64_KERNEL)/scripts/module-common.lds --build-id -else ifeq ($(TARGET_OBJ), APP) -# 用户态模块编译参数 -ARM64_EXTFLAG += $(DEBUG_CFLAGS) -I$(ARM64_SDK_INCLUDE) - -# show all warring -CFLAGS += -Wall - -# 设置 ARM64 交叉编译链接目录 -ARM64_DRV_LDFLAGS := --sysroot=${SDKTARGETSYSROOT} -else ifeq ($(TARGET_OBJ), SH) -else -$(error Unknown TARGET_OBJ Value Of [$(TARGET_OBJ)], It's Must Be Set Of APP/DRV) -endif - -# 根据 debug/release 模式设置目录名称 -ifeq ($(DEBUG), TRUE) -BUILD_DIR := debug -else -BUILD_DIR := release -endif - -# 编译生成中间文件存放临时子目录 -OUTPUT_DIR := ./.build/ - -# 编译中间文件存放相对路径 -ARM64_DIR := $(OUTPUT_DIR)$(TARGET_NAME)_$(TARGET_TYPE)_$(TARGET_OBJ)_arm64_$(BUILD_DIR) -LINUX_DIR := $(OUTPUT_DIR)$(TARGET_NAME)_$(TARGET_TYPE)_$(TARGET_OBJ)_linux_$(BUILD_DIR) - -# 设置安装路径 -ifeq ($(TARGET_TYPE), SDK) -LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/sdk/$(CPU_LINUX_DIR)/ -PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/sdk.debug/$(CPU_LINUX_DIR)/ -else -ifeq ($(TARGET_BOX), ) -ARM64_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_ARM64_DIR)/$(TARGET_BOX)/ - -ifeq ($(LINUX_USER_INS_DIR), ) -LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ -else -LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR)/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ -endif - -ARM64_PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_ARM64_DIR)/$(TARGET_BOX)/ - -ifeq ($(LINUX_USER_INS_DIR), ) -PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ -else -PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR).debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ -endif - -else -ARM64_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_ARM64_DIR)/$(TARGET_BOX)-arm64/ - -ifeq ($(LINUX_USER_INS_DIR), ) -LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ -else -LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR)/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ -endif -ARM64_PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_ARM64_DIR)/$(TARGET_BOX)-arm64/ - -ifeq ($(LINUX_USER_INS_DIR), ) -PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ -else -PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR).debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ -endif -endif - -endif - -# 定义编译目标 -BUILD_TARGET := - -ifneq ($(UNMAKE_PROCESS), TRUE) - -# 定义最终生成目标文件名 -ARM64_TARGET := $(TARGET_PREFIX)$(TARGET_NAME)-$(ARM64_OBJ_TARGET)$(TARGET_EXT) -LINUX_TARGET := $(TARGET_PREFIX)$(TARGET_NAME)-$(LINUX_OBJ_TARGET)$(TARGET_EXT) - -# ARM64 平台生成目标、编译参数、链接参数、依赖库 -ifeq ($(PLAT_ARM64), TRUE) - BUILD_TARGET += $(ARM64_TARGET) - ARM64_CFLAGS := $(PLAT_ARM64_CFLAGS) -DPLATFORM_ARM64 $(ARM64_EXTFLAG) - ARM64_LDFLAGS := $(PLAT_ARM64_LDFLAGS) $(ARM64_DRV_LDFLAGS) -L ./debug - ARM64_LIBFLAGS := $(PLAT_ARM64_LIBFLAGS) - ARM64_LIBS := $(PLAT_ARM64_LIBS) -endif - -# ARM64 平台生成目标、编译参数、链接参数、依赖库 -ifeq ($(PLAT_LINUX), TRUE) - BUILD_TARGET += $(LINUX_TARGET) - LINUX_CFLAGS := $(PLAT_LINUX_CFLAGS) -DPLATFORM_LINUX $(LINUX_EXTFLAG) - LINUX_LDFLAGS := $(PLAT_LINUX_LDFLAGS) $(LINUX_DRV_LDFLAGS) -L ./debug - LINUX_LIBFLAGS := $(PLAT_LINUX_LIBFLAGS) - LINUX_LIBS := $(PLAT_LINUX_LIBS) -endif - -# 根据源文件推算出生成目标的依赖项 -ifeq ($(PLAT_ARM64), TRUE) -PLAT_ARM64_OBJS := $(PLAT_ARM64_SRCS:%.c=$(ARM64_DIR)/%.o) -PLAT_ARM64_OBJS += $(PLAT_ARM64_AS_SRCS:%.s=$(ARM64_DIR)/%.o) -PLAT_ARM64_DEPS := $(PLAT_ARM64_SRCS:%.c=$(ARM64_DIR)/%.d) -else -PLAT_ARM64_OBJS := -PLAT_ARM64_DEPS := -endif - -ifeq ($(PLAT_LINUX), TRUE) -PLAT_LINUX_OBJS := $(PLAT_LINUX_SRCS:%.c=$(LINUX_DIR)/%.o) -PLAT_LINUX_OBJS += $(PLAT_LINUX_AS_SRCS:%.s=$(LINUX_DIR)/%.o) -PLAT_LINUX_DEPS := $(PLAT_LINUX_SRCS:%.c=$(LINUX_DIR)/%.d) -else -PLAT_LINUX_OBJS := -PLAT_LINUX_DEPS := -endif - -# 构建系统最终需要生成的目标,包含 ARM64 和 Linux 平台 -ALL_OBJS += $(PLAT_ARM64_OBJS) $(PLAT_LINUX_OBJS) -ALL_DEPS += $(PLAT_ARM64_DEPS) $(PLAT_LINUX_DEPS) - -ifneq ($(MAKECMDGOALS), clean) -ifneq ($(MAKECMDGOALS), cleanall) -ifneq ($(strip $(ALL_DEPS)),) --include $(ALL_DEPS) -endif -endif -endif -# ifneq $(UNMAKE_PROCESS) -endif - -ifeq ($(UNMAKE_PROCESS), TRUE) -BUILD_TARGET := -endif - -ifneq ($(OPT), clean) -ifneq ($(OPT), install) -ifneq ($(MAKECMDGOALS), clean) -ifneq ($(MAKECMDGOALS), cleanall) -ifeq ($(MAKE_TARGET), ) -$(info ---------------------------------------------------------------------) -$(info | CPU | TYPE | OBJECT | Command | Source/Target |) -$(info ---------------------------------------------------------------------) -else -$(info ------------------------------------------------------------------------------) -$(info | Name | CPU | TYPE | OBJECT | Command | Source |) -$(info ------------------------------------------------------------------------------) -endif -endif -endif -endif -endif - -.PHONY : all -all: $(BUILD_TARGET) -# Build ARM64 -ifeq ($(PLAT_ARM64), TRUE) -$(ARM64_TARGET): $(PLAT_ARM64_OBJS) -# 创建构建需要的目录结构 - -@test -d $(TARGET_OUT_DIR) || $(MKDIR) $(TARGET_OUT_DIR) -ifeq ($(TARGET_TYPE), LIB) -# 打包生成库文件 - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) AR $@" - $(MLOG)$(ARM64_CROSS_AR) $(ARM64_LIBFLAGS) $(TARGET_OUT_DIR)$@ $+ $(ARM64_LIBS) -else -# 链接生成可执行文件 - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) LD $@" - $(MLOG)$(ARM64_CROSS_LD) -o $(TARGET_OUT_DIR)$@ $(ARM64_LDFLAGS) $+ $(ARM64_LIBS) -ifeq ($(TARGET_STRIP), TRUE) -# 将目标的调试信息复制到另外一个新文件中 - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) OBJCOPY $@.debug" - $(MLOG)$(ARM64_CROSS_OBJCOPY) --only-keep-debug $(TARGET_OUT_DIR)$@ $(TARGET_OUT_DIR)/$@.debug -# 清理掉目标中的调试信息 - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) STRIP $@" - $(MLOG)$(ARM64_CROSS_STRIP) -g $(TARGET_OUT_DIR)$@ -# 建立目标文件和调试信息文件的管理,供 gdb 自动识别 - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) OBJCOPY $@" - $(MLOG)$(ARM64_CROSS_OBJCOPY) --add-gnu-debuglink=$(TARGET_OUT_DIR)$@.debug $(TARGET_OUT_DIR)$@ -endif -endif -# C 源文件编译规则 -$(ARM64_DIR)/%.o : %.c - -@test -d $(dir $@) || $(MKDIR) $(dir $@) - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) CC $<" - $(MLOG)$(ARM64_CROSS_CC) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" $(ARM64_CFLAGS) -o $@ -c $< - -# 汇编文件编译规则 -$(ARM64_DIR)/%.o : %.s - @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) CC $<" - $(MLOG)$(ARM64_CROSS_CC) -c $< -o $@ -endif - -# Build LINUX Board -ifeq ($(PLAT_LINUX), TRUE) -$(LINUX_TARGET): $(PLAT_LINUX_OBJS) - -@test -d $(TARGET_OUT_DIR) || $(MKDIR) $(TARGET_OUT_DIR) - -ifeq ($(TARGET_TYPE), LIB) -# 打包生成库文件 - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) AR $@" - $(MLOG)$(AR) $(LINUX_LIBFLAGS) $(TARGET_OUT_DIR)$@ $+ $(LINUX_LIBS) -else -# 链接生成可执行文件 - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) LD $@" - $(MLOG)$(LINUX_CROSS_LD) -o $(TARGET_OUT_DIR)$@ $(LINUX_LDFLAGS) $+ $(LINUX_LIBS) -ifeq ($(TARGET_STRIP), TRUE) -# 将目标的调试信息复制到另外一个新文件中 - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) OBJCOPY $@.debug" - $(MLOG)$(OBJCOPY) --only-keep-debug $(TARGET_OUT_DIR)$@ $(TARGET_OUT_DIR)$@.debug -# 清理掉目标中的调试信息 - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) STRIP $@" - $(MLOG)$(STRIP) -g $(TARGET_OUT_DIR)$@ -# 建立目标文件和调试信息文件的管理,供 gdb 自动识别 - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) OBJCOPY $@" - $(MLOG)$(OBJCOPY) --add-gnu-debuglink=$(TARGET_OUT_DIR)$@.debug $(TARGET_OUT_DIR)$@ -endif -endif - -# C 源文件编译规则 -$(LINUX_DIR)/%.o : %.c - -@test -d $(dir $@) || $(MKDIR) $(dir $@) - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) CC $<" - $(MLOG)$(CC) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" $(LINUX_CFLAGS) -o $@ -c $< - -# 汇编文件编译规则 -$(LINUX_DIR)/%.o : %.s - @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) CC $<" - $(MLOG)$(CC) -c $< -o $@ -endif - -# 安装功能 -.PHONY : install -install: -ifeq ($(INSTALL_ROOT), ) - $(error usage: make install DIR=) -endif - -ifneq ($(PLAT_ARM64_DONT_INSTALL), TRUE) -# ARM64 targets install -ifeq ($(PLAT_ARM64), TRUE) - -@test -d $(ARM64_PUBLISH_DIR) || $(MKDIR) $(ARM64_PUBLISH_DIR) - -@test -d $(ARM64_PUBLISH_DEBUG_DIR) || $(MKDIR) $(ARM64_PUBLISH_DEBUG_DIR) -ifneq ($(UNMAKE_PROCESS), TRUE) - @$(ECHO_COLOR) "$(INSTALL_COLOR) $(PLAT_ARM64_COLOR) $(TARGET_OUT_DIR)$(ARM64_TARGET) $(ARM64_TARGET).debug $(INSTALL_PATH_COLOR)" - @$(CP) $(TARGET_OUT_DIR)/$(ARM64_TARGET) $(ARM64_PUBLISH_DIR) - @$(CP) $(TARGET_OUT_DIR)/$(ARM64_TARGET).debug $(ARM64_PUBLISH_DEBUG_DIR) -endif -ifneq ($(PLAT_ARM64_USER_INS_ITEMS), ) - @$(ECHO_COLOR) "$(INSTALL_USER_ITEM_COLOR) $(PLAT_ARM64_COLOR) $(notdir $(PLAT_ARM64_USER_INS_ITEMS)) $(INSTALL_PATH_COLOR)" - @$(CP) $(PLAT_ARM64_USER_INS_ITEMS) $(ARM64_PUBLISH_DIR) -endif -endif -endif - -ifneq ($(PLAT_LINUX_DONT_INSTALL), TRUE) -# LINUX board targets install -ifeq ($(PLAT_LINUX), TRUE) - -@test -d $(LINUX_PUBLISH_DIR) || $(MKDIR) $(LINUX_PUBLISH_DIR) - -@test -d $(PUBLISH_DEBUG_DIR) || $(MKDIR) $(PUBLISH_DEBUG_DIR) -ifneq ($(UNMAKE_PROCESS), TRUE) - @$(ECHO_COLOR) "$(INSTALL_COLOR) $(PLAT_LINUX_COLOR) $(TARGET_OUT_DIR)$(LINUX_TARGET) $(LINUX_TARGET).debug $(INSTALL_PATH_COLOR)" - @$(CP) $(TARGET_OUT_DIR)/$(LINUX_TARGET) $(LINUX_PUBLISH_DIR) - @$(CP) $(TARGET_OUT_DIR)/$(LINUX_TARGET).debug $(PUBLISH_DEBUG_DIR) -endif -ifneq ($(PLAT_LINUX_USER_INS_ITEMS), ) - @$(ECHO_COLOR) "$(INSTALL_USER_ITEM_COLOR) $(PLAT_LINUX_COLOR) $(notdir $(PLAT_LINUX_USER_INS_ITEMS)) $(INSTALL_PATH_COLOR)" - @$(CP) $(PLAT_LINUX_USER_INS_ITEMS) $(LINUX_PUBLISH_DIR) -endif -ifneq ($(USER_MULTILE_PLATFORM_HEAD_ITEMS), ) - @$(ECHO_COLOR) "$(INSTALL_MULT_PLAT_COLOR) $(PLAT_LINUX_COLOR) $(notdir $(USER_MULTILE_PLATFORM_HEAD_ITEMS)) $(INSTALL_PATH_COLOR)" - @$(CP) $(USER_MULTILE_PLATFORM_HEAD_ITEMS) $(SDK_HEADFILE_PUBLIST_DIR) -endif -endif -endif - -# end of ($(DONT_INSTALL), TRUE) - -# 清理功能 -.PHONY : cleanall -cleanall: - @$(ECHO_COLOR) "$(CLEAN_COLOR) $(PATH_COLOR) $(OUTPUT_DIR) $(BUILD_TARGET) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) $(TARGET_OUT_DIR) *.debug" - @-$(RM) $(TARGET_OUT_DIR) $(OUTPUT_DIR) $(BUILD_TARGET) $(notdir $(DEPEND_LIB)) $(USER_CLEAN_ITEMS) *.debug - -.PHONY : clean -clean: - @$(ECHO_COLOR) "$(CLEAN_COLOR) $(PATH_COLOR) $(ALL_OBJS) $(BUILD_TARGET) $(ALL_DEPS) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) $(TARGET_OUT_DIR) *.debug" - @-$(RM) $(TARGET_OUT_DIR) $(ALL_OBJS) $(BUILD_TARGET) $(ALL_DEPS) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) *.debug - +# 调试,打印当前 MAKE 运行环境和配置信息 +ifeq ($(SHOW_MAKE_EVENT), TRUE) +$(info MAKEFILES:$(MAKEFILES)) +$(info MAKEFILES_LIST:$(MAKEFILES_LIST)) +$(info SHELL:$(SHELL)) +$(info MAKESHELL:$(MAKESHELL)) +$(info MAKE:$(MAKE)) +$(info MAKELEVEL:$(MAKELEVEL)) +$(info MAKECMDGOALS:$(MAKECMDGOALS)) +$(info SUFFIXES:$(SUFFIXES)) +$(info LIBPATTERNS:$(.LIBPATTERNS)) +$(info Make $(TARGET_OBJ): $(CURDIR)) +endif + +# 定义 Make 解析命令的 bash +SHELL := /bin/bash + +PLAT_ARM64 = FALSE + +# 构建信息开关,是否显示 gcc、ld 等命令执行的命令行消息,默认关闭 +ENABLE_MAKE_LOG ?= FALSE + +# 调试信息分离开关,默认开启 +TARGET_STRIP ?= TRUE + +ifeq ($(TARGET_TYPE), KO) +ARM64_CROSS_LD := aarch64-linux-gnu-ld +LINUX_CROSS_LD := ld +else +ARM64_CROSS_LD := $(ARM64_CROSS_CC) +LINUX_CROSS_LD := $(CC) +endif + +# 检查必要的环境变量是否设置 +ifeq ($(PLAT_ARM64), TRUE) + +# ARM64 SDK 环境变量 +ifeq ($(SDKTARGETSYSROOT), ) +$(error Unknown SDKTARGETSYSROOT environment Of [$(SDKTARGETSYSROOT)], It's must be set to current environment used ) +else +ifneq ($(SDKTARGETSYSROOT), $(wildcard $(SDKTARGETSYSROOT))) +$(error Directory $(SDKTARGETSYSROOT) not exists, Please check it first.) +endif +endif + +endif + +ifeq ($(TARGET_OBJ), DRV) + +ifeq ($(PLAT_ARM64), TRUE) +# 华晨 ARM64 平台已经编译成功的内核路径,供编译驱动使用 +ifeq ($(HUACHENG_ARM64_KERNEL), ) +$(error Unknown HUACHENG_ARM64_KERNEL environment Of [$(HUACHENG_ARM64_KERNEL)], It's must be set to current environment used ) +else +ifneq ($(HUACHENG_ARM64_KERNEL), $(wildcard $(HUACHENG_ARM64_KERNEL))) +$(error Directory $(HUACHENG_ARM64_KERNEL) not exists, Please check it first.) +endif +endif +endif + +# 华晨 LINUX 平台已经编译成功的内核路径,供编译驱动使用 +ifeq ($(HUACHENG_LINUX_KERNEL), ) +$(error Unknown HUACHENG_LINUX_KERNEL environment Of [$(HUACHENG_LINUX_KERNEL)], It's must be set to current environment used ) +else +ifneq ($(HUACHENG_LINUX_KERNEL), $(wildcard $(HUACHENG_LINUX_KERNEL))) +$(error Directory $(HUACHENG_LINUX_KERNEL) not exists, Please check it first.) +endif +endif + +endif + +# @符号添加在执行的命令前,则该命令不会在控制台上打印这条命令执行的信息 +ifeq ($(ENABLE_MAKE_LOG), TRUE) +MLOG := +else +MLOG ?= @ +endif + +# 判断构建模式 debug/release +ifeq ($(DEBUG), TRUE) +TARGET_OUT_DIR ?= debug/ +else +TARGET_OUT_DIR ?= release/ +endif + +# 设置安装路径的相对路径 +ifeq ($(DIR), ) +INSTALL_ROOT := $(addprefix ../,../_install/$(TARGET_OUT_DIR)) +else +INSTALL_ROOT := $(addprefix ../,$(DIR)/$(TARGET_OUT_DIR)) +endif + +# 定义常用命令 +RM = rm -rf +MKDIR = mkdir -p +CP = cp -f + +ifeq ($(findstring bash, $(SHELL)),) +ECHO_COLOR = echo +else +ECHO_COLOR = echo -e +endif + +# 根据环境变量获取内核路径 +ifeq ($(TARGET_OBJ), DRV) +ARM64_KERNEL := $(HUACHENG_ARM64_KERNEL) +LINUX_KERNEL := $(HUACHENG_LINUX_KERNEL) +endif + +# 设置 ARM64 平台 SDK 头文件和库文件路径 +ARM64_SDK_INCLUDE := $(SDKTARGETSYSROOT)/usr/include +ARM64_SDK_LIBDIR := $(SDKTARGETSYSROOT)/usr/lib + +# 设置平台安装子目录 +CPU_ARM64_DIR := ARM64 +CPU_LINUX_DIR := LINUX + +# 根据类型设置生成目标的扩展名 +ifeq ($(TARGET_TYPE), KO) +TARGET_EXT := .ko +else ifeq ($(TARGET_TYPE), DLL) +TARGET_EXT := .so +else ifeq ($(TARGET_TYPE), SDK) +TARGET_EXT := .so +else ifeq ($(TARGET_TYPE), LIB) +TARGET_EXT := .a +else ifeq ($(TARGET_TYPE), EXE) +TARGET_EXT := .exe +else ifeq ($(TARGET_TYPE), SH) +UNMAKE_PROCESS := TRUE +else +$(error Unknown TARGET_TYPE Value Of [$(TARGET_TYPE)], It's Must Be Set Of KO/EXE/DLL/LIB/SDK) +endif + +# 如果生成类型为库文件,则在生成目标的文件名前加上 lib 前缀 +ifeq ($(TARGET_TYPE), LIB) +TARGET_PREFIX := lib +else ifeq ($(TARGET_TYPE), SDK) +TARGET_PREFIX := lib +else +TARGET_PREFIX := +endif + +# 定义各个类型关键字段控制台显示颜色 +ifneq ($(MAKE_TARGET), ) +MAKECMD_COLOR := \033[36;48m\033[1m$(shell env printf "%-10s" {$(MAKE_TARGET)}) \033[0m +else +MAKECMD_COLOR := +endif + +CLEAN_COLOR := $(MAKECMD_COLOR)\033[31;48m\033[1m[CLEAN]\033[0m +PATH_COLOR := \033[34;48m\033[1m($(CURDIR))\033[0m +INSTALL_PATH_COLOR := \033[34;48m\033[1m(TO $(INSTALL_ROOT))\033[0m +INSTALL_COLOR := \033[36;48m\033[1m[INSTALL]\033[0m +PRE_INSTALL_COLOR := \033[36;48m\033[1m[PRE INSTALL]\033[0m +INSTALL_USER_ITEM_COLOR := \033[36;48m\033[1m[INSTALL USER ITEMS]\033[0m +INSTALL_MULT_PLAT_COLOR := \033[36;48m\033[1m[INSTALL MULTPLATFORM ITEMS]\033[0m +INSTALL_IDK_ITEM_COLOR := \033[36;48m\033[1m[INSTALL IDK ITEMS]\033[0m + + +TARGET_TYPE_COLOR := \t\033[35;48m\033[1m$(shell env printf "%5s" [$(TARGET_TYPE)])\033[0m +TARGET_OBJ_COLOR := \t\033[34;48m\033[1m$(shell env printf "%5s" [$(TARGET_OBJ)])\033[0m +TARGET_MIX_COLOR := $(TARGET_TYPE_COLOR)$(TARGET_OBJ_COLOR) +PLAT_ARM64_COLOR := $(MAKECMD_COLOR)\033[32;48m\033[1m$(shell env printf "%-8s" [ARM64])\033[0m$(TARGET_MIX_COLOR) +PLAT_LINUX_COLOR := $(MAKECMD_COLOR)\033[32;48m\033[1m$(shell env printf "%-8s" [LINUX])\033[0m$(TARGET_MIX_COLOR) + +# debug 模式 gcc 以 g3 参数添加调试信息 +ifeq ($(DEBUG), TRUE) +DEBUG_CFLAGS := -g3 +endif + +# 设置 gcc 编译优化等级参数 +#DEBUG_CFLAGS += -O2 + +LINUX_EXTFLAG += $(DEBUG_CFLAGS) + +# 如果视编译警告为错误,开启此开关 +ifeq ($(DISABLE_WARRING), TRUE) +LINUX_EXTFLAG += -w +endif + +TARGET_BOX ?= $(TARGET_NAME) + +# 设置编译参数 +ifeq ($(TARGET_OBJ), DRV) + +ifeq ($(PLAT_LINUX), TRUE) +LINUX_SYSTEM = $(shell $(CC) -print-file-name=include) +endif + +ifeq ($(PLAT_ARM64), TRUE) +ARM64_SYSTEM = $(shell $(ARM64_CROSS_CC) -print-file-name=include) +endif + +# linux 内核模块编译参数,提取自 x86 模块编译命令行 +LINUX_DRV_CFLAGS := -nostdinc -isystem $(LINUX_SYSTEM) \ + -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \ + -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security \ + -std=gnu89 -fno-PIE -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -falign-jumps=1 \ + -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup \ + -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args \ + -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 \ + -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 \ + -DCONFIG_AS_AVX512=1 -DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -pipe -Wno-sign-compare \ + -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register \ + -DRETPOLINE -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation \ + -Wno-format-overflow -Wno-int-in-bool-context -Wno-attribute-alias \ + --param=allow-store-data-races=0 -DCC_HAVE_ASM_GOTO -Wframe-larger-than=1024 \ + -fstack-protector-strong -Wno-unused-but-set-variable -Wno-unused-const-variable \ + -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments \ + -g -gdwarf-4 -pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign \ + -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack \ + -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types \ + -DMODULE -DKBUILD_BASENAME='"$(TARGET_NAME).mod"' -DKBUILD_MODNAME='"$(TARGET_NAME)"' + +LINUX_EXTFLAG += $(DEBUG_CFLAGS) $(LINUX_DRV_CFLAGS) \ + -I$(LINUX_KERNEL)/arch/x86/include \ + -I$(LINUX_KERNEL)/arch/x86/include/generated/uapi \ + -I$(LINUX_KERNEL)/arch/x86/include/generated \ + -I$(LINUX_KERNEL)/include -I$(LINUX_KERNEL)/arch/x86/include/uapi \ + -I$(LINUX_KERNEL)/include/uapi \ + -I$(LINUX_KERNEL)/include/generated/uapi \ + -include $(LINUX_KERNEL)/include/linux/kconfig.h + +# ARM64 linux 内核模块编译参数,提取自 arm 模块编译命令行 +ARM64_DRV_CFLAGS := -nostdinc -isystem $(ARM64_SYSTEM) -mabi=lp64 -Werror=designated-init \ + -D__KERNEL__ -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \ + -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 \ + -fno-PIE -mgeneral-regs-only -DCONFIG_AS_LSE=1 -fno-asynchronous-unwind-tables -mpc-relative-literal-loads \ + -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow \ + -Wno-int-in-bool-context -O2 --param=allow-store-data-races=0 -DCC_HAVE_ASM_GOTO -Wframe-larger-than=2048 \ + -fno-stack-protector -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-omit-frame-pointer \ + -fno-optimize-sibling-calls -fno-var-tracking-assignments -g -Wdeclaration-after-statement -Wno-pointer-sign \ + -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack \ + -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types \ + -DKBUILD_BASENAME='"$(TARGET_NAME).mod"' -DKBUILD_MODNAME='"$(TARGET_NAME)"' -DMODULE -mcmodel=large + +ARM64_EXTFLAG += $(DEBUG_CFLAGS) $(ARM64_DRV_CFLAGS) \ + -I$(ARM64_KERNEL)/arch/arm64/include \ + -I$(ARM64_KERNEL)/arch/arm64/include/generated/uapi \ + -I$(ARM64_KERNEL)/arch/arm64/include/generated \ + -I$(ARM64_KERNEL)/include \ + -I$(ARM64_KERNEL)/arch/arm64/include/uapi \ + -I$(ARM64_KERNEL)/include/uapi \ + -I$(ARM64_KERNEL)/include/generated/uapi \ + -include $(ARM64_KERNEL)/include/linux/kconfig.h + +# x86 Linux 内核模块链接参数,提取自 x86 模块连接命令行 +LINUX_DRV_LDFLAGS = -r -m elf_x86_64 -z max-page-size=0x200000 -T $(LINUX_KERNEL)/scripts/module-common.lds --build-id +# arm64 Linux 内核模块链接参数,提取自 arm64 模块连接命令行 +ARM64_DRV_LDFLAGS = -EL -r -maarch64linux -T $(ARM64_KERNEL)/scripts/module-common.lds --build-id +else ifeq ($(TARGET_OBJ), APP) +# 用户态模块编译参数 +ARM64_EXTFLAG += $(DEBUG_CFLAGS) -I$(ARM64_SDK_INCLUDE) + +# show all warring +CFLAGS += -Wall + +# 设置 ARM64 交叉编译链接目录 +ARM64_DRV_LDFLAGS := --sysroot=${SDKTARGETSYSROOT} +else ifeq ($(TARGET_OBJ), SH) +else +$(error Unknown TARGET_OBJ Value Of [$(TARGET_OBJ)], It's Must Be Set Of APP/DRV) +endif + +# 根据 debug/release 模式设置目录名称 +ifeq ($(DEBUG), TRUE) +BUILD_DIR := debug +else +BUILD_DIR := release +endif + +# 编译生成中间文件存放临时子目录 +OUTPUT_DIR := ./.build/ + +# 编译中间文件存放相对路径 +ARM64_DIR := $(OUTPUT_DIR)$(TARGET_NAME)_$(TARGET_TYPE)_$(TARGET_OBJ)_arm64_$(BUILD_DIR) +LINUX_DIR := $(OUTPUT_DIR)$(TARGET_NAME)_$(TARGET_TYPE)_$(TARGET_OBJ)_linux_$(BUILD_DIR) + +# 设置安装路径 +ifeq ($(TARGET_TYPE), SDK) +LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/sdk/$(CPU_LINUX_DIR)/ +PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/sdk.debug/$(CPU_LINUX_DIR)/ +else +ifeq ($(TARGET_BOX), ) +ARM64_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_ARM64_DIR)/$(TARGET_BOX)/ + +ifeq ($(LINUX_USER_INS_DIR), ) +LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ +else +LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR)/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ +endif + +ARM64_PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_ARM64_DIR)/$(TARGET_BOX)/ + +ifeq ($(LINUX_USER_INS_DIR), ) +PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ +else +PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR).debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)/ +endif + +else +ARM64_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_ARM64_DIR)/$(TARGET_BOX)-arm64/ + +ifeq ($(LINUX_USER_INS_DIR), ) +LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/targets/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ +else +LINUX_PUBLISH_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR)/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ +endif +ARM64_PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_ARM64_DIR)/$(TARGET_BOX)-arm64/ + +ifeq ($(LINUX_USER_INS_DIR), ) +PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/targets.debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ +else +PUBLISH_DEBUG_DIR := $(INSTALL_ROOT)/$(LINUX_USER_INS_DIR).debug/$(CPU_LINUX_DIR)/$(TARGET_BOX)-linux/ +endif +endif + +endif + +# 定义编译目标 +BUILD_TARGET := + +ifneq ($(UNMAKE_PROCESS), TRUE) + +# 定义最终生成目标文件名 +ARM64_TARGET := $(TARGET_PREFIX)$(TARGET_NAME)-$(ARM64_OBJ_TARGET)$(TARGET_EXT) +LINUX_TARGET := $(TARGET_PREFIX)$(TARGET_NAME)-$(LINUX_OBJ_TARGET)$(TARGET_EXT) + +# ARM64 平台生成目标、编译参数、链接参数、依赖库 +ifeq ($(PLAT_ARM64), TRUE) + BUILD_TARGET += $(ARM64_TARGET) + ARM64_CFLAGS := $(PLAT_ARM64_CFLAGS) -DPLATFORM_ARM64 $(ARM64_EXTFLAG) + ARM64_LDFLAGS := $(PLAT_ARM64_LDFLAGS) $(ARM64_DRV_LDFLAGS) -L ./debug + ARM64_LIBFLAGS := $(PLAT_ARM64_LIBFLAGS) + ARM64_LIBS := $(PLAT_ARM64_LIBS) +endif + +# ARM64 平台生成目标、编译参数、链接参数、依赖库 +ifeq ($(PLAT_LINUX), TRUE) + BUILD_TARGET += $(LINUX_TARGET) + LINUX_CFLAGS := $(PLAT_LINUX_CFLAGS) -DPLATFORM_LINUX $(LINUX_EXTFLAG) + LINUX_LDFLAGS := $(PLAT_LINUX_LDFLAGS) $(LINUX_DRV_LDFLAGS) -L ./debug + LINUX_LIBFLAGS := $(PLAT_LINUX_LIBFLAGS) + LINUX_LIBS := $(PLAT_LINUX_LIBS) +endif + +# 根据源文件推算出生成目标的依赖项 +ifeq ($(PLAT_ARM64), TRUE) +PLAT_ARM64_OBJS := $(PLAT_ARM64_SRCS:%.c=$(ARM64_DIR)/%.o) +PLAT_ARM64_OBJS += $(PLAT_ARM64_AS_SRCS:%.s=$(ARM64_DIR)/%.o) +PLAT_ARM64_DEPS := $(PLAT_ARM64_SRCS:%.c=$(ARM64_DIR)/%.d) +else +PLAT_ARM64_OBJS := +PLAT_ARM64_DEPS := +endif + +ifeq ($(PLAT_LINUX), TRUE) +PLAT_LINUX_OBJS := $(PLAT_LINUX_SRCS:%.c=$(LINUX_DIR)/%.o) +PLAT_LINUX_OBJS += $(PLAT_LINUX_AS_SRCS:%.s=$(LINUX_DIR)/%.o) +PLAT_LINUX_DEPS := $(PLAT_LINUX_SRCS:%.c=$(LINUX_DIR)/%.d) +else +PLAT_LINUX_OBJS := +PLAT_LINUX_DEPS := +endif + +# 构建系统最终需要生成的目标,包含 ARM64 和 Linux 平台 +ALL_OBJS += $(PLAT_ARM64_OBJS) $(PLAT_LINUX_OBJS) +ALL_DEPS += $(PLAT_ARM64_DEPS) $(PLAT_LINUX_DEPS) + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(strip $(ALL_DEPS)),) +-include $(ALL_DEPS) +endif +endif +endif +# ifneq $(UNMAKE_PROCESS) +endif + +ifeq ($(UNMAKE_PROCESS), TRUE) +BUILD_TARGET := +endif + +ifneq ($(OPT), clean) +ifneq ($(OPT), install) +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifeq ($(MAKE_TARGET), ) +$(info ---------------------------------------------------------------------) +$(info | CPU | TYPE | OBJECT | Command | Source/Target |) +$(info ---------------------------------------------------------------------) +else +$(info ------------------------------------------------------------------------------) +$(info | Name | CPU | TYPE | OBJECT | Command | Source |) +$(info ------------------------------------------------------------------------------) +endif +endif +endif +endif +endif + +.PHONY : all +all: $(BUILD_TARGET) +# Build ARM64 +ifeq ($(PLAT_ARM64), TRUE) +$(ARM64_TARGET): $(PLAT_ARM64_OBJS) +# 创建构建需要的目录结构 + -@test -d $(TARGET_OUT_DIR) || $(MKDIR) $(TARGET_OUT_DIR) +ifeq ($(TARGET_TYPE), LIB) +# 打包生成库文件 + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) AR $@" + $(MLOG)$(ARM64_CROSS_AR) $(ARM64_LIBFLAGS) $(TARGET_OUT_DIR)$@ $+ $(ARM64_LIBS) +else +# 链接生成可执行文件 + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) LD $@" + $(MLOG)$(ARM64_CROSS_LD) -o $(TARGET_OUT_DIR)$@ $(ARM64_LDFLAGS) $+ $(ARM64_LIBS) +ifeq ($(TARGET_STRIP), TRUE) +# 将目标的调试信息复制到另外一个新文件中 + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) OBJCOPY $@.debug" + $(MLOG)$(ARM64_CROSS_OBJCOPY) --only-keep-debug $(TARGET_OUT_DIR)$@ $(TARGET_OUT_DIR)/$@.debug +# 清理掉目标中的调试信息 + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) STRIP $@" + $(MLOG)$(ARM64_CROSS_STRIP) -g $(TARGET_OUT_DIR)$@ +# 建立目标文件和调试信息文件的管理,供 gdb 自动识别 + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) OBJCOPY $@" + $(MLOG)$(ARM64_CROSS_OBJCOPY) --add-gnu-debuglink=$(TARGET_OUT_DIR)$@.debug $(TARGET_OUT_DIR)$@ +endif +endif +# C 源文件编译规则 +$(ARM64_DIR)/%.o : %.c + -@test -d $(dir $@) || $(MKDIR) $(dir $@) + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) CC $<" + $(MLOG)$(ARM64_CROSS_CC) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" $(ARM64_CFLAGS) -o $@ -c $< + +# 汇编文件编译规则 +$(ARM64_DIR)/%.o : %.s + @$(ECHO_COLOR) "$(PLAT_ARM64_COLOR) CC $<" + $(MLOG)$(ARM64_CROSS_CC) -c $< -o $@ +endif + +# Build LINUX Board +ifeq ($(PLAT_LINUX), TRUE) +$(LINUX_TARGET): $(PLAT_LINUX_OBJS) + -@test -d $(TARGET_OUT_DIR) || $(MKDIR) $(TARGET_OUT_DIR) + +ifeq ($(TARGET_TYPE), LIB) +# 打包生成库文件 + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) AR $@" + $(MLOG)$(AR) $(LINUX_LIBFLAGS) $(TARGET_OUT_DIR)$@ $+ $(LINUX_LIBS) +else +# 链接生成可执行文件 + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) LD $@" + $(MLOG)$(LINUX_CROSS_LD) -o $(TARGET_OUT_DIR)$@ $(LINUX_LDFLAGS) $+ $(LINUX_LIBS) +ifeq ($(TARGET_STRIP), TRUE) +# 将目标的调试信息复制到另外一个新文件中 + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) OBJCOPY $@.debug" + $(MLOG)$(OBJCOPY) --only-keep-debug $(TARGET_OUT_DIR)$@ $(TARGET_OUT_DIR)$@.debug +# 清理掉目标中的调试信息 + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) STRIP $@" + $(MLOG)$(STRIP) -g $(TARGET_OUT_DIR)$@ +# 建立目标文件和调试信息文件的管理,供 gdb 自动识别 + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) OBJCOPY $@" + $(MLOG)$(OBJCOPY) --add-gnu-debuglink=$(TARGET_OUT_DIR)$@.debug $(TARGET_OUT_DIR)$@ +endif +endif + +# C 源文件编译规则 +$(LINUX_DIR)/%.o : %.c + -@test -d $(dir $@) || $(MKDIR) $(dir $@) + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) CC $<" + $(MLOG)$(CC) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" $(LINUX_CFLAGS) -o $@ -c $< + +# 汇编文件编译规则 +$(LINUX_DIR)/%.o : %.s + @$(ECHO_COLOR) "$(PLAT_LINUX_COLOR) CC $<" + $(MLOG)$(CC) -c $< -o $@ +endif + +# 安装功能 +.PHONY : install +install: +ifeq ($(INSTALL_ROOT), ) + $(error usage: make install DIR=) +endif + +ifneq ($(PLAT_ARM64_DONT_INSTALL), TRUE) +# ARM64 targets install +ifeq ($(PLAT_ARM64), TRUE) + -@test -d $(ARM64_PUBLISH_DIR) || $(MKDIR) $(ARM64_PUBLISH_DIR) + -@test -d $(ARM64_PUBLISH_DEBUG_DIR) || $(MKDIR) $(ARM64_PUBLISH_DEBUG_DIR) +ifneq ($(UNMAKE_PROCESS), TRUE) + @$(ECHO_COLOR) "$(INSTALL_COLOR) $(PLAT_ARM64_COLOR) $(TARGET_OUT_DIR)$(ARM64_TARGET) $(ARM64_TARGET).debug $(INSTALL_PATH_COLOR)" + @$(CP) $(TARGET_OUT_DIR)/$(ARM64_TARGET) $(ARM64_PUBLISH_DIR) + @$(CP) $(TARGET_OUT_DIR)/$(ARM64_TARGET).debug $(ARM64_PUBLISH_DEBUG_DIR) +endif +ifneq ($(PLAT_ARM64_USER_INS_ITEMS), ) + @$(ECHO_COLOR) "$(INSTALL_USER_ITEM_COLOR) $(PLAT_ARM64_COLOR) $(notdir $(PLAT_ARM64_USER_INS_ITEMS)) $(INSTALL_PATH_COLOR)" + @$(CP) $(PLAT_ARM64_USER_INS_ITEMS) $(ARM64_PUBLISH_DIR) +endif +endif +endif + +ifneq ($(PLAT_LINUX_DONT_INSTALL), TRUE) +# LINUX board targets install +ifeq ($(PLAT_LINUX), TRUE) + -@test -d $(LINUX_PUBLISH_DIR) || $(MKDIR) $(LINUX_PUBLISH_DIR) + -@test -d $(PUBLISH_DEBUG_DIR) || $(MKDIR) $(PUBLISH_DEBUG_DIR) +ifneq ($(UNMAKE_PROCESS), TRUE) + @$(ECHO_COLOR) "$(INSTALL_COLOR) $(PLAT_LINUX_COLOR) $(TARGET_OUT_DIR)$(LINUX_TARGET) $(LINUX_TARGET).debug $(INSTALL_PATH_COLOR)" + @$(CP) $(TARGET_OUT_DIR)/$(LINUX_TARGET) $(LINUX_PUBLISH_DIR) + @$(CP) $(TARGET_OUT_DIR)/$(LINUX_TARGET).debug $(PUBLISH_DEBUG_DIR) +endif +ifneq ($(PLAT_LINUX_USER_INS_ITEMS), ) + @$(ECHO_COLOR) "$(INSTALL_USER_ITEM_COLOR) $(PLAT_LINUX_COLOR) $(notdir $(PLAT_LINUX_USER_INS_ITEMS)) $(INSTALL_PATH_COLOR)" + @$(CP) $(PLAT_LINUX_USER_INS_ITEMS) $(LINUX_PUBLISH_DIR) +endif +ifneq ($(USER_MULTILE_PLATFORM_HEAD_ITEMS), ) + @$(ECHO_COLOR) "$(INSTALL_MULT_PLAT_COLOR) $(PLAT_LINUX_COLOR) $(notdir $(USER_MULTILE_PLATFORM_HEAD_ITEMS)) $(INSTALL_PATH_COLOR)" + @$(CP) $(USER_MULTILE_PLATFORM_HEAD_ITEMS) $(SDK_HEADFILE_PUBLIST_DIR) +endif +endif +endif + +# end of ($(DONT_INSTALL), TRUE) + +# 清理功能 +.PHONY : cleanall +cleanall: + @$(ECHO_COLOR) "$(CLEAN_COLOR) $(PATH_COLOR) $(OUTPUT_DIR) $(BUILD_TARGET) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) $(TARGET_OUT_DIR) *.debug" + @-$(RM) $(TARGET_OUT_DIR) $(OUTPUT_DIR) $(BUILD_TARGET) $(notdir $(DEPEND_LIB)) $(USER_CLEAN_ITEMS) *.debug + +.PHONY : clean +clean: + @$(ECHO_COLOR) "$(CLEAN_COLOR) $(PATH_COLOR) $(ALL_OBJS) $(BUILD_TARGET) $(ALL_DEPS) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) $(TARGET_OUT_DIR) *.debug" + @-$(RM) $(TARGET_OUT_DIR) $(ALL_OBJS) $(BUILD_TARGET) $(ALL_DEPS) $(USER_CLEAN_ITEMS) $(notdir $(DEPEND_LIB)) *.debug + diff --git a/Product/common/common.h b/Product/common/common.h index b83d4eb8c..483676dcb 100644 --- a/Product/common/common.h +++ b/Product/common/common.h @@ -11,8 +11,9 @@ #define MAX_NAME_LEN (32 * 4) #define MAX_SESSION (32 + 1) -#define MAX_PATH (256) -#define MAX_PAGE_ITEMS (10) +#define MAX_PATH (256) +#define MAX_PAGE_ITEMS (100) +#define MAX_REGEX_LEN (4096) #endif diff --git a/Product/user/object_manager/json_interface.c b/Product/user/object_manager/json_interface.c index 276e40be4..62a23dc44 100644 --- a/Product/user/object_manager/json_interface.c +++ b/Product/user/object_manager/json_interface.c @@ -747,7 +747,6 @@ static const char *__obj_detail_encode(void *pData) continue; } - pObjArray = cJSON_AddArrayToObject(pItem, "objContent"); cJSON_AddStringToObject(pItem, "name", p->data[i].name); cJSON_AddNumberToObject(pItem, "retCode", p->data[i].ret_code); @@ -762,6 +761,7 @@ static const char *__obj_detail_encode(void *pData) cJSON_AddNumberToObject(pItem, "type", p->data[i].pObjK->type); cJSON_AddNumberToObject(pItem, "ref_count", p->data[i].pObjK->ref_count); cJSON_AddNumberToObject(pItem, "prio", p->data[i].prio); + pObjArray = cJSON_AddArrayToObject(pItem, "objContent"); if(pObjArray) { int j; @@ -779,6 +779,7 @@ static const char *__obj_detail_encode(void *pData) switch(p->data[i].pObjK->type / 10) { case OBJ_TYPE_SERVER: cJSON_AddNumberToObject(pObjItem, "proType", pSvr->pro_type); + if(pSvr->str_val && strlen(pSvr->str_val) > 0) { cJSON_AddStringToObject(pObjItem, "porPort", pSvr->str_val); } @@ -786,7 +787,7 @@ static const char *__obj_detail_encode(void *pData) break; case OBJ_TYPE_ADDR: - if(pAddr->str_val && strlen(pDt->str_val) > 0) { + if(pAddr->str_val && strlen(pAddr->str_val) > 0) { cJSON_AddStringToObject(pObjItem, "ipAddr", pAddr->str_val); } @@ -794,6 +795,7 @@ static const char *__obj_detail_encode(void *pData) case OBJ_TYPE_DATETIME: cJSON_AddNumberToObject(pObjItem, "repType", pDt->rep_mode); + if(pDt->str_val && strlen(pDt->str_val) > 0) { cJSON_AddStringToObject(pObjItem, "timeValue", pDt->str_val); } @@ -859,6 +861,99 @@ static int __obj_detail_decode(const char *pJsonS, void **pStruct) return RET_OK; } +static int __obj_search_decode(const char *pJsonS, void **pStruct) +{ + cJSON *pRoot, *pVal; + PIFACE_SEARCH_OBJ pData; + int arraySize; + int i; + *pStruct = malloc(sizeof(IFACE_SEARCH_OBJ)); + + if(*pStruct == NULL) { + return -RET_NOMEM; + } + + pData = (PIFACE_SEARCH_OBJ) * pStruct; + pRoot = cJSON_Parse(pJsonS); + + if(!pRoot) { + return -RET_SYSERR; + } + + pVal = cJSON_GetObjectItem(pRoot, "key"); + + if(cJSON_IsString(pVal)) { + strncpy(pData->key, pVal->valuestring, MAX_REGEX_LEN - 1); + } + + pVal = cJSON_GetObjectItem(pRoot, "type"); + + if(cJSON_IsNumber(pVal)) { + pData->type = pVal->valueint; + } + + pVal = cJSON_GetObjectItem(pRoot, "regex"); + + if(cJSON_IsNumber(pVal)) { + pData->regex = pVal->valueint; + } + + pVal = cJSON_GetObjectItem(pRoot, "maxItems"); + + if(cJSON_IsNumber(pVal)) { + pData->maxItems = pVal->valueint; + } + + cJSON_Delete(pRoot); + return RET_OK; +} + +static int __obj_search_encode(const char *pJsonS, void **pStruct) +{ + cJSON *pRoot, *pVal; + PIFACE_SEARCH_LIST pData; + *pStruct = malloc(sizeof(IFACE_SEARCH_LIST)); + + if(*pStruct == NULL) { + return -RET_NOMEM; + } + + pData = (PIFACE_SEARCH_LIST) * pStruct; + pRoot = cJSON_Parse(pJsonS); + + if(!pRoot) { + return -RET_SYSERR; + } + + memset(pData, 0, sizeof(IFACE_SEARCH_LIST)); + pVal = cJSON_GetObjectItem(pRoot, "type"); + + if(cJSON_IsNumber(pVal)) { + pData->type = pVal->valueint; + } + + pVal = cJSON_GetObjectItem(pRoot, "start"); + + if(cJSON_IsNumber(pVal)) { + pData->start = pVal->valueint; + } + + pVal = cJSON_GetObjectItem(pRoot, "end"); + + if(cJSON_IsNumber(pVal)) { + pData->end = pVal->valueint; + } + + pVal = cJSON_GetObjectItem(pRoot, "session"); + + if(cJSON_IsString(pVal)) { + strncpy(pData->session, pVal->valuestring, MAX_SESSION - 1); + } + + cJSON_Delete(pRoot); + return RET_OK; +} + static JSON_ENGINE g_jSonEngine[] = { {JE_INTERFACE, __interface_encode, __interface_decode, NULL}, {OBJ_CMD_ADD, __obj_add_encode, __obj_add_decode, NULL}, @@ -866,6 +961,7 @@ static JSON_ENGINE g_jSonEngine[] = { {JE_OBJ_MOD, __obj_mod_encode, __obj_mod_decode, NULL}, {JE_OBJ_QUERYLIST, __obj_query_list_encode, __obj_query_list_decode, NULL}, {JE_OBJ_QUERYDETAIL, __obj_detail_encode, __obj_detail_decode, NULL}, + {JE_OBJ_SEARCH, __obj_search_encode, __obj_search_decode, NULL}, {JSON_ENGINE_MAX, NULL, NULL, NULL} }; diff --git a/Product/user/object_manager/json_interface.h b/Product/user/object_manager/json_interface.h index 11b331ec5..1feea2d28 100644 --- a/Product/user/object_manager/json_interface.h +++ b/Product/user/object_manager/json_interface.h @@ -20,6 +20,7 @@ typedef enum { JE_OBJ_MOD, JE_OBJ_QUERYLIST, JE_OBJ_QUERYDETAIL, + JE_OBJ_SEARCH, JSON_ENGINE_MAX, } JSON_ENGINE_TYPE; @@ -56,7 +57,14 @@ typedef struct { int type; int start; int end; -} IFACE_QUERY_LIST, *PIFACE_QUERY_LIST; +} IFACE_QUERY_LIST, IFACE_SEARCH_LIST, *PIFACE_QUERY_LIST, *PIFACE_SEARCH_LIST; + +typedef struct { + char key[MAX_REGEX_LEN]; + int type; + int regex; + int maxItems; +} IFACE_SEARCH_OBJ, *PIFACE_SEARCH_OBJ; typedef struct { char *name; @@ -72,9 +80,9 @@ typedef struct { } IFC_RET_MSG, *PIFC_RET_MSG; typedef struct { - char *name; + char name[MAX_NAME_LEN]; char *mesg; - char* *desc; + char* desc[MAX_DESC]; int prio; int ret_code; POBJECT_K pObjK; diff --git a/Product/user/object_manager/json_test/search.json b/Product/user/object_manager/json_test/search.json new file mode 100644 index 000000000..216cef2ab --- /dev/null +++ b/Product/user/object_manager/json_test/search.json @@ -0,0 +1,7 @@ +{ + "cmdId": 105, + "ver": 1, + "cryptoType": 0, + "timeStamp": 1526625689, + "msgContent": "{\"key\":\"RTP*\",\"regex\":0,\"type\":0,\"maxItems\":100}" +} \ No newline at end of file diff --git a/Product/user/object_manager/main.c b/Product/user/object_manager/main.c index 38c2956f2..95dcd2175 100644 --- a/Product/user/object_manager/main.c +++ b/Product/user/object_manager/main.c @@ -26,6 +26,7 @@ #define MOD_JS_FILE (JS_FILE_ROOT"/secogateway/Product/user/object_manager/json_test/mod.json") #define QUERY_LIST_JS_FILE (JS_FILE_ROOT"/secogateway/Product/user/object_manager/json_test/page_queue.json") #define DETAIL_JS_FILE (JS_FILE_ROOT"/secogateway/Product/user/object_manager/json_test/detail.json") +#define SEARCH_JS_FILE (JS_FILE_ROOT"/secogateway/Product/user/object_manager/json_test/search.json") static PSPLIT_PAGE g_pSplitPage = NULL; static PCMHI_OBJECT g_pObject = NULL; @@ -94,6 +95,7 @@ static void dump_object(void) LOG_EX(LOG_Info, "prio: %d\n", pObj->prio); LOG_EX(LOG_Info, "Tags: %s\n", g_objItem[pObj->obj_index].memTag); LOG_EX(LOG_Info, "type: %d\n", g_objItem[pObj->obj_index].type); + LOG_EX(LOG_Info, "refs: %d\n", g_objItem[pObj->obj_index].ref_count); LOG_EX(LOG_Info, "items: %d\n", g_objItem[pObj->obj_index].ctx_num); for(i = 0; i < g_objItem[pObj->obj_index].ctx_num; i++) { @@ -970,8 +972,9 @@ static void test_add_object(void) POBJECT_K pObjKItem = malloc(sizeof(OBJECT_K)); if(pObjItem && pObjKItem) { + memset(pObjKItem, 0, sizeof(OBJECT_K)); memcpy(pObjItem, pAdd->pCtx[0].pObj, sizeof(CMHI_OBJECT)); - memcpy(pObjKItem, &pAdd->pCtx[i].objk, sizeof(OBJECT_K)); + memcpy(pObjKItem, &pAdd->pCtx[0].objk, sizeof(OBJECT_K)); sprintf(pObjItem->name, "%s_%02d", pAdd->pCtx[0].pObj->name, i); pObjKItem->type = 1; pObjKItem->ctx_num = 1; @@ -1420,6 +1423,7 @@ static void test_page_object(char *pVal) } retCtx.n_items = 0; + pPage->last_time = time(NULL); for(i = retCtx.start; i < pQuery->end && iCount < MAX_PAGE_ITEMS && iCount < retCtx.tolItems; i++) { pStr = (char **)utarray_eltptr(pPage->name_list, i); @@ -1439,7 +1443,6 @@ static void test_page_object(char *pVal) } retCtx.end = retCtx.start + iCount - 1; - pRetJson = Struct2Json(&retCtx, JE_OBJ_QUERYLIST, FALSE, &ret); if(!pRetJson || ret != RET_OK) { @@ -1545,21 +1548,30 @@ static void test_detail_object(void) retCtx.n_items = pDetail->n_obj; } + retCtx.ret_code = RET_OK; + for(i = 0; i < pDetail->n_obj; i++) { - ret = object_del(pDetail->name[i]); + PCMHI_OBJECT pObj = NULL; + pthread_mutex_lock(&g_obj_lock); + HASH_FIND_STR(g_pObject, pDetail->name[i], pObj); + pthread_mutex_unlock(&g_obj_lock); + strncpy(retCtx.data[i].name, pDetail->name[i], MAX_NAME_LEN - 1); - if(ret != RET_OK && retCtx.ret_code == RET_OK) { - retCtx.ret_code = ret; + if(pObj) { + retCtx.data[i].ret_code = RET_OK; + retCtx.data[i].mesg = get_err_message(RET_OK); + strncpy(retCtx.data[i].desc, pObj->desc, MAX_DESC - 1); + retCtx.data[i].prio = pObj->prio; + retCtx.data[i].pObjK = &g_objItem[pObj->obj_index]; + } else { + retCtx.ret_code = -RET_NOTFOUND; + retCtx.data[i].ret_code = -RET_NOTFOUND; + retCtx.data[i].mesg = get_err_message(RET_NOTFOUND); } - - retCtx.data[i].name = pDetail->name[i]; - retCtx.data[i].ret_code = ret; - retCtx.data[i].mesg = get_err_message(ret); } - dump_object(); retCtx.mesg = get_err_message(retCtx.ret_code); - pRetJson = Struct2Json(&retCtx, JE_OBJ_DEL, FALSE, &ret); + pRetJson = Struct2Json(&retCtx, JE_OBJ_QUERYDETAIL, FALSE, &ret); if(!pRetJson || ret != RET_OK) { LOG_EX(LOG_Error, "Json format error: %d\n", ret); @@ -1591,6 +1603,197 @@ static void test_detail_object(void) free((void *)pJson); } +static void test_search_object(char *pVal) +{ + int i, ret, size; + PCMHI_OBJECT pObj, pTmp; + char **pStr; + PSPLIT_PAGE pPage; + char regex_str[MAX_REGEX_LEN]; + IFC_RET_PAGE_MSG retCtx; + int pos = 0; + const char *pRetJson = NULL; + PIFACE_SEARCH_OBJ pSearch = NULL; + PJSON_INTERFACE p = NULL; + int sess_type = OBJ_TYPE_MAX; + PSPLIT_PAGE pNew = (PSPLIT_PAGE)malloc(sizeof(SPLIT_PAGE)); + const char *pJson = read_json_file(SEARCH_JS_FILE); + ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE); + memset(&retCtx, 0, sizeof(IFC_RET_PAGE_MSG)); + + if(ret != RET_OK || p == NULL || pNew == NULL) { + LOG_EX(LOG_Error, "Decode json error: %d\n", ret); + free((void *)pJson); + + if(p) { + if(p->msgContent) { + free((void *)p->msgContent); + } + + free(p); + } + + if(pNew == NULL) { + retCtx.ret_code = -RET_NOMEM; + } else { + retCtx.ret_code = -RET_JSONERR; + free(pNew); + } + + retCtx.mesg = get_err_message(retCtx.ret_code); + retCtx.n_items = 0; + pRetJson = Struct2Json(&retCtx, JE_OBJ_SEARCH, FALSE, &ret); + + if(!pRetJson || ret != RET_OK) { + LOG_EX(LOG_Error, "Json format error: %d\n", ret); + return; + } + + LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson); + free((void *)pRetJson); + return; + } + + LOG_EX(LOG_Info, "cmdId: %d\n", p->cmdId); + LOG_EX(LOG_Info, "ver: %d\n", p->ver); + LOG_EX(LOG_Info, "cryptoType: %d\n", p->cryptoType); + LOG_EX(LOG_Info, "timeStamp: %d\n", p->timeStamp); + LOG_EX(LOG_Info, "msgContent: %s\n", p->msgContent); + ret = Json2Struct(p->msgContent, &pSearch, JE_OBJ_SEARCH, FALSE); + + if(ret != RET_OK || pSearch == NULL) { + LOG_EX(LOG_Error, "Decode json error: %d\n", ret); + free(pNew); + + if(pSearch) { + free(pSearch); + } + + if(p->msgContent) { + free((void *)p->msgContent); + } + + free(p); + free((void *)pJson); + retCtx.ret_code = -RET_JSONERR; + retCtx.mesg = get_err_message(RET_JSONERR); + retCtx.n_items = 0; + pRetJson = Struct2Json(&retCtx, JE_OBJ_QUERYLIST, FALSE, &ret); + + if(!pRetJson || ret != RET_OK) { + LOG_EX(LOG_Error, "Json format error: %d\n", ret); + return; + } + + LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson); + free((void *)pRetJson); + return; + } + + memset(regex_str, 0, MAX_REGEX_LEN); + + if(strlen(pSearch->key) == 0) { + regex_str[0] = '.'; + regex_str[1] = '*'; + } else if(pSearch->regex) { + strncpy(regex_str, pSearch->key, MAX_REGEX_LEN - 1); + } else { + for(i = 0; i < strlen(pSearch->key); i++) { + if(pSearch->key[i] == '*') { + regex_str[pos++] = '.'; + regex_str[pos++] = '*'; + } else { + regex_str[pos++] = pSearch->key[i]; + } + } + } + + if(pSearch->type == 1) { + sess_type = OBJ_TYPE_SERVER; + } else if(pSearch->type == 2) { + sess_type = OBJ_TYPE_ADDR; + } else if(pSearch->type == 3) { + sess_type = OBJ_TYPE_DATETIME; + } + + retCtx.n_items = 0; + retCtx.tolItems = 0; + + pthread_mutex_lock(&g_obj_lock); + HASH_ITER(hh, g_pObject, pObj, pTmp) { + if(g_objItem[pObj->obj_index].type / 10 == sess_type + || sess_type == OBJ_TYPE_MAX) { + if(pcre_match_str(regex_str, pObj->name) == TRUE) { + char *pStr = strdup(pObj->name); + pNew->last_time = time(NULL); + + if(pNew->name_list == NULL) { + utarray_new(pNew->name_list, &ut_str_icd); + } + + utarray_push_back(pNew->name_list, &pStr); + retCtx.tolItems++; + + if(retCtx.n_items < MAX_PAGE_ITEMS) { + retCtx.data[retCtx.n_items].name = pObj->name; + retCtx.data[retCtx.n_items].desc = pObj->desc; + retCtx.data[retCtx.n_items].ref_count = g_objItem[pObj->obj_index].ref_count; + retCtx.data[retCtx.n_items].type = g_objItem[pObj->obj_index].type; + retCtx.n_items++; + } + + LOG_EX(LOG_Debug, "%s is match %s\n", pObj->name, regex_str); + } + } + } + pthread_mutex_unlock(&g_obj_lock); + + if(retCtx.tolItems > MAX_PAGE_ITEMS) { + random_string(pNew->session, MAX_SESSION - 1); + HASH_ADD_STR(g_pSplitPage, session, pNew); + retCtx.session = pNew->session; + } else { + retCtx.session = ""; + free(pNew); + } + + retCtx.ret_code = RET_OK; + retCtx.mesg = get_err_message(retCtx.ret_code); + retCtx.start = 0; + retCtx.end = retCtx.n_items > 0 ? retCtx.n_items - 1 : 0; + + pRetJson = Struct2Json(&retCtx, JE_OBJ_QUERYLIST, FALSE, &ret); + + if(!pRetJson || ret != RET_OK) { + LOG_EX(LOG_Error, "Json format error: %d\n", ret); + + if(pRetJson) { + free((void *)pRetJson); + } + + free(pSearch); + + if(p->msgContent) { + free((void *)p->msgContent); + } + + free(p); + free((void *)pJson); + return; + } + + LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson); + free((void *)pRetJson); + free(pSearch); + + if(p->msgContent) { + free((void *)p->msgContent); + } + + free(p); + free((void *)pJson); +} + /** * @brief 应用程序主函数 * @param argc 输入参数个数 @@ -1604,12 +1807,14 @@ int main(int argc, char **argv) { "help", no_argument, NULL, 'h'}, { "version", no_argument, NULL, 'v'}, // TODO 添加其它需要处理的参数配置 - { "interface", no_argument, NULL, 'i'}, - { "regex", required_argument, NULL, 'r'}, - { "split_str", required_argument, NULL, 's'}, - { "ip_addr", required_argument, NULL, 'p'}, - { "str_time", required_argument, NULL, 't'}, - { "page_split", optional_argument, NULL, 'a'}, + { "interface", no_argument, NULL, 'a'}, + { "regex", required_argument, NULL, 'b'}, + { "split_str", required_argument, NULL, 'c'}, + { "ip_addr", required_argument, NULL, 'd'}, + { "str_time", required_argument, NULL, 'e'}, + { "page_split", optional_argument, NULL, 'f'}, + { "detail", optional_argument, NULL, 'g'}, + { "search", optional_argument, NULL, 'i'}, {NULL, 0, NULL, 0} }; IHW_InitLOG("obj", NULL, TRUE); @@ -1623,7 +1828,7 @@ int main(int argc, char **argv) LOG_EX(LOG_Debug, "SVR_OBJECT = %u bytes\n", sizeof(SVR_OBJECT) * MAX_OBJ_CONTENT); LOG_EX(LOG_Debug, "ADDR_OBJECT = %u bytes\n", sizeof(ADDR_OBJECT) * MAX_OBJ_CONTENT); - while((c = getopt_long(argc, argv, "ir:s:p:t:a::hv", long_opts, &optidx)) != -1) { + while((c = getopt_long(argc, argv, "ab:c:d:e:f::i::ghv", long_opts, &optidx)) != -1) { switch(c) { case 'v': LOG_EX(LOG_Info, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS); @@ -1639,32 +1844,42 @@ int main(int argc, char **argv) break; //TODO 添加其它必要处理参数过程 - case 'i': + case 'a': test_add_object(); //test_del_object(); //test_mod_object(); break; - case 's': - test_strsep(optarg); - break; - - case 'r': + case 'b': test_regex(optarg); break; - case 'p': + case 'c': + test_strsep(optarg); + break; + + case 'd': test_ipaddr_format(optarg); break; - case 't': + case 'e': test_str_time(optarg); break; - case 'a': + case 'f': test_add_object(); test_page_object(optarg); break; + + case 'g': + test_add_object(); + test_detail_object(); + break; + + case 'i': + test_add_object(); + test_search_object(optarg); + break; } } diff --git a/Product/user/object_manager/regex_table.c b/Product/user/object_manager/regex_table.c index 32f548f06..cfef7ae46 100644 --- a/Product/user/object_manager/regex_table.c +++ b/Product/user/object_manager/regex_table.c @@ -4,42 +4,59 @@ #include "log.h" #include "regex_table.h" +typedef struct { + int regId; + pcre *re; + char *regex; +} REGEX_CONTEXT, *PREGEX_CONTEXT; + +#define SVR_REGEX_STR "^(([1-9]\\d{0,3})|([1-5]\\d{4})|(6[0-4]\\d{3})|(65[0-4]\\d{2})|(655[0-2]" \ + "\\d)|(6553[0-5]))$" + +#define IP_REGEX_STR "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?" \ + ")(\\/(\\d|[1-2]\\d|3[0-2]))?$|^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d" \ + "|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([" \ + "0-1]\\d|2[0-8]))))?$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]" \ + "?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]" \ + "\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|" \ + "2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]" \ + "?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:" \ + "){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?" \ + "\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}:" \ + "([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]" \ + "|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-" \ + "fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]" \ + "\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1" \ + ",4}:){7}[\\da-fA-F]{1,4}(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^:((:[" \ + "\\da-fA-F]{1,4}){1,6}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^[\\da-f" \ + "A-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8])" \ + ")))?$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)(\\/([1-9]?\\d|" \ + "(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3" \ + "}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){4}((:[" \ + "\\da-fA-F]{1,4}){1,2}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-" \ + "fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))" \ + "?$|^([\\da-fA-F]{1,4}:){6}:(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$" + +#define DT_REGEX_STR "^(?:(?!0000)[0-9]{4}\\/(?:(?:0[1-9]|1[0-2])\\/(?:0[1-9]|1[0-9]|2[0-8])|(" \ + "?:0[13-9]|1[0-2])\\/(?:29|30)|(?:0[13578]|1[02])\\/31)|(?:[0-9]{2}(?:0[48" \ + "]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\/02\\/29" \ + ") (20|21|22|23|[0-1][0-9]):[0-5][0-9]$|^(20|21|22|23|[0-1][0-9]):[0-5][0-" \ + "9]$" + +#define TIME_REGEX_STR "^(20|21|22|23|[0-1][0-9]):[0-5][0-9]$" + const char *g_regex_tbl[REGEX_MAX] = { + SVR_REGEX_STR, + IP_REGEX_STR, + DT_REGEX_STR, + TIME_REGEX_STR, +}; - "^(([1-9]\\d{0,3})|([1-5]\\d{4})|(6[0-4]\\d{3})|(65[0-4]\\d{2})|(655[0-2]" - "\\d)|(6553[0-5]))$", - - "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?" - ")(\\/(\\d|[1-2]\\d|3[0-2]))?$|^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d" - "|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([" - "0-1]\\d|2[0-8]))))?$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]" - "?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]" - "\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|" - "2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]" - "?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:" - "){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?" - "\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}:" - "([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]" - "|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-" - "fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]" - "\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1" - ",4}:){7}[\\da-fA-F]{1,4}(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^:((:[" - "\\da-fA-F]{1,4}){1,6}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^[\\da-f" - "A-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8])" - ")))?$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)(\\/([1-9]?\\d|" - "(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3" - "}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){4}((:[" - "\\da-fA-F]{1,4}){1,2}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-" - "fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))" - "?$|^([\\da-fA-F]{1,4}:){6}:(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$", - - "^(?:(?!0000)[0-9]{4}\\/(?:(?:0[1-9]|1[0-2])\\/(?:0[1-9]|1[0-9]|2[0-8])|(" - "?:0[13-9]|1[0-2])\\/(?:29|30)|(?:0[13578]|1[02])\\/31)|(?:[0-9]{2}(?:0[48" - "]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\/02\\/29" - ") (20|21|22|23|[0-1][0-9]):[0-5][0-9]$|^(20|21|22|23|[0-1][0-9]):[0-5][0-" - "9]$", - - "^(20|21|22|23|[0-1][0-9]):[0-5][0-9]$", +static REGEX_CONTEXT g_reg_ctx[REGEX_MAX] = { + {REGEX_SVR_PORT, NULL, SVR_REGEX_STR}, + {REGEX_IP_ADDR, NULL, IP_REGEX_STR}, + {REGEX_DT, NULL, DT_REGEX_STR}, + {REGEX_TIME, NULL, TIME_REGEX_STR} }; int pcre_match(int regId, const char *pStr) @@ -126,6 +143,90 @@ int pcre_match(int regId, const char *pStr) return ret; } +int pcre_match_str(const char *pRegex, const char *pStr) +{ + pcre *re; + pcre_extra *pcreExtra; + const char *error; + int ret, erroffset; + + if(!pRegex || !pStr) { + LOG_EX(LOG_Error, "Input params error: %p, %p\n", pRegex, pStr); + return FALSE; + } + + re = pcre_compile(pRegex, 0, &error, &erroffset, NULL); + + if(!re) { + LOG_EX(LOG_Error, "pcre_compile error at %d: %s, %s\n", erroffset, + pRegex, error); + return FALSE; + } + + pcreExtra = pcre_study(re, 0, &error); + + if(error != NULL) { + LOG_EX(LOG_Error, "pcre_study error: %s, %s\n", pRegex, error); + pcre_free(re); + return FALSE; + } + + ret = pcre_exec(re, + pcreExtra, + pStr, + strlen(pStr), // length of string + 0, // Start looking at this point + 0, // OPTIONS + NULL, + 0); // Length of subStrVec + + if(ret < 0) { + switch(ret) { + case PCRE_ERROR_NOMATCH : + LOG_EX(LOG_Error, "[%s] String did not match the pattern\n", pStr); + break; + + case PCRE_ERROR_NULL : + LOG_EX(LOG_Error, "[%s] Something was null\n", pStr); + break; + + case PCRE_ERROR_BADOPTION : + LOG_EX(LOG_Error, "[%s] A bad option was passed\n", pStr); + break; + + case PCRE_ERROR_BADMAGIC : + LOG_EX(LOG_Error, "Magic number bad (compiled re corrupt?)\n"); + break; + + case PCRE_ERROR_UNKNOWN_NODE : + LOG_EX(LOG_Error, "[%s] Something kooky in the compiled re\n", pStr); + break; + + case PCRE_ERROR_NOMEMORY : + LOG_EX(LOG_Error, "[%s] Ran out of memory\n", pStr); + break; + + default : + LOG_EX(LOG_Error, "[%s] Unknown error\n", pStr); + break; + } /* end switch */ + } else { + ret = TRUE; + } + + pcre_free(re); + + if(pcreExtra != NULL) { +#ifdef PCRE_CONFIG_JIT + pcre_free_study(pcreExtra); +#else + pcre_free(pcreExtra); +#endif + } + + return ret; +} + #if 0 int regex_match(const char *regex, const char *pStr) { diff --git a/Product/user/object_manager/regex_table.h b/Product/user/object_manager/regex_table.h index c742a9c42..09ab546b4 100644 --- a/Product/user/object_manager/regex_table.h +++ b/Product/user/object_manager/regex_table.h @@ -16,6 +16,7 @@ typedef enum { extern "C" { #endif int pcre_match(int regId, const char *pStr); +int pcre_match_str(const char* pRegex, const char *pStr); #ifdef __cplusplus } #endif