aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/tshark.pod7
-rw-r--r--doc/wireshark.pod.template7
-rw-r--r--docbook/wsug_src/WSUG_chapter_customize.xml8
-rw-r--r--epan/wslua/init_wslua.c35
-rwxr-xr-xtest/lua/script_args.lua36
-rwxr-xr-xtest/suite-unittests.sh39
6 files changed, 126 insertions, 6 deletions
diff --git a/doc/tshark.pod b/doc/tshark.pod
index 23f95f60e6..c195a87659 100644
--- a/doc/tshark.pod
+++ b/doc/tshark.pod
@@ -788,6 +788,13 @@ is in the form I<extension_key>B<:>I<value>, where I<extension_key> can be:
B<lua_script>:I<lua_script_filename> tells B<Wireshark> to load the given script in addition to the
default Lua scripts.
+B<lua_script>I<num>:I<argument> tells B<Wireshark> to pass the given argument
+to the lua script identified by 'num', which is the number indexed order of the 'lua_script' command.
+For example, if only one script was loaded with '-X lua_script:my.lua', then '-X lua_script1:foo'
+will pass the string 'foo' to the 'my.lua' script. If two scripts were loaded, such as '-X lua_script:my.lua'
+and '-X lua_script:other.lua' in that order, then a '-X lua_script2:bar' would pass the string 'bar' to the second lua
+script, namely 'other.lua'.
+
=item -y E<lt>capture link typeE<gt>
Set the data link type to use while capturing packets. The values
diff --git a/doc/wireshark.pod.template b/doc/wireshark.pod.template
index 73eb0c13c1..2c93582afa 100644
--- a/doc/wireshark.pod.template
+++ b/doc/wireshark.pod.template
@@ -604,6 +604,13 @@ is in the form I<extension_key>B<:>I<value>, where I<extension_key> can be:
B<lua_script>:I<lua_script_filename> tells B<Wireshark> to load the given script in addition to the
default Lua scripts.
+B<lua_script>I<num>:I<argument> tells B<Wireshark> to pass the given argument
+to the lua script identified by 'num', which is the number indexed order of the 'lua_script' command.
+For example, if only one script was loaded with '-X lua_script:my.lua', then '-X lua_script1:foo'
+will pass the string 'foo' to the 'my.lua' script. If two scripts were loaded, such as '-X lua_script:my.lua'
+and '-X lua_script:other.lua' in that order, then a '-X lua_script2:bar' would pass the string 'bar' to the second lua
+script, namely 'other.lua'.
+
B<stdin_descr>:I<description> tells B<Wireshark> to use the given description when
capturing from standard input (B<-i ->).
diff --git a/docbook/wsug_src/WSUG_chapter_customize.xml b/docbook/wsug_src/WSUG_chapter_customize.xml
index 9076ac8ec4..46f5d51ac5 100644
--- a/docbook/wsug_src/WSUG_chapter_customize.xml
+++ b/docbook/wsug_src/WSUG_chapter_customize.xml
@@ -585,6 +585,14 @@ standard libpcap format.
<para>
<command>lua_script</command>:lua_script_filename; Tells Wireshark to load the given script in addition to the default Lua scripts.
</para>
+ <para>
+ <command>lua_script[num]</command>:argument; Tells Wireshark to pass the given argument
+ to the lua script identified by 'num', which is the number indexed order of the 'lua_script' command.
+ For example, if only one script was loaded with '-X lua_script:my.lua', then '-X lua_script1:foo'
+ will pass the string 'foo' to the 'my.lua' script. If two scripts were loaded, such as '-X lua_script:my.lua' and
+ '-X lua_script:other.lua' in that order, then a '-X lua_script2:bar' would pass the string 'bar' to the second lua
+ script, namely 'other.lua'.
+ </para>
</listitem>
</varlistentry>
<varlistentry><term><command>-z &lt;statistics-string></command></term>
diff --git a/epan/wslua/init_wslua.c b/epan/wslua/init_wslua.c
index 5bcc660ccd..447ba2f382 100644
--- a/epan/wslua/init_wslua.c
+++ b/epan/wslua/init_wslua.c
@@ -241,9 +241,27 @@ static void wslua_add_plugin(gchar *name, gchar *version, gchar *filename)
new_plug->next = NULL;
}
-static gboolean lua_load_script(const gchar* filename) {
+static int lua_script_push_args(const int script_num) {
+ gchar* argname = g_strdup_printf("lua_script%d", script_num);
+ const gchar* argvalue = NULL;
+ int count = 0;
+
+ while((argvalue = ex_opt_get_next(argname))) {
+ lua_pushstring(L,argvalue);
+ count++;
+ }
+
+ g_free(argname);
+ return count;
+}
+
+/* If file_count > 0 then it's a command-line-added user script, and the count
+ * represents which user script it is (first=1, second=2, etc.).
+ */
+static gboolean lua_load_script(const gchar* filename, const int file_count) {
FILE* file;
int error;
+ int numargs = 0;
if (! ( file = ws_fopen(filename,"r")) ) {
report_open_failure(filename,errno,FALSE);
@@ -261,7 +279,10 @@ static gboolean lua_load_script(const gchar* filename) {
#endif
switch (error) {
case 0:
- lua_pcall(L,0,0,1);
+ if (file_count > 0) {
+ numargs = lua_script_push_args(file_count);
+ }
+ lua_pcall(L,numargs,0,1);
fclose(file);
lua_pop(L,1); /* pop the error handler */
return TRUE;
@@ -332,7 +353,7 @@ static int lua_load_plugins(const char *dirname, register_cb cb, gpointer client
if (!count_only) {
if (cb)
(*cb)(RA_LUA_PLUGINS, name, client_data);
- if (lua_load_script(filename)) {
+ if (lua_load_script(filename,0)) {
wslua_add_plugin(g_strdup(name), g_strdup(""), g_strdup(filename));
}
}
@@ -401,6 +422,7 @@ int wslua_init(register_cb cb, gpointer client_data) {
const funnel_ops_t* ops = funnel_get_funnel_ops();
gboolean run_anyway = FALSE;
expert_module_t* expert_lua;
+ int file_count = 1;
static ei_register_info ei[] = {
{ &ei_lua_error, { "_ws.lua.error", PI_UNDECODED, PI_ERROR ,"Lua Error", EXPFILL }},
@@ -456,7 +478,7 @@ int wslua_init(register_cb cb, gpointer client_data) {
}
if (( file_exists(filename))) {
- lua_load_script(filename);
+ lua_load_script(filename,0);
}
g_free(filename);
@@ -491,7 +513,7 @@ int wslua_init(register_cb cb, gpointer client_data) {
if ((file_exists(filename))) {
if (cb)
(*cb)(RA_LUA_PLUGINS, get_basename(filename), client_data);
- lua_load_script(filename);
+ lua_load_script(filename,0);
}
g_free(filename);
@@ -504,7 +526,8 @@ int wslua_init(register_cb cb, gpointer client_data) {
while((script_filename = ex_opt_get_next("lua_script"))) {
if (cb)
(*cb)(RA_LUA_PLUGINS, get_basename(script_filename), client_data);
- lua_load_script(script_filename);
+ lua_load_script(script_filename,file_count);
+ file_count++;
}
}
diff --git a/test/lua/script_args.lua b/test/lua/script_args.lua
new file mode 100755
index 0000000000..2bf9d47025
--- /dev/null
+++ b/test/lua/script_args.lua
@@ -0,0 +1,36 @@
+----------------------------------------
+-- This just verifies the number of args it got is what it expected.
+-- The first arg should be a number, for how many total args to expect,
+-- including itself.
+
+local function testing(...)
+ print("---- Testing "..tostring(...).." ----")
+end
+
+local function test(name, result)
+ io.stdout:write("test "..name.."...")
+ if result == true then
+ io.stdout:write("passed\n")
+ else
+ io.stdout:write("failed!\n")
+ error(name.." test failed!")
+ end
+end
+
+-----------------------------
+
+testing("Command-line args")
+
+local arg={...} -- get passed-in args
+
+test("arg1", arg ~= nil and #arg > 0)
+
+local numargs = tonumber(arg[1])
+test("arg2", numargs ~= nil)
+
+test("arg3", #arg == numargs)
+
+print("\n-----------------------------\n")
+
+print("All tests passed!\n\n")
+
diff --git a/test/suite-unittests.sh b/test/suite-unittests.sh
index 4d713678e8..f1ae85c227 100755
--- a/test/suite-unittests.sh
+++ b/test/suite-unittests.sh
@@ -114,6 +114,44 @@ unittests_step_lua_int64_test() {
fi
}
+unittests_step_lua_args_test() {
+ if [ $HAVE_LUA -ne 0 ]; then
+ test_step_skipped
+ return
+ fi
+
+ # Tshark catches lua script failures, so we have to parse the output.
+ $TSHARK -r $CAPTURE_DIR/dhcp.pcap -X lua_script:$TESTS_DIR/lua/script_args.lua -X lua_script1:1 > testout.txt 2>&1
+ grep -q "All tests passed!" testout.txt
+ if [ $? -ne 0 ]; then
+ cat testout.txt
+ test_step_failed "lua_args_test test 1 failed"
+ fi
+ $TSHARK -r $CAPTURE_DIR/dhcp.pcap -X lua_script:$TESTS_DIR/lua/script_args.lua -X lua_script1:3 -X lua_script1:foo -X lua_script1:bar > testout.txt 2>&1
+ grep -q "All tests passed!" testout.txt
+ if [ $? -ne 0 ]; then
+ cat testout.txt
+ test_step_failed "lua_args_test test 2 failed"
+ fi
+ $TSHARK -r $CAPTURE_DIR/dhcp.pcap -X lua_script:$TESTS_DIR/lua/script_args.lua -X lua_script:$TESTS_DIR/lua/script_args.lua -X lua_script1:3 -X lua_script2:1 -X lua_script1:foo -X lua_script1:bar > testout.txt 2>&1
+ grep -q "All tests passed!" testout.txt
+ if [ $? -ne 0 ]; then
+ cat testout.txt
+ test_step_failed "lua_args_test test 3 failed"
+ fi
+ $TSHARK -r $CAPTURE_DIR/dhcp.pcap -X lua_script:$TESTS_DIR/lua/script_args.lua > testout.txt 2>&1
+ if grep -q "All tests passed!" testout.txt; then
+ cat testout.txt
+ test_step_failed "lua_args_test negative test 4 failed"
+ fi
+ $TSHARK -r $CAPTURE_DIR/dhcp.pcap -X lua_script:$TESTS_DIR/lua/script_args.lua -X lua_script1:3 > testout.txt 2>&1
+ if grep -q "All tests passed!" testout.txt; then
+ cat testout.txt
+ test_step_failed "lua_args_test negative test 5 failed"
+ fi
+ test_step_ok
+}
+
unittests_step_oids_test() {
DUT=$SOURCE_DIR/epan/oids_test
ARGS=
@@ -149,6 +187,7 @@ unittests_suite() {
test_step_add "exntest" unittests_step_exntest
test_step_add "lua dissector" unittests_step_lua_dissector_test
test_step_add "lua int64" unittests_step_lua_int64_test
+ test_step_add "lua script arguments" unittests_step_lua_args_test
test_step_add "oids_test" unittests_step_oids_test
test_step_add "reassemble_test" unittests_step_reassemble_test
test_step_add "tvbtest" unittests_step_tvbtest