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 static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
40 case CTDB_CONTROL_PROCESS_EXISTS:
41 len = ctdb_pid_len(&cd->data.pid);
44 case CTDB_CONTROL_STATISTICS:
47 case CTDB_CONTROL_PING:
50 case CTDB_CONTROL_GETDBPATH:
51 len = ctdb_uint32_len(&cd->data.db_id);
54 case CTDB_CONTROL_GETVNNMAP:
57 case CTDB_CONTROL_SETVNNMAP:
58 len = ctdb_vnn_map_len(cd->data.vnnmap);
61 case CTDB_CONTROL_GET_DEBUG:
64 case CTDB_CONTROL_SET_DEBUG:
65 len = ctdb_uint32_len(&cd->data.loglevel);
68 case CTDB_CONTROL_GET_DBMAP:
71 case CTDB_CONTROL_GET_RECMODE:
74 case CTDB_CONTROL_SET_RECMODE:
75 len = ctdb_uint32_len(&cd->data.recmode);
78 case CTDB_CONTROL_STATISTICS_RESET:
81 case CTDB_CONTROL_DB_ATTACH:
82 len = ctdb_string_len(&cd->data.db_name);
85 case CTDB_CONTROL_TRAVERSE_START:
86 len = ctdb_traverse_start_len(cd->data.traverse_start);
89 case CTDB_CONTROL_TRAVERSE_ALL:
90 len = ctdb_traverse_all_len(cd->data.traverse_all);
93 case CTDB_CONTROL_TRAVERSE_DATA:
94 len = ctdb_rec_data_len(cd->data.rec_data);
97 case CTDB_CONTROL_REGISTER_SRVID:
100 case CTDB_CONTROL_DEREGISTER_SRVID:
103 case CTDB_CONTROL_GET_DBNAME:
104 len = ctdb_uint32_len(&cd->data.db_id);
107 case CTDB_CONTROL_ENABLE_SEQNUM:
108 len = ctdb_uint32_len(&cd->data.db_id);
111 case CTDB_CONTROL_UPDATE_SEQNUM:
112 len = ctdb_uint32_len(&cd->data.db_id);
115 case CTDB_CONTROL_DUMP_MEMORY:
118 case CTDB_CONTROL_GET_PID:
121 case CTDB_CONTROL_FREEZE:
124 case CTDB_CONTROL_GET_PNN:
127 case CTDB_CONTROL_SHUTDOWN:
130 case CTDB_CONTROL_TCP_CLIENT:
131 len = ctdb_connection_len(cd->data.conn);
134 case CTDB_CONTROL_TCP_ADD:
135 len = ctdb_connection_len(cd->data.conn);
138 case CTDB_CONTROL_TCP_REMOVE:
139 len = ctdb_connection_len(cd->data.conn);
142 case CTDB_CONTROL_STARTUP:
145 case CTDB_CONTROL_SET_TUNABLE:
146 len = ctdb_tunable_len(cd->data.tunable);
149 case CTDB_CONTROL_GET_TUNABLE:
150 len = ctdb_stringn_len(&cd->data.tun_var);
153 case CTDB_CONTROL_LIST_TUNABLES:
156 case CTDB_CONTROL_MODIFY_FLAGS:
157 len = ctdb_node_flag_change_len(cd->data.flag_change);
160 case CTDB_CONTROL_GET_ALL_TUNABLES:
163 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
164 len = ctdb_sock_addr_len(cd->data.addr);
167 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
168 len = ctdb_tickle_list_len(cd->data.tickles);
171 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
172 len = ctdb_string_len(&cd->data.db_name);
175 case CTDB_CONTROL_UPDATE_RECORD:
176 len = ctdb_rec_buffer_len(cd->data.recbuf);
179 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
180 len = ctdb_addr_info_len(cd->data.addr_info);
183 case CTDB_CONTROL_WIPE_DATABASE:
184 len = ctdb_transdb_len(cd->data.transdb);
187 case CTDB_CONTROL_UPTIME:
190 case CTDB_CONTROL_START_RECOVERY:
193 case CTDB_CONTROL_END_RECOVERY:
196 case CTDB_CONTROL_RELOAD_NODES_FILE:
199 case CTDB_CONTROL_TRY_DELETE_RECORDS:
200 len = ctdb_rec_buffer_len(cd->data.recbuf);
203 case CTDB_CONTROL_ADD_PUBLIC_IP:
204 len = ctdb_addr_info_len(cd->data.addr_info);
207 case CTDB_CONTROL_DEL_PUBLIC_IP:
208 len = ctdb_addr_info_len(cd->data.addr_info);
211 case CTDB_CONTROL_GET_CAPABILITIES:
214 case CTDB_CONTROL_RECD_PING:
217 case CTDB_CONTROL_RELEASE_IP:
218 len = ctdb_public_ip_len(cd->data.pubip);
221 case CTDB_CONTROL_TAKEOVER_IP:
222 len = ctdb_public_ip_len(cd->data.pubip);
225 case CTDB_CONTROL_GET_PUBLIC_IPS:
228 case CTDB_CONTROL_GET_NODEMAP:
231 case CTDB_CONTROL_TRAVERSE_KILL:
232 len = ctdb_traverse_start_len(cd->data.traverse_start);
235 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
236 len = ctdb_double_len(&cd->data.reclock_latency);
239 case CTDB_CONTROL_GET_RECLOCK_FILE:
242 case CTDB_CONTROL_STOP_NODE:
245 case CTDB_CONTROL_CONTINUE_NODE:
248 case CTDB_CONTROL_SET_LMASTERROLE:
249 len = ctdb_uint32_len(&cd->data.role);
252 case CTDB_CONTROL_SET_RECMASTERROLE:
253 len = ctdb_uint32_len(&cd->data.role);
256 case CTDB_CONTROL_SET_BAN_STATE:
257 len = ctdb_ban_state_len(cd->data.ban_state);
260 case CTDB_CONTROL_GET_BAN_STATE:
263 case CTDB_CONTROL_REGISTER_NOTIFY:
264 len = ctdb_notify_data_len(cd->data.notify);
267 case CTDB_CONTROL_DEREGISTER_NOTIFY:
268 len = ctdb_uint64_len(&cd->data.srvid);
271 case CTDB_CONTROL_TRANS3_COMMIT:
272 len = ctdb_rec_buffer_len(cd->data.recbuf);
275 case CTDB_CONTROL_GET_DB_SEQNUM:
277 len = ctdb_uint32_len(&cd->data.db_id) + ctdb_uint32_len(&u32);
280 case CTDB_CONTROL_DB_SET_HEALTHY:
281 len = ctdb_uint32_len(&cd->data.db_id);
284 case CTDB_CONTROL_DB_GET_HEALTH:
285 len = ctdb_uint32_len(&cd->data.db_id);
288 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
289 len = ctdb_sock_addr_len(cd->data.addr);
292 case CTDB_CONTROL_GET_IFACES:
295 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
296 len = ctdb_iface_len(cd->data.iface);
299 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
300 len = ctdb_connection_len(cd->data.conn);
303 case CTDB_CONTROL_GET_STAT_HISTORY:
306 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
307 len = ctdb_key_data_len(cd->data.key);
310 case CTDB_CONTROL_SET_DB_READONLY:
311 len = ctdb_uint32_len(&cd->data.db_id);
314 case CTDB_CONTROL_TRAVERSE_START_EXT:
315 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
318 case CTDB_CONTROL_GET_DB_STATISTICS:
319 len = ctdb_uint32_len(&cd->data.db_id);
322 case CTDB_CONTROL_SET_DB_STICKY:
323 len = ctdb_uint32_len(&cd->data.db_id);
326 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
329 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
330 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
333 case CTDB_CONTROL_IPREALLOCATED:
336 case CTDB_CONTROL_GET_RUNSTATE:
339 case CTDB_CONTROL_DB_DETACH:
340 len = ctdb_uint32_len(&cd->data.db_id);
343 case CTDB_CONTROL_GET_NODES_FILE:
346 case CTDB_CONTROL_DB_FREEZE:
347 len = ctdb_uint32_len(&cd->data.db_id);
350 case CTDB_CONTROL_DB_THAW:
351 len = ctdb_uint32_len(&cd->data.db_id);
354 case CTDB_CONTROL_DB_TRANSACTION_START:
355 len = ctdb_transdb_len(cd->data.transdb);
358 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
359 len = ctdb_transdb_len(cd->data.transdb);
362 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
363 len = ctdb_uint32_len(&cd->data.db_id);
366 case CTDB_CONTROL_DB_PULL:
367 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
370 case CTDB_CONTROL_DB_PUSH_START:
371 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
374 case CTDB_CONTROL_DB_PUSH_CONFIRM:
375 len = ctdb_uint32_len(&cd->data.db_id);
378 case CTDB_CONTROL_DB_OPEN_FLAGS:
379 len = ctdb_uint32_len(&cd->data.db_id);
382 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
383 len = ctdb_string_len(&cd->data.db_name);
386 case CTDB_CONTROL_CHECK_PID_SRVID:
387 len = ctdb_pid_srvid_len(cd->data.pid_srvid);
390 case CTDB_CONTROL_TUNNEL_REGISTER:
393 case CTDB_CONTROL_TUNNEL_DEREGISTER:
396 case CTDB_CONTROL_VACUUM_FETCH:
397 len = ctdb_rec_buffer_len(cd->data.recbuf);
400 case CTDB_CONTROL_DB_VACUUM:
401 len = ctdb_db_vacuum_len(cd->data.db_vacuum);
404 case CTDB_CONTROL_ECHO_DATA:
405 len = ctdb_echo_data_len(cd->data.echo_data);
408 case CTDB_CONTROL_DISABLE_NODE:
411 case CTDB_CONTROL_ENABLE_NODE:
414 case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
415 len = ctdb_connection_len(cd->data.conn);
418 case CTDB_CONTROL_TCP_CLIENT_PASSED:
419 len = ctdb_connection_len(cd->data.conn);
426 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
427 uint8_t *buf, size_t *npush)
429 size_t np = 0, offset;
432 switch (cd->opcode) {
433 case CTDB_CONTROL_PROCESS_EXISTS:
434 ctdb_pid_push(&cd->data.pid, buf, &np);
437 case CTDB_CONTROL_GETDBPATH:
438 ctdb_uint32_push(&cd->data.db_id, buf, &np);
441 case CTDB_CONTROL_SETVNNMAP:
442 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
445 case CTDB_CONTROL_SET_DEBUG:
446 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
449 case CTDB_CONTROL_SET_RECMODE:
450 ctdb_uint32_push(&cd->data.recmode, buf, &np);
453 case CTDB_CONTROL_DB_ATTACH:
454 ctdb_string_push(&cd->data.db_name, buf, &np);
457 case CTDB_CONTROL_TRAVERSE_START:
458 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
461 case CTDB_CONTROL_TRAVERSE_ALL:
462 ctdb_traverse_all_push(cd->data.traverse_all, buf, &np);
465 case CTDB_CONTROL_TRAVERSE_DATA:
466 ctdb_rec_data_push(cd->data.rec_data, buf, &np);
469 case CTDB_CONTROL_GET_DBNAME:
470 ctdb_uint32_push(&cd->data.db_id, buf, &np);
473 case CTDB_CONTROL_ENABLE_SEQNUM:
474 ctdb_uint32_push(&cd->data.db_id, buf, &np);
477 case CTDB_CONTROL_UPDATE_SEQNUM:
478 ctdb_uint32_push(&cd->data.db_id, buf, &np);
481 case CTDB_CONTROL_TCP_CLIENT:
482 ctdb_connection_push(cd->data.conn, buf, &np);
485 case CTDB_CONTROL_TCP_ADD:
486 ctdb_connection_push(cd->data.conn, buf, &np);
489 case CTDB_CONTROL_TCP_REMOVE:
490 ctdb_connection_push(cd->data.conn, buf, &np);
493 case CTDB_CONTROL_SET_TUNABLE:
494 ctdb_tunable_push(cd->data.tunable, buf, &np);
497 case CTDB_CONTROL_GET_TUNABLE:
498 ctdb_stringn_push(&cd->data.tun_var, buf, &np);
501 case CTDB_CONTROL_MODIFY_FLAGS:
502 ctdb_node_flag_change_push(cd->data.flag_change, buf, &np);
505 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
506 ctdb_sock_addr_push(cd->data.addr, buf, &np);
509 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
510 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
513 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
514 ctdb_string_push(&cd->data.db_name, buf, &np);
517 case CTDB_CONTROL_UPDATE_RECORD:
518 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
521 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
522 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
525 case CTDB_CONTROL_WIPE_DATABASE:
526 ctdb_transdb_push(cd->data.transdb, buf, &np);
529 case CTDB_CONTROL_TRY_DELETE_RECORDS:
530 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
533 case CTDB_CONTROL_ADD_PUBLIC_IP:
534 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
537 case CTDB_CONTROL_DEL_PUBLIC_IP:
538 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
541 case CTDB_CONTROL_RELEASE_IP:
542 ctdb_public_ip_push(cd->data.pubip, buf, &np);
545 case CTDB_CONTROL_TAKEOVER_IP:
546 ctdb_public_ip_push(cd->data.pubip, buf, &np);
549 case CTDB_CONTROL_TRAVERSE_KILL:
550 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
553 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
554 ctdb_double_push(&cd->data.reclock_latency, buf, &np);
557 case CTDB_CONTROL_SET_LMASTERROLE:
558 ctdb_uint32_push(&cd->data.role, buf, &np);
561 case CTDB_CONTROL_SET_RECMASTERROLE:
562 ctdb_uint32_push(&cd->data.role, buf, &np);
565 case CTDB_CONTROL_SET_BAN_STATE:
566 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
569 case CTDB_CONTROL_REGISTER_NOTIFY:
570 ctdb_notify_data_push(cd->data.notify, buf, &np);
573 case CTDB_CONTROL_DEREGISTER_NOTIFY:
574 ctdb_uint64_push(&cd->data.srvid, buf, &np);
577 case CTDB_CONTROL_TRANS3_COMMIT:
578 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
581 case CTDB_CONTROL_GET_DB_SEQNUM:
584 ctdb_uint32_push(&cd->data.db_id, buf, &np);
586 ctdb_uint32_push(&u32, buf+offset, &np);
591 case CTDB_CONTROL_DB_SET_HEALTHY:
592 ctdb_uint32_push(&cd->data.db_id, buf, &np);
595 case CTDB_CONTROL_DB_GET_HEALTH:
596 ctdb_uint32_push(&cd->data.db_id, buf, &np);
599 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
600 ctdb_sock_addr_push(cd->data.addr, buf, &np);
603 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
604 ctdb_iface_push(cd->data.iface, buf, &np);
607 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
608 ctdb_connection_push(cd->data.conn, buf, &np);
611 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
612 ctdb_key_data_push(cd->data.key, buf, &np);
615 case CTDB_CONTROL_SET_DB_READONLY:
616 ctdb_uint32_push(&cd->data.db_id, buf, &np);
619 case CTDB_CONTROL_TRAVERSE_START_EXT:
620 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf,
624 case CTDB_CONTROL_GET_DB_STATISTICS:
625 ctdb_uint32_push(&cd->data.db_id, buf, &np);
628 case CTDB_CONTROL_SET_DB_STICKY:
629 ctdb_uint32_push(&cd->data.db_id, buf, &np);
632 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
633 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf,
637 case CTDB_CONTROL_DB_DETACH:
638 ctdb_uint32_push(&cd->data.db_id, buf, &np);
641 case CTDB_CONTROL_DB_FREEZE:
642 ctdb_uint32_push(&cd->data.db_id, buf, &np);
645 case CTDB_CONTROL_DB_THAW:
646 ctdb_uint32_push(&cd->data.db_id, buf, &np);
649 case CTDB_CONTROL_DB_TRANSACTION_START:
650 ctdb_transdb_push(cd->data.transdb, buf, &np);
653 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
654 ctdb_transdb_push(cd->data.transdb, buf, &np);
657 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
658 ctdb_uint32_push(&cd->data.db_id, buf, &np);
661 case CTDB_CONTROL_DB_PULL:
662 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
665 case CTDB_CONTROL_DB_PUSH_START:
666 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
669 case CTDB_CONTROL_DB_PUSH_CONFIRM:
670 ctdb_uint32_push(&cd->data.db_id, buf, &np);
673 case CTDB_CONTROL_DB_OPEN_FLAGS:
674 ctdb_uint32_push(&cd->data.db_id, buf, &np);
677 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
678 ctdb_string_push(&cd->data.db_name, buf, &np);
681 case CTDB_CONTROL_CHECK_PID_SRVID:
682 ctdb_pid_srvid_push(cd->data.pid_srvid, buf, &np);
685 case CTDB_CONTROL_VACUUM_FETCH:
686 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
689 case CTDB_CONTROL_DB_VACUUM:
690 ctdb_db_vacuum_push(cd->data.db_vacuum, buf, &np);
693 case CTDB_CONTROL_ECHO_DATA:
694 ctdb_echo_data_push(cd->data.echo_data, buf, &np);
701 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
704 struct ctdb_req_control_data *cd,
707 size_t np = 0, offset;
714 case CTDB_CONTROL_PROCESS_EXISTS:
715 ret = ctdb_pid_pull(buf, buflen, &cd->data.pid, &np);
718 case CTDB_CONTROL_GETDBPATH:
719 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
722 case CTDB_CONTROL_SETVNNMAP:
723 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
724 &cd->data.vnnmap, &np);
727 case CTDB_CONTROL_SET_DEBUG:
728 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
731 case CTDB_CONTROL_SET_RECMODE:
732 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
735 case CTDB_CONTROL_DB_ATTACH:
736 ret = ctdb_string_pull(buf, buflen, mem_ctx,
737 &cd->data.db_name, &np);
740 case CTDB_CONTROL_TRAVERSE_START:
741 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
742 &cd->data.traverse_start, &np);
745 case CTDB_CONTROL_TRAVERSE_ALL:
746 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
747 &cd->data.traverse_all, &np);
750 case CTDB_CONTROL_TRAVERSE_DATA:
751 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
752 &cd->data.rec_data, &np);
755 case CTDB_CONTROL_GET_DBNAME:
756 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
759 case CTDB_CONTROL_ENABLE_SEQNUM:
760 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
763 case CTDB_CONTROL_UPDATE_SEQNUM:
764 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
767 case CTDB_CONTROL_TCP_CLIENT:
768 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
769 &cd->data.conn, &np);
772 case CTDB_CONTROL_TCP_ADD:
773 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
774 &cd->data.conn, &np);
777 case CTDB_CONTROL_TCP_REMOVE:
778 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
779 &cd->data.conn, &np);
782 case CTDB_CONTROL_SET_TUNABLE:
783 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
784 &cd->data.tunable, &np);
787 case CTDB_CONTROL_GET_TUNABLE:
788 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
789 &cd->data.tun_var, &np);
792 case CTDB_CONTROL_MODIFY_FLAGS:
793 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
794 &cd->data.flag_change, &np);
797 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
798 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
799 &cd->data.addr, &np);
802 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
803 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
804 &cd->data.tickles, &np);
807 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
808 ret = ctdb_string_pull(buf, buflen, mem_ctx,
809 &cd->data.db_name, &np);
812 case CTDB_CONTROL_UPDATE_RECORD:
813 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
814 &cd->data.recbuf, &np);
817 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
818 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
819 &cd->data.addr_info, &np);
822 case CTDB_CONTROL_WIPE_DATABASE:
823 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
824 &cd->data.transdb, &np);
827 case CTDB_CONTROL_TRY_DELETE_RECORDS:
828 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
829 &cd->data.recbuf, &np);
832 case CTDB_CONTROL_ADD_PUBLIC_IP:
833 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
834 &cd->data.addr_info, &np);
837 case CTDB_CONTROL_DEL_PUBLIC_IP:
838 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
839 &cd->data.addr_info, &np);
842 case CTDB_CONTROL_RELEASE_IP:
843 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
844 &cd->data.pubip, &np);
847 case CTDB_CONTROL_TAKEOVER_IP:
848 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
849 &cd->data.pubip, &np);
852 case CTDB_CONTROL_TRAVERSE_KILL:
853 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
854 &cd->data.traverse_start, &np);
857 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
858 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
862 case CTDB_CONTROL_SET_LMASTERROLE:
863 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
866 case CTDB_CONTROL_SET_RECMASTERROLE:
867 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
870 case CTDB_CONTROL_SET_BAN_STATE:
871 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
872 &cd->data.ban_state, &np);
875 case CTDB_CONTROL_REGISTER_NOTIFY:
876 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
877 &cd->data.notify, &np);
880 case CTDB_CONTROL_DEREGISTER_NOTIFY:
881 ret = ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
884 case CTDB_CONTROL_TRANS3_COMMIT:
885 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
886 &cd->data.recbuf, &np);
889 case CTDB_CONTROL_GET_DB_SEQNUM:
891 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
896 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
901 case CTDB_CONTROL_DB_SET_HEALTHY:
902 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
905 case CTDB_CONTROL_DB_GET_HEALTH:
906 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
909 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
910 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
911 &cd->data.addr, &np);
914 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
915 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
916 &cd->data.iface, &np);
919 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
920 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
921 &cd->data.conn, &np);
924 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
925 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
929 case CTDB_CONTROL_SET_DB_READONLY:
930 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
933 case CTDB_CONTROL_TRAVERSE_START_EXT:
934 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
935 &cd->data.traverse_start_ext,
939 case CTDB_CONTROL_GET_DB_STATISTICS:
940 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
943 case CTDB_CONTROL_SET_DB_STICKY:
944 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
947 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
948 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
949 &cd->data.traverse_all_ext,
953 case CTDB_CONTROL_DB_DETACH:
954 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
957 case CTDB_CONTROL_DB_FREEZE:
958 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
961 case CTDB_CONTROL_DB_THAW:
962 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
965 case CTDB_CONTROL_DB_TRANSACTION_START:
966 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
967 &cd->data.transdb, &np);
970 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
971 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
972 &cd->data.transdb, &np);
975 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
976 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
979 case CTDB_CONTROL_DB_PULL:
980 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
981 &cd->data.pulldb_ext, &np);
984 case CTDB_CONTROL_DB_PUSH_START:
985 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
986 &cd->data.pulldb_ext, &np);
989 case CTDB_CONTROL_DB_PUSH_CONFIRM:
990 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
993 case CTDB_CONTROL_DB_OPEN_FLAGS:
994 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
997 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
998 ret = ctdb_string_pull(buf, buflen, mem_ctx,
999 &cd->data.db_name, &np);
1002 case CTDB_CONTROL_CHECK_PID_SRVID:
1003 ret = ctdb_pid_srvid_pull(buf, buflen, mem_ctx,
1004 &cd->data.pid_srvid, &np);
1007 case CTDB_CONTROL_VACUUM_FETCH:
1008 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1009 &cd->data.recbuf, &np);
1012 case CTDB_CONTROL_DB_VACUUM:
1013 ret = ctdb_db_vacuum_pull(buf,
1016 &cd->data.db_vacuum,
1020 case CTDB_CONTROL_ECHO_DATA:
1021 ret = ctdb_echo_data_pull(buf,
1024 &cd->data.echo_data,
1028 case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
1029 ret = ctdb_connection_pull(buf,
1036 case CTDB_CONTROL_TCP_CLIENT_PASSED:
1037 ret = ctdb_connection_pull(buf,
1053 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1061 switch (cd->opcode) {
1062 case CTDB_CONTROL_PROCESS_EXISTS:
1065 case CTDB_CONTROL_STATISTICS:
1066 len = ctdb_statistics_len(cd->data.stats);
1069 case CTDB_CONTROL_PING:
1072 case CTDB_CONTROL_GETDBPATH:
1073 len = ctdb_string_len(&cd->data.db_path);
1076 case CTDB_CONTROL_GETVNNMAP:
1077 len = ctdb_vnn_map_len(cd->data.vnnmap);
1080 case CTDB_CONTROL_SETVNNMAP:
1083 case CTDB_CONTROL_GET_DEBUG:
1084 len = ctdb_uint32_len(&cd->data.loglevel);
1087 case CTDB_CONTROL_SET_DEBUG:
1090 case CTDB_CONTROL_GET_DBMAP:
1091 len = ctdb_dbid_map_len(cd->data.dbmap);
1094 case CTDB_CONTROL_GET_RECMODE:
1097 case CTDB_CONTROL_SET_RECMODE:
1100 case CTDB_CONTROL_STATISTICS_RESET:
1103 case CTDB_CONTROL_DB_ATTACH:
1104 len = ctdb_uint32_len(&cd->data.db_id);
1107 case CTDB_CONTROL_TRAVERSE_START:
1110 case CTDB_CONTROL_TRAVERSE_ALL:
1113 case CTDB_CONTROL_TRAVERSE_DATA:
1116 case CTDB_CONTROL_REGISTER_SRVID:
1119 case CTDB_CONTROL_DEREGISTER_SRVID:
1122 case CTDB_CONTROL_GET_DBNAME:
1123 len = ctdb_string_len(&cd->data.db_name);
1126 case CTDB_CONTROL_ENABLE_SEQNUM:
1129 case CTDB_CONTROL_UPDATE_SEQNUM:
1132 case CTDB_CONTROL_DUMP_MEMORY:
1133 len = ctdb_string_len(&cd->data.mem_str);
1136 case CTDB_CONTROL_GET_PID:
1139 case CTDB_CONTROL_FREEZE:
1142 case CTDB_CONTROL_GET_PNN:
1145 case CTDB_CONTROL_SHUTDOWN:
1148 case CTDB_CONTROL_TCP_CLIENT:
1151 case CTDB_CONTROL_TCP_ADD:
1154 case CTDB_CONTROL_TCP_REMOVE:
1157 case CTDB_CONTROL_STARTUP:
1160 case CTDB_CONTROL_SET_TUNABLE:
1163 case CTDB_CONTROL_GET_TUNABLE:
1164 len = ctdb_uint32_len(&cd->data.tun_value);
1167 case CTDB_CONTROL_LIST_TUNABLES:
1168 len = ctdb_var_list_len(cd->data.tun_var_list);
1171 case CTDB_CONTROL_MODIFY_FLAGS:
1174 case CTDB_CONTROL_GET_ALL_TUNABLES:
1175 len = ctdb_tunable_list_len(cd->data.tun_list);
1178 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1179 len = ctdb_tickle_list_len(cd->data.tickles);
1182 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1185 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1186 len = ctdb_uint32_len(&cd->data.db_id);
1189 case CTDB_CONTROL_UPDATE_RECORD:
1192 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1195 case CTDB_CONTROL_WIPE_DATABASE:
1198 case CTDB_CONTROL_UPTIME:
1199 len = ctdb_uptime_len(cd->data.uptime);
1202 case CTDB_CONTROL_START_RECOVERY:
1205 case CTDB_CONTROL_END_RECOVERY:
1208 case CTDB_CONTROL_RELOAD_NODES_FILE:
1211 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1212 len = ctdb_rec_buffer_len(cd->data.recbuf);
1215 case CTDB_CONTROL_ADD_PUBLIC_IP:
1218 case CTDB_CONTROL_DEL_PUBLIC_IP:
1221 case CTDB_CONTROL_GET_CAPABILITIES:
1222 len = ctdb_uint32_len(&cd->data.caps);
1225 case CTDB_CONTROL_RECD_PING:
1228 case CTDB_CONTROL_RELEASE_IP:
1231 case CTDB_CONTROL_TAKEOVER_IP:
1234 case CTDB_CONTROL_GET_PUBLIC_IPS:
1235 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1238 case CTDB_CONTROL_GET_NODEMAP:
1239 len = ctdb_node_map_len(cd->data.nodemap);
1242 case CTDB_CONTROL_TRAVERSE_KILL:
1245 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1248 case CTDB_CONTROL_GET_RECLOCK_FILE:
1249 len = ctdb_string_len(&cd->data.reclock_file);
1252 case CTDB_CONTROL_STOP_NODE:
1255 case CTDB_CONTROL_CONTINUE_NODE:
1258 case CTDB_CONTROL_SET_LMASTERROLE:
1261 case CTDB_CONTROL_SET_RECMASTERROLE:
1264 case CTDB_CONTROL_SET_BAN_STATE:
1267 case CTDB_CONTROL_GET_BAN_STATE:
1268 len = ctdb_ban_state_len(cd->data.ban_state);
1271 case CTDB_CONTROL_REGISTER_NOTIFY:
1274 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1277 case CTDB_CONTROL_TRANS3_COMMIT:
1280 case CTDB_CONTROL_GET_DB_SEQNUM:
1281 len = ctdb_uint64_len(&cd->data.seqnum);
1284 case CTDB_CONTROL_DB_SET_HEALTHY:
1287 case CTDB_CONTROL_DB_GET_HEALTH:
1288 len = ctdb_string_len(&cd->data.reason);
1291 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1292 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1295 case CTDB_CONTROL_GET_IFACES:
1296 len = ctdb_iface_list_len(cd->data.iface_list);
1299 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1302 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1305 case CTDB_CONTROL_GET_STAT_HISTORY:
1306 len = ctdb_statistics_list_len(cd->data.stats_list);
1309 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1312 case CTDB_CONTROL_SET_DB_READONLY:
1315 case CTDB_CONTROL_TRAVERSE_START_EXT:
1318 case CTDB_CONTROL_GET_DB_STATISTICS:
1319 len = ctdb_db_statistics_len(cd->data.dbstats);
1322 case CTDB_CONTROL_SET_DB_STICKY:
1325 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1328 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1331 case CTDB_CONTROL_IPREALLOCATED:
1334 case CTDB_CONTROL_GET_RUNSTATE:
1335 len = ctdb_uint32_len(&cd->data.runstate);
1338 case CTDB_CONTROL_DB_DETACH:
1341 case CTDB_CONTROL_GET_NODES_FILE:
1342 len = ctdb_node_map_len(cd->data.nodemap);
1345 case CTDB_CONTROL_DB_FREEZE:
1348 case CTDB_CONTROL_DB_THAW:
1351 case CTDB_CONTROL_DB_TRANSACTION_START:
1354 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1357 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1360 case CTDB_CONTROL_DB_PULL:
1361 len = ctdb_uint32_len(&cd->data.num_records);
1364 case CTDB_CONTROL_DB_PUSH_START:
1367 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1368 len = ctdb_uint32_len(&cd->data.num_records);
1371 case CTDB_CONTROL_DB_OPEN_FLAGS:
1372 len = ctdb_int32_len(&cd->data.tdb_flags);
1375 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1376 len = ctdb_uint32_len(&cd->data.db_id);
1379 case CTDB_CONTROL_CHECK_PID_SRVID:
1382 case CTDB_CONTROL_TUNNEL_REGISTER:
1385 case CTDB_CONTROL_TUNNEL_DEREGISTER:
1388 case CTDB_CONTROL_VACUUM_FETCH:
1391 case CTDB_CONTROL_DB_VACUUM:
1394 case CTDB_CONTROL_ECHO_DATA:
1395 len = ctdb_echo_data_len(cd->data.echo_data);
1398 case CTDB_CONTROL_DISABLE_NODE:
1401 case CTDB_CONTROL_ENABLE_NODE:
1404 case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
1407 case CTDB_CONTROL_TCP_CLIENT_PASSED:
1414 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1415 uint8_t *buf, size_t *npush)
1419 switch (cd->opcode) {
1420 case CTDB_CONTROL_STATISTICS:
1421 ctdb_statistics_push(cd->data.stats, buf, &np);
1424 case CTDB_CONTROL_GETDBPATH:
1425 ctdb_string_push(&cd->data.db_path, buf, &np);
1428 case CTDB_CONTROL_GETVNNMAP:
1429 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
1432 case CTDB_CONTROL_GET_DEBUG:
1433 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1436 case CTDB_CONTROL_GET_DBMAP:
1437 ctdb_dbid_map_push(cd->data.dbmap, buf, &np);
1440 case CTDB_CONTROL_DB_ATTACH:
1441 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1444 case CTDB_CONTROL_GET_DBNAME:
1445 ctdb_string_push(&cd->data.db_name, buf, &np);
1448 case CTDB_CONTROL_DUMP_MEMORY:
1449 ctdb_string_push(&cd->data.mem_str, buf, &np);
1452 case CTDB_CONTROL_GET_PID:
1455 case CTDB_CONTROL_GET_TUNABLE:
1456 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1459 case CTDB_CONTROL_LIST_TUNABLES:
1460 ctdb_var_list_push(cd->data.tun_var_list, buf, &np);
1463 case CTDB_CONTROL_GET_ALL_TUNABLES:
1464 ctdb_tunable_list_push(cd->data.tun_list, buf, &np);
1467 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1468 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
1471 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1472 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1475 case CTDB_CONTROL_UPTIME:
1476 ctdb_uptime_push(cd->data.uptime, buf, &np);
1479 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1480 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1483 case CTDB_CONTROL_GET_CAPABILITIES:
1484 ctdb_uint32_push(&cd->data.caps, buf, &np);
1487 case CTDB_CONTROL_GET_PUBLIC_IPS:
1488 ctdb_public_ip_list_push(cd->data.pubip_list, buf, &np);
1491 case CTDB_CONTROL_GET_NODEMAP:
1492 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1495 case CTDB_CONTROL_GET_RECLOCK_FILE:
1496 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1499 case CTDB_CONTROL_GET_BAN_STATE:
1500 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
1503 case CTDB_CONTROL_GET_DB_SEQNUM:
1504 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1507 case CTDB_CONTROL_DB_GET_HEALTH:
1508 ctdb_string_push(&cd->data.reason, buf, &np);
1511 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1512 ctdb_public_ip_info_push(cd->data.ipinfo, buf, &np);
1515 case CTDB_CONTROL_GET_IFACES:
1516 ctdb_iface_list_push(cd->data.iface_list, buf, &np);
1519 case CTDB_CONTROL_GET_STAT_HISTORY:
1520 ctdb_statistics_list_push(cd->data.stats_list, buf, &np);
1523 case CTDB_CONTROL_GET_DB_STATISTICS:
1524 ctdb_db_statistics_push(cd->data.dbstats, buf, &np);
1527 case CTDB_CONTROL_GET_RUNSTATE:
1528 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1531 case CTDB_CONTROL_GET_NODES_FILE:
1532 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1535 case CTDB_CONTROL_DB_PULL:
1536 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1539 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1540 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1543 case CTDB_CONTROL_DB_OPEN_FLAGS:
1544 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1547 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1548 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1551 case CTDB_CONTROL_CHECK_PID_SRVID:
1554 case CTDB_CONTROL_VACUUM_FETCH:
1557 case CTDB_CONTROL_DB_VACUUM:
1560 case CTDB_CONTROL_ECHO_DATA:
1561 ctdb_echo_data_push(cd->data.echo_data, buf, &np);
1568 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1569 uint32_t opcode, TALLOC_CTX *mem_ctx,
1570 struct ctdb_reply_control_data *cd,
1576 cd->opcode = opcode;
1579 case CTDB_CONTROL_STATISTICS:
1580 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1581 &cd->data.stats, &np);
1584 case CTDB_CONTROL_GETDBPATH:
1585 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1586 &cd->data.db_path, &np);
1589 case CTDB_CONTROL_GETVNNMAP:
1590 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1591 &cd->data.vnnmap, &np);
1594 case CTDB_CONTROL_GET_DEBUG:
1595 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1598 case CTDB_CONTROL_GET_DBMAP:
1599 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1600 &cd->data.dbmap, &np);
1603 case CTDB_CONTROL_DB_ATTACH:
1604 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1607 case CTDB_CONTROL_GET_DBNAME:
1608 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1609 &cd->data.db_name, &np);
1612 case CTDB_CONTROL_DUMP_MEMORY:
1613 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1614 &cd->data.mem_str, &np);
1617 case CTDB_CONTROL_GET_PID:
1620 case CTDB_CONTROL_GET_TUNABLE:
1621 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1625 case CTDB_CONTROL_LIST_TUNABLES:
1626 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1627 &cd->data.tun_var_list, &np);
1630 case CTDB_CONTROL_GET_ALL_TUNABLES:
1631 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1632 &cd->data.tun_list, &np);
1635 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1636 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1637 &cd->data.tickles, &np);
1640 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1641 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1644 case CTDB_CONTROL_UPTIME:
1645 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1646 &cd->data.uptime, &np);
1649 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1650 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1651 &cd->data.recbuf, &np);
1654 case CTDB_CONTROL_GET_CAPABILITIES:
1655 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1658 case CTDB_CONTROL_GET_PUBLIC_IPS:
1659 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1660 &cd->data.pubip_list, &np);
1663 case CTDB_CONTROL_GET_NODEMAP:
1664 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1665 &cd->data.nodemap, &np);
1668 case CTDB_CONTROL_GET_RECLOCK_FILE:
1669 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1670 &cd->data.reclock_file, &np);
1673 case CTDB_CONTROL_GET_BAN_STATE:
1674 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1675 &cd->data.ban_state, &np);
1678 case CTDB_CONTROL_GET_DB_SEQNUM:
1679 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1682 case CTDB_CONTROL_DB_GET_HEALTH:
1683 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1684 &cd->data.reason, &np);
1687 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1688 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1689 &cd->data.ipinfo, &np);
1692 case CTDB_CONTROL_GET_IFACES:
1693 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1694 &cd->data.iface_list, &np);
1697 case CTDB_CONTROL_GET_STAT_HISTORY:
1698 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1699 &cd->data.stats_list, &np);
1702 case CTDB_CONTROL_GET_DB_STATISTICS:
1703 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1704 &cd->data.dbstats, &np);
1707 case CTDB_CONTROL_GET_RUNSTATE:
1708 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1711 case CTDB_CONTROL_GET_NODES_FILE:
1712 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1713 &cd->data.nodemap, &np);
1716 case CTDB_CONTROL_DB_PULL:
1717 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1721 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1722 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1726 case CTDB_CONTROL_DB_OPEN_FLAGS:
1727 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1730 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1731 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1734 case CTDB_CONTROL_CHECK_PID_SRVID:
1737 case CTDB_CONTROL_VACUUM_FETCH:
1740 case CTDB_CONTROL_DB_VACUUM:
1743 case CTDB_CONTROL_ECHO_DATA:
1744 ret = ctdb_echo_data_pull(buf,
1747 &cd->data.echo_data,
1760 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1761 struct ctdb_req_control *c)
1765 return ctdb_req_header_len(h) +
1766 ctdb_uint32_len(&c->opcode) +
1767 ctdb_uint32_len(&c->pad) +
1768 ctdb_uint64_len(&c->srvid) +
1769 ctdb_uint32_len(&c->client_id) +
1770 ctdb_uint32_len(&c->flags) +
1771 ctdb_uint32_len(&u32) +
1772 ctdb_req_control_data_len(&c->rdata);
1775 int ctdb_req_control_push(struct ctdb_req_header *h,
1776 struct ctdb_req_control *c,
1777 uint8_t *buf, size_t *buflen)
1779 size_t offset = 0, np;
1783 length = ctdb_req_control_len(h, c);
1784 if (*buflen < length) {
1789 h->length = *buflen;
1790 ctdb_req_header_push(h, buf+offset, &np);
1793 ctdb_uint32_push(&c->opcode, buf+offset, &np);
1796 ctdb_uint32_push(&c->pad, buf+offset, &np);
1799 ctdb_uint64_push(&c->srvid, buf+offset, &np);
1802 ctdb_uint32_push(&c->client_id, buf+offset, &np);
1805 ctdb_uint32_push(&c->flags, buf+offset, &np);
1808 u32 = ctdb_req_control_data_len(&c->rdata);
1809 ctdb_uint32_push(&u32, buf+offset, &np);
1812 ctdb_req_control_data_push(&c->rdata, buf+offset, &np);
1815 if (offset > *buflen) {
1822 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1823 struct ctdb_req_header *h,
1824 TALLOC_CTX *mem_ctx,
1825 struct ctdb_req_control *c)
1827 struct ctdb_req_header header;
1828 size_t offset = 0, np;
1832 ret = ctdb_req_header_pull(buf+offset, buflen-offset, &header, &np);
1842 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->opcode, &np);
1848 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->pad, &np);
1854 ret = ctdb_uint64_pull(buf+offset, buflen-offset, &c->srvid, &np);
1860 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->client_id, &np);
1866 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->flags, &np);
1872 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
1878 if (u32 > buflen-offset) {
1882 ret = ctdb_req_control_data_pull(buf+offset, u32, c->opcode, mem_ctx,
1889 if (offset > buflen) {
1896 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1897 struct ctdb_reply_control *c)
1899 uint32_t dsize, esize;
1901 if (c->status == 0) {
1902 dsize = ctdb_reply_control_data_len(&c->rdata);
1906 esize = ctdb_string_len(&c->errmsg);
1909 return ctdb_req_header_len(h) +
1910 ctdb_int32_len(&c->status) +
1911 ctdb_uint32_len(&dsize) +
1912 ctdb_uint32_len(&esize) +
1916 int ctdb_reply_control_push(struct ctdb_req_header *h,
1917 struct ctdb_reply_control *c,
1918 uint8_t *buf, size_t *buflen)
1920 size_t offset = 0, np;
1922 uint32_t dsize, esize;
1924 length = ctdb_reply_control_len(h, c);
1925 if (*buflen < length) {
1930 h->length = *buflen;
1931 ctdb_req_header_push(h, buf+offset, &np);
1934 ctdb_int32_push(&c->status, buf+offset, &np);
1937 if (c->status == 0) {
1938 dsize = ctdb_reply_control_data_len(&c->rdata);
1942 esize = ctdb_string_len(&c->errmsg);
1945 ctdb_uint32_push(&dsize, buf+offset, &np);
1948 ctdb_uint32_push(&esize, buf+offset, &np);
1951 if (c->status == 0) {
1952 ctdb_reply_control_data_push(&c->rdata, buf+offset, &np);
1954 ctdb_string_push(&c->errmsg, buf+offset, &np);
1961 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1962 struct ctdb_req_header *h,
1963 TALLOC_CTX *mem_ctx,
1964 struct ctdb_reply_control *c)
1966 struct ctdb_req_header header;
1967 size_t offset = 0, np;
1968 uint32_t dsize, esize;
1971 ret = ctdb_req_header_pull(buf+offset, buflen-offset, &header, &np);
1981 ret = ctdb_int32_pull(buf+offset, buflen-offset, &c->status, &np);
1987 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &dsize, &np);
1993 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &esize, &np);
2001 if (c->status == 0) {
2002 if (buflen-offset < dsize) {
2006 ret = ctdb_reply_control_data_pull(buf+offset, dsize,
2007 opcode, mem_ctx, &c->rdata,
2015 if (buflen-offset < esize) {
2019 ret = ctdb_string_pull(buf+offset, esize, mem_ctx, &c->errmsg,