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)
59 case CTDB_CONTROL_PROCESS_EXISTS:
60 len = ctdb_pid_len(cd->data.pid);
63 case CTDB_CONTROL_STATISTICS:
66 case CTDB_CONTROL_PING:
69 case CTDB_CONTROL_GETDBPATH:
70 len = ctdb_uint32_len(cd->data.db_id);
73 case CTDB_CONTROL_GETVNNMAP:
76 case CTDB_CONTROL_SETVNNMAP:
77 len = ctdb_vnn_map_len(cd->data.vnnmap);
80 case CTDB_CONTROL_GET_DEBUG:
83 case CTDB_CONTROL_SET_DEBUG:
84 len = ctdb_uint32_len(cd->data.loglevel);
87 case CTDB_CONTROL_GET_DBMAP:
90 case CTDB_CONTROL_PULL_DB:
91 len = ctdb_pulldb_len(cd->data.pulldb);
94 case CTDB_CONTROL_PUSH_DB:
95 len = ctdb_rec_buffer_len(cd->data.recbuf);
98 case CTDB_CONTROL_GET_RECMODE:
101 case CTDB_CONTROL_SET_RECMODE:
102 len = ctdb_uint32_len(cd->data.recmode);
105 case CTDB_CONTROL_STATISTICS_RESET:
108 case CTDB_CONTROL_DB_ATTACH:
109 len = ctdb_string_len(cd->data.db_name);
112 case CTDB_CONTROL_SET_CALL:
115 case CTDB_CONTROL_TRAVERSE_START:
116 len = ctdb_traverse_start_len(cd->data.traverse_start);
119 case CTDB_CONTROL_TRAVERSE_ALL:
120 len = ctdb_traverse_all_len(cd->data.traverse_all);
123 case CTDB_CONTROL_TRAVERSE_DATA:
124 len = ctdb_rec_data_len(cd->data.rec_data);
127 case CTDB_CONTROL_REGISTER_SRVID:
130 case CTDB_CONTROL_DEREGISTER_SRVID:
133 case CTDB_CONTROL_GET_DBNAME:
134 len = ctdb_uint32_len(cd->data.db_id);
137 case CTDB_CONTROL_ENABLE_SEQNUM:
138 len = ctdb_uint32_len(cd->data.db_id);
141 case CTDB_CONTROL_UPDATE_SEQNUM:
142 len = ctdb_uint32_len(cd->data.db_id);
145 case CTDB_CONTROL_DUMP_MEMORY:
148 case CTDB_CONTROL_GET_PID:
151 case CTDB_CONTROL_GET_RECMASTER:
154 case CTDB_CONTROL_SET_RECMASTER:
155 len = ctdb_uint32_len(cd->data.recmaster);
158 case CTDB_CONTROL_FREEZE:
161 case CTDB_CONTROL_GET_PNN:
164 case CTDB_CONTROL_SHUTDOWN:
167 case CTDB_CONTROL_GET_MONMODE:
170 case CTDB_CONTROL_TCP_CLIENT:
171 len = ctdb_connection_len(cd->data.conn);
174 case CTDB_CONTROL_TCP_ADD:
175 len = ctdb_connection_len(cd->data.conn);
178 case CTDB_CONTROL_TCP_REMOVE:
179 len = ctdb_connection_len(cd->data.conn);
182 case CTDB_CONTROL_STARTUP:
185 case CTDB_CONTROL_SET_TUNABLE:
186 len = ctdb_tunable_len(cd->data.tunable);
189 case CTDB_CONTROL_GET_TUNABLE:
190 len = ctdb_stringn_len(cd->data.tun_var);
193 case CTDB_CONTROL_LIST_TUNABLES:
196 case CTDB_CONTROL_MODIFY_FLAGS:
197 len = ctdb_node_flag_change_len(cd->data.flag_change);
200 case CTDB_CONTROL_GET_ALL_TUNABLES:
203 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
204 len = ctdb_sock_addr_len(cd->data.addr);
207 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
208 len = ctdb_tickle_list_len(cd->data.tickles);
211 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
212 len = ctdb_string_len(cd->data.db_name);
215 case CTDB_CONTROL_UPDATE_RECORD:
216 len = ctdb_rec_buffer_len(cd->data.recbuf);
219 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
220 len = ctdb_addr_info_len(cd->data.addr_info);
223 case CTDB_CONTROL_TRANSACTION_START:
224 len = ctdb_uint32_len(cd->data.tid);
227 case CTDB_CONTROL_TRANSACTION_COMMIT:
228 len = ctdb_uint32_len(cd->data.tid);
231 case CTDB_CONTROL_WIPE_DATABASE:
232 len = ctdb_transdb_len(cd->data.transdb);
235 case CTDB_CONTROL_UPTIME:
238 case CTDB_CONTROL_START_RECOVERY:
241 case CTDB_CONTROL_END_RECOVERY:
244 case CTDB_CONTROL_RELOAD_NODES_FILE:
247 case CTDB_CONTROL_TRY_DELETE_RECORDS:
248 len = ctdb_rec_buffer_len(cd->data.recbuf);
251 case CTDB_CONTROL_ENABLE_MONITOR:
254 case CTDB_CONTROL_DISABLE_MONITOR:
257 case CTDB_CONTROL_ADD_PUBLIC_IP:
258 len = ctdb_addr_info_len(cd->data.addr_info);
261 case CTDB_CONTROL_DEL_PUBLIC_IP:
262 len = ctdb_addr_info_len(cd->data.addr_info);
265 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
266 len = ctdb_string_len(cd->data.event_str);
269 case CTDB_CONTROL_GET_CAPABILITIES:
272 case CTDB_CONTROL_RECD_PING:
275 case CTDB_CONTROL_RELEASE_IP:
276 len = ctdb_public_ip_len(cd->data.pubip);
279 case CTDB_CONTROL_TAKEOVER_IP:
280 len = ctdb_public_ip_len(cd->data.pubip);
283 case CTDB_CONTROL_GET_PUBLIC_IPS:
286 case CTDB_CONTROL_GET_NODEMAP:
289 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
290 len = ctdb_uint32_len(cd->data.event);
293 case CTDB_CONTROL_TRAVERSE_KILL:
294 len = ctdb_traverse_start_len(cd->data.traverse_start);
297 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
298 len = ctdb_double_len(cd->data.reclock_latency);
301 case CTDB_CONTROL_GET_RECLOCK_FILE:
304 case CTDB_CONTROL_STOP_NODE:
307 case CTDB_CONTROL_CONTINUE_NODE:
310 case CTDB_CONTROL_SET_LMASTERROLE:
311 len = ctdb_uint32_len(cd->data.role);
314 case CTDB_CONTROL_SET_RECMASTERROLE:
315 len = ctdb_uint32_len(cd->data.role);
318 case CTDB_CONTROL_ENABLE_SCRIPT:
319 len = ctdb_string_len(cd->data.script);
322 case CTDB_CONTROL_DISABLE_SCRIPT:
323 len = ctdb_string_len(cd->data.script);
326 case CTDB_CONTROL_SET_BAN_STATE:
327 len = ctdb_ban_state_len(cd->data.ban_state);
330 case CTDB_CONTROL_GET_BAN_STATE:
333 case CTDB_CONTROL_TRANSACTION_CANCEL:
336 case CTDB_CONTROL_REGISTER_NOTIFY:
337 len = ctdb_notify_data_len(cd->data.notify);
340 case CTDB_CONTROL_DEREGISTER_NOTIFY:
341 len = ctdb_uint64_len(cd->data.srvid);
344 case CTDB_CONTROL_TRANS3_COMMIT:
345 len = ctdb_rec_buffer_len(cd->data.recbuf);
348 case CTDB_CONTROL_GET_DB_SEQNUM:
349 u64 = cd->data.db_id;
350 len = ctdb_uint64_len(u64);
353 case CTDB_CONTROL_DB_SET_HEALTHY:
354 len = ctdb_uint32_len(cd->data.db_id);
357 case CTDB_CONTROL_DB_GET_HEALTH:
358 len = ctdb_uint32_len(cd->data.db_id);
361 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
362 len = ctdb_sock_addr_len(cd->data.addr);
365 case CTDB_CONTROL_GET_IFACES:
368 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
369 len = ctdb_iface_len(cd->data.iface);
372 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
373 len = ctdb_connection_len(cd->data.conn);
376 case CTDB_CONTROL_GET_STAT_HISTORY:
379 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
380 len = ctdb_key_data_len(cd->data.key);
383 case CTDB_CONTROL_SET_DB_READONLY:
384 len = ctdb_uint32_len(cd->data.db_id);
387 case CTDB_CONTROL_CHECK_SRVIDS:
388 len = ctdb_uint64_array_len(cd->data.u64_array);
391 case CTDB_CONTROL_TRAVERSE_START_EXT:
392 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
395 case CTDB_CONTROL_GET_DB_STATISTICS:
396 len = ctdb_uint32_len(cd->data.db_id);
399 case CTDB_CONTROL_SET_DB_STICKY:
400 len = ctdb_uint32_len(cd->data.db_id);
403 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
406 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
407 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
410 case CTDB_CONTROL_RECEIVE_RECORDS:
411 len = ctdb_rec_buffer_len(cd->data.recbuf);
414 case CTDB_CONTROL_IPREALLOCATED:
417 case CTDB_CONTROL_GET_RUNSTATE:
420 case CTDB_CONTROL_DB_DETACH:
421 len = ctdb_uint32_len(cd->data.db_id);
424 case CTDB_CONTROL_GET_NODES_FILE:
427 case CTDB_CONTROL_DB_FREEZE:
428 len = ctdb_uint32_len(cd->data.db_id);
431 case CTDB_CONTROL_DB_THAW:
432 len = ctdb_uint32_len(cd->data.db_id);
435 case CTDB_CONTROL_DB_TRANSACTION_START:
436 len = ctdb_transdb_len(cd->data.transdb);
439 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
440 len = ctdb_transdb_len(cd->data.transdb);
443 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
444 len = ctdb_uint32_len(cd->data.db_id);
447 case CTDB_CONTROL_DB_PULL:
448 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
451 case CTDB_CONTROL_DB_PUSH_START:
452 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
455 case CTDB_CONTROL_DB_PUSH_CONFIRM:
456 len = ctdb_uint32_len(cd->data.db_id);
463 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
468 switch (cd->opcode) {
469 case CTDB_CONTROL_PROCESS_EXISTS:
470 ctdb_pid_push(cd->data.pid, buf);
473 case CTDB_CONTROL_GETDBPATH:
474 ctdb_uint32_push(cd->data.db_id, buf);
477 case CTDB_CONTROL_SETVNNMAP:
478 ctdb_vnn_map_push(cd->data.vnnmap, buf);
481 case CTDB_CONTROL_SET_DEBUG:
482 ctdb_uint32_push(cd->data.loglevel, buf);
485 case CTDB_CONTROL_PULL_DB:
486 ctdb_pulldb_push(cd->data.pulldb, buf);
489 case CTDB_CONTROL_PUSH_DB:
490 ctdb_rec_buffer_push(cd->data.recbuf, buf);
493 case CTDB_CONTROL_SET_RECMODE:
494 ctdb_uint32_push(cd->data.recmode, buf);
497 case CTDB_CONTROL_DB_ATTACH:
498 ctdb_string_push(cd->data.db_name, buf);
501 case CTDB_CONTROL_SET_CALL:
504 case CTDB_CONTROL_TRAVERSE_START:
505 ctdb_traverse_start_push(cd->data.traverse_start, buf);
508 case CTDB_CONTROL_TRAVERSE_ALL:
509 ctdb_traverse_all_push(cd->data.traverse_all, buf);
512 case CTDB_CONTROL_TRAVERSE_DATA:
513 ctdb_rec_data_push(cd->data.rec_data, buf);
516 case CTDB_CONTROL_GET_DBNAME:
517 ctdb_uint32_push(cd->data.db_id, buf);
520 case CTDB_CONTROL_ENABLE_SEQNUM:
521 ctdb_uint32_push(cd->data.db_id, buf);
524 case CTDB_CONTROL_UPDATE_SEQNUM:
525 ctdb_uint32_push(cd->data.db_id, buf);
528 case CTDB_CONTROL_SET_RECMASTER:
529 ctdb_uint32_push(cd->data.recmaster, buf);
532 case CTDB_CONTROL_TCP_CLIENT:
533 ctdb_connection_push(cd->data.conn, buf);
536 case CTDB_CONTROL_TCP_ADD:
537 ctdb_connection_push(cd->data.conn, buf);
540 case CTDB_CONTROL_TCP_REMOVE:
541 ctdb_connection_push(cd->data.conn, buf);
544 case CTDB_CONTROL_SET_TUNABLE:
545 ctdb_tunable_push(cd->data.tunable, buf);
548 case CTDB_CONTROL_GET_TUNABLE:
549 ctdb_stringn_push(cd->data.tun_var, buf);
552 case CTDB_CONTROL_MODIFY_FLAGS:
553 ctdb_node_flag_change_push(cd->data.flag_change, buf);
556 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
557 ctdb_sock_addr_push(cd->data.addr, buf);
560 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
561 ctdb_tickle_list_push(cd->data.tickles, buf);
564 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
565 ctdb_string_push(cd->data.db_name, buf);
568 case CTDB_CONTROL_UPDATE_RECORD:
569 ctdb_rec_buffer_push(cd->data.recbuf, buf);
572 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
573 ctdb_addr_info_push(cd->data.addr_info, buf);
576 case CTDB_CONTROL_TRANSACTION_START:
577 ctdb_uint32_push(cd->data.tid, buf);
580 case CTDB_CONTROL_TRANSACTION_COMMIT:
581 ctdb_uint32_push(cd->data.tid, buf);
584 case CTDB_CONTROL_WIPE_DATABASE:
585 ctdb_transdb_push(cd->data.transdb, buf);
588 case CTDB_CONTROL_TRY_DELETE_RECORDS:
589 ctdb_rec_buffer_push(cd->data.recbuf, buf);
592 case CTDB_CONTROL_ADD_PUBLIC_IP:
593 ctdb_addr_info_push(cd->data.addr_info, buf);
596 case CTDB_CONTROL_DEL_PUBLIC_IP:
597 ctdb_addr_info_push(cd->data.addr_info, buf);
600 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
601 ctdb_string_push(cd->data.event_str, buf);
604 case CTDB_CONTROL_RELEASE_IP:
605 ctdb_public_ip_push(cd->data.pubip, buf);
608 case CTDB_CONTROL_TAKEOVER_IP:
609 ctdb_public_ip_push(cd->data.pubip, buf);
612 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
613 ctdb_uint32_push(cd->data.event, buf);
616 case CTDB_CONTROL_TRAVERSE_KILL:
617 ctdb_traverse_start_push(cd->data.traverse_start, buf);
620 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
621 ctdb_double_push(cd->data.reclock_latency, buf);
624 case CTDB_CONTROL_SET_LMASTERROLE:
625 ctdb_uint32_push(cd->data.role, buf);
628 case CTDB_CONTROL_SET_RECMASTERROLE:
629 ctdb_uint32_push(cd->data.role, buf);
632 case CTDB_CONTROL_ENABLE_SCRIPT:
633 ctdb_string_push(cd->data.script, buf);
636 case CTDB_CONTROL_DISABLE_SCRIPT:
637 ctdb_string_push(cd->data.script, buf);
640 case CTDB_CONTROL_SET_BAN_STATE:
641 ctdb_ban_state_push(cd->data.ban_state, buf);
644 case CTDB_CONTROL_REGISTER_NOTIFY:
645 ctdb_notify_data_push(cd->data.notify, buf);
648 case CTDB_CONTROL_DEREGISTER_NOTIFY:
649 ctdb_uint64_push(cd->data.srvid, buf);
652 case CTDB_CONTROL_TRANS3_COMMIT:
653 ctdb_rec_buffer_push(cd->data.recbuf, buf);
656 case CTDB_CONTROL_GET_DB_SEQNUM:
657 u64 = cd->data.db_id;
658 ctdb_uint64_push(u64, buf);
661 case CTDB_CONTROL_DB_SET_HEALTHY:
662 ctdb_uint32_push(cd->data.db_id, buf);
665 case CTDB_CONTROL_DB_GET_HEALTH:
666 ctdb_uint32_push(cd->data.db_id, buf);
669 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
670 ctdb_sock_addr_push(cd->data.addr, buf);
673 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
674 ctdb_iface_push(cd->data.iface, buf);
677 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
678 ctdb_connection_push(cd->data.conn, buf);
681 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
682 ctdb_key_data_push(cd->data.key, buf);
685 case CTDB_CONTROL_SET_DB_READONLY:
686 ctdb_uint32_push(cd->data.db_id, buf);
689 case CTDB_CONTROL_CHECK_SRVIDS:
690 ctdb_uint64_array_push(cd->data.u64_array, buf);
693 case CTDB_CONTROL_TRAVERSE_START_EXT:
694 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf);
697 case CTDB_CONTROL_GET_DB_STATISTICS:
698 ctdb_uint32_push(cd->data.db_id, buf);
701 case CTDB_CONTROL_SET_DB_STICKY:
702 ctdb_uint32_push(cd->data.db_id, buf);
705 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
706 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf);
709 case CTDB_CONTROL_RECEIVE_RECORDS:
710 ctdb_rec_buffer_push(cd->data.recbuf, buf);
713 case CTDB_CONTROL_DB_DETACH:
714 ctdb_uint32_push(cd->data.db_id, buf);
717 case CTDB_CONTROL_DB_FREEZE:
718 ctdb_uint32_push(cd->data.db_id, buf);
721 case CTDB_CONTROL_DB_THAW:
722 ctdb_uint32_push(cd->data.db_id, buf);
725 case CTDB_CONTROL_DB_TRANSACTION_START:
726 ctdb_transdb_push(cd->data.transdb, buf);
729 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
730 ctdb_transdb_push(cd->data.transdb, buf);
733 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
734 ctdb_uint32_push(cd->data.db_id, buf);
737 case CTDB_CONTROL_DB_PULL:
738 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
741 case CTDB_CONTROL_DB_PUSH_START:
742 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
745 case CTDB_CONTROL_DB_PUSH_CONFIRM:
746 ctdb_uint32_push(cd->data.db_id, buf);
751 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
754 struct ctdb_req_control_data *cd)
762 case CTDB_CONTROL_PROCESS_EXISTS:
763 ret = ctdb_pid_pull(buf, buflen, mem_ctx,
767 case CTDB_CONTROL_GETDBPATH:
768 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
772 case CTDB_CONTROL_SETVNNMAP:
773 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
777 case CTDB_CONTROL_SET_DEBUG:
778 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
782 case CTDB_CONTROL_PULL_DB:
783 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
787 case CTDB_CONTROL_PUSH_DB:
788 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
792 case CTDB_CONTROL_SET_RECMODE:
793 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
797 case CTDB_CONTROL_DB_ATTACH:
798 ret = ctdb_string_pull(buf, buflen, mem_ctx,
802 case CTDB_CONTROL_SET_CALL:
805 case CTDB_CONTROL_TRAVERSE_START:
806 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
807 &cd->data.traverse_start);
810 case CTDB_CONTROL_TRAVERSE_ALL:
811 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
812 &cd->data.traverse_all);
815 case CTDB_CONTROL_TRAVERSE_DATA:
816 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
820 case CTDB_CONTROL_GET_DBNAME:
821 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
825 case CTDB_CONTROL_ENABLE_SEQNUM:
826 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
830 case CTDB_CONTROL_UPDATE_SEQNUM:
831 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
835 case CTDB_CONTROL_SET_RECMASTER:
836 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
837 &cd->data.recmaster);
840 case CTDB_CONTROL_TCP_CLIENT:
841 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
845 case CTDB_CONTROL_TCP_ADD:
846 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
850 case CTDB_CONTROL_TCP_REMOVE:
851 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
855 case CTDB_CONTROL_SET_TUNABLE:
856 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
860 case CTDB_CONTROL_GET_TUNABLE:
861 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
865 case CTDB_CONTROL_MODIFY_FLAGS:
866 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
867 &cd->data.flag_change);
870 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
871 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
875 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
876 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
880 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
881 ret = ctdb_string_pull(buf, buflen, mem_ctx,
885 case CTDB_CONTROL_UPDATE_RECORD:
886 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
890 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
891 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
892 &cd->data.addr_info);
895 case CTDB_CONTROL_TRANSACTION_START:
896 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
900 case CTDB_CONTROL_TRANSACTION_COMMIT:
901 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
905 case CTDB_CONTROL_WIPE_DATABASE:
906 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
910 case CTDB_CONTROL_TRY_DELETE_RECORDS:
911 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
915 case CTDB_CONTROL_ADD_PUBLIC_IP:
916 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
917 &cd->data.addr_info);
920 case CTDB_CONTROL_DEL_PUBLIC_IP:
921 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
922 &cd->data.addr_info);
925 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
926 ret = ctdb_string_pull(buf, buflen, mem_ctx,
927 &cd->data.event_str);
930 case CTDB_CONTROL_RELEASE_IP:
931 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
935 case CTDB_CONTROL_TAKEOVER_IP:
936 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
940 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
941 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
945 case CTDB_CONTROL_TRAVERSE_KILL:
946 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
947 &cd->data.traverse_start);
950 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
951 ret = ctdb_double_pull(buf, buflen, mem_ctx,
952 &cd->data.reclock_latency);
955 case CTDB_CONTROL_SET_LMASTERROLE:
956 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
960 case CTDB_CONTROL_SET_RECMASTERROLE:
961 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
965 case CTDB_CONTROL_ENABLE_SCRIPT:
966 ret = ctdb_string_pull(buf, buflen, mem_ctx,
970 case CTDB_CONTROL_DISABLE_SCRIPT:
971 ret = ctdb_string_pull(buf, buflen, mem_ctx,
975 case CTDB_CONTROL_SET_BAN_STATE:
976 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
977 &cd->data.ban_state);
980 case CTDB_CONTROL_REGISTER_NOTIFY:
981 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
985 case CTDB_CONTROL_DEREGISTER_NOTIFY:
986 ctdb_uint64_pull(buf, buflen, mem_ctx,
990 case CTDB_CONTROL_TRANS3_COMMIT:
991 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
995 case CTDB_CONTROL_GET_DB_SEQNUM:
996 ret = ctdb_uint64_pull(buf, buflen, mem_ctx, &u64);
997 cd->data.db_id = (uint32_t)u64;
1000 case CTDB_CONTROL_DB_SET_HEALTHY:
1001 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1005 case CTDB_CONTROL_DB_GET_HEALTH:
1006 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1010 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1011 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
1015 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1016 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
1020 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1021 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
1025 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1026 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
1030 case CTDB_CONTROL_SET_DB_READONLY:
1031 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1035 case CTDB_CONTROL_CHECK_SRVIDS:
1036 ret = ctdb_uint64_array_pull(buf, buflen, mem_ctx,
1037 &cd->data.u64_array);
1040 case CTDB_CONTROL_TRAVERSE_START_EXT:
1041 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
1042 &cd->data.traverse_start_ext);
1045 case CTDB_CONTROL_GET_DB_STATISTICS:
1046 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1050 case CTDB_CONTROL_SET_DB_STICKY:
1051 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1055 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1056 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
1057 &cd->data.traverse_all_ext);
1060 case CTDB_CONTROL_RECEIVE_RECORDS:
1061 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1065 case CTDB_CONTROL_DB_DETACH:
1066 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1070 case CTDB_CONTROL_DB_FREEZE:
1071 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1075 case CTDB_CONTROL_DB_THAW:
1076 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1080 case CTDB_CONTROL_DB_TRANSACTION_START:
1081 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1085 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1086 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1090 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1091 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1095 case CTDB_CONTROL_DB_PULL:
1096 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1097 &cd->data.pulldb_ext);
1100 case CTDB_CONTROL_DB_PUSH_START:
1101 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1102 &cd->data.pulldb_ext);
1105 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1106 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1114 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1122 switch (cd->opcode) {
1123 case CTDB_CONTROL_PROCESS_EXISTS:
1126 case CTDB_CONTROL_STATISTICS:
1127 len = ctdb_statistics_len(cd->data.stats);
1130 case CTDB_CONTROL_PING:
1133 case CTDB_CONTROL_GETDBPATH:
1134 len = ctdb_string_len(cd->data.db_path);
1137 case CTDB_CONTROL_GETVNNMAP:
1138 len = ctdb_vnn_map_len(cd->data.vnnmap);
1141 case CTDB_CONTROL_SETVNNMAP:
1144 case CTDB_CONTROL_GET_DEBUG:
1145 len = ctdb_uint32_len(cd->data.loglevel);
1148 case CTDB_CONTROL_SET_DEBUG:
1151 case CTDB_CONTROL_GET_DBMAP:
1152 len = ctdb_dbid_map_len(cd->data.dbmap);
1155 case CTDB_CONTROL_PULL_DB:
1156 len = ctdb_rec_buffer_len(cd->data.recbuf);
1159 case CTDB_CONTROL_PUSH_DB:
1162 case CTDB_CONTROL_GET_RECMODE:
1165 case CTDB_CONTROL_SET_RECMODE:
1168 case CTDB_CONTROL_STATISTICS_RESET:
1171 case CTDB_CONTROL_DB_ATTACH:
1172 len = ctdb_uint32_len(cd->data.db_id);
1175 case CTDB_CONTROL_SET_CALL:
1178 case CTDB_CONTROL_TRAVERSE_START:
1181 case CTDB_CONTROL_TRAVERSE_ALL:
1184 case CTDB_CONTROL_TRAVERSE_DATA:
1187 case CTDB_CONTROL_REGISTER_SRVID:
1190 case CTDB_CONTROL_DEREGISTER_SRVID:
1193 case CTDB_CONTROL_GET_DBNAME:
1194 len = ctdb_string_len(cd->data.db_name);
1197 case CTDB_CONTROL_ENABLE_SEQNUM:
1200 case CTDB_CONTROL_UPDATE_SEQNUM:
1203 case CTDB_CONTROL_DUMP_MEMORY:
1204 len = ctdb_string_len(cd->data.mem_str);
1207 case CTDB_CONTROL_GET_PID:
1210 case CTDB_CONTROL_GET_RECMASTER:
1213 case CTDB_CONTROL_SET_RECMASTER:
1216 case CTDB_CONTROL_FREEZE:
1219 case CTDB_CONTROL_GET_PNN:
1222 case CTDB_CONTROL_SHUTDOWN:
1225 case CTDB_CONTROL_GET_MONMODE:
1228 case CTDB_CONTROL_TCP_CLIENT:
1231 case CTDB_CONTROL_TCP_ADD:
1234 case CTDB_CONTROL_TCP_REMOVE:
1237 case CTDB_CONTROL_STARTUP:
1240 case CTDB_CONTROL_SET_TUNABLE:
1243 case CTDB_CONTROL_GET_TUNABLE:
1244 len = ctdb_uint32_len(cd->data.tun_value);
1247 case CTDB_CONTROL_LIST_TUNABLES:
1248 len = ctdb_var_list_len(cd->data.tun_var_list);
1251 case CTDB_CONTROL_MODIFY_FLAGS:
1254 case CTDB_CONTROL_GET_ALL_TUNABLES:
1255 len = ctdb_tunable_list_len(cd->data.tun_list);
1258 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1259 len = ctdb_tickle_list_len(cd->data.tickles);
1262 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1265 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1266 len = ctdb_uint32_len(cd->data.db_id);
1269 case CTDB_CONTROL_UPDATE_RECORD:
1272 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1275 case CTDB_CONTROL_TRANSACTION_START:
1278 case CTDB_CONTROL_TRANSACTION_COMMIT:
1281 case CTDB_CONTROL_WIPE_DATABASE:
1284 case CTDB_CONTROL_UPTIME:
1285 len = ctdb_uptime_len(cd->data.uptime);
1288 case CTDB_CONTROL_START_RECOVERY:
1291 case CTDB_CONTROL_END_RECOVERY:
1294 case CTDB_CONTROL_RELOAD_NODES_FILE:
1297 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1298 len = ctdb_rec_buffer_len(cd->data.recbuf);
1301 case CTDB_CONTROL_ENABLE_MONITOR:
1304 case CTDB_CONTROL_DISABLE_MONITOR:
1307 case CTDB_CONTROL_ADD_PUBLIC_IP:
1310 case CTDB_CONTROL_DEL_PUBLIC_IP:
1313 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
1316 case CTDB_CONTROL_GET_CAPABILITIES:
1317 len = ctdb_uint32_len(cd->data.caps);
1320 case CTDB_CONTROL_RECD_PING:
1323 case CTDB_CONTROL_RELEASE_IP:
1326 case CTDB_CONTROL_TAKEOVER_IP:
1329 case CTDB_CONTROL_GET_PUBLIC_IPS:
1330 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1333 case CTDB_CONTROL_GET_NODEMAP:
1334 len = ctdb_node_map_len(cd->data.nodemap);
1337 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1338 len = ctdb_script_list_len(cd->data.script_list);
1341 case CTDB_CONTROL_TRAVERSE_KILL:
1344 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1347 case CTDB_CONTROL_GET_RECLOCK_FILE:
1348 len = ctdb_string_len(cd->data.reclock_file);
1351 case CTDB_CONTROL_STOP_NODE:
1354 case CTDB_CONTROL_CONTINUE_NODE:
1357 case CTDB_CONTROL_SET_LMASTERROLE:
1360 case CTDB_CONTROL_SET_RECMASTERROLE:
1363 case CTDB_CONTROL_ENABLE_SCRIPT:
1366 case CTDB_CONTROL_DISABLE_SCRIPT:
1369 case CTDB_CONTROL_SET_BAN_STATE:
1372 case CTDB_CONTROL_GET_BAN_STATE:
1373 len = ctdb_ban_state_len(cd->data.ban_state);
1376 case CTDB_CONTROL_SET_DB_PRIORITY:
1379 case CTDB_CONTROL_GET_DB_PRIORITY:
1382 case CTDB_CONTROL_TRANSACTION_CANCEL:
1385 case CTDB_CONTROL_REGISTER_NOTIFY:
1388 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1391 case CTDB_CONTROL_TRANS3_COMMIT:
1394 case CTDB_CONTROL_GET_DB_SEQNUM:
1395 len = ctdb_uint64_len(cd->data.seqnum);
1398 case CTDB_CONTROL_DB_SET_HEALTHY:
1401 case CTDB_CONTROL_DB_GET_HEALTH:
1402 len = ctdb_string_len(cd->data.reason);
1405 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1406 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1409 case CTDB_CONTROL_GET_IFACES:
1410 len = ctdb_iface_list_len(cd->data.iface_list);
1413 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1416 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1419 case CTDB_CONTROL_GET_STAT_HISTORY:
1420 len = ctdb_statistics_list_len(cd->data.stats_list);
1423 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1426 case CTDB_CONTROL_SET_DB_READONLY:
1429 case CTDB_CONTROL_CHECK_SRVIDS:
1430 len = ctdb_uint8_array_len(cd->data.u8_array);
1433 case CTDB_CONTROL_TRAVERSE_START_EXT:
1436 case CTDB_CONTROL_GET_DB_STATISTICS:
1437 len = ctdb_db_statistics_len(cd->data.dbstats);
1440 case CTDB_CONTROL_SET_DB_STICKY:
1443 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1446 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1449 case CTDB_CONTROL_RECEIVE_RECORDS:
1450 len = ctdb_rec_buffer_len(cd->data.recbuf);
1453 case CTDB_CONTROL_IPREALLOCATED:
1456 case CTDB_CONTROL_GET_RUNSTATE:
1457 len = ctdb_uint32_len(cd->data.runstate);
1460 case CTDB_CONTROL_DB_DETACH:
1463 case CTDB_CONTROL_GET_NODES_FILE:
1464 len = ctdb_node_map_len(cd->data.nodemap);
1467 case CTDB_CONTROL_DB_FREEZE:
1470 case CTDB_CONTROL_DB_THAW:
1473 case CTDB_CONTROL_DB_TRANSACTION_START:
1476 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1479 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1482 case CTDB_CONTROL_DB_PULL:
1483 len = ctdb_uint32_len(cd->data.num_records);
1486 case CTDB_CONTROL_DB_PUSH_START:
1489 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1490 len = ctdb_uint32_len(cd->data.num_records);
1497 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1500 switch (cd->opcode) {
1501 case CTDB_CONTROL_STATISTICS:
1502 ctdb_statistics_push(cd->data.stats, buf);
1505 case CTDB_CONTROL_GETDBPATH:
1506 ctdb_string_push(cd->data.db_path, buf);
1509 case CTDB_CONTROL_GETVNNMAP:
1510 ctdb_vnn_map_push(cd->data.vnnmap, buf);
1513 case CTDB_CONTROL_GET_DEBUG:
1514 ctdb_uint32_push(cd->data.loglevel, buf);
1517 case CTDB_CONTROL_GET_DBMAP:
1518 ctdb_dbid_map_push(cd->data.dbmap, buf);
1521 case CTDB_CONTROL_PULL_DB:
1522 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1525 case CTDB_CONTROL_PUSH_DB:
1528 case CTDB_CONTROL_DB_ATTACH:
1529 ctdb_uint32_push(cd->data.db_id, buf);
1532 case CTDB_CONTROL_GET_DBNAME:
1533 ctdb_string_push(cd->data.db_name, buf);
1536 case CTDB_CONTROL_DUMP_MEMORY:
1537 ctdb_string_push(cd->data.mem_str, buf);
1540 case CTDB_CONTROL_GET_PID:
1543 case CTDB_CONTROL_GET_RECMASTER:
1546 case CTDB_CONTROL_GET_TUNABLE:
1547 ctdb_uint32_push(cd->data.tun_value, buf);
1550 case CTDB_CONTROL_LIST_TUNABLES:
1551 ctdb_var_list_push(cd->data.tun_var_list, buf);
1554 case CTDB_CONTROL_GET_ALL_TUNABLES:
1555 ctdb_tunable_list_push(cd->data.tun_list, buf);
1558 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1559 ctdb_tickle_list_push(cd->data.tickles, buf);
1562 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1563 ctdb_uint32_push(cd->data.db_id, buf);
1566 case CTDB_CONTROL_UPTIME:
1567 ctdb_uptime_push(cd->data.uptime, buf);
1570 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1571 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1574 case CTDB_CONTROL_GET_CAPABILITIES:
1575 ctdb_uint32_push(cd->data.caps, buf);
1578 case CTDB_CONTROL_GET_PUBLIC_IPS:
1579 ctdb_public_ip_list_push(cd->data.pubip_list, buf);
1582 case CTDB_CONTROL_GET_NODEMAP:
1583 ctdb_node_map_push(cd->data.nodemap, buf);
1586 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1587 ctdb_script_list_push(cd->data.script_list, buf);
1590 case CTDB_CONTROL_GET_RECLOCK_FILE:
1591 ctdb_string_push(cd->data.reclock_file, buf);
1594 case CTDB_CONTROL_GET_BAN_STATE:
1595 ctdb_ban_state_push(cd->data.ban_state, buf);
1598 case CTDB_CONTROL_GET_DB_PRIORITY:
1601 case CTDB_CONTROL_GET_DB_SEQNUM:
1602 ctdb_uint64_push(cd->data.seqnum, buf);
1605 case CTDB_CONTROL_DB_GET_HEALTH:
1606 ctdb_string_push(cd->data.reason, buf);
1609 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1610 ctdb_public_ip_info_push(cd->data.ipinfo, buf);
1613 case CTDB_CONTROL_GET_IFACES:
1614 ctdb_iface_list_push(cd->data.iface_list, buf);
1617 case CTDB_CONTROL_GET_STAT_HISTORY:
1618 ctdb_statistics_list_push(cd->data.stats_list, buf);
1621 case CTDB_CONTROL_CHECK_SRVIDS:
1622 ctdb_uint8_array_push(cd->data.u8_array, buf);
1625 case CTDB_CONTROL_GET_DB_STATISTICS:
1626 ctdb_db_statistics_push(cd->data.dbstats, buf);
1629 case CTDB_CONTROL_RECEIVE_RECORDS:
1630 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1633 case CTDB_CONTROL_GET_RUNSTATE:
1634 ctdb_uint32_push(cd->data.runstate, buf);
1637 case CTDB_CONTROL_GET_NODES_FILE:
1638 ctdb_node_map_push(cd->data.nodemap, buf);
1641 case CTDB_CONTROL_DB_PULL:
1642 ctdb_uint32_push(cd->data.num_records, buf);
1645 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1646 ctdb_uint32_push(cd->data.num_records, buf);
1651 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1652 uint32_t opcode, TALLOC_CTX *mem_ctx,
1653 struct ctdb_reply_control_data *cd)
1656 cd->opcode = opcode;
1659 case CTDB_CONTROL_STATISTICS:
1660 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1664 case CTDB_CONTROL_GETDBPATH:
1665 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1669 case CTDB_CONTROL_GETVNNMAP:
1670 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1674 case CTDB_CONTROL_GET_DEBUG:
1675 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1676 &cd->data.loglevel);
1679 case CTDB_CONTROL_GET_DBMAP:
1680 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1684 case CTDB_CONTROL_PULL_DB:
1685 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1689 case CTDB_CONTROL_PUSH_DB:
1692 case CTDB_CONTROL_DB_ATTACH:
1693 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1697 case CTDB_CONTROL_GET_DBNAME:
1698 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1702 case CTDB_CONTROL_DUMP_MEMORY:
1703 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1707 case CTDB_CONTROL_GET_PID:
1710 case CTDB_CONTROL_GET_RECMASTER:
1713 case CTDB_CONTROL_GET_TUNABLE:
1714 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1715 &cd->data.tun_value);
1718 case CTDB_CONTROL_LIST_TUNABLES:
1719 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1720 &cd->data.tun_var_list);
1723 case CTDB_CONTROL_GET_ALL_TUNABLES:
1724 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1725 &cd->data.tun_list);
1728 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1729 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1733 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1734 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1738 case CTDB_CONTROL_UPTIME:
1739 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1743 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1744 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1748 case CTDB_CONTROL_GET_CAPABILITIES:
1749 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1753 case CTDB_CONTROL_GET_PUBLIC_IPS:
1754 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1755 &cd->data.pubip_list);
1758 case CTDB_CONTROL_GET_NODEMAP:
1759 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1763 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1764 ret = ctdb_script_list_pull(buf, buflen, mem_ctx,
1765 &cd->data.script_list);
1768 case CTDB_CONTROL_GET_RECLOCK_FILE:
1769 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1770 &cd->data.reclock_file);
1773 case CTDB_CONTROL_GET_BAN_STATE:
1774 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1775 &cd->data.ban_state);
1778 case CTDB_CONTROL_GET_DB_PRIORITY:
1781 case CTDB_CONTROL_GET_DB_SEQNUM:
1782 ret = ctdb_uint64_pull(buf, buflen, mem_ctx,
1786 case CTDB_CONTROL_DB_GET_HEALTH:
1787 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1791 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1792 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1796 case CTDB_CONTROL_GET_IFACES:
1797 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1798 &cd->data.iface_list);
1801 case CTDB_CONTROL_GET_STAT_HISTORY:
1802 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1803 &cd->data.stats_list);
1806 case CTDB_CONTROL_CHECK_SRVIDS:
1807 ret = ctdb_uint8_array_pull(buf, buflen, mem_ctx,
1808 &cd->data.u8_array);
1811 case CTDB_CONTROL_GET_DB_STATISTICS:
1812 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1816 case CTDB_CONTROL_RECEIVE_RECORDS:
1817 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1821 case CTDB_CONTROL_GET_RUNSTATE:
1822 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1823 &cd->data.runstate);
1826 case CTDB_CONTROL_GET_NODES_FILE:
1827 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1831 case CTDB_CONTROL_DB_PULL:
1832 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1833 &cd->data.num_records);
1836 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1837 ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
1838 &cd->data.num_records);
1845 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1846 struct ctdb_req_control *c)
1848 return offsetof(struct ctdb_req_control_wire, data) +
1849 ctdb_req_control_data_len(&c->rdata);
1852 int ctdb_req_control_push(struct ctdb_req_header *h,
1853 struct ctdb_req_control *request,
1854 uint8_t *buf, size_t *buflen)
1856 struct ctdb_req_control_wire *wire =
1857 (struct ctdb_req_control_wire *)buf;
1860 length = ctdb_req_control_len(h, request);
1861 if (*buflen < length) {
1866 h->length = *buflen;
1867 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1869 wire->opcode = request->opcode;
1870 wire->pad = request->pad;
1871 wire->srvid = request->srvid;
1872 wire->client_id = request->client_id;
1873 wire->flags = request->flags;
1875 wire->datalen = ctdb_req_control_data_len(&request->rdata);
1876 ctdb_req_control_data_push(&request->rdata, wire->data);
1881 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1882 struct ctdb_req_header *h,
1883 TALLOC_CTX *mem_ctx,
1884 struct ctdb_req_control *c)
1886 struct ctdb_req_control_wire *wire =
1887 (struct ctdb_req_control_wire *)buf;
1891 length = offsetof(struct ctdb_req_control_wire, data);
1892 if (buflen < length) {
1895 if (wire->datalen > buflen) {
1898 if (length + wire->datalen < length) {
1901 if (buflen < length + wire->datalen) {
1906 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1912 c->opcode = wire->opcode;
1914 c->srvid = wire->srvid;
1915 c->client_id = wire->client_id;
1916 c->flags = wire->flags;
1918 ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1919 c->opcode, mem_ctx, &c->rdata);
1927 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1928 struct ctdb_reply_control *c)
1930 return offsetof(struct ctdb_reply_control_wire, data) +
1932 ctdb_reply_control_data_len(&c->rdata) :
1933 ctdb_string_len(c->errmsg));
1936 int ctdb_reply_control_push(struct ctdb_req_header *h,
1937 struct ctdb_reply_control *reply,
1938 uint8_t *buf, size_t *buflen)
1940 struct ctdb_reply_control_wire *wire =
1941 (struct ctdb_reply_control_wire *)buf;
1944 length = ctdb_reply_control_len(h, reply);
1945 if (*buflen < length) {
1950 h->length = *buflen;
1951 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1953 wire->status = reply->status;
1955 if (reply->status == 0) {
1956 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1958 ctdb_reply_control_data_push(&reply->rdata, wire->data);
1961 wire->errorlen = ctdb_string_len(reply->errmsg);
1962 ctdb_string_push(reply->errmsg, wire->data + wire->datalen);
1968 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1969 struct ctdb_req_header *h,
1970 TALLOC_CTX *mem_ctx,
1971 struct ctdb_reply_control *c)
1973 struct ctdb_reply_control_wire *wire =
1974 (struct ctdb_reply_control_wire *)buf;
1978 length = offsetof(struct ctdb_reply_control_wire, data);
1979 if (buflen < length) {
1982 if (wire->datalen > buflen || wire->errorlen > buflen) {
1985 if (length + wire->datalen < length) {
1988 if (length + wire->datalen + wire->errorlen < length) {
1991 if (buflen < length + wire->datalen + wire->errorlen) {
1996 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
2002 c->status = wire->status;
2004 if (c->status != -1) {
2005 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
2013 ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
2014 mem_ctx, &c->errmsg);