summaryrefslogtreecommitdiff
path: root/source4/build
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2004-11-02 13:46:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:05:21 -0500
commita2fd2488c79902dfe1de764bea4f619ec6107fed (patch)
treeb0018bafa465de3b55acfd4db4bc9143ebce16c4 /source4/build
parent34c9263ed0ffc591e8313981085791b660ccfe26 (diff)
downloadsamba-a2fd2488c79902dfe1de764bea4f619ec6107fed.tar.gz
samba-a2fd2488c79902dfe1de764bea4f619ec6107fed.tar.bz2
samba-a2fd2488c79902dfe1de764bea4f619ec6107fed.zip
r3484: - add support for conformant string arrays at the end of a struct
- add support for strings where the length excludes the NULLTERM metze (This used to be commit 8251d8b3e5af351972aa41aed63f7a7d2640910e)
Diffstat (limited to 'source4/build')
-rw-r--r--source4/build/pidl/parser.pm16
-rw-r--r--source4/build/pidl/util.pm18
2 files changed, 32 insertions, 2 deletions
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index c52be637ec..34f9df197f 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -705,7 +705,6 @@ sub ParseElementPullBuffer($$$)
sub ParseStructPush($)
{
my($struct) = shift;
- my $conform_e;
if (! defined $struct->{ELEMENTS}) {
return;
@@ -722,10 +721,14 @@ sub ParseStructPush($)
if (defined $e->{ARRAY_LEN} && $e->{ARRAY_LEN} eq "*") {
my $size = find_size_var($e, util::array_size($e), "r->");
$e->{CONFORMANT_SIZE} = $size;
- $conform_e = $e;
pidl "\tNDR_CHECK(ndr_push_uint32(ndr, $size));\n";
}
+ if (defined $e->{TYPE} && $e->{TYPE} eq "string"
+ && util::property_matches($e, "flag", ".*LIBNDR_FLAG_STR_CONFORMANT.*")) {
+ pidl "\tNDR_CHECK(ndr_push_uint32(ndr, ndr_string_array_size(ndr, r->$e->{NAME})));\n";
+ }
+
pidl "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
pidl "\tNDR_CHECK(ndr_push_struct_start(ndr));\n";
@@ -790,6 +793,15 @@ sub ParseStructPull($)
my $e = $struct->{ELEMENTS}[-1];
if (defined $e->{ARRAY_LEN} && $e->{ARRAY_LEN} eq "*") {
$conform_e = $e;
+ }
+
+ if (defined $e->{TYPE} && $e->{TYPE} eq "string"
+ && util::property_matches($e, "flag", ".*LIBNDR_FLAG_STR_CONFORMANT.*")) {
+ $conform_e = $e;
+ }
+
+ if (defined $conform_e) {
+ $conform_e = $e;
pidl "\tuint32_t _conformant_size;\n";
$conform_e->{CONFORMANT_SIZE} = "_conformant_size";
}
diff --git a/source4/build/pidl/util.pm b/source4/build/pidl/util.pm
index c49e956e50..bddce57740 100644
--- a/source4/build/pidl/util.pm
+++ b/source4/build/pidl/util.pm
@@ -181,6 +181,24 @@ sub has_property($$)
return $e->{PROPERTIES}->{$p};
}
+#####################################################################
+# see if a pidl property matches a value
+sub property_matches($$$)
+{
+ my($e) = shift;
+ my($p) = shift;
+ my($v) = shift;
+
+ if (!defined has_property($e, $p)) {
+ return undef;
+ }
+
+ if ($e->{PROPERTIES}->{$p} =~ /$v/) {
+ return 1;
+ }
+
+ return undef;
+}
sub is_scalar_type($)
{