diff --git a/src/ac/ac.conf b/src/ac/ac.conf index 95f112e2..531f8648 100644 --- a/src/ac/ac.conf +++ b/src/ac/ac.conf @@ -197,7 +197,7 @@ ssl_cert="../../ssl/certs/ac-xcisco.pem" # dbg # Set debug level # - dbg = info # Show all kind of infos +# dbg = info # Show all kind of infos # dbg += all # dbg += msg_in # Incomming CAPWAP messages # dbg += msg_out # Outgoing CAPWAP messages @@ -219,7 +219,7 @@ ssl_cert="../../ssl/certs/ac-xcisco.pem" # dbg += dtls_bio # DTLS BIO operations # dbg += dtls_bio_dmp # HeXy dump data in BIO operations # dbg += warn # misc warnings -# dbg += mod # Debugs specific to mod +# dbg = mod # Debugs specific to mod # dbg += cfg_dmp # dbg += state # @@ -239,7 +239,7 @@ ssl_cert="../../ssl/certs/ac-xcisco.pem" # #mods = { cisco, capwap } -mods = { cisco, capwap, capwap80211 } +mods = { cisco,capwap, capwap80211 } #, capwap80211 } mods_dir = ../../lib/Linux/x86_64/ diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index 196c1388..5b60ccfd 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -46,6 +46,7 @@ #include "dataman.h" +#include "cw/cfg.h" int ac_run(); @@ -172,7 +173,21 @@ static void show_cfg (FILE *out, mavl_t ktv) } +/* + { + cw_Cfg_t * cfg; + cfg=cw_cfg_create(); + cw_cfg_load("tube.akv",cfg); + +// cw_cfg_set(cfg,"cisco/tube","99"); +// cw_cfg_set(cfg,"Hello","30"); + + cw_cfg_dump(cfg); + mavl_destroy(cfg); + } +*/ + int main (int argc, char *argv[]) { @@ -181,7 +196,9 @@ int main (int argc, char *argv[]) FILE * file; mavl_t types_tree, global_cfg; const cw_Type_t **ti; - + + + /* parse arguments */ parse_args (argc, argv, &bootcfg); @@ -194,6 +211,7 @@ int main (int argc, char *argv[]) exit(EXIT_FAILURE); } + /* create types tree with default types */ types_tree = cw_ktv_create_types_tree(); for (ti=CW_KTV_STD_TYPES;*ti;ti++){ @@ -229,7 +247,7 @@ int main (int argc, char *argv[]) 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; +// cw_dbg_opt_display = DBG_DISP_ASC_DMP | DBG_DISP_COLORS; /* Warn, if the "secret" debugging feature for developers is turned on ;) */ diff --git a/src/cw/Makefile b/src/cw/Makefile index 28aa36ba..204af4e8 100644 --- a/src/cw/Makefile +++ b/src/cw/Makefile @@ -105,7 +105,8 @@ KTVSRC=\ cw_ktv_base_exists.c\ cw_ktv_save.c\ cw_ktv_del_sub.c\ - cfg.c + cfg.c\ + LWSRC=\ diff --git a/src/cw/cfg.c b/src/cw/cfg.c index a99a848e..aacb8bd6 100644 --- a/src/cw/cfg.c +++ b/src/cw/cfg.c @@ -1,4 +1,5 @@ #include +#include #include @@ -26,12 +27,12 @@ static void del(void *ptr) } -cw_Cfg_t * cfg_create() +cw_Cfg_t * cw_cfg_create() { return mavl_create(cmp, del, sizeof(struct cfg_entry)); } -int cfg_set(cw_Cfg_t * cfg,const char *key, const char *val) +int cw_cfg_set(cw_Cfg_t * cfg,const char *key, const char *val) { struct cfg_entry e; int replaced; @@ -55,7 +56,7 @@ int cfg_set(cw_Cfg_t * cfg,const char *key, const char *val) return -1; } -void cw_Cfg_dump(cw_Cfg_t *cfg) +void cw_cfg_dump(cw_Cfg_t *cfg) { mavliter_t it; struct cfg_entry *e; @@ -63,7 +64,292 @@ void cw_Cfg_dump(cw_Cfg_t *cfg) mavliter_foreach(&it){ e = mavliter_get(&it); - printf("%s: %s\n",e->key,e->val); + printf("%s: '%s'\n",e->key,e->val); //cw_dbg(dbglevel,"%s%s :%s: %s",prefix,data->key,type->get_type_name(data), value); } } + + +struct parser { + int line; + int pos; + int prevpos; + char error[256]; + int quote; + FILE *f; + int (*getc)(struct parser *); + void (*ungetc)(struct parser *); +}; + +static int get_char(struct parser *p) +{ + int c; + c = fgetc (p->f); + p->pos++; + if (c=='\n'){ + p->prevpos=p->pos; + p->line ++; + p->pos=0; + } + return c; +} + +static void unget_char(struct parser *p,int c){ + ungetc(c,p->f); + if (c=='\n'){ + p->line--; + p->pos=p->prevpos; + } + else + p->pos--; +} + + + +static int get_char_q(struct parser *p) +{ + int c; + + while(1) { + c = get_char(p); + if (c==EOF || c=='\n') + return c; + + if(c=='"' && !p->quote){ + p->quote=1; + continue; + } + if(c=='"' && p->quote){ + p->quote=0; + continue; + } + break; + } + + + if (!p->quote) + return c; + + if (c!='\\') + return c; + + c = get_char(p); + switch(c){ + case EOF: + return c; + case 'n': + return '\n'; + + case '\\': + return '\\'; + case '"': + return '"'; + default: + unget_char(p,c); + return '\\'; + } + + /* We will never reach here */ + /* return c;*/ +} + +static int skip_chars (struct parser *p, const char * chars) +{ + int c; + + while ( (c = get_char (p)) != EOF) { + if (strchr (chars, c)) + continue; + return c; + } + return c; +} + +static int skip_to_chars (struct parser *p, const char *chars) +{ + int c; + + while ( (c = get_char (p)) != EOF) { + if (strchr (chars, c)) + return c; + } + return c; +} + + + +static int read_key (struct parser *p, char *key, int max_len) +{ + int c,n; + + do { + c = skip_chars (p, " \t\n\a\v"); + if (c == '#') { + c = skip_to_chars (p, "\n\a"); + + } else { + break; + } + } while (c != EOF); + + unget_char(p,c); + c=get_char_q(p); + + n=0; + while(c!=EOF && nquote && !isalnum(c) && !strchr("._/-()@#|{}[]\\",c)/*strchr(": \t\n\a",c)*/){ + unget_char(p,c); + break; + } + + key[n]=c; + + c=get_char_q(p); + n++; + + } + key[n]=0; + return n; +} + + +static int skip_to_colon(FILE *f,struct parser * p) +{ + int c; + c = skip_chars (p, " \t"); + if (c!=':'){ + if (c=='\n'){ + unget_char(p,c); + sprintf(p->error,"Error at line %d, pos %d: Unexpected EOL, collon expected.", p->line, p->pos); + return 0; + } + sprintf(p->error,"Error at line %d, pos %d: Collon expected.", p->line, p->pos); + return 0; + } + return 1; +} + + + +static int read_val(struct parser *p, char *val, int max_len){ + int c,n,quote; + if (!skip_to_colon(p->f,p)) + return -1; + c = skip_chars (p, " \t"); + if (c=='"'){ + quote=1; + c=get_char(p); + } + else{ + quote=0; + } + n=0; + while(c!=EOF && n0){ + while(n>0){ + if (isspace(val[n-1])) + n--; + else + break; + } + } + + val[n]=0; + + return n; + +} + + + +int cw_cfg_read_line (FILE *f, struct parser *p, char * key, char *val) +{ + int n; + + + n = read_key (p,key,CW_CFG_MAX_KEY_LEN); + if (n==0) + return 1; + if (n==-1){ + return -1; + } + + n = read_val (p,val,CW_CFG_MAX_KEY_LEN); + if (n==-1){ + return -1; + } + return 0; +} + +int cw_cfg_read_from_file(FILE * f, cw_Cfg_t * cfg) +{ + char key[CW_CFG_MAX_KEY_LEN]; + char val[2048]; + struct parser p; + + p.line=1; + p.pos=0; + p.prevpos=0; + p.quote=0; + p.f=f; + + int rc; + + + do { + + rc = cw_cfg_read_line(f,&p,key,val); + if (rc==-1){ + fprintf(stderr,"Error: %s",p.error); + } + + + if (rc != 0){ + continue; + } + + cw_cfg_set(cfg,key,val); + + + }while(rc==0); + + return 0; +} + + +int cw_cfg_load(const char *filename,cw_Cfg_t * cfg) +{ + FILE *f = fopen(filename,"rb"); + if (!f) + return errno; + cw_cfg_read_from_file(f,cfg); + return 0; +} diff --git a/src/cw/cfg.h b/src/cw/cfg.h index b480147f..ff8aecf8 100644 --- a/src/cw/cfg.h +++ b/src/cw/cfg.h @@ -3,11 +3,16 @@ #include +#define CW_CFG_MAX_KEY_LEN 1024 + typedef struct mavl cw_Cfg_t; -cw_Cfg_t * cfg_create(); -int cfg_set(cw_Cfg_t *cfg,const char *key, const char *val); -void cw_Cfg_dump(cw_Cfg_t *cfg); +cw_Cfg_t * cw_cfg_create(); +int cw_cfg_set(cw_Cfg_t *cfg,const char *key, const char *val); +void cw_cfg_dump(cw_Cfg_t *cfg); +int cw_cfg_read_from_file(FILE * file, cw_Cfg_t * cfg); +int cw_cfg_load(const char *filename,cw_Cfg_t * cfg); + #endif