Compare commits
55 Commits
Author | SHA1 | Date |
---|---|---|
|
5423709dda | 9 months ago |
|
e974b3ae2d | 9 months ago |
|
07257f51fe | 9 months ago |
|
dec1cf2003 | 9 months ago |
|
40427b3816 | 9 months ago |
|
435b3f823e | 9 months ago |
|
ae686f4634 | 9 months ago |
|
b292b88d49 | 9 months ago |
|
97533f67cc | 9 months ago |
|
259c6c5e66 | 9 months ago |
|
bc5dea6016 | 9 months ago |
|
ec6809b552 | 9 months ago |
|
1297c46a15 | 9 months ago |
|
cc257ed27f | 9 months ago |
|
059c0e542e | 9 months ago |
|
9d3fa452aa | 9 months ago |
|
300b737efd | 9 months ago |
|
085e657c76 | 9 months ago |
|
f62b1c56e1 | 9 months ago |
|
acc7b692ee | 9 months ago |
|
8a8381731f | 9 months ago |
|
6f4ba62080 | 9 months ago |
|
0eb3e16932 | 9 months ago |
|
ca4a6b9996 | 9 months ago |
|
66db979fdb | 9 months ago |
|
0078c07e58 | 9 months ago |
|
20bd835f63 | 9 months ago |
|
1e8b52fd03 | 9 months ago |
|
2f1985b821 | 9 months ago |
|
27506fa788 | 9 months ago |
|
5ed35979cd | 9 months ago |
|
2064f7dba1 | 9 months ago |
|
190c94ded4 | 9 months ago |
|
4fe2bae7f7 | 9 months ago |
|
89e7e61e1d | 9 months ago |
|
2b055175c7 | 9 months ago |
|
0ebac6c98e | 9 months ago |
|
15e363f34e | 9 months ago |
|
2b6dc68ee5 | 9 months ago |
|
e39f4eb097 | 9 months ago |
|
4ef1b69f83 | 9 months ago |
|
a77023165b | 9 months ago |
|
62616b5e7b | 9 months ago |
|
79b688c38e | 9 months ago |
|
4995cac9b8 | 9 months ago |
|
d7c826fac6 | 9 months ago |
|
d668e0e5a7 | 9 months ago |
|
63cb0b928f | 9 months ago |
|
361e9dd1aa | 9 months ago |
|
3f69dbf67e | 9 months ago |
|
43b75502f7 | 9 months ago |
|
4a565efff1 | 9 months ago |
|
54955daff4 | 9 months ago |
|
4047707fa8 | 9 months ago |
|
5b1690bfbf | 9 months ago |
@ -1,35 +0,0 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<CodeLite_Workspace Name="actube" Database=""> |
||||
<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="Yes"/> |
||||
<Project Name="libcw" Path="libcw.project" Active="No"/> |
||||
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/> |
||||
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/> |
||||
<BuildMatrix> |
||||
<WorkspaceConfiguration Name="Debug" Selected="yes"> |
||||
<Environment/> |
||||
<Project Name="ac" ConfigName="Debug"/> |
||||
<Project Name="wtp" ConfigName="Debug"/> |
||||
<Project Name="mod_cipwap" ConfigName="Debug"/> |
||||
<Project Name="mod_capwap" ConfigName="Debug"/> |
||||
<Project Name="mod_cisco" ConfigName="Debug"/> |
||||
<Project Name="libcw" ConfigName="Debug"/> |
||||
<Project Name="mod_capwap80211" ConfigName="Debug"/> |
||||
<Project Name="mod_fortinet" ConfigName="Debug"/> |
||||
</WorkspaceConfiguration> |
||||
<WorkspaceConfiguration Name="Release" Selected="yes"> |
||||
<Environment/> |
||||
<Project Name="ac" ConfigName="Release"/> |
||||
<Project Name="wtp" ConfigName="Release"/> |
||||
<Project Name="mod_cipwap" ConfigName="Release"/> |
||||
<Project Name="mod_capwap" ConfigName="Release"/> |
||||
<Project Name="mod_cisco" ConfigName="Release"/> |
||||
<Project Name="libcw" ConfigName="Release"/> |
||||
<Project Name="mod_capwap80211" ConfigName="Release"/> |
||||
<Project Name="mod_fortinet" ConfigName="Release"/> |
||||
</WorkspaceConfiguration> |
||||
</BuildMatrix> |
||||
</CodeLite_Workspace> |
@ -1,487 +0,0 @@ |
||||
|
||||
#include <sqlite3.h> |
||||
|
||||
|
||||
#include "cw/log.h" |
||||
#include "cw/dbg.h" |
||||
|
||||
#include "cw/conn.h" |
||||
|
||||
|
||||
|
||||
#include "conf.h" |
||||
|
||||
static sqlite3 *handle; |
||||
|
||||
|
||||
static const char * init_tables = "\
|
||||
CREATE TABLE IF NOT EXISTS acs (acid TEXT PRIMARY KEY, acname TEXT, lastseen TIMESTAMP); \
|
||||
CREATE TABLE IF NOT EXISTS radios (\
|
||||
wtpid TEXT,\
|
||||
rid TEXT,\
|
||||
key TEXT,\
|
||||
sub_key,\
|
||||
val TEXT, \
|
||||
upd INTEGER, \
|
||||
PRIMARY KEY (wtpid,rid,key,sub_key)\
|
||||
);\
|
||||
CREATE TABLE IF NOT EXISTS acips (acid TEXT,ip TEXT); \
|
||||
CREATE TABLE IF NOT EXISTS wtps (wtpid TEXT PRIMARY KEY, acid TEXT,lastseen TIMESTAMP); \
|
||||
CREATE TABLE IF NOT EXISTS wtpprops (\
|
||||
wtpid TEXT NOT NULL,\
|
||||
id TEXT NOT NULL,\
|
||||
sub_id TEXT NOT NULL,\
|
||||
val TEXT,\
|
||||
upd INTEGER,\
|
||||
PRIMARY KEY(wtpid,id,sub_id)\
|
||||
);\
|
||||
CREATE TABLE IF NOT EXISTS wlans (wlanid INTEGER PRIMARY KEY);\
|
||||
CREATE TABLE IF NOT EXISTS wlanprops (wlanid INTEGER, id TEXT NOT NULL, val TEXT, PRIMARY KEY(wlanid,id));\
|
||||
"; |
||||
|
||||
|
||||
|
||||
|
||||
int db_init() |
||||
{ |
||||
|
||||
int rc; |
||||
const char * filename="ac.sqlite3"; |
||||
cw_dbg(DBG_INFO,"Initializing Sqlite3 DB: %s, SQLite3 Version %s",filename,SQLITE_VERSION); |
||||
|
||||
rc = sqlite3_config(SQLITE_CONFIG_SERIALIZED); |
||||
if (rc!=SQLITE_OK){ |
||||
cw_log(LOG_ERR,"Error configuring SQLite3: %s",sqlite3_errmsg(handle));
|
||||
return 0; |
||||
}
|
||||
|
||||
rc = sqlite3_initialize(); |
||||
if (rc!=SQLITE_OK){ |
||||
cw_log(LOG_ERR,"Error initializing SQLite3 DB : %s",sqlite3_errmsg(handle));
|
||||
return 0; |
||||
}
|
||||
|
||||
|
||||
|
||||
rc = sqlite3_open(filename,&handle); |
||||
if (rc != SQLITE_OK) |
||||
{ |
||||
cw_log(LOG_ERR,"Error opening SQLite3 DB %s: %s",filename,sqlite3_errmsg(handle));
|
||||
return 0; |
||||
} |
||||
|
||||
const char * cmd = init_tables; |
||||
rc = sqlite3_exec(handle,cmd,0,0,0); |
||||
if (rc) |
||||
{ |
||||
const char *em = sqlite3_errmsg(handle); |
||||
cw_log(LOG_ERR,"Error executing SQL \"%s\"\nSQL Error Message: %s",cmd, em); |
||||
return 0; |
||||
|
||||
} |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
|
||||
static sqlite3_stmt * ping_stmt; |
||||
static sqlite3_stmt * put_wtp_prop_stmt; |
||||
|
||||
|
||||
static sqlite3_stmt * get_tasks_stmt; |
||||
|
||||
static sqlite3_stmt * stmt_get_radio_tasks; |
||||
|
||||
static sqlite3_stmt * stmt_ping_wtp; |
||||
static sqlite3_stmt * stmt_put_radio_prop; |
||||
|
||||
int db_start() |
||||
{ |
||||
cw_dbg(DBG_INFO,"Starting Sqlite3 DB"); |
||||
|
||||
const char *sql=""; |
||||
|
||||
sqlite3_stmt *stmt; |
||||
int rc = sqlite3_prepare_v2(handle, "INSERT OR REPLACE INTO acs (acid,acname) VALUES (?,?);",-1,&stmt,0); |
||||
if (rc) |
||||
goto errX; |
||||
|
||||
rc = sqlite3_bind_text(stmt,1,conf_acid,-1,SQLITE_STATIC); |
||||
|
||||
rc = sqlite3_bind_text(stmt,2,conf_acname,-1,SQLITE_STATIC); |
||||
|
||||
sqlite3_step(stmt); |
||||
|
||||
rc = sqlite3_prepare_v2(handle, "UPDATE acs SET lastseen=datetime('now') WHERE acid=?;",-1,&ping_stmt,0); |
||||
rc = sqlite3_bind_text(ping_stmt,1,conf_acid,-1,SQLITE_STATIC); |
||||
|
||||
|
||||
/* Prepare statement to update a WTP property */ |
||||
sql = "INSERT OR REPLACE INTO wtpprops\
|
||||
(wtpid,id,sub_id,val,upd)\
|
||||
VALUES (?,?,?,?,?)"; |
||||
|
||||
rc = sqlite3_prepare_v2(handle, sql,-1, &put_wtp_prop_stmt,0); |
||||
if (rc)
|
||||
goto errX; |
||||
|
||||
|
||||
sql = "INSERT OR REPLACE INTO radios\
|
||||
(wtpid,rid,key,sub_key,val,upd)\
|
||||
VALUES (?,?,?,?,?,0)"; |
||||
|
||||
rc = sqlite3_prepare_v2(handle, sql,-1, &stmt_put_radio_prop,0); |
||||
if (rc)
|
||||
goto errX; |
||||
|
||||
|
||||
/* Prepare WTP ping statement */ |
||||
sql = "INSERT OR REPLACE INTO wtps (wtpid,acid,lastseen) VALUES(?,?,datetime('now'))"; |
||||
rc = sqlite3_prepare_v2(handle, sql,-1, &stmt_ping_wtp,0); |
||||
if (rc)
|
||||
goto errX; |
||||
|
||||
|
||||
|
||||
sql = "SELECT wtpid,id,sub_id,val FROM wtpprops WHERE upd>0 AND wtpid=?"; |
||||
rc = sqlite3_prepare_v2(handle, sql,-1, &get_tasks_stmt,0); |
||||
if (rc)
|
||||
goto errX; |
||||
|
||||
|
||||
sql = "SELECT wtpid,rid,key,sub_key,val FROM radios WHERE upd>0 AND wtpid=?"; |
||||
rc = sqlite3_prepare_v2(handle, sql,-1, &stmt_get_radio_tasks,0); |
||||
if (rc)
|
||||
goto errX; |
||||
|
||||
|
||||
|
||||
return 1; |
||||
|
||||
errX: |
||||
cw_log(LOG_ERR,"Fatal: Can't start Sqlite3 DB, Error while executing '%s' - %d - %s",sql,rc,sqlite3_errmsg(handle)); |
||||
return 0; |
||||
|
||||
|
||||
} |
||||
|
||||
void db_put_radio_prop(const char *wtp_id,const char *rid, const char * key,const char *sub_key,const char * val) |
||||
{ |
||||
int rc=0; |
||||
|
||||
/*// DBGX("Putting %s/%s:%s",id,sub_id,val);
|
||||
// (wtpid,rid,key,sub_key,val,upd)
|
||||
*/ |
||||
sqlite3_reset(stmt_put_radio_prop); |
||||
sqlite3_clear_bindings(stmt_put_radio_prop); |
||||
|
||||
if(sqlite3_bind_text(stmt_put_radio_prop,1,wtp_id,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if(sqlite3_bind_text(stmt_put_radio_prop,2,rid,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
|
||||
|
||||
if (sqlite3_bind_text(stmt_put_radio_prop,3,key,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
|
||||
/* if (!sub_key)
|
||||
sub_key=CW_ITEM_NONE; |
||||
*/ |
||||
if (sqlite3_bind_text(stmt_put_radio_prop,4,sub_key,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if (sqlite3_bind_text(stmt_put_radio_prop,5,val,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
|
||||
/*
|
||||
// if (sqlite3_bind_int(put_wtp_prop_stmt,5,0))
|
||||
// goto errX;
|
||||
|
||||
// cw_dbg(DBG_X,"Her I am already, next is step");
|
||||
*/ |
||||
rc = sqlite3_step(stmt_put_radio_prop); |
||||
if (rc != SQLITE_DONE) |
||||
goto errX; |
||||
|
||||
/*
|
||||
// cw_dbg(DBG_X,"SQL schould be fine");
|
||||
*/ |
||||
return; |
||||
errX: |
||||
/*// cw_dbg (DBG_X, "Iam on err %d\n",rc);*/ |
||||
|
||||
|
||||
if (rc) { |
||||
cw_log(LOG_ERR,"Can't update database with WTP props: %d - %s", |
||||
rc,sqlite3_errmsg(handle)); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void db_ping() |
||||
{ |
||||
int rc = sqlite3_step(ping_stmt); |
||||
if (rc!=SQLITE_DONE){ |
||||
cw_log(LOG_ERR,"Error: Can't ping database, error code %d - %s",rc,sqlite3_errmsg(handle)); |
||||
} |
||||
} |
||||
|
||||
|
||||
void db_ping_wtp(const char *wtpid,const char *acid) |
||||
{ |
||||
int rc=0; |
||||
sqlite3_reset(stmt_ping_wtp); |
||||
sqlite3_clear_bindings(stmt_ping_wtp); |
||||
if(sqlite3_bind_text(stmt_ping_wtp,1,wtpid,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if(sqlite3_bind_text(stmt_ping_wtp,2,acid,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
rc = sqlite3_step(stmt_ping_wtp); |
||||
errX: |
||||
if (rc!=SQLITE_DONE) { |
||||
cw_log(LOG_ERR,"Can't ping database for WTP: %d - %s", |
||||
rc,sqlite3_errmsg(handle)); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
void db_put_wtp_prop(const char *wtp_id,const char * id,const char *sub_id,const char * val) |
||||
{ |
||||
int rc=0; |
||||
|
||||
/*// DBGX("Putting %s/%s:%s",id,sub_id,val);
|
||||
*/ |
||||
|
||||
sqlite3_reset(put_wtp_prop_stmt); |
||||
sqlite3_clear_bindings(put_wtp_prop_stmt); |
||||
|
||||
if(sqlite3_bind_text(put_wtp_prop_stmt,1,wtp_id,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if(sqlite3_bind_text(put_wtp_prop_stmt,2,id,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
/* if (!sub_id)
|
||||
sub_id=CW_ITEM_NONE; |
||||
*/ |
||||
|
||||
if (sqlite3_bind_text(put_wtp_prop_stmt,3,sub_id,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if (sqlite3_bind_text(put_wtp_prop_stmt,4,val,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
if (sqlite3_bind_int(put_wtp_prop_stmt,5,0)) |
||||
goto errX; |
||||
|
||||
/*// cw_dbg(DBG_X,"Her I am already, next is step");
|
||||
*/ |
||||
rc = sqlite3_step(put_wtp_prop_stmt); |
||||
if (rc != SQLITE_DONE) |
||||
goto errX; |
||||
|
||||
/*
|
||||
// cw_dbg(DBG_X,"SQL schould be fine");
|
||||
*/ |
||||
return; |
||||
errX: |
||||
/*// cw_dbg (DBG_X, "Iam on err %d\n",rc);*/ |
||||
|
||||
|
||||
if (rc) { |
||||
cw_log(LOG_ERR,"Can't update database with WTP props: %d - %s", |
||||
rc,sqlite3_errmsg(handle)); |
||||
} |
||||
|
||||
} |
||||
|
||||
/*// TODO XXXX*/ |
||||
mavl_t db_get_update_tasks(struct conn * conn,const char * wtpid) |
||||
{ |
||||
/*
|
||||
sqlite3_reset(get_tasks_stmt); |
||||
sqlite3_clear_bindings(get_tasks_stmt); |
||||
|
||||
mavl_conststr_t r = mavl_create_conststr(); |
||||
if (!r) |
||||
return NULL; |
||||
|
||||
|
||||
int rc=0; |
||||
|
||||
|
||||
if(sqlite3_bind_text(get_tasks_stmt,1,wtpid,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
while (SQLITE_ROW == sqlite3_step(get_tasks_stmt)) { |
||||
|
||||
int ii; |
||||
//DBGX("-----------------------------------------------------","");
|
||||
for (ii=0; ii<5; ii++){ |
||||
|
||||
//DBGX("CVALL: %s",(const char*)sqlite3_column_text(get_tasks_stmt,ii));
|
||||
|
||||
|
||||
} |
||||
|
||||
const char *id = (const char*)sqlite3_column_text(get_tasks_stmt,1); |
||||
if (!id) { |
||||
continue; |
||||
} |
||||
|
||||
const char *sub_id = (const char*)sqlite3_column_text(get_tasks_stmt,2); |
||||
|
||||
const char *val = (const char*)sqlite3_column_text(get_tasks_stmt,3); |
||||
|
||||
//DBGX("ID: (%s), SubID (%s), Val (%s)",id,sub_id,val);
|
||||
|
||||
const struct cw_itemdef * cwi = cw_itemdef_get(conn->actions->items,id,sub_id); |
||||
if (!cwi) { |
||||
//DBGX("Not item definition found for: %s/%s",id,sub_id);
|
||||
continue;
|
||||
} |
||||
|
||||
//uint8_t data[2048];
|
||||
|
||||
if (!cwi->type->from_str) { |
||||
cw_log(LOG_ERR,"Can't convert from string %s/%s - No method defined.",id,sub_id); |
||||
continue; |
||||
} |
||||
|
||||
|
||||
mbag_item_t * i = cwi->type->from_str(val); |
||||
i->id=cwi->id; |
||||
|
||||
mbag_set(conn->outgoing,i); |
||||
|
||||
mavl_add(r,(void*)cwi->id); |
||||
} |
||||
|
||||
if (r->count) |
||||
return r; |
||||
|
||||
mavl_destroy(r); |
||||
return NULL; |
||||
|
||||
|
||||
errX: |
||||
if (rc) { |
||||
cw_log(LOG_ERR,"Can't get tasks: %d - %s", |
||||
rc,sqlite3_errmsg(handle)); |
||||
} |
||||
|
||||
if (r) |
||||
mavl_destroy(r); |
||||
|
||||
|
||||
return NULL; |
||||
*/ |
||||
} |
||||
|
||||
|
||||
|
||||
mavl_t db_get_radio_tasks(struct conn * conn,const char * wtpid) |
||||
{ |
||||
/*
|
||||
//cw_dbg(DBG_X,"Get Radio Tasks for %s",wtpid);
|
||||
|
||||
sqlite3_reset(stmt_get_radio_tasks); |
||||
sqlite3_clear_bindings(stmt_get_radio_tasks); |
||||
|
||||
mavl_conststr_t r = mavl_create_conststr(); |
||||
if (!r) |
||||
return NULL; |
||||
|
||||
|
||||
int rc=0; |
||||
|
||||
|
||||
if(sqlite3_bind_text(stmt_get_radio_tasks,1,wtpid,-1,SQLITE_STATIC)) |
||||
goto errX; |
||||
|
||||
while (SQLITE_ROW == sqlite3_step(stmt_get_radio_tasks)) { |
||||
|
||||
int ii; |
||||
//DBGX("-----------------------------------------------------","");
|
||||
for (ii=0; ii<6; ii++){ |
||||
|
||||
DBGX("CVALL: %s",(const char*)sqlite3_column_text(stmt_get_radio_tasks,ii)); |
||||
|
||||
|
||||
} |
||||
const char *strrid= (const char*)sqlite3_column_text(stmt_get_radio_tasks,1); |
||||
|
||||
const char *id = (const char*)sqlite3_column_text(stmt_get_radio_tasks,2); |
||||
if (!id) { |
||||
continue; |
||||
} |
||||
|
||||
const char *sub_id = (const char*)sqlite3_column_text(stmt_get_radio_tasks,3); |
||||
|
||||
const char *val = (const char*)sqlite3_column_text(stmt_get_radio_tasks,4); |
||||
|
||||
//DBGX("ID: (%s), SubID (%s), Val (%s)",id,sub_id,val);
|
||||
|
||||
const struct cw_itemdef * cwi = cw_itemdef_get(conn->actions->radioitems,id,sub_id); |
||||
if (!cwi) { |
||||
DBGX("No item definition found for: %s/%s",id,sub_id); |
||||
continue;
|
||||
} |
||||
|
||||
|
||||
if (!cwi->type->from_str) { |
||||
cw_log(LOG_ERR,"Can't convert from string %s/%s - No method defined.",id,sub_id); |
||||
continue; |
||||
} |
||||
|
||||
|
||||
mbag_item_t * i = cwi->type->from_str(val); |
||||
i->id=cwi->id; |
||||
|
||||
int rid = atoi(strrid);
|
||||
cw_dbg(DBG_X,"RID: %d",rid); |
||||
|
||||
|
||||
mbag_t radio = mbag_i_get_mbag_c(conn->radios_upd,rid,mbag_create); |
||||
mbag_set(radio,i); |
||||
|
||||
|
||||
//mbag_set(conn->outgoing,i);
|
||||
|
||||
mavl_add(r,(void*)cwi->id); |
||||
} |
||||
|
||||
if (r->count) |
||||
return r; |
||||
|
||||
mavl_destroy(r); |
||||
return NULL; |
||||
|
||||
|
||||
errX: |
||||
if (rc) { |
||||
cw_log(LOG_ERR,"Can't get tasks: %d - %s", |
||||
rc,sqlite3_errmsg(handle)); |
||||
} |
||||
|
||||
if (r) |
||||
mavl_destroy(r); |
||||
|
||||
|
||||
return NULL; |
||||
*/ |
||||
} |
||||
|
||||
|
@ -1,21 +0,0 @@ |
||||
#ifndef CW_MAVL_H |
||||
#define CW_MAVL_H |
||||
|
||||
#include "mavl.h" |
||||
|
||||
extern void db_ping(); |
||||
extern void db_ping_wtp(const char *wtpid,const char *acid); |
||||
|
||||
extern int db_init(); |
||||
int db_start(); |
||||
int db_get_tasks(struct conn * conn,const char * wtpid); |
||||
void db_put_wtp_prop(const char *wtp_id,const char * id,const char *sub_id,const char * val); |
||||
mavl_t db_get_update_tasks(struct conn * conn,const char * wtpid); |
||||
|
||||
void db_put_radio_prop(const char *wtp_id,const char *rid, const char * key,const char *sub_key,const char * val); |
||||
extern mavl_t db_get_radio_tasks(struct conn * conn,const char * wtpid); |
||||
|
||||
|
||||
#endif |
||||
|
||||
|
@ -1,29 +0,0 @@ |
||||
|
||||
|
||||
#include "module.h" |
||||
|
||||
|
||||
static int |