Work on shell
FossilOrigin-Name: d35a5a97ee9087fde859a9e0694d9eb7890d2834cd2df0712d81dfa47afc5323
This commit is contained in:
parent
127bad2fb5
commit
f9da482f69
@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<CodeLite_Workspace Name="actube" Database="">
|
<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="wtp" Path="wtp.project" Active="No"/>
|
||||||
<Project Name="mod_cipwap" Path="mod_cipwap.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_capwap" Path="mod_capwap.project" Active="No"/>
|
||||||
<Project Name="mod_cisco" Path="mod_cisco.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_capwap80211" Path="mod_capwap80211.project" Active="No"/>
|
||||||
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
|
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
|
||||||
<BuildMatrix>
|
<BuildMatrix>
|
||||||
|
@ -297,6 +297,8 @@
|
|||||||
<File Name="src/cw/cw_ktv_del_sub.c"/>
|
<File Name="src/cw/cw_ktv_del_sub.c"/>
|
||||||
<File Name="src/cw/cw_strtransition.c"/>
|
<File Name="src/cw/cw_strtransition.c"/>
|
||||||
<File Name="src/cw/netconn.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>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
<Description/>
|
<Description/>
|
||||||
|
245
src/ac/shell.c
245
src/ac/shell.c
@ -19,6 +19,114 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void show_cfg (FILE *out, mavl_t ktv)
|
void show_cfg (FILE *out, mavl_t ktv)
|
||||||
{
|
{
|
||||||
@ -46,9 +154,6 @@ void show_aps (FILE *out)
|
|||||||
{
|
{
|
||||||
struct connlist * cl;
|
struct connlist * cl;
|
||||||
mavliter_t it;
|
mavliter_t it;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
|
|
||||||
cl = wtplist_get_connlist();
|
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, "%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();
|
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)
|
void con (FILE *out)
|
||||||
{
|
{
|
||||||
struct connlist * cl;
|
struct connlist * cl;
|
||||||
@ -139,11 +274,74 @@ 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 cmd[1024];
|
||||||
char args[1024];
|
char args[1024];
|
||||||
int n;
|
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);
|
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);*/
|
/*printf("CMD: %s, ARGS:\n",cmd);*/
|
||||||
|
|
||||||
if (strcmp (cmd, "s") == 0) {
|
if (strcmp (cmd, "s") == 0) {
|
||||||
show_aps (out);
|
show_aps (sd->out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (cmd, "con")==0){
|
if (strcmp (cmd, "con")==0){
|
||||||
con(out);
|
con(sd->out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,20 +365,26 @@ void execute_cmd (FILE * out, const char *str)
|
|||||||
|
|
||||||
void shell_loop (FILE *file)
|
void shell_loop (FILE *file)
|
||||||
{
|
{
|
||||||
|
struct shelldata sd;
|
||||||
int c;
|
int c;
|
||||||
/* setvbuf(file,NULL,_IONBF,0);
|
/* setvbuf(file,NULL,_IONBF,0);
|
||||||
fflush(file);
|
fflush(file);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char str[2048];
|
char str[2048];
|
||||||
|
sd.update_cfg = cw_ktv_create();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sd.out = file;
|
||||||
|
sprintf(sd.prompt,"%s","*");
|
||||||
|
|
||||||
do {
|
do {
|
||||||
fprintf (file, "actube[%d]:>", fileno (file));
|
fprintf (file, "actube[%s]:>", sd.prompt);
|
||||||
fflush (file);
|
fflush (file);
|
||||||
str[0]=0;
|
str[0]=0;
|
||||||
fgets (str, sizeof (str), file);
|
fgets (str, sizeof (str), file);
|
||||||
execute_cmd (file, str);
|
execute_cmd (&sd, str);
|
||||||
|
|
||||||
} while (c != EOF);
|
} while (c != EOF);
|
||||||
|
|
||||||
@ -197,6 +401,8 @@ void * run_shell (void * arg)
|
|||||||
const char * addr = "127.0.0.1:5000";
|
const char * addr = "127.0.0.1:5000";
|
||||||
int sockfd, clientsock;
|
int sockfd, clientsock;
|
||||||
int yes;
|
int yes;
|
||||||
|
while(1){
|
||||||
|
|
||||||
|
|
||||||
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
|
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
|
||||||
|
|
||||||
@ -231,14 +437,17 @@ void * run_shell (void * arg)
|
|||||||
if (clientsock > 0) {
|
if (clientsock > 0) {
|
||||||
sock_addr2str_p (&client, sockstr);
|
sock_addr2str_p (&client, sockstr);
|
||||||
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
|
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
|
||||||
|
printf("New shell lopp\n");
|
||||||
shell_loop (fdopen (clientsock, "a+"));
|
shell_loop (fdopen (clientsock, "a+"));
|
||||||
|
printf("end shell lopp\n");
|
||||||
close (clientsock);
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -448,6 +448,7 @@ static void * wtpman_main(void *arg)
|
|||||||
tmp = conn->local_cfg;
|
tmp = conn->local_cfg;
|
||||||
|
|
||||||
conn->local_cfg=conn->update_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));
|
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));
|
||||||
|
|
||||||
|
@ -112,6 +112,7 @@ CWSRC=\
|
|||||||
|
|
||||||
KTVSRC=\
|
KTVSRC=\
|
||||||
cw_ktv_add.c\
|
cw_ktv_add.c\
|
||||||
|
cw_ktv_cast.c\
|
||||||
cw_ktv_replace.c\
|
cw_ktv_replace.c\
|
||||||
cw_ktv_add_from_str.c\
|
cw_ktv_add_from_str.c\
|
||||||
cw_ktv_get_byte.c\
|
cw_ktv_get_byte.c\
|
||||||
@ -125,6 +126,7 @@ KTVSRC=\
|
|||||||
cw_ktv_get_dword.c\
|
cw_ktv_get_dword.c\
|
||||||
cw_ktv_get_sysptr.c\
|
cw_ktv_get_sysptr.c\
|
||||||
cw_ktv_get_str.c\
|
cw_ktv_get_str.c\
|
||||||
|
cw_ktv_parser.c\
|
||||||
cw_ktv_idx_get.c\
|
cw_ktv_idx_get.c\
|
||||||
cw_ktv_mavlcmp.c\
|
cw_ktv_mavlcmp.c\
|
||||||
cw_ktv_mavlcmp_type_by_name.c\
|
cw_ktv_mavlcmp_type_by_name.c\
|
||||||
|
@ -58,6 +58,15 @@ static int cmp_by_session_id ( const void *d1, const void *d2 )
|
|||||||
struct conn * c1 = *( void ** ) d1;
|
struct conn * c1 = *( void ** ) d1;
|
||||||
struct conn * c2 = *( void ** ) d2;
|
struct conn * c2 = *( void ** ) d2;
|
||||||
int len1,len2;
|
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);
|
len1 = bstr16_len(c1->session_id);
|
||||||
len2 = bstr16_len(c2->session_id);
|
len2 = bstr16_len(c2->session_id);
|
||||||
|
|
||||||
|
14
src/cw/cw_ktv_cast.c
Normal file
14
src/cw/cw_ktv_cast.c
Normal 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
359
src/cw/cw_ktv_parser.c
Normal 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;
|
||||||
|
|
||||||
|
}
|
@ -9,8 +9,15 @@ struct parser {
|
|||||||
char error[256];
|
char error[256];
|
||||||
int quote;
|
int quote;
|
||||||
FILE *f;
|
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)
|
static int get_char(struct parser *p)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "dbg.h"
|
#include "dbg.h"
|
||||||
#include "log.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)
|
uint8_t * dst)
|
||||||
{
|
{
|
||||||
char key[CW_KTV_MAX_KEY_LEN];
|
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);
|
result = cw_ktv_get(ktv,key,NULL);
|
||||||
|
|
||||||
|
|
||||||
|
if (result == NULL && def != NULL){
|
||||||
|
result = cw_ktv_get(def,key,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (result == NULL){
|
if (result == NULL){
|
||||||
cw_log(LOG_ERR,"Can't put %s, no value found, filling zero.",key);
|
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{
|
else{
|
||||||
result->valguard=stru[i].valguard;
|
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);
|
printf("Type mismatch: %s != %s\n",stru[i].type->name,result->type->name);
|
||||||
if (stru[i].type->cast != NULL){
|
if (stru[i].type->cast != NULL){
|
||||||
if (!stru[i].type->cast(result)){
|
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);
|
result->type->put(result,dst+pos);
|
||||||
}
|
}
|
||||||
if (stru[i].len!=-1)
|
if (stru[i].len!=-1)
|
||||||
|
@ -16,8 +16,11 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
|
|||||||
int start, len, l;
|
int start, len, l;
|
||||||
|
|
||||||
/* Get the element */
|
/* Get the element */
|
||||||
search.key=(char*)handler->key;
|
/* search.key=(char*)handler->key;
|
||||||
elem = mavl_get(params->conn->local_cfg, &search);
|
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)
|
/* if (elem == NULL && params->conn->default_cfg !=NULL)
|
||||||
elem = mavl_get(params->conn->default_cfg, &search);
|
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 = handler->vendor ? 10 : 4; */
|
||||||
start = params->conn->header_len(handler);
|
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);
|
len = ((const cw_Type_t*)(handler->type))->put(elem,dst+start);
|
||||||
|
|
||||||
/* ((const cw_Type_t*)(handler->type))->to_str(elem,detail,120);
|
/* ((const cw_Type_t*)(handler->type))->to_str(elem,detail,120);
|
||||||
|
@ -33,7 +33,8 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH
|
|||||||
if (e[i].fun_out==NULL)
|
if (e[i].fun_out==NULL)
|
||||||
len += result->type->put(result,ob+start+len);
|
len += result->type->put(result,ob+start+len);
|
||||||
else
|
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.type=e[i].type;
|
||||||
thandler.key=key;
|
thandler.key=key;
|
||||||
|
@ -32,7 +32,9 @@ int cw_out_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandler
|
|||||||
|
|
||||||
start = params->conn->header_len(handler);
|
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);
|
return params->conn->write_header(handler,dst,len);
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ int cw_out_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHan
|
|||||||
start = mdst + params->conn->header_len(handler);
|
start = mdst + params->conn->header_len(handler);
|
||||||
|
|
||||||
len += cw_put_byte(start+len,idx);
|
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);
|
mdst += params->conn->write_header(handler,mdst,len);
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemH
|
|||||||
|
|
||||||
l=0;
|
l=0;
|
||||||
l+=cw_put_byte(cdst+offset+l,i);
|
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);
|
cdst+=params->conn->write_header(handler,cdst,l);
|
||||||
|
@ -101,6 +101,11 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
|
|||||||
params.debug_details=details;
|
params.debug_details=details;
|
||||||
*details=0;
|
*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);
|
l = handler->put(handler,¶ms,dst+len);
|
||||||
|
|
||||||
/* if(l>0)
|
/* if(l>0)
|
||||||
|
@ -91,6 +91,20 @@ static const char * get_type_name(cw_KTV_t *data)
|
|||||||
return CW_TYPE_BSTR16->name;
|
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 = {
|
const struct cw_Type cw_type_bstr16 = {
|
||||||
"Bstr16", /* name */
|
"Bstr16", /* name */
|
||||||
del, /* del */
|
del, /* del */
|
||||||
@ -100,5 +114,8 @@ const struct cw_Type cw_type_bstr16 = {
|
|||||||
from_str, /* from_str */
|
from_str, /* from_str */
|
||||||
len, /* len */
|
len, /* len */
|
||||||
data, /* data */
|
data, /* data */
|
||||||
get_type_name /* get_type_name */
|
get_type_name, /* get_type_name */
|
||||||
|
cast /* cast */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,6 +50,22 @@ static const char * get_type_name(cw_KTV_t *data)
|
|||||||
return CW_TYPE_DWORD->name;
|
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 = {
|
const struct cw_Type cw_type_dword = {
|
||||||
"Dword", /* name */
|
"Dword", /* name */
|
||||||
NULL, /* del */
|
NULL, /* del */
|
||||||
@ -59,6 +75,7 @@ const struct cw_Type cw_type_dword = {
|
|||||||
from_str, /* from_str */
|
from_str, /* from_str */
|
||||||
NULL, /* len */
|
NULL, /* len */
|
||||||
NULL, /* data */
|
NULL, /* data */
|
||||||
get_type_name /* get_type_name */
|
get_type_name, /* get_type_name */
|
||||||
|
cast
|
||||||
};
|
};
|
||||||
|
|
||||||
|
21
src/cw/ktv.h
21
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,
|
int cw_ktv_read_struct(mavl_t ktv,const cw_KTVStruct_t * stru, const char *pkey,
|
||||||
uint8_t * data, int len);
|
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);
|
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);
|
int cw_ktv_idx_get(mavl_t ktv, const char *key);
|
||||||
cw_KTV_t * cw_ktv_base_exists(mavl_t ktvstore, const char *basekey);
|
cw_KTV_t * cw_ktv_base_exists(mavl_t ktvstore, const char *basekey);
|
||||||
int cw_ktv_save(mavl_t ktvstore, const char * filename);
|
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[];
|
extern const cw_Type_t * cw_ktv_std_types[];
|
||||||
#define CW_KTV_STD_TYPES 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
|
* @} KTV
|
||||||
* @} ALGOS
|
* @} ALGOS
|
||||||
|
@ -61,7 +61,7 @@ cisco/ap-regulatory-domain.1/slot :Byte: 1
|
|||||||
cisco/ap-sub-mode :Byte: 0
|
cisco/ap-sub-mode :Byte: 0
|
||||||
cisco/ap-telnet-ssh/ssh :Bool: false
|
cisco/ap-telnet-ssh/ssh :Bool: false
|
||||||
cisco/ap-telnet-ssh/telnet :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-timesync/type :Byte: 0
|
||||||
cisco/ap-username-and-password/802.1x-credentials/option :Word: 2
|
cisco/ap-username-and-password/802.1x-credentials/option :Word: 2
|
||||||
cisco/ap-username-and-password/802.1x-credentials/password :Str:
|
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-fallback :Byte: 1
|
||||||
wtp-frame-tunnel-mode :Byte: 4
|
wtp-frame-tunnel-mode :Byte: 4
|
||||||
wtp-mac-type :Byte: 1
|
wtp-mac-type :Byte: 1
|
||||||
wtp-name :Bstr16: Banane
|
wtp-name :Bstr16: tube
|
||||||
wtp-reboot-statistics/ac-initiated-count :Word: 2
|
wtp-reboot-statistics/ac-initiated-count :Word: 2
|
||||||
wtp-reboot-statistics/hw-failure-count :Word: 0
|
wtp-reboot-statistics/hw-failure-count :Word: 0
|
||||||
wtp-reboot-statistics/last-failure-type :Byte: 0
|
wtp-reboot-statistics/last-failure-type :Byte: 0
|
||||||
|
@ -150,7 +150,7 @@ int run(struct conn * conn)
|
|||||||
|
|
||||||
/*mbag_get_word(conn->config,CW_ITEM_CAPWAP_TIMERS,CW_TIMERS)&0xff;*/
|
/*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;
|
int rc;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user