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