summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/eparser.pm136
1 files changed, 93 insertions, 43 deletions
diff --git a/source4/build/pidl/eparser.pm b/source4/build/pidl/eparser.pm
index e25a1760e1..3d0253e47b 100644
--- a/source4/build/pidl/eparser.pm
+++ b/source4/build/pidl/eparser.pm
@@ -419,85 +419,130 @@ sub RewriteC($$$)
while(<IN>) {
- # Ethereal take care of this for us. It also makes the other
- # regular expressions easier to write and understand.
+ #
+ # Regexps to do a first pass at removing stuff we aren't
+ # interested in for ehtereal parsers.
+ #
+
+ # Remove the NDR_CHECK() macro calls. Ethereal take care of
+ # this for us as part of the tvbuff_t structure.
s/NDR_CHECK\((.*)\)/$1/g;
- # We're not interested in ndr_print, ndr_push or ndr_size functions.
+ # We're not interested in ndr_{print,push,size} functions so
+ # just delete them.
s/^(static )?NTSTATUS (ndr_push[^\(]+).*?^\}\n\n//smg;
s/^void (ndr_print[^\(]+).*?^\}\n\n//smg;
s/^size_t (ndr_size[^\(]+).*?^\}\n\n//smg;
- # Get rid of dcerpc interface structures and functions
+ # Get rid of dcerpc interface structures and functions since
+ # they are also not very interesting.
s/^static const struct dcerpc_interface_call .*?^\};\n\n//smg;
- s/^static const char \* const ([a-z]+)_endpoint_strings.*?^\};\n\n//smg;
+ s/^static const char \* const
+ ([a-z]+)_endpoint_strings.*?^\};\n\n//smgx;
s/^static const struct dcerpc_endpoint_list .*?^\};\n\n\n//smg;
s/^const struct dcerpc_interface_table .*?^\};\n\n//smg;
s/^static NTSTATUS dcerpc_ndr_([a-z]+)_init.*?^\}\n\n//smg;
s/^NTSTATUS dcerpc_([a-z]+)_init.*?^\}\n\n//smg;
- # Include packet-dcerpc-foo.h instead of ndr_foo.h
+ # Rewrite includes to packet-dcerpc-foo.h instead of ndr_foo.h
s/^\#include \".*?ndr_(.*?).h\"$/\#include \"packet-dcerpc-$1.h\"/smg;
- # Call ethereal wrapper for ndr_pull_ptr() function.
-
- s/(ndr_pull_ptr\(ndr, ([^\)]*?)\);)/ndr_pull_ptr(ndr, tree, hf_ptr, $2);/smg;
-
- # Wrap ndr_pull_array_size() - generate wrapper that won't get
- # caught by the regex for wrapping scalar values below (i.e
- # the leading space in front of the first parameter).
-
- s/(ndr_pull_array_(size|length)\(ndr, ([^\)]*?)\);)/ndr_pull_array_$2( ndr, tree, $3);/smg;
-
- # Add tree argument to ndr_pull_array()
-
-#get_subtree(tree, \"$2\", ndr, ett_$2)
-#ndr_pull_array( ndr, NDR_SCALARS, tree, (void **)r->aces, sizeof(r->aces[0]), r->num_aces, (ndr_pull_flags_fn_t)ndr_pull_security_ace);
- s/(ndr_pull_array\(ndr, ([^,]*?), ([^,]*?), ([^\)].*?)\);)/ndr_pull_array( ndr, $2, tree, $3, $4);/smg;
-
- s/(ndr_pull_array_([^\(]*?)\(ndr, ([^,]*?), (r->((in|out).)?([^,]*?)), (.*?)\);)/ndr_pull_array_$2( ndr, $3, tree, hf_$7_$2_array, $4, $8);/smg;
+ #
+ # OK start wrapping the ndr_pull functions that actually
+ # implement the NDR decoding routines. This mainly consists
+ # of adding a couple of parameters to each function call.
+ #
+
+ # Add proto tree and hf argument to ndr_pull_ptr() calls.
+
+ s/(ndr_pull_ptr\(ndr, ([^\)]*?)\);)/
+ ndr_pull_ptr(ndr, tree, hf_ptr, $2);/smgx;
+
+ # Wrap ndr_pull_array_size() and ndr_pull_array_length()
+ # functions. Add leading space in front of first parameter so
+ # we won't get caught by later regexps.
+
+ s/(ndr_pull_array_(size|length)\(ndr, ([^\)]*?)\);)/
+ ndr_pull_array_$2( ndr, tree, $3);/smgx;
+
+ # Add tree argument to ndr_pull_array() and
+ # ndr_pull_array_foo() calls.
+
+ s/(ndr_pull_array\(
+ ndr,
+ ([^,]*?), # NDR_SCALARS etc
+ (\(void \*\*\)r->(in|out|)\.?([^,]*?)), # Pointer to array entries
+ ([^\)].*?)\);)/ # All other arguments
+ ndr_pull_array( ndr, $2, tree, $3, $6);/smgx;
+
+ s/(ndr_pull_array_([^\(]*?)\(
+ ndr,
+ ([^,]*?), # NDR_SCALARS etc
+ (r->((in|out).)?([^,]*?)), # Pointer to array elements
+ (.*?)\);)/ # Number of elements
+ ndr_pull_array_$2( ndr, $3, tree, hf_$7_$2_array, $4, $8);/smgx;
- # Save ndr_pull_relative[12]() calls from being wrapped by the
- # proceeding regexp.
+ # Save ndr_pull_relative{1,2}() calls from being wrapped by the
+ # proceeding regexp by adding a leading space.
- s/ndr_pull_(relative1|relative2)\((.*?);/ndr_pull_$1( $2;/smg;
+ s/ndr_pull_(relative1|relative2)\((.*?)\);/
+ ndr_pull_$1( $2);/smgx;
# Call ethereal wrappers for pull of scalar values in
- # structures and functions:
+ # structures and functions, e.g
#
# ndr_pull_uint32(ndr, &r->in.access_mask);
# ndr_pull_uint32(ndr, &r->idx);
- s/(ndr_pull_([^\)]*?)\(ndr, (&?r->((in|out)\.)?([^\)]*?))\);)/ndr_pull_$2(ndr, tree, hf_$6_$2, $3);/smg;
+ s/(ndr_pull_([^\)]*?)\(
+ ndr,
+ (&?r->((in|out)\.)? # Function args contain leading junk
+ ([^\)]*?)) # Element name
+ \);)/
+ ndr_pull_$2(ndr, tree, hf_$6_$2, $3);/smgx;
- # Pull of "internal" scalars like array sizes, levels, etcetera.
+ # Add tree and hf argument to pulls of "internal" scalars like
+ # array sizes, levels, etc.
- s/(ndr_pull_(uint32|uint16)\(ndr, (&_([^\)]*?))\);)/ndr_pull_$2(ndr, tree, hf_$4, $3);/smg;
+ s/(ndr_pull_(uint32|uint16)\(
+ ndr,
+ (&_([^\)]*?)) # Internal arg names have leading underscore
+ \);)/
+ ndr_pull_$2(ndr, tree, hf_$4, $3);/smgx;
- # Call ethereal wrappers for pull of buffers in structures and
- # functions:
+ # Add subtree argument to calls dissecting structures, e.g
#
# ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->command);
# ndr_pull_atsvc_enum_ctr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.ctr);
- s/(ndr_pull_([^\)]*?)\(ndr, (NDR_[^,]*?), ([^\(].*?)\);)/ndr_pull_$2(ndr, $3, get_subtree(tree, \"$2\", ndr, ett_$2), $4);/smg;
+ s/(ndr_pull_([^\)]*?)\(
+ ndr,
+ (NDR_[^,]*?),
+ ([^\(].*?)\);)/
+ ndr_pull_$2(ndr, $3, get_subtree(tree, \"$2\", ndr, ett_$2), $4);/smgx;
- # Add proto_tree parameter to pull functions:
+ # Add proto_tree parameter to pull function prototypes, e.g
#
- # static NTSTATUS ndr_pull_atsvc_JobInfo(struct ndr_pull *ndr, int ndr_flags, struct atsvc_JobInfo *r)
+ # static NTSTATUS ndr_pull_atsvc_JobInfo(struct ndr_pull *ndr,
+ # int ndr_flags, struct atsvc_JobInfo *r)
- s/^((static )?NTSTATUS ndr_pull_([^\(]*?)\(struct ndr_pull \*ndr, int (ndr_)?flags)/$1, proto_tree \*tree/smg;
+ s/^((static )?NTSTATUS ndr_pull_([^\(]*?)\(
+ struct ndr_pull \*ndr,
+ int (ndr_)?flags)/
+ $1, proto_tree \*tree/smgx;
# Add proto_tree parameter to ndr_pull_subcontext_flags_fn()
s/(ndr_pull_subcontext_flags_fn\(ndr)(.*?);/$1, tree$2;/smg;
- # Get rid of ndr_pull_error() calls. Ethereal should take
- # care of buffer overruns and inconsistent array sizes for us.
+ # Get rid of ndr_pull_error() calls for the moment. Ethereal
+ # should take care of buffer overruns and inconsistent array
+ # sizes for us but it would be nice to have some error text in
+ # the dissection.
s/(return ndr_pull_error([^;]*?);)/return NT_STATUS_OK; \/\/ $1/smg;
@@ -512,19 +557,24 @@ sub RewriteC($$$)
# Fix some internal variable declarations
s/uint(16|32) _level/uint$1_t _level/smg;
- s/ndr_pull_([^\(]*)\(ndr, tree, hf_level, &_level\);/ndr_pull_$1(ndr, tree, hf_level_$1, &_level);/smg;
+ s/ndr_pull_([^\(]*)\(ndr, tree, hf_level, &_level\);/
+ ndr_pull_$1(ndr, tree, hf_level_$1, &_level);/smgx;
# Enums
- s/(^static NTSTATUS ndr_pull_(.+?), (enum .+?)\))/static NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, $3)/smg;
+ s/(^static NTSTATUS ndr_pull_(.+?), (enum .+?)\))/
+ static NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, $3)/smgx;
s/uint(8|16|32) v;/uint$1_t v;/smg;
- s/(ndr_pull_([^\)]*?)\(ndr, &v\);)/ndr_pull_$2(ndr, tree, hf, &v);/smg;
+ s/(ndr_pull_([^\)]*?)\(ndr, &v\);)/
+ ndr_pull_$2(ndr, tree, hf, &v);/smgx;
- s/(ndr_pull_([^\(]+?)\(ndr, &_level\);)/ndr_pull_$2(ndr, tree, hf_$2, &_level);/smg;
+ s/(ndr_pull_([^\(]+?)\(ndr, &_level\);)/
+ ndr_pull_$2(ndr, tree, hf_$2, &_level);/smgx;
# Bitmaps
- s/(^NTSTATUS ndr_pull_(.+?), uint32 \*r\))/NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, uint32_t *r)/smg;
+ s/(^NTSTATUS ndr_pull_(.+?), uint32 \*r\))/
+ NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, uint32_t *r)/smgx;
pidl $_;
}