491 lines
15 KiB
C
491 lines
15 KiB
C
|
#include <stdio.h>
|
||
|
#include <unistd.h>
|
||
|
#include <getopt.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <errno.h>
|
||
|
#include <string.h>
|
||
|
#include <regex.h>
|
||
|
#include <pthread.h>
|
||
|
#include <uthash/uthash.h>
|
||
|
#include <arpa/inet.h>
|
||
|
|
||
|
#include "compile.h"
|
||
|
#include "log.h"
|
||
|
#include "object_manager.h"
|
||
|
#include "json_interface.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(®, regex, REG_EXTENDED);
|
||
|
|
||
|
if(regexInit) {
|
||
|
LOG_EX(LOG_Error, "regcomp error\n");
|
||
|
return FALSE;
|
||
|
} else {
|
||
|
int reti = regexec(®, 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(®);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
|
||
|
{
|
||
|
char *pStr = (char *)pInput;
|
||
|
char *p;
|
||
|
|
||
|
if(!pInput || !pFirst || !pSecond) {
|
||
|
LOG_EX(LOG_Error, "Input params error: %p, %p, %p\n", pInput, pFirst, pSecond);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
|
||
|
p = strsep(&pStr, split);
|
||
|
|
||
|
if(strlen(p) == 0) {
|
||
|
*pFirst = pInput;
|
||
|
*pSecond = NULL;
|
||
|
} else {
|
||
|
*pFirst = p;
|
||
|
*pSecond = pStr;
|
||
|
}
|
||
|
|
||
|
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pInput, *pFirst, *pSecond);
|
||
|
|
||
|
return RET_OK;
|
||
|
}
|
||
|
|
||
|
static int get_free_pos(void)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for(i = 0; i < MAX_OBJ; i++) {
|
||
|
if(strlen(g_objItem[i].memTag) == 0) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
static void prase_port_object(PSVR_OBJECT pSvr)
|
||
|
{
|
||
|
int i = 0;
|
||
|
|
||
|
if(!pSvr) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(i = 0; i < strlen(pSvr->str_val); i++) {
|
||
|
//if(pSvr->str_val[i] >)
|
||
|
}
|
||
|
|
||
|
if(strchr(pSvr->str_val, ',') != NULL) {
|
||
|
|
||
|
} else if(strchr(pSvr->str_val, '-') != NULL) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
pos = get_free_pos();
|
||
|
|
||
|
if(pos < 0) {
|
||
|
LOG_EX(LOG_Error, "Share memory full\n");
|
||
|
return -RET_NOMEM;
|
||
|
}
|
||
|
|
||
|
strcpy(pObjK->memTag, OBJ_MEM_TAG);
|
||
|
|
||
|
for(i = 0; i < pObjK->ctx_num && i < MAX_OBJ_CONTENT; i++) {
|
||
|
char *pStart = NULL, *pEnd = NULL;
|
||
|
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, "-");
|
||
|
|
||
|
switch(pObjK->type / 10) {
|
||
|
case OBJ_TYPE_SERVER:
|
||
|
if(regex_match(REGEX_SVR_PORT, pStart)) {
|
||
|
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
|
||
|
if(pEnd && strlen(pEnd) > 0) {
|
||
|
unsigned short first, last;
|
||
|
|
||
|
if(regex_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;
|
||
|
|
||
|
if(pSvr->pro_type <= PORT_UDP) {
|
||
|
pSvr->min_port = htons(first);
|
||
|
pSvr->max_port = htons(last);
|
||
|
} else {
|
||
|
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)) {
|
||
|
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
|
||
|
split_params(pStart, &pSubStart, &pSubEnd, "/");
|
||
|
|
||
|
if(pSubEnd && strlen(pSubEnd) > 0) {
|
||
|
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
|
||
|
}
|
||
|
|
||
|
// IPv4 格式
|
||
|
if(strchr(pStart, ':') == NULL) {
|
||
|
if(inet_pton(AF_INET, pSubStart, &pAddr->min_addr.addr_v4.ip4_addr) != 1) {
|
||
|
LOG_EX(LOG_Error, "%s convert to ip address error\n", pStart);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(pEnd && strlen(pEnd) > 0) {
|
||
|
if(regex_match(REGEX_IP_ADDR, pEnd)) {
|
||
|
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
|
||
|
if(pAddr->ip_version == IP_V4) {
|
||
|
if(inet_pton(AF_INET, pEnd, &pAddr->max_addr.addr_v4.ip4_addr) != 1) {
|
||
|
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
} else {
|
||
|
if(inet_pton(AF_INET6, pEnd, &pAddr->max_addr.addr_v6.addr.addr8) != 1) {
|
||
|
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
|
||
|
return -RET_INPUTERR;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val);
|
||
|
break;
|
||
|
|
||
|
case OBJ_TYPE_DATETIME:
|
||
|
//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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
HASH_ADD_STR(g_pObject, name, pObj);
|
||
|
}
|
||
|
|
||
|
static const char *read_json_file(const char *pPath)
|
||
|
{
|
||
|
FILE *pFile;
|
||
|
unsigned char *pBuf;
|
||
|
|
||
|
int f_size = 0;
|
||
|
|
||
|
GET_FILE_SIZE(pPath, f_size);
|
||
|
|
||
|
if(f_size <= 0) {
|
||
|
LOG_EX(LOG_Error, "Get file %p size error: %d\n", pPath, f_size);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pBuf = (unsigned char *)malloc(f_size + 1);
|
||
|
|
||
|
if(!pBuf) {
|
||
|
LOG_EX(LOG_Error, "Malloc %d bytes memory error: %d\n", f_size + 1);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pFile = fopen(pPath, "r");
|
||
|
|
||
|
if(!pFile) {
|
||
|
LOG_EX(LOG_Error, "Open file %p size error\n", pPath);
|
||
|
free(pBuf);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
fread(pBuf, 1, f_size, pFile);
|
||
|
fclose(pFile);
|
||
|
|
||
|
pBuf[f_size] = 0;
|
||
|
|
||
|
return (const char *)pBuf;
|
||
|
}
|
||
|
|
||
|
static void test_add_object(void)
|
||
|
{
|
||
|
PJSON_INTERFACE p = NULL;
|
||
|
PIFACE_ADD_OBJ pAdd = NULL;
|
||
|
int i, j, ret;
|
||
|
const char *pJson = read_json_file(ADD_JS_FILE);
|
||
|
|
||
|
ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE);
|
||
|
|
||
|
if(ret != RET_OK || p == NULL) {
|
||
|
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
|
||
|
free(pJson);
|
||
|
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, &pAdd, JE_OBJ_ADD, FALSE);
|
||
|
|
||
|
if(ret != RET_OK || pAdd == NULL) {
|
||
|
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
|
||
|
|
||
|
if(p->msgContent) {
|
||
|
free(p->msgContent);
|
||
|
}
|
||
|
|
||
|
free(p);
|
||
|
free(pJson);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(i = 0; i < pAdd->n_obj; i++) {
|
||
|
LOG_EX(LOG_Info, "name: %s\n", pAdd->pCtx[i].obj.name);
|
||
|
LOG_EX(LOG_Info, "desc: %s\n", pAdd->pCtx[i].obj.desc);
|
||
|
LOG_EX(LOG_Info, "prio: %d\n", pAdd->pCtx[i].obj.prio);
|
||
|
LOG_EX(LOG_Info, "type: %d\n", pAdd->pCtx[i].objk.type);
|
||
|
LOG_EX(LOG_Info, "items: %d\n", pAdd->pCtx[i].objk.ctx_num);
|
||
|
|
||
|
for(j = 0; j < pAdd->pCtx[i].objk.ctx_num; j++) {
|
||
|
POBJECT_K pObjK = &pAdd->pCtx[i].objk;
|
||
|
|
||
|
switch(pObjK->type / 10) {
|
||
|
case OBJ_TYPE_SERVER:
|
||
|
LOG_EX(LOG_Info, " porType: %d\n", pObjK->objs.svr_obj[j].pro_type);
|
||
|
LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.svr_obj[j].str_val);
|
||
|
break;
|
||
|
|
||
|
case OBJ_TYPE_ADDR:
|
||
|
LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val);
|
||
|
break;
|
||
|
|
||
|
case OBJ_TYPE_DATETIME:
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if(pAdd) {
|
||
|
free(pAdd);
|
||
|
}
|
||
|
|
||
|
if(p->msgContent) {
|
||
|
free(p->msgContent);
|
||
|
}
|
||
|
|
||
|
free(p);
|
||
|
free(pJson);
|
||
|
}
|
||
|
|
||
|
static void test_strsep(char *pVal)
|
||
|
{
|
||
|
char *pStart = NULL, *pEnd = NULL;
|
||
|
split_params(pVal, &pStart, &pEnd, "-");
|
||
|
|
||
|
if(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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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));
|
||
|
}
|
||
|
|
||
|
static void test_ipaddr_format(char *pVal)
|
||
|
{
|
||
|
int ret = 0;
|
||
|
IP4_ADDR ip_v4;
|
||
|
IP6_ADDR ip_v6;
|
||
|
|
||
|
memset(&ip_v4, 0, sizeof(IP4_ADDR));
|
||
|
memset(&ip_v6, 0, sizeof(IP6_ADDR));
|
||
|
|
||
|
ret = regex_match(REGEX_IP_ADDR, pVal);
|
||
|
|
||
|
if(ret != TRUE) {
|
||
|
LOG_EX(LOG_Error, "Verify ipadd format error\n");
|
||
|
}
|
||
|
|
||
|
if(strchr(pVal, ':') == NULL) {
|
||
|
ret = inet_pton(AF_INET, pVal, &ip_v4.ip4_addr);
|
||
|
print_hex_dump_bytes("IP", 0, &ip_v4, sizeof(IP4_ADDR));
|
||
|
} else {
|
||
|
ret = inet_pton(AF_INET6, pVal, ip_v6.addr.addr8);
|
||
|
print_hex_dump_bytes("IP", 0, &ip_v6, sizeof(IP6_ADDR));
|
||
|
}
|
||
|
|
||
|
LOG_EX(LOG_Debug, "Convert %s to ip address ret: %d\n", pVal, ret);
|
||
|
}
|
||
|
/**
|
||
|
* @brief 应用程序主函数
|
||
|
* @param argc 输入参数个数
|
||
|
* @param argv 输入参数详细内容
|
||
|
* @return 0
|
||
|
*/
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
int c, optidx = 0;
|
||
|
static const struct option long_opts[] = {
|
||
|
{ "help", no_argument, NULL, 'h' },
|
||
|
{ "version", no_argument, NULL, 'v' },
|
||
|
// TODO 添加其它需要处理的参数配置
|
||
|
{ "interface", no_argument, NULL, 'i' },
|
||
|
{ "regex", 1, NULL, 'r' },
|
||
|
{ "split_str", 1, NULL, 's' },
|
||
|
{ "ip_addr", 1, NULL, 'p' },
|
||
|
{NULL, 0, NULL, 0}
|
||
|
};
|
||
|
|
||
|
IHW_InitLOG("obj", NULL, TRUE);
|
||
|
|
||
|
|
||
|
LOG_EX(LOG_Debug, "OBJECT_K = %u bytes\n", sizeof(OBJECT_K));
|
||
|
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));
|
||
|
|
||
|
while((c = getopt_long(argc, argv, "hvir:s:p:", long_opts, &optidx)) != -1) {
|
||
|
switch(c) {
|
||
|
case 'v':
|
||
|
LOG_EX(LOG_Info, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS);
|
||
|
break;
|
||
|
|
||
|
case '?':
|
||
|
case 'h':
|
||
|
LOG_EX2(LOG_Info, "Usage: %s [-h] [-v] ...\n", argv[0]);
|
||
|
LOG_EX2(LOG_Info, "options:\n");
|
||
|
LOG_EX2(LOG_Info, "\t-v, --version show program version\n");
|
||
|
LOG_EX2(LOG_Info, "\t-h, --help print this message\n");
|
||
|
LOG_EX2(LOG_Info, "\t-i, --interface test object add interface\n");
|
||
|
break;
|
||
|
|
||
|
//TODO 添加其它必要处理参数过程
|
||
|
case 'i':
|
||
|
test_add_object();
|
||
|
break;
|
||
|
|
||
|
case 's':
|
||
|
test_strsep(optarg);
|
||
|
break;
|
||
|
|
||
|
case 'r':
|
||
|
test_regex(optarg);
|
||
|
break;
|
||
|
|
||
|
case 'p':
|
||
|
test_ipaddr_format(optarg);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
while(TRUE) {
|
||
|
sleep(1);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|