WSLUA_METAMETHOD FieldInfo__eq(lua_State* L) { /* Checks whether lhs is within rhs */ FieldInfo l = checkFieldInfo(L,1); FieldInfo r = checkFieldInfo(L,2); if (l->ds_tvb != r->ds_tvb) WSLUA_ERROR(FieldInfo__eq,"Data source must be the same for both fields"); if (l->start <= r->start && r->start + r->length <= l->start + r->length) { lua_pushboolean(L,1); return 1; } else { return 0; } }
WSLUA_METAMETHOD FieldInfo__eq(lua_State* L) { /* Checks whether lhs is within rhs. */ FieldInfo l = checkFieldInfo(L,1); FieldInfo r = checkFieldInfo(L,2); /* it is not an error if their ds_tvb are different... they're just not equal */ if (l->ws_fi->ds_tvb == r->ws_fi->ds_tvb && l->ws_fi->start == r->ws_fi->start && r->ws_fi->length == l->ws_fi->length) { lua_pushboolean(L,1); } else { lua_pushboolean(L,0); } return 1; }
WSLUA_METAMETHOD FieldInfo__le(lua_State* L) { /* Checks whether the end byte of lhs is before the end of rhs */ FieldInfo l = checkFieldInfo(L,1); FieldInfo r = checkFieldInfo(L,2); if (l->ds_tvb != r->ds_tvb) return 0; if (r->start + r->length <= l->start + r->length) { lua_pushboolean(L,1); return 1; } else { return 0; } }
WSLUA_METAMETHOD FieldInfo__le(lua_State* L) { /* Checks whether the end byte of lhs is before the end of rhs. */ FieldInfo l = checkFieldInfo(L,1); FieldInfo r = checkFieldInfo(L,2); if (l->ws_fi->ds_tvb != r->ws_fi->ds_tvb) WSLUA_ERROR(FieldInfo__le,"Data source must be the same for both fields"); if (r->ws_fi->start + r->ws_fi->length <= l->ws_fi->start + l->ws_fi->length) { lua_pushboolean(L,1); } else { lua_pushboolean(L,0); } return 1; }
WSLUA_METAMETHOD FieldInfo__lt(lua_State* L) { /* Checks whether the end byte of rhs is before the beginning of rhs */ FieldInfo l = checkFieldInfo(L,1); FieldInfo r = checkFieldInfo(L,2); if (l->ds_tvb != r->ds_tvb) WSLUA_ERROR(FieldInfo__lt,"Data source must be the same for both fields"); if ( r->start + r->length < l->start ) { lua_pushboolean(L,1); return 1; } else { return 0; } }
WSLUA_METAMETHOD FieldInfo__tostring(lua_State* L) { /* The string representation of the field */ FieldInfo fi = checkFieldInfo(L,1); if (!fi) { return luaL_error(L,"Missing FieldInfo object"); } if (fi->value.ftype->val_to_string_repr) { gchar* repr = fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); if (repr) { lua_pushstring(L,repr); } else { lua_pushstring(L,"(unknown)"); } } else if (fi->hfinfo->type == FT_NONE) { lua_pushstring(L, "(none)"); } else { lua_pushstring(L,"(n/a)"); } return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_name RO The name of this field */ static int FieldInfo_get_name(lua_State* L) { /* The filter name of this field. */ FieldInfo fi = checkFieldInfo(L,1); lua_pushstring(L,fi->ws_fi->hfinfo->abbrev); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_generated RO Whether this field was marked as generated (boolean) */ static int FieldInfo_get_generated(lua_State* L) { /* Whether this field was marked as generated. */ FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_GENERATED)); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_label RO The string representing this field */ WSLUA_METAMETHOD FieldInfo__tostring(lua_State* L) { /* The string representation of the field. */ FieldInfo fi = checkFieldInfo(L,1); if (fi->ws_fi->value.ftype->val_to_string_repr) { gchar* repr = NULL; if (fi->ws_fi->hfinfo->type == FT_PROTOCOL || fi->ws_fi->hfinfo->type == FT_PCRE) { repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DFILTER,BASE_NONE,NULL); } else { repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DISPLAY,fi->ws_fi->hfinfo->display,NULL); } if (repr) { lua_pushstring(L,repr); /* fvalue_to_string_repr() g_malloc's the string's buffer */ g_free(repr); } else { lua_pushstring(L,"(unknown)"); } } else if (fi->ws_fi->hfinfo->type == FT_NONE) { lua_pushstring(L, "(none)"); } else { lua_pushstring(L,"(n/a)"); } return 1; }
static int FieldInfo_display(lua_State* L) { /* The display string of this field as seen in GUI */ FieldInfo fi = checkFieldInfo(L,1); gchar label_str[ITEM_LABEL_LENGTH+1]; gchar *label_ptr; gchar *value_ptr; if (!fi) return 0; if (!fi->rep) { label_ptr = label_str; proto_item_fill_label(fi, label_str); } else label_ptr = fi->rep->representation; if (!label_ptr) return 0; value_ptr = strstr(label_ptr, ": "); if (!value_ptr) { /* just use whatever's there */ lua_pushstring(L, label_ptr); } else { value_ptr += 2; /* get past the ': ' */ lua_pushstring(L, value_ptr); } return 1; }
WSLUA_METAMETHOD FieldInfo__len(lua_State* L) { /* Obtain the Length of the field */ FieldInfo fi = checkFieldInfo(L,1); lua_pushnumber(L,fi->length); return 1; }
WSLUA_METAMETHOD FieldInfo__unm(lua_State* L) { /* Obtain the Offset of the field */ FieldInfo fi = checkFieldInfo(L,1); lua_pushnumber(L,fi->start); return 1; }
static int FieldInfo_get_range(lua_State* L) { /* The TvbRange covering this field */ FieldInfo fi = checkFieldInfo(L,1); if (push_TvbRange (L, fi->ds_tvb, fi->start, fi->length)) { return 1; } return 0; }
/* WSLUA_ATTRIBUTE FieldInfo_range RO The `TvbRange` covering the bytes of this field in a Tvb. */ static int FieldInfo_get_range(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); if (push_TvbRange (L, fi->ws_fi->ds_tvb, fi->ws_fi->start, fi->ws_fi->length)) { return 1; } return 0; }
/* WSLUA_ATTRIBUTE FieldInfo_type RO The internal field type, a number which matches one of the `ftype` values in `init.lua`. @since 1.99.8 */ static int FieldInfo_get_type(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); if (fi->ws_fi->hfinfo) { lua_pushnumber(L, fi->ws_fi->hfinfo->type); } else { lua_pushnil(L); } return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_source RO The source `Tvb` object the `FieldInfo` is derived from, or nil if there is none. @since 1.99.8 */ static int FieldInfo_get_source(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); if (fi->ws_fi->ds_tvb) { push_Tvb(L, fi->ws_fi->ds_tvb); } else { lua_pushnil(L); } return 1; }
static int FieldInfo_get_range(lua_State* L) { /* The TvbRange covering this field */ FieldInfo fi = checkFieldInfo(L,1); TvbRange r = ep_new(struct _wslua_tvbrange); r->tvb = ep_new(struct _wslua_tvb); r->tvb->ws_tvb = fi->ds_tvb; r->offset = fi->start; r->len = fi->length; pushTvbRange(L,r); return 1; }
WSLUA_METAMETHOD FieldInfo__tostring(lua_State* L) { /* The string representation of the field */ FieldInfo fi = checkFieldInfo(L,1); if (fi) { if (fi->value.ftype->val_to_string_repr) { gchar* repr = fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); if (repr) lua_pushstring(L,repr); else luaL_error(L,"field cannot be represented as string because it may contain invalid characters"); } else luaL_error(L,"field has no string representation"); } return 1; }
static int FieldInfo__index(lua_State* L) { /* Other attributes: */ const gchar* idx = luaL_checkstring(L,2); const luaL_Reg* r; checkFieldInfo(L,1); for (r = FieldInfo_get; r->name; r++) { if (g_str_equal(r->name, idx)) { return r->func(L); } } return 0; }
WSLUA_METAMETHOD FieldInfo__call(lua_State* L) { /* Obtain the Value of the field */ FieldInfo fi = checkFieldInfo(L,1); switch(fi->hfinfo->type) { case FT_BOOLEAN: lua_pushboolean(L,(int)fvalue_get_uinteger(&(fi->value))); return 1; case FT_UINT8: case FT_UINT16: case FT_UINT24: case FT_UINT32: case FT_FRAMENUM: lua_pushnumber(L,(lua_Number)fvalue_get_uinteger(&(fi->value))); return 1; case FT_INT8: case FT_INT16: case FT_INT24: case FT_INT32: lua_pushnumber(L,(lua_Number)fvalue_get_sinteger(&(fi->value))); return 1; case FT_FLOAT: case FT_DOUBLE: lua_pushnumber(L,(lua_Number)fvalue_get_floating(&(fi->value))); return 1; case FT_INT64: { Int64 num = (Int64)g_malloc(sizeof(gint64)); *num = fvalue_get_integer64(&(fi->value)); pushInt64(L,num); return 1; } case FT_UINT64: { UInt64 num = (UInt64)g_malloc(sizeof(guint64)); *num = fvalue_get_integer64(&(fi->value)); pushUInt64(L,num); return 1; } case FT_ETHER: { Address eth = (Address)g_malloc(sizeof(address)); eth->type = AT_ETHER; eth->len = fi->length; eth->data = tvb_memdup(NULL,fi->ds_tvb,fi->start,fi->length); pushAddress(L,eth); return 1; } case FT_IPv4:{ Address ipv4 = (Address)g_malloc(sizeof(address)); ipv4->type = AT_IPv4; ipv4->len = fi->length; ipv4->data = tvb_memdup(NULL,fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipv4); return 1; } case FT_IPv6: { Address ipv6 = (Address)g_malloc(sizeof(address)); ipv6->type = AT_IPv6; ipv6->len = fi->length; ipv6->data = tvb_memdup(NULL,fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipv6); return 1; } case FT_IPXNET:{ Address ipx = (Address)g_malloc(sizeof(address)); ipx->type = AT_IPX; ipx->len = fi->length; ipx->data = tvb_memdup(NULL,fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipx); return 1; } case FT_ABSOLUTE_TIME: case FT_RELATIVE_TIME: { NSTime nstime = (NSTime)g_malloc(sizeof(nstime_t)); *nstime = *(NSTime)fvalue_get(&(fi->value)); pushNSTime(L,nstime); return 1; } case FT_STRING: case FT_STRINGZ: { gchar* repr = fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); if (repr) lua_pushstring(L,repr); else luaL_error(L,"field cannot be represented as string because it may contain invalid characters"); return 1; } case FT_NONE: if (fi->length == 0) { lua_pushnil(L); return 1; } /* FALLTHROUGH */ case FT_BYTES: case FT_UINT_BYTES: case FT_GUID: case FT_PROTOCOL: case FT_REL_OID: case FT_SYSTEM_ID: case FT_OID: { ByteArray ba = g_byte_array_new(); g_byte_array_append(ba, (const guint8 *)tvb_memdup(wmem_packet_scope(),fi->ds_tvb,fi->start,fi->length),fi->length); pushByteArray(L,ba); return 1; } default: luaL_error(L,"FT_ not yet supported"); return 1; } }
/* WSLUA_ATTRIBUTE FieldInfo_hidden RO Whether this field was marked as hidden (boolean). @since 1.99.8 */ static int FieldInfo_get_hidden(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_HIDDEN)); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_is_url RO Whether this field was marked as being a URL (boolean). @since 1.99.8 */ static int FieldInfo_get_is_url(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_URL)); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_big_endian RO Whether this field is big-endian encoded (boolean). @since 1.99.8 */ static int FieldInfo_get_big_endian(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_BIG_ENDIAN)); return 1; }
WSLUA_METAMETHOD FieldInfo__call(lua_State* L) { /* Obtain the Value of the field */ FieldInfo fi = checkFieldInfo(L,1); switch(fi->hfinfo->type) { case FT_NONE: lua_pushnil(L); return 1; case FT_UINT8: case FT_UINT16: case FT_UINT24: case FT_UINT32: case FT_FRAMENUM: lua_pushnumber(L,(lua_Number)fvalue_get_uinteger(&(fi->value))); return 1; case FT_INT8: case FT_INT16: case FT_INT24: case FT_INT32: lua_pushnumber(L,(lua_Number)fvalue_get_sinteger(&(fi->value))); return 1; case FT_FLOAT: case FT_DOUBLE: lua_pushnumber(L,(lua_Number)fvalue_get_floating(&(fi->value))); return 1; case FT_INT64: { Int64 num = g_malloc(sizeof(gint64)); *num = fvalue_get_integer64(&(fi->value)); pushInt64(L,num); return 1; } case FT_UINT64: { UInt64 num = g_malloc(sizeof(guint64)); *num = fvalue_get_integer64(&(fi->value)); pushUInt64(L,num); return 1; } case FT_ETHER: { Address eth = g_malloc(sizeof(address)); eth->type = AT_ETHER; eth->len = fi->length; eth->data = tvb_memdup(fi->ds_tvb,fi->start,fi->length); pushAddress(L,eth); return 1; } case FT_IPv4:{ Address ipv4 = g_malloc(sizeof(address)); ipv4->type = AT_IPv4; ipv4->len = fi->length; ipv4->data = tvb_memdup(fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipv4); return 1; } case FT_IPv6: { Address ipv6 = g_malloc(sizeof(address)); ipv6->type = AT_IPv6; ipv6->len = fi->length; ipv6->data = tvb_memdup(fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipv6); return 1; } case FT_IPXNET:{ Address ipx = g_malloc(sizeof(address)); ipx->type = AT_IPX; ipx->len = fi->length; ipx->data = tvb_memdup(fi->ds_tvb,fi->start,fi->length); pushAddress(L,ipx); return 1; } case FT_STRING: case FT_STRINGZ: { gchar* repr = fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); if (repr) lua_pushstring(L,repr); else luaL_error(L,"field cannot be represented as string because it may contain invalid characters"); return 1; } case FT_BYTES: case FT_UINT_BYTES: case FT_GUID: case FT_OID: { ByteArray ba = g_byte_array_new(); g_byte_array_append(ba, ep_tvb_memdup(fi->ds_tvb,fi->start,fi->length),fi->length); pushByteArray(L,ba); return 1; } default: luaL_error(L,"FT_ not yet supported"); return 1; } }
/* WSLUA_ATTRIBUTE FieldInfo_value RO The value of this field. */ WSLUA_METAMETHOD FieldInfo__call(lua_State* L) { /* Obtain the Value of the field. Previous to 1.11.4, this function retrieved the value for most field types, but for `ftypes.UINT_BYTES` it retrieved the `ByteArray` of the field's entire `TvbRange`. In other words, it returned a `ByteArray` that included the leading length byte(s), instead of just the *value* bytes. That was a bug, and has been changed in 1.11.4. Furthermore, it retrieved an `ftypes.GUID` as a `ByteArray`, which is also incorrect. If you wish to still get a `ByteArray` of the `TvbRange`, use `FieldInfo:get_range()` to get the `TvbRange`, and then use `Tvb:bytes()` to convert it to a `ByteArray`. */ FieldInfo fi = checkFieldInfo(L,1); switch(fi->ws_fi->hfinfo->type) { case FT_BOOLEAN: lua_pushboolean(L,(int)fvalue_get_uinteger(&(fi->ws_fi->value))); return 1; case FT_UINT8: case FT_UINT16: case FT_UINT24: case FT_UINT32: case FT_FRAMENUM: lua_pushnumber(L,(lua_Number)(fvalue_get_uinteger(&(fi->ws_fi->value)))); return 1; case FT_INT8: case FT_INT16: case FT_INT24: case FT_INT32: lua_pushnumber(L,(lua_Number)(fvalue_get_sinteger(&(fi->ws_fi->value)))); return 1; case FT_FLOAT: case FT_DOUBLE: lua_pushnumber(L,(lua_Number)(fvalue_get_floating(&(fi->ws_fi->value)))); return 1; case FT_INT64: { pushInt64(L,(Int64)(fvalue_get_sinteger64(&(fi->ws_fi->value)))); return 1; } case FT_UINT64: { pushUInt64(L,fvalue_get_uinteger64(&(fi->ws_fi->value))); return 1; } case FT_ETHER: { Address eth = (Address)g_malloc(sizeof(address)); eth->type = AT_ETHER; eth->len = fi->ws_fi->length; eth->data = tvb_memdup(NULL,fi->ws_fi->ds_tvb,fi->ws_fi->start,fi->ws_fi->length); pushAddress(L,eth); return 1; } case FT_IPv4:{ Address ipv4 = (Address)g_malloc(sizeof(address)); ipv4->type = AT_IPv4; ipv4->len = fi->ws_fi->length; ipv4->data = tvb_memdup(NULL,fi->ws_fi->ds_tvb,fi->ws_fi->start,fi->ws_fi->length); pushAddress(L,ipv4); return 1; } case FT_IPv6: { Address ipv6 = (Address)g_malloc(sizeof(address)); ipv6->type = AT_IPv6; ipv6->len = fi->ws_fi->length; ipv6->data = tvb_memdup(NULL,fi->ws_fi->ds_tvb,fi->ws_fi->start,fi->ws_fi->length); pushAddress(L,ipv6); return 1; } case FT_FCWWN: { Address fcwwn = (Address)g_malloc(sizeof(address)); fcwwn->type = AT_FCWWN; fcwwn->len = fi->ws_fi->length; fcwwn->data = tvb_memdup(NULL,fi->ws_fi->ds_tvb,fi->ws_fi->start,fi->ws_fi->length); pushAddress(L,fcwwn); return 1; } case FT_IPXNET:{ Address ipx = (Address)g_malloc(sizeof(address)); ipx->type = AT_IPX; ipx->len = fi->ws_fi->length; ipx->data = tvb_memdup(NULL,fi->ws_fi->ds_tvb,fi->ws_fi->start,fi->ws_fi->length); pushAddress(L,ipx); return 1; } case FT_ABSOLUTE_TIME: case FT_RELATIVE_TIME: { NSTime nstime = (NSTime)g_malloc(sizeof(nstime_t)); *nstime = *(NSTime)fvalue_get(&(fi->ws_fi->value)); pushNSTime(L,nstime); return 1; } case FT_STRING: case FT_STRINGZ: { gchar* repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DISPLAY,BASE_NONE,NULL); if (repr) lua_pushstring(L,repr); else luaL_error(L,"field cannot be represented as string because it may contain invalid characters"); return 1; } case FT_NONE: if (fi->ws_fi->length > 0 && fi->ws_fi->rep) { /* it has a length, but calling fvalue_get() on an FT_NONE asserts, so get the label instead (it's a FT_NONE, so a label is what it basically is) */ lua_pushstring(L, fi->ws_fi->rep->representation); return 1; } return 0; case FT_BYTES: case FT_UINT_BYTES: case FT_REL_OID: case FT_SYSTEM_ID: case FT_OID: { ByteArray ba = g_byte_array_new(); g_byte_array_append(ba, (const guint8 *) fvalue_get(&fi->ws_fi->value), fvalue_length(&fi->ws_fi->value)); pushByteArray(L,ba); return 1; } case FT_PROTOCOL: { ByteArray ba = g_byte_array_new(); tvbuff_t* tvb = (tvbuff_t *) fvalue_get(&fi->ws_fi->value); g_byte_array_append(ba, (const guint8 *)tvb_memdup(wmem_packet_scope(), tvb, 0, tvb_captured_length(tvb)), tvb_captured_length(tvb)); pushByteArray(L,ba); return 1; } case FT_GUID: default: luaL_error(L,"FT_ not yet supported"); return 1; } }