diff options
author | Volker Lendecke <vl@samba.org> | 2016-09-12 17:11:09 +0200 |
---|---|---|
committer | Ralph Boehme <slow@samba.org> | 2017-07-25 17:43:16 +0200 |
commit | f0598e985300afd287487cd4975a309cee6dfaa6 (patch) | |
tree | 05b607709ccf4e2e5c3686b4ef7b58e03c75f976 /lib/dbwrap | |
parent | cfb6568408269033316670fe9949d3622d5149f6 (diff) | |
download | samba-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.c | 48 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap.h | 3 |
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 |