From f9da482f690f9ed2e9fb2901f87f7ce4ba20a1bc Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Mon, 14 May 2018 21:30:48 +0000 Subject: [PATCH] Work on shell FossilOrigin-Name: d35a5a97ee9087fde859a9e0694d9eb7890d2834cd2df0712d81dfa47afc5323 --- actube.workspace | 4 +- libcw.project | 2 + src/ac/shell.c | 247 ++++++++++++++++-- src/ac/wtpman.c | 1 + src/cw/Makefile | 2 + src/cw/connlist.c | 9 + src/cw/cw_ktv_cast.c | 14 ++ src/cw/cw_ktv_parser.c | 359 +++++++++++++++++++++++++++ src/cw/cw_ktv_readline.c | 7 + src/cw/cw_ktv_write_struct.c | 16 +- src/cw/cw_out_generic.c | 11 +- src/cw/cw_out_generic_indexed_enum.c | 3 +- src/cw/cw_out_generic_struct.c | 4 +- src/cw/cw_out_idx_generic_struct.c | 2 +- src/cw/cw_out_radio_generic_struct.c | 2 +- src/cw/cw_put_msg.c | 5 + src/cw/cw_type_bstr16.c | 19 +- src/cw/cw_type_dword.c | 19 +- src/cw/ktv.h | 23 +- src/wtp/cisco.ktv | 4 +- src/wtp/run.c | 2 +- 21 files changed, 719 insertions(+), 36 deletions(-) create mode 100644 src/cw/cw_ktv_cast.c create mode 100644 src/cw/cw_ktv_parser.c diff --git a/actube.workspace b/actube.workspace index b21adfd1..e0162c79 100644 --- a/actube.workspace +++ b/actube.workspace @@ -1,11 +1,11 @@ - + - + diff --git a/libcw.project b/libcw.project index 69508a28..7a1bce2d 100644 --- a/libcw.project +++ b/libcw.project @@ -297,6 +297,8 @@ + + diff --git a/src/ac/shell.c b/src/ac/shell.c index 91789c57..3c374a2f 100644 --- a/src/ac/shell.c +++ b/src/ac/shell.c @@ -16,7 +16,115 @@ #include "wtplist.h" - + + + +struct shelldata{ + FILE *out; + char prompt[1024]; + mavl_t update_cfg; +}; + +void select_cmd(struct shelldata *sd, const char *cmd); +void list_cmd(struct shelldata *sd, const char * cmd); +void cfg_cmd(struct shelldata *sd, const char * cmd); +void ucfg_cmd(struct shelldata *sd, const char * cmd); +void set_cmd(struct shelldata *sd, const char * cmd); +void del_cmd(struct shelldata *sd, const char * cmd); +void send_cmd(struct shelldata *sd, const char * cmd); + +struct conn * find_ap(const char *name); + +struct command{ + char * cmd; + void (*fun)(); +}; + +static struct command cmdlist[]={ + {"cfg", cfg_cmd }, + {"del", del_cmd }, + {"ucfg", ucfg_cmd}, + {"list", list_cmd }, + {"select", select_cmd }, + {"send", send_cmd}, + {"set", set_cmd }, + + + {NULL,NULL} +}; + + +void select_cmd(struct shelldata *sd, const char *cmd) +{ + char ap [CAPWAP_MAX_WTP_NAME_LEN]; + sscanf(cmd,"%s",ap); + strcpy(sd->prompt,ap); +} + +void list_cmd(struct shelldata *sd, const char *cmd) +{ + show_aps(sd->out); +} + +void cfg_cmd(struct shelldata *sd, const char *cmd) +{ + struct conn * conn; + wtplist_lock(); + conn = find_ap(sd->prompt); + if (conn==NULL){ + fprintf(sd->out,"WTP '%s' not found\n",sd->prompt); + } + else { + show_cfg(sd->out,conn->remote_cfg); + } + wtplist_unlock(); +} + +void ucfg_cmd(struct shelldata *sd, const char *cmd) +{ + struct conn * conn; + show_cfg(sd->out,sd->update_cfg); + +} + +#include "wtpman.h" + +send_cmd(struct shelldata * sd, const char *cmd) +{ + struct conn * conn; + wtplist_lock(); + conn = find_ap(sd->prompt); + if (conn==NULL){ + fprintf(sd->out,"WTP '%s' not found\n",sd->prompt); + } + else { + conn->update_cfg=sd->update_cfg; + } + wtplist_unlock(); +} + +void set_cmd(struct shelldata *sd, const char *str) +{ + struct conn * conn; + struct cw_KTV_Reader r; + char key[CW_KTV_MAX_KEY_LEN]; + char type[CW_KTV_MAX_KEY_LEN]; + char val[2048]; + cw_ktv_init_str_reader(&r,str,strlen(str)); + + cw_ktv_parse_string(&r,key,type,val); + /*cw_ktv_parse_string(key,type,val, 2048);*/ + + fprintf(sd->out,"%s :%s: %s\n",key,type,val); + cw_ktv_add(sd->update_cfg,key,CW_TYPE_STR,NULL,val,strlen(val)); +} + +void del_cmd(struct shelldata *sd, const char *str) +{ + char key[CW_KTV_MAX_KEY_LEN]; + sscanf(str,"%s",key); + cw_ktv_del_sub(sd->update_cfg,key); +} @@ -46,9 +154,6 @@ void show_aps (FILE *out) { struct connlist * cl; mavliter_t it; - - - wtplist_lock(); cl = wtplist_get_connlist(); @@ -76,19 +181,49 @@ void show_aps (FILE *out) fprintf (out, "%s\t\t%s\n", addr, wtp_name); - - fprintf(out,"================= Local CFG: =================== \n"); - show_cfg(out,conn->local_cfg); - fprintf(out,"================= Remote CFG: ================== \n"); - show_cfg(out,conn->remote_cfg); - - fprintf(out,"\n"); - } wtplist_unlock(); } + +struct conn * find_ap(const char *name) +{ + struct connlist * cl; + mavliter_t it; + + /*wtplist_lock();*/ + cl = wtplist_get_connlist(); + + + mavliter_init (&it, cl->by_addr); + mavliter_foreach (&it) { + cw_KTV_t * result; + char wtp_name[CAPWAP_MAX_WTP_NAME_LEN]; + struct conn * conn; + conn = mavliter_get_ptr (&it); + + result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL); + + if (result == NULL) { + strcpy (wtp_name, ""); + + } else { + result->type->to_str (result, wtp_name, CAPWAP_MAX_WTP_NAME_LEN); + } + + printf("cmp '%s' : '%s'\n",wtp_name,name); + + if(strcmp(wtp_name,name)==0){ + return conn; + } + + } + return NULL; + /*wtplist_unlock();*/ +} + + void con (FILE *out) { struct connlist * cl; @@ -139,12 +274,75 @@ void con (FILE *out) } -void execute_cmd (FILE * out, const char *str) +struct command * find_cmd(const char *cmd) +{ + struct command * search; + + search = cmdlist; + while (search->cmd!=NULL){ + if (strncmp(cmd,search->cmd,strlen(cmd))==0){ + return search; + } + search ++; + } + return NULL; +} + + +void execute_cmd (struct shelldata * sd, const char *str) { char cmd[1024]; char args[1024]; int n; + struct cw_KTV_Reader reader; + struct command * searchcmd; + args[0]=0; + + n = sscanf (str, "%s", cmd); + if (n<=0) + return; + + searchcmd = find_cmd(cmd); + + if (searchcmd!=NULL){ + if (searchcmd->fun != NULL){ + fprintf(sd->out,"%s %s\n", searchcmd->cmd,str+strlen(cmd)); + searchcmd->fun(sd, str+strlen(cmd)); + } + } + else{ + fprintf(sd->out,"Unknown command: '%s'\n",cmd); + } + + return; + + + char key[CW_KTV_MAX_KEY_LEN]; + char type[128]; + char val[2048]; + + key[0]=0; + type[0]=0; + val[0]=0; + cw_ktv_init_str_reader(&reader,str, strlen(str)); + n = cw_ktv_parse_string(&reader, key,type,val); + + if (n==-1){ + int i; + fprintf(sd->out,"Error on pos %d\n",reader.pos); + fprintf(sd->out,"%s",str); + for(i=0;iout," "); + } + fprintf(sd->out,"^\n"); + fprintf(sd->out,"%s\n",reader.error); + } + else{ + fprintf(sd->out,"%s :%s: %s\n", key,type,val); + } + return; + n = sscanf (str, "%s%s", cmd, args); @@ -153,12 +351,12 @@ void execute_cmd (FILE * out, const char *str) /*printf("CMD: %s, ARGS:\n",cmd);*/ if (strcmp (cmd, "s") == 0) { - show_aps (out); + show_aps (sd->out); return; } if (strcmp (cmd, "con")==0){ - con(out); + con(sd->out); return; } @@ -167,20 +365,26 @@ void execute_cmd (FILE * out, const char *str) void shell_loop (FILE *file) { + struct shelldata sd; int c; /* setvbuf(file,NULL,_IONBF,0); fflush(file); */ char str[2048]; + sd.update_cfg = cw_ktv_create(); + + sd.out = file; + sprintf(sd.prompt,"%s","*"); + do { - fprintf (file, "actube[%d]:>", fileno (file)); + fprintf (file, "actube[%s]:>", sd.prompt); fflush (file); str[0]=0; fgets (str, sizeof (str), file); - execute_cmd (file, str); + execute_cmd (&sd, str); } while (c != EOF); @@ -197,7 +401,9 @@ void * run_shell (void * arg) const char * addr = "127.0.0.1:5000"; int sockfd, clientsock; int yes; +while(1){ + rc = sock_strtoaddr (addr, (struct sockaddr*) &server); if (! rc) { @@ -231,14 +437,17 @@ void * run_shell (void * arg) if (clientsock > 0) { sock_addr2str_p (&client, sockstr); cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr); + printf("New shell lopp\n"); shell_loop (fdopen (clientsock, "a+")); + printf("end shell lopp\n"); close (clientsock); + printf("close clsock\n"); } - printf ("Accepting %i, %s", rc, strerror (errno)); - + cw_dbg (DBG_INFO,"Accepting shell session %i, %s", rc, strerror (errno)); +} diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index f33c5208..b034821f 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -448,6 +448,7 @@ static void * wtpman_main(void *arg) tmp = conn->local_cfg; conn->local_cfg=conn->update_cfg; + conn->default_cfg = conn->remote_cfg; cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf)); diff --git a/src/cw/Makefile b/src/cw/Makefile index 0654be11..e23a8395 100644 --- a/src/cw/Makefile +++ b/src/cw/Makefile @@ -112,6 +112,7 @@ CWSRC=\ KTVSRC=\ cw_ktv_add.c\ + cw_ktv_cast.c\ cw_ktv_replace.c\ cw_ktv_add_from_str.c\ cw_ktv_get_byte.c\ @@ -125,6 +126,7 @@ KTVSRC=\ cw_ktv_get_dword.c\ cw_ktv_get_sysptr.c\ cw_ktv_get_str.c\ + cw_ktv_parser.c\ cw_ktv_idx_get.c\ cw_ktv_mavlcmp.c\ cw_ktv_mavlcmp_type_by_name.c\ diff --git a/src/cw/connlist.c b/src/cw/connlist.c index ed7a2516..2722711f 100644 --- a/src/cw/connlist.c +++ b/src/cw/connlist.c @@ -58,6 +58,15 @@ static int cmp_by_session_id ( const void *d1, const void *d2 ) struct conn * c1 = *( void ** ) d1; struct conn * c2 = *( void ** ) d2; int len1,len2; + + if (c1->session_id==NULL && c2->session_id==NULL) + return 0; + + if (c1->session_id==NULL) + return -1; + if (c2->session_id==NULL) + return 1; + len1 = bstr16_len(c1->session_id); len2 = bstr16_len(c2->session_id); diff --git a/src/cw/cw_ktv_cast.c b/src/cw/cw_ktv_cast.c new file mode 100644 index 00000000..93ece0cb --- /dev/null +++ b/src/cw/cw_ktv_cast.c @@ -0,0 +1,14 @@ +#include "ktv.h" + +cw_KTV_t * cw_ktv_cast(cw_KTV_t *v,const cw_Type_t * type) +{ + if (strcmp(v->type->name,type->name)==0) + return v; + if (type->cast==NULL) + return NULL; + if (!type->cast(v)) + return NULL; + + return v; +} + diff --git a/src/cw/cw_ktv_parser.c b/src/cw/cw_ktv_parser.c new file mode 100644 index 00000000..544f2e60 --- /dev/null +++ b/src/cw/cw_ktv_parser.c @@ -0,0 +1,359 @@ +#include + +#include "ktv.h" + + +static int str_getc(struct cw_KTV_Reader * r) +{ + if (r->next==r->maxlen) + return EOF; + + return *((uint8_t*)(r->data)+r->next++); +} + +static void str_ungetc(struct cw_KTV_Reader * r, int c) +{ + if (r->next>0) + r->next--; +} + +void cw_ktv_init_str_reader(struct cw_KTV_Reader *r, const char * str, int len) +{ + memset(r,0,sizeof(struct cw_KTV_Reader)); + r->data = str; + r->getchar=str_getc; + r->ungetchar=str_ungetc; + r->maxlen=len; +} + +#include + +#include "ktv.h" +/* +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 cw_KTV_Reader *r) +{ + int c; + c = r->getchar (r); + r->pos++; + if (c=='\n'){ + r->prevpos=r->pos; + r->line ++; + r->pos=0; + } + return c; +} + + +static void unget_char(struct cw_KTV_Reader * r,int c){ + r->ungetchar(r,c); + if (c=='\n'){ + r->line--; + r->pos=r->prevpos; + } + else + r->pos--; +} + + + +static int get_char_q(struct cw_KTV_Reader *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 cw_KTV_Reader *r, const char * chars) +{ + int c; + + while ( (c = get_char (r)) != EOF) { + if (strchr (chars, c)) + continue; + return c; + } + return c; +} + +static int skip_to_chars (struct cw_KTV_Reader *r, const char *chars) +{ + int c; + + while ( (c = get_char (r)) != EOF) { + if (strchr (chars, c)) + return c; + } + return c; +} + + + +static int read_key (struct cw_KTV_Reader *r, char *key, int max_len) +{ + int c,n; + + do { + c = skip_chars (r, " \t\n\a\v"); + if (c == '#') { + c = skip_to_chars (r, "\n\a"); + } else { + break; + } + } while (c != EOF); + + unget_char(r,c); + c=get_char_q(r); + + n=0; + while(c!=EOF && nquote && !isalnum(c) && !strchr("._/-()@#|{}[]\\",c)){ + unget_char(r,c); + break; + } + + key[n]=c; + c=get_char_q(r); + n++; + + } + key[n]=0; + return n; +} + + +static int skip_to_colon(struct cw_KTV_Reader * r) +{ + int c; + c = skip_chars (r, " \t"); + if (c!=':' && c!='='){ + if (c=='\n'){ + unget_char(r,c); + sprintf(r->error,"Unexpected EOL, colon or equal sign expected."); + return -1; + } + sprintf(r->error,"Colon or equal sign expected."); + return -1; + } + return c; +} + + +static int read_type(struct cw_KTV_Reader * r, char *type, int max_len) +{ + int c,n; + + c = skip_to_colon(r); + if (c==-1) + return -1; + if (c=='='){ + unget_char(r,c); + return sprintf(type,"%s","Str"); + + } + + c = skip_chars (r, " \t"); + + if (c==':'){ + unget_char(r,c); + sprintf(type,"%s","Str"); + return 0; + } + + if (!isalpha(c)){ + if (c=='\n'){ + unget_char(r,c); + /*sprintf(p->error,"Error at line %d, pos %d: Unexpected EOL.", p->line, p->pos);*/ + return -1; + } + + /*sprintf(p->error,"Error at line %d, pos %d: Letter expected.", p->line, p->pos);*/ + return -1; + } + + n=0; + while(c!=EOF && n0){ + while(n>0){ + if (isspace(val[n-1])) + n--; + else + break; + } + } + + val[n]=0; + + return n; + +} + + +/* +int cw_ktv_parse_line (FILE *f, char * key, char * type, char *val) +{ + int n; + + struct parser p; + p.line=1; + p.pos=0; + p.prevpos=0; + p.quote=0; + p.f=f; + + n = read_key (&p,key,CW_KTV_MAX_KEY_LEN); + n = read_type (&p,type,CW_KTV_MAX_KEY_LEN); + if (n==-1){ + return -1; + } + + n = read_val (&p,val,CW_KTV_MAX_KEY_LEN); + if (n==-1){ + return -1; + } + return 0; +} + */ + + +int cw_ktv_parse_line(struct cw_KTV_Reader * r) +{ + +} + +int cw_ktv_parse_string(struct cw_KTV_Reader *r, char *key, char *type, char *val) +{ + + int n; + + + + n = read_key (r,key,CW_KTV_MAX_KEY_LEN); + n = read_type(r,type,200); + if (n==1) + return -1; + n = read_val(r,val,200); + return n; + +} \ No newline at end of file diff --git a/src/cw/cw_ktv_readline.c b/src/cw/cw_ktv_readline.c index 8d9ad9e6..1534e8aa 100644 --- a/src/cw/cw_ktv_readline.c +++ b/src/cw/cw_ktv_readline.c @@ -9,8 +9,15 @@ struct parser { char error[256]; int quote; FILE *f; + int (*getc)(struct parser *); + void (*ungetc)(struct parser *) }; +static int pgetc(struct parser *parser) +{ + return fgetc(parser->f); +} + static int get_char(struct parser *p) { int c; diff --git a/src/cw/cw_ktv_write_struct.c b/src/cw/cw_ktv_write_struct.c index 3ea21f8f..0bff000b 100644 --- a/src/cw/cw_ktv_write_struct.c +++ b/src/cw/cw_ktv_write_struct.c @@ -2,7 +2,7 @@ #include "dbg.h" #include "log.h" -int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pkey, +int cw_ktv_write_struct(mavl_t ktv, mavl_t def, const cw_KTVStruct_t * stru, const char *pkey, uint8_t * dst) { char key[CW_KTV_MAX_KEY_LEN]; @@ -28,6 +28,10 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke result = cw_ktv_get(ktv,key,NULL); + if (result == NULL && def != NULL){ + result = cw_ktv_get(def,key,NULL); + } + if (result == NULL){ cw_log(LOG_ERR,"Can't put %s, no value found, filling zero.",key); @@ -35,7 +39,13 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke } else{ result->valguard=stru[i].valguard; - if (strcmp(stru[i].type->name,result->type->name)){ + if (cw_ktv_cast(result,stru[i].type)==NULL){ + cw_log(LOG_ERR,"Can't cast key '%s' from %s to %s",key,result->type->name,stru[i].type->name); + } +/* if (strcmp(stru[i].type->name,result->type->name)){ + + + printf("Type mismatch: %s != %s\n",stru[i].type->name,result->type->name); if (stru[i].type->cast != NULL){ if (!stru[i].type->cast(result)){ @@ -46,7 +56,7 @@ int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pke } - +*/ result->type->put(result,dst+pos); } if (stru[i].len!=-1) diff --git a/src/cw/cw_out_generic.c b/src/cw/cw_out_generic.c index 0fbeb593..9c152965 100644 --- a/src/cw/cw_out_generic.c +++ b/src/cw/cw_out_generic.c @@ -16,8 +16,11 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams int start, len, l; /* Get the element */ - search.key=(char*)handler->key; +/* search.key=(char*)handler->key; elem = mavl_get(params->conn->local_cfg, &search); +*/ + elem = cw_ktv_get(params->conn->local_cfg,handler->key,NULL); + /* if (elem == NULL && params->conn->default_cfg !=NULL) elem = mavl_get(params->conn->default_cfg, &search); */ @@ -48,6 +51,12 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams /* start = handler->vendor ? 10 : 4; */ start = params->conn->header_len(handler); + if (cw_ktv_cast(elem,handler->type)==NULL){ + cw_log(LOG_ERR,"Can't put element '%s'- can't cast from %s to %s for key: %s", handler->name, + elem->type->name, ((const cw_Type_t*)handler->type)->name, handler->key); + return 0; + } + len = ((const cw_Type_t*)(handler->type))->put(elem,dst+start); /* ((const cw_Type_t*)(handler->type))->to_str(elem,detail,120); diff --git a/src/cw/cw_out_generic_indexed_enum.c b/src/cw/cw_out_generic_indexed_enum.c index f3f02f81..cad101d2 100644 --- a/src/cw/cw_out_generic_indexed_enum.c +++ b/src/cw/cw_out_generic_indexed_enum.c @@ -33,7 +33,8 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH if (e[i].fun_out==NULL) len += result->type->put(result,ob+start+len); else - len += cw_ktv_write_struct(params->conn->local_cfg,e[i].type,key,ob+start+len); + len += cw_ktv_write_struct(params->conn->local_cfg, + NULL,e[i].type,key,ob+start+len); /* thandler.type=e[i].type; thandler.key=key; diff --git a/src/cw/cw_out_generic_struct.c b/src/cw/cw_out_generic_struct.c index e50af373..217c89e6 100644 --- a/src/cw/cw_out_generic_struct.c +++ b/src/cw/cw_out_generic_struct.c @@ -32,7 +32,9 @@ int cw_out_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandler start = params->conn->header_len(handler); - len = cw_ktv_write_struct(params->conn->local_cfg,handler->type,handler->key,dst+start); + len = cw_ktv_write_struct(params->conn->local_cfg, + params->conn->default_cfg, + handler->type,handler->key,dst+start); return params->conn->write_header(handler,dst,len); diff --git a/src/cw/cw_out_idx_generic_struct.c b/src/cw/cw_out_idx_generic_struct.c index edd0c010..ddb2d2b8 100644 --- a/src/cw/cw_out_idx_generic_struct.c +++ b/src/cw/cw_out_idx_generic_struct.c @@ -43,7 +43,7 @@ int cw_out_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHan start = mdst + params->conn->header_len(handler); len += cw_put_byte(start+len,idx); - len += cw_ktv_write_struct(params->conn->local_cfg,handler->type,key,start+len); + len += cw_ktv_write_struct(params->conn->local_cfg,NULL, handler->type,key,start+len); mdst += params->conn->write_header(handler,mdst,len); diff --git a/src/cw/cw_out_radio_generic_struct.c b/src/cw/cw_out_radio_generic_struct.c index a60f3710..c4cd2e45 100644 --- a/src/cw/cw_out_radio_generic_struct.c +++ b/src/cw/cw_out_radio_generic_struct.c @@ -43,7 +43,7 @@ int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemH l=0; l+=cw_put_byte(cdst+offset+l,i); - l+= cw_ktv_write_struct(params->conn->local_cfg,handler->type,basekey,cdst+offset+l); + l+= cw_ktv_write_struct(params->conn->local_cfg,NULL, handler->type,basekey,cdst+offset+l); cdst+=params->conn->write_header(handler,cdst,l); diff --git a/src/cw/cw_put_msg.c b/src/cw/cw_put_msg.c index f817bba4..0fd582f1 100644 --- a/src/cw/cw_put_msg.c +++ b/src/cw/cw_put_msg.c @@ -100,6 +100,11 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout) params.msgdata=msg; params.debug_details=details; *details=0; + + if (strcmp(handler->key,"cisco/ap-led-flash-config")==0){ + printf("flash config\n"); + /* cisco/ap-led-flash-config/flash-enable */ + } l = handler->put(handler,¶ms,dst+len); diff --git a/src/cw/cw_type_bstr16.c b/src/cw/cw_type_bstr16.c index c3866104..354db6b7 100644 --- a/src/cw/cw_type_bstr16.c +++ b/src/cw/cw_type_bstr16.c @@ -91,6 +91,20 @@ static const char * get_type_name(cw_KTV_t *data) return CW_TYPE_BSTR16->name; } +static int cast(cw_KTV_t * data) +{ + if (strcmp(data->type->name,CW_TYPE_BSTR16->name)==0) + return 1; + if (strcmp(data->type->name,CW_TYPE_STR->name)==0){ + char *src = data->val.ptr; + CW_TYPE_BSTR16->from_str(data,src); + free(src); + return 1; + } + return 0; +} + + const struct cw_Type cw_type_bstr16 = { "Bstr16", /* name */ del, /* del */ @@ -100,5 +114,8 @@ const struct cw_Type cw_type_bstr16 = { from_str, /* from_str */ len, /* len */ data, /* data */ - get_type_name /* get_type_name */ + get_type_name, /* get_type_name */ + cast /* cast */ }; + + diff --git a/src/cw/cw_type_dword.c b/src/cw/cw_type_dword.c index 51593255..db0b9a30 100644 --- a/src/cw/cw_type_dword.c +++ b/src/cw/cw_type_dword.c @@ -50,6 +50,22 @@ static const char * get_type_name(cw_KTV_t *data) return CW_TYPE_DWORD->name; } + + +static int cast(cw_KTV_t * data) +{ + if (strcmp(data->type->name,CW_TYPE_BYTE->name)==0) + return 1; + if (strcmp(data->type->name,CW_TYPE_STR->name)==0){ + char *src = data->val.ptr; + CW_TYPE_DWORD->from_str(data,src); + free(src); + return 1; + } + return 0; +} + + const struct cw_Type cw_type_dword = { "Dword", /* name */ NULL, /* del */ @@ -59,6 +75,7 @@ const struct cw_Type cw_type_dword = { from_str, /* from_str */ NULL, /* len */ NULL, /* data */ - get_type_name /* get_type_name */ + get_type_name, /* get_type_name */ + cast }; diff --git a/src/cw/ktv.h b/src/cw/ktv.h index b697d1ad..8ae1b8db 100644 --- a/src/cw/ktv.h +++ b/src/cw/ktv.h @@ -136,7 +136,7 @@ typedef struct cw_KTVIndexed cw_KTVIndexed_t; int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey, uint8_t * data, int len); -int cw_ktv_write_struct(mavl_t ktv, const cw_KTVStruct_t * stru, const char *pkey, +int cw_ktv_write_struct(mavl_t ktv, mavl_t def, const cw_KTVStruct_t * stru, const char *pkey, uint8_t * dst); @@ -209,10 +209,29 @@ char * cw_ktv_get_str(mavl_t ktv,const char *key, char * def); int cw_ktv_idx_get(mavl_t ktv, const char *key); cw_KTV_t * cw_ktv_base_exists(mavl_t ktvstore, const char *basekey); int cw_ktv_save(mavl_t ktvstore, const char * filename); - +cw_KTV_t * cw_ktv_cast(cw_KTV_t *v,const cw_Type_t * type); + extern const cw_Type_t * cw_ktv_std_types[]; #define CW_KTV_STD_TYPES cw_ktv_std_types + + +struct cw_KTV_Reader { + const void * data; + int (*getchar)(struct cw_KTV_Reader *); + void (*ungetchar)(struct cw_KTV_Reader *, int c); + int quote; + int line; + int pos; + int prevpos; + int next; + int maxlen; + char error[256]; +}; + +void cw_ktv_init_str_reader(struct cw_KTV_Reader *r, const char * str, int len); +int cw_ktv_parse_string(struct cw_KTV_Reader *r, char *key, char *type, char *val); + /** * @} KTV * @} ALGOS diff --git a/src/wtp/cisco.ktv b/src/wtp/cisco.ktv index b6a220f8..e5804f08 100644 --- a/src/wtp/cisco.ktv +++ b/src/wtp/cisco.ktv @@ -61,7 +61,7 @@ cisco/ap-regulatory-domain.1/slot :Byte: 1 cisco/ap-sub-mode :Byte: 0 cisco/ap-telnet-ssh/ssh :Bool: false cisco/ap-telnet-ssh/telnet :Bool: false -cisco/ap-timesync/timestamp :Dword: 1525727327 +cisco/ap-timesync/timestamp :Dword: 1526318158 cisco/ap-timesync/type :Byte: 0 cisco/ap-username-and-password/802.1x-credentials/option :Word: 2 cisco/ap-username-and-password/802.1x-credentials/password :Str: @@ -273,7 +273,7 @@ wtp-descriptor/software/version :Bstr16: .x08007900 wtp-fallback :Byte: 1 wtp-frame-tunnel-mode :Byte: 4 wtp-mac-type :Byte: 1 -wtp-name :Bstr16: Banane +wtp-name :Bstr16: tube wtp-reboot-statistics/ac-initiated-count :Word: 2 wtp-reboot-statistics/hw-failure-count :Word: 0 wtp-reboot-statistics/last-failure-type :Byte: 0 diff --git a/src/wtp/run.c b/src/wtp/run.c index 376da582..7c280451 100644 --- a/src/wtp/run.c +++ b/src/wtp/run.c @@ -150,7 +150,7 @@ int run(struct conn * conn) /*mbag_get_word(conn->config,CW_ITEM_CAPWAP_TIMERS,CW_TIMERS)&0xff;*/ - time_t timer = cw_timer_start(echo_interval); + time_t timer = cw_timer_start(echo_interval-1); int rc;