209 lines
4.5 KiB
C
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);
|
|
}
|