2 CTDB protocol marshalling
4 Copyright (C) Amitay Isaacs 2015
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"
27 #include "protocol_api.h"
28 #include "protocol_private.h"
30 struct ctdb_req_control_wire {
31 struct ctdb_req_header hdr;
41 struct ctdb_reply_control_wire {
42 struct ctdb_req_header hdr;
49 static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
58 case CTDB_CONTROL_PROCESS_EXISTS:
59 len = ctdb_pid_len(cd->data.pid);
62 case CTDB_CONTROL_STATISTICS:
65 case CTDB_CONTROL_PING:
68 case CTDB_CONTROL_GETDBPATH:
69 len = ctdb_uint32_len(cd->data.db_id);
72 case CTDB_CONTROL_GETVNNMAP:
75 case CTDB_CONTROL_SETVNNMAP:
76 len = ctdb_vnn_map_len(cd->data.vnnmap);
79 case CTDB_CONTROL_GET_DEBUG:
82 case CTDB_CONTROL_SET_DEBUG:
83 len = ctdb_uint32_len(cd->data.loglevel);
86 case CTDB_CONTROL_GET_DBMAP:
89 case CTDB_CONTROL_PULL_DB:
90 len = ctdb_pulldb_len(cd->data.pulldb);
93 case CTDB_CONTROL_PUSH_DB:
94 len = ctdb_rec_buffer_len(cd->data.recbuf);
97 case CTDB_CONTROL_GET_RECMODE:
100 case CTDB_CONTROL_SET_RECMODE:
101 len = ctdb_uint32_len(cd->data.recmode);
104 case CTDB_CONTROL_STATISTICS_RESET:
107 case CTDB_CONTROL_DB_ATTACH:
108 len = ctdb_string_len(cd->data.db_name);
111 case CTDB_CONTROL_SET_CALL:
114 case CTDB_CONTROL_TRAVERSE_START:
115 len = ctdb_traverse_start_len(cd->data.traverse_start);
118 case CTDB_CONTROL_TRAVERSE_ALL:
119 len = ctdb_traverse_all_len(cd->data.traverse_all);
122 case CTDB_CONTROL_TRAVERSE_DATA:
123 len = ctdb_rec_data_len(cd->data.rec_data);
126 case CTDB_CONTROL_REGISTER_SRVID:
129 case CTDB_CONTROL_DEREGISTER_SRVID:
132 case CTDB_CONTROL_GET_DBNAME:
133 len = ctdb_uint32_len(cd->data.db_id);
136 case CTDB_CONTROL_ENABLE_SEQNUM:
137 len = ctdb_uint32_len(cd->data.db_id);
140 case CTDB_CONTROL_UPDATE_SEQNUM:
141 len = ctdb_uint32_len(cd->data.db_id);
144 case CTDB_CONTROL_DUMP_MEMORY:
147 case CTDB_CONTROL_GET_PID:
150 case CTDB_CONTROL_GET_RECMASTER:
153 case CTDB_CONTROL_SET_RECMASTER:
154 len = ctdb_uint32_len(cd->data.recmaster);
157 case CTDB_CONTROL_FREEZE:
160 case CTDB_CONTROL_GET_PNN:
163 case CTDB_CONTROL_SHUTDOWN:
166 case CTDB_CONTROL_GET_MONMODE:
169 case CTDB_CONTROL_TCP_CLIENT:
170 len = ctdb_connection_len(cd->data.conn);
173 case CTDB_CONTROL_TCP_ADD:
174 len = ctdb_connection_len(cd->data.conn);
177 case CTDB_CONTROL_TCP_REMOVE:
178 len = ctdb_connection_len(cd->data.conn);
181 case CTDB_CONTROL_STARTUP:
184 case CTDB_CONTROL_SET_TUNABLE:
185 len = ctdb_tunable_len(cd->data.tunable);
188 case CTDB_CONTROL_GET_TUNABLE:
189 len = ctdb_stringn_len(cd->data.tun_var);
192 case CTDB_CONTROL_LIST_TUNABLES:
195 case CTDB_CONTROL_MODIFY_FLAGS:
196 len = ctdb_node_flag_change_len(cd->data.flag_change);
199 case CTDB_CONTROL_GET_ALL_TUNABLES:
202 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
203 len = ctdb_sock_addr_len(cd->data.addr);
206 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
207 len = ctdb_tickle_list_len(cd->data.tickles);
210 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
211 len = ctdb_string_len(cd->data.db_name);
214 case CTDB_CONTROL_UPDATE_RECORD:
215 len = ctdb_rec_buffer_len(cd->data.recbuf);
218 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
219 len = ctdb_addr_info_len(cd->data.addr_info);
222 case CTDB_CONTROL_WIPE_DATABASE:
223 len = ctdb_transdb_len(cd->data.transdb);
226 case CTDB_CONTROL_UPTIME:
229 case CTDB_CONTROL_START_RECOVERY:
232 case CTDB_CONTROL_END_RECOVERY:
235 case CTDB_CONTROL_RELOAD_NODES_FILE:
238 case CTDB_CONTROL_TRY_DELETE_RECORDS:
239 len = ctdb_rec_buffer_len(cd->data.recbuf);
242 case CTDB_CONTROL_ENABLE_MONITOR:
245 case CTDB_CONTROL_DISABLE_MONITOR:
248 case CTDB_CONTROL_ADD_PUBLIC_IP:
249 len = ctdb_addr_info_len(cd->data.addr_info);
252 case CTDB_CONTROL_DEL_PUBLIC_IP:
253 len = ctdb_addr_info_len(cd->data.addr_info);
256 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
257 len = ctdb_string_len(cd->data.event_str);
260 case CTDB_CONTROL_GET_CAPABILITIES:
263 case CTDB_CONTROL_RECD_PING:
266 case CTDB_CONTROL_RELEASE_IP:
267 len = ctdb_public_ip_len(cd->data.pubip);
270 case CTDB_CONTROL_TAKEOVER_IP:
271 len = ctdb_public_ip_len(cd->data.pubip);
274 case CTDB_CONTROL_GET_PUBLIC_IPS:
277 case CTDB_CONTROL_GET_NODEMAP:
280 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
281 len = ctdb_uint32_len(cd->data.event);
284 case CTDB_CONTROL_TRAVERSE_KILL:
285 len = ctdb_traverse_start_len(cd->data.traverse_start);
288 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
289 len = ctdb_double_len(cd->data.reclock_latency);
292 case CTDB_CONTROL_GET_RECLOCK_FILE:
295 case CTDB_CONTROL_STOP_NODE:
298 case CTDB_CONTROL_CONTINUE_NODE:
301 case CTDB_CONTROL_SET_LMASTERROLE:
302 len = ctdb_uint32_len(cd->data.role);
305 case CTDB_CONTROL_SET_RECMASTERROLE:
306 len = ctdb_uint32_len(cd->data.role);
309 case CTDB_CONTROL_ENABLE_SCRIPT:
310 len = ctdb_string_len(cd->data.script);
313 case CTDB_CONTROL_DISABLE_SCRIPT:
314 len = ctdb_string_len(cd->data.script);
317 case CTDB_CONTROL_SET_BAN_STATE:
318 len = ctdb_ban_state_len(cd->data.ban_state);
321 case CTDB_CONTROL_GET_BAN_STATE:
324 case CTDB_CONTROL_REGISTER_NOTIFY:
325 len = ctdb_notify_data_len(cd->data.notify);
328 case CTDB_CONTROL_DEREGISTER_NOTIFY:
329 len = ctdb_uint64_len(cd->data.srvid);
332 case CTDB_CONTROL_TRANS3_COMMIT:
333 len = ctdb_rec_buffer_len(cd->data.recbuf);
336 case CTDB_CONTROL_GET_DB_SEQNUM:
337 len = ctdb_uint64_len((uint64_t)cd->data.db_id);
340 case CTDB_CONTROL_DB_SET_HEALTHY:
341 len = ctdb_uint32_len(cd->data.db_id);
344 case CTDB_CONTROL_DB_GET_HEALTH:
345 len = ctdb_uint32_len(cd->data.db_id);
348 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
349 len = ctdb_sock_addr_len(cd->data.addr);
352 case CTDB_CONTROL_GET_IFACES:
355 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
356 len = ctdb_iface_len(cd->data.iface);
359 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
360 len = ctdb_connection_len(cd->data.conn);
363 case CTDB_CONTROL_GET_STAT_HISTORY:
366 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
367 len = ctdb_key_data_len(cd->data.key);
370 case CTDB_CONTROL_SET_DB_READONLY:
371 len = ctdb_uint32_len(cd->data.db_id);
374 case CTDB_CONTROL_CHECK_SRVIDS:
375 len = ctdb_uint64_array_len(cd->data.u64_array);
378 case CTDB_CONTROL_TRAVERSE_START_EXT:
379 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
382 case CTDB_CONTROL_GET_DB_STATISTICS:
383 len = ctdb_uint32_len(cd->data.db_id);
386 case CTDB_CONTROL_SET_DB_STICKY:
387 len = ctdb_uint32_len(cd->data.db_id);
390 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
393 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
394 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
397 case CTDB_CONTROL_RECEIVE_RECORDS:
398 len = ctdb_rec_buffer_len(cd->data.recbuf);
401 case CTDB_CONTROL_IPREALLOCATED:
404 case CTDB_CONTROL_GET_RUNSTATE:
407 case CTDB_CONTROL_DB_DETACH:
408 len = ctdb_uint32_len(cd->data.db_id);
411 case CTDB_CONTROL_GET_NODES_FILE:
414 case CTDB_CONTROL_DB_FREEZE:
415 len = ctdb_uint32_len(cd->data.db_id);
418 case CTDB_CONTROL_DB_THAW:
419 len = ctdb_uint32_len(cd->data.db_id);
422 case CTDB_CONTROL_DB_TRANSACTION_START:
423 len = ctdb_transdb_len(cd->data.transdb);
426 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
427 len = ctdb_transdb_len(cd->data.transdb);
430 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
431 len = ctdb_uint32_len(cd->data.db_id);
434 case CTDB_CONTROL_DB_PULL:
435 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
438 case CTDB_CONTROL_DB_PUSH_START:
439 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
442 case CTDB_CONTROL_DB_PUSH_CONFIRM:
443 len = ctdb_uint32_len(cd->data.db_id);
450 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
453 switch (cd->opcode) {
454 case CTDB_CONTROL_PROCESS_EXISTS:
455 ctdb_pid_push(cd->data.pid, buf);
458 case CTDB_CONTROL_GETDBPATH:
459 ctdb_uint32_push(cd->data.db_id, buf);
462 case CTDB_CONTROL_SETVNNMAP:
463 ctdb_vnn_map_push(cd->data.vnnmap, buf);
466 case CTDB_CONTROL_SET_DEBUG:
467 ctdb_uint32_push(cd->data.loglevel, buf);
470 case CTDB_CONTROL_PULL_DB:
471 ctdb_pulldb_push(cd->data.pulldb, buf);
474 case CTDB_CONTROL_PUSH_DB:
475 ctdb_rec_buffer_push(cd->data.recbuf, buf);
478 case CTDB_CONTROL_SET_RECMODE:
479 ctdb_uint32_push(cd->data.recmode, buf);
482 case CTDB_CONTROL_DB_ATTACH:
483 ctdb_string_push(cd->data.db_name, buf);
486 case CTDB_CONTROL_SET_CALL:
489 case CTDB_CONTROL_TRAVERSE_START:
490 ctdb_traverse_start_push(cd->data.traverse_start, buf);
493 case CTDB_CONTROL_TRAVERSE_ALL:
494 ctdb_traverse_all_push(cd->data.traverse_all, buf);
497 case CTDB_CONTROL_TRAVERSE_DATA:
498 ctdb_rec_data_push(cd->data.rec_data, buf);
501 case CTDB_CONTROL_GET_DBNAME:
502 ctdb_uint32_push(cd->data.db_id, buf);
505 case CTDB_CONTROL_ENABLE_SEQNUM:
506 ctdb_uint32_push(cd->data.db_id, buf);
509 case CTDB_CONTROL_UPDATE_SEQNUM:
510 ctdb_uint32_push(cd->data.db_id, buf);
513 case CTDB_CONTROL_SET_RECMASTER:
514 ctdb_uint32_push(cd->data.recmaster, buf);
517 case CTDB_CONTROL_TCP_CLIENT:
518 ctdb_connection_push(cd->data.conn, buf);
521 case CTDB_CONTROL_TCP_ADD:
522 ctdb_connection_push(cd->data.conn, buf);
525 case CTDB_CONTROL_TCP_REMOVE:
526 ctdb_connection_push(cd->data.conn, buf);
529 case CTDB_CONTROL_SET_TUNABLE:
530 ctdb_tunable_push(cd->data.tunable, buf);
533 case CTDB_CONTROL_GET_TUNABLE:
534 ctdb_stringn_push(cd->data.tun_var, buf);
537 case CTDB_CONTROL_MODIFY_FLAGS:
538 ctdb_node_flag_change_push(cd->data.flag_change, buf);
541 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
542 ctdb_sock_addr_push(cd->data.addr, buf);
545 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
546 ctdb_tickle_list_push(cd->data.tickles, buf);
549 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
550 ctdb_string_push(cd->data.db_name, buf);
553 case CTDB_CONTROL_UPDATE_RECORD:
554 ctdb_rec_buffer_push(cd->data.recbuf, buf);
557 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
558 ctdb_addr_info_push(cd->data.addr_info, buf);
561 case CTDB_CONTROL_WIPE_DATABASE:
562 ctdb_transdb_push(cd->data.transdb, buf);
565 case CTDB_CONTROL_TRY_DELETE_RECORDS:
566 ctdb_rec_buffer_push(cd->data.recbuf, buf);
569 case CTDB_CONTROL_ADD_PUBLIC_IP:
570 ctdb_addr_info_push(cd->data.addr_info, buf);
573 case CTDB_CONTROL_DEL_PUBLIC_IP:
574 ctdb_addr_info_push(cd->data.addr_info, buf);
577 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
578 ctdb_string_push(cd->data.event_str, buf);
581 case CTDB_CONTROL_RELEASE_IP:
582 ctdb_public_ip_push(cd->data.pubip, buf);
585 case CTDB_CONTROL_TAKEOVER_IP:
586 ctdb_public_ip_push(cd->data.pubip, buf);
589 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
590 ctdb_uint32_push(cd->data.event, buf);
593 case CTDB_CONTROL_TRAVERSE_KILL:
594 ctdb_traverse_start_push(cd->data.traverse_start, buf);
597 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
598 ctdb_double_push(cd->data.reclock_latency, buf);
601 case CTDB_CONTROL_SET_LMASTERROLE:
602 ctdb_uint32_push(cd->data.role, buf);
605 case CTDB_CONTROL_SET_RECMASTERROLE:
606 ctdb_uint32_push(cd->data.role, buf);
609 case CTDB_CONTROL_ENABLE_SCRIPT:
610 ctdb_string_push(cd->data.script, buf);
613 case CTDB_CONTROL_DISABLE_SCRIPT:
614 ctdb_string_push(cd->data.script, buf);
617 case CTDB_CONTROL_SET_BAN_STATE:
618 ctdb_ban_state_push(cd->data.ban_state, buf);
621 case CTDB_CONTROL_REGISTER_NOTIFY:
622 ctdb_notify_data_push(cd->data.notify, buf);
625 case CTDB_CONTROL_DEREGISTER_NOTIFY:
626 ctdb_uint64_push(cd->data.srvid, buf);
629 case CTDB_CONTROL_TRANS3_COMMIT:
630 ctdb_rec_buffer_push(cd->data.recbuf, buf);
633 case CTDB_CONTROL_GET_DB_SEQNUM:
634 ctdb_uint32_push(cd->data.db_id, buf);
637 case CTDB_CONTROL_DB_SET_HEALTHY:
638 ctdb_uint32_push(cd->data.db_id, buf);
641 case CTDB_CONTROL_DB_GET_HEALTH:
642 ctdb_uint32_push(cd->data.db_id, buf);
645 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
646 ctdb_sock_addr_push(cd->data.addr, buf);
649 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
650 ctdb_iface_push(cd->data.iface, buf);
653 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
654 ctdb_connection_push(cd->data.conn, buf);
657 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
658 ctdb_key_data_push(cd->data.key, buf);
661 case CTDB_CONTROL_SET_DB_READONLY:
662 ctdb_uint32_push(cd->data.db_id, buf);
665 case CTDB_CONTROL_CHECK_SRVIDS:
666 ctdb_uint64_array_push(cd->data.u64_array, buf);
669 case CTDB_CONTROL_TRAVERSE_START_EXT:
670 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf);
673 case CTDB_CONTROL_GET_DB_STATISTICS:
674 ctdb_uint32_push(cd->data.db_id, buf);
677 case CTDB_CONTROL_SET_DB_STICKY:
678 ctdb_uint32_push(cd->data.db_id, buf);
681 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
682 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf);
685 case CTDB_CONTROL_RECEIVE_RECORDS:
686 ctdb_rec_buffer_push(cd->data.recbuf, buf);
689 case CTDB_CONTROL_DB_DETACH:
690 ctdb_uint32_push(cd->data.db_id, buf);
693 case CTDB_CONTROL_DB_FREEZE:
694 ctdb_uint32_push(cd->data.db_id, buf);
697 case CTDB_CONTROL_DB_THAW:
698 ctdb_uint32_push(cd->data.db_id, buf);
701 case CTDB_CONTROL_DB_TRANSACTION_START:
702 ctdb_transdb_push(cd->data.transdb, buf);
705 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
706 ctdb_transdb_push(cd->data.transdb, buf);
709 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
710 ctdb_uint32_push(cd->data.db_id, buf);
713 case CTDB_CONTROL_DB_PULL:
714 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
717 case CTDB_CONTROL_DB_PUSH_START:
718 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
721 case CTDB_CONTROL_DB_PUSH_CONFIRM:
722 ctdb_uint32_push(cd->data.db_id, buf);
727 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
730 struct ctdb_req_control_data *cd)
737 case CTDB_CONTROL_PROCESS_EXISTS:
738 ret = ctdb_pid_pull(buf, buflen, mem_ctx,
742 case CTDB_CONTROL_GETDBPATH:
743 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
747 case CTDB_CONTROL_SETVNNMAP:
748 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
752 case CTDB_CONTROL_SET_DEBUG:
753 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
757 case CTDB_CONTROL_PULL_DB:
758 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
762 case CTDB_CONTROL_PUSH_DB:
763 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
767 case CTDB_CONTROL_SET_RECMODE:
768 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
772 case CTDB_CONTROL_DB_ATTACH:
773 ret = ctdb_string_pull(buf, buflen, mem_ctx,
777 case CTDB_CONTROL_SET_CALL:
780 case CTDB_CONTROL_TRAVERSE_START:
781 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
782 &cd->data.traverse_start);
785 case CTDB_CONTROL_TRAVERSE_ALL:
786 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
787 &cd->data.traverse_all);
790 case CTDB_CONTROL_TRAVERSE_DATA:
791 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
795 case CTDB_CONTROL_GET_DBNAME:
796 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
800 case CTDB_CONTROL_ENABLE_SEQNUM:
801 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
805 case CTDB_CONTROL_UPDATE_SEQNUM:
806 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
810 case CTDB_CONTROL_SET_RECMASTER:
811 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
812 &cd->data.recmaster);
815 case CTDB_CONTROL_TCP_CLIENT:
816 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
820 case CTDB_CONTROL_TCP_ADD:
821 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
825 case CTDB_CONTROL_TCP_REMOVE:
826 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
830 case CTDB_CONTROL_SET_TUNABLE:
831 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
835 case CTDB_CONTROL_GET_TUNABLE:
836 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
840 case CTDB_CONTROL_MODIFY_FLAGS:
841 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
842 &cd->data.flag_change);
845 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
846 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
850 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
851 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
855 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
856 ret = ctdb_string_pull(buf, buflen, mem_ctx,
860 case CTDB_CONTROL_UPDATE_RECORD:
861 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
865 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
866 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
867 &cd->data.addr_info);
870 case CTDB_CONTROL_WIPE_DATABASE:
871 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
875 case CTDB_CONTROL_TRY_DELETE_RECORDS:
876 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
880 case CTDB_CONTROL_ADD_PUBLIC_IP:
881 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
882 &cd->data.addr_info);
885 case CTDB_CONTROL_DEL_PUBLIC_IP:
886 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
887 &cd->data.addr_info);
890 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
891 ret = ctdb_string_pull(buf, buflen, mem_ctx,
892 &cd->data.event_str);
895 case CTDB_CONTROL_RELEASE_IP:
896 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
900 case CTDB_CONTROL_TAKEOVER_IP:
901 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
905 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
906 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
910 case CTDB_CONTROL_TRAVERSE_KILL:
911 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
912 &cd->data.traverse_start);
915 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
916 ret = ctdb_double_pull(buf, buflen, mem_ctx,
917 &cd->data.reclock_latency);
920 case CTDB_CONTROL_SET_LMASTERROLE:
921 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
925 case CTDB_CONTROL_SET_RECMASTERROLE:
926 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
930 case CTDB_CONTROL_ENABLE_SCRIPT:
931 ret = ctdb_string_pull(buf, buflen, mem_ctx,
935 case CTDB_CONTROL_DISABLE_SCRIPT:
936 ret = ctdb_string_pull(buf, buflen, mem_ctx,
940 case CTDB_CONTROL_SET_BAN_STATE:
941 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
942 &cd->data.ban_state);
945 case CTDB_CONTROL_REGISTER_NOTIFY:
946 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
950 case CTDB_CONTROL_DEREGISTER_NOTIFY:
951 ctdb_uint64_pull(buf, buflen, mem_ctx,
955 case CTDB_CONTROL_TRANS3_COMMIT:
956 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
960 case CTDB_CONTROL_GET_DB_SEQNUM:
961 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
965 case CTDB_CONTROL_DB_SET_HEALTHY:
966 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
970 case CTDB_CONTROL_DB_GET_HEALTH:
971 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
975 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
976 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
980 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
981 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
985 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
986 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
990 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
991 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
995 case CTDB_CONTROL_SET_DB_READONLY:
996 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1000 case CTDB_CONTROL_CHECK_SRVIDS:
1001 ret = ctdb_uint64_array_pull(buf, buflen, mem_ctx,
1002 &cd->data.u64_array);
1005 case CTDB_CONTROL_TRAVERSE_START_EXT:
1006 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
1007 &cd->data.traverse_start_ext);
1010 case CTDB_CONTROL_GET_DB_STATISTICS:
1011 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1015 case CTDB_CONTROL_SET_DB_STICKY:
1016 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1020 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1021 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
1022 &cd->data.traverse_all_ext);
1025 case CTDB_CONTROL_RECEIVE_RECORDS:
1026 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1030 case CTDB_CONTROL_DB_DETACH:
1031 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1035 case CTDB_CONTROL_DB_FREEZE:
1036 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1040 case CTDB_CONTROL_DB_THAW:
1041 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1045 case CTDB_CONTROL_DB_TRANSACTION_START:
1046 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1050 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1051 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1055 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1056 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1060 case CTDB_CONTROL_DB_PULL:
1061 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1062 &cd->data.pulldb_ext);
1065 case CTDB_CONTROL_DB_PUSH_START:
1066 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1067 &cd->data.pulldb_ext);
1070 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1071 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1079 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1087 switch (cd->opcode) {
1088 case CTDB_CONTROL_PROCESS_EXISTS:
1091 case CTDB_CONTROL_STATISTICS:
1092 len = ctdb_statistics_len(cd->data.stats);
1095 case CTDB_CONTROL_PING:
1098 case CTDB_CONTROL_GETDBPATH:
1099 len = ctdb_string_len(cd->data.db_path);
1102 case CTDB_CONTROL_GETVNNMAP:
1103 len = ctdb_vnn_map_len(cd->data.vnnmap);
1106 case CTDB_CONTROL_SETVNNMAP:
1109 case CTDB_CONTROL_GET_DEBUG:
1110 len = ctdb_uint32_len(cd->data.loglevel);
1113 case CTDB_CONTROL_SET_DEBUG:
1116 case CTDB_CONTROL_GET_DBMAP:
1117 len = ctdb_dbid_map_len(cd->data.dbmap);
1120 case CTDB_CONTROL_PULL_DB:
1121 len = ctdb_rec_buffer_len(cd->data.recbuf);
1124 case CTDB_CONTROL_PUSH_DB:
1127 case CTDB_CONTROL_GET_RECMODE:
1130 case CTDB_CONTROL_SET_RECMODE:
1133 case CTDB_CONTROL_STATISTICS_RESET:
1136 case CTDB_CONTROL_DB_ATTACH:
1137 len = ctdb_uint32_len(cd->data.db_id);
1140 case CTDB_CONTROL_SET_CALL:
1143 case CTDB_CONTROL_TRAVERSE_START:
1146 case CTDB_CONTROL_TRAVERSE_ALL:
1149 case CTDB_CONTROL_TRAVERSE_DATA:
1152 case CTDB_CONTROL_REGISTER_SRVID:
1155 case CTDB_CONTROL_DEREGISTER_SRVID:
1158 case CTDB_CONTROL_GET_DBNAME:
1159 len = ctdb_string_len(cd->data.db_name);
1162 case CTDB_CONTROL_ENABLE_SEQNUM:
1165 case CTDB_CONTROL_UPDATE_SEQNUM:
1168 case CTDB_CONTROL_DUMP_MEMORY:
1169 len = ctdb_string_len(cd->data.mem_str);
1172 case CTDB_CONTROL_GET_PID:
1175 case CTDB_CONTROL_GET_RECMASTER:
1178 case CTDB_CONTROL_SET_RECMASTER:
1181 case CTDB_CONTROL_FREEZE:
1184 case CTDB_CONTROL_GET_PNN:
1187 case CTDB_CONTROL_SHUTDOWN:
1190 case CTDB_CONTROL_GET_MONMODE:
1193 case CTDB_CONTROL_TCP_CLIENT:
1196 case CTDB_CONTROL_TCP_ADD:
1199 case CTDB_CONTROL_TCP_REMOVE:
1202 case CTDB_CONTROL_STARTUP:
1205 case CTDB_CONTROL_SET_TUNABLE:
1208 case CTDB_CONTROL_GET_TUNABLE:
1209 len = ctdb_uint32_len(cd->data.tun_value);
1212 case CTDB_CONTROL_LIST_TUNABLES:
1213 len = ctdb_var_list_len(cd->data.tun_var_list);
1216 case CTDB_CONTROL_MODIFY_FLAGS:
1219 case CTDB_CONTROL_GET_ALL_TUNABLES:
1220 len = ctdb_tunable_list_len(cd->data.tun_list);
1223 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1224 len = ctdb_tickle_list_len(cd->data.tickles);
1227 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1230 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1231 len = ctdb_uint32_len(cd->data.db_id);
1234 case CTDB_CONTROL_UPDATE_RECORD:
1237 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1240 case CTDB_CONTROL_WIPE_DATABASE:
1243 case CTDB_CONTROL_UPTIME:
1244 len = ctdb_uptime_len(cd->data.uptime);
1247 case CTDB_CONTROL_START_RECOVERY:
1250 case CTDB_CONTROL_END_RECOVERY:
1253 case CTDB_CONTROL_RELOAD_NODES_FILE:
1256 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1257 len = ctdb_rec_buffer_len(cd->data.recbuf);
1260 case CTDB_CONTROL_ENABLE_MONITOR:
1263 case CTDB_CONTROL_DISABLE_MONITOR:
1266 case CTDB_CONTROL_ADD_PUBLIC_IP:
1269 case CTDB_CONTROL_DEL_PUBLIC_IP:
1272 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
1275 case CTDB_CONTROL_GET_CAPABILITIES:
1276 len = ctdb_uint32_len(cd->data.caps);
1279 case CTDB_CONTROL_RECD_PING:
1282 case CTDB_CONTROL_RELEASE_IP:
1285 case CTDB_CONTROL_TAKEOVER_IP:
1288 case CTDB_CONTROL_GET_PUBLIC_IPS:
1289 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1292 case CTDB_CONTROL_GET_NODEMAP:
1293 len = ctdb_node_map_len(cd->data.nodemap);
1296 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1297 len = ctdb_script_list_len(cd->data.script_list);
1300 case CTDB_CONTROL_TRAVERSE_KILL:
1303 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1306 case CTDB_CONTROL_GET_RECLOCK_FILE:
1307 len = ctdb_string_len(cd->data.reclock_file);
1310 case CTDB_CONTROL_STOP_NODE:
1313 case CTDB_CONTROL_CONTINUE_NODE:
1316 case CTDB_CONTROL_SET_LMASTERROLE:
1319 case CTDB_CONTROL_SET_RECMASTERROLE:
1322 case CTDB_CONTROL_ENABLE_SCRIPT:
1325 case CTDB_CONTROL_DISABLE_SCRIPT:
1328 case CTDB_CONTROL_SET_BAN_STATE:
1331 case CTDB_CONTROL_GET_BAN_STATE:
1332 len = ctdb_ban_state_len(cd->data.ban_state);
1335 case CTDB_CONTROL_SET_DB_PRIORITY:
1338 case CTDB_CONTROL_GET_DB_PRIORITY:
1341 case CTDB_CONTROL_REGISTER_NOTIFY:
1344 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1347 case CTDB_CONTROL_TRANS3_COMMIT:
1350 case CTDB_CONTROL_GET_DB_SEQNUM:
1351 len = ctdb_uint64_len(cd->data.seqnum);
1354 case CTDB_CONTROL_DB_SET_HEALTHY:
1357 case CTDB_CONTROL_DB_GET_HEALTH:
1358 len = ctdb_string_len(cd->data.reason);
1361 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1362 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1365 case CTDB_CONTROL_GET_IFACES:
1366 len = ctdb_iface_list_len(cd->data.iface_list);
1369 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1372 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1375 case CTDB_CONTROL_GET_STAT_HISTORY:
1376 len = ctdb_statistics_list_len(cd->data.stats_list);
1379 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1382 case CTDB_CONTROL_SET_DB_READONLY:
1385 case CTDB_CONTROL_CHECK_SRVIDS:
1386 len = ctdb_uint8_array_len(cd->data.u8_array);
1389 case CTDB_CONTROL_TRAVERSE_START_EXT:
1392 case CTDB_CONTROL_GET_DB_STATISTICS:
1393 len = ctdb_db_statistics_len(cd->data.dbstats);
1396 case CTDB_CONTROL_SET_DB_STICKY:
1399 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1402 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1405 case CTDB_CONTROL_RECEIVE_RECORDS:
1406 len = ctdb_rec_buffer_len(cd->data.recbuf);
1409 case CTDB_CONTROL_IPREALLOCATED:
1412 case CTDB_CONTROL_GET_RUNSTATE:
1413 len = ctdb_uint32_len(cd->data.runstate);
1416 case CTDB_CONTROL_DB_DETACH:
1419 case CTDB_CONTROL_GET_NODES_FILE:
1420 len = ctdb_node_map_len(cd->data.nodemap);
1423 case CTDB_CONTROL_DB_FREEZE:
1426 case CTDB_CONTROL_DB_THAW:
1429 case CTDB_CONTROL_DB_TRANSACTION_START:
1432 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1435 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1438 case CTDB_CONTROL_DB_PULL:
1439 len = ctdb_uint32_len(cd->data.num_records);
1442 case CTDB_CONTROL_DB_PUSH_START:
1445 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1446 len = ctdb_uint32_len(cd->data.num_records);
1453 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1456 switch (cd->opcode) {
1457 case CTDB_CONTROL_STATISTICS:
1458 ctdb_statistics_push(cd->data.stats, buf);
1461 case CTDB_CONTROL_GETDBPATH:
1462 ctdb_string_push(cd->data.db_path, buf);
1465 case CTDB_CONTROL_GETVNNMAP:
1466 ctdb_vnn_map_push(cd->data.vnnmap, buf);
1469 case CTDB_CONTROL_GET_DEBUG:
1470 ctdb_uint32_push(cd->data.loglevel, buf);
1473 case CTDB_CONTROL_GET_DBMAP:
1474 ctdb_dbid_map_push(cd->data.dbmap, buf);
1477 case CTDB_CONTROL_PULL_DB:
1478 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1481 case CTDB_CONTROL_PUSH_DB:
1484 case CTDB_CONTROL_DB_ATTACH:
1485 ctdb_uint32_push(cd->data.db_id, buf);
1488 case CTDB_CONTROL_GET_DBNAME:
1489 ctdb_string_push(cd->data.db_name, buf);
1492 case CTDB_CONTROL_DUMP_MEMORY:
1493 ctdb_string_push(cd->data.mem_str, buf);
1496 case CTDB_CONTROL_GET_PID:
1499 case CTDB_CONTROL_GET_RECMASTER:
1502 case CTDB_CONTROL_GET_TUNABLE:
1503 ctdb_uint32_push(cd->data.tun_value, buf);
1506 case CTDB_CONTROL_LIST_TUNABLES:
1507 ctdb_var_list_push(cd->data.tun_var_list, buf);
1510 case CTDB_CONTROL_GET_ALL_TUNABLES:
1511 ctdb_tunable_list_push(cd->data.tun_list, buf);
1514 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1515 ctdb_tickle_list_push(cd->data.tickles, buf);
1518 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1519 ctdb_uint32_push(cd->data.db_id, buf);
1522 case CTDB_CONTROL_UPTIME:
1523 ctdb_uptime_push(cd->data.uptime, buf);
1526 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1527 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1530 case CTDB_CONTROL_GET_CAPABILITIES:
1531 ctdb_uint32_push(cd->data.caps, buf);
1534 case CTDB_CONTROL_GET_PUBLIC_IPS:
1535 ctdb_public_ip_list_push(cd->data.pubip_list, buf);
1538 case CTDB_CONTROL_GET_NODEMAP:
1539 ctdb_node_map_push(cd->data.nodemap, buf);
1542 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1543 ctdb_script_list_push(cd->data.script_list, buf);
1546 case CTDB_CONTROL_GET_RECLOCK_FILE:
1547 ctdb_string_push(cd->data.reclock_file, buf);
1550 case CTDB_CONTROL_GET_BAN_STATE:
1551 ctdb_ban_state_push(cd->data.ban_state, buf);
1554 case CTDB_CONTROL_GET_DB_PRIORITY:
1557 case CTDB_CONTROL_GET_DB_SEQNUM:
1558 ctdb_uint64_push(cd->data.seqnum, buf);
1561 case CTDB_CONTROL_DB_GET_HEALTH:
1562 ctdb_string_push(cd->data.reason, buf);
1565 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1566 ctdb_public_ip_info_push(cd->data.ipinfo, buf);
1569 case CTDB_CONTROL_GET_IFACES:
1570 ctdb_iface_list_push(cd->data.iface_list, buf);
1573 case CTDB_CONTROL_GET_STAT_HISTORY:
1574 ctdb_statistics_list_push(cd->data.stats_list, buf);
1577 case CTDB_CONTROL_CHECK_SRVIDS:
1578 ctdb_uint8_array_push(cd->data.u8_array, buf);
1581 case CTDB_CONTROL_GET_DB_STATISTICS:
1582 ctdb_db_statistics_push(cd->data.dbstats, buf);
1585 case CTDB_CONTROL_RECEIVE_RECORDS:
1586 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1589 case CTDB_CONTROL_GET_RUNSTATE:
1590 ctdb_uint32_push(cd->data.runstate, buf);
1593 case CTDB_CONTROL_GET_NODES_FILE:
1594 ctdb_node_map_push(cd->data.nodemap, buf);
1597 case CTDB_CONTROL_DB_PULL:
1598 ctdb_uint32_push(cd->data.num_records, buf);
1601 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1602 ctdb_uint32_push(cd->data.num_records, buf);
1607 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1608 uint32_t opcode, TALLOC_CTX *mem_ctx,
1609 struct ctdb_reply_control_data *cd)
1612 cd->opcode = opcode;
1615 case CTDB_CONTROL_STATISTICS:
1616 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1620 case CTDB_CONTROL_GETDBPATH:
1621 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1625 case CTDB_CONTROL_GETVNNMAP:
1626 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1630 case CTDB_CONTROL_GET_DEBUG:
1631 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1632 &cd->data.loglevel);
1635 case CTDB_CONTROL_GET_DBMAP:
1636 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1640 case CTDB_CONTROL_PULL_DB:
1641 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1645 case CTDB_CONTROL_PUSH_DB:
1648 case CTDB_CONTROL_DB_ATTACH:
1649 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1653 case CTDB_CONTROL_GET_DBNAME:
1654 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1658 case CTDB_CONTROL_DUMP_MEMORY:
1659 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1663 case CTDB_CONTROL_GET_PID:
1666 case CTDB_CONTROL_GET_RECMASTER:
1669 case CTDB_CONTROL_GET_TUNABLE:
1670 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1671 &cd->data.tun_value);
1674 case CTDB_CONTROL_LIST_TUNABLES:
1675 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1676 &cd->data.tun_var_list);
1679 case CTDB_CONTROL_GET_ALL_TUNABLES:
1680 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1681 &cd->data.tun_list);
1684 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1685 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1689 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1690 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1694 case CTDB_CONTROL_UPTIME:
1695 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1699 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1700 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1704 case CTDB_CONTROL_GET_CAPABILITIES:
1705 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1709 case CTDB_CONTROL_GET_PUBLIC_IPS:
1710 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1711 &cd->data.pubip_list);
1714 case CTDB_CONTROL_GET_NODEMAP:
1715 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1719 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1720 ret = ctdb_script_list_pull(buf, buflen, mem_ctx,
1721 &cd->data.script_list);
1724 case CTDB_CONTROL_GET_RECLOCK_FILE:
1725 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1726 &cd->data.reclock_file);
1729 case CTDB_CONTROL_GET_BAN_STATE:
1730 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1731 &cd->data.ban_state);
1734 case CTDB_CONTROL_GET_DB_PRIORITY:
1737 case CTDB_CONTROL_GET_DB_SEQNUM:
1738 ret = ctdb_uint64_pull(buf, buflen, mem_ctx,
1742 case CTDB_CONTROL_DB_GET_HEALTH:
1743 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1747 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1748 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1752 case CTDB_CONTROL_GET_IFACES:
1753 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1754 &cd->data.iface_list);
1757 case CTDB_CONTROL_GET_STAT_HISTORY:
1758 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1759 &cd->data.stats_list);
1762 case CTDB_CONTROL_CHECK_SRVIDS:
1763 ret = ctdb_uint8_array_pull(buf, buflen, mem_ctx,
1764 &cd->data.u8_array);
1767 case CTDB_CONTROL_GET_DB_STATISTICS:
1768 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1772 case CTDB_CONTROL_RECEIVE_RECORDS:
1773 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1777 case CTDB_CONTROL_GET_RUNSTATE:
1778 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1779 &cd->data.runstate);
1782 case CTDB_CONTROL_GET_NODES_FILE:
1783 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1787 case CTDB_CONTROL_DB_PULL:
1788 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1789 &cd->data.num_records);
1792 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1793 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1794 &cd->data.num_records);
1801 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1802 struct ctdb_req_control *c)
1804 return offsetof(struct ctdb_req_control_wire, data) +
1805 ctdb_req_control_data_len(&c->rdata);
1808 int ctdb_req_control_push(struct ctdb_req_header *h,
1809 struct ctdb_req_control *request,
1810 uint8_t *buf, size_t *buflen)
1812 struct ctdb_req_control_wire *wire =
1813 (struct ctdb_req_control_wire *)buf;
1816 length = ctdb_req_control_len(h, request);
1817 if (*buflen < length) {
1822 h->length = *buflen;
1823 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1825 wire->opcode = request->opcode;
1826 wire->pad = request->pad;
1827 wire->srvid = request->srvid;
1828 wire->client_id = request->client_id;
1829 wire->flags = request->flags;
1831 wire->datalen = ctdb_req_control_data_len(&request->rdata);
1832 ctdb_req_control_data_push(&request->rdata, wire->data);
1837 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1838 struct ctdb_req_header *h,
1839 TALLOC_CTX *mem_ctx,
1840 struct ctdb_req_control *c)
1842 struct ctdb_req_control_wire *wire =
1843 (struct ctdb_req_control_wire *)buf;
1847 length = offsetof(struct ctdb_req_control_wire, data);
1848 if (buflen < length) {
1851 if (wire->datalen > buflen) {
1854 if (length + wire->datalen < length) {
1857 if (buflen < length + wire->datalen) {
1862 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1868 c->opcode = wire->opcode;
1870 c->srvid = wire->srvid;
1871 c->client_id = wire->client_id;
1872 c->flags = wire->flags;
1874 ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1875 c->opcode, mem_ctx, &c->rdata);
1883 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1884 struct ctdb_reply_control *c)
1886 return offsetof(struct ctdb_reply_control_wire, data) +
1888 ctdb_reply_control_data_len(&c->rdata) :
1889 ctdb_string_len(c->errmsg));
1892 int ctdb_reply_control_push(struct ctdb_req_header *h,
1893 struct ctdb_reply_control *reply,
1894 uint8_t *buf, size_t *buflen)
1896 struct ctdb_reply_control_wire *wire =
1897 (struct ctdb_reply_control_wire *)buf;
1900 length = ctdb_reply_control_len(h, reply);
1901 if (*buflen < length) {
1906 h->length = *buflen;
1907 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1909 wire->status = reply->status;
1911 if (reply->status == 0) {
1912 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1914 ctdb_reply_control_data_push(&reply->rdata, wire->data);
1917 wire->errorlen = ctdb_string_len(reply->errmsg);
1918 ctdb_string_push(reply->errmsg, wire->data + wire->datalen);
1924 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1925 struct ctdb_req_header *h,
1926 TALLOC_CTX *mem_ctx,
1927 struct ctdb_reply_control *c)
1929 struct ctdb_reply_control_wire *wire =
1930 (struct ctdb_reply_control_wire *)buf;
1934 length = offsetof(struct ctdb_reply_control_wire, data);
1935 if (buflen < length) {
1938 if (wire->datalen > buflen || wire->errorlen > buflen) {
1941 if (length + wire->datalen < length) {
1944 if (length + wire->datalen + wire->errorlen < length) {
1947 if (buflen < length + wire->datalen + wire->errorlen) {
1952 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1958 c->status = wire->status;
1960 if (c->status != -1) {
1961 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
1969 ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
1970 mem_ctx, &c->errmsg);