forked from osmocom/wireshark
Added support for a "prefs_change" function in Lua scripts, which is called
when the preferences for the dissector are changed. This is not a 100% correct implementation at the time because the prefs_changed function in all Lua plugins will be called whenever a preference in a single Lua plugin is changed. svn path=/trunk/; revision=51818
This commit is contained in:
parent
a8638eec90
commit
7d3d67407c
|
@ -184,6 +184,17 @@ static void wslua_init_routine(void) {
|
|||
|
||||
}
|
||||
|
||||
static int prefs_changed_error_handler(lua_State* LS) {
|
||||
const gchar* error = lua_tostring(LS,1);
|
||||
report_failure("Lua: Error During execution of prefs apply callback:\n %s",error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wslua_prefs_changed(void) {
|
||||
if (L) {
|
||||
iter_table_and_call(L, WSLUA_PREFS_CHANGED,prefs_changed_error_handler);
|
||||
}
|
||||
}
|
||||
|
||||
static const char *getF(lua_State *LS _U_, void *ud, size_t *size)
|
||||
{
|
||||
|
@ -381,6 +392,10 @@ int wslua_init(register_cb cb, gpointer client_data) {
|
|||
lua_newtable (L);
|
||||
lua_dissectors_table_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
|
||||
/* the preferences apply_cb table (accessible by the user) */
|
||||
lua_newtable (L);
|
||||
lua_setglobal(L, WSLUA_PREFS_CHANGED);
|
||||
|
||||
/* set running_superuser variable to its proper value */
|
||||
WSLUA_REG_GLOBAL_BOOL(L,"running_superuser",started_with_special_privs());
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
*/
|
||||
|
||||
#define WSLUA_INIT_ROUTINES "init_routines"
|
||||
#define WSLUA_PREFS_CHANGED "prefs_changed"
|
||||
#define LOG_DOMAIN_LUA "wslua"
|
||||
|
||||
struct _wslua_tvb {
|
||||
|
@ -433,7 +434,7 @@ extern gboolean wslua_optbool(lua_State* L, int n, gboolean def);
|
|||
extern const gchar* lua_shiftstring(lua_State* L,int idx);
|
||||
extern void wslua_setfuncs(lua_State *L, const luaL_Reg *l, int nup);
|
||||
extern int dissect_lua(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data);
|
||||
|
||||
extern void wslua_prefs_changed(void);
|
||||
extern void proto_register_lua(void);
|
||||
extern GString* lua_register_all_taps(void);
|
||||
extern void wslua_prime_dfilter(epan_dissect_t *edt);
|
||||
|
|
|
@ -318,7 +318,7 @@ WSLUA_METAMETHOD Prefs__newindex(lua_State* L) {
|
|||
pref->label = g_strdup(name);
|
||||
|
||||
if (!prefs_p->proto->prefs_module) {
|
||||
prefs_p->proto->prefs_module = prefs_register_protocol(prefs_p->proto->hfid, NULL);
|
||||
prefs_p->proto->prefs_module = prefs_register_protocol(prefs_p->proto->hfid, wslua_prefs_changed);
|
||||
}
|
||||
|
||||
switch(pref->type) {
|
||||
|
@ -1395,6 +1395,23 @@ static int Proto_get_prefs(lua_State* L) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int Proto_set_prefs_changed(lua_State* L) {
|
||||
Proto proto = toProto(L,1);
|
||||
|
||||
if (lua_isfunction(L,3)) {
|
||||
/* insert the prefs changed callback into the prefs_changed table */
|
||||
lua_getglobal(L, WSLUA_PREFS_CHANGED);
|
||||
lua_replace(L, 1);
|
||||
lua_pushstring(L,proto->name);
|
||||
lua_replace(L, 2);
|
||||
lua_settable(L,1);
|
||||
|
||||
} else {
|
||||
luaL_argerror(L,3,"The prefs of a protocol must be a function");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int Proto_set_init(lua_State* L) {
|
||||
Proto proto = toProto(L,1);
|
||||
|
||||
|
@ -1479,23 +1496,26 @@ typedef struct {
|
|||
static const proto_actions_t proto_actions[] = {
|
||||
/* WSLUA_ATTRIBUTE Proto_dissector RW The protocol's dissector, a function you define.
|
||||
The called dissector function will be given three arguments of (1) a Tvb object, (2) a Pinfo object, and (3) a TreeItem object. */
|
||||
{"dissector",Proto_get_dissector, Proto_set_dissector},
|
||||
{"dissector", Proto_get_dissector, Proto_set_dissector},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_fields RO The Fields Table of this dissector */
|
||||
{"fields" ,Proto_get_fields, Proto_set_fields},
|
||||
{"fields", Proto_get_fields, Proto_set_fields},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_prefs RO The preferences of this dissector */
|
||||
{"prefs",Proto_get_prefs,NULL},
|
||||
{"prefs", Proto_get_prefs, NULL},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_prefs WO The preferences changed routine of this dissector, a function you define. */
|
||||
{"prefs_changed", NULL, Proto_set_prefs_changed},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_init WO The init routine of this dissector, a function you define.
|
||||
The called init function is passed no arguments. */
|
||||
{"init",NULL,Proto_set_init},
|
||||
{"init", NULL, Proto_set_init},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_name RO The name given to this dissector */
|
||||
{"name",Proto_get_name,NULL},
|
||||
{"name", Proto_get_name, NULL},
|
||||
|
||||
/* WSLUA_ATTRIBUTE Proto_description RO The description given to this dissector */
|
||||
{"description",Proto_get_description,NULL},
|
||||
{"description", Proto_get_description, NULL},
|
||||
|
||||
{NULL,NULL,NULL}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue