X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source4%2Flibrpc%2Fndr%2Fndr_basic.c;h=000a0c34980af11b9032b1d7a8d4527946336830;hb=af30a32b6924b0f2b701186e435defbca2ebd1aa;hp=f26c40e7b7c30eb1211d7abd81ce2359c91b57f6;hpb=717c8bc7950c2f0eabcdbc7437f47289f6b227b5;p=samba.git diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c index f26c40e7b7c..000a0c34980 100644 --- a/source4/librpc/ndr/ndr_basic.c +++ b/source4/librpc/ndr/ndr_basic.c @@ -21,8 +21,8 @@ */ #include "includes.h" +#include "system/network.h" -#define NDR_BE(ndr) (((ndr)->flags & (LIBNDR_FLAG_BIGENDIAN|LIBNDR_FLAG_LITTLE_ENDIAN)) == LIBNDR_FLAG_BIGENDIAN) #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)) #define NDR_IVALS(ndr, ofs) (NDR_BE(ndr)?RIVALS(ndr->data,ofs):IVALS(ndr->data,ofs)) @@ -36,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; @@ -46,7 +46,7 @@ void ndr_check_padding(struct ndr_pull *ndr, size_t n) } } if (ioffset;idata[i])); } @@ -56,9 +56,20 @@ void ndr_check_padding(struct ndr_pull *ndr, size_t n) } /* - parse a uint8 + parse a int8_t */ -NTSTATUS ndr_pull_uint8(struct ndr_pull *ndr, uint8_t *v) +_PUBLIC_ NTSTATUS 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; +} + +/* + parse a uint8_t +*/ +_PUBLIC_ NTSTATUS 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); @@ -66,11 +77,22 @@ NTSTATUS ndr_pull_uint8(struct ndr_pull *ndr, uint8_t *v) return NT_STATUS_OK; } +/* + parse a int16_t +*/ +_PUBLIC_ NTSTATUS 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; +} /* - parse a uint16 + parse a uint16_t */ -NTSTATUS ndr_pull_uint16(struct ndr_pull *ndr, uint16_t *v) +_PUBLIC_ NTSTATUS ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v) { NDR_PULL_ALIGN(ndr, 2); NDR_PULL_NEED_BYTES(ndr, 2); @@ -79,48 +101,58 @@ NTSTATUS ndr_pull_uint16(struct ndr_pull *ndr, uint16_t *v) return NT_STATUS_OK; } - /* - parse a uint32_t + parse a int32_t */ -NTSTATUS ndr_pull_uint32(struct ndr_pull *ndr, uint32_t *v) +_PUBLIC_ NTSTATUS 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_IVAL(ndr, ndr->offset); + *v = NDR_IVALS(ndr, ndr->offset); ndr->offset += 4; return NT_STATUS_OK; } /* - parse a int32_t + parse a uint32_t */ -NTSTATUS ndr_pull_int32(struct ndr_pull *ndr, int32_t *v) +_PUBLIC_ NTSTATUS 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_IVALS(ndr, ndr->offset); + *v = NDR_IVAL(ndr, ndr->offset); ndr->offset += 4; return NT_STATUS_OK; } /* - parse a pointer + parse a pointer referent identifier */ -NTSTATUS ndr_pull_ptr(struct ndr_pull *ndr, uint32_t *v) +_PUBLIC_ NTSTATUS ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v) { NTSTATUS status; - status = ndr_pull_uint32(ndr, v); - if (*v != 0) { + status = ndr_pull_uint32(ndr, NDR_SCALARS, v); + if (NT_STATUS_IS_OK(status) && *v != 0) { ndr->ptr_count++; } return status; } /* - parse a uint64 + parse a ref pointer referent identifier +*/ +_PUBLIC_ NTSTATUS 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; +} + +/* + parse a udlong */ -NTSTATUS ndr_pull_uint64(struct ndr_pull *ndr, uint64_t *v) +_PUBLIC_ NTSTATUS ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v) { NDR_PULL_ALIGN(ndr, 4); NDR_PULL_NEED_BYTES(ndr, 8); @@ -131,29 +163,56 @@ NTSTATUS ndr_pull_uint64(struct ndr_pull *ndr, uint64_t *v) } /* - parse a int64 + parse a udlongr +*/ +_PUBLIC_ NTSTATUS 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; +} + +/* + parse a dlong */ -NTSTATUS ndr_pull_int64(struct ndr_pull *ndr, int64_t *v) +_PUBLIC_ NTSTATUS ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v) { - return ndr_pull_uint64(ndr, (uint64_t *)v); + return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v); } /* - parse a HYPER_T + parse a hyper */ -NTSTATUS ndr_pull_HYPER_T(struct ndr_pull *ndr, HYPER_T *v) +_PUBLIC_ NTSTATUS ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v) { NDR_PULL_ALIGN(ndr, 8); - return ndr_pull_uint64(ndr, v); + return ndr_pull_udlong(ndr, ndr_flags, v); +} + +/* + parse a pointer +*/ +_PUBLIC_ NTSTATUS ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v) +{ + intptr_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; } /* pull a NTSTATUS */ -NTSTATUS ndr_pull_NTSTATUS(struct ndr_pull *ndr, NTSTATUS *status) +_PUBLIC_ NTSTATUS ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status) { uint32_t v; - NDR_CHECK(ndr_pull_uint32(ndr, &v)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v)); *status = NT_STATUS(v); return NT_STATUS_OK; } @@ -161,23 +220,23 @@ NTSTATUS ndr_pull_NTSTATUS(struct ndr_pull *ndr, NTSTATUS *status) /* push a NTSTATUS */ -NTSTATUS ndr_push_NTSTATUS(struct ndr_push *ndr, NTSTATUS status) +_PUBLIC_ NTSTATUS ndr_push_NTSTATUS(struct ndr_push *ndr, int ndr_flags, NTSTATUS status) { - return ndr_push_uint32(ndr, NT_STATUS_V(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)); + ndr->print(ndr, "%-25s: %s", name, nt_errstr(r)); } /* pull a WERROR */ -NTSTATUS ndr_pull_WERROR(struct ndr_pull *ndr, WERROR *status) +_PUBLIC_ NTSTATUS ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status) { uint32_t v; - NDR_CHECK(ndr_pull_uint32(ndr, &v)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v)); *status = W_ERROR(v); return NT_STATUS_OK; } @@ -185,12 +244,12 @@ NTSTATUS ndr_pull_WERROR(struct ndr_pull *ndr, WERROR *status) /* push a WERROR */ -NTSTATUS ndr_push_WERROR(struct ndr_push *ndr, WERROR status) +_PUBLIC_ NTSTATUS ndr_push_WERROR(struct ndr_push *ndr, int ndr_flags, WERROR status) { - return ndr_push_uint32(ndr, W_ERROR_V(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, win_errstr(r)); } @@ -198,7 +257,7 @@ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r) /* parse a set of bytes */ -NTSTATUS ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n) +_PUBLIC_ NTSTATUS 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); @@ -209,7 +268,7 @@ NTSTATUS ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n) /* pull an array of uint8 */ -NTSTATUS ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n) +_PUBLIC_ NTSTATUS 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; @@ -217,84 +276,44 @@ NTSTATUS ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data return ndr_pull_bytes(ndr, data, n); } - /* - pull an array of uint16 + push a int8_t */ -NTSTATUS ndr_pull_array_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *data, uint32_t n) +_PUBLIC_ NTSTATUS ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v) { - uint32_t i; - if (!(ndr_flags & NDR_SCALARS)) { - return NT_STATUS_OK; - } - for (i=0;idata, ndr->offset, (uint8_t)v); + ndr->offset += 1; return NT_STATUS_OK; } /* - pull a const array of WERROR + push a uint8_t */ -NTSTATUS ndr_pull_array_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *data, uint32_t n) +_PUBLIC_ NTSTATUS ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v) { - uint32_t i; - if (!(ndr_flags & NDR_SCALARS)) { - return NT_STATUS_OK; - } - for (i=0;idata, ndr->offset, v); + ndr->offset += 1; return NT_STATUS_OK; } - - /* - push a uint8 + push a int16_t */ -NTSTATUS ndr_push_uint8(struct ndr_push *ndr, uint8_t v) +_PUBLIC_ NTSTATUS ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v) { - NDR_PUSH_NEED_BYTES(ndr, 1); - SCVAL(ndr->data, ndr->offset, v); - ndr->offset += 1; + 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; } /* - push a uint16 + push a uint16_t */ -NTSTATUS ndr_push_uint16(struct ndr_push *ndr, uint16_t v) +_PUBLIC_ NTSTATUS ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v) { NDR_PUSH_ALIGN(ndr, 2); NDR_PUSH_NEED_BYTES(ndr, 2); @@ -304,33 +323,33 @@ NTSTATUS ndr_push_uint16(struct ndr_push *ndr, uint16_t v) } /* - push a uint32_t + push a int32_t */ -NTSTATUS ndr_push_uint32(struct ndr_push *ndr, uint32_t v) +_PUBLIC_ NTSTATUS 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_SIVAL(ndr, ndr->offset, v); + NDR_SIVALS(ndr, ndr->offset, v); ndr->offset += 4; return NT_STATUS_OK; } /* - push a int32_t + push a uint32_t */ -NTSTATUS ndr_push_int32(struct ndr_push *ndr, int32_t v) +_PUBLIC_ NTSTATUS 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_SIVALS(ndr, ndr->offset, v); + NDR_SIVAL(ndr, ndr->offset, v); ndr->offset += 4; return NT_STATUS_OK; } /* - push a uint64 + push a udlong */ -NTSTATUS ndr_push_uint64(struct ndr_push *ndr, uint64_t v) +_PUBLIC_ NTSTATUS ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v) { NDR_PUSH_ALIGN(ndr, 4); NDR_PUSH_NEED_BYTES(ndr, 8); @@ -341,29 +360,55 @@ NTSTATUS ndr_push_uint64(struct ndr_push *ndr, uint64_t v) } /* - push a int64 + push a udlongr */ -NTSTATUS ndr_push_int64(struct ndr_push *ndr, int64_t v) +_PUBLIC_ NTSTATUS ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v) { - return ndr_push_uint64(ndr, (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; } /* - push a HYPER_T + push a dlong */ -NTSTATUS ndr_push_HYPER_T(struct ndr_push *ndr, HYPER_T v) +_PUBLIC_ NTSTATUS ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v) +{ + return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v); +} + +/* + push a hyper +*/ +_PUBLIC_ NTSTATUS ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v) { NDR_PUSH_ALIGN(ndr, 8); - return ndr_push_uint64(ndr, v); + return ndr_push_udlong(ndr, NDR_SCALARS, v); } -NTSTATUS ndr_push_align(struct ndr_push *ndr, size_t size) +/* + push a pointer +*/ +_PUBLIC_ NTSTATUS ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v) +{ + intptr_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; +} + +_PUBLIC_ NTSTATUS ndr_push_align(struct ndr_push *ndr, size_t size) { NDR_PUSH_ALIGN(ndr, size); return NT_STATUS_OK; } -NTSTATUS ndr_pull_align(struct ndr_pull *ndr, size_t size) +_PUBLIC_ NTSTATUS ndr_pull_align(struct ndr_pull *ndr, size_t size) { NDR_PULL_ALIGN(ndr, size); return NT_STATUS_OK; @@ -372,7 +417,7 @@ NTSTATUS ndr_pull_align(struct ndr_pull *ndr, size_t size) /* push some bytes */ -NTSTATUS ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n) +_PUBLIC_ NTSTATUS 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); @@ -383,7 +428,7 @@ NTSTATUS ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n) /* push some zero bytes */ -NTSTATUS ndr_push_zero(struct ndr_push *ndr, uint32_t n) +_PUBLIC_ NTSTATUS ndr_push_zero(struct ndr_push *ndr, uint32_t n) { NDR_PUSH_NEED_BYTES(ndr, n); memset(ndr->data + ndr->offset, 0, n); @@ -394,7 +439,7 @@ NTSTATUS ndr_push_zero(struct ndr_push *ndr, uint32_t n) /* 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_ NTSTATUS 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; @@ -402,70 +447,10 @@ NTSTATUS ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t return ndr_push_bytes(ndr, data, n); } -/* - push an array of uint16 -*/ -NTSTATUS ndr_push_array_uint16(struct ndr_push *ndr, int ndr_flags, const uint16_t *data, uint32_t n) -{ - int i; - if (!(ndr_flags & NDR_SCALARS)) { - return NT_STATUS_OK; - } - for (i=0;ioffset = ndr->offset; } @@ -473,689 +458,302 @@ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save) /* restore the position */ -void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save) +_PUBLIC_ void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save) { ndr->offset = save->offset; } /* - 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_ptr(struct ndr_push *ndr, const void *p) +_PUBLIC_ NTSTATUS ndr_push_unique_ptr(struct ndr_push *ndr, const void *p) { uint32_t ptr = 0; if (p) { - /* we do this to ensure that we generate unique ref ids, - which means we can handle the case where a MS programmer - forgot to mark a pointer as unique */ + ptr = ndr->ptr_count * 4; + ptr |= 0x00020000; ndr->ptr_count++; - ptr = ndr->ptr_count; } - return ndr_push_uint32(ndr, ptr); + return ndr_push_uint32(ndr, NDR_SCALARS, ptr); } - /* - pull a general string from the wire + push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0 */ -NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s) +_PUBLIC_ NTSTATUS ndr_push_sptr_ptr(struct ndr_push *ndr, const void *p) { - char *as=NULL; - uint32_t len1, ofs, len2; - uint16_t len3; - int ret; - int chset = CH_UTF16; - unsigned byte_mul = 2; - unsigned flags = ndr->flags; - - if (!(ndr_flags & NDR_SCALARS)) { - return NT_STATUS_OK; - } - - if (NDR_BE(ndr)) { - chset = CH_UTF16BE; - } - - if (flags & LIBNDR_FLAG_STR_ASCII) { - chset = CH_DOS; - byte_mul = 1; - flags &= ~LIBNDR_FLAG_STR_ASCII; - } - - if (flags & LIBNDR_FLAG_STR_UTF8) { - chset = CH_UTF8; - byte_mul = 1; - flags &= ~LIBNDR_FLAG_STR_UTF8; - } - - flags &= ~LIBNDR_FLAG_STR_CONFORMANT; - flags &= ~LIBNDR_FLAG_STR_CHARLEN; - - switch (flags & LIBNDR_STRING_FLAGS) { - case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4: - case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_pull_uint32(ndr, &len1)); - NDR_CHECK(ndr_pull_uint32(ndr, &ofs)); - if (ofs != 0) { - return ndr_pull_error(ndr, NDR_ERR_STRING, "non-zero array offset with string flags 0x%x\n", - ndr->flags & LIBNDR_STRING_FLAGS); - } - NDR_CHECK(ndr_pull_uint32(ndr, &len2)); - if (len2 > len1) { - return ndr_pull_error(ndr, NDR_ERR_STRING, - "Bad string lengths len1=%u ofs=%u len2=%u\n", - len1, ofs, len2); - } - if (len2 == 0) { - *s = talloc_strdup(ndr, ""); - break; - } - NDR_PULL_NEED_BYTES(ndr, len2*byte_mul); - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len2*byte_mul, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len2*byte_mul)); - - /* this is a way of detecting if a string is sent with the wrong - termination */ - if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) { - if (strlen(as) < len2) { - DEBUG(6,("short string '%s'\n", as)); - } - } else { - if (strlen(as) == len2) { - DEBUG(6,("long string '%s'\n", as)); - } - } - *s = as; - break; - - case LIBNDR_FLAG_STR_SIZE4: - case LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_pull_uint32(ndr, &len1)); - NDR_PULL_NEED_BYTES(ndr, len1*byte_mul); - if (len1 == 0) { - *s = talloc_strdup(ndr, ""); - break; - } - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len1*byte_mul, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul)); - - /* this is a way of detecting if a string is sent with the wrong - termination */ - if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) { - if (strlen(as) < len1) { - DEBUG(6,("short string '%s'\n", as)); - } - } else { - if (strlen(as) == len1) { - DEBUG(6,("long string '%s'\n", as)); - } - } - *s = as; - break; - - case LIBNDR_FLAG_STR_LEN4: - case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_pull_uint32(ndr, &ofs)); - if (ofs != 0) { - return ndr_pull_error(ndr, NDR_ERR_STRING, "non-zero array offset with string flags 0x%x\n", - ndr->flags & LIBNDR_STRING_FLAGS); - } - NDR_CHECK(ndr_pull_uint32(ndr, &len1)); - NDR_PULL_NEED_BYTES(ndr, len1*byte_mul); - if (len1 == 0) { - *s = talloc_strdup(ndr, ""); - break; - } - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len1*byte_mul, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul)); - - /* this is a way of detecting if a string is sent with the wrong - termination */ - if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) { - if (strlen(as) < len1) { - DEBUG(6,("short string '%s'\n", as)); - } - } else { - if (strlen(as) == len1) { - DEBUG(6,("long string '%s'\n", as)); - } - } - *s = as; - break; - - - case LIBNDR_FLAG_STR_SIZE2: - case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_pull_uint16(ndr, &len3)); - NDR_PULL_NEED_BYTES(ndr, len3*byte_mul); - if (len3 == 0) { - *s = talloc_strdup(ndr, ""); - break; - } - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len3*byte_mul, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len3*byte_mul)); - - /* this is a way of detecting if a string is sent with the wrong - termination */ - if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) { - if (strlen(as) < len3) { - DEBUG(6,("short string '%s'\n", as)); - } - } else { - if (strlen(as) == len3) { - DEBUG(6,("long string '%s'\n", as)); - } - } - *s = as; - break; - - case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM|LIBNDR_FLAG_STR_BYTESIZE: - NDR_CHECK(ndr_pull_uint16(ndr, &len3)); - NDR_PULL_NEED_BYTES(ndr, len3); - if (len3 == 0) { - *s = talloc_strdup(ndr, ""); - break; - } - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len3, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len3)); - *s = as; - break; - - case LIBNDR_FLAG_STR_NULLTERM: - if (byte_mul == 1) { - len1 = ascii_len_n((const char *)(ndr->data+ndr->offset), ndr->data_size - ndr->offset); - } else { - len1 = utf16_len_n(ndr->data+ndr->offset, ndr->data_size - ndr->offset); - } - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len1, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len1)); - *s = as; - break; - - case LIBNDR_FLAG_STR_FIXLEN32: - len1 = 32; - NDR_PULL_NEED_BYTES(ndr, len1*byte_mul); - ret = convert_string_talloc(ndr, chset, CH_UNIX, - ndr->data+ndr->offset, - len1*byte_mul, - (void **)&as); - if (ret == -1) { - return ndr_pull_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul)); - *s = as; - break; - - - default: - return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x\n", - ndr->flags & LIBNDR_STRING_FLAGS); + uint32_t ptr = 0; + if (p) { + ndr->ptr_count++; + ptr = ndr->ptr_count; } - - return NT_STATUS_OK; + return ndr_push_uint32(ndr, NDR_SCALARS, ptr); } - /* - push a general string onto the wire + push always a 0, if a pointer is NULL it's a fatal error */ -NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) +_PUBLIC_ NTSTATUS ndr_push_ref_ptr(struct ndr_push *ndr, const void *p) { - ssize_t s_len, c_len; - int ret; - int chset = CH_UTF16; - unsigned flags = ndr->flags; - unsigned byte_mul = 2; - unsigned c_len_term = 1; - - if (!(ndr_flags & NDR_SCALARS)) { - return NT_STATUS_OK; + if (p == NULL) { + return NT_STATUS_INVALID_PARAMETER_MIX; } + return ndr_push_uint32(ndr, NDR_SCALARS, 0xAEF1AEF1); +} - if (NDR_BE(ndr)) { - chset = CH_UTF16BE; - } - - s_len = s?strlen(s):0; - c_len = s?strlen_m(s):0; - - if (flags & LIBNDR_FLAG_STR_ASCII) { - chset = CH_DOS; - byte_mul = 1; - flags &= ~LIBNDR_FLAG_STR_ASCII; - } - - if (flags & LIBNDR_FLAG_STR_UTF8) { - chset = CH_UTF8; - byte_mul = 1; - flags &= ~LIBNDR_FLAG_STR_UTF8; - } - - flags &= ~LIBNDR_FLAG_STR_CONFORMANT; - - if (flags & LIBNDR_FLAG_STR_CHARLEN) { - c_len_term = 0; - flags &= ~LIBNDR_FLAG_STR_CHARLEN; - } - - switch (flags & LIBNDR_STRING_FLAGS) { - case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4: - NDR_CHECK(ndr_push_uint32(ndr, c_len+c_len_term)); - NDR_CHECK(ndr_push_uint32(ndr, 0)); - NDR_CHECK(ndr_push_uint32(ndr, c_len+c_len_term)); - NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); - ret = convert_string(CH_UNIX, chset, - s, s_len+1, - ndr->data+ndr->offset, - byte_mul*(c_len+1)); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*(c_len+1); - break; - - case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_push_uint32(ndr, c_len)); - NDR_CHECK(ndr_push_uint32(ndr, 0)); - NDR_CHECK(ndr_push_uint32(ndr, c_len)); - NDR_PUSH_NEED_BYTES(ndr, c_len*byte_mul); - ret = convert_string(CH_UNIX, chset, - s, s_len, - ndr->data+ndr->offset, c_len*byte_mul); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += c_len*byte_mul; - break; - - case LIBNDR_FLAG_STR_LEN4: - NDR_CHECK(ndr_push_uint32(ndr, 0)); - NDR_CHECK(ndr_push_uint32(ndr, c_len + c_len_term)); - NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); - ret = convert_string(CH_UNIX, chset, - s, s_len + 1, - ndr->data+ndr->offset, byte_mul*(c_len+1)); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*(c_len+1); - break; - - case LIBNDR_FLAG_STR_SIZE4: - NDR_CHECK(ndr_push_uint32(ndr, c_len + c_len_term)); - NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); - ret = convert_string(CH_UNIX, chset, - s, s_len + 1, - ndr->data+ndr->offset, byte_mul*(c_len+1)); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*(c_len+1); - break; - - case LIBNDR_FLAG_STR_SIZE2: - NDR_CHECK(ndr_push_uint16(ndr, c_len + c_len_term)); - NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); - ret = convert_string(CH_UNIX, chset, - s, s_len + 1, - ndr->data+ndr->offset, byte_mul*(c_len+1)); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*(c_len+1); - break; - - case LIBNDR_FLAG_STR_NULLTERM: - NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); - ret = convert_string(CH_UNIX, chset, - s, s_len+1, - ndr->data+ndr->offset, byte_mul*(c_len+1)); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*(c_len+1); - break; - - case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM|LIBNDR_FLAG_STR_BYTESIZE: - NDR_CHECK(ndr_push_uint16(ndr, c_len*byte_mul)); - NDR_PUSH_NEED_BYTES(ndr, c_len*byte_mul); - ret = convert_string(CH_UNIX, chset, - s, s_len, - ndr->data+ndr->offset, c_len*byte_mul); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += c_len*byte_mul; - break; - - case LIBNDR_FLAG_STR_FIXLEN32: - NDR_PUSH_NEED_BYTES(ndr, byte_mul*32); - ret = convert_string(CH_UNIX, chset, - s, s_len + 1, - ndr->data+ndr->offset, byte_mul*32); - if (ret == -1) { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); - } - ndr->offset += byte_mul*32; - break; - - default: - return ndr_push_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x\n", - ndr->flags & LIBNDR_STRING_FLAGS); - } +/* + push a NTTIME +*/ +_PUBLIC_ NTSTATUS 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; } /* - push a general string onto the wire + pull a NTTIME */ -size_t ndr_string_array_size(struct ndr_push *ndr, const char *s) +_PUBLIC_ NTSTATUS ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) { - size_t c_len; - unsigned flags = ndr->flags; - unsigned byte_mul = 2; - unsigned c_len_term = 1; - - if (flags & LIBNDR_FLAG_STR_FIXLEN32) { - return 32; - } - - c_len = s?strlen_m(s):0; - - if (flags & (LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_UTF8)) { - byte_mul = 1; - } - - if (flags & LIBNDR_FLAG_STR_NOTERM) { - c_len_term = 0; - } - - c_len = c_len + c_len_term; - - if (flags & LIBNDR_FLAG_STR_BYTESIZE) { - c_len = c_len * byte_mul; - } - - return c_len; + NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t)); + return NT_STATUS_OK; } - /* push a NTTIME */ -NTSTATUS ndr_push_NTTIME(struct ndr_push *ndr, NTTIME t) +_PUBLIC_ NTSTATUS ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t) { - NDR_CHECK(ndr_push_uint64(ndr, t)); + t /= 10000000; + NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t)); return NT_STATUS_OK; } /* - pull a NTTIME + pull a NTTIME_1sec */ -NTSTATUS ndr_pull_NTTIME(struct ndr_pull *ndr, NTTIME *t) +_PUBLIC_ NTSTATUS ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) { - NDR_CHECK(ndr_pull_uint64(ndr, t)); + NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t)); + (*t) *= 10000000; return NT_STATUS_OK; } /* - push a NTTIME + pull a NTTIME_hyper */ -NTSTATUS ndr_push_NTTIME_1sec(struct ndr_push *ndr, NTTIME t) +_PUBLIC_ NTSTATUS ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) { - t /= 10000000; - NDR_CHECK(ndr_push_uint64(ndr, t)); + NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t)); return NT_STATUS_OK; } /* - pull a NTTIME + push a NTTIME_hyper */ -NTSTATUS ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, NTTIME *t) +_PUBLIC_ NTSTATUS ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t) { - NDR_CHECK(ndr_pull_uint64(ndr, t)); - (*t) *= 10000000; + NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t)); return NT_STATUS_OK; } /* push a time_t */ -NTSTATUS ndr_push_time_t(struct ndr_push *ndr, time_t t) +_PUBLIC_ NTSTATUS ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t) { - return ndr_push_uint32(ndr, t); + return ndr_push_uint32(ndr, ndr_flags, t); } /* pull a time_t */ -NTSTATUS ndr_pull_time_t(struct ndr_pull *ndr, time_t *t) +_PUBLIC_ NTSTATUS ndr_pull_time_t(struct ndr_pull *ndr, int ndr_flags, time_t *t) { uint32_t tt; - NDR_CHECK(ndr_pull_uint32(ndr, &tt)); + NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt)); *t = tt; return NT_STATUS_OK; } -void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type) +/* + pull a ipv4address +*/ +_PUBLIC_ NTSTATUS ndr_pull_ipv4address(struct ndr_pull *ndr, int ndr_flags, const char **address) { - ndr->print(ndr, "%s: struct %s", name, type); + struct ipv4_addr in; + NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &in.addr)); + in.addr = htonl(in.addr); + *address = talloc_strdup(ndr->current_mem_ctx, sys_inet_ntoa(in)); + NT_STATUS_HAVE_NO_MEMORY(*address); + return NT_STATUS_OK; } -void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v) +/* + push a ipv4address +*/ +_PUBLIC_ NTSTATUS ndr_push_ipv4address(struct ndr_push *ndr, int ndr_flags, const char *address) { - ndr->print(ndr, "%-25s: 0x%02x (%u)", name, v, v); + 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 NT_STATUS_OK; } -void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v) +/* + print a ipv4address +*/ +_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name, + const char *address) { - ndr->print(ndr, "%-25s: 0x%04x (%u)", name, v, v); + ndr->print(ndr, "%-25s: %s", name, address); } -void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v) + +_PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type) { - ndr->print(ndr, "%-25s: 0x%08x (%u)", name, v, v); + ndr->print(ndr, "%s: struct %s", name, type); } -void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v) +_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, + const char *val, uint_t value) { - ndr->print(ndr, "%-25s: %d", name, v); + if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) { + ndr->print(ndr, "%-25s: %s (0x%X)", name, val?val:"UNKNOWN_ENUM_VALUE", value); + } else { + ndr->print(ndr, "%-25s: %s (%d)", name, val?val:"UNKNOWN_ENUM_VALUE", value); + } } -void ndr_print_uint64(struct ndr_print *ndr, const char *name, uint64_t v) +_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint_t flag, uint_t value) { - ndr->print(ndr, "%-25s: 0x%08x%08x (%llu)", name, - (uint32_t)(v >> 32), - (uint32_t)(v & 0xFFFFFFFF), - v); + /* this is an attempt to support multi-bit bitmap masks */ + value &= flag; + + while (!(flag & 1)) { + flag >>= 1; + value >>= 1; + } + if (flag == 1) { + ndr->print(ndr, " %d: %-25s", value, flag_name); + } else { + ndr->print(ndr, "0x%02x: %-25s (%d)", value, flag_name, value); + } } -void ndr_print_int64(struct ndr_print *ndr, const char *name, int64_t v) +_PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v) { - ndr->print(ndr, "%-25s: 0x%08x%08x (%lld)", name, - (uint32_t)(v >> 32), - (uint32_t)(v & 0xFFFFFFFF), - v); + ndr->print(ndr, "%-25s: %d", name, v); } -void ndr_print_HYPER_T(struct ndr_print *ndr, const char *name, HYPER_T v) +_PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v) { - ndr->print(ndr, "%-25s: 0x%08x%08x", name, (uint32_t)(v >> 32), (uint32_t)(v & 0xFFFFFFFF)); + ndr->print(ndr, "%-25s: 0x%02x (%u)", name, v, v); } -void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p) +_PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v) { - if (p) { - ndr->print(ndr, "%-25s: *", name); - } else { - ndr->print(ndr, "%-25s: NULL", name); - } + ndr->print(ndr, "%-25s: %d", name, v); } -void ndr_print_string(struct ndr_print *ndr, const char *name, const char *s) +_PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v) { - if (s) { - ndr->print(ndr, "%-25s: '%s'", name, s); - } else { - ndr->print(ndr, "%-25s: NULL", name); - } + ndr->print(ndr, "%-25s: 0x%04x (%u)", name, v, v); } -void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t) +_PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v) { - ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t)); + ndr->print(ndr, "%-25s: %d", name, v); } -void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t) +_PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v) { - ndr_print_NTTIME(ndr, name, t); + ndr->print(ndr, "%-25s: 0x%08x (%u)", name, v, v); } -void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t) +_PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v) { - if (t == (time_t)-1 || t == 0) { - ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t); - } else { - ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t)); - } + ndr->print(ndr, "%-25s: 0x%016llx (%llu)", name, v, v); } -void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type) +_PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v) { - ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level); + ndr_print_udlong(ndr, name, v); } -void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level) +_PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v) { - ndr->print(ndr, "UNKNOWN LEVEL %u", level); + ndr->print(ndr, "%-25s: 0x%016llx (%lld)", name, v, v); } -void ndr_print_array_WERROR(struct ndr_print *ndr, const char *name, - const WERROR *data, uint32_t count) +_PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v) { - int i; + ndr_print_dlong(ndr, name, v); +} - ndr->print(ndr, "%s: ARRAY(%d)", name, count); - ndr->depth++; - for (i=0;iprint(ndr, "%-25s: %p", name, v); +} + +_PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p) +{ + if (p) { + ndr->print(ndr, "%-25s: *", name); + } else { + ndr->print(ndr, "%-25s: NULL", name); } - ndr->depth--; } -void ndr_print_array_HYPER_T(struct ndr_print *ndr, const char *name, - const HYPER_T *data, uint32_t count) +_PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t) { - int i; + ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t)); +} - ndr->print(ndr, "%s: ARRAY(%d)", name, count); - ndr->depth++; - for (i=0;idepth--; +_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 + */ + ndr_print_NTTIME(ndr, name, t); } -void ndr_print_array_uint32(struct ndr_print *ndr, const char *name, - const uint32_t *data, uint32_t count) +_PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t) { - int i; + ndr_print_NTTIME(ndr, name, t); +} - ndr->print(ndr, "%s: ARRAY(%d)", name, count); - ndr->depth++; - for (i=0;iprint(ndr, "%-25s: (time_t)%d", name, (int)t); + } else { + ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t)); } - ndr->depth--; } -void ndr_print_array_uint16(struct ndr_print *ndr, const char *name, - const uint16_t *data, uint32_t count) +_PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type) { - int i; - - ndr->print(ndr, "%s: ARRAY(%d)", name, count); - ndr->depth++; - for (i=0;iflags & LIBNDR_PRINT_ARRAY_HEX) { + ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level); + } else { + ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level); } - ndr->depth--; } -void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, +_PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level) +{ + ndr->print(ndr, "UNKNOWN LEVEL %u", level); +} + +_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, const uint8_t *data, uint32_t count) { int i; @@ -1183,91 +781,7 @@ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, ndr->depth--; } -/* - build a GUID from a string -*/ -NTSTATUS GUID_from_string(const char *s, struct GUID *guid) -{ - NTSTATUS status = NT_STATUS_INVALID_PARAMETER; - uint32_t time_low; - uint32_t time_mid, time_hi_and_version; - uint32_t clock_seq[2]; - uint32_t node[6]; - int i; - - if (11 == sscanf(s, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", - &time_low, &time_mid, &time_hi_and_version, - &clock_seq[0], &clock_seq[1], - &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) { - status = NT_STATUS_OK; - } else if (11 == sscanf(s, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - &time_low, &time_mid, &time_hi_and_version, - &clock_seq[0], &clock_seq[1], - &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) { - status = NT_STATUS_OK; - } - - if (!NT_STATUS_IS_OK(status)) { - return status; - } - - guid->time_low = time_low; - guid->time_mid = time_mid; - guid->time_hi_and_version = time_hi_and_version; - guid->clock_seq[0] = clock_seq[0]; - guid->clock_seq[1] = clock_seq[1]; - for (i=0;i<6;i++) { - guid->node[i] = node[i]; - } - - return NT_STATUS_OK; -} - -/* generate a random GUID */ -struct GUID GUID_random(void) -{ - struct GUID guid; - - generate_random_buffer((uint8_t *)&guid, sizeof(guid)); - - return guid; -} - -/* - its useful to be able to display these in debugging messages -*/ -char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid) -{ - return talloc_asprintf(mem_ctx, - "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", - guid->time_low, guid->time_mid, - guid->time_hi_and_version, - guid->clock_seq[0], - guid->clock_seq[1], - guid->node[0], guid->node[1], - guid->node[2], guid->node[3], - guid->node[4], guid->node[5]); -} - -char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid) -{ - return talloc_asprintf(mem_ctx, - "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - guid->time_low, guid->time_mid, - guid->time_hi_and_version, - guid->clock_seq[0], - guid->clock_seq[1], - guid->node[0], guid->node[1], - guid->node[2], guid->node[3], - guid->node[4], guid->node[5]); -} - -void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid) -{ - ndr->print(ndr, "%-25s: %s", name, GUID_string(ndr, guid)); -} - -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); if (r.length) { @@ -1279,7 +793,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, DATA_BLOB blob) +_PUBLIC_ NTSTATUS 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) { @@ -1292,7 +806,7 @@ NTSTATUS ndr_push_DATA_BLOB(struct ndr_push *ndr, DATA_BLOB blob) NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length); data_blob_clear(&blob); } else if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) { - NDR_CHECK(ndr_push_uint32(ndr, blob.length)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length)); } NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length)); return NT_STATUS_OK; @@ -1301,7 +815,7 @@ NTSTATUS ndr_push_DATA_BLOB(struct ndr_push *ndr, DATA_BLOB blob) /* pull a DATA_BLOB from the wire. */ -NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, DATA_BLOB *blob) +_PUBLIC_ NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob) { uint32_t length; @@ -1319,22 +833,15 @@ NTSTATUS ndr_pull_DATA_BLOB(struct ndr_pull *ndr, DATA_BLOB *blob) } else if (ndr->flags & LIBNDR_FLAG_REMAINING) { length = ndr->data_size - ndr->offset; } else { - NDR_CHECK(ndr_pull_uint32(ndr, &length)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length)); } NDR_PULL_NEED_BYTES(ndr, length); - *blob = data_blob_talloc(ndr, ndr->data+ndr->offset, length); + *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length); ndr->offset += length; return NT_STATUS_OK; } -uint32 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) { return ret + data->length; } - -uint32 ndr_size_string(int ret, const char * const* string, int flags) -{ - /* FIXME: Is this correct for all strings ? */ - if(!(*string)) return ret; - return ret+strlen(*string)+1; -}