29#include <ws_log_defs.h>
59#include <epan/wslua/declare_wslua.h>
65#define WSLUA_INIT_ROUTINES "init_routines"
66#define WSLUA_PREFS_CHANGED "prefs_changed"
92#define wslua_toint(L,i) (int) ( lua_tointeger(L,i) )
93#define wslua_toint32(L,i) (int32_t) ( lua_tointeger(L,i) )
94#define wslua_toint64(L,i) (int64_t) ( lua_tonumber(L,i) )
95#define wslua_touint64(L,i) (uint64_t) ( lua_tonumber(L,i) )
97#define wslua_checkint(L,i) (int) ( luaL_checkinteger(L,i) )
98#define wslua_checkint32(L,i) (int32_t) ( luaL_checkinteger(L,i) )
99#define wslua_checkint64(L,i) (int64_t) ( luaL_checknumber(L,i) )
100#define wslua_checkuint64(L,i) (uint64_t) ( luaL_checknumber(L,i) )
102#define wslua_optint(L,i,d) (int) ( luaL_optinteger(L,i,d) )
103#define wslua_optint32(L,i,d) (int32_t) ( luaL_optinteger(L,i,d) )
104#define wslua_optint64(L,i,d) (int64_t) ( luaL_optnumber(L,i,d) )
105#define wslua_optuint64(L,i,d) (uint64_t) ( luaL_optnumber(L,i,d) )
112#if LUA_VERSION_NUM < 503
113#define wslua_touint(L,i) (unsigned) ( lua_tounsigned(L,i) )
114#define wslua_touint32(L,i) (uint32_t) ( lua_tounsigned(L,i) )
115#define wslua_checkuint(L,i) (unsigned) ( luaL_checkunsigned(L,i) )
116#define wslua_checkuint32(L,i) (uint32_t) ( luaL_checkunsigned(L,i) )
117#define wslua_optuint(L,i,d) (unsigned) ( luaL_optunsigned(L,i,d) )
118#define wslua_optuint32(L,i,d) (uint32_t) ( luaL_optunsigned(L,i,d) )
120#define wslua_touint(L,i) (unsigned) ( lua_tointeger(L,i) )
121#define wslua_touint32(L,i) (uint32_t) ( lua_tointeger(L,i) )
122#define wslua_checkuint(L,i) (unsigned) ( luaL_checkinteger(L,i) )
123#define wslua_checkuint32(L,i) (uint32_t) ( luaL_checkinteger(L,i) )
124#define wslua_optuint(L,i,d) (unsigned) ( luaL_optinteger(L,i,d) )
125#define wslua_optuint32(L,i,d) (uint32_t) ( luaL_optinteger(L,i,d) )
213 int expert_info_table_ref;
220 bool is_postdissector;
285typedef void (*tap_extractor_t)(lua_State*,
const void*);
290 tap_extractor_t extractor;
331 char* internal_description;
339 int seq_read_close_ref;
340 int can_write_encap_ref;
361typedef struct {
const char* name; tap_extractor_t extractor; }
tappable_t;
373typedef GByteArray* ByteArray;
374typedef gcry_cipher_hd_t* GcryptCipher;
383typedef int64_t Int64;
384typedef uint64_t UInt64;
401typedef tvbparse_action_t* Shortcut;
416#define WSLUA_CLASS_DEFINE(C,check_code) \
417 WSLUA_CLASS_DEFINE_BASE(C,check_code,NULL)
419#define WSLUA_CLASS_DEFINE_BASE(C,check_code,retval) \
420C to##C(lua_State* L, int idx) { \
421 C* v = (C*)lua_touserdata (L, idx); \
422 if (!v) luaL_error(L, "bad argument %d (%s expected, got %s)", idx, #C, lua_typename(L, lua_type(L, idx))); \
423 return v ? *v : retval; \
425C check##C(lua_State* L, int idx) { \
427 luaL_checktype(L,idx,LUA_TUSERDATA); \
428 p = (C*)luaL_checkudata(L, idx, #C); \
430 return p ? *p : retval; \
432C* push##C(lua_State* L, C v) { \
434 luaL_checkstack(L,2,"Unable to grow stack\n"); \
435 p = (C*)lua_newuserdata(L,sizeof(C)); *p = v; \
436 luaL_getmetatable(L, #C); lua_setmetatable(L, -2); \
439bool is##C(lua_State* L,int i) { \
441 if(!lua_isuserdata(L,i)) return false; \
442 p = lua_touserdata(L, i); \
443 lua_getfield(L, LUA_REGISTRYINDEX, #C); \
444 if (p == NULL || !lua_getmetatable(L, i) || !lua_rawequal(L, -1, -2)) p=NULL; \
446 return p ? true : false; \
448C shift##C(lua_State* L,int i) { \
450 if(!lua_isuserdata(L,i)) return retval; \
451 p = (C*)lua_touserdata(L, i); \
452 lua_getfield(L, LUA_REGISTRYINDEX, #C); \
453 if (p == NULL || !lua_getmetatable(L, i) || !lua_rawequal(L, -1, -2)) p=NULL; \
455 if (p) { lua_remove(L,i); return *p; }\
461 const char *fieldname;
462 lua_CFunction getfunc;
463 lua_CFunction setfunc;
467#define WSLUA_TYPEOF_FIELD "__typeof"
472#define WSLUA_REGISTER_GC(C) \
473 luaL_getmetatable(L, #C); \
476 lua_pushcfunction(L, C ## __gc); \
477 lua_setfield(L, -2, "__gc"); \
481#define __WSLUA_REGISTER_META(C, ATTRS) { \
482 const wslua_class C ## _class = { \
484 .instance_meta = C ## _meta, \
487 wslua_register_classinstance_meta(L, &C ## _class); \
488 WSLUA_REGISTER_GC(C); \
491#define WSLUA_REGISTER_META(C) __WSLUA_REGISTER_META(C, NULL)
492#define WSLUA_REGISTER_META_WITH_ATTRS(C) \
493 __WSLUA_REGISTER_META(C, C ## _attributes)
495#define __WSLUA_REGISTER_CLASS(C, ATTRS) { \
496 const wslua_class C ## _class = { \
498 .class_methods = C ## _methods, \
499 .class_meta = C ## _meta, \
500 .instance_methods = C ## _methods, \
501 .instance_meta = C ## _meta, \
504 wslua_register_class(L, &C ## _class); \
505 WSLUA_REGISTER_GC(C); \
508#define WSLUA_REGISTER_CLASS(C) __WSLUA_REGISTER_CLASS(C, NULL)
509#define WSLUA_REGISTER_CLASS_WITH_ATTRS(C) \
510 __WSLUA_REGISTER_CLASS(C, C ## _attributes)
512#define WSLUA_INIT(L) \
514 wslua_register_classes(L); \
515 wslua_register_functions(L);
519#define WSLUA_FUNCTION extern int
521#define WSLUA_INTERNAL_FUNCTION extern int
523#define WSLUA_REGISTER_FUNCTION(name) { lua_pushcfunction(L, wslua_## name); lua_setglobal(L, #name); }
525#define WSLUA_REGISTER extern int
527#define WSLUA_METHOD static int
528#define WSLUA_CONSTRUCTOR static int
529#define WSLUA_ATTR_SET static int
530#define WSLUA_ATTR_GET static int
531#define WSLUA_METAMETHOD static int
533#define WSLUA_METHODS static const luaL_Reg
534#define WSLUA_META static const luaL_Reg
535#define WSLUA_CLASS_FNREG(class,name) { #name, class##_##name }
536#define WSLUA_CLASS_FNREG_ALIAS(class,aliasname,name) { #aliasname, class##_##name }
537#define WSLUA_CLASS_MTREG(class,name) { "__" #name, class##__##name }
539#define WSLUA_ATTRIBUTES static const wslua_attribute_table
541#define WSLUA_ATTRIBUTE_RWREG(class,name) { #name, class##_get_##name, class##_set_##name }
542#define WSLUA_ATTRIBUTE_ROREG(class,name) { #name, class##_get_##name, NULL }
543#define WSLUA_ATTRIBUTE_WOREG(class,name) { #name, NULL, class##_set_##name }
545#define WSLUA_ATTRIBUTE_FUNC_SETTER(C,field) \
546 static int C##_set_##field (lua_State* L) { \
547 C obj = check##C (L,1); \
548 if (! lua_isfunction(L,-1) ) \
549 return luaL_error(L, "%s's attribute `%s' must be a function", #C , #field ); \
550 if (obj->field##_ref != LUA_NOREF) \
552 luaL_unref(L, LUA_REGISTRYINDEX, obj->field##_ref); \
553 obj->field##_ref = luaL_ref(L, LUA_REGISTRYINDEX); \
557 typedef void __dummy##C##_set_##field
559#define WSLUA_ATTRIBUTE_GET(C,name,block) \
560 static int C##_get_##name (lua_State* L) { \
561 C obj = check##C (L,1); \
566 typedef void __dummy##C##_get_##name
568#define WSLUA_ATTRIBUTE_NAMED_BOOLEAN_GETTER(C,name,member) \
569 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushboolean(L, obj->member );})
571#define WSLUA_ATTRIBUTE_NAMED_INTEGER_GETTER(C,name,member) \
572 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushinteger(L,(lua_Integer)(obj->member));})
574#define WSLUA_ATTRIBUTE_INTEGER_GETTER(C,member) \
575 WSLUA_ATTRIBUTE_NAMED_INTEGER_GETTER(C,member,member)
577#define WSLUA_ATTRIBUTE_BLOCK_NUMBER_GETTER(C,name,block) \
578 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushnumber(L,(lua_Number)(block));})
580#define WSLUA_ATTRIBUTE_NAMED_STRING_GETTER(C,name,member) \
581 WSLUA_ATTRIBUTE_GET(C,name, { \
582 lua_pushstring(L,obj->member); \
585#define WSLUA_ATTRIBUTE_STRING_GETTER(C,member) \
586 WSLUA_ATTRIBUTE_NAMED_STRING_GETTER(C,member,member)
588#define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_STRING_GETTER(C,name,member,option) \
589 WSLUA_ATTRIBUTE_GET(C,name, { \
591 if ((obj->member) && (obj->member->len > 0)) { \
592 if (wtap_block_get_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, &str) == WTAP_OPTTYPE_SUCCESS) { \
593 lua_pushstring(L,str); \
602#define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_NTH_STRING_GETTER(C,name,member,option) \
603 WSLUA_ATTRIBUTE_GET(C,name, { \
605 if ((obj->member) && (obj->member->len > 0)) { \
606 if (wtap_block_get_nth_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, 0, &str) == WTAP_OPTTYPE_SUCCESS) { \
607 lua_pushstring(L,str); \
612#define WSLUA_ATTRIBUTE_SET(C,name,block) \
613 static int C##_set_##name (lua_State* L) { \
614 C obj = check##C (L,1); \
619 typedef void __dummy##C##_set_##name
621#define WSLUA_ATTRIBUTE_NAMED_BOOLEAN_SETTER(C,name,member) \
622 WSLUA_ATTRIBUTE_SET(C,name, { \
623 if (! lua_isboolean(L,-1) ) \
624 return luaL_error(L, "%s's attribute `%s' must be a boolean", #C , #name ); \
625 obj->member = lua_toboolean(L,-1); \
630#define WSLUA_ATTRIBUTE_NAMED_INTEGER_SETTER(C,name,member,cast) \
631 WSLUA_ATTRIBUTE_SET(C,name, { \
632 if (! lua_isinteger(L,-1) ) \
633 return luaL_error(L, "%s's attribute `%s' must be an integer", #C , #name ); \
634 obj->member = (cast) wslua_toint32(L,-1); \
637#define WSLUA_ATTRIBUTE_INTEGER_SETTER(C,member,cast) \
638 WSLUA_ATTRIBUTE_NAMED_INTEGER_SETTER(C,member,member,cast)
640#define WSLUA_ATTRIBUTE_NAMED_STRING_SETTER(C,field,member,need_free) \
641 static int C##_set_##field (lua_State* L) { \
642 C obj = check##C (L,1); \
644 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
645 s = g_strdup(lua_tostring(L,-1)); \
647 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
649 if (obj->member != NULL && need_free) \
650 g_free((void*) obj->member); \
655 typedef void __dummy##C##_set_##field
657#define WSLUA_ATTRIBUTE_STRING_SETTER(C,field,need_free) \
658 WSLUA_ATTRIBUTE_NAMED_STRING_SETTER(C,field,field,need_free)
660#define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_STRING_SETTER(C,field,member,option) \
661 static int C##_set_##field (lua_State* L) { \
662 C obj = check##C (L,1); \
664 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
665 s = g_strdup(lua_tostring(L,-1)); \
667 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
669 if ((obj->member) && (obj->member->len > 0)) { \
670 wtap_block_set_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, s, strlen(s)); \
676 typedef void __dummy##C##_set_##field
678#define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_NTH_STRING_SETTER(C,field,member,option) \
679 static int C##_set_##field (lua_State* L) { \
680 C obj = check##C (L,1); \
682 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
683 s = g_strdup(lua_tostring(L,-1)); \
685 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
687 if ((obj->member) && (obj->member->len > 0)) { \
688 wtap_block_set_nth_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, 0, s, strlen(s)); \
694 typedef void __dummy##C##_set_##field
696#define WSLUA_ERROR(name,error) { luaL_error(L, "%s%s", #name ": ", error); }
697#define WSLUA_ARG_ERROR(name,attr,error) { luaL_argerror(L,WSLUA_ARG_ ## name ## _ ## attr, #name ": " error); }
698#define WSLUA_OPTARG_ERROR(name,attr,error) { luaL_argerror(L,WSLUA_OPTARG_##name##_ ##attr, #name ": " error); }
700#define WSLUA_REG_GLOBAL_BOOL(L,n,v) { lua_pushboolean(L,v); lua_setglobal(L,n); }
701#define WSLUA_REG_GLOBAL_STRING(L,n,v) { lua_pushstring(L,v); lua_setglobal(L,n); }
702#define WSLUA_REG_GLOBAL_INTEGER(L,n,v) { lua_pushinteger(L,v); lua_setglobal(L,n); }
704#define WSLUA_RETURN(i) return (i)
706#define WSLUA_API extern
711#define FAIL_ON_NULL(s) if (! *p) luaL_argerror(L,idx,"null " s)
713#define FAIL_ON_NULL_OR_EXPIRED(s) if (!*p) { \
714 luaL_argerror(L,idx,"null " s); \
715 } else if ((*p)->expired) { \
716 luaL_argerror(L,idx,"expired " s); \
720#define CLEAR_OUTSTANDING(C, marker, marker_val) void clear_outstanding_##C(void) { \
721 while (outstanding_##C->len) { \
722 C p = (C)g_ptr_array_remove_index_fast(outstanding_##C,0); \
724 if (p->marker != marker_val) \
725 p->marker = marker_val; \
732#define WSLUA_CLASS_DECLARE(C) \
733extern C to##C(lua_State* L, int idx); \
734extern C check##C(lua_State* L, int idx); \
735extern C* push##C(lua_State* L, C v); \
736extern int C##_register(lua_State* L); \
737extern bool is##C(lua_State* L,int i); \
738extern C shift##C(lua_State* L,int i)
742#define THROW_LUA_ERROR(...) \
743 THROW_FORMATTED(DissectorError, __VA_ARGS__)
764#define WRAP_NON_LUA_EXCEPTIONS(code) \
766 volatile bool has_error = false; \
769 } CATCH3(BoundsError, FragmentBoundsError, ScsiBoundsError) { \
770 show_exception(lua_tvb, lua_pinfo, lua_tree->tree, EXCEPT_CODE, GET_MESSAGE); \
772 show_exception(lua_tvb, lua_pinfo, lua_tree->tree, EXCEPT_CODE, GET_MESSAGE); \
773 lua_pushfstring(L, "%s: %s", __func__, GET_MESSAGE ? GET_MESSAGE : "Malformed packet"); \
776 if (has_error) { lua_error(L); } \
783extern bool lua_initialized;
784extern int lua_dissectors_table_ref;
785extern int lua_heur_dissectors_table_ref;
786extern const char* lua_app_env_var_prefix;
787extern GPtrArray* lua_outstanding_FuncSavers;
789WSLUA_DECLARE_CLASSES()
790WSLUA_DECLARE_FUNCTIONS()
792extern lua_State* wslua_state(
void);
813extern int wslua__concat(lua_State* L);
814extern bool wslua_toboolean(lua_State* L,
int n);
815extern bool wslua_checkboolean(lua_State* L,
int n);
816extern bool wslua_optbool(lua_State* L,
int n,
bool def);
817extern lua_Integer wslua_tointeger(lua_State* L,
int n);
818extern int wslua_optboolint(lua_State* L,
int n,
int def);
819extern const char* wslua_checklstring_only(lua_State* L,
int n,
size_t *l);
820extern const char* wslua_checkstring_only(lua_State* L,
int n);
821extern void wslua_setfuncs(lua_State *L,
const luaL_Reg *l,
int nup);
822extern const char* wslua_typeof_unknown;
823extern const char* wslua_typeof(lua_State *L,
int idx);
824extern bool wslua_get_table(lua_State *L,
int idx,
const char *name);
825extern bool wslua_get_field(lua_State *L,
int idx,
const char *name);
828extern expert_field* wslua_get_expert_field(
const int group,
const int severity);
829extern void wslua_prefs_changed(
void);
830extern void proto_register_lua(
void);
831extern GString* lua_register_all_taps(
void);
833extern bool wslua_has_field_extractors(
void);
834extern void lua_prime_all_fields(
proto_tree* tree);
836extern int Proto_commit(lua_State* L);
840extern void clear_outstanding_FuncSavers(
void);
842extern void Int64_pack(lua_State* L, luaL_Buffer *b,
int idx,
bool asLittleEndian);
843extern int Int64_unpack(lua_State* L,
const char *buff,
bool asLittleEndian);
844extern void UInt64_pack(lua_State* L, luaL_Buffer *b,
int idx,
bool asLittleEndian);
845extern int UInt64_unpack(lua_State* L,
const char *buff,
bool asLittleEndian);
846extern uint64_t getUInt64(lua_State *L,
int i);
849extern int push_wsluaTvb(lua_State* L,
Tvb t);
850extern bool push_TvbRange(lua_State* L,
tvbuff_t* tvb,
int offset,
int len);
851extern void clear_outstanding_Tvb(
void);
852extern void clear_outstanding_TvbRange(
void);
855extern void clear_outstanding_Pinfo(
void);
856extern void clear_outstanding_Column(
void);
857extern void clear_outstanding_Columns(
void);
858extern void clear_outstanding_PrivateTable(
void);
860extern int get_hf_wslua_text(
void);
862extern void clear_outstanding_TreeItem(
void);
865extern void clear_outstanding_FieldInfo(
void);
867extern void wslua_print_stack(
char* s, lua_State* L);
869extern void wslua_init(register_cb cb,
void *client_data,
const char* app_env_var_prefix);
870extern void wslua_early_cleanup(
void);
871extern void wslua_cleanup(
void);
873extern tap_extractor_t wslua_get_tap_extractor(
const char* name);
874extern int wslua_set_tap_enums(lua_State* L);
878extern char* wslua_get_actual_filename(
const char* fname);
880extern int wslua_bin2hex(lua_State* L,
const uint8_t* data,
const unsigned len,
const bool lowercase,
const char* sep);
881extern int wslua_hex2bin(lua_State* L,
const char* data,
const unsigned len,
const char* sep);
882extern int luaopen_rex_pcre2(lua_State *L);
884extern const char* get_current_plugin_version(
void);
885extern void clear_current_plugin_version(
void);
887extern int wslua_deregister_heur_dissectors(lua_State* L);
888extern int wslua_deregister_protocols(lua_State* L);
889extern int wslua_deregister_dissector_tables(lua_State* L);
890extern int wslua_deregister_listeners(lua_State* L);
891extern int wslua_deregister_fields(lua_State* L);
892extern int wslua_deregister_filehandlers(lua_State* L);
893extern void wslua_deregister_menus(
void);
895extern void wslua_init_wtap_filetypes(lua_State* L);
Definition tap-funnel.c:21
Definition packet_info.h:43
Definition tvbparse.h:163
Represents an instance of a per-packet parser for tvbuff data.
Definition tvbparse.h:151
Describes a parsing rule or expectation for a tvbuff parser.
Definition tvbparse.h:96
Type for defining new classes.
Definition wslua.h:802
const wslua_attribute_table * attrs
Definition wslua.h:808
const luaL_Reg * class_meta
Definition wslua.h:805
const char * name
Definition wslua.h:803
const luaL_Reg * class_methods
Definition wslua.h:804
const luaL_Reg * instance_methods
Definition wslua.h:806
const luaL_Reg * instance_meta
Definition wslua.h:807
uat_field_t * uat_field_list
Definition wslua.h:195
struct _wslua_pref_t::@509::@511 uat_field_list_info
bool radio_buttons
Definition wslua.h:189
struct _wslua_pref_t::@509::@510 enum_info
char * default_s
Definition wslua.h:197
uint32_t max_value
Definition wslua.h:186
const enum_val_t * enumvals
Definition wslua.h:188
union _wslua_pref_t::@509 info
Definition conversation.h:230
Definition column-info.h:62
Definition epan_dissect.h:28
Definition prefs-int.h:27
Definition progress_frame.h:31
Definition tvbuff-int.h:35
Wiretap dumper handle and associated state.
Definition wtap_module.h:163
Definition file_wrappers.c:97
Definition wtap_module.h:58
void wslua_register_class(lua_State *L, const wslua_class *cls_def)
Definition wslua_internals.c:547
ProtoField wslua_is_field_available(lua_State *L, const char *field_abbr)
Definition wslua_proto.c:702
void wslua_register_classinstance_meta(lua_State *L, const wslua_class *cls_def)
Definition wslua_internals.c:470
struct _wslua_class wslua_class
Type for defining new classes.