diff options
Diffstat (limited to 'ctdb/server/ctdb_daemon.c')
-rw-r--r-- | ctdb/server/ctdb_daemon.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index 69fb6fb1f6..8bf435c307 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -205,6 +205,42 @@ int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client return ctdb_deregister_message_handler(ctdb, srvid, client); } +int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata, + TDB_DATA *outdata) +{ + uint64_t *ids; + int i, num_ids; + uint8_t *results; + + if ((indata.dsize % sizeof(uint64_t)) != 0) { + DEBUG(DEBUG_ERR, ("Bad indata in daemon_check_srvids, " + "size=%d\n", (int)indata.dsize)); + return -1; + } + + ids = (uint64_t *)indata.dptr; + num_ids = indata.dsize / 8; + + results = talloc_zero_array(outdata, uint8_t, (num_ids+7)/8); + if (results == NULL) { + DEBUG(DEBUG_ERR, ("talloc failed in daemon_check_srvids\n")); + return -1; + } + for (i=0; i<num_ids; i++) { + struct ctdb_message_list *ml; + for (ml=ctdb->message_list; ml; ml=ml->next) { + if (ml->srvid == ids[i]) { + break; + } + } + if (ml != NULL) { + results[i/8] |= (1 << (i%8)); + } + } + outdata->dptr = (uint8_t *)results; + outdata->dsize = talloc_get_size(results); + return 0; +} /* destroy a ctdb_client |