diff options
-rw-r--r-- | doc/tshark.pod | 7 | ||||
-rw-r--r-- | doc/wireshark.pod.template | 7 | ||||
-rw-r--r-- | docbook/wsug_src/WSUG_chapter_customize.xml | 8 | ||||
-rw-r--r-- | epan/wslua/init_wslua.c | 35 | ||||
-rwxr-xr-x | test/lua/script_args.lua | 36 | ||||
-rwxr-xr-x | test/suite-unittests.sh | 39 |
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 <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 |