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);
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);
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);
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);
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, mem_ctx,
737 case CTDB_CONTROL_GETDBPATH:
738 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
741 case CTDB_CONTROL_SETVNNMAP:
742 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
746 case CTDB_CONTROL_SET_DEBUG:
747 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
750 case CTDB_CONTROL_PULL_DB:
751 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
755 case CTDB_CONTROL_PUSH_DB:
756 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
760 case CTDB_CONTROL_SET_RECMODE:
761 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
764 case CTDB_CONTROL_DB_ATTACH:
765 ret = ctdb_string_pull(buf, buflen, mem_ctx,
766 &cd->data.db_name, &np);
769 case CTDB_CONTROL_SET_CALL:
772 case CTDB_CONTROL_TRAVERSE_START:
773 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
774 &cd->data.traverse_start);
777 case CTDB_CONTROL_TRAVERSE_ALL:
778 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
779 &cd->data.traverse_all);
782 case CTDB_CONTROL_TRAVERSE_DATA:
783 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
787 case CTDB_CONTROL_GET_DBNAME:
788 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
791 case CTDB_CONTROL_ENABLE_SEQNUM:
792 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
795 case CTDB_CONTROL_UPDATE_SEQNUM:
796 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
799 case CTDB_CONTROL_SET_RECMASTER:
800 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmaster, &np);
803 case CTDB_CONTROL_TCP_CLIENT:
804 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
808 case CTDB_CONTROL_TCP_ADD:
809 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
813 case CTDB_CONTROL_TCP_REMOVE:
814 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
818 case CTDB_CONTROL_SET_TUNABLE:
819 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
823 case CTDB_CONTROL_GET_TUNABLE:
824 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
828 case CTDB_CONTROL_MODIFY_FLAGS:
829 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
830 &cd->data.flag_change);
833 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
834 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
838 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
839 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
843 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
844 ret = ctdb_string_pull(buf, buflen, mem_ctx,
845 &cd->data.db_name, &np);
848 case CTDB_CONTROL_UPDATE_RECORD:
849 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
853 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
854 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
855 &cd->data.addr_info);
858 case CTDB_CONTROL_WIPE_DATABASE:
859 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
863 case CTDB_CONTROL_TRY_DELETE_RECORDS:
864 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
868 case CTDB_CONTROL_ADD_PUBLIC_IP:
869 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
870 &cd->data.addr_info);
873 case CTDB_CONTROL_DEL_PUBLIC_IP:
874 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
875 &cd->data.addr_info);
878 case CTDB_CONTROL_RELEASE_IP:
879 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
883 case CTDB_CONTROL_TAKEOVER_IP:
884 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
888 case CTDB_CONTROL_TRAVERSE_KILL:
889 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
890 &cd->data.traverse_start);
893 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
894 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
898 case CTDB_CONTROL_SET_LMASTERROLE:
899 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
902 case CTDB_CONTROL_SET_RECMASTERROLE:
903 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
906 case CTDB_CONTROL_SET_BAN_STATE:
907 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
908 &cd->data.ban_state);
911 case CTDB_CONTROL_REGISTER_NOTIFY:
912 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
916 case CTDB_CONTROL_DEREGISTER_NOTIFY:
917 ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
920 case CTDB_CONTROL_TRANS3_COMMIT:
921 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
925 case CTDB_CONTROL_GET_DB_SEQNUM:
927 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
932 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
937 case CTDB_CONTROL_DB_SET_HEALTHY:
938 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
941 case CTDB_CONTROL_DB_GET_HEALTH:
942 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
945 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
946 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
950 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
951 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
955 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
956 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
960 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
961 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
965 case CTDB_CONTROL_SET_DB_READONLY:
966 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
969 case CTDB_CONTROL_CHECK_SRVIDS:
972 case CTDB_CONTROL_TRAVERSE_START_EXT:
973 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
974 &cd->data.traverse_start_ext);
977 case CTDB_CONTROL_GET_DB_STATISTICS:
978 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
981 case CTDB_CONTROL_SET_DB_STICKY:
982 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
985 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
986 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
987 &cd->data.traverse_all_ext);
990 case CTDB_CONTROL_RECEIVE_RECORDS:
991 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
995 case CTDB_CONTROL_DB_DETACH:
996 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
999 case CTDB_CONTROL_DB_FREEZE:
1000 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1003 case CTDB_CONTROL_DB_THAW:
1004 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1007 case CTDB_CONTROL_DB_TRANSACTION_START:
1008 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1012 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1013 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1017 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1018 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1021 case CTDB_CONTROL_DB_PULL:
1022 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1023 &cd->data.pulldb_ext);
1026 case CTDB_CONTROL_DB_PUSH_START:
1027 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1028 &cd->data.pulldb_ext);
1031 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1032 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1035 case CTDB_CONTROL_DB_OPEN_FLAGS:
1036 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1039 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1040 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1041 &cd->data.db_name, &np);
1048 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1056 switch (cd->opcode) {
1057 case CTDB_CONTROL_PROCESS_EXISTS:
1060 case CTDB_CONTROL_STATISTICS:
1061 len = ctdb_statistics_len(cd->data.stats);
1064 case CTDB_CONTROL_PING:
1067 case CTDB_CONTROL_GETDBPATH:
1068 len = ctdb_string_len(&cd->data.db_path);
1071 case CTDB_CONTROL_GETVNNMAP:
1072 len = ctdb_vnn_map_len(cd->data.vnnmap);
1075 case CTDB_CONTROL_SETVNNMAP:
1078 case CTDB_CONTROL_GET_DEBUG:
1079 len = ctdb_uint32_len(&cd->data.loglevel);
1082 case CTDB_CONTROL_SET_DEBUG:
1085 case CTDB_CONTROL_GET_DBMAP:
1086 len = ctdb_dbid_map_len(cd->data.dbmap);
1089 case CTDB_CONTROL_PULL_DB:
1090 len = ctdb_rec_buffer_len(cd->data.recbuf);
1093 case CTDB_CONTROL_PUSH_DB:
1096 case CTDB_CONTROL_GET_RECMODE:
1099 case CTDB_CONTROL_SET_RECMODE:
1102 case CTDB_CONTROL_STATISTICS_RESET:
1105 case CTDB_CONTROL_DB_ATTACH:
1106 len = ctdb_uint32_len(&cd->data.db_id);
1109 case CTDB_CONTROL_SET_CALL:
1112 case CTDB_CONTROL_TRAVERSE_START:
1115 case CTDB_CONTROL_TRAVERSE_ALL:
1118 case CTDB_CONTROL_TRAVERSE_DATA:
1121 case CTDB_CONTROL_REGISTER_SRVID:
1124 case CTDB_CONTROL_DEREGISTER_SRVID:
1127 case CTDB_CONTROL_GET_DBNAME:
1128 len = ctdb_string_len(&cd->data.db_name);
1131 case CTDB_CONTROL_ENABLE_SEQNUM:
1134 case CTDB_CONTROL_UPDATE_SEQNUM:
1137 case CTDB_CONTROL_DUMP_MEMORY:
1138 len = ctdb_string_len(&cd->data.mem_str);
1141 case CTDB_CONTROL_GET_PID:
1144 case CTDB_CONTROL_GET_RECMASTER:
1147 case CTDB_CONTROL_SET_RECMASTER:
1150 case CTDB_CONTROL_FREEZE:
1153 case CTDB_CONTROL_GET_PNN:
1156 case CTDB_CONTROL_SHUTDOWN:
1159 case CTDB_CONTROL_GET_MONMODE:
1162 case CTDB_CONTROL_TCP_CLIENT:
1165 case CTDB_CONTROL_TCP_ADD:
1168 case CTDB_CONTROL_TCP_REMOVE:
1171 case CTDB_CONTROL_STARTUP:
1174 case CTDB_CONTROL_SET_TUNABLE:
1177 case CTDB_CONTROL_GET_TUNABLE:
1178 len = ctdb_uint32_len(&cd->data.tun_value);
1181 case CTDB_CONTROL_LIST_TUNABLES:
1182 len = ctdb_var_list_len(cd->data.tun_var_list);
1185 case CTDB_CONTROL_MODIFY_FLAGS:
1188 case CTDB_CONTROL_GET_ALL_TUNABLES:
1189 len = ctdb_tunable_list_len(cd->data.tun_list);
1192 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1193 len = ctdb_tickle_list_len(cd->data.tickles);
1196 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1199 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1200 len = ctdb_uint32_len(&cd->data.db_id);
1203 case CTDB_CONTROL_UPDATE_RECORD:
1206 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1209 case CTDB_CONTROL_WIPE_DATABASE:
1212 case CTDB_CONTROL_UPTIME:
1213 len = ctdb_uptime_len(cd->data.uptime);
1216 case CTDB_CONTROL_START_RECOVERY:
1219 case CTDB_CONTROL_END_RECOVERY:
1222 case CTDB_CONTROL_RELOAD_NODES_FILE:
1225 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1226 len = ctdb_rec_buffer_len(cd->data.recbuf);
1229 case CTDB_CONTROL_ENABLE_MONITOR:
1232 case CTDB_CONTROL_DISABLE_MONITOR:
1235 case CTDB_CONTROL_ADD_PUBLIC_IP:
1238 case CTDB_CONTROL_DEL_PUBLIC_IP:
1241 case CTDB_CONTROL_GET_CAPABILITIES:
1242 len = ctdb_uint32_len(&cd->data.caps);
1245 case CTDB_CONTROL_RECD_PING:
1248 case CTDB_CONTROL_RELEASE_IP:
1251 case CTDB_CONTROL_TAKEOVER_IP:
1254 case CTDB_CONTROL_GET_PUBLIC_IPS:
1255 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1258 case CTDB_CONTROL_GET_NODEMAP:
1259 len = ctdb_node_map_len(cd->data.nodemap);
1262 case CTDB_CONTROL_TRAVERSE_KILL:
1265 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1268 case CTDB_CONTROL_GET_RECLOCK_FILE:
1269 len = ctdb_string_len(&cd->data.reclock_file);
1272 case CTDB_CONTROL_STOP_NODE:
1275 case CTDB_CONTROL_CONTINUE_NODE:
1278 case CTDB_CONTROL_SET_LMASTERROLE:
1281 case CTDB_CONTROL_SET_RECMASTERROLE:
1284 case CTDB_CONTROL_SET_BAN_STATE:
1287 case CTDB_CONTROL_GET_BAN_STATE:
1288 len = ctdb_ban_state_len(cd->data.ban_state);
1291 case CTDB_CONTROL_SET_DB_PRIORITY:
1294 case CTDB_CONTROL_GET_DB_PRIORITY:
1297 case CTDB_CONTROL_REGISTER_NOTIFY:
1300 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1303 case CTDB_CONTROL_TRANS3_COMMIT:
1306 case CTDB_CONTROL_GET_DB_SEQNUM:
1307 len = ctdb_uint64_len(&cd->data.seqnum);
1310 case CTDB_CONTROL_DB_SET_HEALTHY:
1313 case CTDB_CONTROL_DB_GET_HEALTH:
1314 len = ctdb_string_len(&cd->data.reason);
1317 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1318 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1321 case CTDB_CONTROL_GET_IFACES:
1322 len = ctdb_iface_list_len(cd->data.iface_list);
1325 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1328 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1331 case CTDB_CONTROL_GET_STAT_HISTORY:
1332 len = ctdb_statistics_list_len(cd->data.stats_list);
1335 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1338 case CTDB_CONTROL_SET_DB_READONLY:
1341 case CTDB_CONTROL_CHECK_SRVIDS:
1344 case CTDB_CONTROL_TRAVERSE_START_EXT:
1347 case CTDB_CONTROL_GET_DB_STATISTICS:
1348 len = ctdb_db_statistics_len(cd->data.dbstats);
1351 case CTDB_CONTROL_SET_DB_STICKY:
1354 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1357 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1360 case CTDB_CONTROL_RECEIVE_RECORDS:
1361 len = ctdb_rec_buffer_len(cd->data.recbuf);
1364 case CTDB_CONTROL_IPREALLOCATED:
1367 case CTDB_CONTROL_GET_RUNSTATE:
1368 len = ctdb_uint32_len(&cd->data.runstate);
1371 case CTDB_CONTROL_DB_DETACH:
1374 case CTDB_CONTROL_GET_NODES_FILE:
1375 len = ctdb_node_map_len(cd->data.nodemap);
1378 case CTDB_CONTROL_DB_FREEZE:
1381 case CTDB_CONTROL_DB_THAW:
1384 case CTDB_CONTROL_DB_TRANSACTION_START:
1387 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1390 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1393 case CTDB_CONTROL_DB_PULL:
1394 len = ctdb_uint32_len(&cd->data.num_records);
1397 case CTDB_CONTROL_DB_PUSH_START:
1400 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1401 len = ctdb_uint32_len(&cd->data.num_records);
1404 case CTDB_CONTROL_DB_OPEN_FLAGS:
1405 len = ctdb_int32_len(&cd->data.tdb_flags);
1408 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1409 len = ctdb_uint32_len(&cd->data.db_id);
1416 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1421 switch (cd->opcode) {
1422 case CTDB_CONTROL_STATISTICS:
1423 ctdb_statistics_push(cd->data.stats, buf);
1426 case CTDB_CONTROL_GETDBPATH:
1427 ctdb_string_push(&cd->data.db_path, buf, &np);
1430 case CTDB_CONTROL_GETVNNMAP:
1431 ctdb_vnn_map_push(cd->data.vnnmap, buf);
1434 case CTDB_CONTROL_GET_DEBUG:
1435 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1438 case CTDB_CONTROL_GET_DBMAP:
1439 ctdb_dbid_map_push(cd->data.dbmap, buf);
1442 case CTDB_CONTROL_PULL_DB:
1443 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1446 case CTDB_CONTROL_PUSH_DB:
1449 case CTDB_CONTROL_DB_ATTACH:
1450 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1453 case CTDB_CONTROL_GET_DBNAME:
1454 ctdb_string_push(&cd->data.db_name, buf, &np);
1457 case CTDB_CONTROL_DUMP_MEMORY:
1458 ctdb_string_push(&cd->data.mem_str, buf, &np);
1461 case CTDB_CONTROL_GET_PID:
1464 case CTDB_CONTROL_GET_RECMASTER:
1467 case CTDB_CONTROL_GET_TUNABLE:
1468 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1471 case CTDB_CONTROL_LIST_TUNABLES:
1472 ctdb_var_list_push(cd->data.tun_var_list, buf);
1475 case CTDB_CONTROL_GET_ALL_TUNABLES:
1476 ctdb_tunable_list_push(cd->data.tun_list, buf);
1479 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1480 ctdb_tickle_list_push(cd->data.tickles, buf);
1483 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1484 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1487 case CTDB_CONTROL_UPTIME:
1488 ctdb_uptime_push(cd->data.uptime, buf);
1491 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1492 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1495 case CTDB_CONTROL_GET_CAPABILITIES:
1496 ctdb_uint32_push(&cd->data.caps, buf, &np);
1499 case CTDB_CONTROL_GET_PUBLIC_IPS:
1500 ctdb_public_ip_list_push(cd->data.pubip_list, buf);
1503 case CTDB_CONTROL_GET_NODEMAP:
1504 ctdb_node_map_push(cd->data.nodemap, buf);
1507 case CTDB_CONTROL_GET_RECLOCK_FILE:
1508 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1511 case CTDB_CONTROL_GET_BAN_STATE:
1512 ctdb_ban_state_push(cd->data.ban_state, buf);
1515 case CTDB_CONTROL_GET_DB_PRIORITY:
1518 case CTDB_CONTROL_GET_DB_SEQNUM:
1519 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1522 case CTDB_CONTROL_DB_GET_HEALTH:
1523 ctdb_string_push(&cd->data.reason, buf, &np);
1526 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1527 ctdb_public_ip_info_push(cd->data.ipinfo, buf);
1530 case CTDB_CONTROL_GET_IFACES:
1531 ctdb_iface_list_push(cd->data.iface_list, buf);
1534 case CTDB_CONTROL_GET_STAT_HISTORY:
1535 ctdb_statistics_list_push(cd->data.stats_list, buf);
1538 case CTDB_CONTROL_CHECK_SRVIDS:
1541 case CTDB_CONTROL_GET_DB_STATISTICS:
1542 ctdb_db_statistics_push(cd->data.dbstats, buf);
1545 case CTDB_CONTROL_RECEIVE_RECORDS:
1546 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1549 case CTDB_CONTROL_GET_RUNSTATE:
1550 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1553 case CTDB_CONTROL_GET_NODES_FILE:
1554 ctdb_node_map_push(cd->data.nodemap, buf);
1557 case CTDB_CONTROL_DB_PULL:
1558 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1561 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1562 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1565 case CTDB_CONTROL_DB_OPEN_FLAGS:
1566 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1569 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1570 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1575 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1576 uint32_t opcode, TALLOC_CTX *mem_ctx,
1577 struct ctdb_reply_control_data *cd)
1582 cd->opcode = opcode;
1585 case CTDB_CONTROL_STATISTICS:
1586 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1590 case CTDB_CONTROL_GETDBPATH:
1591 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1592 &cd->data.db_path, &np);
1595 case CTDB_CONTROL_GETVNNMAP:
1596 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1600 case CTDB_CONTROL_GET_DEBUG:
1601 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1604 case CTDB_CONTROL_GET_DBMAP:
1605 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1609 case CTDB_CONTROL_PULL_DB:
1610 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1614 case CTDB_CONTROL_PUSH_DB:
1617 case CTDB_CONTROL_DB_ATTACH:
1618 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1621 case CTDB_CONTROL_GET_DBNAME:
1622 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1623 &cd->data.db_name, &np);
1626 case CTDB_CONTROL_DUMP_MEMORY:
1627 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1628 &cd->data.mem_str, &np);
1631 case CTDB_CONTROL_GET_PID:
1634 case CTDB_CONTROL_GET_RECMASTER:
1637 case CTDB_CONTROL_GET_TUNABLE:
1638 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1642 case CTDB_CONTROL_LIST_TUNABLES:
1643 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1644 &cd->data.tun_var_list);
1647 case CTDB_CONTROL_GET_ALL_TUNABLES:
1648 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1649 &cd->data.tun_list);
1652 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1653 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1657 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1658 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1661 case CTDB_CONTROL_UPTIME:
1662 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1666 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1667 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1671 case CTDB_CONTROL_GET_CAPABILITIES:
1672 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1675 case CTDB_CONTROL_GET_PUBLIC_IPS:
1676 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1677 &cd->data.pubip_list);
1680 case CTDB_CONTROL_GET_NODEMAP:
1681 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1685 case CTDB_CONTROL_GET_RECLOCK_FILE:
1686 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1687 &cd->data.reclock_file, &np);
1690 case CTDB_CONTROL_GET_BAN_STATE:
1691 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1692 &cd->data.ban_state);
1695 case CTDB_CONTROL_GET_DB_PRIORITY:
1698 case CTDB_CONTROL_GET_DB_SEQNUM:
1699 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1702 case CTDB_CONTROL_DB_GET_HEALTH:
1703 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1704 &cd->data.reason, &np);
1707 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1708 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1712 case CTDB_CONTROL_GET_IFACES:
1713 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1714 &cd->data.iface_list);
1717 case CTDB_CONTROL_GET_STAT_HISTORY:
1718 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1719 &cd->data.stats_list);
1722 case CTDB_CONTROL_CHECK_SRVIDS:
1725 case CTDB_CONTROL_GET_DB_STATISTICS:
1726 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1730 case CTDB_CONTROL_RECEIVE_RECORDS:
1731 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1735 case CTDB_CONTROL_GET_RUNSTATE:
1736 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1739 case CTDB_CONTROL_GET_NODES_FILE:
1740 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1744 case CTDB_CONTROL_DB_PULL:
1745 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1749 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1750 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1754 case CTDB_CONTROL_DB_OPEN_FLAGS:
1755 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1758 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1759 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1766 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1767 struct ctdb_req_control *c)
1769 return offsetof(struct ctdb_req_control_wire, data) +
1770 ctdb_req_control_data_len(&c->rdata);
1773 int ctdb_req_control_push(struct ctdb_req_header *h,
1774 struct ctdb_req_control *request,
1775 uint8_t *buf, size_t *buflen)
1777 struct ctdb_req_control_wire *wire =
1778 (struct ctdb_req_control_wire *)buf;
1781 length = ctdb_req_control_len(h, request);
1782 if (*buflen < length) {
1787 h->length = *buflen;
1788 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1790 wire->opcode = request->opcode;
1791 wire->pad = request->pad;
1792 wire->srvid = request->srvid;
1793 wire->client_id = request->client_id;
1794 wire->flags = request->flags;
1796 wire->datalen = ctdb_req_control_data_len(&request->rdata);
1797 ctdb_req_control_data_push(&request->rdata, wire->data);
1802 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1803 struct ctdb_req_header *h,
1804 TALLOC_CTX *mem_ctx,
1805 struct ctdb_req_control *c)
1807 struct ctdb_req_control_wire *wire =
1808 (struct ctdb_req_control_wire *)buf;
1812 length = offsetof(struct ctdb_req_control_wire, data);
1813 if (buflen < length) {
1816 if (wire->datalen > buflen) {
1819 if (length + wire->datalen < length) {
1822 if (buflen < length + wire->datalen) {
1827 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1833 c->opcode = wire->opcode;
1835 c->srvid = wire->srvid;
1836 c->client_id = wire->client_id;
1837 c->flags = wire->flags;
1839 ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1840 c->opcode, mem_ctx, &c->rdata);
1848 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1849 struct ctdb_reply_control *c)
1851 return offsetof(struct ctdb_reply_control_wire, data) +
1853 ctdb_reply_control_data_len(&c->rdata) :
1854 ctdb_string_len(&c->errmsg));
1857 int ctdb_reply_control_push(struct ctdb_req_header *h,
1858 struct ctdb_reply_control *reply,
1859 uint8_t *buf, size_t *buflen)
1861 struct ctdb_reply_control_wire *wire =
1862 (struct ctdb_reply_control_wire *)buf;
1865 length = ctdb_reply_control_len(h, reply);
1866 if (*buflen < length) {
1871 h->length = *buflen;
1872 ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1874 wire->status = reply->status;
1876 if (reply->status == 0) {
1877 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1879 ctdb_reply_control_data_push(&reply->rdata, wire->data);
1882 wire->errorlen = ctdb_string_len(&reply->errmsg);
1883 ctdb_string_push(&reply->errmsg, wire->data + wire->datalen,
1890 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1891 struct ctdb_req_header *h,
1892 TALLOC_CTX *mem_ctx,
1893 struct ctdb_reply_control *c)
1895 struct ctdb_reply_control_wire *wire =
1896 (struct ctdb_reply_control_wire *)buf;
1900 length = offsetof(struct ctdb_reply_control_wire, data);
1901 if (buflen < length) {
1904 if (wire->datalen > buflen || wire->errorlen > buflen) {
1907 if (length + wire->datalen < length) {
1910 if (length + wire->datalen + wire->errorlen < length) {
1913 if (buflen < length + wire->datalen + wire->errorlen) {
1918 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1924 c->status = wire->status;
1926 if (c->status != -1) {
1927 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
1935 ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
1936 mem_ctx, &c->errmsg, &np);