summaryrefslogtreecommitdiff
path: root/ctdb/libctdb
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2011-12-12 16:48:10 +1100
committerMartin Schwenke <martin@meltin.net>2012-02-06 16:00:23 +1100
commited8a8ee966ee84a45832492be56cfb36f611037e (patch)
tree31249cffcb1686f20129ace85fcad36328e48470 /ctdb/libctdb
parent97863216eddc77002bf26e2e4d05f7367790137d (diff)
downloadsamba-ed8a8ee966ee84a45832492be56cfb36f611037e.tar.gz
libctdb - add ctdb_getvnnmap()
Signed-off-by: Martin Schwenke <martin@meltin.net> (This used to be ctdb commit f6039eaece4224b866a98dd49010f278a7b3f015)
Diffstat (limited to 'ctdb/libctdb')
-rw-r--r--ctdb/libctdb/control.c76
-rw-r--r--ctdb/libctdb/sync.c19
2 files changed, 95 insertions, 0 deletions
diff --git a/ctdb/libctdb/control.c b/ctdb/libctdb/control.c
index 9beb49f9c2e..ba22444ee54 100644
--- a/ctdb/libctdb/control.c
+++ b/ctdb/libctdb/control.c
@@ -30,6 +30,7 @@
#undef ctdb_getpublicips_send
#undef ctdb_getdbseqnum_send
#undef ctdb_getifaces_send
+#undef ctdb_getvnnmap_send
bool ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
struct ctdb_request *req, uint32_t *recmaster)
@@ -355,3 +356,78 @@ struct ctdb_request *ctdb_getifaces_send(struct ctdb_connection *ctdb,
NULL, 0, callback, private_data);
}
+bool ctdb_getvnnmap_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
+ struct ctdb_vnn_map **vnnmap)
+{
+ struct ctdb_reply_control *reply;
+ struct ctdb_vnn_map_wire *map;
+ struct ctdb_vnn_map *tmap;
+ int len;
+
+ *vnnmap = NULL;
+ reply = unpack_reply_control(req, CTDB_CONTROL_GETVNNMAP);
+ if (!reply) {
+ return false;
+ }
+ if (reply->status == -1) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: status -1");
+ return false;
+ }
+ if (reply->datalen == 0) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: returned data is 0 bytes");
+ return false;
+ }
+
+ len = offsetof(struct ctdb_vnn_map_wire, map);
+ if (len > reply->datalen) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: returned data is %d bytes but %d is minimum", reply->datalen, (int)offsetof(struct ctdb_vnn_map_wire, map));
+ return false;
+ }
+
+ map = (struct ctdb_vnn_map_wire *)(reply->data);
+ len += map->size * sizeof(uint32_t);
+
+ if (len != reply->datalen) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: returned data is %d bytes but should be %d", reply->datalen, len);
+ return false;
+ }
+
+ tmap = malloc(sizeof(struct ctdb_vnn_map));
+ if (tmap == NULL) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: failed to malloc buffer");
+ return false;
+ }
+
+ tmap->generation = map->generation;
+ tmap->size = map->size;
+ tmap->map = malloc(sizeof(uint32_t) * map->size);
+ if (tmap->map == NULL) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getvnnmap_recv: failed to malloc buffer");
+ free(tmap);
+ return false;
+ }
+
+ memcpy(tmap->map, map->map, sizeof(uint32_t)*map->size);
+
+ *vnnmap = tmap;
+
+ return true;
+}
+
+void ctdb_free_vnnmap(struct ctdb_vnn_map *vnnmap)
+{
+ free(vnnmap->map);
+ free(vnnmap);
+}
+
+struct ctdb_request *ctdb_getvnnmap_send(struct ctdb_connection *ctdb,
+ uint32_t destnode,
+ ctdb_callback_t callback,
+ void *private_data)
+{
+ return new_ctdb_control_request(ctdb, CTDB_CONTROL_GETVNNMAP,
+ destnode,
+ NULL, 0, callback, private_data);
+}
+
diff --git a/ctdb/libctdb/sync.c b/ctdb/libctdb/sync.c
index 9567d9695ad..f2b69570785 100644
--- a/ctdb/libctdb/sync.c
+++ b/ctdb/libctdb/sync.c
@@ -300,3 +300,22 @@ bool ctdb_getifaces(struct ctdb_connection *ctdb,
return ret;
}
+bool ctdb_getvnnmap(struct ctdb_connection *ctdb,
+ uint32_t destnode, struct ctdb_vnn_map **vnnmap)
+{
+ struct ctdb_request *req;
+ bool done = false;
+ bool ret = false;
+
+ *vnnmap = NULL;
+
+ req = synchronous(ctdb,
+ ctdb_getvnnmap_send(ctdb, destnode, set, &done),
+ &done);
+ if (req != NULL) {
+ ret = ctdb_getvnnmap_recv(ctdb, req, vnnmap);
+ ctdb_request_free(req);
+ }
+ return ret;
+}
+