Mod aaa-12 修改静态路由内存泄漏问题

SOL
修改人:tongyebin
检视人:
This commit is contained in:
tongyebin 2019-09-09 14:40:56 +08:00
parent a266a1b4b0
commit dff4a537f2
2 changed files with 224 additions and 122 deletions

View File

@ -25,6 +25,14 @@
#define IPV6_VERSION 6 #define IPV6_VERSION 6
#define ACTION_LENGTH 10 #define ACTION_LENGTH 10
#define BOTH_GW_AND_DEV 1
#define ONLY_GW 2
#define ONLY_DEV 3
#define IPV4_MIN_NETMASK 0
#define IPV4_MAX_NETMASK 32
#define STATIC_ROUTING_PATH "/etc/network/static_routing" #define STATIC_ROUTING_PATH "/etc/network/static_routing"

View File

@ -48,6 +48,7 @@ ret_code routing_to_json(int count, routing_t *buff_total, pointer output, int *
if(json_array == NULL) if(json_array == NULL)
{ {
cJSON_Delete(json_array); cJSON_Delete(json_array);
cJSON_Delete(ret_root);
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
if(count > 0) if(count > 0)
@ -81,6 +82,8 @@ ret_code routing_to_json(int count, routing_t *buff_total, pointer output, int *
cJSON_AddItemToObject(ret_root,"route",json_array); cJSON_AddItemToObject(ret_root,"route",json_array);
} }
rpc_json_print(ret_root); rpc_json_print(ret_root);
json_routing = cJSON_PrintUnformatted(ret_root); json_routing = cJSON_PrintUnformatted(ret_root);
@ -98,12 +101,16 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
{ {
cJSON *json_obj, *operate, *route, *version, *destip, *netmask, *gateway, *dev, *metric; cJSON *json_obj, *operate, *route, *version, *destip, *netmask, *gateway, *dev, *metric;
json_obj = cJSON_Parse(input); if (NULL == input)
{
return RET_EMPTY_STRING;
}
json_obj = cJSON_Parse(input);
if(NULL == json_obj) if(NULL == json_obj)
{ {
rpc_log_info("json obj is NULL \n"); rpc_log_info("json obj is NULL \n");
cJSON_Delete(json_obj);
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
@ -111,7 +118,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
operate = cJSON_GetObjectItem(json_obj,"operate"); operate = cJSON_GetObjectItem(json_obj,"operate");
if(NULL == operate) if((NULL == operate) || (NULL == (operate->valuestring)))
{ {
cJSON_Delete(json_obj); cJSON_Delete(json_obj);
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
@ -129,10 +136,12 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
else if (strcmp(operate->valuestring,"getall") == 0) else if (strcmp(operate->valuestring,"getall") == 0)
{ {
*conf_type = CM_CONFIG_GET_ALL; *conf_type = CM_CONFIG_GET_ALL;
cJSON_Delete(json_obj);
return RET_OK; return RET_OK;
} }
else else
{ {
cJSON_Delete(json_obj);
return RET_WRONG_TYPE; return RET_WRONG_TYPE;
} }
@ -147,6 +156,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
version = cJSON_GetObjectItem(route,"version"); version = cJSON_GetObjectItem(route,"version");
if(!version) if(!version)
{ {
cJSON_Delete(json_obj);
return RET_VERSION_ERR; return RET_VERSION_ERR;
} }
else else
@ -157,8 +167,9 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
rpc_log_info("version:%d \n", conf_buff->version); rpc_log_info("version:%d \n", conf_buff->version);
destip = cJSON_GetObjectItem(route,"destip"); destip = cJSON_GetObjectItem(route,"destip");
if(!destip) if((!destip) || (NULL == (destip->valuestring)))
{ {
cJSON_Delete(json_obj);
return RET_DESTIP_ERR; return RET_DESTIP_ERR;
} }
else else
@ -170,6 +181,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
netmask = cJSON_GetObjectItem(route,"netmask"); netmask = cJSON_GetObjectItem(route,"netmask");
if((!netmask) || (netmask->valueint < 0) || (netmask->valueint > 128)) if((!netmask) || (netmask->valueint < 0) || (netmask->valueint > 128))
{ {
cJSON_Delete(json_obj);
return RET_NETMASK_ERR; return RET_NETMASK_ERR;
} }
else else
@ -179,9 +191,8 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
rpc_log_info("netmask:%d \n", conf_buff->netmask); rpc_log_info("netmask:%d \n", conf_buff->netmask);
gateway = cJSON_GetObjectItem(route,"gateway"); gateway = cJSON_GetObjectItem(route,"gateway");
if(!gateway) if((!gateway) || (NULL == (gateway->valuestring)))
{ {
//memset(conf_buff->gateway,'\0',sizeof(conf_buff->gateway));
strcpy(conf_buff->gateway,""); strcpy(conf_buff->gateway,"");
} }
else else
@ -191,7 +202,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
rpc_log_info("gateway:%s \n", conf_buff->gateway); rpc_log_info("gateway:%s \n", conf_buff->gateway);
dev = cJSON_GetObjectItem(route,"dev"); dev = cJSON_GetObjectItem(route,"dev");
if(!dev) if((!dev) || (NULL == (dev->valuestring)))
{ {
strcpy(conf_buff->dev,""); strcpy(conf_buff->dev,"");
} }
@ -205,6 +216,7 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
if((!metric) || (metric->valueint) < 0 || (metric->valueint) if((!metric) || (metric->valueint) < 0 || (metric->valueint)
> 10000) > 10000)
{ {
cJSON_Delete(json_obj);
return RET_METRIC_ERR; return RET_METRIC_ERR;
} }
else else
@ -214,7 +226,6 @@ ret_code routing_json_parse(pointer input, uint *conf_type, routing_t *conf_buff
rpc_log_info("metric:%d \n", conf_buff->metric); rpc_log_info("metric:%d \n", conf_buff->metric);
cJSON_Delete(json_obj); cJSON_Delete(json_obj);
return RET_OK; return RET_OK;
} }
@ -226,9 +237,14 @@ ret_code insert_into_file(char *string)
{ {
FILE *f; FILE *f;
ret_code ret = RET_OK; ret_code ret = RET_OK;
char temp_buff[LINE_MAX_LENGTH]; char temp_buff[LINE_MAX_LENGTH] = {0};
int flag = 0; int flag = 0;
if (NULL == string)
{
return RET_EMPTY_STRING;
}
rpc_log_info("string: %s\n",string); rpc_log_info("string: %s\n",string);
f = fopen (STATIC_ROUTING_PATH,"at+"); f = fopen (STATIC_ROUTING_PATH,"at+");
@ -269,10 +285,14 @@ ret_code insert_into_file(char *string)
/*从配置文件中删除*/ /*从配置文件中删除*/
ret_code delete_from_file(char *string) ret_code delete_from_file(char *string)
{ {
if (NULL == string)
{
return RET_EMPTY_STRING;
}
FILE *f; FILE *f;
ret_code ret = RET_ERR; ret_code ret = RET_ERR;
int length; char buff_line[LINE_MAX_LENGTH] = {0};
char buff_line[LINE_MAX_LENGTH];
int flag =0; int flag =0;
int string_length = strlen(string); int string_length = strlen(string);
rpc_log_info("string length:%d\n",string_length); rpc_log_info("string length:%d\n",string_length);
@ -285,12 +305,10 @@ ret_code delete_from_file(char *string)
} }
fseek(f,0,SEEK_END); fseek(f,0,SEEK_END);
length = ftell(f); int length = ftell(f);
char buff[length]; char buff[length];
memset(buff,0,sizeof(buff)); memset(buff,0,sizeof(buff));
memset(buff_line,0,sizeof(buff_line));
fseek(f,0,SEEK_SET); fseek(f,0,SEEK_SET);
@ -338,13 +356,13 @@ ret_code add_routing_exe (char *string)
int status; int status;
ret_code ret = RET_OK; ret_code ret = RET_OK;
rpc_log_info("string:%s\n",string);
if(NULL == string) if(NULL == string)
{ {
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
rpc_log_info("string:%s\n",string);
status = system(string); status = system(string);
if (-1 == status) if (-1 == status)
{ {
@ -426,22 +444,26 @@ ret_code del_routing_exe (char *string, char *string_del)
/*判断gatewaydev是否为空*/ /*判断gatewaydev是否为空*/
void judge_para(int *flag, char *gateway, char *dev) void judge_para(int *flag, char *gateway, char *dev)
{ {
if((NULL == flag) || (NULL == gateway) || (NULL == dev))
{
return RET_EMPTY_STRING;
}
if (strcmp(gateway,"") != 0) if (strcmp(gateway,"") != 0)
{ {
if (strcmp(dev,"") != 0) if (strcmp(dev,"") != 0)
{ {
*flag = 1; *flag = BOTH_GW_AND_DEV;
} }
else else
{ {
*flag = 2; *flag = ONLY_GW;
} }
} }
else else
{ {
*flag = 3; *flag = ONLY_DEV;
} }
} }
@ -449,21 +471,26 @@ void judge_para(int *flag, char *gateway, char *dev)
/*用flag来标志是否需要解析gw和dev*/ /*用flag来标志是否需要解析gw和dev*/
void judge_buff(int *flag, char *buff) void judge_buff(int *flag, char *buff)
{ {
if((NULL == flag) || (NULL == buff))
{
return RET_EMPTY_STRING;
}
if (strstr(buff,"gw") != NULL) if (strstr(buff,"gw") != NULL)
{ {
if (strstr(buff,"dev") != NULL) if (strstr(buff,"dev") != NULL)
{ {
*flag = 1; *flag = BOTH_GW_AND_DEV;
} }
else else
{ {
*flag = 2; *flag = ONLY_GW;
} }
} }
else else
{ {
*flag = 3; *flag = ONLY_DEV;
} }
} }
@ -471,24 +498,21 @@ void judge_buff(int *flag, char *buff)
/*配置默认路由*/ /*配置默认路由*/
ret_code default_routing_proc(routing_t *conf_buff, uint config_type){ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
char string[STRING_LENGTH];
char string_del[STRING_LENGTH];
//uint config_type = conf_buff->conf_type;
char *gw_t = conf_buff->gateway;
char *dev_t = conf_buff->dev;
int metric_t = conf_buff->metric;
ret_code ret = RET_OK;
int flag = 0;
if (conf_buff == NULL) if (conf_buff == NULL)
{ {
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
judge_para(&flag,gw_t,dev_t); char string[STRING_LENGTH] = {0};
char string_del[STRING_LENGTH] = {0};
char *gw_t = conf_buff->gateway;
char *dev_t = conf_buff->dev;
int metric_t = conf_buff->metric;
ret_code ret = RET_OK;
int flag = 0;
memset(string, 0, sizeof(string)); judge_para(&flag,gw_t,dev_t);
memset(string_del, 0, sizeof(string_del));
/*根据config_type判断添加还是删除, /*根据config_type判断添加还是删除,
version判断是IPV4还是IPV6 version判断是IPV4还是IPV6
@ -496,19 +520,25 @@ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
if (config_type == CM_CONFIG_ADD) if (config_type == CM_CONFIG_ADD)
{ {
if (metric_t < 1)
{
return RET_METRIC_ERR;
}
if(conf_buff->version == IPV4_VERSION) if(conf_buff->version == IPV4_VERSION)
{ {
switch (flag) { switch (flag) {
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route add default gw %s dev %s metric %d\n", sprintf(string,"route add default gw %s dev %s metric %d\n",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route add default gw %s metric %d\n",gw_t,metric_t); sprintf(string,"route add default gw %s metric %d\n",gw_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route add default dev %s metric %d\n",dev_t,metric_t); sprintf(string,"route add default dev %s metric %d\n",dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
@ -520,16 +550,16 @@ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
else if (conf_buff->version == IPV6_VERSION) else if (conf_buff->version == IPV6_VERSION)
{ {
switch (flag) { switch (flag) {
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route -A inet6 add default gw %s dev %s metric %d\n", sprintf(string,"route -A inet6 add default gw %s dev %s metric %d\n",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route -A inet6 add default gw %s metric %d\n",gw_t,metric_t); sprintf(string,"route -A inet6 add default gw %s metric %d\n",gw_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route -A inet6 add default dev %s metric %d\n",dev_t,metric_t); sprintf(string,"route -A inet6 add default dev %s metric %d\n",dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
@ -549,19 +579,19 @@ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
if(conf_buff->version == IPV4_VERSION) if(conf_buff->version == IPV4_VERSION)
{ {
switch (flag) { switch (flag) {
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route del default gw %s dev %s metric %d", sprintf(string,"route del default gw %s dev %s metric %d",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
sprintf(string_del,"route add default gw %s dev %s metric %d", sprintf(string_del,"route add default gw %s dev %s metric %d",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route del default gw %s metric %d",gw_t,metric_t); sprintf(string,"route del default gw %s metric %d",gw_t,metric_t);
sprintf(string_del,"route add default gw %s metric %d",gw_t,metric_t); sprintf(string_del,"route add default gw %s metric %d",gw_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route del default dev %s metric %d",dev_t,metric_t); sprintf(string,"route del default dev %s metric %d",dev_t,metric_t);
sprintf(string_del,"route add default dev %s metric %d",dev_t,metric_t); sprintf(string_del,"route add default dev %s metric %d",dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
@ -573,20 +603,25 @@ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
else if(conf_buff->version == IPV6_VERSION) else if(conf_buff->version == IPV6_VERSION)
{ {
if (metric_t < 1)
{
return RET_METRIC_ERR;
}
switch (flag) { switch (flag) {
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route -A inet6 del default gw %s dev %s metric %d", sprintf(string,"route -A inet6 del default gw %s dev %s metric %d",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
sprintf(string_del,"route -A inet6 add default gw %s dev %s metric %d", sprintf(string_del,"route -A inet6 add default gw %s dev %s metric %d",
gw_t,dev_t,metric_t); gw_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route -A inet6 del default gw %s metric %d",gw_t,metric_t); sprintf(string,"route -A inet6 del default gw %s metric %d",gw_t,metric_t);
sprintf(string_del,"route -A inet6 add default gw %s metric %d",gw_t,metric_t); sprintf(string_del,"route -A inet6 add default gw %s metric %d",gw_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route -A inet6 del default dev %s metric %d",dev_t,metric_t); sprintf(string,"route -A inet6 del default dev %s metric %d",dev_t,metric_t);
sprintf(string_del,"route -A inet6 add default dev %s metric %d",dev_t,metric_t); sprintf(string_del,"route -A inet6 add default dev %s metric %d",dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
@ -616,14 +651,20 @@ ret_code default_routing_proc(routing_t *conf_buff, uint config_type){
shell*/ shell*/
ret_code routing_add(routing_t *conf_buff) ret_code routing_add(routing_t *conf_buff)
{ {
char string[STRING_LENGTH]; if(NULL == conf_buff)
{
return RET_EMPTY_STRING;
}
char string[STRING_LENGTH] = {0};
uint version_t = conf_buff->version; uint version_t = conf_buff->version;
uint netmask_t = conf_buff->netmask; uint netmask_t = conf_buff->netmask;
char route_type[10] = {0}; char route_type[10] = {0};
ret_code ret = RET_OK; ret_code ret = RET_OK;
char *destip_t = conf_buff->destip; char *destip_t = conf_buff->destip;
char *gw_t = conf_buff->gateway; char *gw_t = conf_buff->gateway;
char *dev_t = conf_buff->dev; char *dev_t = conf_buff->dev;
int metric_t = conf_buff->metric; int metric_t = conf_buff->metric;
int flag = 0; int flag = 0;
@ -636,15 +677,13 @@ ret_code routing_add(routing_t *conf_buff)
rpc_log_info("flag: %d\n",flag); rpc_log_info("flag: %d\n",flag);
memset(string, 0, sizeof(string));
if(version_t == IPV4_VERSION) if(version_t == IPV4_VERSION)
{ {
if (netmask_t > 0 && netmask_t < 32) if (netmask_t > IPV4_MIN_NETMASK && netmask_t < IPV4_MAX_NETMASK)
{ {
strcpy(route_type,"-net"); strcpy(route_type,"-net");
} }
else if(netmask_t == 32) else if(netmask_t == IPV4_MAX_NETMASK)
{ {
strcpy(route_type,"-host"); strcpy(route_type,"-host");
} }
@ -655,15 +694,15 @@ ret_code routing_add(routing_t *conf_buff)
} }
switch (flag){ switch (flag){
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route add %s %s/%d gw %s dev %s metric %d\n",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string,"route add %s %s/%d gw %s dev %s metric %d\n",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route add %s %s/%d gw %s metric %d\n",route_type,destip_t,netmask_t,gw_t,metric_t); sprintf(string,"route add %s %s/%d gw %s metric %d\n",route_type,destip_t,netmask_t,gw_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route add %s %s/%d dev %s metric %d\n",route_type,destip_t,netmask_t,dev_t,metric_t); sprintf(string,"route add %s %s/%d dev %s metric %d\n",route_type,destip_t,netmask_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
@ -675,15 +714,15 @@ ret_code routing_add(routing_t *conf_buff)
else if (version_t == IPV6_VERSION) else if (version_t == IPV6_VERSION)
{ {
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route -A inet6 add %s/%d gw %s dev %s metric %d\n",destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string,"route -A inet6 add %s/%d gw %s dev %s metric %d\n",destip_t,netmask_t,gw_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route -A inet6 add %s/%d gw %s metric %d\n",destip_t,netmask_t,gw_t,metric_t); sprintf(string,"route -A inet6 add %s/%d gw %s metric %d\n",destip_t,netmask_t,gw_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route -A inet6 add %s/%d dev %s metric %d\n",destip_t,netmask_t,dev_t,metric_t); sprintf(string,"route -A inet6 add %s/%d dev %s metric %d\n",destip_t,netmask_t,dev_t,metric_t);
ret = add_routing_exe(string); ret = add_routing_exe(string);
break; break;
@ -699,8 +738,13 @@ ret_code routing_add(routing_t *conf_buff)
ret_code routing_del(routing_t *conf_buff) ret_code routing_del(routing_t *conf_buff)
{ {
char string[STRING_LENGTH]; if(NULL == conf_buff)
char string_del[STRING_LENGTH]; {
return RET_EMPTY_STRING;
}
char string[STRING_LENGTH] = {0};
char string_del[STRING_LENGTH] = {0};
uint version_t = conf_buff->version; uint version_t = conf_buff->version;
uint netmask_t = conf_buff->netmask; uint netmask_t = conf_buff->netmask;
char route_type[10] = {0}; char route_type[10] = {0};
@ -713,16 +757,13 @@ ret_code routing_del(routing_t *conf_buff)
judge_para(&flag,gw_t,dev_t); judge_para(&flag,gw_t,dev_t);
memset(string, 0, sizeof(string));
memset(string_del, 0, sizeof(string_del));
if(version_t == IPV4_VERSION) if(version_t == IPV4_VERSION)
{ {
if (netmask_t > 0 && netmask_t < 32) if (netmask_t > IPV4_MIN_NETMASK && netmask_t < IPV4_MAX_NETMASK)
{ {
strcpy(route_type,"-net"); strcpy(route_type,"-net");
} }
else if(netmask_t == 32) else if(netmask_t == IPV4_MAX_NETMASK)
{ {
strcpy(route_type,"-host"); strcpy(route_type,"-host");
} }
@ -732,17 +773,17 @@ ret_code routing_del(routing_t *conf_buff)
} }
switch (flag){ switch (flag){
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route del %s %s/%d gw %s dev %s metric %d",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string,"route del %s %s/%d gw %s dev %s metric %d",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t);
sprintf(string_del,"route add %s %s/%d gw %s dev %s metric %d",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string_del,"route add %s %s/%d gw %s dev %s metric %d",route_type,destip_t,netmask_t,gw_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route del %s %s/%d gw %s metric %d",route_type,destip_t,netmask_t,gw_t,metric_t); sprintf(string,"route del %s %s/%d gw %s metric %d",route_type,destip_t,netmask_t,gw_t,metric_t);
sprintf(string_del,"route add %s %s/%d gw %s metric %d",route_type,destip_t,netmask_t,gw_t,metric_t); sprintf(string_del,"route add %s %s/%d gw %s metric %d",route_type,destip_t,netmask_t,gw_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route del %s %s/%d dev %s metric %d",route_type,destip_t,netmask_t,dev_t,metric_t); sprintf(string,"route del %s %s/%d dev %s metric %d",route_type,destip_t,netmask_t,dev_t,metric_t);
sprintf(string_del,"route add %s %s/%d dev %s metric %d",route_type,destip_t,netmask_t,dev_t,metric_t); sprintf(string_del,"route add %s %s/%d dev %s metric %d",route_type,destip_t,netmask_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
@ -754,18 +795,23 @@ ret_code routing_del(routing_t *conf_buff)
else if (version_t == IPV6_VERSION) else if (version_t == IPV6_VERSION)
{ {
if (metric_t < 1)
{
return RET_METRIC_ERR;
}
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sprintf(string,"route -A inet6 del %s/%d gw %s dev %s metric %d",destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string,"route -A inet6 del %s/%d gw %s dev %s metric %d",destip_t,netmask_t,gw_t,dev_t,metric_t);
sprintf(string_del,"route -A inet6 add %s/%d gw %s dev %s metric %d",destip_t,netmask_t,gw_t,dev_t,metric_t); sprintf(string_del,"route -A inet6 add %s/%d gw %s dev %s metric %d",destip_t,netmask_t,gw_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 2: case ONLY_GW:
sprintf(string,"route -A inet6 del %s/%d gw %s metric %d",destip_t,netmask_t,gw_t,metric_t); sprintf(string,"route -A inet6 del %s/%d gw %s metric %d",destip_t,netmask_t,gw_t,metric_t);
sprintf(string_del,"route -A inet6 add %s/%d gw %s metric %d",destip_t,netmask_t,gw_t,metric_t); sprintf(string_del,"route -A inet6 add %s/%d gw %s metric %d",destip_t,netmask_t,gw_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
break; break;
case 3: case ONLY_DEV:
sprintf(string,"route -A inet6 del %s/%d dev %s metric %d",destip_t,netmask_t,dev_t,metric_t); sprintf(string,"route -A inet6 del %s/%d dev %s metric %d",destip_t,netmask_t,dev_t,metric_t);
sprintf(string_del,"route -A inet6 add %s/%d dev %s metric %d",destip_t,netmask_t,dev_t,metric_t); sprintf(string_del,"route -A inet6 add %s/%d dev %s metric %d",destip_t,netmask_t,dev_t,metric_t);
ret = del_routing_exe(string,string_del); ret = del_routing_exe(string,string_del);
@ -783,7 +829,7 @@ ret_code get_all_from_file (pointer output, int *output_len)
{ {
int ret = RET_OK; int ret = RET_OK;
FILE *f; FILE *f;
char buff[LINE_MAX_LENGTH]; char buff[LINE_MAX_LENGTH] = {0};
int ipv4_count = 0; int ipv4_count = 0;
int ipv6_count = 0; int ipv6_count = 0;
int count = 0; int count = 0;
@ -797,8 +843,6 @@ ret_code get_all_from_file (pointer output, int *output_len)
char dev[INTERFACE_MAX_LENGTH] = {0}; char dev[INTERFACE_MAX_LENGTH] = {0};
int metric = 100; int metric = 100;
rpc_log_info("check1\n");
f = fopen(STATIC_ROUTING_PATH,"r"); f = fopen(STATIC_ROUTING_PATH,"r");
if(NULL == f) if(NULL == f)
@ -811,10 +855,10 @@ ret_code get_all_from_file (pointer output, int *output_len)
//buff_total = (routing_t *)malloc(ROUTING_TABLE_MAX_NUMBER*sizeof(routing_t)); //buff_total = (routing_t *)malloc(ROUTING_TABLE_MAX_NUMBER*sizeof(routing_t));
if(buff_total == NULL) if(buff_total == NULL)
{ {
fclose(f);
return RET_EMPTY_STRING; return RET_EMPTY_STRING;
} }
memset(buff,0,sizeof(buff));
memset(buff_total,0,sizeof(buff_total)); memset(buff_total,0,sizeof(buff_total));
fseek(f,0,SEEK_SET); fseek(f,0,SEEK_SET);
@ -834,17 +878,23 @@ ret_code get_all_from_file (pointer output, int *output_len)
{ {
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%s%*s%d",gateway,dev, &metric); sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%s%*s%d",gateway,dev, &metric);
break; break;
case 2: case ONLY_GW:
sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%d",gateway, &metric); sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%d",gateway, &metric);
break; break;
case 3: case ONLY_DEV:
sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%d",dev, &metric); sscanf(buff,"%*s%*s%*s%*s%*s%*s%s%*s%d",dev, &metric);
break; break;
default: default:
ret = RET_ERR; if(buff_total)
{
rpc_free(buff_total);
buff_total = NULL;
}
fclose(f);
return RET_ERR;
} }
netmask = 0; netmask = 0;
strcpy(destip,"::"); strcpy(destip,"::");
@ -854,17 +904,23 @@ ret_code get_all_from_file (pointer output, int *output_len)
{ {
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%s%*s%d",destip,&netmask,gateway,dev, &metric); sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%s%*s%d",destip,&netmask,gateway,dev, &metric);
break; break;
case 2: case ONLY_GW:
sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,gateway,&metric); sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,gateway,&metric);
break; break;
case 3: case ONLY_DEV:
sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,dev,&metric); sscanf(buff,"%*s%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,dev,&metric);
break; break;
default: default:
ret = RET_ERR; if(buff_total)
{
rpc_free(buff_total);
buff_total = NULL;
}
fclose(f);
return RET_ERR;
} }
ipv6_count++; ipv6_count++;
} }
@ -873,17 +929,23 @@ ret_code get_all_from_file (pointer output, int *output_len)
{ {
version = IPV4_VERSION; version = IPV4_VERSION;
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sscanf(buff,"%*s%*s%*s%*s%s%*s%s%*s%d",gateway,dev, &metric); sscanf(buff,"%*s%*s%*s%*s%s%*s%s%*s%d",gateway,dev, &metric);
break; break;
case 2: case ONLY_GW:
sscanf(buff,"%*s%*s%*s%*s%s%*s%d",gateway, &metric); sscanf(buff,"%*s%*s%*s%*s%s%*s%d",gateway, &metric);
break; break;
case 3: case ONLY_DEV:
sscanf(buff,"%*s%*s%*s%*s%s%*s%d",dev, &metric); sscanf(buff,"%*s%*s%*s%*s%s%*s%d",dev, &metric);
break; break;
default: default:
ret = RET_ERR; if(buff_total)
{
rpc_free(buff_total);
buff_total = NULL;
}
fclose(f);
return RET_ERR;
} }
netmask = 0; netmask = 0;
strcpy(destip,"0.0.0.0"); strcpy(destip,"0.0.0.0");
@ -894,17 +956,23 @@ ret_code get_all_from_file (pointer output, int *output_len)
{ {
version = IPV4_VERSION; version = IPV4_VERSION;
switch(flag){ switch(flag){
case 1: case BOTH_GW_AND_DEV:
sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%s%*s%d",destip,&netmask,gateway,dev, &metric); sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%s%*s%d",destip,&netmask,gateway,dev, &metric);
break; break;
case 2: case ONLY_GW:
sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,gateway,&metric); sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,gateway,&metric);
break; break;
case 3: case ONLY_DEV:
sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,dev,&metric); sscanf(buff,"%*s%*s%*s %[^/]/%d%*s%s%*s%d",destip,&netmask,dev,&metric);
break; break;
default: default:
ret = RET_ERR; if(buff_total)
{
rpc_free(buff_total);
buff_total = NULL;
}
fclose(f);
return RET_ERR;
} }
ipv4_count++; ipv4_count++;
} }
@ -938,7 +1006,11 @@ ret_code get_all_from_file (pointer output, int *output_len)
fclose(f); fclose(f);
ret = routing_to_json (count, buff_total, output, output_len); ret = routing_to_json (count, buff_total, output, output_len);
rpc_free(buff_total); if(buff_total)
{
rpc_free(buff_total);
buff_total = NULL;
}
return ret; return ret;
} }
@ -947,8 +1019,8 @@ ret_code config_recovery()
{ {
ret_code ret = RET_OK; ret_code ret = RET_OK;
FILE *f; FILE *f;
char buff[LINE_MAX_LENGTH]; char buff[LINE_MAX_LENGTH] = {0};
char buff_total[LINE_MAX_LENGTH*ROUTING_TABLE_MAX_NUMBER]; char buff_total[LINE_MAX_LENGTH*ROUTING_TABLE_MAX_NUMBER] = {0};
int status; int status;
f= fopen(STATIC_ROUTING_PATH,"r"); f= fopen(STATIC_ROUTING_PATH,"r");
@ -959,9 +1031,6 @@ ret_code config_recovery()
return RET_OPEN_FILE_ERR; return RET_OPEN_FILE_ERR;
} }
memset(buff,0,sizeof(buff));
memset(buff_total,0,sizeof(buff_total));
fseek(f,0,SEEK_SET); fseek(f,0,SEEK_SET);
while (fgets(buff,sizeof(buff),f) != NULL) while (fgets(buff,sizeof(buff),f) != NULL)
@ -1000,6 +1069,8 @@ ret_code config_recovery()
} }
} }
} }
next_while: next_while:
if(fgetc(f) == EOF) if(fgetc(f) == EOF)
{ {
@ -1020,14 +1091,19 @@ next_while:
/*检查输入的json参数并且赋值到结构体*/ /*检查输入的json参数并且赋值到结构体*/
ret_code routing_config_chk(uint source, uint *config_type, ret_code routing_config_chk(uint source, uint *config_type,
pointer input, int *input_len, pointer input, int *input_len,
pointer output, int *output_len){ pointer output, int *output_len)
{
if((NULL == config_type) || (NULL == input) || (NULL == input_len) || (NULL == output_len))
{
return RET_INPUTERR;
}
if(source == CONFIG_FROM_RECOVER1) if(source == CONFIG_FROM_RECOVER1)
{ {
return RET_OK; return RET_OK;
} }
if(source == CONFIG_FROM_RECOVER2) if(source == CONFIG_FROM_RECOVER2)
{ {
return RET_CHKERR; return RET_CHKERR;
} }
@ -1059,6 +1135,7 @@ ret_code routing_config_chk(uint source, uint *config_type,
return RET_GW_DEV_ERR; return RET_GW_DEV_ERR;
} }
/*判断IP和网关格式是否正确*/
else if(conf_buff->version == IPV4_VERSION) else if(conf_buff->version == IPV4_VERSION)
{ {
int a = -1,b = -1,c = -1,d = -1; int a = -1,b = -1,c = -1,d = -1;
@ -1127,12 +1204,16 @@ ret_code routing_config_proc(uint source, uint config_type,
return ret; return ret;
} }
char string[STRING_LENGTH];
uint conf_type = config_type; uint conf_type = config_type;
routing_t conf_buff = {0}; routing_t conf_buff = {0};
routing_t *routing_conf = &conf_buff; routing_t *routing_conf = &conf_buff;
int flag = 0; int flag = 0;
if(NULL == input)
{
return RET_INPUTERR;
}
routing_conf = (routing_t *)input; routing_conf = (routing_t *)input;
rpc_log_info("routing info: config_type %d, version %d, destip %s, netmask %d, gateway %s, dev %s, metric %d\n", rpc_log_info("routing info: config_type %d, version %d, destip %s, netmask %d, gateway %s, dev %s, metric %d\n",
@ -1182,7 +1263,12 @@ ret_code routing_config_proc(uint source, uint config_type,
ret_code routing_config_get_all(uint source, ret_code routing_config_get_all(uint source,
pointer output, int *output_len){ pointer output, int *output_len){
if (source == CONFIG_FROM_RECOVER1 || source == CONFIG_FROM_RECOVER2) if((NULL == output) || (NULL == output_len))
{
return RET_INPUTERR;
}
if (source == CONFIG_FROM_RECOVER1 || source == CONFIG_FROM_RECOVER2)
{ {
return RET_OK; return RET_OK;
} }
@ -1191,14 +1277,11 @@ ret_code routing_config_get_all(uint source,
int ret = RET_OK; int ret = RET_OK;
*output_len = 0; *output_len = 0;
//int code = 0;
ret = get_all_from_file(output,output_len); ret = get_all_from_file(output,output_len);
rpc_log_info("routing_config_get_all: %s\n", (char *)output); rpc_log_info("routing_config_get_all: %s\n", (char *)output);
//RET_ERR_FORMART(ret, code, output, *output_len);
ASSERT_RET(ret);
return ret; return ret;
} }
@ -1213,7 +1296,10 @@ ret_code all_routing_config_chk(uint source, uint * config_type,
pointer input, int * input_len, pointer input, int * input_len,
pointer output, int * output_len) pointer output, int * output_len)
{ {
rpc_log_info("test check\n"); if((NULL == config_type) || (NULL == input) || (NULL == output_len))
{
return RET_INPUTERR;
}
ret_code ret = RET_OK; ret_code ret = RET_OK;
routing_t routing_buff = {0}; routing_t routing_buff = {0};
@ -1248,14 +1334,20 @@ ret_code all_routing_config_chk(uint source, uint * config_type,
ret_code all_routing_get_all(uint source, ret_code all_routing_get_all(uint source,
pointer output, int *output_len) pointer output, int *output_len)
{ {
FILE *f;
if((NULL == output) || (NULL == output_len))
{
return RET_INPUTERR;
}
FILE *f;
ret_code ret = RET_OK; ret_code ret = RET_OK;
routing_t *conf_buff; routing_t *conf_buff;
int count = 0; int count = 0;
int ipv4_number = 0; int ipv4_number = 0;
int ipv6_number = 0; int ipv6_number = 0;
int status; int status;
char temp_buff[LINE_MAX_LENGTH]; char temp_buff[LINE_MAX_LENGTH] = {0};
char destip[IP_MAX_LENGTH] = {0}; char destip[IP_MAX_LENGTH] = {0};
char gateway[IP_MAX_LENGTH] = {0}; char gateway[IP_MAX_LENGTH] = {0};
char gateway_new[IP_MAX_LENGTH] = {0}; char gateway_new[IP_MAX_LENGTH] = {0};
@ -1274,7 +1366,6 @@ ret_code all_routing_get_all(uint source,
conf_buff = rpc_new0(routing_t,ROUTING_TABLE_MAX_NUMBER); conf_buff = rpc_new0(routing_t,ROUTING_TABLE_MAX_NUMBER);
memset(conf_buff,0,sizeof(conf_buff)); memset(conf_buff,0,sizeof(conf_buff));
memset(temp_buff,0,LINE_MAX_LENGTH);
fseek(f,0,SEEK_SET); fseek(f,0,SEEK_SET);
@ -1325,6 +1416,8 @@ next_while:
fclose(f); fclose(f);
f = popen(IPV6_GET_STATIC_ROUTING,"r"); f = popen(IPV6_GET_STATIC_ROUTING,"r");
if (NULL == f) if (NULL == f)
{ {
@ -1353,7 +1446,8 @@ next_while:
sscanf(temp_buff,"%[^/]/%d %s %*s %d %*s %*s %s",destip,&netmask_int,gateway,&metric,dev); sscanf(temp_buff,"%[^/]/%d %s %*s %d %*s %*s %s",destip,&netmask_int,gateway,&metric,dev);
rpc_log_info("check 5 after sscanf\n"); rpc_log_info("check 5 after sscanf\n");
rpc_log_info("check 6: destip %s gateway %s netmask %d metric %d dev %s\n",destip,gateway,netmask_int,metric,dev); rpc_log_info("check 6: destip %s gateway %s netmask %d metric %d dev %s\n",destip,gateway,netmask_int,metric,dev);
if(metric > 0)
if(metric > 0)
{ {
sscanf(gateway,"[%[^]]",gateway_new); sscanf(gateway,"[%[^]]",gateway_new);
conf_buff[count].version = 6; conf_buff[count].version = 6;
@ -1403,11 +1497,11 @@ next_while:
rpc_log_info("routing_config_get_all: %s\n", (char *)output); rpc_log_info("routing_config_get_all: %s\n", (char *)output);
if(conf_buff)
{
rpc_free(conf_buff); rpc_free(conf_buff);
conf_buff = NULL;
//RET_ERR_FORMART(ret, code, output, *output_len); }
ASSERT_RET(ret);
return ret; return ret;
} }