mirror of
https://github.com/samba-team/samba.git
synced 2025-11-22 16:23:49 +03:00
r9128: More ethereal parser generator updates. String handling is still broken as
well as handling more then two element levels.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
acd34c1cac
commit
952399aa68
@@ -16,16 +16,28 @@ use Parse::Pidl::Util qw(has_property);
|
||||
|
||||
sub handle_union_tag_size($$)
|
||||
{
|
||||
my ($union,$size) = @_;
|
||||
|
||||
#FIXME
|
||||
}
|
||||
|
||||
use vars qw(%hf_renames %types %header_fields);
|
||||
|
||||
sub handle_type($$$$$$$)
|
||||
{
|
||||
my ($name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_;
|
||||
#FIXME
|
||||
|
||||
$types{$name} = {
|
||||
NAME => $name,
|
||||
DISSECTOR_NAME => $dissectorname,
|
||||
FT_TYPE => $ft_type,
|
||||
BASE_TYPE => $base_type,
|
||||
MASK => $mask,
|
||||
VALSSTRING => $valsstring,
|
||||
ALIGNMENT => $alignment
|
||||
};
|
||||
}
|
||||
|
||||
use vars qw(%hf_renames);
|
||||
|
||||
sub handle_hf_rename($$)
|
||||
{
|
||||
@@ -45,12 +57,23 @@ sub handle_param_value($$)
|
||||
|
||||
sub handle_hf_field($$$$$$$$)
|
||||
{
|
||||
my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blub) = @_;
|
||||
my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_;
|
||||
|
||||
$header_fields{$hf} = {
|
||||
HF => $hf,
|
||||
TITLE => $title,
|
||||
FILTER => $filter,
|
||||
FT_TYPE => $ft_type,
|
||||
BASE_TYPE => $base_type,
|
||||
VALSSTRING => $valsstring,
|
||||
MASK => $mask,
|
||||
BLURB => $blurb
|
||||
};
|
||||
}
|
||||
|
||||
sub handle_strip_prefix($)
|
||||
{
|
||||
my $x = shift;
|
||||
#FIXME
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
# Portions based on idl2eth.c by Ronnie Sahlberg
|
||||
# released under the GNU GPL
|
||||
|
||||
# TODO:
|
||||
# - order of functions generated per element level
|
||||
# - strings
|
||||
|
||||
package Parse::Pidl::Ethereal::NDR;
|
||||
|
||||
use strict;
|
||||
@@ -150,7 +154,7 @@ sub Enum($$$)
|
||||
pidl_code "return offset;";
|
||||
pidl_code "}\n";
|
||||
|
||||
register_hf_field($name, $dissectorname, enum_ft($e), "BASE_DEC", "0", "VALS($valsstring)", enum_size($e));
|
||||
register_type($name, $dissectorname, enum_ft($e), "BASE_DEC", "0", "VALS($valsstring)", enum_size($e));
|
||||
}
|
||||
|
||||
sub Bitmap($$$)
|
||||
@@ -194,7 +198,7 @@ sub Bitmap($$$)
|
||||
my $hf_bitname = "hf_$ifname\_$name\_$en";
|
||||
my $filtername = "$ifname\.$name\.$en";
|
||||
|
||||
register_hf_field($hf_bitname, $en, $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$en\_tfs)", $ev, "");
|
||||
register_hf_field($hf_bitname, field2name($en), $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$en\_tfs)", $ev, "");
|
||||
|
||||
pidl_def "static const true_false_string $name\_tfs = {";
|
||||
pidl_def " \"$name is SET\",";
|
||||
@@ -253,7 +257,7 @@ sub Element($$$)
|
||||
|
||||
return if (EmitProhibited($dissectorname));
|
||||
|
||||
my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", $e->{NAME}, "$ifname.$pn.$e->{NAME}", type2ft($e->{TYPE}), "BASE_HEX", "NULL", 0, "");
|
||||
my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", field2name($e->{NAME}), "$ifname.$pn.$e->{NAME}", type2ft($e->{TYPE}), "BASE_HEX", "NULL", 0, "");
|
||||
my $add = "";
|
||||
|
||||
foreach (@{$e->{LEVELS}}) {
|
||||
@@ -290,8 +294,9 @@ sub Function($$$)
|
||||
indent;
|
||||
foreach (@{$fn->{ELEMENTS}}) {
|
||||
if (grep(/in/,@{$_->{DIRECTION}})) {
|
||||
pidl_code "dissectornames{$_->{NAME}};";
|
||||
pidl_code "$dissectornames{$_->{NAME}}";
|
||||
pidl_code "offset=dissect_deferred_pointers(pinfo,tvb,offset,drep);";
|
||||
pidl_code "";
|
||||
}
|
||||
}
|
||||
pidl_code "return offset;";
|
||||
@@ -304,7 +309,7 @@ sub Function($$$)
|
||||
indent;
|
||||
foreach (@{$fn->{ELEMENTS}}) {
|
||||
if (grep(/out/,@{$_->{DIRECTION}})) {
|
||||
pidl_code "$dissectornames{$_->{NAME}};";
|
||||
pidl_code "$dissectornames{$_->{NAME}}";
|
||||
pidl_code "offset=dissect_deferred_pointers(pinfo,tvb,offset,drep);";
|
||||
}
|
||||
|
||||
@@ -478,6 +483,21 @@ sub ProcessInterface($)
|
||||
{
|
||||
my $x = shift;
|
||||
|
||||
my $define = "__PACKET_DCERPC_" . uc($_->{NAME}) . "_H";
|
||||
pidl_hdr "#ifndef $define";
|
||||
pidl_hdr "#define $define";
|
||||
pidl_hdr "";
|
||||
|
||||
if (defined $x->{PROPERTIES}->{depends}) {
|
||||
foreach (split / /, $x->{PROPERTIES}->{depends}) {
|
||||
pidl_hdr "#include \"packet-dcerpc-$_\.h\"\n";
|
||||
}
|
||||
}
|
||||
|
||||
pidl_def "static gint proto_dcerpc_$x->{NAME} = -1;";
|
||||
register_ett("ett_dcerpc_$x->{NAME}");
|
||||
register_hf_field("hf_$x->{NAME}_opnum", "Operation", "$x->{NAME}.opnum", "FT_UINT16", "BASE_DEC", "NULL", 0, "");
|
||||
|
||||
foreach (@{$x->{TYPEDEFS}}) {
|
||||
$dissectors{$_->{NAME}} = "$x->{NAME}_dissect_$_->{NAME}";
|
||||
}
|
||||
@@ -507,10 +527,12 @@ sub ProcessInterface($)
|
||||
|
||||
Interface($x);
|
||||
|
||||
$res{functiontable} = DumpFunctionTable($x);
|
||||
pidl_code "\n".DumpFunctionTable($x);
|
||||
|
||||
RegisterInterface($x);
|
||||
RegisterInterfaceHandoff($x);
|
||||
|
||||
pidl_hdr "#endif /* $define */";
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
@@ -530,7 +552,7 @@ sub Parse($$$)
|
||||
|
||||
pidl_hdr "/* header auto-generated by pidl */";
|
||||
|
||||
$res{headers} = "";
|
||||
$res{headers} = "\n";
|
||||
$res{headers} .= "#ifdef HAVE_CONFIG_H\n";
|
||||
$res{headers} .= "#include \"config.h\"\n";
|
||||
$res{headers} .= "#endif\n\n";
|
||||
@@ -558,8 +580,8 @@ sub Parse($$$)
|
||||
$parser.=$res{def};
|
||||
$parser.=$res{code};
|
||||
|
||||
my $define = "__PACKET_DCERPC_" . uc($_->{NAME}) . "_H";
|
||||
my $header = "#ifndef $define\n#define $define\n\n".$res{hdr} . "\n#endif /* $define */\n";
|
||||
my $header = "/* autogenerated by pidl */\n\n";
|
||||
$header.=$res{hdr};
|
||||
|
||||
return ($parser,$header);
|
||||
}
|
||||
@@ -663,13 +685,13 @@ sub DumpFunctionTable($)
|
||||
my $res = "static dcerpc_sub_dissector $if->{NAME}\_dissectors[] = {\n";
|
||||
|
||||
foreach (@{$if->{FUNCTIONS}}) {
|
||||
$res.= "\t{ $_->{OPNUM}, \"$_->{NAME},\n";
|
||||
$res.= "\t{ $_->{OPNUM}, \"$_->{NAME}\",\n";
|
||||
$res.= "\t $if->{NAME}_dissect_$_->{NAME}_request, $if->{NAME}_dissect_$_->{NAME}_response},\n";
|
||||
}
|
||||
|
||||
$res .= "\t{ 0, NULL, NULL, NULL },\n";
|
||||
$res .= "\t{ 0, NULL, NULL, NULL }\n";
|
||||
|
||||
return "$res\t}\n";
|
||||
return "$res};\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user