Work on shell

FossilOrigin-Name: d35a5a97ee9087fde859a9e0694d9eb7890d2834cd2df0712d81dfa47afc5323
This commit is contained in:
7u83@mail.ru 2018-05-14 21:30:48 +00:00
parent 127bad2fb5
commit f9da482f69
21 changed files with 719 additions and 36 deletions

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<CodeLite_Workspace Name="actube" Database="">
<Project Name="ac" Path="ac.project" Active="Yes"/>
<Project Name="ac" Path="ac.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="No"/>
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/>
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="Yes"/>
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/>
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
<BuildMatrix>

View File

@ -297,6 +297,8 @@
<File Name="src/cw/cw_ktv_del_sub.c"/>
<File Name="src/cw/cw_strtransition.c"/>
<File Name="src/cw/netconn.c"/>
<File Name="src/cw/cw_ktv_parser.c"/>
<File Name="src/cw/cw_ktv_cast.c"/>
</VirtualDirectory>
</VirtualDirectory>
<Description/>

View File

@ -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;i<reader.pos;i++){
fprintf(sd->out," ");
}
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));
}

View File

@ -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));

View File

@ -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\

View File

@ -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);

14
src/cw/cw_ktv_cast.c Normal file
View File

@ -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;
}

359
src/cw/cw_ktv_parser.c Normal file
View File

@ -0,0 +1,359 @@
#include <stdint.h>
#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 <ctype.h>
#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 && n<max_len){
if (!r->quote && !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 && n<max_len){
if (!isalnum(c) && !strchr("_/-.()@#|{}[]",c)/*strchr(": \t\n\a",c)*/){
unget_char(r,c);
break;
}
type[n]=c;
c=get_char(r);
n++;
}
type[n]=0;
return n;
}
static int read_val(struct cw_KTV_Reader *r, char *val, int max_len){
int c,n,quote;
c = skip_to_colon(r);
if (c==-1)
return -1;
c = skip_chars (r, " \t");
if (c=='"'){
quote=1;
c=get_char(r);
}
else{
quote=0;
}
n=0;
while(c!=EOF && n<max_len){
if (quote && c=='"'){
break;
}
if (c=='\n'){
break;
}
if (quote){
if (c=='\\'){
c = get_char(r);
switch(c){
case 'n':
c='\n';
break;
case '\\':
break;
case '"':
break;
default:
unget_char(r,c);
c='\\';
}
}
}
val[n++]=c;
c=get_char(r);
}
if(!quote && n>0){
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;
}

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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,&params,dst+len);

View File

@ -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 */
};

View File

@ -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
};

View File

@ -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

View File

@ -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

View File

@ -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;