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_WIPE_DATABASE:
224 len = ctdb_transdb_len(cd->data.transdb);
227 case CTDB_CONTROL_UPTIME:
230 case CTDB_CONTROL_START_RECOVERY:
233 case CTDB_CONTROL_END_RECOVERY:
236 case CTDB_CONTROL_RELOAD_NODES_FILE:
239 case CTDB_CONTROL_TRY_DELETE_RECORDS:
240 len = ctdb_rec_buffer_len(cd->data.recbuf);
243 case CTDB_CONTROL_ENABLE_MONITOR:
246 case CTDB_CONTROL_DISABLE_MONITOR:
249 case CTDB_CONTROL_ADD_PUBLIC_IP:
250 len = ctdb_addr_info_len(cd->data.addr_info);
253 case CTDB_CONTROL_DEL_PUBLIC_IP:
254 len = ctdb_addr_info_len(cd->data.addr_info);
257 case CTDB_CONTROL_GET_CAPABILITIES:
260 case CTDB_CONTROL_RECD_PING:
263 case CTDB_CONTROL_RELEASE_IP:
264 len = ctdb_public_ip_len(cd->data.pubip);
267 case CTDB_CONTROL_TAKEOVER_IP:
268 len = ctdb_public_ip_len(cd->data.pubip);
271 case CTDB_CONTROL_GET_PUBLIC_IPS:
274 case CTDB_CONTROL_GET_NODEMAP:
277 case CTDB_CONTROL_TRAVERSE_KILL:
278 len = ctdb_traverse_start_len(cd->data.traverse_start);
281 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
282 len = ctdb_double_len(&cd->data.reclock_latency);
285 case CTDB_CONTROL_GET_RECLOCK_FILE:
288 case CTDB_CONTROL_STOP_NODE:
291 case CTDB_CONTROL_CONTINUE_NODE:
294 case CTDB_CONTROL_SET_LMASTERROLE:
295 len = ctdb_uint32_len(&cd->data.role);
298 case CTDB_CONTROL_SET_RECMASTERROLE:
299 len = ctdb_uint32_len(&cd->data.role);
302 case CTDB_CONTROL_SET_BAN_STATE:
303 len = ctdb_ban_state_len(cd->data.ban_state);
306 case CTDB_CONTROL_GET_BAN_STATE:
309 case CTDB_CONTROL_REGISTER_NOTIFY:
310 len = ctdb_notify_data_len(cd->data.notify);
313 case CTDB_CONTROL_DEREGISTER_NOTIFY:
314 len = ctdb_uint64_len(&cd->data.srvid);
317 case CTDB_CONTROL_TRANS3_COMMIT:
318 len = ctdb_rec_buffer_len(cd->data.recbuf);
321 case CTDB_CONTROL_GET_DB_SEQNUM:
323 len = ctdb_uint32_len(&cd->data.db_id) + ctdb_uint32_len(&u32);
326 case CTDB_CONTROL_DB_SET_HEALTHY:
327 len = ctdb_uint32_len(&cd->data.db_id);
330 case CTDB_CONTROL_DB_GET_HEALTH:
331 len = ctdb_uint32_len(&cd->data.db_id);
334 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
335 len = ctdb_sock_addr_len(cd->data.addr);
338 case CTDB_CONTROL_GET_IFACES:
341 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
342 len = ctdb_iface_len(cd->data.iface);
345 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
346 len = ctdb_connection_len(cd->data.conn);
349 case CTDB_CONTROL_GET_STAT_HISTORY:
352 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
353 len = ctdb_key_data_len(cd->data.key);
356 case CTDB_CONTROL_SET_DB_READONLY:
357 len = ctdb_uint32_len(&cd->data.db_id);
360 case CTDB_CONTROL_CHECK_SRVIDS:
363 case CTDB_CONTROL_TRAVERSE_START_EXT:
364 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
367 case CTDB_CONTROL_GET_DB_STATISTICS:
368 len = ctdb_uint32_len(&cd->data.db_id);
371 case CTDB_CONTROL_SET_DB_STICKY:
372 len = ctdb_uint32_len(&cd->data.db_id);
375 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
378 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
379 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
382 case CTDB_CONTROL_RECEIVE_RECORDS:
383 len = ctdb_rec_buffer_len(cd->data.recbuf);
386 case CTDB_CONTROL_IPREALLOCATED:
389 case CTDB_CONTROL_GET_RUNSTATE:
392 case CTDB_CONTROL_DB_DETACH:
393 len = ctdb_uint32_len(&cd->data.db_id);
396 case CTDB_CONTROL_GET_NODES_FILE:
399 case CTDB_CONTROL_DB_FREEZE:
400 len = ctdb_uint32_len(&cd->data.db_id);
403 case CTDB_CONTROL_DB_THAW:
404 len = ctdb_uint32_len(&cd->data.db_id);
407 case CTDB_CONTROL_DB_TRANSACTION_START:
408 len = ctdb_transdb_len(cd->data.transdb);
411 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
412 len = ctdb_transdb_len(cd->data.transdb);
415 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
416 len = ctdb_uint32_len(&cd->data.db_id);
419 case CTDB_CONTROL_DB_PULL:
420 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
423 case CTDB_CONTROL_DB_PUSH_START:
424 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
427 case CTDB_CONTROL_DB_PUSH_CONFIRM:
428 len = ctdb_uint32_len(&cd->data.db_id);
431 case CTDB_CONTROL_DB_OPEN_FLAGS:
432 len = ctdb_uint32_len(&cd->data.db_id);
435 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
436 len = ctdb_string_len(&cd->data.db_name);
443 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
449 switch (cd->opcode) {
450 case CTDB_CONTROL_PROCESS_EXISTS:
451 ctdb_pid_push(&cd->data.pid, buf, &np);
454 case CTDB_CONTROL_GETDBPATH:
455 ctdb_uint32_push(&cd->data.db_id, buf, &np);
458 case CTDB_CONTROL_SETVNNMAP:
459 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
462 case CTDB_CONTROL_SET_DEBUG:
463 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
466 case CTDB_CONTROL_PULL_DB:
467 ctdb_pulldb_push(cd->data.pulldb, buf, &np);
470 case CTDB_CONTROL_PUSH_DB:
471 ctdb_rec_buffer_push(cd->data.recbuf, buf);
474 case CTDB_CONTROL_SET_RECMODE:
475 ctdb_uint32_push(&cd->data.recmode, buf, &np);
478 case CTDB_CONTROL_DB_ATTACH:
479 ctdb_string_push(&cd->data.db_name, buf, &np);
482 case CTDB_CONTROL_SET_CALL:
485 case CTDB_CONTROL_TRAVERSE_START:
486 ctdb_traverse_start_push(cd->data.traverse_start, buf);
489 case CTDB_CONTROL_TRAVERSE_ALL:
490 ctdb_traverse_all_push(cd->data.traverse_all, buf);
493 case CTDB_CONTROL_TRAVERSE_DATA:
494 ctdb_rec_data_push(cd->data.rec_data, buf);
497 case CTDB_CONTROL_GET_DBNAME:
498 ctdb_uint32_push(&cd->data.db_id, buf, &np);
501 case CTDB_CONTROL_ENABLE_SEQNUM:
502 ctdb_uint32_push(&cd->data.db_id, buf, &np);
505 case CTDB_CONTROL_UPDATE_SEQNUM:
506 ctdb_uint32_push(&cd->data.db_id, buf, &np);
509 case CTDB_CONTROL_SET_RECMASTER:
510 ctdb_uint32_push(&cd->data.recmaster, buf, &np);
513 case CTDB_CONTROL_TCP_CLIENT:
514 ctdb_connection_push(cd->data.conn, buf);
517 case CTDB_CONTROL_TCP_ADD:
518 ctdb_connection_push(cd->data.conn, buf);
521 case CTDB_CONTROL_TCP_REMOVE:
522 ctdb_connection_push(cd->data.conn, buf);
525 case CTDB_CONTROL_SET_TUNABLE:
526 ctdb_tunable_push(cd->data.tunable, buf);
529 case CTDB_CONTROL_GET_TUNABLE:
530 ctdb_stringn_push(&cd->data.tun_var, buf, &np);
533 case CTDB_CONTROL_MODIFY_FLAGS:
534 ctdb_node_flag_change_push(cd->data.flag_change, buf);
537 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
538 ctdb_sock_addr_push(cd->data.addr, buf);
541 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
542 ctdb_tickle_list_push(cd->data.tickles, buf);
545 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
546 ctdb_string_push(&cd->data.db_name, buf, &np);
549 case CTDB_CONTROL_UPDATE_RECORD:
550 ctdb_rec_buffer_push(cd->data.recbuf, buf);
553 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
554 ctdb_addr_info_push(cd->data.addr_info, buf);
557 case CTDB_CONTROL_WIPE_DATABASE:
558 ctdb_transdb_push(cd->data.transdb, buf);
561 case CTDB_CONTROL_TRY_DELETE_RECORDS:
562 ctdb_rec_buffer_push(cd->data.recbuf, buf);
565 case CTDB_CONTROL_ADD_PUBLIC_IP:
566 ctdb_addr_info_push(cd->data.addr_info, buf);
569 case CTDB_CONTROL_DEL_PUBLIC_IP:
570 ctdb_addr_info_push(cd->data.addr_info, buf);
573 case CTDB_CONTROL_RELEASE_IP:
574 ctdb_public_ip_push(cd->data.pubip, buf);
577 case CTDB_CONTROL_TAKEOVER_IP:
578 ctdb_public_ip_push(cd->data.pubip, buf);
581 case CTDB_CONTROL_TRAVERSE_KILL:
582 ctdb_traverse_start_push(cd->data.traverse_start, buf);
585 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
586 ctdb_double_push(&cd->data.reclock_latency, buf, &np);
589 case CTDB_CONTROL_SET_LMASTERROLE:
590 ctdb_uint32_push(&cd->data.role, buf, &np);
593 case CTDB_CONTROL_SET_RECMASTERROLE:
594 ctdb_uint32_push(&cd->data.role, buf, &np);
597 case CTDB_CONTROL_SET_BAN_STATE:
598 ctdb_ban_state_push(cd->data.ban_state, buf);
601 case CTDB_CONTROL_REGISTER_NOTIFY:
602 ctdb_notify_data_push(cd->data.notify, buf);
605 case CTDB_CONTROL_DEREGISTER_NOTIFY:
606 ctdb_uint64_push(&cd->data.srvid, buf, &np);
609 case CTDB_CONTROL_TRANS3_COMMIT:
610 ctdb_rec_buffer_push(cd->data.recbuf, buf);
613 case CTDB_CONTROL_GET_DB_SEQNUM:
616 ctdb_uint32_push(&cd->data.db_id, buf, &np);
618 ctdb_uint32_push(&u32, buf+offset, &np);
623 case CTDB_CONTROL_DB_SET_HEALTHY:
624 ctdb_uint32_push(&cd->data.db_id, buf, &np);
627 case CTDB_CONTROL_DB_GET_HEALTH:
628 ctdb_uint32_push(&cd->data.db_id, buf, &np);
631 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
632 ctdb_sock_addr_push(cd->data.addr, buf);
635 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
636 ctdb_iface_push(cd->data.iface, buf);
639 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
640 ctdb_connection_push(cd->data.conn, buf);
643 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
644 ctdb_key_data_push(cd->data.key, buf);
647 case CTDB_CONTROL_SET_DB_READONLY:
648 ctdb_uint32_push(&cd->data.db_id, buf, &np);
651 case CTDB_CONTROL_CHECK_SRVIDS:
654 case CTDB_CONTROL_TRAVERSE_START_EXT:
655 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf);
658 case CTDB_CONTROL_GET_DB_STATISTICS:
659 ctdb_uint32_push(&cd->data.db_id, buf, &np);
662 case CTDB_CONTROL_SET_DB_STICKY:
663 ctdb_uint32_push(&cd->data.db_id, buf, &np);
666 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
667 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf);
670 case CTDB_CONTROL_RECEIVE_RECORDS:
671 ctdb_rec_buffer_push(cd->data.recbuf, buf);
674 case CTDB_CONTROL_DB_DETACH:
675 ctdb_uint32_push(&cd->data.db_id, buf, &np);
678 case CTDB_CONTROL_DB_FREEZE:
679 ctdb_uint32_push(&cd->data.db_id, buf, &np);
682 case CTDB_CONTROL_DB_THAW:
683 ctdb_uint32_push(&cd->data.db_id, buf, &np);
686 case CTDB_CONTROL_DB_TRANSACTION_START:
687 ctdb_transdb_push(cd->data.transdb, buf);
690 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
691 ctdb_transdb_push(cd->data.transdb, buf);
694 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
695 ctdb_uint32_push(&cd->data.db_id, buf, &np);
698 case CTDB_CONTROL_DB_PULL:
699 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
702 case CTDB_CONTROL_DB_PUSH_START:
703 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
706 case CTDB_CONTROL_DB_PUSH_CONFIRM:
707 ctdb_uint32_push(&cd->data.db_id, buf, &np);
710 case CTDB_CONTROL_DB_OPEN_FLAGS:
711 ctdb_uint32_push(&cd->data.db_id, buf, &np);
714 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
715 ctdb_string_push(&cd->data.db_name, buf, &np);
720 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
723 struct ctdb_req_control_data *cd)
732 case CTDB_CONTROL_PROCESS_EXISTS:
733 ret = ctdb_pid_pull(buf, buflen, &cd->data.pid, &np);
736 case CTDB_CONTROL_GETDBPATH:
737 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
740 case CTDB_CONTROL_SETVNNMAP:
741 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
742 &cd->data.vnnmap, &np);
745 case CTDB_CONTROL_SET_DEBUG:
746 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
749 case CTDB_CONTROL_PULL_DB:
750 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
751 &cd->data.pulldb, &np);
754 case CTDB_CONTROL_PUSH_DB:
755 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
759 case CTDB_CONTROL_SET_RECMODE:
760 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
763 case CTDB_CONTROL_DB_ATTACH:
764 ret = ctdb_string_pull(buf, buflen, mem_ctx,
765 &cd->data.db_name, &np);
768 case CTDB_CONTROL_SET_CALL:
771 case CTDB_CONTROL_TRAVERSE_START:
772 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
773 &cd->data.traverse_start);
776 case CTDB_CONTROL_TRAVERSE_ALL:
777 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
778 &cd->data.traverse_all);
781 case CTDB_CONTROL_TRAVERSE_DATA:
782 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
786 case CTDB_CONTROL_GET_DBNAME:
787 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
790 case CTDB_CONTROL_ENABLE_SEQNUM:
791 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
794 case CTDB_CONTROL_UPDATE_SEQNUM:
795 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
798 case CTDB_CONTROL_SET_RECMASTER:
799 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmaster, &np);
802 case CTDB_CONTROL_TCP_CLIENT:
803 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
807 case CTDB_CONTROL_TCP_ADD:
808 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
812 case CTDB_CONTROL_TCP_REMOVE:
813 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
817 case CTDB_CONTROL_SET_TUNABLE:
818 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
822 case CTDB_CONTROL_GET_TUNABLE:
823 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
824 &cd->data.tun_var, &np);
827 case CTDB_CONTROL_MODIFY_FLAGS:
828 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
829 &cd->data.flag_change);
832 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
833 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
837 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
838 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
842 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
843 ret = ctdb_string_pull(buf, buflen, mem_ctx,
844 &cd->data.db_name, &np);
847 case CTDB_CONTROL_UPDATE_RECORD:
848 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
852 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
853 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
854 &cd->data.addr_info);
857 case CTDB_CONTROL_WIPE_DATABASE:
858 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
862 case CTDB_CONTROL_TRY_DELETE_RECORDS:
863 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
867 case CTDB_CONTROL_ADD_PUBLIC_IP:
868 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
869 &cd->data.addr_info);
872 case CTDB_CONTROL_DEL_PUBLIC_IP:
873 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
874 &cd->data.addr_info);
877 case CTDB_CONTROL_RELEASE_IP:
878 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
882 case CTDB_CONTROL_TAKEOVER_IP:
883 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
887 case CTDB_CONTROL_TRAVERSE_KILL:
888 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
889 &cd->data.traverse_start);
892 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
893 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
897 case CTDB_CONTROL_SET_LMASTERROLE:
898 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
901 case CTDB_CONTROL_SET_RECMASTERROLE:
902 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
905 case CTDB_CONTROL_SET_BAN_STATE:
906 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
907 &cd->data.ban_state);
910 case CTDB_CONTROL_REGISTER_NOTIFY:
911 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
915 case CTDB_CONTROL_DEREGISTER_NOTIFY:
916 ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
919 case CTDB_CONTROL_TRANS3_COMMIT:
920 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
924 case CTDB_CONTROL_GET_DB_SEQNUM:
926 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
931 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
936 case CTDB_CONTROL_DB_SET_HEALTHY:
937 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
940 case CTDB_CONTROL_DB_GET_HEALTH:
941 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
944 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
945 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
949 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
950 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
954 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
955 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
959 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
960 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
964 case CTDB_CONTROL_SET_DB_READONLY:
965 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
968 case CTDB_CONTROL_CHECK_SRVIDS:
971 case CTDB_CONTROL_TRAVERSE_START_EXT:
972 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
973 &cd->data.traverse_start_ext);
976 case CTDB_CONTROL_GET_DB_STATISTICS:
977 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
980 case CTDB_CONTROL_SET_DB_STICKY:
981 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
984 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
985 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
986 &cd->data.traverse_all_ext);
989 case CTDB_CONTROL_RECEIVE_RECORDS:
990 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
994 case CTDB_CONTROL_DB_DETACH:
995 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
998 case CTDB_CONTROL_DB_FREEZE:
999 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1002 case CTDB_CONTROL_DB_THAW:
1003 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1006 case CTDB_CONTROL_DB_TRANSACTION_START:
1007 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1011 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1012 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1016 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1017 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1020 case CTDB_CONTROL_DB_PULL:
1021 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1022 &cd->data.pulldb_ext);
1025 case CTDB_CONTROL_DB_PUSH_START:
1026 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1027 &cd->data.pulldb_ext);
1030 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1031 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1034 case CTDB_CONTROL_DB_OPEN_FLAGS:
1035 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1038 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1039 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1040 &cd->data.db_name, &np);
1047 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1055 switch (cd->opcode) {
1056 case CTDB_CONTROL_PROCESS_EXISTS:
1059 case CTDB_CONTROL_STATISTICS:
1060 len = ctdb_statistics_len(cd->data.stats);
1063 case CTDB_CONTROL_PING:
1066 case CTDB_CONTROL_GETDBPATH:
1067 len = ctdb_string_len(&cd->data.db_path);
1070 case CTDB_CONTROL_GETVNNMAP:
1071 len = ctdb_vnn_map_len(cd->data.vnnmap);
1074 case CTDB_CONTROL_SETVNNMAP:
1077 case CTDB_CONTROL_GET_DEBUG:
1078 len = ctdb_uint32_len(&cd->data.loglevel);
1081 case CTDB_CONTROL_SET_DEBUG:
1084 case CTDB_CONTROL_GET_DBMAP:
1085 len = ctdb_dbid_map_len(cd->data.dbmap);
1088 case CTDB_CONTROL_PULL_DB:
1089 len = ctdb_rec_buffer_len(cd->data.recbuf);
1092 case CTDB_CONTROL_PUSH_DB:
1095 case CTDB_CONTROL_GET_RECMODE:
1098 case CTDB_CONTROL_SET_RECMODE:
1101 case CTDB_CONTROL_STATISTICS_RESET:
1104 case CTDB_CONTROL_DB_ATTACH:
1105 len = ctdb_uint32_len(&cd->data.db_id);
1108 case CTDB_CONTROL_SET_CALL:
1111 case CTDB_CONTROL_TRAVERSE_START:
1114 case CTDB_CONTROL_TRAVERSE_ALL:
1117 case CTDB_CONTROL_TRAVERSE_DATA:
1120 case CTDB_CONTROL_REGISTER_SRVID:
1123 case CTDB_CONTROL_DEREGISTER_SRVID:
1126 case CTDB_CONTROL_GET_DBNAME:
1127 len = ctdb_string_len(&cd->data.db_name);
1130 case CTDB_CONTROL_ENABLE_SEQNUM:
1133 case CTDB_CONTROL_UPDATE_SEQNUM:
1136 case CTDB_CONTROL_DUMP_MEMORY:
1137 len = ctdb_string_len(&cd->data.mem_str);
1140 case CTDB_CONTROL_GET_PID:
1143 case CTDB_CONTROL_GET_RECMASTER:
1146 case CTDB_CONTROL_SET_RECMASTER:
1149 case CTDB_CONTROL_FREEZE:
1152 case CTDB_CONTROL_GET_PNN:
1155 case CTDB_CONTROL_SHUTDOWN:
1158 case CTDB_CONTROL_GET_MONMODE:
1161 case CTDB_CONTROL_TCP_CLIENT:
1164 case CTDB_CONTROL_TCP_ADD:
1167 case CTDB_CONTROL_TCP_REMOVE:
1170 case CTDB_CONTROL_STARTUP:
1173 case CTDB_CONTROL_SET_TUNABLE:
1176 case CTDB_CONTROL_GET_TUNABLE:
1177 len = ctdb_uint32_len(&cd->data.tun_value);
1180 case CTDB_CONTROL_LIST_TUNABLES:
1181 len = ctdb_var_list_len(cd->data.tun_var_list);
1184 case CTDB_CONTROL_MODIFY_FLAGS:
1187 case CTDB_CONTROL_GET_ALL_TUNABLES:
1188 len = ctdb_tunable_list_len(cd->data.tun_list);
1191 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1192 len = ctdb_tickle_list_len(cd->data.tickles);
1195 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1198 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1199 len = ctdb_uint32_len(&cd->data.db_id);
1202 case CTDB_CONTROL_UPDATE_RECORD:
1205 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1208 case CTDB_CONTROL_WIPE_DATABASE:
1211 case CTDB_CONTROL_UPTIME:
1212 len = ctdb_uptime_len(cd->data.uptime);
1215 case CTDB_CONTROL_START_RECOVERY:
1218 case CTDB_CONTROL_END_RECOVERY:
1221 case CTDB_CONTROL_RELOAD_NODES_FILE:
1224 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1225 len = ctdb_rec_buffer_len(cd->data.recbuf);
1228 case CTDB_CONTROL_ENABLE_MONITOR:
1231 case CTDB_CONTROL_DISABLE_MONITOR:
1234 case CTDB_CONTROL_ADD_PUBLIC_IP:
1237 case CTDB_CONTROL_DEL_PUBLIC_IP:
1240 case CTDB_CONTROL_GET_CAPABILITIES:
1241 len = ctdb_uint32_len(&cd->data.caps);
1244 case CTDB_CONTROL_RECD_PING:
1247 case CTDB_CONTROL_RELEASE_IP:
1250 case CTDB_CONTROL_TAKEOVER_IP:
1253 case CTDB_CONTROL_GET_PUBLIC_IPS:
1254 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1257 case CTDB_CONTROL_GET_NODEMAP:
1258 len = ctdb_node_map_len(cd->data.nodemap);
1261 case CTDB_CONTROL_TRAVERSE_KILL:
1264 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1267 case CTDB_CONTROL_GET_RECLOCK_FILE:
1268 len = ctdb_string_len(&cd->data.reclock_file);
1271 case CTDB_CONTROL_STOP_NODE:
1274 case CTDB_CONTROL_CONTINUE_NODE:
1277 case CTDB_CONTROL_SET_LMASTERROLE:
1280 case CTDB_CONTROL_SET_RECMASTERROLE:
1283 case CTDB_CONTROL_SET_BAN_STATE:
1286 case CTDB_CONTROL_GET_BAN_STATE:
1287 len = ctdb_ban_state_len(cd->data.ban_state);
1290 case CTDB_CONTROL_SET_DB_PRIORITY:
1293 case CTDB_CONTROL_GET_DB_PRIORITY:
1296 case CTDB_CONTROL_REGISTER_NOTIFY:
1299 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1302 case CTDB_CONTROL_TRANS3_COMMIT:
1305 case CTDB_CONTROL_GET_DB_SEQNUM:
1306 len = ctdb_uint64_len(&cd->data.seqnum);
1309 case CTDB_CONTROL_DB_SET_HEALTHY:
1312 case CTDB_CONTROL_DB_GET_HEALTH:
1313 len = ctdb_string_len(&cd->data.reason);
1316 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1317 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1320 case CTDB_CONTROL_GET_IFACES:
1321 len = ctdb_iface_list_len(cd->data.iface_list);
1324 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1327 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1330 case CTDB_CONTROL_GET_STAT_HISTORY:
1331 len = ctdb_statistics_list_len(cd->data.stats_list);
1334 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1337 case CTDB_CONTROL_SET_DB_READONLY:
1340 case CTDB_CONTROL_CHECK_SRVIDS:
1343 case CTDB_CONTROL_TRAVERSE_START_EXT:
1346 case CTDB_CONTROL_GET_DB_STATISTICS:
1347 len = ctdb_db_statistics_len(cd->data.dbstats);
1350 case CTDB_CONTROL_SET_DB_STICKY:
1353 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1356 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1359 case CTDB_CONTROL_RECEIVE_RECORDS:
1360 len = ctdb_rec_buffer_len(cd->data.recbuf);
1363 case CTDB_CONTROL_IPREALLOCATED:
1366 case CTDB_CONTROL_GET_RUNSTATE:
1367 len = ctdb_uint32_len(&cd->data.runstate);
1370 case CTDB_CONTROL_DB_DETACH:
1373 case CTDB_CONTROL_GET_NODES_FILE:
1374 len = ctdb_node_map_len(cd->data.nodemap);
1377 case CTDB_CONTROL_DB_FREEZE:
1380 case CTDB_CONTROL_DB_THAW:
1383 case CTDB_CONTROL_DB_TRANSACTION_START:
1386 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1389 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1392 case CTDB_CONTROL_DB_PULL:
1393 len = ctdb_uint32_len(&cd->data.num_records);
1396 case CTDB_CONTROL_DB_PUSH_START:
1399 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1400 len = ctdb_uint32_len(&cd->data.num_records);
1403 case CTDB_CONTROL_DB_OPEN_FLAGS:
1404 len = ctdb_int32_len(&cd->data.tdb_flags);
1407 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1408 len = ctdb_uint32_len(&cd->data.db_id);
1415 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1420 switch (cd->opcode) {
1421 case CTDB_CONTROL_STATISTICS:
1422 ctdb_statistics_push(cd->data.stats, buf, &np);
1425 case CTDB_CONTROL_GETDBPATH:
1426 ctdb_string_push(&cd->data.db_path, buf, &np);
1429 case CTDB_CONTROL_GETVNNMAP:
1430 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
1433 case CTDB_CONTROL_GET_DEBUG:
1434 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1437 case CTDB_CONTROL_GET_DBMAP:
1438 ctdb_dbid_map_push(cd->data.dbmap, buf, &np);
1441 case CTDB_CONTROL_PULL_DB:
1442 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1445 case CTDB_CONTROL_PUSH_DB:
1448 case CTDB_CONTROL_DB_ATTACH:
1449 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1452 case CTDB_CONTROL_GET_DBNAME:
1453 ctdb_string_push(&cd->data.db_name, buf, &np);
1456 case CTDB_CONTROL_DUMP_MEMORY:
1457 ctdb_string_push(&cd->data.mem_str, buf, &np);
1460 case CTDB_CONTROL_GET_PID:
1463 case CTDB_CONTROL_GET_RECMASTER:
1466 case CTDB_CONTROL_GET_TUNABLE:
1467 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1470 case CTDB_CONTROL_LIST_TUNABLES:
1471 ctdb_var_list_push(cd->data.tun_var_list, buf);
1474 case CTDB_CONTROL_GET_ALL_TUNABLES:
1475 ctdb_tunable_list_push(cd->data.tun_list, buf);
1478 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1479 ctdb_tickle_list_push(cd->data.tickles, buf);
1482 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1483 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1486 case CTDB_CONTROL_UPTIME:
1487 ctdb_uptime_push(cd->data.uptime, buf);
1490 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1491 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1494 case CTDB_CONTROL_GET_CAPABILITIES:
1495 ctdb_uint32_push(&cd->data.caps, buf, &np);
1498 case CTDB_CONTROL_GET_PUBLIC_IPS:
1499 ctdb_public_ip_list_push(cd->data.pubip_list, buf);
1502 case CTDB_CONTROL_GET_NODEMAP:
1503 ctdb_node_map_push(cd->data.nodemap, buf);
1506 case CTDB_CONTROL_GET_RECLOCK_FILE:
1507 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1510 case CTDB_CONTROL_GET_BAN_STATE:
1511 ctdb_ban_state_push(cd->data.ban_state, buf);
1514 case CTDB_CONTROL_GET_DB_PRIORITY:
1517 case CTDB_CONTROL_GET_DB_SEQNUM:
1518 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1521 case CTDB_CONTROL_DB_GET_HEALTH:
1522 ctdb_string_push(&cd->data.reason, buf, &np);
1525 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1526 ctdb_public_ip_info_push(cd->data.ipinfo, buf);
1529 case CTDB_CONTROL_GET_IFACES:
1530 ctdb_iface_list_push(cd->data.iface_list, buf);
1533 case CTDB_CONTROL_GET_STAT_HISTORY:
1534 ctdb_statistics_list_push(cd->data.stats_list, buf);
1537 case CTDB_CONTROL_CHECK_SRVIDS:
1540 case CTDB_CONTROL_GET_DB_STATISTICS:
1541 ctdb_db_statistics_push(cd->data.dbstats, buf);
1544 case CTDB_CONTROL_RECEIVE_RECORDS:
1545 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1548 case CTDB_CONTROL_GET_RUNSTATE:
1549 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1552 case CTDB_CONTROL_GET_NODES_FILE:
1553 ctdb_node_map_push(cd->data.nodemap, buf);
1556 case CTDB_CONTROL_DB_PULL:
1557 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1560 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1561 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1564 case CTDB_CONTROL_DB_OPEN_FLAGS:
1565 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1568 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1569 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1574 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1575 uint32_t opcode, TALLOC_CTX *mem_ctx,
1576 struct ctdb_reply_control_data *cd)
1581 cd->opcode = opcode;
1584 case CTDB_CONTROL_STATISTICS:
1585 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1586 &cd->data.stats, &np);
1589 case CTDB_CONTROL_GETDBPATH:
1590 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1591 &cd->data.db_path, &np);
1594 case CTDB_CONTROL_GETVNNMAP:
1595 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1596 &cd->data.vnnmap, &np);
1599 case CTDB_CONTROL_GET_DEBUG:
1600 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1603 case CTDB_CONTROL_GET_DBMAP:
1604 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1605 &cd->data.dbmap, &np);
1608 case CTDB_CONTROL_PULL_DB:
1609 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1613 case CTDB_CONTROL_PUSH_DB:
1616 case CTDB_CONTROL_DB_ATTACH:
1617 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1620 case CTDB_CONTROL_GET_DBNAME:
1621 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1622 &cd->data.db_name, &np);
1625 case CTDB_CONTROL_DUMP_MEMORY:
1626 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1627 &cd->data.mem_str, &np);
1630 case CTDB_CONTROL_GET_PID:
1633 case CTDB_CONTROL_GET_RECMASTER:
1636 case CTDB_CONTROL_GET_TUNABLE:
1637 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1641 case CTDB_CONTROL_LIST_TUNABLES:
1642 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1643 &cd->data.tun_var_list);
1646 case CTDB_CONTROL_GET_ALL_TUNABLES:
1647 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1648 &cd->data.tun_list);
1651 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1652 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1656 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1657 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1660 case CTDB_CONTROL_UPTIME:
1661 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1665 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1666 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1670 case CTDB_CONTROL_GET_CAPABILITIES:
1671 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1674 case CTDB_CONTROL_GET_PUBLIC_IPS:
1675 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1676 &cd->data.pubip_list);
1679 case CTDB_CONTROL_GET_NODEMAP:
1680 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1684 case CTDB_CONTROL_GET_RECLOCK_FILE:
1685 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1686 &cd->data.reclock_file, &np);
1689 case CTDB_CONTROL_GET_BAN_STATE:
1690 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1691 &cd->data.ban_state);
1694 case CTDB_CONTROL_GET_DB_PRIORITY:
1697 case CTDB_CONTROL_GET_DB_SEQNUM:
1698 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1701 case CTDB_CONTROL_DB_GET_HEALTH:
1702 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1703 &cd->data.reason, &np);
1706 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1707 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1711 case CTDB_CONTROL_GET_IFACES:
1712 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1713 &cd->data.iface_list);
1716 case CTDB_CONTROL_GET_STAT_HISTORY:
1717 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1718 &cd->data.stats_list);
1721 case CTDB_CONTROL_CHECK_SRVIDS:
1724 case CTDB_CONTROL_GET_DB_STATISTICS:
1725 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1729 case CTDB_CONTROL_RECEIVE_RECORDS:
1730 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1734 case CTDB_CONTROL_GET_RUNSTATE:
1735 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1738 case CTDB_CONTROL_GET_NODES_FILE:
1739 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1743 case CTDB_CONTROL_DB_PULL:
1744 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1748 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1749 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1753 case CTDB_CONTROL_DB_OPEN_FLAGS:
1754 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1757 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1758 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1765 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1766 struct ctdb_req_control *c)
1768 return offsetof(struct ctdb_req_control_wire, data) +
1769 ctdb_req_control_data_len(&c->rdata);
1772 int ctdb_req_control_push(struct ctdb_req_header *h,
1773 struct ctdb_req_control *request,
1774 uint8_t *buf, size_t *buflen)
1776 struct ctdb_req_control_wire *wire =
1777 (struct ctdb_req_control_wire *)buf;
1780 length = ctdb_req_control_len(h, request);
1781 if (*buflen < length) {
1786 h->length = *buflen;
1787 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1789 wire->opcode = request->opcode;
1790 wire->pad = request->pad;
1791 wire->srvid = request->srvid;
1792 wire->client_id = request->client_id;
1793 wire->flags = request->flags;
1795 wire->datalen = ctdb_req_control_data_len(&request->rdata);
1796 ctdb_req_control_data_push(&request->rdata, wire->data);
1801 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1802 struct ctdb_req_header *h,
1803 TALLOC_CTX *mem_ctx,
1804 struct ctdb_req_control *c)
1806 struct ctdb_req_control_wire *wire =
1807 (struct ctdb_req_control_wire *)buf;
1811 length = offsetof(struct ctdb_req_control_wire, data);
1812 if (buflen < length) {
1815 if (wire->datalen > buflen) {
1818 if (length + wire->datalen < length) {
1821 if (buflen < length + wire->datalen) {
1826 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1832 c->opcode = wire->opcode;
1834 c->srvid = wire->srvid;
1835 c->client_id = wire->client_id;
1836 c->flags = wire->flags;
1838 ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1839 c->opcode, mem_ctx, &c->rdata);
1847 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1848 struct ctdb_reply_control *c)
1850 return offsetof(struct ctdb_reply_control_wire, data) +
1852 ctdb_reply_control_data_len(&c->rdata) :
1853 ctdb_string_len(&c->errmsg));
1856 int ctdb_reply_control_push(struct ctdb_req_header *h,
1857 struct ctdb_reply_control *reply,
1858 uint8_t *buf, size_t *buflen)
1860 struct ctdb_reply_control_wire *wire =
1861 (struct ctdb_reply_control_wire *)buf;
1864 length = ctdb_reply_control_len(h, reply);
1865 if (*buflen < length) {
1870 h->length = *buflen;
1871 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1873 wire->status = reply->status;
1875 if (reply->status == 0) {
1876 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1878 ctdb_reply_control_data_push(&reply->rdata, wire->data);
1881 wire->errorlen = ctdb_string_len(&reply->errmsg);
1882 ctdb_string_push(&reply->errmsg, wire->data + wire->datalen,
1889 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1890 struct ctdb_req_header *h,
1891 TALLOC_CTX *mem_ctx,
1892 struct ctdb_reply_control *c)
1894 struct ctdb_reply_control_wire *wire =
1895 (struct ctdb_reply_control_wire *)buf;
1899 length = offsetof(struct ctdb_reply_control_wire, data);
1900 if (buflen < length) {
1903 if (wire->datalen > buflen || wire->errorlen > buflen) {
1906 if (length + wire->datalen < length) {
1909 if (length + wire->datalen + wire->errorlen < length) {
1912 if (buflen < length + wire->datalen + wire->errorlen) {
1917 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1923 c->status = wire->status;
1925 if (c->status != -1) {
1926 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
1934 ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
1935 mem_ctx, &c->errmsg, &np);