From f30eba52225df456e341beac380ab05469bde76b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 2 Aug 2005 20:12:31 +0000 Subject: r8940: Add TDR (Trivial Data Representation). The aim is to use this later for NBT/WINS/etc rather then having to depend on NDR. (This used to be commit 5ee7af26dd220de06f1764cd1683abedeeda5131) --- source4/lib/tdr/tdr.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 source4/lib/tdr/tdr.c (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c new file mode 100644 index 0000000000..c9aa289f00 --- /dev/null +++ b/source4/lib/tdr/tdr.c @@ -0,0 +1,229 @@ +/* + Unix SMB/CIFS implementation. + + TDR (Trivial Data Representation) helper functions + Based loosely on ndr.c by Andrew Tridgell. + + Copyright (C) Jelmer Vernooij 2005 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" +#include "system/network.h" + +#define TDR_BASE_MARSHALL_SIZE 1024 + +#define TDR_PUSH_NEED_BYTES(tdr, n) TDR_CHECK(tdr_push_expand(tdr, tdr->offset+(n))) + +#define TDR_PULL_NEED_BYTES(tdr, n) do { \ + if ((n) > tdr->length || tdr->offset + (n) > tdr->length) { \ + return NT_STATUS_BUFFER_TOO_SMALL; \ + } \ +} while(0) + +#define TDR_BE(tdr) ((tdr)->flags & TDR_FLAG_BIGENDIAN) + +#define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data,ofs):SVAL(tdr->data,ofs)) +#define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data,ofs):IVAL(tdr->data,ofs)) +#define TDR_IVALS(tdr, ofs) (TDR_BE(tdr)?RIVALS(tdr->data,ofs):IVALS(tdr->data,ofs)) +#define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data,ofs,v); } else SSVAL(tdr->data,ofs,v); } while (0) +#define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data,ofs,v); } else SIVAL(tdr->data,ofs,v); } while (0) +#define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data,ofs,v); } else SIVALS(tdr->data,ofs,v); } while (0) + +struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, DATA_BLOB *blob) +{ + struct tdr_pull *tdr = talloc(mem_ctx, struct tdr_pull); + tdr->data = blob->data; + tdr->length = blob->length; + tdr->offset = 0; + tdr->flags = 0; + return tdr; +} + +struct tdr_push *tdr_push_init(TALLOC_CTX *mem_ctx) +{ + return talloc_zero(mem_ctx, struct tdr_push); +} + +struct tdr_print *tdr_print_init(TALLOC_CTX *mem_ctx) +{ + return talloc_zero(mem_ctx, struct tdr_print); +} + +/* + expand the available space in the buffer to 'size' +*/ +NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) +{ + if (tdr->alloc_size >= size) { + return NT_STATUS_OK; + } + + tdr->alloc_size += TDR_BASE_MARSHALL_SIZE; + if (size > tdr->alloc_size) { + tdr->length = size; + } + tdr->data = talloc_realloc(tdr, tdr->data, uint8_t, tdr->alloc_size); + return NT_STATUS_NO_MEMORY; +} + + +NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) +{ + TDR_PULL_NEED_BYTES(tdr, 1); + SCVAL(tdr->data, tdr->offset, *v); + tdr->offset += 1; + return NT_STATUS_OK; +} + +NTSTATUS tdr_push_uint8(struct tdr_push *tdr, const uint8_t *v) +{ + TDR_PUSH_NEED_BYTES(tdr, 1); + SCVAL(tdr->data, tdr->offset, *v); + tdr->offset += 1; + return NT_STATUS_OK; +} + +NTSTATUS tdr_print_uint8(struct tdr_print *tdr, const char *name, uint8_t *v) +{ + tdr->print(tdr, "%-25s: 0x%02x (%u)", name, *v, *v); + return NT_STATUS_OK; +} + +NTSTATUS tdr_pull_uint16(struct tdr_pull *tdr, uint16_t *v) +{ + TDR_PULL_NEED_BYTES(tdr, 2); + *v = TDR_SVAL(tdr, tdr->offset); + tdr->offset += 2; + return NT_STATUS_OK; +} + +NTSTATUS tdr_push_uint16(struct tdr_push *tdr, const uint16_t *v) +{ + TDR_PUSH_NEED_BYTES(tdr, 2); + TDR_SSVAL(tdr, tdr->offset, *v); + tdr->offset += 2; + return NT_STATUS_OK; +} + +NTSTATUS tdr_print_uint16(struct tdr_print *tdr, const char *name, uint16_t *v) +{ + tdr->print(tdr, "%-25s: 0x%02x (%u)", name, *v, *v); + return NT_STATUS_OK; +} + +NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint16_t *v) +{ + TDR_PULL_NEED_BYTES(tdr, 4); + *v = TDR_IVAL(tdr, tdr->offset); + tdr->offset += 4; + return NT_STATUS_OK; +} + +NTSTATUS tdr_push_uint32(struct tdr_push *tdr, const uint16_t *v) +{ + TDR_PUSH_NEED_BYTES(tdr, 4); + TDR_SIVAL(tdr, tdr->offset, *v); + tdr->offset += 4; + return NT_STATUS_OK; +} + +NTSTATUS tdr_print_uint32(struct tdr_print *tdr, const char *name, uint32_t *v) +{ + tdr->print(tdr, "%-25s: 0x%02x (%u)", name, *v, *v); + return NT_STATUS_OK; +} + +NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, char **v, uint32_t length, uint32_t el_size, int chset) +{ + int ret; + if (length == -1) { + switch (chset) { + case CH_DOS: + length = ascii_len_n((const char*)tdr->data+tdr->offset, tdr->length-tdr->offset); + break; + case CH_UTF16: + length = utf16_len_n(tdr->data+tdr->offset, tdr->length-tdr->offset); + default: + return NT_STATUS_INVALID_PARAMETER; + } + } + + TDR_PULL_NEED_BYTES(tdr, el_size*length); + + ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data+tdr->offset, el_size*length, (void **)v); + + if (ret == -1) { + return NT_STATUS_INVALID_PARAMETER; + } + + return NT_STATUS_OK; +} + +NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, uint32_t el_size, int chset) +{ + int ret; + TDR_PUSH_NEED_BYTES(tdr, el_size*length); + + ret = convert_string(CH_UNIX, chset, *v, length, tdr->data+tdr->offset, el_size*length); + + if (ret == -1) { + return NT_STATUS_INVALID_PARAMETER; + } + + tdr->offset += ret; + + return NT_STATUS_OK; +} + +NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char **v, uint32_t length, uint32_t el_size, int chset) +{ + tdr->print(tdr, "%-25s: %s", name, *v); + return NT_STATUS_OK; +} + +/* + pull a ipv4address +*/ +NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, const char **address) +{ + struct ipv4_addr in; + TDR_CHECK(tdr_pull_uint32(tdr, &in.addr)); + in.addr = htonl(in.addr); + *address = talloc_strdup(tdr, sys_inet_ntoa(in)); + NT_STATUS_HAVE_NO_MEMORY(*address); + return NT_STATUS_OK; +} + +/* + push a ipv4address +*/ +NTSTATUS tdr_push_ipv4address(struct tdr_push *tdr, const char **address) +{ + uint32_t addr = htonl(interpret_addr(*address)); + TDR_CHECK(tdr_push_uint32(tdr, &addr)); + return NT_STATUS_OK; +} + +/* + print a ipv4address +*/ +NTSTATUS tdr_print_ipv4address(struct tdr_print *tdr, const char *name, + const char **address) +{ + tdr->print(tdr, "%-25s: %s", name, *address); + return NT_STATUS_OK; +} -- cgit From f0b06b36f9d98e67de1b20dc840d317720ba4ab7 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 21 Aug 2005 02:12:25 +0000 Subject: r9442: Support some more primitive types. Fix charset support. (This used to be commit eeced29eb3dd2cbc4540555bdb642b2685eb9c5c) --- source4/lib/tdr/tdr.c | 105 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 90 insertions(+), 15 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index c9aa289f00..8cfbe3695b 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -125,7 +125,7 @@ NTSTATUS tdr_print_uint16(struct tdr_print *tdr, const char *name, uint16_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint16_t *v) +NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint32_t *v) { TDR_PULL_NEED_BYTES(tdr, 4); *v = TDR_IVAL(tdr, tdr->offset); @@ -133,7 +133,7 @@ NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint16_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_push_uint32(struct tdr_push *tdr, const uint16_t *v) +NTSTATUS tdr_push_uint32(struct tdr_push *tdr, const uint32_t *v) { TDR_PUSH_NEED_BYTES(tdr, 4); TDR_SIVAL(tdr, tdr->offset, *v); @@ -147,21 +147,24 @@ NTSTATUS tdr_print_uint32(struct tdr_print *tdr, const char *name, uint32_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, char **v, uint32_t length, uint32_t el_size, int chset) +NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, uint32_t el_size, int chset) { int ret; + if (length == -1) { switch (chset) { - case CH_DOS: - length = ascii_len_n((const char*)tdr->data+tdr->offset, tdr->length-tdr->offset); - break; - case CH_UTF16: - length = utf16_len_n(tdr->data+tdr->offset, tdr->length-tdr->offset); - default: - return NT_STATUS_INVALID_PARAMETER; + case CH_DOS: + length = ascii_len_n((const char*)tdr->data+tdr->offset, tdr->length-tdr->offset); + break; + case CH_UTF16: + length = utf16_len_n(tdr->data+tdr->offset, tdr->length-tdr->offset); + break; + + default: + return NT_STATUS_INVALID_PARAMETER; } } - + TDR_PULL_NEED_BYTES(tdr, el_size*length); ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data+tdr->offset, el_size*length, (void **)v); @@ -175,16 +178,23 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, char **v, uint32_t length, uint3 NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, uint32_t el_size, int chset) { - int ret; - TDR_PUSH_NEED_BYTES(tdr, el_size*length); + ssize_t ret, required; + + required = el_size * length; + TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(CH_UNIX, chset, *v, length, tdr->data+tdr->offset, el_size*length); + ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data+tdr->offset, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; } + + /* Make sure the remaining part of the string is filled with zeroes */ + if (ret < required) { + memset(tdr->data+tdr->offset+ret, 0, required-ret); + } - tdr->offset += ret; + tdr->offset += required; return NT_STATUS_OK; } @@ -227,3 +237,68 @@ NTSTATUS tdr_print_ipv4address(struct tdr_print *tdr, const char *name, tdr->print(tdr, "%-25s: %s", name, *address); return NT_STATUS_OK; } + +/* + parse a hyper +*/ +NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, uint64_t *v) +{ + TDR_PULL_NEED_BYTES(tdr, 8); + *v = TDR_IVAL(tdr, tdr->offset); + *v |= (uint64_t)(TDR_IVAL(tdr, tdr->offset+4)) << 32; + tdr->offset += 8; + return NT_STATUS_OK; +} + +/* + push a hyper +*/ +NTSTATUS tdr_push_hyper(struct tdr_push *tdr, uint64_t *v) +{ + TDR_PUSH_NEED_BYTES(tdr, 8); + TDR_SIVAL(tdr, tdr->offset, ((*v) & 0xFFFFFFFF)); + TDR_SIVAL(tdr, tdr->offset+4, ((*v)>>32)); + tdr->offset += 8; + return NT_STATUS_OK; +} + + + +/* + push a NTTIME +*/ +NTSTATUS tdr_push_NTTIME(struct tdr_push *tdr, NTTIME *t) +{ + TDR_CHECK(tdr_push_hyper(tdr, t)); + return NT_STATUS_OK; +} + +/* + pull a NTTIME +*/ +NTSTATUS tdr_pull_NTTIME(struct tdr_pull *tdr, NTTIME *t) +{ + TDR_CHECK(tdr_pull_hyper(tdr, t)); + return NT_STATUS_OK; +} + +/* + push a time_t +*/ +NTSTATUS tdr_push_time_t(struct tdr_push *tdr, time_t *t) +{ + return tdr_push_uint32(tdr, (uint32_t *)t); +} + +/* + pull a time_t +*/ +NTSTATUS tdr_pull_time_t(struct tdr_pull *tdr, time_t *t) +{ + uint32_t tt; + TDR_CHECK(tdr_pull_uint32(tdr, &tt)); + *t = tt; + return NT_STATUS_OK; +} + + -- cgit From 9796ba264ca1ad8a7ec178ecfec6331d4cac4349 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 21 Aug 2005 13:19:36 +0000 Subject: r9445: Support flags, add DATA_BLOB support (This used to be commit cb5b23f0382ea7e242248cdfbbed82bc4eedfe42) --- source4/lib/tdr/tdr.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 8cfbe3695b..1c84d2229f 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -34,7 +34,7 @@ } \ } while(0) -#define TDR_BE(tdr) ((tdr)->flags & TDR_FLAG_BIGENDIAN) +#define TDR_BE(tdr) ((tdr)->flags & TDR_BIG_ENDIAN) #define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data,ofs):SVAL(tdr->data,ofs)) #define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data,ofs):IVAL(tdr->data,ofs)) @@ -45,11 +45,9 @@ struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, DATA_BLOB *blob) { - struct tdr_pull *tdr = talloc(mem_ctx, struct tdr_pull); + struct tdr_pull *tdr = talloc_zero(mem_ctx, struct tdr_pull); tdr->data = blob->data; tdr->length = blob->length; - tdr->offset = 0; - tdr->flags = 0; return tdr; } @@ -167,7 +165,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data+tdr->offset, el_size*length, (void **)v); + ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -301,4 +299,81 @@ NTSTATUS tdr_pull_time_t(struct tdr_pull *tdr, time_t *t) return NT_STATUS_OK; } +NTSTATUS tdr_print_time_t(struct tdr_print *tdr, const char *name, time_t *t) +{ + if (*t == (time_t)-1 || *t == 0) { + tdr->print(tdr, "%-25s: (time_t)%d", name, (int)*t); + } else { + tdr->print(tdr, "%-25s: %s", name, timestring(tdr, *t)); + } + + return NT_STATUS_OK; +} + +NTSTATUS tdr_print_NTTIME(struct tdr_print *tdr, const char *name, NTTIME *t) +{ + tdr->print(tdr, "%-25s: %s", name, nt_time_string(tdr, *t)); + + return NT_STATUS_OK; +} +NTSTATUS tdr_print_DATA_BLOB(struct tdr_print *tdr, const char *name, DATA_BLOB *r) +{ + tdr->print(tdr, "%-25s: DATA_BLOB length=%u", name, r->length); + if (r->length) { + dump_data(10, r->data, r->length); + } + + return NT_STATUS_OK; +} + +#define TDR_ALIGN(tdr,n) (((tdr)->offset & ((n)-1)) == 0?0:((n)-((tdr)->offset&((n)-1)))) + +/* + push a DATA_BLOB onto the wire. +*/ +NTSTATUS tdr_push_DATA_BLOB(struct tdr_push *tdr, DATA_BLOB *blob) +{ + if (tdr->flags & TDR_ALIGN2) { + blob->length = TDR_ALIGN(tdr, 2); + } else if (tdr->flags & TDR_ALIGN4) { + blob->length = TDR_ALIGN(tdr, 4); + } else if (tdr->flags & TDR_ALIGN8) { + blob->length = TDR_ALIGN(tdr, 8); + } + + TDR_PUSH_NEED_BYTES(tdr, blob->length); + + memcpy(tdr->data+tdr->offset, blob->data, blob->length); + return NT_STATUS_OK; +} + +/* + pull a DATA_BLOB from the wire. +*/ +NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, DATA_BLOB *blob) +{ + uint32_t length; + + if (tdr->flags & TDR_ALIGN2) { + length = TDR_ALIGN(tdr, 2); + } else if (tdr->flags & TDR_ALIGN4) { + length = TDR_ALIGN(tdr, 4); + } else if (tdr->flags & TDR_ALIGN8) { + length = TDR_ALIGN(tdr, 8); + } else if (tdr->flags & TDR_REMAINING) { + length = tdr->length - tdr->offset; + } else { + return NT_STATUS_INVALID_PARAMETER; + } + + if (tdr->length - tdr->offset < length) { + length = tdr->length - tdr->offset; + } + + TDR_PULL_NEED_BYTES(tdr, length); + + *blob = data_blob_talloc(tdr, tdr->data+tdr->offset, length); + tdr->offset += length; + return NT_STATUS_OK; +} -- cgit From c70405cd728c28c1c21c9e1e97279c2e4e9bcc91 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 2 Sep 2005 14:05:28 +0000 Subject: r9957: Switch to using DATA_BLOBs internally in TDR (This used to be commit 351149d160e893a3fdd4a5b11ec4b4b2bbf264a9) --- source4/lib/tdr/tdr.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 1c84d2229f..1d859fdcd5 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -29,25 +29,24 @@ #define TDR_PUSH_NEED_BYTES(tdr, n) TDR_CHECK(tdr_push_expand(tdr, tdr->offset+(n))) #define TDR_PULL_NEED_BYTES(tdr, n) do { \ - if ((n) > tdr->length || tdr->offset + (n) > tdr->length) { \ + if ((n) > tdr->data.length || tdr->offset + (n) > tdr->data.length) { \ return NT_STATUS_BUFFER_TOO_SMALL; \ } \ } while(0) #define TDR_BE(tdr) ((tdr)->flags & TDR_BIG_ENDIAN) -#define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data,ofs):SVAL(tdr->data,ofs)) -#define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data,ofs):IVAL(tdr->data,ofs)) -#define TDR_IVALS(tdr, ofs) (TDR_BE(tdr)?RIVALS(tdr->data,ofs):IVALS(tdr->data,ofs)) -#define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data,ofs,v); } else SSVAL(tdr->data,ofs,v); } while (0) -#define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data,ofs,v); } else SIVAL(tdr->data,ofs,v); } while (0) -#define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data,ofs,v); } else SIVALS(tdr->data,ofs,v); } while (0) +#define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data.data,ofs):SVAL(tdr->data.data,ofs)) +#define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data.data,ofs):IVAL(tdr->data.data,ofs)) +#define TDR_IVALS(tdr, ofs) (TDR_BE(tdr)?RIVALS(tdr->data.data,ofs):IVALS(tdr->data.data,ofs)) +#define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data.data,ofs,v); } else SSVAL(tdr->data.data,ofs,v); } while (0) +#define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data.data,ofs,v); } else SIVAL(tdr->data.data,ofs,v); } while (0) +#define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data.data,ofs,v); } else SIVALS(tdr->data.data,ofs,v); } while (0) -struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, DATA_BLOB *blob) +struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) { struct tdr_pull *tdr = talloc_zero(mem_ctx, struct tdr_pull); - tdr->data = blob->data; - tdr->length = blob->length; + tdr->data = *blob; return tdr; } @@ -66,15 +65,11 @@ struct tdr_print *tdr_print_init(TALLOC_CTX *mem_ctx) */ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) { - if (tdr->alloc_size >= size) { + if (talloc_get_size(tdr->data.data) >= size) { return NT_STATUS_OK; } - tdr->alloc_size += TDR_BASE_MARSHALL_SIZE; - if (size > tdr->alloc_size) { - tdr->length = size; - } - tdr->data = talloc_realloc(tdr, tdr->data, uint8_t, tdr->alloc_size); + tdr->data.data = talloc_realloc(tdr, tdr->data.data, uint8_t, tdr->data.length + TDR_BASE_MARSHALL_SIZE); return NT_STATUS_NO_MEMORY; } @@ -82,7 +77,7 @@ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) { TDR_PULL_NEED_BYTES(tdr, 1); - SCVAL(tdr->data, tdr->offset, *v); + SCVAL(tdr->data.data, tdr->offset, *v); tdr->offset += 1; return NT_STATUS_OK; } @@ -90,7 +85,7 @@ NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) NTSTATUS tdr_push_uint8(struct tdr_push *tdr, const uint8_t *v) { TDR_PUSH_NEED_BYTES(tdr, 1); - SCVAL(tdr->data, tdr->offset, *v); + SCVAL(tdr->data.data, tdr->offset, *v); tdr->offset += 1; return NT_STATUS_OK; } @@ -152,10 +147,10 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, if (length == -1) { switch (chset) { case CH_DOS: - length = ascii_len_n((const char*)tdr->data+tdr->offset, tdr->length-tdr->offset); + length = ascii_len_n((const char*)tdr->data.data+tdr->offset, tdr->data.length-tdr->offset); break; case CH_UTF16: - length = utf16_len_n(tdr->data+tdr->offset, tdr->length-tdr->offset); + length = utf16_len_n(tdr->data.data+tdr->offset, tdr->data.length-tdr->offset); break; default: @@ -165,7 +160,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data+tdr->offset, el_size*length, discard_const_p(void *, v)); + ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -181,7 +176,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data+tdr->offset, required); + ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->offset, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -189,7 +184,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, /* Make sure the remaining part of the string is filled with zeroes */ if (ret < required) { - memset(tdr->data+tdr->offset+ret, 0, required-ret); + memset(tdr->data.data+tdr->offset+ret, 0, required-ret); } tdr->offset += required; @@ -344,7 +339,7 @@ NTSTATUS tdr_push_DATA_BLOB(struct tdr_push *tdr, DATA_BLOB *blob) TDR_PUSH_NEED_BYTES(tdr, blob->length); - memcpy(tdr->data+tdr->offset, blob->data, blob->length); + memcpy(tdr->data.data+tdr->offset, blob->data, blob->length); return NT_STATUS_OK; } @@ -362,18 +357,18 @@ NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, DATA_BLOB *blob) } else if (tdr->flags & TDR_ALIGN8) { length = TDR_ALIGN(tdr, 8); } else if (tdr->flags & TDR_REMAINING) { - length = tdr->length - tdr->offset; + length = tdr->data.length - tdr->offset; } else { return NT_STATUS_INVALID_PARAMETER; } - if (tdr->length - tdr->offset < length) { - length = tdr->length - tdr->offset; + if (tdr->data.length - tdr->offset < length) { + length = tdr->data.length - tdr->offset; } TDR_PULL_NEED_BYTES(tdr, length); - *blob = data_blob_talloc(tdr, tdr->data+tdr->offset, length); + *blob = data_blob_talloc(tdr, tdr->data.data+tdr->offset, length); tdr->offset += length; return NT_STATUS_OK; } -- cgit From 52d995feb0565b458e026063e3bf3c259846bc8e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 2 Sep 2005 14:45:40 +0000 Subject: r9959: Fix bug where data offset was incorrect after parsing element with [charset] (This used to be commit b17478229e8e9220858fcc85a19ec751450f969d) --- source4/lib/tdr/tdr.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 1d859fdcd5..c16a05ecf0 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -43,23 +43,6 @@ #define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data.data,ofs,v); } else SIVAL(tdr->data.data,ofs,v); } while (0) #define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data.data,ofs,v); } else SIVALS(tdr->data.data,ofs,v); } while (0) -struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob) -{ - struct tdr_pull *tdr = talloc_zero(mem_ctx, struct tdr_pull); - tdr->data = *blob; - return tdr; -} - -struct tdr_push *tdr_push_init(TALLOC_CTX *mem_ctx) -{ - return talloc_zero(mem_ctx, struct tdr_push); -} - -struct tdr_print *tdr_print_init(TALLOC_CTX *mem_ctx) -{ - return talloc_zero(mem_ctx, struct tdr_print); -} - /* expand the available space in the buffer to 'size' */ @@ -166,6 +149,8 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, return NT_STATUS_INVALID_PARAMETER; } + tdr->offset += length * el_size; + return NT_STATUS_OK; } -- cgit From 102a6ec95b2487d4ef13de2120be00e2818cce23 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 3 Sep 2005 19:43:35 +0000 Subject: r10009: Fix bug in uint8 parsing functions (This used to be commit abb0db12185a3b3ef7da16fa3d742336afeb8ef0) --- source4/lib/tdr/tdr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index c16a05ecf0..e55060da25 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -36,9 +36,11 @@ #define TDR_BE(tdr) ((tdr)->flags & TDR_BIG_ENDIAN) +#define TDR_CVAL(tdr, ofs) CVAL(tdr->data.data,ofs) #define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data.data,ofs):SVAL(tdr->data.data,ofs)) #define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data.data,ofs):IVAL(tdr->data.data,ofs)) #define TDR_IVALS(tdr, ofs) (TDR_BE(tdr)?RIVALS(tdr->data.data,ofs):IVALS(tdr->data.data,ofs)) +#define TDR_SCVAL(tdr, ofs, v) SCVAL(tdr->data.data,ofs,v) #define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data.data,ofs,v); } else SSVAL(tdr->data.data,ofs,v); } while (0) #define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data.data,ofs,v); } else SIVAL(tdr->data.data,ofs,v); } while (0) #define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data.data,ofs,v); } else SIVALS(tdr->data.data,ofs,v); } while (0) @@ -60,7 +62,7 @@ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) { TDR_PULL_NEED_BYTES(tdr, 1); - SCVAL(tdr->data.data, tdr->offset, *v); + *v = TDR_CVAL(tdr, tdr->offset); tdr->offset += 1; return NT_STATUS_OK; } @@ -68,7 +70,7 @@ NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) NTSTATUS tdr_push_uint8(struct tdr_push *tdr, const uint8_t *v) { TDR_PUSH_NEED_BYTES(tdr, 1); - SCVAL(tdr->data.data, tdr->offset, *v); + TDR_SCVAL(tdr, tdr->offset, *v); tdr->offset += 1; return NT_STATUS_OK; } -- cgit From 6a2c9e729fc8f576eacb7518d379839edf25d4e1 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 3 Sep 2005 22:56:02 +0000 Subject: r10013: Support zero-sized strings. (This used to be commit cf3be71c33ec8e43c883ce05fd1a63d1178446ad) --- source4/lib/tdr/tdr.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index e55060da25..7f42d0cf15 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -143,6 +143,11 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, } } + if (length == 0) { + *v = talloc_strdup(tdr, ""); + return NT_STATUS_OK; + } + TDR_PULL_NEED_BYTES(tdr, el_size*length); ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); -- cgit From 16788f27a8f56f39f6d272427655b9869d6c3005 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 4 Sep 2005 02:01:42 +0000 Subject: r10019: Only return NT_STATUS_NO_MEMORY if the alloc failed.. (This used to be commit ea92959209fa256a8190df19e8c27b368169724f) --- source4/lib/tdr/tdr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 7f42d0cf15..e1e54622ac 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -55,7 +55,11 @@ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) } tdr->data.data = talloc_realloc(tdr, tdr->data.data, uint8_t, tdr->data.length + TDR_BASE_MARSHALL_SIZE); - return NT_STATUS_NO_MEMORY; + + if (tdr->data.data == NULL) + return NT_STATUS_NO_MEMORY; + + return NT_STATUS_OK; } -- cgit From f4910eff485b0ad786c063870ff79a9391e0927b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 4 Sep 2005 17:25:04 +0000 Subject: r10027: Use blob length for keeping track of buffer length, add TODO (This used to be commit a924bec84b6d0a84db05c4315126474c9248fe2d) --- source4/lib/tdr/tdr.c | 66 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 21 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index e1e54622ac..fdb6f1ca6e 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -23,10 +23,11 @@ #include "includes.h" #include "system/network.h" +#include "system/filesys.h" #define TDR_BASE_MARSHALL_SIZE 1024 -#define TDR_PUSH_NEED_BYTES(tdr, n) TDR_CHECK(tdr_push_expand(tdr, tdr->offset+(n))) +#define TDR_PUSH_NEED_BYTES(tdr, n) TDR_CHECK(tdr_push_expand(tdr, tdr->data.length+(n))) #define TDR_PULL_NEED_BYTES(tdr, n) do { \ if ((n) > tdr->data.length || tdr->offset + (n) > tdr->data.length) { \ @@ -74,8 +75,8 @@ NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) NTSTATUS tdr_push_uint8(struct tdr_push *tdr, const uint8_t *v) { TDR_PUSH_NEED_BYTES(tdr, 1); - TDR_SCVAL(tdr, tdr->offset, *v); - tdr->offset += 1; + TDR_SCVAL(tdr, tdr->data.length, *v); + tdr->data.length += 1; return NT_STATUS_OK; } @@ -96,8 +97,8 @@ NTSTATUS tdr_pull_uint16(struct tdr_pull *tdr, uint16_t *v) NTSTATUS tdr_push_uint16(struct tdr_push *tdr, const uint16_t *v) { TDR_PUSH_NEED_BYTES(tdr, 2); - TDR_SSVAL(tdr, tdr->offset, *v); - tdr->offset += 2; + TDR_SSVAL(tdr, tdr->data.length, *v); + tdr->data.length += 2; return NT_STATUS_OK; } @@ -118,8 +119,8 @@ NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint32_t *v) NTSTATUS tdr_push_uint32(struct tdr_push *tdr, const uint32_t *v) { TDR_PUSH_NEED_BYTES(tdr, 4); - TDR_SIVAL(tdr, tdr->offset, *v); - tdr->offset += 4; + TDR_SIVAL(tdr, tdr->data.length, *v); + tdr->data.length += 4; return NT_STATUS_OK; } @@ -172,7 +173,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->offset, required); + ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -180,10 +181,10 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, /* Make sure the remaining part of the string is filled with zeroes */ if (ret < required) { - memset(tdr->data.data+tdr->offset+ret, 0, required-ret); + memset(tdr->data.data+tdr->data.length+ret, 0, required-ret); } - tdr->offset += required; + tdr->data.length += required; return NT_STATUS_OK; } @@ -245,9 +246,9 @@ NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, uint64_t *v) NTSTATUS tdr_push_hyper(struct tdr_push *tdr, uint64_t *v) { TDR_PUSH_NEED_BYTES(tdr, 8); - TDR_SIVAL(tdr, tdr->offset, ((*v) & 0xFFFFFFFF)); - TDR_SIVAL(tdr, tdr->offset+4, ((*v)>>32)); - tdr->offset += 8; + TDR_SIVAL(tdr, tdr->data.length, ((*v) & 0xFFFFFFFF)); + TDR_SIVAL(tdr, tdr->data.length+4, ((*v)>>32)); + tdr->data.length += 8; return NT_STATUS_OK; } @@ -318,7 +319,7 @@ NTSTATUS tdr_print_DATA_BLOB(struct tdr_print *tdr, const char *name, DATA_BLOB return NT_STATUS_OK; } -#define TDR_ALIGN(tdr,n) (((tdr)->offset & ((n)-1)) == 0?0:((n)-((tdr)->offset&((n)-1)))) +#define TDR_ALIGN(l,n) (((l) & ((n)-1)) == 0?0:((n)-((l)&((n)-1)))) /* push a DATA_BLOB onto the wire. @@ -326,16 +327,16 @@ NTSTATUS tdr_print_DATA_BLOB(struct tdr_print *tdr, const char *name, DATA_BLOB NTSTATUS tdr_push_DATA_BLOB(struct tdr_push *tdr, DATA_BLOB *blob) { if (tdr->flags & TDR_ALIGN2) { - blob->length = TDR_ALIGN(tdr, 2); + blob->length = TDR_ALIGN(tdr->data.length, 2); } else if (tdr->flags & TDR_ALIGN4) { - blob->length = TDR_ALIGN(tdr, 4); + blob->length = TDR_ALIGN(tdr->data.length, 4); } else if (tdr->flags & TDR_ALIGN8) { - blob->length = TDR_ALIGN(tdr, 8); + blob->length = TDR_ALIGN(tdr->data.length, 8); } TDR_PUSH_NEED_BYTES(tdr, blob->length); - memcpy(tdr->data.data+tdr->offset, blob->data, blob->length); + memcpy(tdr->data.data+tdr->data.length, blob->data, blob->length); return NT_STATUS_OK; } @@ -347,11 +348,11 @@ NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, DATA_BLOB *blob) uint32_t length; if (tdr->flags & TDR_ALIGN2) { - length = TDR_ALIGN(tdr, 2); + length = TDR_ALIGN(tdr->offset, 2); } else if (tdr->flags & TDR_ALIGN4) { - length = TDR_ALIGN(tdr, 4); + length = TDR_ALIGN(tdr->offset, 4); } else if (tdr->flags & TDR_ALIGN8) { - length = TDR_ALIGN(tdr, 8); + length = TDR_ALIGN(tdr->offset, 8); } else if (tdr->flags & TDR_REMAINING) { length = tdr->data.length - tdr->offset; } else { @@ -368,3 +369,26 @@ NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, DATA_BLOB *blob) tdr->offset += length; return NT_STATUS_OK; } + +NTSTATUS tdr_push_to_fd(int fd, tdr_push_fn_t push_fn, const void *p) +{ + struct tdr_push *push = talloc_zero(NULL, struct tdr_push); + + if (push == NULL) + return NT_STATUS_NO_MEMORY; + + if (NT_STATUS_IS_ERR(push_fn(push, p))) { + DEBUG(1, ("Error pushing data\n")); + talloc_free(push); + return NT_STATUS_UNSUCCESSFUL; + } + + if (write(fd, push->data.data, push->data.length) < push->data.length) { + DEBUG(1, ("Error writing all data\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + talloc_free(push); + + return NT_STATUS_OK; +} -- cgit From a3e0e69196cc5e3420ebb1a83b026ee36cbaab83 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 4 Sep 2005 20:17:21 +0000 Subject: r10030: Add hierarchical memory allocation to TDR's pull functions (This used to be commit 0e358de93a007db921ad5e9a892114122254de39) --- source4/lib/tdr/tdr.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index fdb6f1ca6e..34611683e2 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -64,7 +64,7 @@ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) } -NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, uint8_t *v) +NTSTATUS tdr_pull_uint8(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint8_t *v) { TDR_PULL_NEED_BYTES(tdr, 1); *v = TDR_CVAL(tdr, tdr->offset); @@ -86,7 +86,7 @@ NTSTATUS tdr_print_uint8(struct tdr_print *tdr, const char *name, uint8_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_uint16(struct tdr_pull *tdr, uint16_t *v) +NTSTATUS tdr_pull_uint16(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint16_t *v) { TDR_PULL_NEED_BYTES(tdr, 2); *v = TDR_SVAL(tdr, tdr->offset); @@ -108,7 +108,7 @@ NTSTATUS tdr_print_uint16(struct tdr_print *tdr, const char *name, uint16_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, uint32_t *v) +NTSTATUS tdr_pull_uint32(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint32_t *v) { TDR_PULL_NEED_BYTES(tdr, 4); *v = TDR_IVAL(tdr, tdr->offset); @@ -130,7 +130,7 @@ NTSTATUS tdr_print_uint32(struct tdr_print *tdr, const char *name, uint32_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, uint32_t el_size, int chset) +NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, uint32_t length, uint32_t el_size, int chset) { int ret; @@ -149,13 +149,13 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, const char **v, uint32_t length, } if (length == 0) { - *v = talloc_strdup(tdr, ""); + *v = talloc_strdup(ctx, ""); return NT_STATUS_OK; } TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(tdr, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); + ret = convert_string_talloc(ctx, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -198,10 +198,10 @@ NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char * /* pull a ipv4address */ -NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, const char **address) +NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **address) { struct ipv4_addr in; - TDR_CHECK(tdr_pull_uint32(tdr, &in.addr)); + TDR_CHECK(tdr_pull_uint32(tdr, ctx, &in.addr)); in.addr = htonl(in.addr); *address = talloc_strdup(tdr, sys_inet_ntoa(in)); NT_STATUS_HAVE_NO_MEMORY(*address); @@ -231,7 +231,7 @@ NTSTATUS tdr_print_ipv4address(struct tdr_print *tdr, const char *name, /* parse a hyper */ -NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, uint64_t *v) +NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint64_t *v) { TDR_PULL_NEED_BYTES(tdr, 8); *v = TDR_IVAL(tdr, tdr->offset); @@ -266,9 +266,9 @@ NTSTATUS tdr_push_NTTIME(struct tdr_push *tdr, NTTIME *t) /* pull a NTTIME */ -NTSTATUS tdr_pull_NTTIME(struct tdr_pull *tdr, NTTIME *t) +NTSTATUS tdr_pull_NTTIME(struct tdr_pull *tdr, TALLOC_CTX *ctx, NTTIME *t) { - TDR_CHECK(tdr_pull_hyper(tdr, t)); + TDR_CHECK(tdr_pull_hyper(tdr, ctx, t)); return NT_STATUS_OK; } @@ -283,10 +283,10 @@ NTSTATUS tdr_push_time_t(struct tdr_push *tdr, time_t *t) /* pull a time_t */ -NTSTATUS tdr_pull_time_t(struct tdr_pull *tdr, time_t *t) +NTSTATUS tdr_pull_time_t(struct tdr_pull *tdr, TALLOC_CTX *ctx, time_t *t) { uint32_t tt; - TDR_CHECK(tdr_pull_uint32(tdr, &tt)); + TDR_CHECK(tdr_pull_uint32(tdr, ctx, &tt)); *t = tt; return NT_STATUS_OK; } @@ -343,7 +343,7 @@ NTSTATUS tdr_push_DATA_BLOB(struct tdr_push *tdr, DATA_BLOB *blob) /* pull a DATA_BLOB from the wire. */ -NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, DATA_BLOB *blob) +NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, TALLOC_CTX *ctx, DATA_BLOB *blob) { uint32_t length; -- cgit From e264c8b6dd207862a618627ef288e3ca0a33fe0f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 2 Oct 2005 14:29:08 +0000 Subject: r10678: Add debug helper Fix push for non-fixed length strings (This used to be commit 821b0bb56f6d6b9df7bbdeeddc206505f3f0a7c2) --- source4/lib/tdr/tdr.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 34611683e2..4a8d05a8ab 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -170,6 +170,10 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, { ssize_t ret, required; + if (length == -1) { + length = strlen(*v) + 1; /* Extra element for null character */ + } + required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); @@ -392,3 +396,21 @@ NTSTATUS tdr_push_to_fd(int fd, tdr_push_fn_t push_fn, const void *p) return NT_STATUS_OK; } + +void tdr_print_debug_helper(struct tdr_print *tdr, const char *format, ...) _PRINTF_ATTRIBUTE(2,3) +{ + va_list ap; + char *s = NULL; + int i; + + va_start(ap, format); + vasprintf(&s, format, ap); + va_end(ap); + + for (i=0;ilevel;i++) { + DEBUG(0,(" ")); + } + + DEBUG(0,("%s\n", s)); + free(s); +} -- cgit From 0a3c167f6bcf08b2204ca49831ca49eef73dcbf4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Dec 2005 22:51:30 +0000 Subject: r12528: Add seperate proto headers for ntvfs, tdr, smb_server and nbt_server. (This used to be commit 87f665a1d5ba74289974bf9d8f9441c162e6f1b1) --- source4/lib/tdr/tdr.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 4a8d05a8ab..5ebe3f0852 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -24,6 +24,7 @@ #include "includes.h" #include "system/network.h" #include "system/filesys.h" +#include "tdr/tdr.h" #define TDR_BASE_MARSHALL_SIZE 1024 -- cgit From 5c8447773f306e302c7182611e4fc03978c340b6 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 9 Jan 2006 21:44:30 +0000 Subject: r12801: Some more include/ cleanups (remove unused macros + move files to specific dirs) (This used to be commit 243cf760b077e155f5ac508aeebf819f7708a84e) --- source4/lib/tdr/tdr.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 5ebe3f0852..cd1650e30d 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -41,11 +41,9 @@ #define TDR_CVAL(tdr, ofs) CVAL(tdr->data.data,ofs) #define TDR_SVAL(tdr, ofs) (TDR_BE(tdr)?RSVAL(tdr->data.data,ofs):SVAL(tdr->data.data,ofs)) #define TDR_IVAL(tdr, ofs) (TDR_BE(tdr)?RIVAL(tdr->data.data,ofs):IVAL(tdr->data.data,ofs)) -#define TDR_IVALS(tdr, ofs) (TDR_BE(tdr)?RIVALS(tdr->data.data,ofs):IVALS(tdr->data.data,ofs)) #define TDR_SCVAL(tdr, ofs, v) SCVAL(tdr->data.data,ofs,v) #define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data.data,ofs,v); } else SSVAL(tdr->data.data,ofs,v); } while (0) #define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data.data,ofs,v); } else SIVAL(tdr->data.data,ofs,v); } while (0) -#define TDR_SIVALS(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVALS(tdr->data.data,ofs,v); } else SIVALS(tdr->data.data,ofs,v); } while (0) /* expand the available space in the buffer to 'size' -- cgit From b785a7c40c185512207ef8da837a766933073032 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 21:36:36 +0000 Subject: r14492: Fix shared libs - set SO_VERSION to 0 everywhere for now. (This used to be commit 4682bc5ce047d81586447b9df82c91ed1fe677cf) --- source4/lib/tdr/tdr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index cd1650e30d..e108473708 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -129,7 +129,7 @@ NTSTATUS tdr_print_uint32(struct tdr_print *tdr, const char *name, uint32_t *v) return NT_STATUS_OK; } -NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, uint32_t length, uint32_t el_size, int chset) +NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, uint32_t length, uint32_t el_size, charset_t chset) { int ret; @@ -165,7 +165,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, return NT_STATUS_OK; } -NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, uint32_t el_size, int chset) +NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, uint32_t el_size, charset_t chset) { ssize_t ret, required; @@ -192,7 +192,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, return NT_STATUS_OK; } -NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char **v, uint32_t length, uint32_t el_size, int chset) +NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char **v, uint32_t length, uint32_t el_size, charset_t chset) { tdr->print(tdr, "%-25s: %s", name, *v); return NT_STATUS_OK; -- cgit From c09504ac33a319a48db608b914a05f2049b53550 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 27 Sep 2006 11:15:03 +0000 Subject: r18948: fix the build on solaris, the ioctl() prototype in unistd.h was included after libreplace defined ioctl swrap_ioctl metze (This used to be commit 55b25a9fcfa5ddf290e371c2bcad8ad07969f19a) --- source4/lib/tdr/tdr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index e108473708..22893b18ea 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -22,8 +22,8 @@ */ #include "includes.h" -#include "system/network.h" #include "system/filesys.h" +#include "system/network.h" #include "tdr/tdr.h" #define TDR_BASE_MARSHALL_SIZE 1024 -- cgit From 576b1c84fb9c5de642b549d769764488436f2c5f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 18 Jun 2007 21:48:57 +0000 Subject: r23542: Include function documentation in prototype headers. (This used to be commit 03eef5f337446f04239e0b2f840213f0aa7d6ea1) --- source4/lib/tdr/tdr.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 22893b18ea..5d645c4ff3 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -45,7 +45,7 @@ #define TDR_SSVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSSVAL(tdr->data.data,ofs,v); } else SSVAL(tdr->data.data,ofs,v); } while (0) #define TDR_SIVAL(tdr, ofs, v) do { if (TDR_BE(tdr)) { RSIVAL(tdr->data.data,ofs,v); } else SIVAL(tdr->data.data,ofs,v); } while (0) -/* +/** expand the available space in the buffer to 'size' */ NTSTATUS tdr_push_expand(struct tdr_push *tdr, uint32_t size) @@ -198,10 +198,11 @@ NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char * return NT_STATUS_OK; } -/* +/** pull a ipv4address */ -NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **address) +NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, TALLOC_CTX *ctx, + const char **address) { struct ipv4_addr in; TDR_CHECK(tdr_pull_uint32(tdr, ctx, &in.addr)); @@ -211,7 +212,7 @@ NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char return NT_STATUS_OK; } -/* +/** push a ipv4address */ NTSTATUS tdr_push_ipv4address(struct tdr_push *tdr, const char **address) @@ -221,7 +222,7 @@ NTSTATUS tdr_push_ipv4address(struct tdr_push *tdr, const char **address) return NT_STATUS_OK; } -/* +/** print a ipv4address */ NTSTATUS tdr_print_ipv4address(struct tdr_print *tdr, const char *name, @@ -231,7 +232,7 @@ NTSTATUS tdr_print_ipv4address(struct tdr_print *tdr, const char *name, return NT_STATUS_OK; } -/* +/** parse a hyper */ NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint64_t *v) @@ -243,7 +244,7 @@ NTSTATUS tdr_pull_hyper(struct tdr_pull *tdr, TALLOC_CTX *ctx, uint64_t *v) return NT_STATUS_OK; } -/* +/** push a hyper */ NTSTATUS tdr_push_hyper(struct tdr_push *tdr, uint64_t *v) @@ -255,9 +256,7 @@ NTSTATUS tdr_push_hyper(struct tdr_push *tdr, uint64_t *v) return NT_STATUS_OK; } - - -/* +/** push a NTTIME */ NTSTATUS tdr_push_NTTIME(struct tdr_push *tdr, NTTIME *t) @@ -266,7 +265,7 @@ NTSTATUS tdr_push_NTTIME(struct tdr_push *tdr, NTTIME *t) return NT_STATUS_OK; } -/* +/** pull a NTTIME */ NTSTATUS tdr_pull_NTTIME(struct tdr_pull *tdr, TALLOC_CTX *ctx, NTTIME *t) @@ -275,7 +274,7 @@ NTSTATUS tdr_pull_NTTIME(struct tdr_pull *tdr, TALLOC_CTX *ctx, NTTIME *t) return NT_STATUS_OK; } -/* +/** push a time_t */ NTSTATUS tdr_push_time_t(struct tdr_push *tdr, time_t *t) @@ -283,7 +282,7 @@ NTSTATUS tdr_push_time_t(struct tdr_push *tdr, time_t *t) return tdr_push_uint32(tdr, (uint32_t *)t); } -/* +/** pull a time_t */ NTSTATUS tdr_pull_time_t(struct tdr_pull *tdr, TALLOC_CTX *ctx, time_t *t) -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/lib/tdr/tdr.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 5d645c4ff3..144cfa3e35 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -8,7 +8,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, @@ -17,8 +17,7 @@ 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 . */ #include "includes.h" -- cgit From b09047b78e981af8ade6a72d426bfcb0e742995b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 13 Oct 2007 20:24:37 +0200 Subject: r25624: Remove ipv4_addr hack. Only causes 4 extra includes of system/network.h because we stripped down includes. (This used to be commit 262c1c23a61f1f4fae13e0a61179fe98b682cecf) --- source4/lib/tdr/tdr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 144cfa3e35..8037c6de0a 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -203,10 +203,10 @@ NTSTATUS tdr_print_charset(struct tdr_print *tdr, const char *name, const char * NTSTATUS tdr_pull_ipv4address(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **address) { - struct ipv4_addr in; - TDR_CHECK(tdr_pull_uint32(tdr, ctx, &in.addr)); - in.addr = htonl(in.addr); - *address = talloc_strdup(tdr, sys_inet_ntoa(in)); + struct in_addr in; + TDR_CHECK(tdr_pull_uint32(tdr, ctx, &in.s_addr)); + in.s_addr = htonl(in.s_addr); + *address = talloc_strdup(tdr, inet_ntoa(in)); NT_STATUS_HAVE_NO_MEMORY(*address); return NT_STATUS_OK; } -- cgit From 39ee38d9c1aabf4db065b433d067d0da053d7d61 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 6 Dec 2007 17:52:23 +0100 Subject: r26316: Use contexts for conversion functions. (This used to be commit f6420d933b5b011d428974f3a2a57edf19e6f482) --- source4/lib/tdr/tdr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 8037c6de0a..0757a02e47 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -153,7 +153,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(ctx, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); + ret = convert_string_talloc(ctx, global_smb_iconv_convenience, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -175,7 +175,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); + ret = convert_string(global_smb_iconv_convenience, CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; -- cgit From d891c0c74a03d797aed1c5ac0329fd9d1d78da63 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:09 +0100 Subject: r26429: Avoid use of global_smb_iconv_convenience. (This used to be commit d37136b7abfbba75ef2e5ab855eb3382b9648b8c) --- source4/lib/tdr/tdr.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 0757a02e47..80e1d9ae24 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -24,6 +24,7 @@ #include "system/filesys.h" #include "system/network.h" #include "tdr/tdr.h" +#include "param/param.h" #define TDR_BASE_MARSHALL_SIZE 1024 @@ -153,7 +154,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(ctx, global_smb_iconv_convenience, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); + ret = convert_string_talloc(ctx, lp_iconv_convenience(global_loadparm), chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -175,7 +176,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(global_smb_iconv_convenience, CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); + ret = convert_string(lp_iconv_convenience(global_loadparm), CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -404,9 +405,7 @@ void tdr_print_debug_helper(struct tdr_print *tdr, const char *format, ...) _PRI vasprintf(&s, format, ap); va_end(ap); - for (i=0;ilevel;i++) { - DEBUG(0,(" ")); - } + for (i=0;ilevel;i++) { DEBUG(0,(" ")); } DEBUG(0,("%s\n", s)); free(s); -- cgit From 5e00673a4063c9a51580a36ba1f824bd8ea0de66 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:47 +0100 Subject: r26438: Store iconv convenience in tdr push contexts. (This used to be commit dffef3162778aebe2f8d77e2da60b22adb7d60ef) --- source4/lib/tdr/tdr.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 80e1d9ae24..1a52f10569 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -176,7 +176,7 @@ NTSTATUS tdr_push_charset(struct tdr_push *tdr, const char **v, uint32_t length, required = el_size * length; TDR_PUSH_NEED_BYTES(tdr, required); - ret = convert_string(lp_iconv_convenience(global_loadparm), CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); + ret = convert_string(tdr->iconv_convenience, CH_UNIX, chset, *v, strlen(*v), tdr->data.data+tdr->data.length, required); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; @@ -372,10 +372,22 @@ NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, TALLOC_CTX *ctx, DATA_BLOB *bl return NT_STATUS_OK; } -NTSTATUS tdr_push_to_fd(int fd, tdr_push_fn_t push_fn, const void *p) +struct tdr_push *tdr_push_init(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *ic) { struct tdr_push *push = talloc_zero(NULL, struct tdr_push); + if (push == NULL) + return NULL; + + push->iconv_convenience = talloc_reference(push, ic); + + return push; +} + +NTSTATUS tdr_push_to_fd(int fd, struct smb_iconv_convenience *iconv_convenience, tdr_push_fn_t push_fn, const void *p) +{ + struct tdr_push *push = tdr_push_init(NULL, iconv_convenience); + if (push == NULL) return NT_STATUS_NO_MEMORY; -- cgit From 27b21a386ebeed66dd804a8b2e2256b739e32543 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:51 +0100 Subject: r26439: Require tdr_pull users to specify a smb_iconv convenience context. (This used to be commit 76fd57be292fb19ae4ede38977732847e6ed8eff) --- source4/lib/tdr/tdr.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index 1a52f10569..f75cac9810 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -374,7 +374,7 @@ NTSTATUS tdr_pull_DATA_BLOB(struct tdr_pull *tdr, TALLOC_CTX *ctx, DATA_BLOB *bl struct tdr_push *tdr_push_init(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *ic) { - struct tdr_push *push = talloc_zero(NULL, struct tdr_push); + struct tdr_push *push = talloc_zero(mem_ctx, struct tdr_push); if (push == NULL) return NULL; @@ -384,6 +384,18 @@ struct tdr_push *tdr_push_init(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience return push; } +struct tdr_pull *tdr_pull_init(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *ic) +{ + struct tdr_pull *pull = talloc_zero(mem_ctx, struct tdr_pull); + + if (pull == NULL) + return NULL; + + pull->iconv_convenience = talloc_reference(pull, ic); + + return pull; +} + NTSTATUS tdr_push_to_fd(int fd, struct smb_iconv_convenience *iconv_convenience, tdr_push_fn_t push_fn, const void *p) { struct tdr_push *push = tdr_push_init(NULL, iconv_convenience); -- cgit From 37deca2d41d74faa7abe060a21340263bd6d66f7 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 21 Feb 2008 14:16:02 +0100 Subject: Avoid use of global_loadparm. (This used to be commit c5a95bbe0ce55c29e135a9c6058bf192ec3bb546) --- source4/lib/tdr/tdr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/tdr/tdr.c') diff --git a/source4/lib/tdr/tdr.c b/source4/lib/tdr/tdr.c index f75cac9810..2ad099174d 100644 --- a/source4/lib/tdr/tdr.c +++ b/source4/lib/tdr/tdr.c @@ -154,7 +154,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v, TDR_PULL_NEED_BYTES(tdr, el_size*length); - ret = convert_string_talloc(ctx, lp_iconv_convenience(global_loadparm), chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); + ret = convert_string_talloc(ctx, tdr->iconv_convenience, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v)); if (ret == -1) { return NT_STATUS_INVALID_PARAMETER; -- cgit