WSLUA_METAMETHOD Tvb__eq(lua_State* L) { /* Checks whether the two `Tvb` contents are equal. @since 1.99.8 */ Tvb tvb_l = checkTvb(L,1); Tvb tvb_r = checkTvb(L,2); int len_l = tvb_captured_length(tvb_l->ws_tvb); int len_r = tvb_captured_length(tvb_r->ws_tvb); /* it is not an error if their ds_tvb are different... they're just not equal */ if (len_l == len_r) { const gchar* lp = tvb_get_ptr(tvb_l->ws_tvb, 0, len_l); const gchar* rp = tvb_get_ptr(tvb_r->ws_tvb, 0, len_r); int i = 0; for (; i < len_l; ++i) { if (lp[i] != rp[i]) { lua_pushboolean(L,0); return 1; } } lua_pushboolean(L,1); } else { lua_pushboolean(L,0); } return 1; }
WSLUA_METHOD Tvb_bytes(lua_State* L) { /* Obtain a `ByteArray` from a `Tvb`. @since 1.99.8 */ #define WSLUA_OPTARG_Tvb_bytes_OFFSET 2 /* The offset (in octets) from the beginning of the `Tvb`. Defaults to 0. */ #define WSLUA_OPTARG_Tvb_bytes_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the `Tvb`. */ Tvb tvb = checkTvb(L,1); GByteArray* ba; int offset = luaL_optint(L, WSLUA_OPTARG_Tvb_bytes_OFFSET, 0); int len = luaL_optint(L,WSLUA_OPTARG_Tvb_bytes_LENGTH,-1); if (tvb->expired) { luaL_error(L,"expired tvb"); return 0; } if (len < 0) { len = tvb_captured_length_remaining(tvb->ws_tvb,offset); if (len < 0) { luaL_error(L,"out of bounds"); return 0; } } else if ( (guint)(len + offset) > tvb_captured_length(tvb->ws_tvb)) { luaL_error(L,"Range is out of bounds"); return 0; } ba = g_byte_array_new(); g_byte_array_append(ba, tvb_get_ptr(tvb->ws_tvb, offset, len), len); pushByteArray(L,ba); WSLUA_RETURN(1); /* The `ByteArray` object or nil. */ }
WSLUA_METHOD Tvb_len(lua_State* L) { /* Obtain the actual (captured) length of a `Tvb`. */ Tvb tvb = checkTvb(L,1); lua_pushnumber(L,tvb_captured_length(tvb->ws_tvb)); WSLUA_RETURN(1); /* The captured length of the `Tvb`. */ }
WSLUA_METHOD Tvb_len(lua_State* L) { /* Obtain the length of a TVB */ Tvb tvb = checkTvb(L,1); lua_pushnumber(L,tvb_length(tvb->ws_tvb)); WSLUA_RETURN(1); /* The length of the Tvb. */ }
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_METHOD Tvb_raw(lua_State* L) { /* Obtain a Lua string of the binary bytes in a Tvb. */ #define WSLUA_OPTARG_Tvb_raw_OFFSET 2 /* The position of the first byte (default=0/first). */ #define WSLUA_OPTARG_Tvb_raw_LENGTH 3 /* The length of the segment to get (default=all). */ Tvb tvb = checkTvb(L,1); int offset = luaL_optint(L,WSLUA_OPTARG_Tvb_raw_OFFSET,0); int len = luaL_optint(L,WSLUA_OPTARG_Tvb_raw_LENGTH,-1); if (!tvb) return 0; if (tvb->expired) { luaL_error(L,"expired tvb"); return 0; } if ((guint)offset > tvb_length(tvb->ws_tvb)) { WSLUA_OPTARG_ERROR(Tvb_raw,OFFSET,"offset beyond end of Tvb"); return 0; } if (len == -1) { len = tvb_length_remaining(tvb->ws_tvb,offset); if (len < 0) { luaL_error(L,"out of bounds"); return FALSE; } } else if ( (guint)(len + offset) > tvb_length(tvb->ws_tvb)) { luaL_error(L,"Range is out of bounds"); return FALSE; } lua_pushlstring(L, tvb_get_ptr(tvb->ws_tvb, offset, len), len); WSLUA_RETURN(1); /* A Lua string of the binary bytes in the Tvb. */ }
WSLUA_METHOD Tvb_offset(lua_State* L) { /* Returns the raw offset (from the beginning of the source Tvb) of a sub Tvb. */ Tvb tvb = checkTvb(L,1); lua_pushnumber(L,tvb_raw_offset(tvb->ws_tvb)); WSLUA_RETURN(1); /* The raw offset of the Tvb. */ }
/* Gets registered as metamethod automatically by WSLUA_REGISTER_CLASS/META */ static int Tvb__gc(lua_State* L) { Tvb tvb = checkTvb(L,1); free_Tvb(tvb); return 0; }
WSLUA_METHOD Tvb_reported_length_remaining(lua_State* L) { /* Obtain the reported length of packet data to end of a TVB or -1 if the offset is beyond the end of the TVB */ #define Tvb_reported_length_remaining_OFFSET 2 /* offset */ Tvb tvb = checkTvb(L,1); int offset = luaL_optint(L, Tvb_reported_length_remaining_OFFSET, 0); lua_pushnumber(L,tvb_reported_length_remaining(tvb->ws_tvb, offset)); WSLUA_RETURN(1); /* The length of the Tvb. */ }
WSLUA_METAMETHOD Tvb__tostring(lua_State* L) { /* Convert the bytes of a Tvb into a string, to be used for debugging purposes as '...' will be appended in case the string is too long. */ Tvb tvb = checkTvb(L,1); int len; gchar* str; len = tvb_length(tvb->ws_tvb); str = ep_strdup_printf("TVB(%i) : %s",len,tvb_bytes_to_ep_str(tvb->ws_tvb,0,len)); lua_pushstring(L,str); WSLUA_RETURN(1); /* The string. */ }
WSLUA_METHOD Tvb_offset(lua_State* L) { /* Returns the raw offset (from the beginning of the source Tvb) of a sub Tvb. */ Tvb tvb = checkTvb(L,1); if (!tvb) return 0; if (tvb->expired) { luaL_error(L,"expired tvb"); return 0; } lua_pushnumber(L,tvb_raw_offset(tvb->ws_tvb)); WSLUA_RETURN(1); /* The raw offset of the Tvb. */ }
WSLUA_METHOD Tvb_len(lua_State* L) { /* Obtain the length of a TVB */ Tvb tvb = checkTvb(L,1); if (!tvb) return 0; if (tvb->expired) { luaL_error(L,"expired tvb"); return 0; } lua_pushnumber(L,tvb_length(tvb->ws_tvb)); WSLUA_RETURN(1); /* The length of the Tvb. */ }
WSLUA_METAMETHOD Tvb__tostring(lua_State* L) { /* Convert the bytes of a `Tvb` into a string, to be used for debugging purposes, as '...' will be appended if the string is too long. */ Tvb tvb = checkTvb(L,1); int len = tvb_captured_length(tvb->ws_tvb); char* str = tvb_bytes_to_str(NULL,tvb->ws_tvb,0,len); lua_pushfstring(L, "TVB(%d) : %s", len, str); wmem_free(NULL, str); WSLUA_RETURN(1); /* The string. */ }
static int Tvb__gc(lua_State* L) { Tvb tvb = checkTvb(L,1); if (!tvb) return 0; if (!tvb->expired) tvb->expired = TRUE; else g_free(tvb); return 0; }
WSLUA_METHOD Tvb_range(lua_State* L) { /* Creates a tvbr from this Tvb. This is used also as the Tvb:__call() metamethod. */ #define WSLUA_OPTARG_Tvb_range_OFFSET 2 /* The offset (in octets) from the beginning of the Tvb. Defaults to 0. */ #define WSLUA_OPTARG_Tvb_range_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the Tvb. */ Tvb tvb = checkTvb(L,1); int offset = luaL_optint(L,WSLUA_OPTARG_Tvb_range_OFFSET,0); int len = luaL_optint(L,WSLUA_OPTARG_Tvb_range_LENGTH,-1); if (push_TvbRange(L,tvb->ws_tvb,offset,len)) { WSLUA_RETURN(1); /* The TvbRange */ } return 0; }
WSLUA_METHOD Tvb_range(lua_State* L) { /* Creates a `TvbRange` from this `Tvb`. */ #define WSLUA_OPTARG_Tvb_range_OFFSET 2 /* The offset (in octets) from the beginning of the `Tvb`. Defaults to 0. */ #define WSLUA_OPTARG_Tvb_range_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the `Tvb`. */ Tvb tvb = checkTvb(L,1); int offset = (int) luaL_optinteger(L,WSLUA_OPTARG_Tvb_range_OFFSET,0); int len = (int) luaL_optinteger(L,WSLUA_OPTARG_Tvb_range_LENGTH,-1); if (push_TvbRange(L,tvb->ws_tvb,offset,len)) { WSLUA_RETURN(1); /* The TvbRange */ } return 0; }
WSLUA_METHOD Tvb_range(lua_State* L) { /* Creates a tvbr from this Tvb. This is used also as the Tvb:__call() metamethod. */ #define WSLUA_OPTARG_Tvb_range_OFFSET 2 /* The offset (in octets) from the beginning of the Tvb. Defaults to 0. */ #define WSLUA_OPTARG_Tvb_range_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the Tvb. */ Tvb tvb = checkTvb(L,1); int offset = luaL_optint(L,WSLUA_OPTARG_Tvb_range_OFFSET,0); int len = luaL_optint(L,WSLUA_OPTARG_Tvb_range_LENGTH,-1); TvbRange tvbr; if (!tvb) return 0; if (tvb->expired) { luaL_error(L,"expired tvb"); return 0; } if ((tvbr = new_TvbRange(L,tvb->ws_tvb,offset,len))) { PUSH_TVBRANGE(L,tvbr); WSLUA_RETURN(1); /* The TvbRange */ } return 0; }