Have Lua disabled by default.

Add more documentation to the code. 
change make-dco.pl so that it creates more readable docbook output.

This should be copied over to 0.99.4



svn path=/trunk/; revision=19670
This commit is contained in:
Luis Ontanon 2006-10-24 13:16:57 +00:00
parent b9ee517437
commit 0072205e18
9 changed files with 193 additions and 132 deletions

View File

@ -67,7 +67,6 @@ MAINTAINERCLEANFILES = \
Makefile.in \
register_wslua.c \
declare_wslua.h \
doc/*.pod \
init.lua
EXTRA_DIST = \
@ -102,7 +101,7 @@ register_wslua.c: declare_wslua.h
declare_wslua.h: make-reg.pl $(wslua_modules) taps_wslua.c
$(PERL) $(srcdir)/make-reg.pl $(wslua_modules);
doc: make-doc.pl $(wslua_modules) template-wsluarm.xml
doc: dummy
$(PERL) $(srcdir)/make-doc.pl $(wslua_modules)
dummy:

View File

@ -35,7 +35,7 @@ sub deb {
}
sub gorolla {
# a gorilla stays to a chimp like ... stays to chomp
# a gorilla stays to a chimp like gorolla stays to chomp
# but this one returns the shrugged string.
my $s = shift;
$s =~ s/^([\n]|\s)*//ms;
@ -53,8 +53,8 @@ my $function;
my @functions;
my $docbook_template = {
module_header => "<chapter id='lua_module_%s'>\n\t<title>%s</title>\n",
module_desc => "\t<para>%s</para>\n",
module_header => "<chapter id='lua_module_%s'>\n",
module_desc => "\t<title>%s</title>\n",
module_footer => "</chapter>\n",
class_header => "\t<section id='lua_class_%s'><title>%s</title>\n",
class_footer => "\t</section> <!-- class_footer: %s -->\n",
@ -71,18 +71,20 @@ my $docbook_template = {
function_header => "\t\t\t<section id='lua_fn_%s'>\n\t\t\t\t<title>%s</title>\n",
function_descr => "\t\t\t\t<para>%s</para>\n",
function_footer => "\t\t\t</section> <!-- function_footer: %s -->\n",
function_arg_header => "\t\t\t\t<section id='lua_fn_arg_%s'>\n\t\t\t\t\t<title>%s</title>\n",
function_arg_descr => "\t\t\t\t\t<para>%s</para>\n",
function_arg_footer => "\t\t\t\t</section> <!-- function_arg_footer: %s -->\n",
function_argerror_header => "\t\t\t\t\t<section id='lua_fn_argerr_%s'>\n\t\t\t\t\t\t<title>Errors</title>\n\t\t\t\t\t\t<itemizedlist>\n",
function_args_header => "\t\t\t\t\t<command>Arguments</command>\t\t\t\t<variablelist>\n",
function_args_footer => "\t\t\t\t</variablelist>\n",
function_arg_header => "\t\t\t\t<varlistentry><term>%s</term>\n",
function_arg_descr => "\t\t\t\t\t<listitem><para>%s</para></listitem>\n",
function_arg_footer => "\t\t\t\t</varlistentry> <!-- function_arg_footer: %s -->\n",
function_argerror_header => "\t\t\t\t\t<command>Errors</command>\n\t\t\t\t\t\t<itemizedlist>\n",
function_argerror => "\t\t\t\t\t\t\t<listitem><para>%s</para></listitem>\n",
function_argerror_footer => "\t\t\t\t\t\t</itemizedlist>\n\t\t\t\t\t</section> <!-- function_argerror_footer: %s -->\n",
function_returns_header => "\t\t\t\t<section id='lua_fn_ret_%s'><title>Returns</title>\n",
function_returns_footer => "\t\t\t\t</section> <!-- function_returns_footer: %s -->\n",
function_argerror_footer => "\t\t\t\t\t\t</itemizedlist> <!-- function_argerror_footer: %s -->\n",
function_returns_header => "\t\t\t\t<command>Returns</command>\n",
# function_returns_footer => "\t\t\t\t</section> <!-- function_returns_footer: %s -->\n",
function_returns => "\t\t\t\t\t<para>%s</para>\n",
function_errors_header => "\t\t\t\t<section id='lua_fn_err_%s'>\n\t\t\t\t\t<title>Errors</title>\n\t\t\t\t\t<itemizedlist>\n",
function_errors_header => "\t\t\t\t<command>Errors</command><itemizedlist>\n",
function_errors => "\t\t\t\t\t\t<listitem><para>%s</para></listitem>\n",
function_errors_footer => "\t\t\t\t\t</itemizedlist>\n\t\t\t\t</section> <!-- function_error_footer: %s -->\n",
function_errors_footer => "\t\t\t\t\t</itemizedlist> <!-- function_error_footer: %s -->\n",
non_method_functions_header => "\t\t<section id='non_method_functions_%s'><title>Non Method Functions</title>\n",
non_method_functions_footer => "\t\t</section> <!-- Non method -->\n",
};
@ -209,15 +211,12 @@ sub {
deb ">cm=$1=$2=$3=$4=$5=$6=$7=\n";
my $name = $metamethods{$2};
my ($c,$d) = ($1,$5);
my $sname = $2;
$name =~ s/__/$c/g;
$function = {
returns => [],
arglist => [],
args => {},
name => $name,
section_name => $sname,
descr => gorolla($d),
name => "$1:$2",
descr => gorolla($5),
type => 'metamethod'
};
push @{${$class}{metamethods}}, $function;
@ -332,33 +331,27 @@ while ( $file = shift) {
printf D ${$template_ref}{class_desc} , ${$cl}{descr} if ${$cl}{descr};
if ( $#{${$cl}{constructors}} >= 0) {
printf D ${$template_ref}{class_constructors_header}, $cname, $cname;
# printf D ${$template_ref}{class_constructors_header}, $cname, $cname;
for my $c (@{${$cl}{constructors}}) {
function_descr($c);
}
printf D ${$template_ref}{class_constructors_footer}, $cname, $cname;
# printf D ${$template_ref}{class_constructors_footer}, $cname, $cname;
}
if ( $#{${$cl}{methods}} >= 0) {
printf D ${$template_ref}{class_methods_header}, $cname, $cname;
# printf D ${$template_ref}{class_methods_header}, $cname, $cname;
for my $m (@{${$cl}{methods}}) {
function_descr($m);
}
printf D ${$template_ref}{class_methods_footer}, $cname, $cname;
}
if ( $#{${$cl}{metamethods}} >= 0) {
printf D ${$template_ref}{class_metamethods_header}, $cname, $cname;
for my $m (@{${$cl}{metamethods}}) {
function_descr($m,${$m}{name});
function_descr($m);
}
printf D ${$template_ref}{class_metamethods_footer}, $cname, $cname;
# printf D ${$template_ref}{class_methods_footer}, $cname, $cname;
}
if ( $#{${$cl}{attributes}} >= 0) {
@ -409,7 +402,7 @@ close B;
my $ents = '';
my $txt = '';
for my $module_name (keys %modules) {
for my $module_name (sort keys %modules) {
$ents .= <<"_ENT";
<!ENTITY $module_name SYSTEM "$modules{$module_name}">
_ENT
@ -446,6 +439,8 @@ sub function_descr {
}
printf D ${$template_ref}{function_descr}, ${$f}{descr} if ${$f}{descr};
print D ${$template_ref}{function_args_header} if $#{${$f}{arglist}} >= 0;
for my $argname (@{${$f}{arglist}}) {
my $arg = ${${$f}{args}}{$argname};
@ -464,6 +459,8 @@ sub function_descr {
}
print D ${$template_ref}{function_args_footer} if $#{${$f}{arglist}} >= 0;
if ( $#{${$f}{returns}} >= 0) {
printf D ${$template_ref}{function_returns_header}, ${$f}{name};
printf D ${$template_ref}{function_returns}, $_ for @{${$f}{returns}};

View File

@ -25,8 +25,8 @@
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- If lua is to be completely disabled uncomment the following line.
-- disable_lua = true; do return end;
-- Lua is disabled by default, comment out the following line to enable Lua support.
disable_lua = true; do return end;
-- If set and we are running with special privileges this setting
@ -48,7 +48,7 @@ if running_superuser then
file = disabled_lib
end
-- to avoid output to stdout which can caause problems lua's print ()
-- to avoid output to stdout which can cause problems lua's print ()
-- has been suppresed so that it yields an error.
-- have print() call info() instead.
print = info

View File

@ -26,7 +26,7 @@
#include "wslua.h"
/* WSLUA_MODULE Gui Gui Support*/
/* WSLUA_MODULE Gui GUI support */
static const funnel_ops_t* ops = NULL;

View File

@ -62,7 +62,9 @@ void* push_Pinfo(lua_State* L, Pinfo pinfo) {
WSLUA_CLASS_DEFINE(Address,NOP,NOP); /* Represents an address */
WSLUA_CONSTRUCTOR Address_ip(lua_State* L) { /* Creates an Address Object representing an IP address. */
WSLUA_CONSTRUCTOR Address_ip(lua_State* L) {
/* Creates an Address Object representing an IP address. */
#define WSLUA_ARG_Address_ip_HOSTNAME 1 /* The address or name of the IP host. */
Address addr = g_malloc(sizeof(address));
guint32* ip_addr = g_malloc(sizeof(guint32));

View File

@ -137,7 +137,7 @@ WSLUA_CLASS_DEFINE(Prefs,NOP,NOP); /* The table of preferences of a protocol */
WSLUA_METAMETHOD Prefs__newindex(lua_State* L) {
/* creates a new preference */
#define WSLUA_ARG_Prefs__newindex_NAME 2 /* The abbreviation of this preference */
#define WSLUA_ARG_Prefs__newindex_PREF 3 /* A valid still unassigned Pref object */
#define WSLUA_ARG_Prefs__newindex_PREF 3 /* A valid but still unassigned Pref object */
Pref prefs = checkPrefs(L,1);
const gchar* name = luaL_checkstring(L,WSLUA_ARG_Prefs__newindex_NAME);

View File

@ -51,8 +51,9 @@ void clear_outstanding_trees(void) {
}
WSLUA_CLASS_DEFINE(TreeItem,NOP,NOP);
/* TreeItems represent information in the packet-details pane.
A root TreeItem is passed to dissectors as first argument. */
/* ProtoTree class */
static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) {
TvbRange tvbr;
Proto proto;
@ -183,10 +184,28 @@ static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) {
}
WSLUA_METHOD TreeItem_add(lua_State *L) { return TreeItem_add_item_any(L,FALSE); }
WSLUA_METHOD TreeItem_add_le(lua_State *L) { return TreeItem_add_item_any(L,TRUE); }
WSLUA_METHOD TreeItem_add(lua_State *L) {
/*
Adds an child item to a given item, returning the child.
tree_item:add([proto_field | proto], [tvbrange], [label], ...)
if the proto_field represents a numeric value (int, uint or float) is to be treated as a Big Endian (network order) Value.
*/
WSLUA_RETURN(TreeItem_add_item_any(L,FALSE)); /* The child item */
}
WSLUA_METHOD TreeItem_add_le(lua_State *L) {
/*
Adds (and returns) an child item to a given item, returning the child.
tree_item:add([proto_field | proto], [tvbrange], [label], ...)
if the proto_field represents a numeric value (int, uint or float) is to be treated as a Little Endian Value.
*/
WSLUA_RETURN(TreeItem_add_item_any(L,TRUE)); /* The child item */
}
WSLUA_METHOD TreeItem_set_text(lua_State *L) {
/* sets the text of the label */
#define WSLUA_ARG_TreeItem_set_text_TEXT 2 /* The text to be used. */
TreeItem ti = checkTreeItem(L,1);
if (ti) {
@ -198,6 +217,8 @@ WSLUA_METHOD TreeItem_set_text(lua_State *L) {
}
WSLUA_METHOD TreeItem_append_text(lua_State *L) {
/* appends text to the label */
#define WSLUA_ARG_TreeItem_append_text_TEXT 2 /* The text to be appended. */
TreeItem ti = checkTreeItem(L,1);
const gchar* s;
@ -208,22 +229,13 @@ WSLUA_METHOD TreeItem_append_text(lua_State *L) {
return 0;
}
WSLUA_METHOD TreeItem_set_len(lua_State *L) {
TreeItem ti = checkTreeItem(L,1);
int len;
if (ti) {
len = luaL_checkint(L,2);
proto_item_set_len(ti->item,len);
}
return 0;
}
WSLUA_METHOD TreeItem_set_expert_flags(lua_State *L) {
/* Sets the expert flags of the item. */
#define WSLUA_OPTARG_TreeItem_set_expert_flags_GROUP 2 /* One of PI_CHECKSUM, PI_SEQUENCE, PI_RESPONSE_CODE, PI_REQUEST_CODE, PI_UNDECODED, PI_REASSEMBLE, PI_MALFORMED or PI_DEBUG */
#define WSLUA_OPTARG_TreeItem_set_expert_flags_SEVERITY 3 /* One of PI_CHAT, PI_NOTE, PI_WARN, PI_ERROR */
TreeItem ti = checkTreeItem(L,1);
int group = luaL_checkint(L,2);
int severity = luaL_checkint(L,3);
int group = luaL_optint(L,2,PI_DEBUG);
int severity = luaL_optint(L,3,PI_CHAT);
if ( ti && ti->item ) {
proto_item_set_expert_flags(ti->item,group,severity);
@ -233,9 +245,13 @@ WSLUA_METHOD TreeItem_set_expert_flags(lua_State *L) {
}
WSLUA_METHOD TreeItem_add_expert_info(lua_State *L) {
/* Sets the expert flags of the item and adds expert info to the packet. */
#define WSLUA_OPTARG_TreeItem_add_expert_info_GROUP 2 /* One of PI_CHECKSUM, PI_SEQUENCE, PI_RESPONSE_CODE, PI_REQUEST_CODE, PI_UNDECODED, PI_REASSEMBLE, PI_MALFORMED or PI_DEBUG */
#define WSLUA_OPTARG_TreeItem_add_expert_info_SEVERITY 3 /* One of PI_CHAT, PI_NOTE, PI_WARN, PI_ERROR */
#define WSLUA_OPTARG_TreeItem_add_expert_info_TEXT 3 /* the text for the expert info */
TreeItem ti = checkTreeItem(L,1);
int group = luaL_checkint(L,2);
int severity = luaL_checkint(L,3);
int group = luaL_optint(L,2,PI_DEBUG);
int severity = luaL_optint(L,3,PI_CHAT);
const gchar* str = luaL_optstring(L,4,"Expert Info");
if ( ti && ti->item ) {
@ -246,6 +262,7 @@ WSLUA_METHOD TreeItem_add_expert_info(lua_State *L) {
}
WSLUA_METHOD TreeItem_set_generated(lua_State *L) {
/* marks the TreeItem as a generated field (with data infered but not contained in the packet). */
TreeItem ti = checkTreeItem(L,1);
if (ti) {
PROTO_ITEM_SET_GENERATED(ti->item);
@ -255,6 +272,7 @@ WSLUA_METHOD TreeItem_set_generated(lua_State *L) {
WSLUA_METHOD TreeItem_set_hidden(lua_State *L) {
/* should not be used */
TreeItem ti = checkTreeItem(L,1);
if (ti) {
PROTO_ITEM_SET_HIDDEN(ti->item);
@ -267,7 +285,6 @@ static const luaL_reg TreeItem_methods[] = {
{"add_le", TreeItem_add_le},
{"set_text", TreeItem_set_text},
{"append_text", TreeItem_append_text},
{"set_len", TreeItem_set_len},
{"set_expert_flags", TreeItem_set_expert_flags},
{"add_expert_info", TreeItem_add_expert_info},
{"set_generated", TreeItem_set_generated},

View File

@ -87,6 +87,7 @@ static int ByteArray_gc(lua_State* L) {
}
WSLUA_METAMETHOD ByteArray__concat(lua_State* L) {
/* concatenate two ByteArrays */
#define WSLUA_ARG_ByteArray__cat_FIRST 1
#define WSLUA_ARG_ByteArray__cat_SECOND 1
@ -103,7 +104,8 @@ WSLUA_METAMETHOD ByteArray__concat(lua_State* L) {
}
WSLUA_METHOD ByteArray_prepend(lua_State* L) {
#define WSLUA_ARG_ByteArray_prepend_BYTES 1
/* prepend a ByteArray to this ByteArray */
#define WSLUA_ARG_ByteArray_prepend_PREPENDED 2
ByteArray ba = checkByteArray(L,1);
ByteArray ba2 = checkByteArray(L,2);
@ -117,6 +119,8 @@ WSLUA_METHOD ByteArray_prepend(lua_State* L) {
}
WSLUA_METHOD ByteArray_append(lua_State* L) {
/* append a ByteArray to this ByteArray */
#define WSLUA_ARG_ByteArray_append_APPENDED 2
ByteArray ba = checkByteArray(L,1);
ByteArray ba2 = checkByteArray(L,2);
@ -130,6 +134,9 @@ WSLUA_METHOD ByteArray_append(lua_State* L) {
}
WSLUA_METHOD ByteArray_set_size(lua_State* L) {
/* Sets the size of a ByteArray, either truncating it or filling it with zeros. */
#define WSLUA_ARG_ByteArray_set_size_SIZE 2
ByteArray ba = checkByteArray(L,1);
int siz = luaL_checkint(L,2);
@ -140,6 +147,9 @@ WSLUA_METHOD ByteArray_set_size(lua_State* L) {
}
WSLUA_METHOD ByteArray_set_index(lua_State* L) {
/* sets the value of an index of a ByteArray. */
#define WSLUA_ARG_ByteArray_set_index_INDEX 2 /* the position of the byte to be set */
#define WSLUA_ARG_ByteArray_set_index_VALUE 3 /* the char value to set [0-255] */
ByteArray ba = checkByteArray(L,1);
int idx = luaL_checkint(L,2);
int v = luaL_checkint(L,3);
@ -168,6 +178,8 @@ WSLUA_METHOD ByteArray_set_index(lua_State* L) {
WSLUA_METHOD ByteArray_get_index(lua_State* L) {
/* get the value of a byte in a ByteArray */
#define WSLUA_ARG_ByteArray_set_index_INDEX 2 /* the position of the byte to be set */
ByteArray ba = checkByteArray(L,1);
int idx = luaL_checkint(L,2);
@ -184,20 +196,24 @@ WSLUA_METHOD ByteArray_get_index(lua_State* L) {
}
lua_pushnumber(L,ba->data[idx]);
return 1;
WSLUA_RETURN(1); /* The value [0-255] of the byte. */
}
WSLUA_METHOD ByteArray_len(lua_State* L) {
/* obtain the length of a ByteArray */
ByteArray ba = checkByteArray(L,1);
if (!ba) return 0;
lua_pushnumber(L,(lua_Number)ba->len);
return 1;
WSLUA_RETURN(1); /* The length of the ByteArray. */
}
WSLUA_METHOD ByteArray_subset(lua_State* L) {
/* obtain a segment of a ByteArray */
#define WSLUA_ARG_ByteArray_set_index_OFFSET 2 /* the position of the first byte */
#define WSLUA_ARG_ByteArray_set_index_LENGTH 2 /* the lenght of the segment */
ByteArray ba = checkByteArray(L,1);
int offset = luaL_checkint(L,2);
int len = luaL_checkint(L,3);
@ -215,10 +231,11 @@ WSLUA_METHOD ByteArray_subset(lua_State* L) {
pushByteArray(L,sub);
return 1;
WSLUA_RETURN(1); /* a ByteArray contaning the requested segment. */
}
static int ByteArray_tostring(lua_State* L) {
/* obtain a string containing the bytes in a ByteArray so that it can be used in display filters (e.g. "01:23:45:67:89:AB") */
static const gchar* byte_to_str[] = {
"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F",
"10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F",
@ -252,7 +269,7 @@ static int ByteArray_tostring(lua_State* L) {
lua_pushstring(L,s->str);
g_string_free(s,TRUE);
return 1;
WSLUA_RETURN(1); /* a string contaning a representaion of the ByteArray. */
}
static int Tvb_new_real (lua_State *L);
@ -304,6 +321,11 @@ int ByteArray_register(lua_State* L) {
*/
WSLUA_CLASS_DEFINE(Tvb,FAIL_ON_NULL("expired tvb"),NOP);
/* a Tvb represents the packet's buffer. It is passed as an argument to listeners and dissectors,
and can be used to extract information (via TvbRange) from the packet's data. Beware that Tvbs are usable only by the current
listener or dissector call and are destroyed as soon as the listener/dissector returns, so references
to them are unusable once the function has returned.
To create a tvbrange the tvb must be called with offset and length as optional arguments ( the offset defaults to 0 and the length to tvb:len() )*/
static GPtrArray* outstanding_stuff = NULL;
@ -327,9 +349,11 @@ void* push_Tvb(lua_State* L, Tvb tvb) {
/*
* Tvb_new_real(bytearray,name)
* Creates a new Tvb from a bytearray (adds it to the frame too)
*/
static int Tvb_new_real (lua_State *L) {
WSLUA_CONSTRUCTOR Tvb_new_real (lua_State *L) {
/* Creates a new Tvb from a bytearray (it gets added to the current frame too) */
#define WSLUA_ARG_Tvb_new_real_BYTEARRAY 1 /* The data source for this Tvb. */
#define WSLUA_ARG_Tvb_new_real_NAME 2 /* The name to be given to the new data-source. */
ByteArray ba = checkByteArray(L,1);
const gchar* name = luaL_optstring(L,2,"Unnamed") ;
guint8* data;
@ -349,14 +373,13 @@ static int Tvb_new_real (lua_State *L) {
add_new_data_source(lua_pinfo, tvb, name);
PUSH_TVB(L,tvb);
return 1;
WSLUA_RETURN(1); /* the created Tvb. */
}
/*
* creates a subtvb from a tvbrange
*
*/
static int Tvb_new_subset (lua_State *L) {
WSLUA_CONSTRUCTOR Tvb_new_subset (lua_State *L) {
/* creates a (sub)Tvb from using a TvbRange */
#define WSLUA_ARG_Tvb_new_subset_RANGE 2 /* the TvbRange from which to create the new Tvb. */
TvbRange tvbr = checkTvbRange(L,1);
if (! tvbr) return 0;
@ -370,10 +393,8 @@ static int Tvb_new_subset (lua_State *L) {
}
}
/*
* convert the bytes to string, mainly for debugging purposes (mind the ...)
*/
static int Tvb_tostring(lua_State* L) {
WSLUA_METAMETHOD Tvb__tostring(lua_State* L) {
/* convert the bytes of a Tvb into a string, to be used for debugging purposes as '...' will be appended in case the string is too long. */
Tvb tvb = checkTvb(L,1);
int len;
gchar* str;
@ -383,32 +404,28 @@ static int Tvb_tostring(lua_State* L) {
len = tvb_length(tvb);
str = ep_strdup_printf("TVB(%i) : %s",len,tvb_bytes_to_str(tvb,0,len));
lua_pushstring(L,str);
return 1;
WSLUA_RETURN(1); /* the string. */
}
/*
* returns the length of a TVB
*/
static int Tvb_len(lua_State* L) {
WSLUA_METHOD Tvb_len(lua_State* L) {
/* obtain the length of a TVB */
Tvb tvb = checkTvb(L,1);
if (!tvb) return 0;
lua_pushnumber(L,tvb_length(tvb));
return 1;
WSLUA_RETURN(1); /* the lenght of the Tvb. */
}
/*
* returns the raw offset of a sub TVB
*/
static int Tvb_offset(lua_State* L) {
WSLUA_METHOD Tvb_offset(lua_State* L) {
/* returns the raw offset (from the beginning of the source Tvb) of a sub Tvb. */
Tvb tvb = checkTvb(L,1);
if (!tvb) return 0;
lua_pushnumber(L,TVB_RAW_OFFSET(tvb));
return 1;
WSLUA_RETURN(1); /* the raw offset of the Tvb. */
}
@ -422,7 +439,7 @@ static int Tvb_range(lua_State* L);
static const luaL_reg Tvb_meta[] = {
{"__call", Tvb_range},
{"__tostring", Tvb_tostring},
{"__tostring", Tvb__tostring},
{0, 0}
};
@ -431,9 +448,10 @@ int Tvb_register(lua_State* L) {
return 1;
}
WSLUA_CLASS_DEFINE(TvbRange,FAIL_ON_NULL("expired tvbrange"),NOP);
/*
* TVB RAnge helper class
*
* a TvbRange represents an usable range of a Tvb and is used to extract data from the Tvb that generated it
* TvbRanges are created by calling a tvb (e.g. tvb(offset,lenght)). If the TvbRange span is outside the Tvb's range the creation will cause a runtime error.
*/
TvbRange new_TvbRange(lua_State* L, tvbuff_t* tvb, int offset, int len) {
@ -458,10 +476,11 @@ TvbRange new_TvbRange(lua_State* L, tvbuff_t* tvb, int offset, int len) {
return tvbr;
}
/*
* creates a tvbr given the triplet (tvb,offset,len)
*/
static int Tvb_range(lua_State* L) {
WSLUA_METHOD Tvb_range(lua_State* L) {
/* creates a tvbr from this Tvb. This is used also as the Tvb:__call() metamethod. */
#define WSLUA_OPTARG_Tvb_range_OFFSET 2 /* The offset (in octets) from the begining of the Tvb. Defaults to 0. */
#define WSLUA_OPTARG_Tvb_range_LENGTH 2 /* The length (in octets) of the range. Defaults to until the end of the Tvb. */
Tvb tvb = checkTvb(L,1);
int offset = luaL_optint(L,2,0);
int len = luaL_optint(L,3,-1);
@ -471,19 +490,21 @@ static int Tvb_range(lua_State* L) {
if ((tvbr = new_TvbRange(L,tvb,offset,len))) {
PUSH_TVBRANGE(L,tvbr);
return 1;
WSLUA_RETURN(1); /* the TvbRange */
}
return 0;
}
WSLUA_CLASS_DEFINE(TvbRange,FAIL_ON_NULL("expired tvbrange"),NOP);
/*
* read access to tvbr's data
*/
static int TvbRange_get_index(lua_State* L) {
/* WSLUA_ATTRIBUTE TvbRange_tvb RO The Tvb from which this TvbRange was generated */
/* WSLUA_ATTRIBUTE TvbRange_len RW The lenght (in octets) of this TvbRange */
/* WSLUA_ATTRIBUTE TvbRange_offset RW The offset (in octets) of this TvbRange */
TvbRange tvbr = checkTvbRange(L,1);
const gchar* index = luaL_checkstring(L,2);
@ -547,7 +568,9 @@ static int TvbRange_set_index(lua_State* L) {
/*
* get a Blefuscuoan unsigned integer from a tvb
*/
static int TvbRange_get_uint(lua_State* L) {
WSLUA_METHOD TvbRange_get_uint(lua_State* L) {
/* get a Big Endian (network order) unsigned integer from a TvbRange. The range must be 1, 2, 3 or 4 octets long.
There's no support yet for 64 bit integers*/
TvbRange tvbr = checkTvbRange(L,1);
if (!tvbr) return 0;
@ -563,7 +586,7 @@ static int TvbRange_get_uint(lua_State* L) {
return 1;
case 4:
lua_pushnumber(L,tvb_get_ntohl(tvbr->tvb,tvbr->offset));
return 1;
WSLUA_RETURN(1); /* the unsigned integer value */
/*
* XXX:
* lua uses double so we have 52 bits to play with
@ -580,7 +603,9 @@ static int TvbRange_get_uint(lua_State* L) {
/*
* get a Lilliputian unsigned integer from a tvb
*/
static int TvbRange_get_le_uint(lua_State* L) {
WSLUA_METHOD TvbRange_get_le_uint(lua_State* L) {
/* get a Little Endian unsigned integer from a TvbRange. The range must be 1, 2, 3 or 4 octets long.
There's no support yet for 64 bit integers*/
TvbRange tvbr = checkTvbRange(L,1);
if (!tvbr) return 0;
@ -597,7 +622,7 @@ static int TvbRange_get_le_uint(lua_State* L) {
return 1;
case 4:
lua_pushnumber(L,tvb_get_letohl(tvbr->tvb,tvbr->offset));
return 1;
WSLUA_RETURN(1); /* the unsigned integer value */
default:
luaL_error(L,"TvbRange:get_le_uint() does not handle %d byte integers",tvbr->len);
return 0;
@ -607,7 +632,8 @@ static int TvbRange_get_le_uint(lua_State* L) {
/*
* get a Blefuscuoan float
*/
static int TvbRange_get_float(lua_State* L) {
WSLUA_METHOD TvbRange_get_float(lua_State* L) {
/* get a Big Endian (network order) floating point number from a TvbRange. The range must be 4 or 8 octets long. */
TvbRange tvbr = checkTvbRange(L,1);
if (!tvbr) return 0;
@ -617,7 +643,7 @@ static int TvbRange_get_float(lua_State* L) {
return 1;
case 8:
lua_pushnumber(L,tvb_get_ntohieee_double(tvbr->tvb,tvbr->offset));
return 1;
WSLUA_RETURN(1); /* the flaoting point value */
default:
luaL_error(L,"TvbRange:get_float() does not handle %d byte floating numbers",tvbr->len);
return 0;
@ -627,7 +653,8 @@ static int TvbRange_get_float(lua_State* L) {
/*
* get a Lilliputian float
*/
static int TvbRange_get_le_float(lua_State* L) {
WSLUA_METHOD TvbRange_get_le_float(lua_State* L) {
/* get a Little Endian floating point number from a TvbRange. The range must be 4 or 8 octets long. */
TvbRange tvbr = checkTvbRange(L,1);
if (!tvbr) return 0;
@ -637,20 +664,25 @@ static int TvbRange_get_le_float(lua_State* L) {
return 1;
case 8:
lua_pushnumber(L,tvb_get_letohieee_double(tvbr->tvb,tvbr->offset));
return 1;
WSLUA_RETURN(1); /* the flaoting point value */
default:
luaL_error(L,"TvbRange:get_float() does not handle %d byte floating numbers",tvbr->len);
return 0;
}
}
static int TvbRange_get_ipv4(lua_State* L) {
WSLUA_METHOD TvbRange_get_ipv4(lua_State* L) {
/* get an IPv4 Address from a TvbRange. */
TvbRange tvbr = checkTvbRange(L,1);
Address addr;
guint32* ip_addr;
if ( !tvbr ) return 0;
if (tvbr->len != 4)
WSLUA_ERROR(TvbRange_get_ipv4,"The range must be 4 octets long");
addr = g_malloc(sizeof(address));
ip_addr = g_malloc(sizeof(guint32));
@ -659,10 +691,11 @@ static int TvbRange_get_ipv4(lua_State* L) {
SET_ADDRESS(addr, AT_IPv4, 4, ip_addr);
pushAddress(L,addr);
return 1;
WSLUA_RETURN(1); /* the IPv4 Address */
}
static int TvbRange_get_ether(lua_State* L) {
WSLUA_METHOD TvbRange_get_ether(lua_State* L) {
/* get an Ethernet Address from a TvbRange. */
TvbRange tvbr = checkTvbRange(L,1);
Address addr;
guint8* buff;
@ -671,26 +704,31 @@ static int TvbRange_get_ether(lua_State* L) {
addr = g_malloc(sizeof(address));
if (tvbr->len != 6)
WSLUA_ERROR(TvbRange_get_ether,"The range must be 6 bytes long");
buff = tvb_memdup(tvbr->tvb,tvbr->offset,tvbr->len);
SET_ADDRESS(addr, AT_ETHER, 6, buff);
pushAddress(L,addr);
return 1;
WSLUA_RETURN(1); /* the Ethernet Address */
}
static int TvbRange_get_string(lua_State* L) {
WSLUA_METHOD TvbRange_get_string(lua_State* L) {
/* obtain a string from a TvbRange */
TvbRange tvbr = checkTvbRange(L,1);
if ( !tvbr ) return 0;
lua_pushstring(L, (gchar*)tvb_get_ephemeral_string(tvbr->tvb,tvbr->offset,tvbr->len) );
return 1;
WSLUA_RETURN(1); /* the string */
}
static int TvbRange_get_bytes(lua_State* L) {
WSLUA_METHOD TvbRange_get_bytes(lua_State* L) {
/* obtain a ByteArray */
TvbRange tvbr = checkTvbRange(L,1);
GByteArray* ba;
@ -701,10 +739,13 @@ static int TvbRange_get_bytes(lua_State* L) {
pushByteArray(L,ba);
return 1;
WSLUA_RETURN(1); /* the ByteArray */
}
static int TvbRange_tostring(lua_State* L) {
WSLUA_METAMETHOD TvbRange__tostring(lua_State* L) {
/* converts the TvbRange into a string. As the string gets truncated
you should use this only for debugging purposes
or if what you want is to have a truncated string in the format 67:89:AB:... */
TvbRange tvbr = checkTvbRange(L,1);
if (!tvbr) return 0;
@ -729,7 +770,7 @@ static const luaL_reg TvbRange_methods[] = {
static const luaL_reg TvbRange_meta[] = {
{"__index", TvbRange_get_index},
{"__newindex", TvbRange_set_index},
{"__tostring", TvbRange_tostring},
{"__tostring", TvbRange__tostring},
{0, 0}
};

View File

@ -24,7 +24,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* WSLUA_MODULE Util various useful functions */
/* WSLUA_MODULE Utility Utility Functions */
#include "wslua.h"
#include <math.h>
@ -69,7 +69,7 @@ WSLUA_FUNCTION wslua_format_date(lua_State* LS) { /* Formats an absolute timesta
WSLUA_RETURN(1); /* a string with the formated date */
}
WSLUA_FUNCTION wslua_format_time(lua_State* LS) { /* Formats an absolute timestamp in a human readable form */
WSLUA_FUNCTION wslua_format_time(lua_State* LS) { /* Formats a relative timestamp in a human readable form */
#define WSLUA_ARG_format_time_TIMESTAMP 1 /* a timestamp value to convert */
lua_Number time = luaL_checknumber(LS,WSLUA_ARG_format_time_TIMESTAMP);
nstime_t then;
@ -162,6 +162,8 @@ const char* get_actual_filename(const char* fname) {
}
WSLUA_FUNCTION wslua_loadfile(lua_State* L) {
/* Lua's loadfile() has been modified so that if a file does not exist
in the current directory it will look for it in wireshark's user and system directories */
#define WSLUA_ARG_loadfile_FILENAME 1
const char *given_fname = luaL_checkstring(L, WSLUA_ARG_loadfile_FILENAME);
const char* filename;
@ -180,6 +182,8 @@ WSLUA_FUNCTION wslua_loadfile(lua_State* L) {
}
WSLUA_FUNCTION wslua_dofile(lua_State* L) {
/* Lua's dofile() has been modified so that if a file does not exist
in the current directory it will look for it in wireshark's user and system directories */
#define WSLUA_ARG_dofile_FILENAME 1
const char *given_fname = luaL_checkstring(L, WSLUA_ARG_dofile_FILENAME);
const char* filename;
@ -199,29 +203,30 @@ WSLUA_FUNCTION wslua_dofile(lua_State* L) {
WSLUA_FUNCTION wslua_persconffile_path(lua_State* L) {
#define WSLUA_OPTARG_persconffile_path_FILENAME 1
#define WSLUA_OPTARG_persconffile_path_FILENAME 1 /* a filename */
const char *fname = luaL_optstring(L, WSLUA_OPTARG_persconffile_path_FILENAME,"");
const char* filename = get_persconffile_path(fname,FALSE);
lua_pushstring(L,filename);
return 1;
WSLUA_RETURN(1); /* the full pathname for a file in the personal configuration directory */
}
WSLUA_FUNCTION wslua_datafile_path(lua_State* L) {
#define WSLUA_OPTARG_datafile_path_FILENAME 1
#define WSLUA_OPTARG_datafile_path_FILENAME 1 /* a filename */
const char *fname = luaL_optstring(L, WSLUA_OPTARG_datafile_path_FILENAME,"");
const char* filename = get_datafile_path(fname);
lua_pushstring(L,filename);
return 1;
WSLUA_RETURN(1); /* the full pathname for a file in wireshark's configuration directory */
}
WSLUA_CLASS_DEFINE(Dir,NOP,NOP); /* A Directory */
WSLUA_CONSTRUCTOR wslua_Dir_open(lua_State* L) {
#define WSLUA_ARG_Dir_open_PATHNAME 1
#define WSLUA_OPTARG_Dir_open_EXTENSION 2
WSLUA_CONSTRUCTOR Dir_open(lua_State* L) {
/* usage: for filename in Dir.open(path) do ... end */
#define WSLUA_ARG_Dir_open_PATHNAME 1 /* the pathname of the directory */
#define WSLUA_OPTARG_Dir_open_EXTENSION 2 /* if given, only file with this extension will be returned */
const char* dirname = luaL_checkstring(L,WSLUA_ARG_Dir_open_PATHNAME);
const char* extension = luaL_optstring(L,WSLUA_OPTARG_Dir_open_EXTENSION,NULL);
@ -249,18 +254,19 @@ WSLUA_CONSTRUCTOR wslua_Dir_open(lua_State* L) {
}
pushDir(L,dir);
return 1;
WSLUA_RETURN(1); /* the Dir object */
}
WSLUA_METAMETHOD wslua_Dir__call(lua_State* L) {
#define WSLUA_ARG_Dir__call_DIR 1
WSLUA_METAMETHOD Dir__call(lua_State* L) {
/* at every invocation will return one file (nil when done) */
Dir dir = checkDir(L,1);
const FILE_T* file;
const gchar* filename;
const char* ext;
if (!dir)
WSLUA_ARG_ERROR(Dir__call,DIR,"must be a Dir");
luaL_argerror(L,1,"must be a Dir");
if (!dir->dir) {
return 0;
@ -295,8 +301,8 @@ WSLUA_METAMETHOD wslua_Dir__call(lua_State* L) {
return 0;
}
WSLUA_METHOD wslua_Dir_close(lua_State* L) {
#define WSLUA_ARG_Dir_close_DIR 1
WSLUA_METHOD Dir_close(lua_State* L) {
/* closes the directory */
Dir dir = checkDir(L,1);
if (dir->dir) {
@ -308,7 +314,6 @@ WSLUA_METHOD wslua_Dir_close(lua_State* L) {
}
WSLUA_METAMETHOD wslua_Dir__gc(lua_State* L) {
#define WSLUA_ARG_Dir__gc_DIR 1
Dir dir = checkDir(L,1);
if (dir->dir) {
@ -327,13 +332,13 @@ WSLUA_METAMETHOD wslua_Dir__gc(lua_State* L) {
}
static const luaL_reg Dir_methods[] = {
{"open", wslua_Dir_open},
{"close", wslua_Dir_close},
{"open", Dir_open},
{"close", Dir_close},
{0, 0}
};
static const luaL_reg Dir_meta[] = {
{"__call", wslua_Dir__call},
{"__call", Dir__call},
{"__gc", wslua_Dir__gc},
{0, 0}
};