Import warning fixes from Samba 3.
[ira/wip.git] / source3 / librpc / ndr / ndr_basic.c
index 5e75fa1092ee320e55023732812e4ff35813426e..97f75051b7e713a9c99deb688ae8b355a509a4a2 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "system/network.h"
+#include "librpc/ndr/libndr.h"
 
 #define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
 #define NDR_IVAL(ndr, ofs) (NDR_BE(ndr)?RIVAL(ndr->data,ofs):IVAL(ndr->data,ofs))
@@ -35,7 +36,7 @@
   these could also indicate that real structure elements have been
   mistaken for padding in the IDL
 */
-void ndr_check_padding(struct ndr_pull *ndr, size_t n)
+_PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
 {
        size_t ofs2 = (ndr->offset + (n-1)) & ~(n-1);
        int i;
@@ -57,127 +58,126 @@ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
 /*
   parse a int8_t
 */
-NTSTATUS ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
 {
        NDR_PULL_NEED_BYTES(ndr, 1);
        *v = (int8_t)CVAL(ndr->data, ndr->offset);
        ndr->offset += 1;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a uint8_t
 */
-NTSTATUS ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
 {
        NDR_PULL_NEED_BYTES(ndr, 1);
        *v = CVAL(ndr->data, ndr->offset);
        ndr->offset += 1;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a int16_t
 */
-NTSTATUS ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
 {
        NDR_PULL_ALIGN(ndr, 2);
        NDR_PULL_NEED_BYTES(ndr, 2);
        *v = (uint16_t)NDR_SVAL(ndr, ndr->offset);
        ndr->offset += 2;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a uint16_t
 */
-NTSTATUS ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
 {
        NDR_PULL_ALIGN(ndr, 2);
        NDR_PULL_NEED_BYTES(ndr, 2);
        *v = NDR_SVAL(ndr, ndr->offset);
        ndr->offset += 2;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a int32_t
 */
-NTSTATUS ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
 {
        NDR_PULL_ALIGN(ndr, 4);
        NDR_PULL_NEED_BYTES(ndr, 4);
        *v = NDR_IVALS(ndr, ndr->offset);
        ndr->offset += 4;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a uint32_t
 */
-NTSTATUS ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
 {
        NDR_PULL_ALIGN(ndr, 4);
        NDR_PULL_NEED_BYTES(ndr, 4);
        *v = NDR_IVAL(ndr, ndr->offset);
        ndr->offset += 4;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a pointer referent identifier
 */
-NTSTATUS ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
 {
-       NTSTATUS status;
-       status = ndr_pull_uint32(ndr, NDR_SCALARS, v);
-       if (NT_STATUS_IS_OK(status) && *v != 0) {
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
+       if (*v != 0) {
                ndr->ptr_count++;
        }
-       return status;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a ref pointer referent identifier
 */
-NTSTATUS ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
 {
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
        /* ref pointers always point to data */
        *v = 1;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a udlong
 */
-NTSTATUS ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
 {
        NDR_PULL_ALIGN(ndr, 4);
        NDR_PULL_NEED_BYTES(ndr, 8);
        *v = NDR_IVAL(ndr, ndr->offset);
        *v |= (uint64_t)(NDR_IVAL(ndr, ndr->offset+4)) << 32;
        ndr->offset += 8;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a udlongr
 */
-NTSTATUS ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
 {
        NDR_PULL_ALIGN(ndr, 4);
        NDR_PULL_NEED_BYTES(ndr, 8);
        *v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
        *v |= NDR_IVAL(ndr, ndr->offset+4);
        ndr->offset += 8;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   parse a dlong
 */
-NTSTATUS ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
 {
        return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
 }
@@ -185,7 +185,7 @@ NTSTATUS ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
 /*
   parse a hyper
 */
-NTSTATUS ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
 {
        NDR_PULL_ALIGN(ndr, 8);
        return ndr_pull_udlong(ndr, ndr_flags, v);
@@ -194,37 +194,37 @@ NTSTATUS ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
 /*
   parse a pointer
 */
-NTSTATUS ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
+_PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
 {
-       intptr_t h;
+       uintptr_t h;
        NDR_PULL_ALIGN(ndr, sizeof(h));
        NDR_PULL_NEED_BYTES(ndr, sizeof(h));
        memcpy(&h, ndr->data+ndr->offset, sizeof(h));
        ndr->offset += sizeof(h);
        *v = (void *)h;
-       return NT_STATUS_OK;    
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull a NTSTATUS
 */
-NTSTATUS ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
+_PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
 {
        uint32_t v;
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
        *status = NT_STATUS(v);
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a NTSTATUS
 */
-NTSTATUS ndr_push_NTSTATUS(struct ndr_push *ndr, int ndr_flags, NTSTATUS status)
+_PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, int ndr_flags, NTSTATUS status)
 {
        return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
 }
 
-void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
+_PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
 {
        ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
 }
@@ -232,45 +232,45 @@ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
 /*
   pull a WERROR
 */
-NTSTATUS ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
+_PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
 {
        uint32_t v;
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
        *status = W_ERROR(v);
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a WERROR
 */
-NTSTATUS ndr_push_WERROR(struct ndr_push *ndr, int ndr_flags, WERROR status)
+_PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, int ndr_flags, WERROR status)
 {
        return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
 }
 
-void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
+_PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
 {
-       ndr->print(ndr, "%-25s: %s", name, dos_errstr(r));
+       ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
 }
 
 /*
   parse a set of bytes
 */
-NTSTATUS ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
+_PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
 {
        NDR_PULL_NEED_BYTES(ndr, n);
        memcpy(data, ndr->data + ndr->offset, n);
        ndr->offset += n;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull an array of uint8
 */
-NTSTATUS ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
+_PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
 {
        if (!(ndr_flags & NDR_SCALARS)) {
-               return NT_STATUS_OK;
+               return NDR_ERR_SUCCESS;
        }
        return ndr_pull_bytes(ndr, data, n);
 }
@@ -278,103 +278,103 @@ NTSTATUS ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data
 /*
   push a int8_t
 */
-NTSTATUS ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
 {
        NDR_PUSH_NEED_BYTES(ndr, 1);
        SCVAL(ndr->data, ndr->offset, (uint8_t)v);
        ndr->offset += 1;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a uint8_t
 */
-NTSTATUS ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
 {
        NDR_PUSH_NEED_BYTES(ndr, 1);
        SCVAL(ndr->data, ndr->offset, v);
        ndr->offset += 1;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a int16_t
 */
-NTSTATUS ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
 {
        NDR_PUSH_ALIGN(ndr, 2);
        NDR_PUSH_NEED_BYTES(ndr, 2);
        NDR_SSVAL(ndr, ndr->offset, (uint16_t)v);
        ndr->offset += 2;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a uint16_t
 */
-NTSTATUS ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
 {
        NDR_PUSH_ALIGN(ndr, 2);
        NDR_PUSH_NEED_BYTES(ndr, 2);
        NDR_SSVAL(ndr, ndr->offset, v);
        ndr->offset += 2;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a int32_t
 */
-NTSTATUS ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
 {
        NDR_PUSH_ALIGN(ndr, 4);
        NDR_PUSH_NEED_BYTES(ndr, 4);
        NDR_SIVALS(ndr, ndr->offset, v);
        ndr->offset += 4;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a uint32_t
 */
-NTSTATUS ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
 {
        NDR_PUSH_ALIGN(ndr, 4);
        NDR_PUSH_NEED_BYTES(ndr, 4);
        NDR_SIVAL(ndr, ndr->offset, v);
        ndr->offset += 4;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a udlong
 */
-NTSTATUS ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
 {
        NDR_PUSH_ALIGN(ndr, 4);
        NDR_PUSH_NEED_BYTES(ndr, 8);
        NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
        NDR_SIVAL(ndr, ndr->offset+4, (v>>32));
        ndr->offset += 8;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a udlongr
 */
-NTSTATUS ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
 {
        NDR_PUSH_ALIGN(ndr, 4);
        NDR_PUSH_NEED_BYTES(ndr, 8);
        NDR_SIVAL(ndr, ndr->offset, (v>>32));
        NDR_SIVAL(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
        ndr->offset += 8;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a dlong
 */
-NTSTATUS ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
 {
        return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
 }
@@ -382,7 +382,7 @@ NTSTATUS ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
 /*
   push a hyper
 */
-NTSTATUS ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+_PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
 {
        NDR_PUSH_ALIGN(ndr, 8);
        return ndr_push_udlong(ndr, NDR_SCALARS, v);
@@ -391,81 +391,65 @@ NTSTATUS ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
 /*
   push a pointer
 */
-NTSTATUS ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
+_PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
 {
-       intptr_t h = (intptr_t)v;
+       uintptr_t h = (intptr_t)v;
        NDR_PUSH_ALIGN(ndr, sizeof(h));
        NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
        memcpy(ndr->data+ndr->offset, &h, sizeof(h));
        ndr->offset += sizeof(h);
-       return NT_STATUS_OK;    
+       return NDR_ERR_SUCCESS;
 }
 
-NTSTATUS ndr_push_align(struct ndr_push *ndr, size_t size)
+_PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
 {
        NDR_PUSH_ALIGN(ndr, size);
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
-NTSTATUS ndr_pull_align(struct ndr_pull *ndr, size_t size)
+_PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
 {
        NDR_PULL_ALIGN(ndr, size);
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push some bytes
 */
-NTSTATUS ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
+_PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
 {
        NDR_PUSH_NEED_BYTES(ndr, n);
        memcpy(ndr->data + ndr->offset, data, n);
        ndr->offset += n;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push some zero bytes
 */
-NTSTATUS ndr_push_zero(struct ndr_push *ndr, uint32_t n)
+_PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
 {
        NDR_PUSH_NEED_BYTES(ndr, n);
        memset(ndr->data + ndr->offset, 0, n);
        ndr->offset += n;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push an array of uint8
 */
-NTSTATUS ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
+_PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
 {
        if (!(ndr_flags & NDR_SCALARS)) {
-               return NT_STATUS_OK;
+               return NDR_ERR_SUCCESS;
        }
        return ndr_push_bytes(ndr, data, n);
 }
 
-/*
-  save the current position
- */
-void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save)
-{
-       save->offset = ndr->offset;
-}
-
-/*
-  restore the position
- */
-void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save)
-{
-       ndr->offset = save->offset;
-}
-
 /*
   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)
+_PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
 {
        uint32_t ptr = 0;
        if (p) {
@@ -479,12 +463,17 @@ NTSTATUS ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
 /*
   push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
 */
-NTSTATUS ndr_push_sptr_ptr(struct ndr_push *ndr, const void *p)
+_PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
 {
        uint32_t ptr = 0;
        if (p) {
-               ndr->ptr_count++;
-               ptr = ndr->ptr_count;
+               /* Check if the pointer already exists and has an id */
+               ptr = ndr_token_peek(&ndr->full_ptr_list, p);
+               if (ptr == 0) {
+                       ndr->ptr_count++;
+                       ptr = ndr->ptr_count;
+                       ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
+               }
        }
        return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
 }
@@ -492,71 +481,72 @@ NTSTATUS ndr_push_sptr_ptr(struct ndr_push *ndr, const void *p)
 /*
   push always a 0, if a pointer is NULL it's a fatal error
 */
-NTSTATUS ndr_push_ref_ptr(struct ndr_push *ndr)
+_PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
 {
        return ndr_push_uint32(ndr, NDR_SCALARS, 0xAEF1AEF1);
 }
 
+
 /*
   push a NTTIME
 */
-NTSTATUS ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+_PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
 {
        NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull a NTTIME
 */
-NTSTATUS ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
 {
        NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a NTTIME
 */
-NTSTATUS ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
 {
        t /= 10000000;
        NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull a NTTIME_1sec
 */
-NTSTATUS ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
 {
        NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
        (*t) *= 10000000;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull a NTTIME_hyper
 */
-NTSTATUS ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
 {
        NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a NTTIME_hyper
 */
-NTSTATUS ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
 {
        NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   push a time_t
 */
-NTSTATUS ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t)
+_PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t)
 {
        return ndr_push_uint32(ndr, ndr_flags, t);
 }
@@ -564,21 +554,60 @@ NTSTATUS ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t)
 /*
   pull a time_t
 */
-NTSTATUS ndr_pull_time_t(struct ndr_pull *ndr, int ndr_flags, time_t *t)
+_PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, int ndr_flags, time_t *t)
 {
        uint32_t tt;
        NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
        *t = tt;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
+}
+
+
+/*
+  pull a ipv4address
+*/
+_PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, int ndr_flags, const char **address)
+{
+       struct in_addr in;
+       NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &in.s_addr));
+       in.s_addr = htonl(in.s_addr);
+       *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
+       NDR_ERR_HAVE_NO_MEMORY(*address);
+       return NDR_ERR_SUCCESS;
+}
+
+/*
+  push a ipv4address
+*/
+_PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, int ndr_flags, const char *address)
+{
+       uint32_t addr;
+       if (!is_ipaddress(address)) {
+               return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
+                                     "Invalid IPv4 address: '%s'", 
+                                     address);
+       }
+       addr = inet_addr(address);
+       NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
+       return NDR_ERR_SUCCESS;
+}
+
+/*
+  print a ipv4address
+*/
+_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name, 
+                          const char *address)
+{
+       ndr->print(ndr, "%-25s: %s", name, address);
 }
 
 
-void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
+_PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
 {
        ndr->print(ndr, "%s: struct %s", name, type);
 }
 
-void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, 
+_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, 
                    const char *val, uint32_t value)
 {
        if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
@@ -588,7 +617,7 @@ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
        }
 }
 
-void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
+_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
 {
        /* this is an attempt to support multi-bit bitmap masks */
        value &= flag;
@@ -604,62 +633,62 @@ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_
        }
 }
 
-void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
+_PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
 {
        ndr->print(ndr, "%-25s: %d", name, v);
 }
 
-void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
+_PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
 {
        ndr->print(ndr, "%-25s: 0x%02x (%u)", name, v, v);
 }
 
-void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
+_PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
 {
        ndr->print(ndr, "%-25s: %d", name, v);
 }
 
-void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
+_PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
 {
        ndr->print(ndr, "%-25s: 0x%04x (%u)", name, v, v);
 }
 
-void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
+_PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
 {
        ndr->print(ndr, "%-25s: %d", name, v);
 }
 
-void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
+_PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
 {
        ndr->print(ndr, "%-25s: 0x%08x (%u)", name, v, v);
 }
 
-void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
+_PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
 {
-       ndr->print(ndr, "%-25s: 0x%016llx (%llu)", name, v, v);
+       ndr->print(ndr, "%-25s: 0x%016llx (%llu)", name, (unsigned long long)v, (unsigned long long)v);
 }
 
-void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
+_PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
 {
        ndr_print_udlong(ndr, name, v);
 }
 
-void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
+_PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
 {
-       ndr->print(ndr, "%-25s: 0x%016llx (%lld)", name, v, v);
+       ndr->print(ndr, "%-25s: 0x%016llx (%lld)", name, (unsigned long long)v, (long long)v);
 }
 
-void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
+_PUBLIC_ 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)
+_PUBLIC_ 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)
+_PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
 {
        if (p) {
                ndr->print(ndr, "%-25s: *", name);
@@ -668,12 +697,12 @@ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
        }
 }
 
-void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
+_PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
 {
        ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
 }
 
-void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
+_PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
 {
        /* this is a standard NTTIME here
         * as it's already converted in the pull/push code
@@ -681,12 +710,12 @@ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
        ndr_print_NTTIME(ndr, name, t);
 }
 
-void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
+_PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
 {
        ndr_print_NTTIME(ndr, name, t);
 }
 
-void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
+_PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
 {
        if (t == (time_t)-1 || t == 0) {
                ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t);
@@ -695,7 +724,7 @@ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
        }
 }
 
-void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
+_PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
 {
        if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
                ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
@@ -704,12 +733,12 @@ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const c
        }
 }
 
-void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
+_PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
 {
        ndr->print(ndr, "UNKNOWN LEVEL %u", level);
 }
 
-void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, 
+_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, 
                           const uint8_t *data, uint32_t count)
 {
        int i;
@@ -728,8 +757,7 @@ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
        ndr->depth++;
        for (i=0;i<count;i++) {
                char *idx=NULL;
-               asprintf(&idx, "[%d]", i);
-               if (idx) {
+               if (asprintf(&idx, "[%d]", i) != -1) {
                        ndr_print_uint8(ndr, idx, data[i]);
                        free(idx);
                }
@@ -737,11 +765,11 @@ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
        ndr->depth--;   
 }
 
-void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
+_PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
 {
-       ndr->print(ndr, "%-25s: DATA_BLOB length=%u", name, r.length);
+       ndr->print(ndr, "%-25s: DATA_BLOB length=%u", name, (unsigned)r.length);
        if (r.length) {
-               dump_data(10, (const char *)r.data, r.length);
+               dump_data(10, r.data, r.length);
        }
 }
 
@@ -749,7 +777,7 @@ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
 /*
   push a DATA_BLOB onto the wire. 
 */
-NTSTATUS ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
+_PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
 {
        if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
                if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
@@ -765,13 +793,13 @@ NTSTATUS ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length));
        }
        NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
 /*
   pull a DATA_BLOB from the wire. 
 */
-NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob)
+_PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob)
 {
        uint32_t length = 0;
 
@@ -794,10 +822,11 @@ NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob
        NDR_PULL_NEED_BYTES(ndr, length);
        *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
        ndr->offset += length;
-       return NT_STATUS_OK;
+       return NDR_ERR_SUCCESS;
 }
 
-uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
+_PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
 {
+       if (!data) return ret;
        return ret + data->length;
 }