[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 4/7] xenstore: use common tdb record header in xenstore



The layout of the tdb record of xenstored is defined at multiple
places: read_node(), write_node() and in xs_tdb_dump.c

Use a common structure instead.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 tools/xenstore/include/xenstore_lib.h |  8 ++++++++
 tools/xenstore/xenstored_core.c       | 27 ++++++++++++++-------------
 tools/xenstore/xs_tdb_dump.c          | 11 ++---------
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/tools/xenstore/include/xenstore_lib.h 
b/tools/xenstore/include/xenstore_lib.h
index 462b7b9..efdf935 100644
--- a/tools/xenstore/include/xenstore_lib.h
+++ b/tools/xenstore/include/xenstore_lib.h
@@ -42,6 +42,14 @@ struct xs_permissions
        enum xs_perm_type perms;
 };
 
+/* Header of the node record in tdb. */
+struct xs_tdb_record_hdr {
+       uint32_t num_perms;
+       uint32_t datalen;
+       uint32_t childlen;
+       struct xs_permissions perms[0];
+};
+
 /* Each 10 bits takes ~ 3 digits, plus one, plus one for nul terminator. */
 #define MAX_STRLEN(x) ((sizeof(x) * CHAR_BIT + CHAR_BIT-1) / 10 * 3 + 2)
 
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 1354387..dfad0d5 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -416,7 +416,7 @@ static struct node *read_node(struct connection *conn, 
const void *ctx,
                              const char *name)
 {
        TDB_DATA key, data;
-       uint32_t *p;
+       struct xs_tdb_record_hdr *hdr;
        struct node *node;
        TDB_CONTEXT * context = tdb_context(conn);
 
@@ -441,13 +441,13 @@ static struct node *read_node(struct connection *conn, 
const void *ctx,
        talloc_steal(node, data.dptr);
 
        /* Datalen, childlen, number of permissions */
-       p = (uint32_t *)data.dptr;
-       node->num_perms = p[0];
-       node->datalen = p[1];
-       node->childlen = p[2];
+       hdr = (void *)data.dptr;
+       node->num_perms = hdr->num_perms;
+       node->datalen = hdr->datalen;
+       node->childlen = hdr->childlen;
 
        /* Permissions are struct xs_permissions. */
-       node->perms = (void *)&p[3];
+       node->perms = hdr->perms;
        /* Data is binary blob (usually ascii, no nul). */
        node->data = node->perms + node->num_perms;
        /* Children is strings, nul separated. */
@@ -465,11 +465,12 @@ static bool write_node(struct connection *conn, struct 
node *node)
 
        TDB_DATA key, data;
        void *p;
+       struct xs_tdb_record_hdr *hdr;
 
        key.dptr = (void *)node->name;
        key.dsize = strlen(node->name);
 
-       data.dsize = 3*sizeof(uint32_t)
+       data.dsize = sizeof(*hdr)
                + node->num_perms*sizeof(node->perms[0])
                + node->datalen + node->childlen;
 
@@ -479,13 +480,13 @@ static bool write_node(struct connection *conn, struct 
node *node)
        add_change_node(conn, node, false);
 
        data.dptr = talloc_size(node, data.dsize);
-       ((uint32_t *)data.dptr)[0] = node->num_perms;
-       ((uint32_t *)data.dptr)[1] = node->datalen;
-       ((uint32_t *)data.dptr)[2] = node->childlen;
-       p = data.dptr + 3 * sizeof(uint32_t);
+       hdr = (void *)data.dptr;
+       hdr->num_perms = node->num_perms;
+       hdr->datalen = node->datalen;
+       hdr->childlen = node->childlen;
 
-       memcpy(p, node->perms, node->num_perms*sizeof(node->perms[0]));
-       p += node->num_perms*sizeof(node->perms[0]);
+       memcpy(hdr->perms, node->perms, node->num_perms*sizeof(node->perms[0]));
+       p = hdr->perms + node->num_perms;
        memcpy(p, node->data, node->datalen);
        p += node->datalen;
        memcpy(p, node->children, node->childlen);
diff --git a/tools/xenstore/xs_tdb_dump.c b/tools/xenstore/xs_tdb_dump.c
index 9f636f9..207ed44 100644
--- a/tools/xenstore/xs_tdb_dump.c
+++ b/tools/xenstore/xs_tdb_dump.c
@@ -11,14 +11,7 @@
 #include "talloc.h"
 #include "utils.h"
 
-struct record_hdr {
-       uint32_t num_perms;
-       uint32_t datalen;
-       uint32_t childlen;
-       struct xs_permissions perms[0];
-};
-
-static uint32_t total_size(struct record_hdr *hdr)
+static uint32_t total_size(struct xs_tdb_record_hdr *hdr)
 {
        return sizeof(*hdr) + hdr->num_perms * sizeof(struct xs_permissions) 
                + hdr->datalen + hdr->childlen;
@@ -58,7 +51,7 @@ int main(int argc, char *argv[])
        key = tdb_firstkey(tdb);
        while (key.dptr) {
                TDB_DATA data;
-               struct record_hdr *hdr;
+               struct xs_tdb_record_hdr *hdr;
 
                data = tdb_fetch(tdb, key);
                hdr = (void *)data.dptr;
-- 
2.6.6


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.