Files
ocs/plat/diameter/extensions/sh_app/sh_conf.c
2025-03-08 16:40:56 +08:00

209 lines
4.5 KiB
C

#include "sh_conf.h"
SH_CONF_S g_sh_conf_ext;
#define SH_PARSE_BUFFER_LEN 1024
static char* shParseStr_(char* buffer, char* _key, char *ret_str, int flag_from_begin)
{
char *pos = strstr(buffer, _key);
char *pos_1 = NULL;
char *pos_2 = NULL;
if(NULL != pos && (flag_from_begin ? (buffer == pos) : 1) )
{
pos_1 = strstr(pos, "\"");
if(NULL != pos_1)
{
pos_2 = strstr(pos_1 + 1, "\"");
if(NULL != pos_2)
{
memcpy(ret_str, pos_1 + 1, pos_2 - pos_1 - 1);
ret_str[pos_1 - pos_2] = '\0';
// fprintf(stderr, "%s=%s\n", _key, ret_str);
return ret_str;
}
}
}
return NULL;
}
static char* shParseStr(char* buffer, char* _key, char *ret_str)
{
return shParseStr_(buffer, _key, ret_str, 1);
}
static char* shParseStrSub(char* buffer, char* _key, char *ret_str)
{
return shParseStr_(buffer, _key, ret_str, 0);
}
uint16_t shParseInt(char* buffer, char* _key, uint16_t* ret_int)
{
char buff_num[16] = {0};
char *pos = strstr(buffer, _key);
char *pos_1 = NULL;
char *pos_2 = NULL;
/* first address is start of the line */
if(NULL != pos && buffer == pos)
{
pos_1 = strstr(pos, "=");
if(NULL != pos_1)
{
pos_2 = strstr(pos_1 + 1, ";");
if(NULL != pos_2)
{
memcpy(buff_num, pos_1 + 1, pos_2 - pos_1 - 1);
*ret_int = atol( buff_num );
// fprintf(stderr, "%s=%d\n", _key, *ret_int);
return *ret_int;
}
}
}
return 0;
}
int shParseFlags(char* buffer, char* _key, char* no_flag_key)
{
char *pos = strstr(buffer, _key);
char *pos_1 = NULL;
char *pos_2 = NULL;
/* first address is start of the line */
if(NULL != pos && buffer == pos)
{
pos_1 = strstr(pos, "{");
if(NULL != pos_1)
{
pos_2 = strstr(pos_1 + 1, "}");
if(NULL != pos_2)
{
if(strstr( pos_1 + 1, no_flag_key) )
{
// fprintf(stderr, "%s\n", no_flag_key);
return 1;
}
}
}
}
return 0;
}
int shParse_(struct fd_config * conf)
{
FILE* fd;
char buffer[SH_PARSE_BUFFER_LEN] = {0};
char ret_str[512] = {0};
/* Create input file descriptor */
fd = fopen (conf->cnf_file, "r");
if (fd == NULL)
{
perror ("open");
return 2;
}
/* Copy process */
while((fgets(buffer, SH_PARSE_BUFFER_LEN, fd)) != NULL)
{
if( shParseStr(buffer, "Identity", ret_str) )
{
conf->cnf_diamid = strdup(ret_str);
conf->cnf_diamid_len = strlen(ret_str);
memset( ret_str, 0, strlen(ret_str) );
}
if( shParseStr(buffer, "Realm", ret_str) )
{
conf->cnf_diamrlm = strdup(ret_str);
conf->cnf_diamrlm_len = strlen(ret_str);
memset( ret_str, 0, strlen(ret_str) );
}
shParseInt(buffer, "Port", &conf->cnf_port);
shParseInt(buffer, "SecPort", &conf->cnf_port_tls);
shParseInt(buffer, "SCTPStr", &conf->cnf_sctp_str);
if( shParseFlags(buffer, "ConnectPeer", "No_TLS") )
{
conf->cnf_sec_data.tls_disabled = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "No_FWD") )
{
conf->cnf_flags.no_fwd = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "No_IP4") )
{
conf->cnf_flags.no_ip4 = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "No_IP6") )
{
conf->cnf_flags.no_ip6 = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "No_TCP") )
{
conf->cnf_flags.no_tcp = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "No_SCTP") )
{
conf->cnf_flags.no_sctp = 1;
}
if( shParseFlags(buffer, "ConnectPeer", "Prefer_TCP") )
{
conf->cnf_flags.pr_tcp = 1;
}
memset(buffer, 0, SH_PARSE_BUFFER_LEN);
}
fclose (fd);
conf->cnf_flags.tls_alg = 0;
return 0;
}
int shParseExt(struct fd_config * conf)
{
FILE* fd;
char buffer[SH_PARSE_BUFFER_LEN] = {0};
char ret_str[512] = {0};
fd = fopen (conf->cnf_file, "r");
if(NULL == fd)
{
perror ("open");
return 2;
}
while((fgets(buffer, SH_PARSE_BUFFER_LEN, fd)) != NULL)
{
shParseInt( buffer, "ServiceMod", (uint16_t*)(&g_sh_conf_ext.mode) );
if( shParseStr(buffer, "ConnectPeer", ret_str) )
{
g_sh_conf_ext.pi_diamid_peer = strdup(ret_str);
memset( ret_str, 0, strlen(ret_str) );
if( shParseStrSub(buffer, "Realm", ret_str) )
{
g_sh_conf_ext.pi_diamid_realm_peer = strdup(ret_str);
memset( ret_str, 0, strlen(ret_str) );
}
}
shParseInt( buffer, "LogLevel", (uint16_t*)(&fd_g_debug_lvl) );
memset(buffer, 0, SH_PARSE_BUFFER_LEN);
}
fclose (fd);
return 0;
}
int shParse(struct fd_config * conf)
{
return shParse_(conf) || shParseExt(conf);
}