diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-07-23 10:52:39 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:28:54 -0500 |
commit | 944fe69d03f1fcd6ab680fcb672d06036f89f251 (patch) | |
tree | 9160931b1fc8b1a391bad7d39f3bdb05e33d7ee3 /source3/smbd/srvstr.c | |
parent | 9e40557047b32dae012b0b5a3450c2c23b7895e5 (diff) | |
download | samba-944fe69d03f1fcd6ab680fcb672d06036f89f251.tar.gz |
r24000: Add message_push_blob() and message_push_string().
The proposed new API convention is to start with a 0 bcc length and then
push things step by step. These routines reallocate the outbuf and
adjust the length and bcc fields as necessary.
(This used to be commit 624f1fe4f6e022d73e78fa8c9646f6f64035f3ee)
Diffstat (limited to 'source3/smbd/srvstr.c')
-rw-r--r-- | source3/smbd/srvstr.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/source3/smbd/srvstr.c b/source3/smbd/srvstr.c index 4462a423c86..1daa25553f8 100644 --- a/source3/smbd/srvstr.c +++ b/source3/smbd/srvstr.c @@ -41,3 +41,43 @@ size_t srvstr_push_fn(const char *function, unsigned int line, /* 'normal' push into size-specified buffer */ return push_string_fn(function, line, base_ptr, dest, src, dest_len, flags); } + +/******************************************************************* + Add a string to the end of a smb_buf, adjusting bcc and smb_len. + Return the bytes added +********************************************************************/ + +ssize_t message_push_string(uint8 **outbuf, const char *str, int flags) +{ + size_t buf_size = smb_len(*outbuf) + 4; + size_t grow_size; + size_t result; + uint8 *tmp; + + /* + * We need to over-allocate, now knowing what srvstr_push will + * actually use. This is very generous by incorporating potential + * padding, the terminating 0 and at most 4 chars per UTF-16 code + * point. + */ + grow_size = (strlen(str) + 2) * 4; + + if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, + buf_size + grow_size))) { + DEBUG(0, ("talloc failed\n")); + return -1; + } + + result = srvstr_push((char *)tmp, tmp + buf_size, str, grow_size, + flags); + + if (result == (size_t)-1) { + DEBUG(0, ("srvstr_push failed\n")); + return -1; + } + set_message_bcc(NULL, (char *)tmp, smb_buflen(tmp) + result); + + *outbuf = tmp; + + return result; +} |