From a8638eec90bace9997e084bf4ab15f0485ac1106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Bj=C3=B8rlykke?= Date: Sat, 7 Sep 2013 11:07:18 +0000 Subject: [PATCH] Added support for integer range in DissectorTable_add and DissectorTable_remove. This was requested in bug 6762. svn path=/trunk/; revision=51817 --- epan/wslua/wslua_proto.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/epan/wslua/wslua_proto.c b/epan/wslua/wslua_proto.c index 706b781649..61abf9fbb8 100644 --- a/epan/wslua/wslua_proto.c +++ b/epan/wslua/wslua_proto.c @@ -1758,7 +1758,7 @@ WSLUA_METHOD DissectorTable_add (lua_State *L) { /* Add a dissector to a table. */ -#define WSLUA_ARG_DissectorTable_add_PATTERN 2 /* The pattern to match (either an integer or a string depending on the table's type). */ +#define WSLUA_ARG_DissectorTable_add_PATTERN 2 /* The pattern to match (either an integer, a integer range or a string depending on the table's type). */ #define WSLUA_ARG_DissectorTable_add_DISSECTOR 3 /* The dissector to add (either an Proto or a Dissector). */ DissectorTable dt = checkDissectorTable(L,1); @@ -1787,8 +1787,19 @@ WSLUA_METHOD DissectorTable_add (lua_State *L) { dissector_add_string(dt->name, pattern,handle); g_free (pattern); } else if ( type == FT_UINT32 || type == FT_UINT16 || type == FT_UINT8 || type == FT_UINT24 ) { - int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_add_PATTERN); - dissector_add_uint(dt->name, port, handle); + if (lua_isnumber(L, WSLUA_ARG_DissectorTable_add_PATTERN)) { + int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_add_PATTERN); + dissector_add_uint(dt->name, port, handle); + } else { + /* Not a number, try as range */ + gchar* pattern = g_strdup(luaL_checkstring(L,WSLUA_ARG_DissectorTable_add_PATTERN)); + range_t *range; + if (range_convert_str(&range, pattern, G_MAXUINT32) == CVT_NO_ERROR) + dissector_add_uint_range(dt->name, range, handle); + else + WSLUA_ARG_ERROR(DissectorTable_add,PATTERN,"invalid integer or range"); + g_free (pattern); + } } else { luaL_error(L,"Strange type %d for a DissectorTable",type); } @@ -1800,7 +1811,7 @@ WSLUA_METHOD DissectorTable_remove (lua_State *L) { /* Remove a dissector from a table */ -#define WSLUA_ARG_DissectorTable_remove_PATTERN 2 /* The pattern to match (either an integer or a string depending on the table's type). */ +#define WSLUA_ARG_DissectorTable_remove_PATTERN 2 /* The pattern to match (either an integer, a integer range or a string depending on the table's type). */ #define WSLUA_ARG_DissectorTable_remove_DISSECTOR 3 /* The dissector to remove (either an Proto or a Dissector). */ DissectorTable dt = checkDissectorTable(L,1); ftenum_t type; @@ -1825,8 +1836,19 @@ WSLUA_METHOD DissectorTable_remove (lua_State *L) { dissector_delete_string(dt->name, pattern,handle); g_free (pattern); } else if ( type == FT_UINT32 || type == FT_UINT16 || type == FT_UINT8 || type == FT_UINT24 ) { - int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_remove_PATTERN); - dissector_delete_uint(dt->name, port, handle); + if (lua_isnumber(L, WSLUA_ARG_DissectorTable_remove_PATTERN)) { + int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_remove_PATTERN); + dissector_delete_uint(dt->name, port, handle); + } else { + /* Not a number, try as range */ + gchar* pattern = g_strdup(luaL_checkstring(L,WSLUA_ARG_DissectorTable_remove_PATTERN)); + range_t *range; + if (range_convert_str(&range, pattern, G_MAXUINT32) == CVT_NO_ERROR) + dissector_delete_uint_range(dt->name, range, handle); + else + WSLUA_ARG_ERROR(DissectorTable_remove,PATTERN,"invalid integer or range"); + g_free (pattern); + } } return 0;