WSLUA_METHOD Dissector_call(lua_State* L) { /* Calls a dissector against a given packet (or part of it). */ #define WSLUA_ARG_Dissector_call_TVB 2 /* The buffer to dissect. */ #define WSLUA_ARG_Dissector_call_PINFO 3 /* The packet info. */ #define WSLUA_ARG_Dissector_call_TREE 4 /* The tree on which to add the protocol items. */ Dissector volatile d = checkDissector(L,1); Tvb tvb = checkTvb(L,WSLUA_ARG_Dissector_call_TVB); Pinfo pinfo = checkPinfo(L,WSLUA_ARG_Dissector_call_PINFO); TreeItem ti = checkTreeItem(L,WSLUA_ARG_Dissector_call_TREE); const char *volatile error = NULL; int len = 0; if (! ( d && tvb && pinfo) ) return 0; TRY { len = call_dissector(d, tvb->ws_tvb, pinfo->ws_pinfo, ti->tree); /* XXX Are we sure about this??? is this the right/only thing to catch */ } CATCH_NONFATAL_ERRORS { show_exception(tvb->ws_tvb, pinfo->ws_pinfo, ti->tree, EXCEPT_CODE, GET_MESSAGE); error = "Malformed frame"; } ENDTRY; if (error) { WSLUA_ERROR(Dissector_call,error); } lua_pushnumber(L,(lua_Number)len); WSLUA_RETURN(1); /* Number of bytes dissected. Note that some dissectors always return number of bytes in incoming buffer, so be aware. */ }
/* WSLUA_ATTRIBUTE Pinfo_private RO Access to the private table entries. */ static int Pinfo_get_private(lua_State *L) { PrivateTable priv = NULL; Pinfo pinfo = checkPinfo(L,1); const gchar* privname = luaL_optstring(L,2,NULL); gboolean is_allocated = FALSE; if (!pinfo->ws_pinfo->private_table) { pinfo->ws_pinfo->private_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); is_allocated = TRUE; } priv = (PrivateTable)g_malloc(sizeof(struct _wslua_private_table)); priv->table = pinfo->ws_pinfo->private_table; priv->is_allocated = is_allocated; priv->expired = FALSE; if (!privname) { PUSH_PRIVATE_TABLE(L,priv); } else { lua_settop(L,0); PUSH_PRIVATE_TABLE(L,priv); lua_pushstring(L,privname); return PrivateTable__index(L); } return 1; }
/* WSLUA_ATTRIBUTE Pinfo_match RO Port/Data we are matching. */ static int Pinfo_get_match(lua_State *L) { Pinfo pinfo = checkPinfo(L,1); if (pinfo->ws_pinfo->match_string) { lua_pushstring(L,pinfo->ws_pinfo->match_string); } else { lua_pushnumber(L,(lua_Number)(pinfo->ws_pinfo->match_uint)); } return 1; }
/* WSLUA_ATTRIBUTE Pinfo_lo RO lower Address of this Packet. */ static int Pinfo_get_lo(lua_State *L) { Pinfo pinfo = checkPinfo(L,1); Address addr; addr = (Address)g_malloc(sizeof(address)); if (cmp_address(&(pinfo->ws_pinfo->src), &(pinfo->ws_pinfo->dst) ) < 0) { copy_address(addr, &(pinfo->ws_pinfo->src)); } else { copy_address(addr, &(pinfo->ws_pinfo->dst)); } pushAddress(L,addr); return 1; }
/* WSLUA_ATTRIBUTE Pinfo_hi RW higher Address of this Packet. */ static int Pinfo_get_hi(lua_State *L) { Pinfo pinfo = checkPinfo(L,1); Address addr; addr = (Address)g_malloc(sizeof(address)); if (CMP_ADDRESS(&(pinfo->ws_pinfo->src), &(pinfo->ws_pinfo->dst) ) >= 0) { COPY_ADDRESS(addr, &(pinfo->ws_pinfo->src)); } else { COPY_ADDRESS(addr, &(pinfo->ws_pinfo->dst)); } pushAddress(L,addr); return 1; }
/* WSLUA_ATTRIBUTE Pinfo_conversation WO sets the packet conversation to the given Proto object. */ static int Pinfo_set_conversation(lua_State *L) { Pinfo pinfo = checkPinfo(L,1); Proto proto = checkProto(L,2); conversation_t *conversation; if (!proto->handle) { luaL_error(L,"Proto %s has no registered dissector", proto->name? proto->name:"<UKNOWN>"); return 0; } conversation = find_or_create_conversation(pinfo->ws_pinfo); conversation_set_dissector(conversation,proto->handle); return 0; }
static int Pinfo_match(lua_State *L) { Pinfo pinfo = checkPinfo(L,1); if (!pinfo) return 0; if (pinfo->expired) { luaL_error(L,"expired_pinfo"); return 0; } if (pinfo->ws_pinfo->match_string) { lua_pushstring(L,pinfo->ws_pinfo->match_string); } else { lua_pushnumber(L,(lua_Number)(pinfo->ws_pinfo->match_uint)); } return 1; }
/* WSLUA_ATTRIBUTE Pinfo_cols RO Accesss to the packet list columns (equivalent to pinfo.columns). */ static int Pinfo_get_columns(lua_State *L) { Columns cols = NULL; Pinfo pinfo = checkPinfo(L,1); const gchar* colname = luaL_optstring(L,2,NULL); cols = (Columns)g_malloc(sizeof(struct _wslua_cols)); cols->cinfo = pinfo->ws_pinfo->cinfo; cols->expired = FALSE; if (!colname) { Push_Columns(L,cols); } else { lua_settop(L,0); Push_Columns(L,cols); lua_pushstring(L,colname); return get_Columns_index(L); } return 1; }
static int Pinfo_columns(lua_State *L) { Columns cols = NULL; Pinfo pinfo = checkPinfo(L,1); const gchar* colname = luaL_optstring(L,2,NULL); if (pinfo->expired) { luaL_error(L,"expired_pinfo"); return 0; } cols = g_malloc(sizeof(struct _wslua_cols)); cols->cinfo = pinfo->ws_pinfo->cinfo; cols->expired = FALSE; if (!colname) { PUSH_COLUMNS(L,cols); } else { lua_settop(L,0); PUSH_COLUMNS(L,cols); lua_pushstring(L,colname); return Columns_index(L); } return 1; }