summaryrefslogtreecommitdiffstats
path: root/ctdb/server/ctdb_daemon.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-10-31 13:29:13 +0100
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2011-11-30 09:02:26 +1100
commit5a1da0ac558df99e6b8ee84e6affe810dc966db7 (patch)
tree382859b63057afa61ea4cccb45cd037c5a3bb5eb /ctdb/server/ctdb_daemon.c
parent940e9cb7a7c4b566a06b5c3ed03bcafe02f24cd2 (diff)
downloadsamba-5a1da0ac558df99e6b8ee84e6affe810dc966db7.tar.gz
samba-5a1da0ac558df99e6b8ee84e6affe810dc966db7.tar.xz
samba-5a1da0ac558df99e6b8ee84e6affe810dc966db7.zip
Add CTDB_CONTROL_CHECK_SRVID
(This used to be ctdb commit ad64ef2c40a2a12b37dbf39142e95c6781c2fc3b)
Diffstat (limited to 'ctdb/server/ctdb_daemon.c')
-rw-r--r--ctdb/server/ctdb_daemon.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c
index 69fb6fb1f62..8bf435c3075 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