2 CTDB eventd protocol marshalling
4 Copyright (C) Amitay Isaacs 2016
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "system/network.h"
26 #include "protocol_private.h"
27 #include "protocol_api.h"
29 static size_t ctdb_event_len(enum ctdb_event in
)
31 return ctdb_uint32_len((uint32_t)in
);
34 static void ctdb_event_push(enum ctdb_event in
, uint8_t *buf
)
36 ctdb_uint32_push((uint32_t)in
, buf
);
39 static int ctdb_event_pull(uint8_t *buf
, size_t buflen
,
40 TALLOC_CTX
*mem_ctx
, enum ctdb_event
*out
)
42 uint32_t uint32_value
;
43 enum ctdb_event value
;
46 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
, &uint32_value
);
51 switch (uint32_value
) {
53 value
= CTDB_EVENT_INIT
;
57 value
= CTDB_EVENT_SETUP
;
61 value
= CTDB_EVENT_STARTUP
;
65 value
= CTDB_EVENT_START_RECOVERY
;
69 value
= CTDB_EVENT_RECOVERED
;
73 value
= CTDB_EVENT_TAKE_IP
;
77 value
= CTDB_EVENT_RELEASE_IP
;
81 value
= CTDB_EVENT_STOPPED
;
85 value
= CTDB_EVENT_MONITOR
;
89 value
= CTDB_EVENT_STATUS
;
93 value
= CTDB_EVENT_SHUTDOWN
;
97 value
= CTDB_EVENT_RELOAD
;
101 value
= CTDB_EVENT_UPDATE_IP
;
105 value
= CTDB_EVENT_IPREALLOCATED
;
116 static size_t ctdb_event_command_len(enum ctdb_event_command in
)
118 return ctdb_uint32_len((uint32_t)in
);
121 static void ctdb_event_command_push(enum ctdb_event_command in
, uint8_t *buf
)
123 ctdb_uint32_push((uint32_t)in
, buf
);
126 static int ctdb_event_command_pull(uint8_t *buf
, size_t buflen
,
128 enum ctdb_event_command
*out
)
130 uint32_t uint32_value
;
131 enum ctdb_event_command value
;
134 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
, &uint32_value
);
139 switch (uint32_value
) {
141 value
= CTDB_EVENT_COMMAND_RUN
;
145 value
= CTDB_EVENT_COMMAND_STATUS
;
149 value
= CTDB_EVENT_COMMAND_SCRIPT_LIST
;
153 value
= CTDB_EVENT_COMMAND_SCRIPT_ENABLE
;
157 value
= CTDB_EVENT_COMMAND_SCRIPT_DISABLE
;
168 static size_t ctdb_event_status_state_len(enum ctdb_event_status_state in
)
170 return ctdb_uint32_len((uint32_t)in
);
173 static void ctdb_event_status_state_push(enum ctdb_event_status_state in
,
176 ctdb_uint32_push((uint32_t)in
, buf
);
179 static int ctdb_event_status_state_pull(uint8_t *buf
, size_t buflen
,
181 enum ctdb_event_status_state
*out
)
183 uint32_t uint32_value
;
184 enum ctdb_event_status_state value
;
187 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
, &uint32_value
);
192 switch (uint32_value
) {
194 value
= CTDB_EVENT_LAST_RUN
;
198 value
= CTDB_EVENT_LAST_PASS
;
202 value
= CTDB_EVENT_LAST_FAIL
;
213 static size_t ctdb_event_request_run_len(struct ctdb_event_request_run
*in
)
215 return ctdb_event_len(in
->event
) +
216 ctdb_uint32_len(in
->timeout
) +
217 ctdb_stringn_len(in
->arg_str
);
220 static void ctdb_event_request_run_push(struct ctdb_event_request_run
*in
,
225 ctdb_event_push(in
->event
, buf
);
226 offset
+= ctdb_event_len(in
->event
);
228 ctdb_uint32_push(in
->timeout
, buf
+offset
);
229 offset
+= ctdb_uint32_len(in
->timeout
);
231 ctdb_stringn_push(in
->arg_str
, buf
+offset
);
234 static int ctdb_event_request_run_pull(uint8_t *buf
, size_t buflen
,
236 struct ctdb_event_request_run
**out
)
238 struct ctdb_event_request_run
*rdata
;
242 rdata
= talloc(mem_ctx
, struct ctdb_event_request_run
);
247 ret
= ctdb_event_pull(buf
, buflen
, rdata
, &rdata
->event
);
251 offset
+= ctdb_event_len(rdata
->event
);
253 ret
= ctdb_uint32_pull(buf
+offset
, buflen
-offset
,
254 rdata
, &rdata
->timeout
);
258 offset
+= ctdb_uint32_len(rdata
->timeout
);
260 ret
= ctdb_stringn_pull(buf
+offset
, buflen
-offset
,
261 rdata
, &rdata
->arg_str
);
274 static size_t ctdb_event_request_status_len(
275 struct ctdb_event_request_status
*in
)
277 return ctdb_event_len(in
->event
) +
278 ctdb_event_status_state_len(in
->state
);
281 static void ctdb_event_request_status_push(
282 struct ctdb_event_request_status
*in
,
287 ctdb_event_push(in
->event
, buf
);
288 offset
+= ctdb_event_len(in
->event
);
290 ctdb_event_status_state_push(in
->state
, buf
+offset
);
293 static int ctdb_event_request_status_pull(
294 uint8_t *buf
, size_t buflen
,
296 struct ctdb_event_request_status
**out
)
298 struct ctdb_event_request_status
*rdata
;
302 rdata
= talloc(mem_ctx
, struct ctdb_event_request_status
);
307 ret
= ctdb_event_pull(buf
, buflen
, rdata
, &rdata
->event
);
312 offset
+= ctdb_event_len(rdata
->event
);
314 ret
= ctdb_event_status_state_pull(buf
+offset
, buflen
-offset
,
315 rdata
, &rdata
->state
);
325 static size_t ctdb_event_request_script_enable_len(
326 struct ctdb_event_request_script_enable
*in
)
328 return ctdb_stringn_len(in
->script_name
);
331 static void ctdb_event_request_script_enable_push(
332 struct ctdb_event_request_script_enable
*in
,
335 ctdb_stringn_push(in
->script_name
, buf
);
338 static int ctdb_event_request_script_enable_pull(
339 uint8_t *buf
, size_t buflen
,
341 struct ctdb_event_request_script_enable
**out
)
343 struct ctdb_event_request_script_enable
*rdata
;
346 rdata
= talloc(mem_ctx
, struct ctdb_event_request_script_enable
);
351 ret
= ctdb_stringn_pull(buf
, buflen
, rdata
, &rdata
->script_name
);
361 static size_t ctdb_event_request_script_disable_len(
362 struct ctdb_event_request_script_disable
*in
)
364 return ctdb_stringn_len(in
->script_name
);
367 static void ctdb_event_request_script_disable_push(
368 struct ctdb_event_request_script_disable
*in
,
371 ctdb_stringn_push(in
->script_name
, buf
);
374 static int ctdb_event_request_script_disable_pull(
375 uint8_t *buf
, size_t buflen
,
377 struct ctdb_event_request_script_disable
**out
)
379 struct ctdb_event_request_script_disable
*rdata
;
382 rdata
= talloc(mem_ctx
, struct ctdb_event_request_script_disable
);
387 ret
= ctdb_stringn_pull(buf
, buflen
, rdata
, &rdata
->script_name
);
397 static size_t ctdb_event_request_data_len(struct ctdb_event_request_data
*in
)
401 len
+= ctdb_event_command_len(in
->command
);
403 switch(in
->command
) {
404 case CTDB_EVENT_COMMAND_RUN
:
405 len
+= ctdb_event_request_run_len(in
->data
.run
);
408 case CTDB_EVENT_COMMAND_STATUS
:
409 len
+= ctdb_event_request_status_len(in
->data
.status
);
412 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
415 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
416 len
+= ctdb_event_request_script_enable_len(
417 in
->data
.script_enable
);
420 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
421 len
+= ctdb_event_request_script_disable_len(
422 in
->data
.script_disable
);
429 static void ctdb_event_request_data_push(struct ctdb_event_request_data
*in
,
434 ctdb_event_command_push(in
->command
, buf
);
435 offset
+= ctdb_event_command_len(in
->command
);
437 switch (in
->command
) {
438 case CTDB_EVENT_COMMAND_RUN
:
439 ctdb_event_request_run_push(in
->data
.run
, buf
+offset
);
442 case CTDB_EVENT_COMMAND_STATUS
:
443 ctdb_event_request_status_push(in
->data
.status
, buf
+offset
);
446 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
449 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
450 ctdb_event_request_script_enable_push(
451 in
->data
.script_enable
,
455 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
456 ctdb_event_request_script_disable_push(
457 in
->data
.script_disable
,
463 static int ctdb_event_request_data_pull(uint8_t *buf
, size_t buflen
,
465 struct ctdb_event_request_data
*out
)
470 ret
= ctdb_event_command_pull(buf
, buflen
, mem_ctx
, &out
->command
);
474 offset
+= ctdb_event_command_len(out
->command
);
476 switch (out
->command
) {
477 case CTDB_EVENT_COMMAND_RUN
:
478 ret
= ctdb_event_request_run_pull(buf
+offset
, buflen
-offset
,
479 mem_ctx
, &out
->data
.run
);
482 case CTDB_EVENT_COMMAND_STATUS
:
483 ret
= ctdb_event_request_status_pull(
484 buf
+offset
, buflen
-offset
,
485 mem_ctx
, &out
->data
.status
);
488 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
492 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
493 ret
= ctdb_event_request_script_enable_pull(
494 buf
+offset
, buflen
-offset
,
496 &out
->data
.script_enable
);
499 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
500 ret
= ctdb_event_request_script_disable_pull(
501 buf
+offset
, buflen
-offset
,
503 &out
->data
.script_disable
);
514 static size_t ctdb_event_reply_status_len(struct ctdb_event_reply_status
*in
)
516 return ctdb_int32_len(in
->status
) +
517 ctdb_script_list_len(in
->script_list
);
520 static void ctdb_event_reply_status_push(struct ctdb_event_reply_status
*in
,
525 ctdb_int32_push(in
->status
, buf
);
526 offset
+= ctdb_int32_len(in
->status
);
528 ctdb_script_list_push(in
->script_list
, buf
+offset
);
531 static int ctdb_event_reply_status_pull(uint8_t *buf
, size_t buflen
,
533 struct ctdb_event_reply_status
**out
)
535 struct ctdb_event_reply_status
*rdata
;
539 rdata
= talloc(mem_ctx
, struct ctdb_event_reply_status
);
544 ret
= ctdb_int32_pull(buf
, buflen
, rdata
, &rdata
->status
);
549 offset
+= ctdb_int32_len(rdata
->status
);
551 ret
= ctdb_script_list_pull(buf
+offset
, buflen
-offset
,
552 rdata
, &rdata
->script_list
);
562 static size_t ctdb_event_reply_script_list_len(
563 struct ctdb_event_reply_script_list
*in
)
565 return ctdb_script_list_len(in
->script_list
);
568 static void ctdb_event_reply_script_list_push(
569 struct ctdb_event_reply_script_list
*in
,
572 ctdb_script_list_push(in
->script_list
, buf
);
575 static int ctdb_event_reply_script_list_pull(
576 uint8_t *buf
, size_t buflen
,
578 struct ctdb_event_reply_script_list
**out
)
580 struct ctdb_event_reply_script_list
*rdata
;
583 rdata
= talloc(mem_ctx
, struct ctdb_event_reply_script_list
);
588 ret
= ctdb_script_list_pull(buf
, buflen
, rdata
, &rdata
->script_list
);
598 static size_t ctdb_event_reply_data_len(struct ctdb_event_reply_data
*in
)
602 len
+= ctdb_event_command_len(in
->command
);
603 len
+= ctdb_int32_len(in
->result
);
605 switch (in
->command
) {
606 case CTDB_EVENT_COMMAND_RUN
:
609 case CTDB_EVENT_COMMAND_STATUS
:
610 len
+= ctdb_event_reply_status_len(in
->data
.status
);
613 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
614 len
+= ctdb_event_reply_script_list_len(in
->data
.script_list
);
617 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
620 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
627 static void ctdb_event_reply_data_push(struct ctdb_event_reply_data
*in
,
632 ctdb_event_command_push(in
->command
, buf
);
633 offset
+= ctdb_event_command_len(in
->command
);
635 ctdb_int32_push(in
->result
, buf
+offset
);
636 offset
+= ctdb_int32_len(in
->result
);
638 switch (in
->command
) {
639 case CTDB_EVENT_COMMAND_RUN
:
642 case CTDB_EVENT_COMMAND_STATUS
:
643 ctdb_event_reply_status_push(in
->data
.status
, buf
+offset
);
646 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
647 ctdb_event_reply_script_list_push(in
->data
.script_list
,
651 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
654 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
659 static int ctdb_event_reply_data_pull(uint8_t *buf
, size_t buflen
,
661 struct ctdb_event_reply_data
*out
)
666 ret
= ctdb_event_command_pull(buf
, buflen
, mem_ctx
, &out
->command
);
670 offset
+= ctdb_event_command_len(out
->command
);
672 ret
= ctdb_int32_pull(buf
+offset
, buflen
-offset
,
673 mem_ctx
, &out
->result
);
677 offset
+= ctdb_int32_len(out
->result
);
679 switch (out
->command
) {
680 case CTDB_EVENT_COMMAND_RUN
:
683 case CTDB_EVENT_COMMAND_STATUS
:
684 ret
= ctdb_event_reply_status_pull(
685 buf
+offset
, buflen
-offset
,
686 mem_ctx
, &out
->data
.status
);
689 case CTDB_EVENT_COMMAND_SCRIPT_LIST
:
690 ret
= ctdb_event_reply_script_list_pull(
691 buf
+offset
, buflen
-offset
,
692 mem_ctx
, &out
->data
.script_list
);
695 case CTDB_EVENT_COMMAND_SCRIPT_ENABLE
:
698 case CTDB_EVENT_COMMAND_SCRIPT_DISABLE
:
709 static size_t ctdb_event_header_len(struct ctdb_event_header
*in
)
711 return ctdb_uint32_len(in
->length
) + ctdb_uint32_len(in
->reqid
);
714 static void ctdb_event_header_push(struct ctdb_event_header
*in
, uint8_t *buf
)
718 ctdb_uint32_push(in
->length
, buf
);
719 offset
+= ctdb_uint32_len(in
->length
);
721 ctdb_uint32_push(in
->reqid
, buf
+offset
);
724 static int ctdb_event_header_pull(uint8_t *buf
, size_t buflen
,
726 struct ctdb_event_header
*out
)
731 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
, &out
->length
);
735 offset
+= ctdb_uint32_len(out
->length
);
737 ret
= ctdb_uint32_pull(buf
+offset
, buflen
-offset
,
738 mem_ctx
, &out
->reqid
);
746 void ctdb_event_header_fill(struct ctdb_event_header
*h
, uint32_t reqid
)
748 h
->length
= ctdb_event_header_len(h
);
752 size_t ctdb_event_request_len(struct ctdb_event_request
*in
)
754 return ctdb_event_header_len(&in
->header
) +
755 ctdb_event_request_data_len(&in
->rdata
);
758 int ctdb_event_request_push(struct ctdb_event_request
*in
,
759 uint8_t *buf
, size_t *buflen
)
761 size_t len
, offset
= 0;
763 len
= ctdb_event_request_len(in
);
769 in
->header
.length
= *buflen
;
771 ctdb_event_header_push(&in
->header
, buf
);
772 offset
+= ctdb_event_header_len(&in
->header
);
774 ctdb_event_request_data_push(&in
->rdata
, buf
+offset
);
779 int ctdb_event_request_pull(uint8_t *buf
, size_t buflen
,
781 struct ctdb_event_request
*out
)
786 ret
= ctdb_event_header_pull(buf
, buflen
, mem_ctx
, &out
->header
);
790 offset
+= ctdb_event_header_len(&out
->header
);
792 ret
= ctdb_event_request_data_pull(buf
+offset
, buflen
-offset
,
793 mem_ctx
, &out
->rdata
);
801 size_t ctdb_event_reply_len(struct ctdb_event_reply
*in
)
803 return ctdb_event_header_len(&in
->header
) +
804 ctdb_event_reply_data_len(&in
->rdata
);
807 int ctdb_event_reply_push(struct ctdb_event_reply
*in
,
808 uint8_t *buf
, size_t *buflen
)
810 size_t len
, offset
= 0;
812 len
= ctdb_event_reply_len(in
);
818 in
->header
.length
= *buflen
;
820 ctdb_event_header_push(&in
->header
, buf
);
821 offset
+= ctdb_event_header_len(&in
->header
);
823 ctdb_event_reply_data_push(&in
->rdata
, buf
+offset
);
828 int ctdb_event_reply_pull(uint8_t *buf
, size_t buflen
,
830 struct ctdb_event_reply
*out
)
835 ret
= ctdb_event_header_pull(buf
, buflen
, mem_ctx
, &out
->header
);
839 offset
+= ctdb_event_header_len(&out
->header
);
841 ret
= ctdb_event_reply_data_pull(buf
+offset
, buflen
-offset
,
842 mem_ctx
, &out
->rdata
);