summaryrefslogtreecommitdiff
path: root/lib/dbwrap
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2016-09-12 17:11:09 +0200
committerRalph Boehme <slow@samba.org>2017-07-25 17:43:16 +0200
commitf0598e985300afd287487cd4975a309cee6dfaa6 (patch)
tree05b607709ccf4e2e5c3686b4ef7b58e03c75f976 /lib/dbwrap
parentcfb6568408269033316670fe9949d3622d5149f6 (diff)
downloadsamba-f0598e985300afd287487cd4975a309cee6dfaa6.tar.gz
dbwrap: Add dbwrap_merge_dbufs
Transitional code to implement dbwrap_record_storev Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'lib/dbwrap')
-rw-r--r--lib/dbwrap/dbwrap.c48
-rw-r--r--lib/dbwrap/dbwrap.h3
2 files changed, 51 insertions, 0 deletions
diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c
index 025d463b4bd..1f45558beb6 100644
--- a/lib/dbwrap/dbwrap.c
+++ b/lib/dbwrap/dbwrap.c
@@ -556,3 +556,51 @@ const char *dbwrap_name(struct db_context *db)
{
return db->name;
}
+
+static ssize_t tdb_data_buf(const TDB_DATA *dbufs, int num_dbufs,
+ uint8_t *buf, size_t buflen)
+{
+ size_t needed = 0;
+ uint8_t *p = buf;
+ int i;
+
+ for (i=0; i<num_dbufs; i++) {
+ size_t thislen = dbufs[i].dsize;
+ size_t tmp;
+
+ tmp = needed + thislen;
+ if (tmp < needed) {
+ /* wrap */
+ return -1;
+ }
+ needed = tmp;
+
+ if (needed <= buflen) {
+ memcpy(p, dbufs[i].dptr, thislen);
+ p += thislen;
+ }
+ }
+
+ return needed;
+}
+
+
+TDB_DATA dbwrap_merge_dbufs(TALLOC_CTX *mem_ctx,
+ const TDB_DATA *dbufs, int num_dbufs)
+{
+ ssize_t len = tdb_data_buf(dbufs, num_dbufs, NULL, 0);
+ uint8_t *buf;
+
+ if (len == -1) {
+ return (TDB_DATA) {0};
+ }
+
+ buf = talloc_array(mem_ctx, uint8_t, len);
+ if (buf == NULL) {
+ return (TDB_DATA) {0};
+ }
+
+ tdb_data_buf(dbufs, num_dbufs, buf, len);
+
+ return (TDB_DATA) { .dptr = buf, .dsize = len };
+}
diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h
index fac65ee6cfe..e34b2ab3882 100644
--- a/lib/dbwrap/dbwrap.h
+++ b/lib/dbwrap/dbwrap.h
@@ -216,6 +216,9 @@ NTSTATUS dbwrap_parse_marshall_buf(const uint8_t *buf, size_t buflen,
NTSTATUS dbwrap_unmarshall(struct db_context *db, const uint8_t *buf,
size_t buflen);
+TDB_DATA dbwrap_merge_dbufs(TALLOC_CTX *mem_ctx,
+ const TDB_DATA *dbufs, int num_dbufs);
+
/**
* This opens a tdb file