svn commit: samba r5764 - in branches/SAMBA_4_0/source: build/pidl librpc/ndr

metze at samba.org metze at samba.org
Sat Mar 12 08:29:55 GMT 2005


Author: metze
Date: 2005-03-12 08:29:54 +0000 (Sat, 12 Mar 2005)
New Revision: 5764

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5764

Log:
add support for embedded ref pointers

metze

Modified:
   branches/SAMBA_4_0/source/build/pidl/ndr.pm
   branches/SAMBA_4_0/source/build/pidl/validator.pm
   branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c


Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/ndr.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/ndr.pm	2005-03-12 04:01:17 UTC (rev 5763)
+++ branches/SAMBA_4_0/source/build/pidl/ndr.pm	2005-03-12 08:29:54 UTC (rev 5764)
@@ -183,7 +183,7 @@
 {
 	my $e = shift;
 
-	return 0 if (util::has_property($e, "ref"));
+	return 0 if (util::has_property($e, "ref") && $e->{PARENT}->{TYPE} eq "FUNCTION");
 	return 1 if ($e->{POINTERS} || util::array_size($e));
 	return 0;
 }
@@ -707,7 +707,9 @@
 	my $e = shift;
 	my $var_prefix = shift;
 
-	if (util::has_property($e, "relative")) {
+	if (util::has_property($e, "ref")) {
+		pidl "NDR_CHECK(ndr_push_ref_ptr(ndr, $var_prefix$e->{NAME}));";
+	} elsif (util::has_property($e, "relative")) {
 		pidl "NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_prefix$e->{NAME}));";
 	} else {
 		pidl "NDR_CHECK(ndr_push_unique_ptr(ndr, $var_prefix$e->{NAME}));";
@@ -855,7 +857,11 @@
 	my($e) = shift;
 	my($var_prefix) = shift;
 
-	pidl "NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_$e->{NAME}));";
+	if (util::has_property($e, "ref")) {
+		pidl "NDR_CHECK(ndr_pull_ref_ptr(ndr, &_ptr_$e->{NAME}));";
+	} else {
+		pidl "NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_$e->{NAME}));";
+	}
 	pidl "if (_ptr_$e->{NAME}) {";
 	indent;
 	pidl "NDR_ALLOC(ndr, $var_prefix$e->{NAME});";
@@ -1777,7 +1783,7 @@
 
 	if (util::array_size($e)) {
 		if (need_wire_pointer($e)) {
-			pidl "NDR_CHECK(ndr_push_unique_ptr(ndr, r->$inout.$e->{NAME}));";
+			ParsePtrPush($e, "r->$inout.");
 			pidl "if (r->$inout.$e->{NAME}) {";
 			indent;
 			ParseArrayPush($e, "ndr", "r->$inout.", "NDR_SCALARS|NDR_BUFFERS");

Modified: branches/SAMBA_4_0/source/build/pidl/validator.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/validator.pm	2005-03-12 04:01:17 UTC (rev 5763)
+++ branches/SAMBA_4_0/source/build/pidl/validator.pm	2005-03-12 08:29:54 UTC (rev 5764)
@@ -88,10 +88,6 @@
 	my($struct) = shift;
 
 	foreach my $e (@{$struct->{ELEMENTS}}) {
-		if (util::has_property($e, "ref")) {
-			fatal(el_name($e) . " : embedded ref pointers are not supported yet\n");
-		}
-	
 		$e->{PARENT} = $struct;
 		ValidElement($e);
 	}

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c	2005-03-12 04:01:17 UTC (rev 5763)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c	2005-03-12 08:29:54 UTC (rev 5764)
@@ -119,6 +119,18 @@
 }
 
 /*
+  parse a ref pointer referent identifier
+*/
+NTSTATUS ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
+{
+	NTSTATUS status;
+	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
+	/* ref pointers always point to data */
+	*v = 1;
+	return status;
+}
+
+/*
   parse a udlong
 */
 NTSTATUS ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
@@ -506,7 +518,7 @@
 }
 
 /*
-  push a 1 if a pointer is non-NULL, otherwise 0
+  push a unique non-zero value if a pointer is non-NULL, otherwise 0
 */
 NTSTATUS ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
 {
@@ -518,6 +530,17 @@
 	return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
 }
 
+/*
+  push always a 0, if a pointer is NULL it's a fatal error
+*/
+NTSTATUS ndr_push_ref_ptr(struct ndr_push *ndr, const void *p)
+{
+	uint32_t ptr = 0;
+	if (p == NULL) {
+		return NT_STATUS_INVALID_PARAMETER_MIX;
+	}
+	return ndr_push_uint32(ndr, NDR_SCALARS, 0);
+}
 
 /*
   pull a general string from the wire



More information about the samba-cvs mailing list