summaryrefslogtreecommitdiffstats
path: root/source3/smbd/srvstr.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-07-23 10:52:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:28:54 -0500
commit944fe69d03f1fcd6ab680fcb672d06036f89f251 (patch)
tree9160931b1fc8b1a391bad7d39f3bdb05e33d7ee3 /source3/smbd/srvstr.c
parent9e40557047b32dae012b0b5a3450c2c23b7895e5 (diff)
downloadsamba-944fe69d03f1fcd6ab680fcb672d06036f89f251.tar.gz
samba-944fe69d03f1fcd6ab680fcb672d06036f89f251.tar.xz
samba-944fe69d03f1fcd6ab680fcb672d06036f89f251.zip
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.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/source3/smbd/srvstr.c b/source3/smbd/srvstr.c
index 4462a423c8..1daa25553f 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;
+}