1 #include "libctdb_private.h"
6 #include <ctdb_protocol.h>
10 struct message_handler_info {
11 struct message_handler_info *next, *prev;
12 /* Callback when we're first registered. */
13 ctdb_set_message_handler_cb callback;
16 ctdb_message_fn_t handler;
18 struct ctdb_connection *ctdb;
21 void deliver_message(struct ctdb_connection *ctdb, struct ctdb_req_header *hdr)
23 struct message_handler_info *i;
24 struct ctdb_req_message *msg = (struct ctdb_req_message *)hdr;
27 data.dptr = msg->data;
28 data.dsize = msg->datalen;
30 for (i = ctdb->message_handlers; i; i = i->next) {
31 if (i->srvid == msg->srvid) {
32 i->handler(ctdb, msg->srvid, data, i->private_data);
35 /* FIXME: Report unknown messages */
38 static void set_message_handler(int status, struct message_handler_info *info)
40 /* If registration failed, tell callback and clean up */
42 info->callback(status, info->private_data);
46 /* Put ourselves in list of handlers. */
47 DLIST_ADD_END(info->ctdb->message_handlers, info,
48 struct message_handler_info);
49 /* Now call callback: it could remove us in theory. */
50 info->callback(status, info->private_data);
55 ctdb_set_message_handler_send(struct ctdb_connection *ctdb, uint64_t srvid,
56 ctdb_set_message_handler_cb callback,
57 ctdb_message_fn_t handler, void *private_data)
59 struct ctdb_request *req;
60 struct message_handler_info *info;
62 info = malloc(sizeof(*info));
66 req = new_ctdb_control_request(ctdb, CTDB_CONTROL_REGISTER_SRVID,
67 CTDB_CURRENT_NODE, NULL, 0);
72 req->hdr.control->srvid = srvid;
75 info->handler = handler;
76 info->callback = callback;
77 info->private_data = private_data;
80 req->callback.register_srvid = set_message_handler;
81 req->priv_data = info;
86 int ctdb_send_message(struct ctdb_connection *ctdb,
87 uint32_t pnn, uint64_t srvid,
90 struct ctdb_request *req;
91 struct ctdb_req_message *pkt;
93 req = new_ctdb_request(sizeof(*pkt) + data.dsize);
98 io_elem_init_req_header(req->io,
99 CTDB_REQ_MESSAGE, pnn, new_reqid(ctdb));
101 /* There's no reply to this, so we mark it cancelled immediately. */
102 req->cancelled = true;
104 pkt = req->hdr.message;
106 pkt->datalen = data.dsize;
107 memcpy(pkt->data, data.dptr, data.dsize);
108 DLIST_ADD_END(ctdb->outq, req, struct ctdb_request);