#include #include #include #include #include #include #include #include #include #include #include #include #include #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 DEL_JS_FILE ("/home/hx/secogateway/Product/user/object_manager/json_test/del.json") static PCMHI_OBJECT g_pObject = NULL; static OBJECT_K g_objItem[MAX_OBJ]; static pthread_mutex_t g_obj_lock = PTHREAD_MUTEX_INITIALIZER; static 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) { *pFirst = pInput; *pSecond = NULL; } else { *pFirst = p; *pSecond = pStr; } /* LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pDump, *pFirst, *pSecond); */ free(pDump); 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 dump_object(void) { int i; PCMHI_OBJECT pObj, pTmp; 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]); } 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; } } } pthread_mutex_unlock(&g_obj_lock); } int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK) { int i, pos; PCMHI_OBJECT p; 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) { 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]; PDT_OBJECT pDt = &pObjK->objs.dt_obj[i]; struct tm tm; switch(pObjK->type / 10) { case OBJ_TYPE_SERVER: 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) { int last; 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); last = strtoul(pEnd, NULL, 10); if(pSvr->pro_type <= PORT_UDP) { //pSvr->min_port = htonl(first) & 0xFFFF; pSvr->max_port = last; } else { //ICMP , min_port --> type, max_port --> code //pSvr->min_port = first; pSvr->max_port = last; } } break; case OBJ_TYPE_ADDR: 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((char *)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 { 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(!pcre_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: 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); pthread_mutex_lock(&g_obj_lock); HASH_ADD_STR(g_pObject, name, pObj); pthread_mutex_unlock(&g_obj_lock); } int object_del(const char *pName) { PCMHI_OBJECT p, pTmp; pthread_mutex_lock(&g_obj_lock); HASH_FIND_STR(g_pObject, pName, p); pthread_mutex_unlock(&g_obj_lock); if(p == NULL) { LOG_EX(LOG_Error, "Item %s not exists\n", pName); return -RET_NOTFOUND; } if(g_objItem[p->obj_index].ref_count > 0) { LOG_EX(LOG_Error, "Item %s used %d\n", p->name, g_objItem[p->obj_index].ref_count); return -RET_USED; } pthread_mutex_lock(&g_obj_lock); HASH_DEL(g_pObject, p); pthread_mutex_unlock(&g_obj_lock); memset(&g_objItem[p->obj_index].memTag, 0, sizeof(OBJECT_K)); free(p); return RET_OK; } 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_del_object(void) { int i, ret; const char *pRetJson; IFC_RET_MSG retCtx; PIFACE_DEL_OBJ pDel = NULL; PJSON_INTERFACE p = NULL; const char *pJson = read_json_file(DEL_JS_FILE); ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE); memset(&retCtx, 0, sizeof(IFC_RET_MSG)); if(ret != RET_OK || p == 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); } retCtx.ret_code = -RET_JSONERR; retCtx.mesg = get_err_message(RET_JSONERR); retCtx.n_items = 0; pRetJson = Struct2Json(&retCtx, JE_OBJ_DEL, 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, &pDel, JE_OBJ_DEL, FALSE); if(ret != RET_OK || pDel == NULL) { LOG_EX(LOG_Error, "Decode json error: %d\n", ret); if(pDel) { free(pDel); } 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_DEL, 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; } else { retCtx.n_items = pDel->n_obj; } for(i = 0; i < pDel->n_obj; i++) { ret = object_del(pDel->name[i]); if(ret != RET_OK && retCtx.ret_code == RET_OK) { retCtx.ret_code = ret; } retCtx.data[i].name = pDel->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_ADD, FALSE, &ret); if(!pRetJson || ret != RET_OK) { LOG_EX(LOG_Error, "Json format error: %d\n", ret); if(pRetJson) { free((void *)pRetJson); } free(pDel); 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(pDel); if(p->msgContent) { free((void *)p->msgContent); } free(p); free((void *)pJson); } static void test_add_object(void) { int i, ret; const char *pRetJson; IFC_RET_MSG retCtx; PJSON_INTERFACE p = NULL; PIFACE_ADD_OBJ pAdd = NULL; const char *pJson = read_json_file(ADD_JS_FILE); ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE); memset(&retCtx, 0, sizeof(IFC_RET_MSG)); if(ret != RET_OK || p == 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); } retCtx.ret_code = -RET_JSONERR; retCtx.mesg = get_err_message(RET_JSONERR); retCtx.n_items = 0; pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, 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, &pAdd, JE_OBJ_ADD, FALSE); if(ret != RET_OK || pAdd == NULL || pAdd->pCtx == NULL) { LOG_EX(LOG_Error, "Decode json error: %d\n", ret); if(pAdd) { if(pAdd->pCtx) { free(pAdd->pCtx); } free(pAdd); } 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_ADD, 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; } else { retCtx.n_items = pAdd->n_obj; } for(i = 0; i < pAdd->n_obj; i++) { LOG_EX(LOG_Debug, "%d: %s\n", i, pAdd->pCtx[i].pObj->name); ret = object_add(pAdd->pCtx[i].pObj, &pAdd->pCtx[i].objk); if(ret != RET_OK && retCtx.ret_code == RET_OK) { retCtx.ret_code = ret; } retCtx.data[i].name = pAdd->pCtx[i].pObj->name; 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_ADD, FALSE, &ret); if(!pRetJson || ret != RET_OK) { LOG_EX(LOG_Error, "Json format error: %d\n", ret); if(pRetJson) { free((void *)pRetJson); } if(pAdd->pCtx) { free(pAdd->pCtx); } free(pAdd); 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); if(pAdd->pCtx) { free(pAdd->pCtx); } free(pAdd); if(p->msgContent) { free((void *)p->msgContent); } free(p); free((void *)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) { 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) { 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 = pcre_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); } 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 输入参数个数 * @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' }, { "str_time", 1, NULL, 't' }, {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)); LOG_EX(LOG_Debug, "time_t = %u bytes\n", sizeof(time_t)); 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); 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(); test_del_object(); break; case 's': test_strsep(optarg); break; case 'r': test_regex(optarg); break; case 'p': test_ipaddr_format(optarg); break; case 't': test_str_time(optarg); break; } } while(TRUE) { sleep(1); } return 0; }