r13738: added support for a "pointer" type in pidl. This will be used in the
authorAndrew Tridgell <tridge@samba.org>
Tue, 28 Feb 2006 03:42:19 +0000 (03:42 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:52:07 +0000 (13:52 -0500)
opendb work that will be committed shortly.

The pointer type assumes that pointers fit in 64 bits, which is
probably OK on all our supported architectures.

source/librpc/ndr/ndr_basic.c
source/pidl/lib/Parse/Pidl/NDR.pm
source/pidl/lib/Parse/Pidl/Typelist.pm

index 615119fad30b3936d11ea6f1b520346d386daa15..8020c7da23e88008fdd82d506fb77cb6a1c27eef 100644 (file)
@@ -192,6 +192,19 @@ NTSTATUS ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
        return ndr_pull_udlong(ndr, ndr_flags, v);
 }
 
+/*
+  parse a pointer
+*/
+NTSTATUS ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
+{
+       uint64_t h;
+       NTSTATUS status;
+       NDR_PULL_ALIGN(ndr, 8);
+       status = ndr_pull_udlong(ndr, ndr_flags, &h);
+       *v = (void *)((intptr_t)h);
+       return status;  
+}
+
 /*
   pull a NTSTATUS
 */
@@ -375,6 +388,15 @@ NTSTATUS ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
        return ndr_push_udlong(ndr, NDR_SCALARS, v);
 }
 
+/*
+  push a pointer
+*/
+NTSTATUS ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
+{
+       NDR_PUSH_ALIGN(ndr, 8);
+       return ndr_push_udlong(ndr, NDR_SCALARS, (intptr_t)v);
+}
+
 NTSTATUS ndr_push_align(struct ndr_push *ndr, size_t size)
 {
        NDR_PUSH_ALIGN(ndr, size);
@@ -671,6 +693,11 @@ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
        ndr_print_dlong(ndr, name, v);
 }
 
+void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
+{
+       ndr->print(ndr, "%-25s: %p", name, v);
+}
+
 void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
 {
        if (p) {
index 179d2ecb1214c3a0e7528357a436fea21b1eae06..48d3ebf1705495498577624034bc223835bd3a65 100644 (file)
@@ -51,6 +51,7 @@ my $scalar_alignment = {
        'int32' => 4,
        'uint32' => 4,
        'hyper' => 8,
+       'pointer' => 8,
        'dlong' => 4,
        'udlong' => 4,
        'udlongr' => 4,
index 67e348c5fe4179dd1f5315b69159cf906c6d7712..b54badaeb602155ce7d2b1f3e0c15454f1a88a20 100644 (file)
@@ -73,6 +73,11 @@ my $scalars = {
                                C_TYPE          => "uint64_t",
                                IS_REFERENCE    => 0,
                        },
+       # assume its a 8 byte type, but cope with either
+       "pointer"       => {
+                               C_TYPE          => "void*",
+                               IS_REFERENCE    => 0,
+                       },
 
        # DATA_BLOB types
        "DATA_BLOB"     => {