diff options
author | Martin Schwenke <martin@meltin.net> | 2011-12-12 16:48:10 +1100 |
---|---|---|
committer | Martin Schwenke <martin@meltin.net> | 2012-02-06 16:00:23 +1100 |
commit | ed8a8ee966ee84a45832492be56cfb36f611037e (patch) | |
tree | 31249cffcb1686f20129ace85fcad36328e48470 /ctdb/libctdb | |
parent | 97863216eddc77002bf26e2e4d05f7367790137d (diff) | |
download | samba-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.c | 76 | ||||
-rw-r--r-- | ctdb/libctdb/sync.c | 19 |
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; +} + |