8 Commits

Author SHA1 Message Date
156466eab9 listen addrs are stored in cfg obj now 2022-08-01 10:06:18 +02:00
04d469b970 new function to traverse config
(Work in progress)
2022-08-01 10:05:14 +02:00
0e07e42167 No compiler warnings 2022-08-01 10:04:25 +02:00
4c37d89f03 Changed config.atv to ckv 2022-08-01 10:01:25 +02:00
6d9da94863 Better error handling. 2022-07-31 23:58:43 +02:00
1616d77a0f Much clean-up 2022-07-31 23:00:20 +02:00
a389003199 Fix: memory leak 2022-07-31 22:46:39 +02:00
eac5e73528 Fixed: memory leak 2022-07-31 22:44:58 +02:00
8 changed files with 143 additions and 171 deletions

View File

@ -48,7 +48,8 @@
#include "cw/cfg.h"
int ac_run();
int ac_run(cw_Cfg_t * cfg);
#include <getopt.h>
@ -64,7 +65,7 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
int c;
opterr = 1;
bootcfg->cfgfilename = "config.atv";
bootcfg->cfgfilename = "config.ckv";
while ( (c = getopt (argc, argv, "vc:d:p:")) != -1) {
@ -141,52 +142,6 @@ extern void test_sets();
#include "discovery_cache.h"
void tester1()
{
struct cw_DiscoveryCache * cache;
struct sockaddr_storage addr;
int rc;
const char *c,*b;
cache = discovery_cache_create(1);
sock_strtoaddr("192.168.0.12:1234",(struct sockaddr*)&addr);
discovery_cache_add(cache,(struct sockaddr*)&addr,"Nase","Loeffel");
sock_strtoaddr("192.168.0.13:1234",(struct sockaddr*)&addr);
discovery_cache_add(cache,(struct sockaddr*)&addr,"Nase","Loeffel");
rc = discovery_cache_get(cache,(struct sockaddr*)&addr,&c,&b);
if (rc) {
printf("RC: %d, %s %s\n",rc,c,b);
}
}
static void show_cfg (FILE *out, mavl_t ktv)
{
char value[500];
struct cw_Val * data;
mavliter_t it;
const struct cw_Type * type;
mavliter_init(&it,ktv);
mavliter_foreach(&it){
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
fprintf(out,"%s :%s: %s\n",data->key,type->get_type_name(data), value);
}
}
/*
{
cw_Cfg_t * cfg;
@ -221,7 +176,7 @@ int main (int argc, char *argv[])
int rc = 0;
struct bootcfg bootcfg;
FILE * file;
mavl_t types_tree, acglobal_cfg;
mavl_t types_tree;
const cw_Type_t **ti;
@ -239,75 +194,17 @@ int main (int argc, char *argv[])
rc = cw_cfg_load(bootcfg.cfgfilename,global_cfg);
if (rc)
{
if (rc<0)
if (rc)
fprintf(stderr,"Can't load cfg '%s': %s\n",bootcfg.cfgfilename,strerror(errno));
goto errX;
};
/* open config file */
file = fopen("config.ktv","r");
if (file == NULL){
cw_log(LOG_ERR,"Cant open config file '%s': %s",
bootcfg.cfgfilename, strerror(errno));
exit(EXIT_FAILURE);
}
/* create types tree with default types */
types_tree = cw_ktv_create_types_tree();
for (ti=CW_KTV_STD_TYPES;*ti;ti++){
mavl_insert_ptr(types_tree,*ti);
}
acglobal_cfg = cw_ktv_create();
if (acglobal_cfg == NULL){
cw_log(LOG_ERR,"Can't create local_cfg: %s",strerror(errno));
exit(EXIT_FAILURE);
}
cw_ktv_read_file(file,acglobal_cfg,types_tree);
fclose(file);
actube_global_cfg = acglobal_cfg;
cw_dbg_ktv_dump(acglobal_cfg,DBG_INFO,NULL,"CFG:",NULL);
cw_log_name = "AC-Tube";
if (!read_config ("ac.conf"))
return 1;
start_shell();
/* Show debug options if there are any set */
if (cw_dbg_opt_level)
cw_log (LOG_INFO, "Debug Options: %08X", cw_dbg_opt_level);
/* XXX Hard coded debug settigns, set it by config in the future */
// cw_dbg_opt_display = DBG_DISP_ASC_DMP | DBG_DISP_COLORS;
/* Warn, if the "secret" debugging feature for
developers is turned on ;) */
/*
// DBGX("Attention! %s", "DBG X is ON!");
// cw_mod_set_mod_path("../../lib/actube");
//cw_mod_load("capwap");
*/
/* Init DTLS library */
dtls_init();
@ -322,15 +219,20 @@ int main (int argc, char *argv[])
if (!dataman_list_init())
goto errX;
ac_conf_init(global_cfg);
cw_cfg_dump(global_cfg);
cw_log (LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", conf_acname, conf_acid);
rc = ac_run();
rc = ac_run(global_cfg);
errX:
if (global_cfg)
mavl_destroy(global_cfg);
if (discovery_cache)
discovery_cache_destroy(discovery_cache);
/* XXX There is more cleanup to do */
wtplist_destroy();
socklist_destroy();
return rc;
@ -339,23 +241,23 @@ errX:
void process_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
void process_cw_data_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
int ac_run()
int ac_run(cw_Cfg_t * cfg)
{
if (!conf_listen_addrs_len) {
if (1 /*!conf_listen_addrs_len*/) {
cw_log (LOG_ERR, "Fatal error: No listen addresses found.");
return 1;
// return 1;
}
extern void cw_cfg_iterate(cw_Cfg_t *);
cw_cfg_iterate(cfg);
return 1;
/* it is important to create the unicast sockets first,
* because when we create the mcast an bcast sockets next
@ -364,7 +266,7 @@ int ac_run()
int i;
for (i = 0; i < conf_listen_addrs_len; i++) {
/* for (i = 0; i < conf_listen_addrs_len; i++) {
char addr[100];
char port[50];
int proto;
@ -373,6 +275,7 @@ int ac_run()
socklist_add_unicast (addr, port, proto);
}
*/
if (socklist_len == 0) {
cw_log (LOG_ERR, "Fatal error: Could not setup any listen socket");

View File

@ -36,6 +36,7 @@
#include "conf.h"
#include "ac.h"
#include "cw/cfg.h"
#include "cw/mavltypes.h"
@ -60,8 +61,6 @@ long conf_max_wtps = CONF_DEFAULT_MAXWTPS;
char *conf_logfilename = CONF_DEFAULT_LOGFILENAME;
struct sockaddr_storage *conf_salist = NULL;
char **conf_listen_addrs;
int conf_listen_addrs_len = 0;
char **conf_mcast_groups = 0;
@ -215,41 +214,23 @@ static int init_control_port()
#include <ifaddrs.h>
static int init_listen_addrs()
static int init_listen_addrs(cw_Cfg_t * cfg)
{
char key[CW_CFG_MAX_KEY_LEN];
struct ifaddrs *ifap, *ifa;
int rc;
int ctr;
const char * a0;
if (conf_listen_addrs != 0)
a0 = cw_cfg_get(cfg,"actube/listen.0",NULL);
if (a0)
return 1;
rc = getifaddrs(&ifap);
if (rc == -1)
return 0;
/* count the addresses */
ctr = 0;
for (ifa = ifap; ifa != 0; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr)
continue;
if (ifa->ifa_addr->sa_family == AF_INET && conf_ipv4)
ctr++;
if (ifa->ifa_addr->sa_family == AF_INET6 && conf_ipv6)
ctr++;
}
conf_listen_addrs = malloc(sizeof(char *) * ctr);
if (!conf_listen_addrs) {
rc = 0;
goto errX;
}
memset(conf_listen_addrs, 0, sizeof(char *) * ctr);
ctr = 0;
/* get the addresses */
for (ifa = ifap; ifa != 0; ifa = ifa->ifa_next) {
@ -267,12 +248,9 @@ static int init_listen_addrs()
if (ifa->ifa_addr->sa_family == AF_INET && conf_ipv4) {
sock_addrtostr(ifa->ifa_addr, str, 100,0);
conf_listen_addrs[ctr] =
(char *) cw_setstr((uint8_t **) & conf_listen_addrs[ctr],
(uint8_t *) str, strlen(str));
if (conf_listen_addrs[ctr])
ctr++;
sprintf(key,"actube/listen.%d",ctr++);
cw_cfg_set(cfg,key,str);
}
if (ifa->ifa_addr->sa_family == AF_INET6 && conf_ipv6) {
sock_addrtostr(ifa->ifa_addr, str, 100,0);
@ -281,14 +259,10 @@ static int init_listen_addrs()
strcat(str, "%");
strcat(str, ifa->ifa_name);
}
conf_listen_addrs[ctr] =
(char *) cw_setstr((uint8_t **) & conf_listen_addrs[ctr],
(uint8_t *) str, strlen(str));
if (conf_listen_addrs[ctr])
ctr++;
sprintf(key,"actube/listen.%d",ctr++);
cw_cfg_set(cfg,key,str);
}
}
conf_listen_addrs_len = ctr;
rc = 1;
errX:
freeifaddrs(ifap);
@ -703,9 +677,6 @@ int read_config(const char *filename)
/* read debug options */
conf_read_dbg_level(cfg);
/* read the listen addresses */
conf_read_strings(cfg, "listen", &conf_listen_addrs, &conf_listen_addrs_len);
/* read multi cast groups */
conf_read_strings(cfg, "mcast_groups", &conf_mcast_groups,
&conf_mcast_groups_len);
@ -763,7 +734,6 @@ int read_config(const char *filename)
init_listen_addrs();
init_mcast_groups();
init_bcast_addrs();
@ -775,3 +745,13 @@ void free_config()
{
}
void ac_conf_init(cw_Cfg_t *cfg)
{
printf("ac conf\n");
init_listen_addrs(cfg);
}

View File

@ -31,7 +31,7 @@
#include "cw/bstr.h"
#include "cw/mod.h"
#include "cw/vendors.h"
#include "cw/cfg.h"
extern struct cw_Mod ** conf_mods;
@ -94,8 +94,6 @@ extern bstr_t conf_cisco_software_version;
extern char **conf_listen_addrs;
extern int conf_listen_addrs_len;
extern struct sockaddr *conf_ac_ips;
extern int conf_ac_ips_len;
@ -141,5 +139,8 @@ extern int conf_parse_listen_addr(const char *addr, char *saddr, char *port, int
#define CFG_ENTRY_MODS "mods"
#define CONF_PREFIX "actube"
void ac_conf_init(cw_Cfg_t *cfg);
#endif

View File

@ -32,6 +32,9 @@ void discovery_cache_destroy(struct cw_DiscoveryCache * c)
if (c->byaddrp)
mavl_destroy(c->byaddrp);
if (c->queue)
free(c->queue);
free(c);
}

View File

@ -3,7 +3,7 @@
#include "cw/mod.h"
struct cw_DiscoveryCache * discovery_cache_create(int len);
@ -14,4 +14,5 @@ void discovery_cache_add(struct cw_DiscoveryCache *cache,
int discovery_cache_get(struct cw_DiscoveryCache * cache,struct sockaddr *addr,
struct cw_Mod ** modcapwap, struct cw_Mod **modbindings);
void discovery_cache_destroy(struct cw_DiscoveryCache * c);
#endif

View File

@ -52,13 +52,13 @@ int cw_cfg_set(cw_Cfg_t * cfg,const char *key, const char *val)
return -1;
}
char * cw_cfg_get(cw_Cfg_t * cfg, char *key)
const char * cw_cfg_get(cw_Cfg_t * cfg, char *key, const char *def)
{
struct cw_Cfg_entry e,*r;
e.key = key;
r = mavl_get(cfg,&e);
if (!r)
return NULL;
return def;
return r->val;
}
@ -368,5 +368,86 @@ int cw_cfg_load(const char *filename,cw_Cfg_t * cfg)
return errno;
errs = cw_cfg_read_from_file(f,cfg);
fclose(f);
return errs;
if (errs)
errno = EINVAL;
return errno;
}
static int cw_cfg_get_next_idx(cw_Cfg_t * cfg, const char *key, int n)
{
char ikey[CW_CFG_MAX_KEY_LEN];
struct cw_Cfg_entry search, * result;
char *d;
int i;
sprintf(ikey,"%s.%d",key,n);
search.key=ikey;
result = mavl_get_first(cfg,&search);
printf("KEY: %s\n",search.key);
printf("NNNNN: %s\n",result->key);
if (result==NULL)
return -1;
d=NULL;
for (i = strlen(ikey); i>=0; i--){
if (ikey[i]=='.'){
d = result->key+i;
break;
}
}
if (d==NULL){
return -1;
}
if(result->key[i]!='.'){
return -1;
}
if (strncmp(result->key,ikey,i)!=0)
return -1;
printf("TRANSFER %s\n",result->key+i+1);
return atoi(result->key+i+1);
}
void cw_cfg_iterate(cw_Cfg_t * cfg)
{
printf("Iterate\n");
struct cw_Cfg_entry *e;
struct cw_Cfg_entry search;
search.key="actube/listen";
int i=0;
i = cw_cfg_get_next_idx(cfg,"actube/listen",i);
printf("This i %d\n",i);
while ( (i = cw_cfg_get_next_idx(cfg,"actube/listen",i))!=-1) {
printf("Here i %d\n",i);
printf("we have key: %s.%d\n","actube/listen",i);
printf("Next=%d\n",i);
i++;
};
e = mavl_get_first(cfg,&search);
if (!e){
printf("NULL\n");
return;
}
printf("%s : %s\n",e->key,e->val);
}

View File

@ -18,7 +18,7 @@ struct cw_Cfg_entry{
char *val;
};
char * cw_cfg_get(cw_Cfg_t * cfg, char *key);
const char * cw_cfg_get(cw_Cfg_t * cfg, char *key, const char *def);
#endif

View File

@ -133,6 +133,9 @@ void connlist_destroy ( struct connlist * cl )
if ( cl->by_addr )
mavl_destroy ( cl->by_addr );
if ( cl->by_session_id)
mavl_destroy ( cl->by_session_id );
pthread_mutex_destroy ( &cl->connlist_mutex );
free ( cl );