/* 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; }
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; }
/** * new_avp_from_finfo: * @param name the name the avp will have. * @param finfo the field_info from which to fetch the data. * * Creates an avp from a field_info record. * * Return value: a pointer to the newly created avp. * **/ extern AVP* new_avp_from_finfo(const gchar* name, field_info* finfo) { AVP* new_avp_val = (AVP*)g_slice_new(any_avp_type); gchar* value; gchar* repr; new_avp_val->n = scs_subscribe(avp_strings, name); repr = fvalue_to_string_repr(&finfo->value,FTREPR_DISPLAY,finfo->hfinfo->display,NULL); if (repr) { value = scs_subscribe(avp_strings, repr); g_free(repr); #ifdef _AVP_DEBUGGING dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: from string: %s",value); #endif } else { #ifdef _AVP_DEBUGGING dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: a proto: %s",finfo->hfinfo->abbrev); #endif value = scs_subscribe(avp_strings, ""); } new_avp_val->v = value; new_avp_val->o = '='; #ifdef _AVP_DEBUGGING dbg_print (dbg_avp,1,dbg_fp,"new_avp_from_finfo: %X %s%c%s;",(guint32) new_avp_val,new_avp_val->n,new_avp_val->o,new_avp_val->v); #endif return new_avp_val; }
static gboolean diam_tree_to_csv(proto_node* node, gpointer data) { char* val_str=NULL; char* val_tmp=NULL; ftenum_t ftype; field_info* fi; header_field_info *hfi; if(!node) { fprintf(stderr,"traverse end: empty node. node='%p' data='%p'\n",(void *)node,(void *)data); return FALSE; } fi=node->finfo; hfi=fi ? fi->hfinfo : NULL; if(!hfi) { fprintf(stderr,"traverse end: hfi not found. node='%p'\n",(void *)node); return FALSE; } ftype=fvalue_type_ftenum(&fi->value); if (ftype!=FT_NONE&&ftype!=FT_PROTOCOL) { /* convert value to string */ val_tmp=fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); if(val_tmp) { val_str=ep_strdup(val_tmp); g_free(val_tmp); } else val_str=ep_strdup_printf("unsupported type: %s",ftype_name(ftype)); /*printf("traverse: name='%s', abbrev='%s',desc='%s', val='%s'\n",hfi->name,hfi->abbrev,ftype_name(hfi->type),val_str);*/ printf("%s='%s' ",hfi->name,val_str); } return FALSE; }
QString FieldInformation::url() { QString url; if (flag(FI_URL) && headerInfo().isValid && IS_FT_STRING(fi_->hfinfo->type)) { gchar *url_str; url_str = fvalue_to_string_repr(NULL, &fi_->value, FTREPR_DISPLAY, fi_->hfinfo->display); if (url_str) { url = url_str; } wmem_free(NULL, url_str); } return url; }
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; }
void ProtoTree::itemDoubleClick(QTreeWidgetItem *item, int column) { Q_UNUSED(column); field_info *fi; fi = item->data(0, Qt::UserRole).value<field_info *>(); if(fi->hfinfo->type == FT_FRAMENUM) { emit goToFrame(fi->value.value.uinteger); } if(FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type)) { gchar *url; url = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, NULL); if(url){ // browser_open_url(url); QDesktopServices::openUrl(QUrl(url)); g_free(url); } } }
static gboolean fvt_cache_cb(proto_node * node, gpointer data _U_) { field_info* finfo = PNODE_FINFO(node); fvt_cache_entry_t* e; if (!finfo) return FALSE; if ((e = (fvt_cache_entry_t*)g_hash_table_lookup(fvt_cache,finfo->hfinfo->abbrev))) { e->usable = FALSE; } else if (finfo->value.ftype->val_to_string_repr) { switch (finfo->hfinfo->type) { case FT_NONE: case FT_PROTOCOL: return FALSE; default: break; } e = g_new(fvt_cache_entry_t,1); e->name = finfo->hfinfo->abbrev, e->repr = fvalue_to_string_repr(&(finfo->value), FTREPR_DFILTER, NULL); e->usable = TRUE; g_hash_table_insert(fvt_cache,(void*)finfo->hfinfo->abbrev,e); } return FALSE; }
void dfvm_dump(FILE *f, GPtrArray *insns) { int id, length; dfvm_insn_t *insn; dfvm_value_t *arg1; dfvm_value_t *arg2; dfvm_value_t *arg3; dfvm_value_t *arg4; char *value_str; GSList *range_list; drange_node *range_item; length = insns->len; for (id = 0; id < length; id++) { insn = g_ptr_array_index(insns, id); arg1 = insn->arg1; arg2 = insn->arg2; arg3 = insn->arg3; arg4 = insn->arg4; switch (insn->op) { case CHECK_EXISTS: fprintf(f, "%05d CHECK_EXISTS\t%s\n", id, arg1->value.hfinfo->abbrev); break; case READ_TREE: fprintf(f, "%05d READ_TREE\t\t%s -> reg#%u\n", id, arg1->value.hfinfo->abbrev, arg2->value.numeric); break; case CALL_FUNCTION: fprintf(f, "%05d CALL_FUNCTION\t%s (", id, arg1->value.funcdef->name); if (arg3) { fprintf(f, "reg#%u", arg3->value.numeric); } if (arg4) { fprintf(f, ", reg#%u", arg4->value.numeric); } fprintf(f, ") --> reg#%u\n", arg2->value.numeric); break; case PUT_FVALUE: value_str = fvalue_to_string_repr(arg1->value.fvalue, FTREPR_DFILTER, NULL); fprintf(f, "%05d PUT_FVALUE\t%s <%s> -> reg#%u\n", id, value_str, fvalue_type_name(arg1->value.fvalue), arg2->value.numeric); g_free(value_str); break; case MK_RANGE: arg3 = insn->arg3; fprintf(f, "%05d MK_RANGE\t\treg#%u[", id, arg1->value.numeric); for (range_list = arg3->value.drange->range_list; range_list != NULL; range_list = range_list->next) { range_item = range_list->data; switch (range_item->ending) { case DRANGE_NODE_END_T_UNINITIALIZED: fprintf(f, "?"); break; case DRANGE_NODE_END_T_LENGTH: fprintf(f, "%d:%d", range_item->start_offset, range_item->length); break; case DRANGE_NODE_END_T_OFFSET: fprintf(f, "%d-%d", range_item->start_offset, range_item->end_offset); break; case DRANGE_NODE_END_T_TO_THE_END: fprintf(f, "%d:", range_item->start_offset); break; } if (range_list->next != NULL) fprintf(f, ","); } fprintf(f, "] -> reg#%u\n", arg2->value.numeric); break; case ANY_EQ: fprintf(f, "%05d ANY_EQ\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_NE: fprintf(f, "%05d ANY_NE\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_GT: fprintf(f, "%05d ANY_GT\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_GE: fprintf(f, "%05d ANY_GE\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_LT: fprintf(f, "%05d ANY_LT\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_LE: fprintf(f, "%05d ANY_LE\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_BITWISE_AND: fprintf(f, "%05d ANY_BITWISE_AND\t\treg#%u == reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_CONTAINS: fprintf(f, "%05d ANY_CONTAINS\treg#%u contains reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case ANY_MATCHES: fprintf(f, "%05d ANY_MATCHES\treg#%u matches reg#%u\n", id, arg1->value.numeric, arg2->value.numeric); break; case NOT: fprintf(f, "%05d NOT\n", id); break; case RETURN: fprintf(f, "%05d RETURN\n", id); break; case IF_TRUE_GOTO: fprintf(f, "%05d IF-TRUE-GOTO\t%d\n", id, arg1->value.numeric); break; case IF_FALSE_GOTO: fprintf(f, "%05d IF-FALSE-GOTO\t%d\n", id, arg1->value.numeric); break; default: g_assert_not_reached(); break; } } }
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_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; } }
static gboolean print_field_value(field_info *finfo, int cmd_line_index) { header_field_info *hfinfo; static char *fs_buf = NULL; char *fs_ptr = fs_buf; static GString *label_s = NULL; int fs_buf_len = FIELD_STR_INIT_LEN, fs_len; guint i; string_fmt_t *sf; guint32 uvalue; gint32 svalue; const true_false_string *tfstring = &tfs_true_false; hfinfo = finfo->hfinfo; if (!fs_buf) { fs_buf = g_malloc(fs_buf_len + 1); fs_ptr = fs_buf; } if (!label_s) { label_s = g_string_new(""); } if(finfo->value.ftype->val_to_string_repr) { /* * this field has an associated value, * e.g: ip.hdr_len */ fs_len = fvalue_string_repr_len(&finfo->value, FTREPR_DFILTER); while (fs_buf_len < fs_len) { fs_buf_len *= 2; fs_buf = g_realloc(fs_buf, fs_buf_len + 1); fs_ptr = fs_buf; } fvalue_to_string_repr(&finfo->value, FTREPR_DFILTER, fs_buf); /* String types are quoted. Remove them. */ if ((finfo->value.ftype->ftype == FT_STRING || finfo->value.ftype->ftype == FT_STRINGZ) && fs_len > 2) { fs_buf[fs_len - 1] = '\0'; fs_ptr++; } } if (string_fmts->len > 0 && finfo->hfinfo->strings) { g_string_truncate(label_s, 0); for (i = 0; i < string_fmts->len; i++) { sf = g_ptr_array_index(string_fmts, i); if (sf->plain) { g_string_append(label_s, sf->plain); } else { switch (sf->format) { case SF_NAME: g_string_append(label_s, hfinfo->name); break; case SF_NUMVAL: g_string_append(label_s, fs_ptr); break; case SF_STRVAL: switch(hfinfo->type) { case FT_BOOLEAN: uvalue = fvalue_get_uinteger(&finfo->value); tfstring = (const struct true_false_string*) hfinfo->strings; g_string_append(label_s, uvalue ? tfstring->true_string : tfstring->false_string); break; case FT_INT8: case FT_INT16: case FT_INT24: case FT_INT32: DISSECTOR_ASSERT(!hfinfo->bitmask); svalue = fvalue_get_sinteger(&finfo->value); if (hfinfo->display & BASE_RANGE_STRING) { g_string_append(label_s, rval_to_str(svalue, hfinfo->strings, "Unknown")); } else { g_string_append(label_s, val_to_str(svalue, cVALS(hfinfo->strings), "Unknown")); } case FT_UINT8: case FT_UINT16: case FT_UINT24: case FT_UINT32: uvalue = fvalue_get_uinteger(&finfo->value); if (!hfinfo->bitmask && hfinfo->display & BASE_RANGE_STRING) { g_string_append(label_s, rval_to_str(uvalue, hfinfo->strings, "Unknown")); } else { g_string_append(label_s, val_to_str(uvalue, cVALS(hfinfo->strings), "Unknown")); } break; default: break; } break; default: break; } } } printf(" %u=\"%s\"", cmd_line_index, label_s->str); return TRUE; } if(finfo->value.ftype->val_to_string_repr) { printf(" %u=\"%s\"", cmd_line_index, fs_ptr); return TRUE; } /* * This field doesn't have an associated value, * e.g. http * We return n.a. */ printf(" %u=\"n.a.\"", cmd_line_index); return TRUE; }
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; } }