integers and strings.
****************************************************************************/
-size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...)
+size_t tdb_pack_va(char *buf, int bufsize, const char *fmt, va_list ap)
{
- va_list ap;
uint8 bt;
uint16 w;
uint32 d;
const char *fmt0 = fmt;
int bufsize0 = bufsize;
- va_start(ap, fmt);
-
while (*fmt) {
switch ((c = *fmt++)) {
case 'b': /* unsigned 8-bit integer */
bufsize = 0;
}
- va_end(ap);
-
- DEBUG(18,("tdb_pack(%s, %d) -> %d\n",
+ DEBUG(18,("tdb_pack_va(%s, %d) -> %d\n",
fmt0, bufsize0, (int)PTR_DIFF(buf, buf0)));
return PTR_DIFF(buf, buf0);
}
+size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...)
+{
+ va_list ap;
+ size_t result;
+
+ va_start(ap, fmt);
+ result = tdb_pack_va(buf, bufsize, fmt, ap);
+ va_end(ap);
+ return result;
+}
+
+BOOL tdb_pack_append(TALLOC_CTX *mem_ctx, uint8_t **buf, size_t *len,
+ const char *fmt, ...)
+{
+ va_list ap;
+ size_t len1, len2;
+
+ va_start(ap, fmt);
+ len1 = tdb_pack_va(NULL, 0, fmt, ap);
+ va_end(ap);
+
+ if (mem_ctx != NULL)
+ *buf = TALLOC_REALLOC_ARRAY(mem_ctx, *buf, uint8_t,
+ (*len) + len1);
+ else
+ *buf = SMB_REALLOC_ARRAY(*buf, uint8_t, (*len) + len1);
+
+ if (*buf == NULL)
+ return False;
+
+ va_start(ap, fmt);
+ len2 = tdb_pack_va((*buf)+(*len), len1, fmt, ap);
+ va_end(ap);
+
+ if (len1 != len2)
+ return False;
+
+ *len += len2;
+
+ return True;
+}
+
/****************************************************************************
Useful pair of routines for packing/unpacking data consisting of
integers and strings.