aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2022-10-02 11:03:23 +0100
committerJoão Valverde <j@v6e.pt>2022-10-07 10:28:47 +0100
commit91f7762fad49eafecdded8341a2b999eda3bc9b6 (patch)
treec88c2b7b90126b0ab560dc51751043273e406fcc
parent3c99478cef3ad009aa22076d172ac528ac4e2d58 (diff)
wslua: Use wiretap introspection
-rw-r--r--CMakeLists.txt3
-rw-r--r--doc/README.wslua14
-rw-r--r--epan/wslua/CMakeLists.txt25
-rw-r--r--epan/wslua/init.lua (renamed from epan/wslua/template-init.lua)13
-rw-r--r--epan/wslua/init_wslua.c36
-rwxr-xr-xepan/wslua/make-init-lua.py79
6 files changed, 40 insertions, 130 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d174343327..ea41e46a36 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2299,7 +2299,7 @@ endif()
# epan/wslua/CMakeLists.txt
if(LUA_FOUND AND ENABLE_LUA)
set(_lua_files
- "${CMAKE_BINARY_DIR}/epan/wslua/init.lua"
+ "${CMAKE_SOURCE_DIR}/epan/wslua/init.lua"
"${CMAKE_SOURCE_DIR}/epan/wslua/console.lua"
"${CMAKE_SOURCE_DIR}/epan/wslua/dtd_gen.lua"
)
@@ -2312,7 +2312,6 @@ if(LUA_FOUND AND ENABLE_LUA)
"${_lua_file}"
"${DATAFILE_DIR}/${_lua_filename}"
DEPENDS
- wsluaauxiliary
"${_lua_file}"
)
endforeach()
diff --git a/doc/README.wslua b/doc/README.wslua
index 4ecb15c654..d4e1ead2b9 100644
--- a/doc/README.wslua
+++ b/doc/README.wslua
@@ -48,20 +48,6 @@ epan/wslua/CMakeLists.txt. You also have to add the module name into
docbook/user-guide.xml and docbook/wsluarm.xml, and the source files into
docbook/CMakeLists.txt, to get it to be generated in the user guide.
-Another Python3 script is used as well, called 'make-init-lua.py', which
-generates the init.lua script. A large part of it deals with exposing #define
-values into the Lua global table, or sub-tables. Unfortunately not all of
-them are put in sub-tables, which means the global Lua table is quite polluted
-now. If you add new ones in here, please think of putting them in a subtable,
-as they are for wtap, ftypes, and base. For example, there are several put in
-as 'PI_' prefixed names, such as 'PI_SEVERITY_MASK = 15728640'. The fact they
-all have a common 'PI_' prefix should be an indicator they can be put in a
-table named PI, or PacketInfo. Just because C-code doesn't have namespaces,
-doesn't mean Lua can't. This has now been fixed, and the PI_* names are now in
-two separate subtables of a table named 'expert', as 'expert.group' and
-'expert.severity' subtables. Follow that model in 'make-init-lua.py'.
-
-
Due to those documentation and registration scripts, you MUST follow some very
specific conventions in the functions you write to expose C-side code to Lua,
as described in this document.
diff --git a/epan/wslua/CMakeLists.txt b/epan/wslua/CMakeLists.txt
index 39b23d3c5c..9552b61892 100644
--- a/epan/wslua/CMakeLists.txt
+++ b/epan/wslua/CMakeLists.txt
@@ -109,34 +109,11 @@ add_custom_target(
set_target_properties(register_wslua PROPERTIES FOLDER "Libs/epan/wslua")
-add_custom_command(
- OUTPUT init.lua
- COMMAND ${PYTHON_EXECUTABLE}
- ${CMAKE_CURRENT_SOURCE_DIR}/make-init-lua.py
- ${CMAKE_CURRENT_SOURCE_DIR}/template-init.lua
- init.lua
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/make-init-lua.py
- ${CMAKE_CURRENT_SOURCE_DIR}/template-init.lua
- ${CMAKE_SOURCE_DIR}/epan/ftypes/ftypes.h
- ${CMAKE_SOURCE_DIR}/wiretap/wtap.h
- ${CMAKE_SOURCE_DIR}/epan/epan.h
- ${CMAKE_SOURCE_DIR}/epan/stat_groups.h
-)
-
-add_custom_target(
- wsluaauxiliary ALL
- DEPENDS
- init.lua
-)
-
-set_target_properties(wsluaauxiliary PROPERTIES FOLDER "Auxiliary")
-
install(
FILES
+ init.lua
console.lua
dtd_gen.lua
- ${CMAKE_CURRENT_BINARY_DIR}/init.lua
DESTINATION
${CMAKE_INSTALL_DATADIR}
)
diff --git a/epan/wslua/template-init.lua b/epan/wslua/init.lua
index e87ab539e9..6fbf0b7565 100644
--- a/epan/wslua/template-init.lua
+++ b/epan/wslua/init.lua
@@ -76,7 +76,8 @@ function package.prepend_path(name)
package.path = name .. sep .. "?.lua;" .. package.path
end
-${WTAP_ENCAPS}
+-- for backward compatibility
+wtap = wtap_encaps
--
-- Generate the wtap_filetypes items for file types, for backwards
@@ -90,16 +91,6 @@ ${WTAP_ENCAPS}
--
wtap_filetypes = get_wtap_filetypes()
-${WTAP_TSPRECS}
-
-${WTAP_COMMENT_TYPES}
-
--- the following table is since 1.12
-${WTAP_REC_TYPES}
-
--- the following table is since 1.11.3
-${WTAP_PRESENCE_FLAGS}
-
-- Old / deprecated menu groups. These shoudn't be used in new code.
MENU_ANALYZE_UNSORTED = MENU_PACKET_ANALYZE_UNSORTED
MENU_ANALYZE_CONVERSATION = MENU_ANALYZE_CONVERSATION_FILTER
diff --git a/epan/wslua/init_wslua.c b/epan/wslua/init_wslua.c
index f514769bd3..a76d22cc4f 100644
--- a/epan/wslua/init_wslua.c
+++ b/epan/wslua/init_wslua.c
@@ -22,6 +22,7 @@
#include <epan/expert.h>
#include <epan/ex-opt.h>
#include <epan/introspection.h>
+#include <wiretap/introspection.h>
#include <wsutil/privileges.h>
#include <wsutil/file_util.h>
#include <wsutil/wslog.h>
@@ -835,6 +836,11 @@ wslua_allocf(void *ud _U_, void *ptr, size_t osize _U_, size_t nsize)
#define WSLUA_EXPERT_TABLE "expert"
#define WSLUA_EXPERT_GROUP_TABLE "group"
#define WSLUA_EXPERT_SEVERITY_TABLE "severity"
+#define WSLUA_WTAP_ENCAPS_TABLE "wtap_encaps"
+#define WSLUA_WTAP_TSPREC_TABLE "wtap_tsprecs"
+#define WSLUA_WTAP_COMMENTS_TABLE "wtap_comments"
+#define WSLUA_WTAP_RECTYPES_TABLE "wtap_rec_types"
+#define WSLUA_WTAP_PRESENCE_FLAGS_TABLE "wtap_presence_flags"
static void
add_table_symbol(const char *table, const char *name, int value)
@@ -953,7 +959,37 @@ wslua_add_introspection(void)
else if (g_str_has_prefix(ep->symbol, "REGISTER_")) {
add_menu_group_symbol(ep->symbol + strlen("REGISTER_"), ep->value);
}
+ }
+
+ /* Add empty tables to be populated. */
+ lua_newtable(L);
+ lua_setglobal(L, WSLUA_WTAP_ENCAPS_TABLE);
+ lua_newtable(L);
+ lua_setglobal(L, WSLUA_WTAP_TSPREC_TABLE);
+ lua_newtable(L);
+ lua_setglobal(L, WSLUA_WTAP_COMMENTS_TABLE);
+ lua_newtable(L);
+ lua_setglobal(L, WSLUA_WTAP_RECTYPES_TABLE);
+ lua_newtable(L);
+ lua_setglobal(L, WSLUA_WTAP_PRESENCE_FLAGS_TABLE);
+
+ for (ep = wtap_inspect_enums(); ep->symbol != NULL; ep++) {
+ if (g_str_has_prefix(ep->symbol, "WTAP_ENCAP_")) {
+ add_table_symbol(WSLUA_WTAP_ENCAPS_TABLE, ep->symbol + strlen("WTAP_ENCAP_"), ep->value);
+ }
+ else if (g_str_has_prefix(ep->symbol, "WTAP_TSPREC_")) {
+ add_table_symbol(WSLUA_WTAP_TSPREC_TABLE, ep->symbol + strlen("WTAP_TSPREC_"), ep->value);
+ }
+ else if (g_str_has_prefix(ep->symbol, "WTAP_COMMENT_")) {
+ add_table_symbol(WSLUA_WTAP_COMMENTS_TABLE, ep->symbol + strlen("WTAP_COMMENT_"), ep->value);
+ }
+ else if (g_str_has_prefix(ep->symbol, "REC_TYPE_")) {
+ add_table_symbol(WSLUA_WTAP_RECTYPES_TABLE, ep->symbol + strlen("REC_TYPE_"), ep->value);
+ }
+ else if (g_str_has_prefix(ep->symbol, "WTAP_HAS_")) {
+ add_table_symbol(WSLUA_WTAP_PRESENCE_FLAGS_TABLE, ep->symbol + strlen("WTAP_HAS_"), ep->value);
+ }
}
}
diff --git a/epan/wslua/make-init-lua.py b/epan/wslua/make-init-lua.py
deleted file mode 100755
index ce71e849f0..0000000000
--- a/epan/wslua/make-init-lua.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python3
-#
-# make-init-lua.py
-#
-# By Gerald Combs <gerald@wireshark.org>
-# Based on make-init-lua.pl by Luis E. Garcia Onatnon <luis.ontanon@gmail.com>
-#
-# Wireshark - Network traffic analyzer
-# By Gerald Combs <gerald@wireshark.org>
-# Copyright 1998 Gerald Combs
-#
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-import argparse
-import os
-import re
-
-from enum import Enum
-from string import Template
-
-def main():
- parser = argparse.ArgumentParser(description="Generate the registration macros for Lua code.")
- parser.add_argument("template", metavar='template', help="template file")
- parser.add_argument("output", metavar='output', help="output file")
- args = parser.parse_args()
-
- this_dir = os.path.dirname(__file__)
- src_root = os.path.join(this_dir, '..', '..')
-
- replacements = {
- 'WTAP_ENCAPS': '-- Wiretap encapsulations XXX\nwtap_encaps = {',
- 'WTAP_TSPRECS': '-- Wiretap timestamp precision types\nwtap_tsprecs = {',
- 'WTAP_COMMENT_TYPES': '-- Wiretap file comment types\nwtap_comments = {',
- 'WTAP_REC_TYPES': '-- Wiretap record_types\nwtap_rec_types = {',
- 'WTAP_PRESENCE_FLAGS': '-- Wiretap presence flags\nwtap_presence_flags = {',
- }
-
- with open(args.template, encoding='utf-8') as tmpl_f:
- template = Template(tmpl_f.read())
-
- wtap_encaps = []
- wtap_tsprecs = []
- wtap_comment_types = []
- wtap_rec_types = []
- wtap_presence_flags = []
- with open(os.path.join(src_root, 'wiretap', 'wtap.h'), encoding='utf-8') as wtap_f:
- for line in wtap_f:
- m = re.search(r'#define WTAP_ENCAP_([A-Z0-9_]+)\s+(-?\d+)', line)
- if m:
- wtap_encaps.append(f'\n\t["{m.group(1)}"] = {m.group(2)}')
-
- m = re.search(r'#define WTAP_TSPREC_([A-Z0-9_]+)\s+(\d+)', line)
- if m:
- wtap_tsprecs.append(f'\n\t["{m.group(1)}"] = {m.group(2)}')
-
- m = re.search(r'#define WTAP_COMMENT_([A-Z0-9_]+)\s+(0x\d+)', line)
- if m:
- wtap_comment_types.append(f'\n\t["{m.group(1)}"] = {m.group(2)}')
-
- m = re.search(r'#define REC_TYPE_([A-Z0-9_]+)\s+(\d+)\s+\/\*\*<([^\*]+)\*\/', line)
- if m:
- wtap_rec_types.append(f'\n\t["{m.group(1)}"] = {m.group(2)}, --{m.group(3)}')
-
- m = re.search(r'#define WTAP_HAS_([A-Z0-9_]+)\s+(0x\d+)\s+\/\*\*<([^\*]+)\*\/', line)
- if m:
- wtap_presence_flags.append(f'\n\t["{m.group(1)}"] = {int(m.group(2), 16)}, --{m.group(3)}')
-
- replacements['WTAP_ENCAPS'] += ','.join(wtap_encaps) + '\n}\nwtap = wtap_encaps -- for bw compatibility\n'
- replacements['WTAP_TSPRECS'] += ','.join(wtap_tsprecs) + '\n}\n'
- replacements['WTAP_COMMENT_TYPES'] += ','.join(wtap_comment_types) + '\n}\n'
- replacements['WTAP_REC_TYPES'] += ''.join(wtap_rec_types) + '\n}\n'
- replacements['WTAP_PRESENCE_FLAGS'] += ''.join(wtap_presence_flags) + '\n}\n'
-
- with open(args.output, mode='w', encoding='utf-8') as out_f:
- out_f.write(template.substitute(replacements))
-
-
-if __name__ == '__main__':
- main()