Mod aaa-12 增加添加对象接口,正则表达式接口

RCA:
SOL:
修改人:huangxin
检视人:huangxin
This commit is contained in:
黄昕 2019-09-24 19:59:52 +08:00
parent 741bd49d51
commit 42df8b3ed7
7 changed files with 430 additions and 122 deletions

View File

@ -37,9 +37,9 @@ PLAT_ARM64_SRCS := $(PLAT_LINUX_SRCS)
# gcc CFLAGS
COMMON_CFLAGS := -I../../Common
PLAT_LINUX_CFLAGS += $(COMMON_CFLAGS)
PLAT_ARM64_CFLAGS += $(COMMON_CFLAGS)
PLAT_ARM64_CFLAGS += $(COMMON_CFLAGS) -D_GNU_SOURCE -D__USE_XOPEN
COMMON_LIBS := -lcjson -lpthread
COMMON_LIBS := -lcjson -lpthread -lpcre
PLAT_LINUX_LIBS := $(COMMON_LIBS)
PLAT_ARM64_LIBS := $(COMMON_LIBS)

View File

@ -10,7 +10,7 @@
#include "json_interface.h"
typedef const char *(*StructToJsonCb)(void *pStruct);
typedef void (*JsonToStructCb)(const char *pJsonStr, void **pStruct);
typedef int (*JsonToStructCb)(const char *pJsonStr, void **pStruct);
typedef void (*Base64Code)(void *pStruct, int enCode);
typedef struct {
@ -45,7 +45,7 @@ static const char *__interface_encode(void *pData)
return pJsonS;
}
static void __interface_decode(const char *pJsonS, void **pStruct)
static int __interface_decode(const char *pJsonS, void **pStruct)
{
cJSON *pRoot;
PJSON_INTERFACE pData;
@ -53,7 +53,7 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
*pStruct = malloc(sizeof(JSON_INTERFACE));
if(*pStruct == NULL) {
return;
return -RET_INPUTERR;
}
pData = (PJSON_INTERFACE) * pStruct;
@ -61,7 +61,7 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
pRoot = cJSON_Parse(pJsonS);
if(!pRoot) {
return;
return -RET_SYSERR;
}
memset(pData, 0, sizeof(JSON_INTERFACE));
@ -76,6 +76,8 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
}
cJSON_Delete(pRoot);
return RET_OK;
}
static const char *__obj_add_encode(void *pData)
@ -83,7 +85,7 @@ static const char *__obj_add_encode(void *pData)
}
static void __obj_add_decode(const char *pJsonS, void **pStruct)
static int __obj_add_decode(const char *pJsonS, void **pStruct)
{
cJSON *pRoot;
PIFACE_ADD_OBJ pData;
@ -93,7 +95,7 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
*pStruct = malloc(sizeof(IFACE_ADD_OBJ));
if(*pStruct == NULL) {
return;
return -RET_INPUTERR;
}
pData = (PIFACE_ADD_OBJ) * pStruct;
@ -101,7 +103,7 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
pRoot = cJSON_Parse(pJsonS);
if(!pRoot) {
return;
return -RET_SYSERR;
}
memset(pData, 0, sizeof(IFACE_ADD_OBJ));
@ -171,6 +173,8 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
}
cJSON_Delete(pRoot);
return RET_OK;
}
static JSON_ENGINE g_jSonEngine[] = {

View File

@ -3,5 +3,5 @@
"ver": 1,
"cryptoType": 0,
"timeStamp": 1526625689,
"msgContent": "[{\"name\":\"RTP管理\",\"type\":1,\"desc\":\"RTP语音数据权限、连接、流控管理\",\"prio\":0,\"objContent\":[{\"proType\":0,\"porPort\":\"80,83\"},{\"proType\":0,\"porPort\":\"100-110\"},{\"proType\":1,\"porPort\":\"10000-10010\"}]},{\"name\":\"研发部\",\"type\":10,\"desc\":\"研发部所有员工\",\"prio\":0,\"objContent\":[{\"ipAddr\":\"192.168.0.1\"},{\"ipAddr\":\"192.168.10.1-192.168.10.20\"},{\"ipAddr\":\"192.168.20.1/24\"}]},{\"name\":\"工作时间\",\"type\":20,\"desc\":\"法定工作时间\",\"prio\":0,\"objContent\":[{\"repType\":255,\"timeValue\":\"09:00-12:00\"},{\"repType\":255,\"timeValue\":\"13:00-18:00\"}]}]"
"msgContent": "[{\"name\":\"RTP管理\",\"type\":1,\"desc\":\"RTP语音数据权限、连接、流控管理\",\"prio\":0,\"objContent\":[{\"proType\":0,\"porPort\":\"8083\"},{\"proType\":0,\"porPort\":\"100-110\"},{\"proType\":1,\"porPort\":\"10000-10010\"}]},{\"name\":\"研发部\",\"type\":10,\"desc\":\"研发部所有员工\",\"prio\":0,\"objContent\":[{\"ipAddr\":\"192.168.0.1\"},{\"ipAddr\":\"192.168.10.1-192.168.10.20\"},{\"ipAddr\":\"192.168.20.1/24\"}]},{\"name\":\"工作时间\",\"type\":20,\"desc\":\"法定工作时间\",\"prio\":0,\"objContent\":[{\"repType\":255,\"timeValue\":\"09:00-12:00\"},{\"repType\":255,\"timeValue\":\"13:00-18:00\"}]}]"
}

View File

@ -8,82 +8,36 @@
#include <pthread.h>
#include <uthash/uthash.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "compile.h"
#include "log.h"
#include "object_manager.h"
#include "json_interface.h"
#include "regex_table.h"
#define MAX_OBJ (300)
#define ADD_JS_FILE ("/home/hx/secogateway/Product/user/object_manager/json_test/add.json")
#define REGEX_SVR_PORT ("^[0-9]{1,5}$")
#define REGEX_IP_ADDR "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]\
?[0-9][0-9]?)(\\/([0-9]|[1-2][0-9]|3[0-2]))?$|^([0-9a-fA-F]{1,4}:){6}((25[0-5]|2[0-4][0-9]|[01]?[0-9]\
[0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^::(\
[0-9a-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:):([0-9a-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\
[0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))\
))?$|^([0-9a-fA-F]{1,4}:){2}:([0-9a-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]\
|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){3}:([0-9a-fA-F]\
{1,4}:){0,1}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|\
(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){4}:((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4]\
[0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^:((:[0-9a-fA-F]{1,4}){1,6}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]\
))))?$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,5}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]\
{1,4}:){2}((:[0-9a-fA-F]{1,4}){1,4}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){3}\
((:[0-9a-fA-F]{1,4}){1,3}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){4}((:[0-9a-fA-F]\
{1,4}){1,2}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){5}:([0-9a-fA-F]{1,4})?\
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){6}:(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$"
static PCMHI_OBJECT g_pObject = NULL;
static OBJECT_K g_objItem[MAX_OBJ];
int regex_match(const char *regex, const char *pStr)
{
int result = FALSE;
regex_t reg;
int regexInit;
if(!regex || !pStr) {
LOG_EX(LOG_Error, "Input params error: %p, %p\n", regex, pStr);
return FALSE;
}
regexInit = regcomp(&reg, regex, REG_EXTENDED);
if(regexInit) {
LOG_EX(LOG_Error, "regcomp error\n");
return FALSE;
} else {
int reti = regexec(&reg, pStr, 0, NULL, 0);
if(REG_NOERROR != reti) {
char buf[1024];
memset(buf, 0, 1024);
//Error print: match failed!
regerror(reti, regexInit, buf, 1024);
LOG_EX(LOG_Error, "%s match %s failed(%d): %s\n", regex, pStr, reti, buf);
} else {
//LOG_EX(LOG_Debug, "%s match %s OK\n", regex, pStr);
result = TRUE;
}
}
regfree(&reg);
return result;
}
static pthread_mutex_t g_obj_lock = PTHREAD_MUTEX_INITIALIZER;
int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
{
char *pStr = (char *)pInput;
char *p;
char *pDump;
if(!pInput || !pFirst || !pSecond) {
LOG_EX(LOG_Error, "Input params error: %p, %p, %p\n", pInput, pFirst, pSecond);
return -RET_INPUTERR;
}
pDump = strdup(pInput);
p = strsep(&pStr, split);
if(strlen(p) == 0) {
@ -94,8 +48,10 @@ int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
*pSecond = pStr;
}
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pInput, *pFirst, *pSecond);
/* LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pDump, *pFirst,
*pSecond); */
free(pDump);
return RET_OK;
}
@ -112,37 +68,93 @@ static int get_free_pos(void)
return -1;
}
static void prase_port_object(PSVR_OBJECT pSvr)
static void dump_object(void)
{
int i = 0;
int i;
PCMHI_OBJECT pObj, pTmp;
if(!pSvr) {
return;
pthread_mutex_lock(&g_obj_lock);
HASH_ITER(hh, g_pObject, pObj, pTmp) {
LOG_EX(LOG_Info, "name: %s\n", pObj->name);
LOG_EX(LOG_Info, "desc: %s\n", pObj->desc);
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, "items: %d\n", g_objItem[pObj->obj_index].ctx_num);
for(i = 0; i < g_objItem[pObj->obj_index].ctx_num; i++) {
POBJECT_K pObjK = &g_objItem[pObj->obj_index];
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
LOG_EX(LOG_Info, " porType: %d\n", pObjK->objs.svr_obj[i].pro_type);
LOG_EX(LOG_Info, " min Port: %d\n", pObjK->objs.svr_obj[i].min_port);
LOG_EX(LOG_Info, " min Port: %d\n", pObjK->objs.svr_obj[i].max_port);
break;
case OBJ_TYPE_ADDR:
LOG_EX(LOG_Info, " ip_version: %d\n", pObjK->objs.addr_obj[i].ip_version);
LOG_EX(LOG_Info, " netmask: %u\n", pObjK->objs.addr_obj[i].net_mask);
if(IP_V4 == pObjK->objs.addr_obj[i].ip_version) {
LOG_EX(LOG_Info, " min addr: %08X\n",
pObjK->objs.addr_obj[i].min_addr.addr_v4.ip4_addr);
LOG_EX(LOG_Info, " max addr: %08X\n",
pObjK->objs.addr_obj[i].max_addr.addr_v4.ip4_addr);
} else {
LOG_EX(LOG_Info,
" min addr: %04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X\n",
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[0],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[1],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[2],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[3],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[4],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[6],
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[7]);
LOG_EX(LOG_Info,
" max addr: %04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X\n",
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[0],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[1],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[2],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[3],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[4],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[5],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[6],
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[7]);
}
for(i = 0; i < strlen(pSvr->str_val); i++) {
//if(pSvr->str_val[i] >)
break;
case OBJ_TYPE_DATETIME:
LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[i].rep_mode);
LOG_EX(LOG_Info, " min time: %ld\n", pObjK->objs.dt_obj[i].min_time);
LOG_EX(LOG_Info, " max time: %ld\n", pObjK->objs.dt_obj[i].max_time);
break;
}
if(strchr(pSvr->str_val, ',') != NULL) {
} else if(strchr(pSvr->str_val, '-') != NULL) {
}
}
pthread_mutex_unlock(&g_obj_lock);
}
int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
{
int i, pos;
PCMHI_OBJECT p;
PDT_OBJECT pDt;
ADDR_OBJECT pAddr;
if(!pObj || !pObjK) {
LOG_EX(LOG_Error, "Input params error %p, %p\n", pObj, pObjK);
return -RET_INPUTERR;
}
pthread_mutex_lock(&g_obj_lock);
HASH_FIND_STR(g_pObject, pObj->name, p);
pthread_mutex_unlock(&g_obj_lock);
if(p != NULL) {
LOG_EX(LOG_Error, "Item %s exists\n", pObj->name);
return -RET_EXIST;
}
pos = get_free_pos();
if(pos < 0) {
@ -157,49 +169,55 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
char *pSubStart = NULL, *pSubEnd = NULL;
PSVR_OBJECT pSvr = &pObjK->objs.svr_obj[i];
PADDR_OBJECT pAddr = &pObjK->objs.addr_obj[i];
split_params(pSvr->str_val, &pStart, &pEnd, "-");
PDT_OBJECT pDt = &pObjK->objs.dt_obj[i];
struct tm tm;
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
if(regex_match(REGEX_SVR_PORT, pStart)) {
split_params((char*)pSvr->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_SVR_PORT, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
return -RET_INPUTERR;
} else {
int first;
first = strtoul(pStart, NULL, 10);
pSvr->min_port = first;
pSvr->max_port = 0;
}
if(pEnd && strlen(pEnd) > 0) {
unsigned short first, last;
int last;
if(regex_match(REGEX_SVR_PORT, pEnd)) {
if(!pcre_match(REGEX_SVR_PORT, pEnd)) {
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
return -RET_INPUTERR;
}
first = strtoul(pStart, NULL, 10) & 0xFFFF;
last = strtoul(pEnd, NULL, 10) & 0xFFFF;
//first = strtoul(pStart, NULL, 10);
last = strtoul(pEnd, NULL, 10);
if(pSvr->pro_type <= PORT_UDP) {
pSvr->min_port = htons(first);
pSvr->max_port = htons(last);
//pSvr->min_port = htonl(first) & 0xFFFF;
pSvr->max_port = last;
} else {
pSvr->min_port = first;
//ICMP , min_port --> type, max_port --> code
//pSvr->min_port = first;
pSvr->max_port = last;
}
} else {
unsigned short first;
first = strtoul(pStart, NULL, 10) & 0xFFFF;
pSvr->min_port = htons(first);
pSvr->max_port = 0;
}
break;
case OBJ_TYPE_ADDR:
if(regex_match(REGEX_IP_ADDR, pStart)) {
split_params((char*)pAddr->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_IP_ADDR, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
return -RET_INPUTERR;
}
split_params(pStart, &pSubStart, &pSubEnd, "/");
split_params((char*)pStart, &pSubStart, &pSubEnd, "/");
if(pSubEnd && strlen(pSubEnd) > 0) {
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
@ -214,16 +232,16 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
pAddr->ip_version = IP_V4;
} else {
pAddr->ip_version = IP_V6;
if(inet_pton(AF_INET6, pSubStart, &pAddr->min_addr.addr_v6.addr.addr8) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pStart);
return -RET_INPUTERR;
}
pAddr->ip_version = IP_V6;
}
if(pEnd && strlen(pEnd) > 0) {
if(regex_match(REGEX_IP_ADDR, pEnd)) {
if(!pcre_match(REGEX_IP_ADDR, pEnd)) {
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
return -RET_INPUTERR;
}
@ -245,23 +263,73 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
break;
case OBJ_TYPE_DATETIME:
split_params((char*)pDt->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_DT, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
return -RET_INPUTERR;
} else {
memset(&tm, 0, sizeof(struct tm));
// YYYY/MM/DD HH:MM 格式
if(strlen(pStart) > strlen("00:00")) {
strptime(pStart, "%Y/%m/%d %H:%M", &tm);
} else {
strptime(pStart, "%H:%M", &tm);
}
if(tm.tm_year < 119) {
tm.tm_year = 119;
}
if(tm.tm_mday < 1) {
tm.tm_mday = 1;
}
pDt->min_time = mktime(&tm);
pDt->max_time = 0;
}
if(pEnd && strlen(pEnd) > 0) {
if(!pcre_match(REGEX_DT, pEnd)) {
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
return -RET_INPUTERR;
}
memset(&tm, 0, sizeof(struct tm));
if(strlen(pEnd) > strlen("00:00")) {
strptime(pEnd, "%Y/%m/%d %H:%M", &tm);
} else {
strptime(pEnd, "%H:%M", &tm);
}
if(tm.tm_year < 119) {
tm.tm_year = 119;
}
if(tm.tm_mday < 1) {
tm.tm_mday = 1;
}
pDt->max_time = mktime(&tm);
}
//LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[j].rep_mode);
//LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.dt_obj[j].str_val);
break;
}
memcpy(&g_objItem[pos], pObjK, sizeof(OBJECT_K));
}
pObj->obj_index = pos;
pthread_mutex_init(&pObj->lock, NULL);
HASH_FIND_STR(g_pObject, pObj->name, p);
if(p != NULL) {
LOG_EX(LOG_Error, "Item %s exists\n", pObj->name);
return -RET_EXIST;
}
pthread_mutex_lock(&g_obj_lock);
HASH_ADD_STR(g_pObject, name, pObj);
pthread_mutex_unlock(&g_obj_lock);
}
static const char *read_json_file(const char *pPath)
@ -312,7 +380,7 @@ static void test_add_object(void)
if(ret != RET_OK || p == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
free(pJson);
free((void*)pJson);
return;
}
@ -328,11 +396,11 @@ static void test_add_object(void)
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
if(p->msgContent) {
free(p->msgContent);
free((void*)p->msgContent);
}
free(p);
free(pJson);
free((void*)pJson);
return;
}
@ -363,18 +431,21 @@ static void test_add_object(void)
}
}
object_add(&pAdd->pCtx[i].obj, &pAdd->pCtx[i].objk);
}
dump_object();
if(pAdd) {
free(pAdd);
}
if(p->msgContent) {
free(p->msgContent);
free((void*)p->msgContent);
}
free(p);
free(pJson);
free((void*)pJson);
}
static void test_strsep(char *pVal)
@ -383,7 +454,8 @@ static void test_strsep(char *pVal)
split_params(pVal, &pStart, &pEnd, "-");
if(pEnd) {
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pVal, pStart, pEnd);
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pVal, pStart,
pEnd);
} else {
LOG_EX(LOG_Debug, "[%s] Split to First = %s\n", pVal, pStart);
}
@ -391,8 +463,13 @@ static void test_strsep(char *pVal)
static void test_regex(char *pVal)
{
LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, regex_match(REGEX_IP_ADDR, pVal));
//LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, regex_match(REGEX_SVR_PORT, pVal));
if(pcre_match(REGEX_IP_ADDR, pVal)) {
LOG_EX(LOG_Debug, "[%s] ==> Match\n", pVal);
} else {
LOG_EX(LOG_Error, "[%s] ==> Not Match\n", pVal);
}
//LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, pcre_match(REGEX_SVR_PORT, pVal));
}
static void test_ipaddr_format(char *pVal)
@ -404,7 +481,7 @@ static void test_ipaddr_format(char *pVal)
memset(&ip_v4, 0, sizeof(IP4_ADDR));
memset(&ip_v6, 0, sizeof(IP6_ADDR));
ret = regex_match(REGEX_IP_ADDR, pVal);
ret = pcre_match(REGEX_IP_ADDR, pVal);
if(ret != TRUE) {
LOG_EX(LOG_Error, "Verify ipadd format error\n");
@ -420,6 +497,41 @@ static void test_ipaddr_format(char *pVal)
LOG_EX(LOG_Debug, "Convert %s to ip address ret: %d\n", pVal, ret);
}
static void test_str_time(char *pVal)
{
struct tm tm;
char buf[255];
if(!pVal || strlen(pVal) < 0) {
LOG_EX(LOG_Error, "Input params error\n");
return;
}
memset(&tm, 0, sizeof(struct tm));
strptime(pVal, "%H:%M", &tm);
memset(buf, 0, sizeof(buf));
LOG_EX(LOG_Debug, "year = %d, month = %d, day = %d\n", tm.tm_year, tm.tm_mon,
tm.tm_mday);
if(tm.tm_year < 119) {
tm.tm_year = 119;
}
if(tm.tm_mday < 1) {
tm.tm_mday = 1;
}
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", &tm);
LOG_EX(LOG_Debug, "asctime: %s / %d\n", buf, mktime(&tm));
memset(&tm, 0, sizeof(struct tm));
strptime(pVal, "%Y/%m/%d %H:%M", &tm);
memset(buf, 0, sizeof(buf));
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", &tm);
LOG_EX(LOG_Debug, "asctime: %s / %d\n", buf, mktime(&tm));
}
/**
* @brief
* @param argc
@ -437,6 +549,7 @@ int main(int argc, char **argv)
{ "regex", 1, NULL, 'r' },
{ "split_str", 1, NULL, 's' },
{ "ip_addr", 1, NULL, 'p' },
{ "str_time", 1, NULL, 't' },
{NULL, 0, NULL, 0}
};
@ -447,8 +560,9 @@ int main(int argc, char **argv)
LOG_EX(LOG_Debug, "DT_OBJECT = %u bytes\n", sizeof(DT_OBJECT));
LOG_EX(LOG_Debug, "SVR_OBJECT = %u bytes\n", sizeof(SVR_OBJECT));
LOG_EX(LOG_Debug, "ADDR_OBJECT = %u bytes\n", sizeof(ADDR_OBJECT));
LOG_EX(LOG_Debug, "time_t = %u bytes\n", sizeof(time_t));
while((c = getopt_long(argc, argv, "hvir:s:p:", long_opts, &optidx)) != -1) {
while((c = getopt_long(argc, argv, "hvir:s:p:t:", long_opts, &optidx)) != -1) {
switch(c) {
case 'v':
LOG_EX(LOG_Info, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS);
@ -479,6 +593,10 @@ int main(int argc, char **argv)
case 'p':
test_ipaddr_format(optarg);
break;
case 't':
test_str_time(optarg);
break;
}
}

View File

@ -78,8 +78,8 @@ typedef struct {
} SVR_OBJECT, *PSVR_OBJECT;
typedef struct {
unsigned long min_time; ///< 起始时间
unsigned long max_time; ///< 终止时间
long min_time; ///< 起始时间
long max_time; ///< 终止时间
REPEAT_MODE rep_mode; ///< 重复模式
const char* str_val; ///< 字符串配置值
} DT_OBJECT, *PDT_OBJECT;

View File

@ -0,0 +1,164 @@
#include <pcre.h>
#include "log.h"
#include "regex_table.h"
const char *g_regex_tbl[REGEX_MAX] = {
"^(([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]$",
};
int pcre_match(int regId, const char *pStr)
{
pcre *re;
pcre_extra *pcreExtra;
const char *error;
int ret, erroffset;
if(regId < 0 || regId > REGEX_MAX || !pStr) {
LOG_EX(LOG_Error, "Input params error: %d, %p\n", regId, pStr);
return FALSE;
}
re = pcre_compile(g_regex_tbl[regId], 0, &error, &erroffset, NULL);
if(!re) {
LOG_EX(LOG_Error, "pcre_compile error at %d: %s, %s\n", erroffset,
g_regex_tbl[regId], error);
return FALSE;
}
pcreExtra = pcre_study(re, 0, &error);
if(error != NULL) {
LOG_EX(LOG_Error, "pcre_study error: %s, %s\n", g_regex_tbl[regId], 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)
{
int result = FALSE;
regex_t reg;
int regexInit;
if(!regex || !pStr) {
LOG_EX(LOG_Error, "Input params error: %p, %p\n", regex, pStr);
return FALSE;
}
regexInit = regcomp(&reg, regex, REG_EXTENDED);
if(regexInit) {
LOG_EX(LOG_Error, "regcomp error\n");
return FALSE;
} else {
int reti = regexec(&reg, pStr, 0, NULL, 0);
if(REG_NOERROR != reti) {
char buf[1024];
memset(buf, 0, 1024);
//Error print: match failed!
regerror(reti, regexInit, buf, 1024);
LOG_EX(LOG_Error, "%s match %s failed(%d): %s\n", regex, pStr, reti, buf);
} else {
//LOG_EX(LOG_Debug, "%s match %s OK\n", regex, pStr);
result = TRUE;
}
}
regfree(&reg);
return result;
}
#endif

View File

@ -0,0 +1,22 @@
#ifndef _REGEX_TABLE_H
#define _REGEX_TABLE_H
typedef enum {
REGEX_SVR_PORT = 0,
REGEX_IP_ADDR = 1,
REGEX_DT = 2,
REGEX_TIME = 3,
// add before this line
REGEX_MAX
} REGEX_TBL_ID;
#ifdef __cplusplus
extern "C" {
#endif
int pcre_match(int regId, const char *pStr);
#ifdef __cplusplus
}
#endif
#endif