#include <epan/expert.h>
#include <epan/ex-opt.h>
#include <epan/privileges.h>
+#include <wiretap/file_util.h>
static lua_State* L = NULL;
static int wslua_not_register_menu(lua_State* LS) {
luaL_error(LS,"too late to register a menu");
- return 0;
+ return 0;
}
void dissect_lua(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) {
lua_pinfo = pinfo;
lua_tvb = tvb;
-
+
lua_tree = ep_alloc(sizeof(struct _wslua_treeitem));
lua_tree->tree = tree;
lua_tree->item = proto_tree_add_text(tree,tvb,0,0,"lua fake item");
PROTO_ITEM_SET_HIDDEN(lua_tree->item);
-
+
/*
* almost equivalent to Lua:
* dissectors[current_proto](tvb,pinfo,tree)
*/
-
+
lua_settop(L,0);
-
- lua_rawgeti(L, LUA_REGISTRYINDEX, lua_dissectors_table_ref);
-
+
+ lua_rawgeti(L, LUA_REGISTRYINDEX, lua_dissectors_table_ref);
+
lua_pushstring(L, pinfo->current_proto);
- lua_gettable(L, -2);
-
+ lua_gettable(L, -2);
+
lua_remove(L,1);
-
-
+
+
if (lua_isfunction(L,1)) {
-
+
push_Tvb(L,tvb);
push_Pinfo(L,pinfo);
push_TreeItem(L,lua_tree);
-
+
if ( lua_pcall(L,3,0,0) ) {
const gchar* error = lua_tostring(L,-1);
-
+
proto_item* pi = proto_tree_add_text(tree,tvb,0,0,"Lua Error: %s",error);
expert_add_info_format(pinfo, pi, PI_DEBUG, PI_ERROR ,"Lua Error");
}
} else {
proto_item* pi = proto_tree_add_text(tree,tvb,0,0,"Lua Error: did not find the %s dissector"
" in the dissectors table",pinfo->current_proto);
-
+
expert_add_info_format(pinfo, pi, PI_DEBUG, PI_ERROR ,"Lua Error");
}
-
+
clear_outstanding_tvbs();
clear_outstanding_pinfos();
clear_outstanding_trees();
-
-
+
+
lua_pinfo = NULL;
lua_tree = NULL;
lua_tvb = NULL;
-
+
}
static void iter_table_and_call(lua_State* LS, int env, const gchar* table_name, lua_CFunction error_handler) {
lua_settop(LS,0);
-
+
lua_pushcfunction(LS,error_handler);
lua_pushstring(LS, table_name);
lua_gettable(LS, env);
-
+
if (!lua_istable(LS, 2)) {
report_failure("Lua: either `%s' does not exist or it is not a table!\n",table_name);
lua_close(LS);
}
lua_pushnil(LS);
-
+
while (lua_next(LS, 2)) {
const gchar* name = lua_tostring(L,-2);
if ( lua_pcall(LS,0,0,1) ) {
lua_pop(LS,1);
}
-
+
} else {
report_failure("Lua: Something not a function got its way into the %s.%s",table_name,name);
lua_close(LS);
lua_prime_all_fields(NULL);
initialized = TRUE;
}
-
+
if (L) {
iter_table_and_call(L, LUA_GLOBALSINDEX, WSLUA_INIT_ROUTINES,init_error_handler);
}
void lua_load_script(const gchar* filename) {
FILE* file;
- if (! ( file = fopen(filename,"r")) ) {
+ if (! ( file = eth_fopen(filename,"r")) ) {
report_open_failure(filename,errno,FALSE);
return;
}
lua_settop(L,0);
-
+
lua_pushcfunction(L,lua_main_error_handler);
-
+
switch (lua_load(L,getF,file,filename)) {
case 0:
lua_pcall(L,0,0,1);
fclose(file);
return;
}
-
+
}
static void basic_logger(const gchar *log_domain _U_,
const gchar* filename;
const funnel_ops_t* ops = funnel_get_funnel_ops();
gboolean run_anyway = FALSE;
-
+
/* set up the logger */
g_log_set_handler(LOG_DOMAIN_LUA, G_LOG_LEVEL_CRITICAL|
G_LOG_LEVEL_WARNING|
G_LOG_LEVEL_INFO|
G_LOG_LEVEL_DEBUG,
ops ? ops->logger : basic_logger, NULL);
-
+
if (!L) {
- if (LS)
+ if (LS)
L = LS;
else
L = luaL_newstate();
}
WSLUA_INIT(L);
-
+
lua_atpanic(L,wslua_panic);
-
+
/* the init_routines table (accessible by the user) */
lua_pushstring(L, WSLUA_INIT_ROUTINES);
lua_newtable (L);
lua_settable(L, LUA_GLOBALSINDEX);
-
+
/* the dissectors table goes in the registry (not accessible) */
lua_newtable (L);
lua_dissectors_table_ref = luaL_ref(L, LUA_REGISTRYINDEX);
/* load system's init.lua */
filename = get_datafile_path("init.lua");
-
+
if (( file_exists(filename))) {
lua_load_script(filename);
}
-
+
/* check if lua is to be disabled */
lua_pushstring(L,"disable_lua");
lua_gettable(L, LUA_GLOBALSINDEX);
-
+
if (lua_isboolean(L,-1) && lua_toboolean(L,-1)) {
/* disable lua */
lua_close(L);
/* check whether we should run other scripts even if running superuser */
lua_pushstring(L,"run_user_scripts_when_superuser");
lua_gettable(L, LUA_GLOBALSINDEX);
-
+
if (lua_isboolean(L,-1) && lua_toboolean(L,-1)) {
run_anyway = TRUE;
}
/* if we are indeed superuser run user scripts only if told to do so */
if ( (!started_with_special_privs()) || run_anyway ) {
filename = get_persconffile_path("init.lua", FALSE);
-
+
if (( file_exists(filename))) {
lua_load_script(filename);
}
-
+
while((filename = ex_opt_get_next("lua_script"))) {
lua_load_script(filename);
}
}
-
+
/* at this point we're set up so register the init routine */
- register_init_routine(wslua_init_routine);
-
+ register_init_routine(wslua_init_routine);
+
/*
* after this point it is too late to register a menu
* disable the function to avoid weirdness
lua_pushstring(L, "register_menu");
lua_pushcfunction(L, wslua_not_register_menu);
lua_settable(L, LUA_GLOBALSINDEX);
-
+
/* set up some essential globals */
lua_pinfo = NULL;
lua_tree = NULL;
lua_tvb = NULL;
-
+
lua_data_handle = find_dissector("data");
lua_malformed = proto_get_id_by_filter_name("malformed");
-
+
Proto_commit(L);
return 0;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <wiretap/file_util.h>
/*
* Just make sure we include the prototype for strptime as well
HDR_UDP.length = g_htons(proto_length);
HDR_UDP.checksum = 0;
- u = g_ntohs(in_checksum(&pseudoh, sizeof(pseudoh))) +
+ u = g_ntohs(in_checksum(&pseudoh, sizeof(pseudoh))) +
g_ntohs(in_checksum(&HDR_UDP, sizeof(HDR_UDP))) +
g_ntohs(in_checksum(packet_buf, curr_offset));
HDR_UDP.checksum = g_htons((u & 0xffff) + (u>>16));
HDR_TCP.window = g_htons(0x2000);
HDR_TCP.checksum = 0;
- u = g_ntohs(in_checksum(&pseudoh, sizeof(pseudoh))) +
+ u = g_ntohs(in_checksum(&pseudoh, sizeof(pseudoh))) +
g_ntohs(in_checksum(&HDR_TCP, sizeof(HDR_TCP))) +
g_ntohs(in_checksum(packet_buf, curr_offset));
HDR_TCP.checksum = g_htons((u & 0xffff) + (u>>16));
char xs[PACKET_PREAMBLE_MAX_LEN];
strcpy(xs, packet_preamble);
while ((c = strchr(xs, '\r')) != NULL) *c=' ';
- fprintf (stderr, "[[append_to_preamble: \"%s\"]]", xs);
+ fprintf (stderr, "[[append_to_preamble: \"%s\"]]", xs);
}
}
}
fprintf (stderr, "Failure processing time \"%s\" using time format \"%s\"\n (defaulting to Jan 1,1970 00:00:00 GMT)\n",
packet_preamble, ts_fmt);
if (debug >= 2) {
- fprintf(stderr, "timecode: %02d/%02d/%d %02d:%02d:%02d %d\n",
+ fprintf(stderr, "timecode: %02d/%02d/%d %02d:%02d:%02d %d\n",
timecode.tm_mday, timecode.tm_mon, timecode.tm_year,
timecode.tm_hour, timecode.tm_min, timecode.tm_sec, timecode.tm_isdst);
}
if (debug >= 2) {
char *c;
while ((c = strchr(packet_preamble, '\r')) != NULL) *c=' ';
- fprintf(stderr, "[[parse_preamble: \"%s\"]]\n", packet_preamble);
+ fprintf(stderr, "[[parse_preamble: \"%s\"]]\n", packet_preamble);
fprintf(stderr, "Format(%s), time(%u), subsecs(%u)\n", ts_fmt, ts_sec, ts_usec);
}
" (.) but no pattern is required; the remaining number\n"
" is assumed to be fractions of a second.\n"
" NOTE: Date/time fields from the current date/time are\n"
- " used as the default for unspecified fields.\n"
+ " used as the default for unspecified fields.\n"
"\n"
"Output:\n"
" -l <typenum> link-layer type number. Default is 1 (Ethernet). \n"
if (strcmp(argv[optind], "-")) {
input_filename = strdup(argv[optind]);
- input_file = fopen(input_filename, "rb");
+ input_file = eth_fopen(input_filename, "rb");
if (!input_file) {
fprintf(stderr, "Cannot open file [%s] for reading: %s\n",
input_filename, strerror(errno));
if (strcmp(argv[optind+1], "-")) {
output_filename = strdup(argv[optind+1]);
- output_file = fopen(output_filename, "wb");
+ output_file = eth_fopen(output_filename, "wb");
if (!output_file) {
fprintf(stderr, "Cannot open file [%s] for writing: %s\n",
output_filename, strerror(errno));