svn commit: samba r15651 - in
branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal: .
jelmer at samba.org
jelmer at samba.org
Tue May 16 22:25:15 GMT 2006
Author: jelmer
Date: 2006-05-16 22:25:13 +0000 (Tue, 16 May 2006)
New Revision: 15651
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15651
Log:
Add 'MANUAL' command in Ethereal conformance files. This allows overriding
individual functions for specific element levels without losing the other
functions for an element or the hf/ett fields allocated.
Fixes #3738.
Modified:
branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/Conformance.pm
branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/NDR.pm
Changeset:
Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/Conformance.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/Conformance.pm 2006-05-16 22:21:44 UTC (rev 15650)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/Conformance.pm 2006-05-16 22:25:13 UTC (rev 15651)
@@ -74,6 +74,13 @@
Override the text shown when a bitmap boolean value is enabled or disabled.
+=item I<MANUAL> fn_name
+
+Force pidl to not generate a particular function but allow the user
+to write a function manually. This can be used to remove the function
+for only one level for a particular element rather then all the functions and
+ett/hf variables for a particular element as the NOEMIT command does.
+
=back
=head1 EXAMPLE
@@ -232,9 +239,7 @@
sub handle_noemit($$$)
{
- my $pos = shift;
- my $data = shift;
- my $type = shift;
+ my ($pos,$data,$type) = @_;
if (defined($type)) {
$data->{noemit}->{$type} = 1;
@@ -243,6 +248,13 @@
}
}
+sub handle_manual($$$)
+{
+ my ($pos,$data,$fn) = @_;
+
+ $data->{manual}->{$fn} = 1;
+}
+
sub handle_protocol($$$$$$)
{
my ($pos, $data, $name, $longname, $shortname, $filtername) = @_;
@@ -287,6 +299,7 @@
my %field_handlers = (
TYPE => \&handle_type,
NOEMIT => \&handle_noemit,
+ MANUAL => \&handle_manual,
PARAM_VALUE => \&handle_param_value,
HF_FIELD => \&handle_hf_field,
HF_RENAME => \&handle_hf_rename,
Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/NDR.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/NDR.pm 2006-05-16 22:21:44 UTC (rev 15650)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Ethereal/NDR.pm 2006-05-16 22:25:13 UTC (rev 15651)
@@ -72,9 +72,24 @@
my %res = ();
my $tabs = "";
+my $cur_fn = undef;
+sub pidl_fn_start($)
+{
+ my $fn = shift;
+ $cur_fn = $fn;
+}
+sub pidl_fn_end($)
+{
+ my $fn = shift;
+ die("Inconsistent state: $fn != $cur_fn") if ($fn ne $cur_fn);
+ $cur_fn = undef;
+}
+
sub pidl_code($)
{
my $d = shift;
+ return if (defined($cur_fn) and defined($conformance->{manual}->{$cur_fn}));
+
if ($d) {
$res{code} .= $tabs;
$res{code} .= $d;
@@ -124,7 +139,7 @@
return if (defined($conformance->{noemit}->{StripPrefixes($name)}));
- foreach (@{$e->{ELEMENTS}}) {
+ foreach (@{$e->{ELEMENTS}}) {
if (/([^=]*)=(.*)/) {
pidl_hdr "#define $1 ($2)";
}
@@ -142,6 +157,7 @@
pidl_def "{ 0, NULL }";
pidl_def "};";
+ pidl_fn_start $dissectorname;
pidl_code "int";
pidl_code "$dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint8 *drep, int hf_index, guint32 param _U_)";
pidl_code "{";
@@ -150,6 +166,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end $dissectorname;
my $enum_size = $e->{BASE_TYPE};
$enum_size =~ s/uint//g;
@@ -165,6 +182,7 @@
pidl_hdr "int $dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint8 *drep, int hf_index, guint32 param);";
+ pidl_fn_start $dissectorname;
pidl_code "int";
pidl_code "$dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, guint8 *drep, int hf_index, guint32 param _U_)";
pidl_code "{";
@@ -230,6 +248,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end $dissectorname;
my $size = $e->{BASE_TYPE};
$size =~ s/uint//g;
@@ -376,6 +395,7 @@
foreach (@{$e->{LEVELS}}) {
next if ($_->{TYPE} eq "SWITCH");
pidl_def "static int $dissectorname$add(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint8 *drep);";
+ pidl_fn_start "$dissectorname$add";
pidl_code "static int";
pidl_code "$dissectorname$add(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint8 *drep)";
pidl_code "{";
@@ -387,6 +407,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end "$dissectorname$add";
$add.="_";
last if ($_->{TYPE} eq "ARRAY" and $_->{IS_ZERO_TERMINATED});
}
@@ -408,6 +429,7 @@
$fn_name =~ s/^${ifname}_//;
PrintIdl DumpFunction($fn->{ORIGINAL});
+ pidl_fn_start "$ifname\_dissect\_$fn_name\_response";
pidl_code "static int";
pidl_code "$ifname\_dissect\_${fn_name}_response(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)";
pidl_code "{";
@@ -441,7 +463,9 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end "$ifname\_dissect\_$fn_name\_response";
+ pidl_fn_start "$ifname\_dissect\_$fn_name\_request";
pidl_code "static int";
pidl_code "$ifname\_dissect\_${fn_name}_request(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)";
pidl_code "{";
@@ -457,6 +481,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end "$ifname\_dissect\_$fn_name\_request";
}
sub Struct($$$)
@@ -473,6 +498,7 @@
pidl_hdr "int $dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, guint8 *drep, int hf_index, guint32 param _U_);";
+ pidl_fn_start $dissectorname;
pidl_code "int";
pidl_code "$dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, guint8 *drep, int hf_index, guint32 param _U_)";
pidl_code "{";
@@ -502,6 +528,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}\n";
+ pidl_fn_end $dissectorname;
register_type($name, "offset = $dissectorname(tvb,offset,pinfo,tree,drep,\@HF\@,\@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0);
}
@@ -536,6 +563,7 @@
$switch_dissect = "dissect_ndr_$e->{SWITCH_TYPE}";
}
+ pidl_fn_start $dissectorname;
pidl_code "static int";
pidl_code "$dissectorname(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, guint8 *drep, int hf_index, guint32 param _U_)";
pidl_code "{";
@@ -569,6 +597,7 @@
pidl_code "return offset;";
deindent;
pidl_code "}";
+ pidl_fn_end $dissectorname;
register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0);
}
@@ -602,6 +631,7 @@
{
my ($x) = @_;
+ pidl_fn_start "proto_register_dcerpc_$x->{NAME}";
pidl_code "void proto_register_dcerpc_$x->{NAME}(void)";
pidl_code "{";
indent;
@@ -639,6 +669,7 @@
deindent;
pidl_code "}\n";
+ pidl_fn_end "proto_register_dcerpc_$x->{NAME}";
}
sub RegisterInterfaceHandoff($)
@@ -646,6 +677,7 @@
my $x = shift;
if (defined($x->{UUID})) {
+ pidl_fn_start "proto_reg_handoff_dcerpc_$x->{NAME}";
pidl_code "void proto_reg_handoff_dcerpc_$x->{NAME}(void)";
pidl_code "{";
indent;
@@ -654,6 +686,7 @@
pidl_code "\t$x->{NAME}_dissectors, hf_$x->{NAME}_opnum);";
deindent;
pidl_code "}";
+ pidl_fn_end "proto_reg_handoff_dcerpc_$x->{NAME}";
$hf_used{"hf_$x->{NAME}_opnum"} = 1;
}
More information about the samba-cvs
mailing list