28 #include <ws_log_defs.h>
51 #include <epan/wslua/declare_wslua.h>
57 #define WSLUA_INIT_ROUTINES "init_routines"
58 #define WSLUA_PREFS_CHANGED "prefs_changed"
63 #define wslua_togint(L,i) (gint) ( lua_tointeger(L,i) )
64 #define wslua_togint32(L,i) (gint32) ( lua_tonumber(L,i) )
65 #define wslua_togint64(L,i) (gint64) ( lua_tonumber(L,i) )
66 #define wslua_toguint(L,i) (guint) ( lua_tointeger(L,i) )
67 #define wslua_toguint32(L,i) (guint32) ( lua_tonumber(L,i) )
68 #define wslua_toguint64(L,i) (guint64) ( lua_tonumber(L,i) )
70 #define wslua_checkgint(L,i) (gint) ( luaL_checkinteger(L,i) )
71 #define wslua_checkgint32(L,i) (gint32) ( luaL_checknumber(L,i) )
72 #define wslua_checkgint64(L,i) (gint64) ( luaL_checknumber(L,i) )
73 #define wslua_checkguint(L,i) (guint) ( luaL_checkinteger(L,i) )
74 #define wslua_checkguint32(L,i) (guint32) ( luaL_checknumber(L,i) )
75 #define wslua_checkguint64(L,i) (guint64) ( luaL_checknumber(L,i) )
77 #define wslua_optgint(L,i,d) (gint) ( luaL_optinteger(L,i,d) )
78 #define wslua_optgint32(L,i,d) (gint32) ( luaL_optnumber(L,i,d) )
79 #define wslua_optgint64(L,i,d) (gint64) ( luaL_optnumber(L,i,d) )
80 #define wslua_optguint(L,i,d) (guint) ( luaL_optinteger(L,i,d) )
81 #define wslua_optguint32(L,i,d) (guint32) ( luaL_optnumber(L,i,d) )
82 #define wslua_optguint64(L,i,d) (guint64) ( luaL_optnumber(L,i,d) )
180 int expert_info_table_ref;
187 gboolean is_postdissector;
194 const gchar* ui_name;
212 gboolean is_allocated;
233 typedef void (*tap_extractor_t)(lua_State*,
const void*);
238 tap_extractor_t extractor;
280 gchar* internal_description;
288 int seq_read_close_ref;
289 int can_write_encap_ref;
310 typedef struct {
const char* name; tap_extractor_t extractor; }
tappable_t;
321 typedef GByteArray* ByteArray;
330 typedef gint64 Int64;
331 typedef guint64 UInt64;
348 typedef tvbparse_action_t* Shortcut;
351 typedef gchar* Struct;
362 #define WSLUA_CLASS_DEFINE(C,check_code) \
363 WSLUA_CLASS_DEFINE_BASE(C,check_code,NULL)
365 #define WSLUA_CLASS_DEFINE_BASE(C,check_code,retval) \
366 C to##C(lua_State* L, int idx) { \
367 C* v = (C*)lua_touserdata (L, idx); \
368 if (!v) luaL_error(L, "bad argument %d (%s expected, got %s)", idx, #C, lua_typename(L, lua_type(L, idx))); \
369 return v ? *v : retval; \
371 C check##C(lua_State* L, int idx) { \
373 luaL_checktype(L,idx,LUA_TUSERDATA); \
374 p = (C*)luaL_checkudata(L, idx, #C); \
376 return p ? *p : retval; \
378 C* push##C(lua_State* L, C v) { \
380 luaL_checkstack(L,2,"Unable to grow stack\n"); \
381 p = (C*)lua_newuserdata(L,sizeof(C)); *p = v; \
382 luaL_getmetatable(L, #C); lua_setmetatable(L, -2); \
385 gboolean is##C(lua_State* L,int i) { \
387 if(!lua_isuserdata(L,i)) return FALSE; \
388 p = lua_touserdata(L, i); \
389 lua_getfield(L, LUA_REGISTRYINDEX, #C); \
390 if (p == NULL || !lua_getmetatable(L, i) || !lua_rawequal(L, -1, -2)) p=NULL; \
392 return p ? TRUE : FALSE; \
394 C shift##C(lua_State* L,int i) { \
396 if(!lua_isuserdata(L,i)) return retval; \
397 p = (C*)lua_touserdata(L, i); \
398 lua_getfield(L, LUA_REGISTRYINDEX, #C); \
399 if (p == NULL || !lua_getmetatable(L, i) || !lua_rawequal(L, -1, -2)) p=NULL; \
401 if (p) { lua_remove(L,i); return *p; }\
407 const gchar *fieldname;
408 lua_CFunction getfunc;
409 lua_CFunction setfunc;
413 #define WSLUA_TYPEOF_FIELD "__typeof"
418 #define WSLUA_REGISTER_GC(C) \
419 luaL_getmetatable(L, #C); \
422 lua_pushcfunction(L, C ## __gc); \
423 lua_setfield(L, -2, "__gc"); \
427 #define __WSLUA_REGISTER_META(C, ATTRS) { \
428 const wslua_class C ## _class = { \
430 .instance_meta = C ## _meta, \
433 wslua_register_classinstance_meta(L, &C ## _class); \
434 WSLUA_REGISTER_GC(C); \
437 #define WSLUA_REGISTER_META(C) __WSLUA_REGISTER_META(C, NULL)
438 #define WSLUA_REGISTER_META_WITH_ATTRS(C) \
439 __WSLUA_REGISTER_META(C, C ## _attributes)
441 #define __WSLUA_REGISTER_CLASS(C, ATTRS) { \
442 const wslua_class C ## _class = { \
444 .class_methods = C ## _methods, \
445 .class_meta = C ## _meta, \
446 .instance_methods = C ## _methods, \
447 .instance_meta = C ## _meta, \
450 wslua_register_class(L, &C ## _class); \
451 WSLUA_REGISTER_GC(C); \
454 #define WSLUA_REGISTER_CLASS(C) __WSLUA_REGISTER_CLASS(C, NULL)
455 #define WSLUA_REGISTER_CLASS_WITH_ATTRS(C) \
456 __WSLUA_REGISTER_CLASS(C, C ## _attributes)
458 #define WSLUA_INIT(L) \
460 wslua_register_classes(L); \
461 wslua_register_functions(L);
465 #define WSLUA_FUNCTION extern int
467 #define WSLUA_INTERNAL_FUNCTION extern int
469 #define WSLUA_REGISTER_FUNCTION(name) { lua_pushcfunction(L, wslua_## name); lua_setglobal(L, #name); }
471 #define WSLUA_REGISTER extern int
473 #define WSLUA_METHOD static int
474 #define WSLUA_CONSTRUCTOR static int
475 #define WSLUA_ATTR_SET static int
476 #define WSLUA_ATTR_GET static int
477 #define WSLUA_METAMETHOD static int
479 #define WSLUA_METHODS static const luaL_Reg
480 #define WSLUA_META static const luaL_Reg
481 #define WSLUA_CLASS_FNREG(class,name) { #name, class##_##name }
482 #define WSLUA_CLASS_FNREG_ALIAS(class,aliasname,name) { #aliasname, class##_##name }
483 #define WSLUA_CLASS_MTREG(class,name) { "__" #name, class##__##name }
485 #define WSLUA_ATTRIBUTES static const wslua_attribute_table
487 #define WSLUA_ATTRIBUTE_RWREG(class,name) { #name, class##_get_##name, class##_set_##name }
488 #define WSLUA_ATTRIBUTE_ROREG(class,name) { #name, class##_get_##name, NULL }
489 #define WSLUA_ATTRIBUTE_WOREG(class,name) { #name, NULL, class##_set_##name }
491 #define WSLUA_ATTRIBUTE_FUNC_SETTER(C,field) \
492 static int C##_set_##field (lua_State* L) { \
493 C obj = check##C (L,1); \
494 if (! lua_isfunction(L,-1) ) \
495 return luaL_error(L, "%s's attribute `%s' must be a function", #C , #field ); \
496 if (obj->field##_ref != LUA_NOREF) \
498 luaL_unref(L, LUA_REGISTRYINDEX, obj->field##_ref); \
499 obj->field##_ref = luaL_ref(L, LUA_REGISTRYINDEX); \
503 typedef void __dummy##C##_set_##field
505 #define WSLUA_ATTRIBUTE_GET(C,name,block) \
506 static int C##_get_##name (lua_State* L) { \
507 C obj = check##C (L,1); \
512 typedef void __dummy##C##_get_##name
514 #define WSLUA_ATTRIBUTE_NAMED_BOOLEAN_GETTER(C,name,member) \
515 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushboolean(L, obj->member );})
517 #define WSLUA_ATTRIBUTE_NAMED_NUMBER_GETTER(C,name,member) \
518 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushnumber(L,(lua_Number)(obj->member));})
520 #define WSLUA_ATTRIBUTE_NUMBER_GETTER(C,member) \
521 WSLUA_ATTRIBUTE_NAMED_NUMBER_GETTER(C,member,member)
523 #define WSLUA_ATTRIBUTE_BLOCK_NUMBER_GETTER(C,name,block) \
524 WSLUA_ATTRIBUTE_GET(C,name,{lua_pushnumber(L,(lua_Number)(block));})
526 #define WSLUA_ATTRIBUTE_NAMED_STRING_GETTER(C,name,member) \
527 WSLUA_ATTRIBUTE_GET(C,name, { \
528 lua_pushstring(L,obj->member); \
531 #define WSLUA_ATTRIBUTE_STRING_GETTER(C,member) \
532 WSLUA_ATTRIBUTE_NAMED_STRING_GETTER(C,member,member)
534 #define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_STRING_GETTER(C,name,member,option) \
535 WSLUA_ATTRIBUTE_GET(C,name, { \
537 if ((obj->member) && (obj->member->len > 0)) { \
538 if (wtap_block_get_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, &str) == WTAP_OPTTYPE_SUCCESS) { \
539 lua_pushstring(L,str); \
548 #define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_NTH_STRING_GETTER(C,name,member,option) \
549 WSLUA_ATTRIBUTE_GET(C,name, { \
551 if ((obj->member) && (obj->member->len > 0)) { \
552 if (wtap_block_get_nth_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, 0, &str) == WTAP_OPTTYPE_SUCCESS) { \
553 lua_pushstring(L,str); \
558 #define WSLUA_ATTRIBUTE_SET(C,name,block) \
559 static int C##_set_##name (lua_State* L) { \
560 C obj = check##C (L,1); \
565 typedef void __dummy##C##_set_##name
567 #define WSLUA_ATTRIBUTE_NAMED_BOOLEAN_SETTER(C,name,member) \
568 WSLUA_ATTRIBUTE_SET(C,name, { \
569 if (! lua_isboolean(L,-1) ) \
570 return luaL_error(L, "%s's attribute `%s' must be a boolean", #C , #name ); \
571 obj->member = lua_toboolean(L,-1); \
576 #define WSLUA_ATTRIBUTE_NAMED_NUMBER_SETTER(C,name,member,cast) \
577 WSLUA_ATTRIBUTE_SET(C,name, { \
578 if (! lua_isnumber(L,-1) ) \
579 return luaL_error(L, "%s's attribute `%s' must be a number", #C , #name ); \
580 obj->member = (cast) wslua_togint32(L,-1); \
583 #define WSLUA_ATTRIBUTE_NUMBER_SETTER(C,member,cast) \
584 WSLUA_ATTRIBUTE_NAMED_NUMBER_SETTER(C,member,member,cast)
586 #define WSLUA_ATTRIBUTE_NAMED_STRING_SETTER(C,field,member,need_free) \
587 static int C##_set_##field (lua_State* L) { \
588 C obj = check##C (L,1); \
590 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
591 s = g_strdup(lua_tostring(L,-1)); \
593 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
595 if (obj->member != NULL && need_free) \
596 g_free((void*) obj->member); \
601 typedef void __dummy##C##_set_##field
603 #define WSLUA_ATTRIBUTE_STRING_SETTER(C,field,need_free) \
604 WSLUA_ATTRIBUTE_NAMED_STRING_SETTER(C,field,field,need_free)
606 #define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_STRING_SETTER(C,field,member,option) \
607 static int C##_set_##field (lua_State* L) { \
608 C obj = check##C (L,1); \
610 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
611 s = g_strdup(lua_tostring(L,-1)); \
613 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
615 if ((obj->member) && (obj->member->len > 0)) { \
616 wtap_block_set_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, s, strlen(s)); \
622 typedef void __dummy##C##_set_##field
624 #define WSLUA_ATTRIBUTE_NAMED_OPT_BLOCK_NTH_STRING_SETTER(C,field,member,option) \
625 static int C##_set_##field (lua_State* L) { \
626 C obj = check##C (L,1); \
628 if (lua_isstring(L,-1) || lua_isnil(L,-1)) { \
629 s = g_strdup(lua_tostring(L,-1)); \
631 return luaL_error(L, "%s's attribute `%s' must be a string or nil", #C , #field ); \
633 if ((obj->member) && (obj->member->len > 0)) { \
634 wtap_block_set_nth_string_option_value(g_array_index(obj->member, wtap_block_t, 0), option, 0, s, strlen(s)); \
640 typedef void __dummy##C##_set_##field
642 #define WSLUA_ERROR(name,error) { luaL_error(L, "%s%s", #name ": " ,error); }
643 #define WSLUA_ARG_ERROR(name,attr,error) { luaL_argerror(L,WSLUA_ARG_ ## name ## _ ## attr, #name ": " error); }
644 #define WSLUA_OPTARG_ERROR(name,attr,error) { luaL_argerror(L,WSLUA_OPTARG_##name##_ ##attr, #name ": " error); }
646 #define WSLUA_REG_GLOBAL_BOOL(L,n,v) { lua_pushboolean(L,v); lua_setglobal(L,n); }
647 #define WSLUA_REG_GLOBAL_STRING(L,n,v) { lua_pushstring(L,v); lua_setglobal(L,n); }
648 #define WSLUA_REG_GLOBAL_NUMBER(L,n,v) { lua_pushnumber(L,v); lua_setglobal(L,n); }
650 #define WSLUA_RETURN(i) return (i)
652 #define WSLUA_API extern
657 #define FAIL_ON_NULL(s) if (! *p) luaL_argerror(L,idx,"null " s)
659 #define FAIL_ON_NULL_OR_EXPIRED(s) if (!*p) { \
660 luaL_argerror(L,idx,"null " s); \
661 } else if ((*p)->expired) { \
662 luaL_argerror(L,idx,"expired " s); \
666 #define CLEAR_OUTSTANDING(C, marker, marker_val) void clear_outstanding_##C(void) { \
667 while (outstanding_##C->len) { \
668 C p = (C)g_ptr_array_remove_index_fast(outstanding_##C,0); \
670 if (p->marker != marker_val) \
671 p->marker = marker_val; \
678 #define WSLUA_CLASS_DECLARE(C) \
679 extern C to##C(lua_State* L, int idx); \
680 extern C check##C(lua_State* L, int idx); \
681 extern C* push##C(lua_State* L, C v); \
682 extern int C##_register(lua_State* L); \
683 extern gboolean is##C(lua_State* L,int i); \
684 extern C shift##C(lua_State* L,int i)
688 #define THROW_LUA_ERROR(...) \
689 THROW_FORMATTED(DissectorError, __VA_ARGS__)
693 #define WRAP_NON_LUA_EXCEPTIONS(code) \
695 volatile gboolean has_error = FALSE; \
699 lua_pushstring(L, GET_MESSAGE); \
702 if (has_error) { lua_error(L); } \
709 extern gboolean lua_initialized;
710 extern int lua_dissectors_table_ref;
711 extern int lua_heur_dissectors_table_ref;
713 WSLUA_DECLARE_CLASSES()
714 WSLUA_DECLARE_FUNCTIONS()
716 extern lua_State* wslua_state(
void);
737 extern int wslua__concat(lua_State* L);
738 extern gboolean wslua_toboolean(lua_State* L,
int n);
739 extern gboolean wslua_checkboolean(lua_State* L,
int n);
740 extern gboolean wslua_optbool(lua_State* L,
int n, gboolean def);
741 extern lua_Integer wslua_tointeger(lua_State* L,
int n);
742 extern int wslua_optboolint(lua_State* L,
int n,
int def);
743 extern const char* wslua_checklstring_only(lua_State* L,
int n,
size_t *l);
744 extern const char* wslua_checkstring_only(lua_State* L,
int n);
745 extern void wslua_setfuncs(lua_State *L,
const luaL_Reg *l,
int nup);
746 extern const gchar* wslua_typeof_unknown;
747 extern const gchar* wslua_typeof(lua_State *L,
int idx);
748 extern gboolean wslua_get_table(lua_State *L,
int idx,
const gchar *name);
749 extern gboolean wslua_get_field(lua_State *L,
int idx,
const gchar *name);
752 extern expert_field* wslua_get_expert_field(
const int group,
const int severity);
753 extern void wslua_prefs_changed(
void);
754 extern void proto_register_lua(
void);
755 extern GString* lua_register_all_taps(
void);
757 extern gboolean wslua_has_field_extractors(
void);
758 extern void lua_prime_all_fields(
proto_tree* tree);
760 extern int Proto_commit(lua_State* L);
764 extern void clear_outstanding_FuncSavers(
void);
766 extern void Int64_pack(lua_State* L, luaL_Buffer *b, gint idx, gboolean asLittleEndian);
767 extern int Int64_unpack(lua_State* L,
const gchar *buff, gboolean asLittleEndian);
768 extern void UInt64_pack(lua_State* L, luaL_Buffer *b, gint idx, gboolean asLittleEndian);
769 extern int UInt64_unpack(lua_State* L,
const gchar *buff, gboolean asLittleEndian);
770 extern guint64 getUInt64(lua_State *L,
int i);
773 extern int push_wsluaTvb(lua_State* L,
Tvb t);
774 extern gboolean push_TvbRange(lua_State* L,
tvbuff_t* tvb,
int offset,
int len);
775 extern void clear_outstanding_Tvb(
void);
776 extern void clear_outstanding_TvbRange(
void);
779 extern void clear_outstanding_Pinfo(
void);
780 extern void clear_outstanding_Column(
void);
781 extern void clear_outstanding_Columns(
void);
782 extern void clear_outstanding_PrivateTable(
void);
784 extern int get_hf_wslua_text(
void);
786 extern void clear_outstanding_TreeItem(
void);
789 extern void clear_outstanding_FieldInfo(
void);
791 extern void wslua_print_stack(
char* s, lua_State* L);
793 extern void wslua_init(register_cb cb, gpointer client_data);
794 extern void wslua_early_cleanup(
void);
795 extern void wslua_cleanup(
void);
797 extern tap_extractor_t wslua_get_tap_extractor(
const gchar* name);
798 extern int wslua_set_tap_enums(lua_State* L);
802 extern char* wslua_get_actual_filename(
const char* fname);
804 extern int wslua_bin2hex(lua_State* L,
const guint8* data,
const guint len,
const gboolean lowercase,
const gchar* sep);
805 extern int wslua_hex2bin(lua_State* L,
const char* data,
const guint len,
const gchar* sep);
806 extern int luaopen_rex_pcre2(lua_State *L);
808 extern const gchar* get_current_plugin_version(
void);
809 extern void clear_current_plugin_version(
void);
811 extern int wslua_deregister_heur_dissectors(lua_State* L);
812 extern int wslua_deregister_protocols(lua_State* L);
813 extern int wslua_deregister_dissector_tables(lua_State* L);
814 extern int wslua_deregister_listeners(lua_State* L);
815 extern int wslua_deregister_fields(lua_State* L);
816 extern int wslua_deregister_filehandlers(lua_State* L);
817 extern void wslua_deregister_menus(
void);
819 extern void wslua_init_wtap_filetypes(lua_State* L);
#define PREF_UINT
Definition: prefs-int.h:89
Definition: tap-funnel.c:27
Definition: packet_info.h:44
Definition: tvbparse.h:145
Definition: tvbparse.h:133
Definition: tvbparse.h:90
Type for defining new classes.
Definition: wslua.h:726
const wslua_attribute_table * attrs
Definition: wslua.h:732
const luaL_Reg * class_meta
Definition: wslua.h:729
const char * name
Definition: wslua.h:727
const luaL_Reg * class_methods
Definition: wslua.h:728
const luaL_Reg * instance_methods
Definition: wslua.h:730
const luaL_Reg * instance_meta
Definition: wslua.h:731
guint32 max_value
Definition: wslua.h:156
struct _wslua_pref_t::@482::@483 enum_info
const enum_val_t * enumvals
Definition: wslua.h:158
gboolean radio_buttons
Definition: wslua.h:159
union _wslua_pref_t::@482 info
gchar * default_s
Definition: wslua.h:164
Definition: column-info.h:54
Definition: epan_dissect.h:28
Definition: prefs-int.h:27
Definition: progress_frame.h:33
Definition: tvbuff-int.h:35
Definition: wtap-int.h:95
Definition: file_wrappers.c:168
Definition: wtap-int.h:36
void wslua_register_class(lua_State *L, const wslua_class *cls_def)
Definition: wslua_internals.c:539
ProtoField wslua_is_field_available(lua_State *L, const char *field_abbr)
Definition: wslua_proto.c:561
void wslua_register_classinstance_meta(lua_State *L, const wslua_class *cls_def)
Definition: wslua_internals.c:462
struct _wslua_class wslua_class
Type for defining new classes.
pref_type_t
Definition: wslua.h:132