ctdb-protocol: Add marshalling for tdb_data with size
authorAmitay Isaacs <amitay@gmail.com>
Thu, 29 Jun 2017 08:41:43 +0000 (18:41 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:22 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_private.h
ctdb/protocol/protocol_types.c
ctdb/tests/src/protocol_common.c
ctdb/tests/src/protocol_common.h
ctdb/tests/src/protocol_types_test.c

index 1f1dca1e35ba639e532faaf235f4c7c30f9a6aa4..19c01c4067b3f4fd6c7f7ccfa103f0bece0cb705 100644 (file)
@@ -94,6 +94,11 @@ void ctdb_tdb_data_push(TDB_DATA *in, uint8_t *buf, size_t *npush);
 int ctdb_tdb_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                       TDB_DATA *out, size_t *npull);
 
+size_t ctdb_tdb_datan_len(TDB_DATA *in);
+void ctdb_tdb_datan_push(TDB_DATA *in, uint8_t *buf, size_t *npush);
+int ctdb_tdb_datan_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
+                       TDB_DATA *out, size_t *npull);
+
 size_t ctdb_statistics_len(struct ctdb_statistics *stats);
 void ctdb_statistics_push(struct ctdb_statistics *stats, uint8_t *buf);
 int ctdb_statistics_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
index cd8897086b1c538afaffc27015467ba5c347b277..07e3a852518d3ef58d4801a488cd4808b2411406 100644 (file)
@@ -67,6 +67,54 @@ int ctdb_tdb_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+size_t ctdb_tdb_datan_len(TDB_DATA *in)
+{
+       uint32_t u32 = ctdb_tdb_data_len(in);
+
+       return ctdb_uint32_len(&u32) + u32;
+}
+
+void ctdb_tdb_datan_push(TDB_DATA *in, uint8_t *buf, size_t *npush)
+{
+       size_t offset = 0, np;
+       uint32_t u32 = ctdb_tdb_data_len(in);
+
+       ctdb_uint32_push(&u32, buf+offset, &np);
+       offset += np;
+
+       ctdb_tdb_data_push(in, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
+}
+
+int ctdb_tdb_datan_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
+                       TDB_DATA *out, size_t *npull)
+{
+       size_t offset = 0, np;
+       uint32_t u32;
+       int ret;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       if (buflen-offset < u32) {
+               return EMSGSIZE;
+       }
+
+       ret = ctdb_tdb_data_pull(buf+offset, u32, mem_ctx, out, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       *npull = offset;
+       return 0;
+}
+
 size_t ctdb_statistics_len(struct ctdb_statistics *stats)
 {
        return sizeof(struct ctdb_statistics);
index a133a2abf07a6de1e9aef8addb5305335aff9428..ab4bb03097291b685c0e2995041443ea842b76e7 100644 (file)
@@ -266,6 +266,16 @@ void verify_ctdb_tdb_data(TDB_DATA *p1, TDB_DATA *p2)
        verify_tdb_data(p1, p2);
 }
 
+void fill_ctdb_tdb_datan(TALLOC_CTX *mem_ctx, TDB_DATA *p)
+{
+       fill_tdb_data(mem_ctx, p);
+}
+
+void verify_ctdb_tdb_datan(TDB_DATA *p1, TDB_DATA *p2)
+{
+       verify_tdb_data(p1, p2);
+}
+
 void fill_ctdb_statistics(TALLOC_CTX *mem_ctx, struct ctdb_statistics *p)
 {
        fill_buffer((uint8_t *)p, sizeof(struct ctdb_statistics));
index b7d0fc537a7bed0d63107b646504756b01b737f6..a7d30cbdff7c9dcf21d5278aacd37b895f0b611e 100644 (file)
@@ -192,6 +192,9 @@ void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2);
 void fill_ctdb_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p);
 void verify_ctdb_tdb_data(TDB_DATA *p1, TDB_DATA *p2);
 
+void fill_ctdb_tdb_datan(TALLOC_CTX *mem_ctx, TDB_DATA *p);
+void verify_ctdb_tdb_datan(TDB_DATA *p1, TDB_DATA *p2);
+
 void fill_ctdb_statistics(TALLOC_CTX *mem_ctx, struct ctdb_statistics *p);
 void verify_ctdb_statistics(struct ctdb_statistics *p1,
                            struct ctdb_statistics *p2);
index 3990fbae3e4b84d66379dce1a286dea30fc04681..152fb259bfbb37bcca75687677411b28ee97f51c 100644 (file)
@@ -28,6 +28,7 @@
 #include "tests/src/protocol_common.h"
 
 PROTOCOL_TYPE2_TEST(TDB_DATA, ctdb_tdb_data);
+PROTOCOL_TYPE2_TEST(TDB_DATA, ctdb_tdb_datan);
 
 static void test_ctdb_ltdb_header(void)
 {
@@ -155,6 +156,7 @@ int main(int argc, char *argv[])
        }
 
        TEST_FUNC(ctdb_tdb_data)();
+       TEST_FUNC(ctdb_tdb_datan)();
        test_ctdb_ltdb_header();
        test_ctdb_g_lock();