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_THAW
:
164 case CTDB_CONTROL_GET_PNN
:
167 case CTDB_CONTROL_SHUTDOWN
:
170 case CTDB_CONTROL_GET_MONMODE
:
173 case CTDB_CONTROL_TCP_CLIENT
:
174 len
= ctdb_connection_len(cd
->data
.conn
);
177 case CTDB_CONTROL_TCP_ADD
:
178 len
= ctdb_connection_len(cd
->data
.conn
);
181 case CTDB_CONTROL_TCP_REMOVE
:
182 len
= ctdb_connection_len(cd
->data
.conn
);
185 case CTDB_CONTROL_STARTUP
:
188 case CTDB_CONTROL_SET_TUNABLE
:
189 len
= ctdb_tunable_len(cd
->data
.tunable
);
192 case CTDB_CONTROL_GET_TUNABLE
:
193 len
= ctdb_stringn_len(cd
->data
.tun_var
);
196 case CTDB_CONTROL_LIST_TUNABLES
:
199 case CTDB_CONTROL_MODIFY_FLAGS
:
200 len
= ctdb_node_flag_change_len(cd
->data
.flag_change
);
203 case CTDB_CONTROL_GET_ALL_TUNABLES
:
206 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
207 len
= ctdb_sock_addr_len(cd
->data
.addr
);
210 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
211 len
= ctdb_tickle_list_len(cd
->data
.tickles
);
214 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
215 len
= ctdb_string_len(cd
->data
.db_name
);
218 case CTDB_CONTROL_UPDATE_RECORD
:
219 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
222 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
223 len
= ctdb_addr_info_len(cd
->data
.addr_info
);
226 case CTDB_CONTROL_TRANSACTION_START
:
227 len
= ctdb_uint32_len(cd
->data
.tid
);
230 case CTDB_CONTROL_TRANSACTION_COMMIT
:
231 len
= ctdb_uint32_len(cd
->data
.tid
);
234 case CTDB_CONTROL_WIPE_DATABASE
:
235 len
= ctdb_transdb_len(cd
->data
.transdb
);
238 case CTDB_CONTROL_UPTIME
:
241 case CTDB_CONTROL_START_RECOVERY
:
244 case CTDB_CONTROL_END_RECOVERY
:
247 case CTDB_CONTROL_RELOAD_NODES_FILE
:
250 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
251 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
254 case CTDB_CONTROL_ENABLE_MONITOR
:
257 case CTDB_CONTROL_DISABLE_MONITOR
:
260 case CTDB_CONTROL_ADD_PUBLIC_IP
:
261 len
= ctdb_addr_info_len(cd
->data
.addr_info
);
264 case CTDB_CONTROL_DEL_PUBLIC_IP
:
265 len
= ctdb_addr_info_len(cd
->data
.addr_info
);
268 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
269 len
= ctdb_string_len(cd
->data
.event_str
);
272 case CTDB_CONTROL_GET_CAPABILITIES
:
275 case CTDB_CONTROL_RECD_PING
:
278 case CTDB_CONTROL_RELEASE_IP
:
279 len
= ctdb_public_ip_len(cd
->data
.pubip
);
282 case CTDB_CONTROL_TAKEOVER_IP
:
283 len
= ctdb_public_ip_len(cd
->data
.pubip
);
286 case CTDB_CONTROL_GET_PUBLIC_IPS
:
289 case CTDB_CONTROL_GET_NODEMAP
:
292 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
293 len
= ctdb_uint32_len(cd
->data
.event
);
296 case CTDB_CONTROL_TRAVERSE_KILL
:
297 len
= ctdb_traverse_start_len(cd
->data
.traverse_start
);
300 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
301 len
= ctdb_double_len(cd
->data
.reclock_latency
);
304 case CTDB_CONTROL_GET_RECLOCK_FILE
:
307 case CTDB_CONTROL_SET_RECLOCK_FILE
:
308 len
= ctdb_string_len(cd
->data
.reclock_file
);
311 case CTDB_CONTROL_STOP_NODE
:
314 case CTDB_CONTROL_CONTINUE_NODE
:
317 case CTDB_CONTROL_SET_LMASTERROLE
:
318 len
= ctdb_uint32_len(cd
->data
.role
);
321 case CTDB_CONTROL_SET_RECMASTERROLE
:
322 len
= ctdb_uint32_len(cd
->data
.role
);
325 case CTDB_CONTROL_ENABLE_SCRIPT
:
326 len
= ctdb_string_len(cd
->data
.script
);
329 case CTDB_CONTROL_DISABLE_SCRIPT
:
330 len
= ctdb_string_len(cd
->data
.script
);
333 case CTDB_CONTROL_SET_BAN_STATE
:
334 len
= ctdb_ban_state_len(cd
->data
.ban_state
);
337 case CTDB_CONTROL_GET_BAN_STATE
:
340 case CTDB_CONTROL_SET_DB_PRIORITY
:
341 len
= ctdb_db_priority_len(cd
->data
.db_prio
);
344 case CTDB_CONTROL_GET_DB_PRIORITY
:
345 len
= ctdb_uint32_len(cd
->data
.db_id
);
348 case CTDB_CONTROL_TRANSACTION_CANCEL
:
351 case CTDB_CONTROL_REGISTER_NOTIFY
:
352 len
= ctdb_notify_data_len(cd
->data
.notify
);
355 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
356 len
= ctdb_uint64_len(cd
->data
.srvid
);
359 case CTDB_CONTROL_TRANS3_COMMIT
:
360 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
363 case CTDB_CONTROL_GET_DB_SEQNUM
:
364 u64
= cd
->data
.db_id
;
365 len
= ctdb_uint64_len(u64
);
368 case CTDB_CONTROL_DB_SET_HEALTHY
:
369 len
= ctdb_uint32_len(cd
->data
.db_id
);
372 case CTDB_CONTROL_DB_GET_HEALTH
:
373 len
= ctdb_uint32_len(cd
->data
.db_id
);
376 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
377 len
= ctdb_sock_addr_len(cd
->data
.addr
);
380 case CTDB_CONTROL_GET_IFACES
:
383 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
384 len
= ctdb_iface_len(cd
->data
.iface
);
387 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
388 len
= ctdb_connection_len(cd
->data
.conn
);
391 case CTDB_CONTROL_GET_STAT_HISTORY
:
394 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
395 len
= ctdb_key_data_len(cd
->data
.key
);
398 case CTDB_CONTROL_SET_DB_READONLY
:
399 len
= ctdb_uint32_len(cd
->data
.db_id
);
402 case CTDB_CONTROL_CHECK_SRVIDS
:
403 len
= ctdb_uint64_array_len(cd
->data
.u64_array
);
406 case CTDB_CONTROL_TRAVERSE_START_EXT
:
407 len
= ctdb_traverse_start_ext_len(cd
->data
.traverse_start_ext
);
410 case CTDB_CONTROL_GET_DB_STATISTICS
:
411 len
= ctdb_uint32_len(cd
->data
.db_id
);
414 case CTDB_CONTROL_SET_DB_STICKY
:
415 len
= ctdb_uint32_len(cd
->data
.db_id
);
418 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
421 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
422 len
= ctdb_traverse_all_ext_len(cd
->data
.traverse_all_ext
);
425 case CTDB_CONTROL_RECEIVE_RECORDS
:
426 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
429 case CTDB_CONTROL_IPREALLOCATED
:
432 case CTDB_CONTROL_GET_RUNSTATE
:
435 case CTDB_CONTROL_DB_DETACH
:
436 len
= ctdb_uint32_len(cd
->data
.db_id
);
439 case CTDB_CONTROL_GET_NODES_FILE
:
442 case CTDB_CONTROL_DB_FREEZE
:
443 len
= ctdb_uint32_len(cd
->data
.db_id
);
446 case CTDB_CONTROL_DB_THAW
:
447 len
= ctdb_uint32_len(cd
->data
.db_id
);
450 case CTDB_CONTROL_DB_TRANSACTION_START
:
451 len
= ctdb_transdb_len(cd
->data
.transdb
);
454 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
455 len
= ctdb_transdb_len(cd
->data
.transdb
);
458 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
459 len
= ctdb_uint32_len(cd
->data
.db_id
);
462 case CTDB_CONTROL_DB_PULL
:
463 len
= ctdb_pulldb_ext_len(cd
->data
.pulldb_ext
);
466 case CTDB_CONTROL_DB_PUSH_START
:
467 len
= ctdb_pulldb_ext_len(cd
->data
.pulldb_ext
);
470 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
471 len
= ctdb_uint32_len(cd
->data
.db_id
);
478 static void ctdb_req_control_data_push(struct ctdb_req_control_data
*cd
,
483 switch (cd
->opcode
) {
484 case CTDB_CONTROL_PROCESS_EXISTS
:
485 ctdb_pid_push(cd
->data
.pid
, buf
);
488 case CTDB_CONTROL_GETDBPATH
:
489 ctdb_uint32_push(cd
->data
.db_id
, buf
);
492 case CTDB_CONTROL_SETVNNMAP
:
493 ctdb_vnn_map_push(cd
->data
.vnnmap
, buf
);
496 case CTDB_CONTROL_SET_DEBUG
:
497 ctdb_uint32_push(cd
->data
.loglevel
, buf
);
500 case CTDB_CONTROL_PULL_DB
:
501 ctdb_pulldb_push(cd
->data
.pulldb
, buf
);
504 case CTDB_CONTROL_PUSH_DB
:
505 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
508 case CTDB_CONTROL_SET_RECMODE
:
509 ctdb_uint32_push(cd
->data
.recmode
, buf
);
512 case CTDB_CONTROL_DB_ATTACH
:
513 ctdb_string_push(cd
->data
.db_name
, buf
);
516 case CTDB_CONTROL_SET_CALL
:
519 case CTDB_CONTROL_TRAVERSE_START
:
520 ctdb_traverse_start_push(cd
->data
.traverse_start
, buf
);
523 case CTDB_CONTROL_TRAVERSE_ALL
:
524 ctdb_traverse_all_push(cd
->data
.traverse_all
, buf
);
527 case CTDB_CONTROL_TRAVERSE_DATA
:
528 ctdb_rec_data_push(cd
->data
.rec_data
, buf
);
531 case CTDB_CONTROL_GET_DBNAME
:
532 ctdb_uint32_push(cd
->data
.db_id
, buf
);
535 case CTDB_CONTROL_ENABLE_SEQNUM
:
536 ctdb_uint32_push(cd
->data
.db_id
, buf
);
539 case CTDB_CONTROL_UPDATE_SEQNUM
:
540 ctdb_uint32_push(cd
->data
.db_id
, buf
);
543 case CTDB_CONTROL_SET_RECMASTER
:
544 ctdb_uint32_push(cd
->data
.recmaster
, buf
);
547 case CTDB_CONTROL_TCP_CLIENT
:
548 ctdb_connection_push(cd
->data
.conn
, buf
);
551 case CTDB_CONTROL_TCP_ADD
:
552 ctdb_connection_push(cd
->data
.conn
, buf
);
555 case CTDB_CONTROL_TCP_REMOVE
:
556 ctdb_connection_push(cd
->data
.conn
, buf
);
559 case CTDB_CONTROL_SET_TUNABLE
:
560 ctdb_tunable_push(cd
->data
.tunable
, buf
);
563 case CTDB_CONTROL_GET_TUNABLE
:
564 ctdb_stringn_push(cd
->data
.tun_var
, buf
);
567 case CTDB_CONTROL_MODIFY_FLAGS
:
568 ctdb_node_flag_change_push(cd
->data
.flag_change
, buf
);
571 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
572 ctdb_sock_addr_push(cd
->data
.addr
, buf
);
575 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
576 ctdb_tickle_list_push(cd
->data
.tickles
, buf
);
579 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
580 ctdb_string_push(cd
->data
.db_name
, buf
);
583 case CTDB_CONTROL_UPDATE_RECORD
:
584 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
587 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
588 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
591 case CTDB_CONTROL_TRANSACTION_START
:
592 ctdb_uint32_push(cd
->data
.tid
, buf
);
595 case CTDB_CONTROL_TRANSACTION_COMMIT
:
596 ctdb_uint32_push(cd
->data
.tid
, buf
);
599 case CTDB_CONTROL_WIPE_DATABASE
:
600 ctdb_transdb_push(cd
->data
.transdb
, buf
);
603 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
604 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
607 case CTDB_CONTROL_ADD_PUBLIC_IP
:
608 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
611 case CTDB_CONTROL_DEL_PUBLIC_IP
:
612 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
615 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
616 ctdb_string_push(cd
->data
.event_str
, buf
);
619 case CTDB_CONTROL_RELEASE_IP
:
620 ctdb_public_ip_push(cd
->data
.pubip
, buf
);
623 case CTDB_CONTROL_TAKEOVER_IP
:
624 ctdb_public_ip_push(cd
->data
.pubip
, buf
);
627 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
628 ctdb_uint32_push(cd
->data
.event
, buf
);
631 case CTDB_CONTROL_TRAVERSE_KILL
:
632 ctdb_traverse_start_push(cd
->data
.traverse_start
, buf
);
635 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
636 ctdb_double_push(cd
->data
.reclock_latency
, buf
);
639 case CTDB_CONTROL_SET_RECLOCK_FILE
:
640 ctdb_string_push(cd
->data
.reclock_file
, buf
);
643 case CTDB_CONTROL_SET_LMASTERROLE
:
644 ctdb_uint32_push(cd
->data
.role
, buf
);
647 case CTDB_CONTROL_SET_RECMASTERROLE
:
648 ctdb_uint32_push(cd
->data
.role
, buf
);
651 case CTDB_CONTROL_ENABLE_SCRIPT
:
652 ctdb_string_push(cd
->data
.script
, buf
);
655 case CTDB_CONTROL_DISABLE_SCRIPT
:
656 ctdb_string_push(cd
->data
.script
, buf
);
659 case CTDB_CONTROL_SET_BAN_STATE
:
660 ctdb_ban_state_push(cd
->data
.ban_state
, buf
);
663 case CTDB_CONTROL_SET_DB_PRIORITY
:
664 ctdb_db_priority_push(cd
->data
.db_prio
, buf
);
667 case CTDB_CONTROL_GET_DB_PRIORITY
:
668 ctdb_uint32_push(cd
->data
.db_id
, buf
);
671 case CTDB_CONTROL_REGISTER_NOTIFY
:
672 ctdb_notify_data_push(cd
->data
.notify
, buf
);
675 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
676 ctdb_uint64_push(cd
->data
.srvid
, buf
);
679 case CTDB_CONTROL_TRANS3_COMMIT
:
680 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
683 case CTDB_CONTROL_GET_DB_SEQNUM
:
684 u64
= cd
->data
.db_id
;
685 ctdb_uint64_push(u64
, buf
);
688 case CTDB_CONTROL_DB_SET_HEALTHY
:
689 ctdb_uint32_push(cd
->data
.db_id
, buf
);
692 case CTDB_CONTROL_DB_GET_HEALTH
:
693 ctdb_uint32_push(cd
->data
.db_id
, buf
);
696 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
697 ctdb_sock_addr_push(cd
->data
.addr
, buf
);
700 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
701 ctdb_iface_push(cd
->data
.iface
, buf
);
704 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
705 ctdb_connection_push(cd
->data
.conn
, buf
);
708 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
709 ctdb_key_data_push(cd
->data
.key
, buf
);
712 case CTDB_CONTROL_SET_DB_READONLY
:
713 ctdb_uint32_push(cd
->data
.db_id
, buf
);
716 case CTDB_CONTROL_CHECK_SRVIDS
:
717 ctdb_uint64_array_push(cd
->data
.u64_array
, buf
);
720 case CTDB_CONTROL_TRAVERSE_START_EXT
:
721 ctdb_traverse_start_ext_push(cd
->data
.traverse_start_ext
, buf
);
724 case CTDB_CONTROL_GET_DB_STATISTICS
:
725 ctdb_uint32_push(cd
->data
.db_id
, buf
);
728 case CTDB_CONTROL_SET_DB_STICKY
:
729 ctdb_uint32_push(cd
->data
.db_id
, buf
);
732 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
733 ctdb_traverse_all_ext_push(cd
->data
.traverse_all_ext
, buf
);
736 case CTDB_CONTROL_RECEIVE_RECORDS
:
737 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
740 case CTDB_CONTROL_DB_DETACH
:
741 ctdb_uint32_push(cd
->data
.db_id
, buf
);
744 case CTDB_CONTROL_DB_FREEZE
:
745 ctdb_uint32_push(cd
->data
.db_id
, buf
);
748 case CTDB_CONTROL_DB_THAW
:
749 ctdb_uint32_push(cd
->data
.db_id
, buf
);
752 case CTDB_CONTROL_DB_TRANSACTION_START
:
753 ctdb_transdb_push(cd
->data
.transdb
, buf
);
756 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
757 ctdb_transdb_push(cd
->data
.transdb
, buf
);
760 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
761 ctdb_uint32_push(cd
->data
.db_id
, buf
);
764 case CTDB_CONTROL_DB_PULL
:
765 ctdb_pulldb_ext_push(cd
->data
.pulldb_ext
, buf
);
768 case CTDB_CONTROL_DB_PUSH_START
:
769 ctdb_pulldb_ext_push(cd
->data
.pulldb_ext
, buf
);
772 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
773 ctdb_uint32_push(cd
->data
.db_id
, buf
);
778 static int ctdb_req_control_data_pull(uint8_t *buf
, size_t buflen
,
781 struct ctdb_req_control_data
*cd
)
789 case CTDB_CONTROL_PROCESS_EXISTS
:
790 ret
= ctdb_pid_pull(buf
, buflen
, mem_ctx
,
794 case CTDB_CONTROL_GETDBPATH
:
795 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
799 case CTDB_CONTROL_SETVNNMAP
:
800 ret
= ctdb_vnn_map_pull(buf
, buflen
, mem_ctx
,
804 case CTDB_CONTROL_SET_DEBUG
:
805 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
809 case CTDB_CONTROL_PULL_DB
:
810 ret
= ctdb_pulldb_pull(buf
, buflen
, mem_ctx
,
814 case CTDB_CONTROL_PUSH_DB
:
815 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
819 case CTDB_CONTROL_SET_RECMODE
:
820 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
824 case CTDB_CONTROL_DB_ATTACH
:
825 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
829 case CTDB_CONTROL_SET_CALL
:
832 case CTDB_CONTROL_TRAVERSE_START
:
833 ret
= ctdb_traverse_start_pull(buf
, buflen
, mem_ctx
,
834 &cd
->data
.traverse_start
);
837 case CTDB_CONTROL_TRAVERSE_ALL
:
838 ret
= ctdb_traverse_all_pull(buf
, buflen
, mem_ctx
,
839 &cd
->data
.traverse_all
);
842 case CTDB_CONTROL_TRAVERSE_DATA
:
843 ret
= ctdb_rec_data_pull(buf
, buflen
, mem_ctx
,
847 case CTDB_CONTROL_GET_DBNAME
:
848 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
852 case CTDB_CONTROL_ENABLE_SEQNUM
:
853 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
857 case CTDB_CONTROL_UPDATE_SEQNUM
:
858 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
862 case CTDB_CONTROL_SET_RECMASTER
:
863 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
864 &cd
->data
.recmaster
);
867 case CTDB_CONTROL_TCP_CLIENT
:
868 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
872 case CTDB_CONTROL_TCP_ADD
:
873 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
877 case CTDB_CONTROL_TCP_REMOVE
:
878 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
882 case CTDB_CONTROL_SET_TUNABLE
:
883 ret
= ctdb_tunable_pull(buf
, buflen
, mem_ctx
,
887 case CTDB_CONTROL_GET_TUNABLE
:
888 ret
= ctdb_stringn_pull(buf
, buflen
, mem_ctx
,
892 case CTDB_CONTROL_MODIFY_FLAGS
:
893 ret
= ctdb_node_flag_change_pull(buf
, buflen
, mem_ctx
,
894 &cd
->data
.flag_change
);
897 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
898 ret
= ctdb_sock_addr_pull(buf
, buflen
, mem_ctx
,
902 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
903 ret
= ctdb_tickle_list_pull(buf
, buflen
, mem_ctx
,
907 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
908 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
912 case CTDB_CONTROL_UPDATE_RECORD
:
913 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
917 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
918 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
919 &cd
->data
.addr_info
);
922 case CTDB_CONTROL_TRANSACTION_START
:
923 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
927 case CTDB_CONTROL_TRANSACTION_COMMIT
:
928 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
932 case CTDB_CONTROL_WIPE_DATABASE
:
933 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
937 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
938 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
942 case CTDB_CONTROL_ADD_PUBLIC_IP
:
943 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
944 &cd
->data
.addr_info
);
947 case CTDB_CONTROL_DEL_PUBLIC_IP
:
948 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
949 &cd
->data
.addr_info
);
952 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
953 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
954 &cd
->data
.event_str
);
957 case CTDB_CONTROL_RELEASE_IP
:
958 ret
= ctdb_public_ip_pull(buf
, buflen
, mem_ctx
,
962 case CTDB_CONTROL_TAKEOVER_IP
:
963 ret
= ctdb_public_ip_pull(buf
, buflen
, mem_ctx
,
967 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
968 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
972 case CTDB_CONTROL_TRAVERSE_KILL
:
973 ret
= ctdb_traverse_start_pull(buf
, buflen
, mem_ctx
,
974 &cd
->data
.traverse_start
);
977 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
978 ret
= ctdb_double_pull(buf
, buflen
, mem_ctx
,
979 &cd
->data
.reclock_latency
);
982 case CTDB_CONTROL_SET_RECLOCK_FILE
:
983 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
984 &cd
->data
.reclock_file
);
987 case CTDB_CONTROL_SET_LMASTERROLE
:
988 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
992 case CTDB_CONTROL_SET_RECMASTERROLE
:
993 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
997 case CTDB_CONTROL_ENABLE_SCRIPT
:
998 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1002 case CTDB_CONTROL_DISABLE_SCRIPT
:
1003 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1007 case CTDB_CONTROL_SET_BAN_STATE
:
1008 ret
= ctdb_ban_state_pull(buf
, buflen
, mem_ctx
,
1009 &cd
->data
.ban_state
);
1012 case CTDB_CONTROL_SET_DB_PRIORITY
:
1013 ret
= ctdb_db_priority_pull(buf
, buflen
, mem_ctx
,
1017 case CTDB_CONTROL_GET_DB_PRIORITY
:
1018 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1022 case CTDB_CONTROL_REGISTER_NOTIFY
:
1023 ret
= ctdb_notify_data_pull(buf
, buflen
, mem_ctx
,
1027 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
1028 ctdb_uint64_pull(buf
, buflen
, mem_ctx
,
1032 case CTDB_CONTROL_TRANS3_COMMIT
:
1033 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1037 case CTDB_CONTROL_GET_DB_SEQNUM
:
1038 ret
= ctdb_uint64_pull(buf
, buflen
, mem_ctx
, &u64
);
1039 cd
->data
.db_id
= (uint32_t)u64
;
1042 case CTDB_CONTROL_DB_SET_HEALTHY
:
1043 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1047 case CTDB_CONTROL_DB_GET_HEALTH
:
1048 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1052 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1053 ret
= ctdb_sock_addr_pull(buf
, buflen
, mem_ctx
,
1057 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
1058 ret
= ctdb_iface_pull(buf
, buflen
, mem_ctx
,
1062 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
1063 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
1067 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
1068 ret
= ctdb_key_data_pull(buf
, buflen
, mem_ctx
,
1072 case CTDB_CONTROL_SET_DB_READONLY
:
1073 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1077 case CTDB_CONTROL_CHECK_SRVIDS
:
1078 ret
= ctdb_uint64_array_pull(buf
, buflen
, mem_ctx
,
1079 &cd
->data
.u64_array
);
1082 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1083 ret
= ctdb_traverse_start_ext_pull(buf
, buflen
, mem_ctx
,
1084 &cd
->data
.traverse_start_ext
);
1087 case CTDB_CONTROL_GET_DB_STATISTICS
:
1088 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1092 case CTDB_CONTROL_SET_DB_STICKY
:
1093 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1097 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1098 ret
= ctdb_traverse_all_ext_pull(buf
, buflen
, mem_ctx
,
1099 &cd
->data
.traverse_all_ext
);
1102 case CTDB_CONTROL_RECEIVE_RECORDS
:
1103 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1107 case CTDB_CONTROL_DB_DETACH
:
1108 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1112 case CTDB_CONTROL_DB_FREEZE
:
1113 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1117 case CTDB_CONTROL_DB_THAW
:
1118 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1122 case CTDB_CONTROL_DB_TRANSACTION_START
:
1123 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
1127 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
1128 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
1132 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
1133 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1137 case CTDB_CONTROL_DB_PULL
:
1138 ret
= ctdb_pulldb_ext_pull(buf
, buflen
, mem_ctx
,
1139 &cd
->data
.pulldb_ext
);
1142 case CTDB_CONTROL_DB_PUSH_START
:
1143 ret
= ctdb_pulldb_ext_pull(buf
, buflen
, mem_ctx
,
1144 &cd
->data
.pulldb_ext
);
1147 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1148 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1156 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data
*cd
)
1164 switch (cd
->opcode
) {
1165 case CTDB_CONTROL_PROCESS_EXISTS
:
1168 case CTDB_CONTROL_STATISTICS
:
1169 len
= ctdb_statistics_len(cd
->data
.stats
);
1172 case CTDB_CONTROL_PING
:
1175 case CTDB_CONTROL_GETDBPATH
:
1176 len
= ctdb_string_len(cd
->data
.db_path
);
1179 case CTDB_CONTROL_GETVNNMAP
:
1180 len
= ctdb_vnn_map_len(cd
->data
.vnnmap
);
1183 case CTDB_CONTROL_SETVNNMAP
:
1186 case CTDB_CONTROL_GET_DEBUG
:
1187 len
= ctdb_uint32_len(cd
->data
.loglevel
);
1190 case CTDB_CONTROL_SET_DEBUG
:
1193 case CTDB_CONTROL_GET_DBMAP
:
1194 len
= ctdb_dbid_map_len(cd
->data
.dbmap
);
1197 case CTDB_CONTROL_PULL_DB
:
1198 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1201 case CTDB_CONTROL_PUSH_DB
:
1204 case CTDB_CONTROL_GET_RECMODE
:
1207 case CTDB_CONTROL_SET_RECMODE
:
1210 case CTDB_CONTROL_STATISTICS_RESET
:
1213 case CTDB_CONTROL_DB_ATTACH
:
1214 len
= ctdb_uint32_len(cd
->data
.db_id
);
1217 case CTDB_CONTROL_SET_CALL
:
1220 case CTDB_CONTROL_TRAVERSE_START
:
1223 case CTDB_CONTROL_TRAVERSE_ALL
:
1226 case CTDB_CONTROL_TRAVERSE_DATA
:
1229 case CTDB_CONTROL_REGISTER_SRVID
:
1232 case CTDB_CONTROL_DEREGISTER_SRVID
:
1235 case CTDB_CONTROL_GET_DBNAME
:
1236 len
= ctdb_string_len(cd
->data
.db_name
);
1239 case CTDB_CONTROL_ENABLE_SEQNUM
:
1242 case CTDB_CONTROL_UPDATE_SEQNUM
:
1245 case CTDB_CONTROL_DUMP_MEMORY
:
1246 len
= ctdb_string_len(cd
->data
.mem_str
);
1249 case CTDB_CONTROL_GET_PID
:
1252 case CTDB_CONTROL_GET_RECMASTER
:
1255 case CTDB_CONTROL_SET_RECMASTER
:
1258 case CTDB_CONTROL_FREEZE
:
1261 case CTDB_CONTROL_THAW
:
1264 case CTDB_CONTROL_GET_PNN
:
1267 case CTDB_CONTROL_SHUTDOWN
:
1270 case CTDB_CONTROL_GET_MONMODE
:
1273 case CTDB_CONTROL_TCP_CLIENT
:
1276 case CTDB_CONTROL_TCP_ADD
:
1279 case CTDB_CONTROL_TCP_REMOVE
:
1282 case CTDB_CONTROL_STARTUP
:
1285 case CTDB_CONTROL_SET_TUNABLE
:
1288 case CTDB_CONTROL_GET_TUNABLE
:
1289 len
= ctdb_uint32_len(cd
->data
.tun_value
);
1292 case CTDB_CONTROL_LIST_TUNABLES
:
1293 len
= ctdb_var_list_len(cd
->data
.tun_var_list
);
1296 case CTDB_CONTROL_MODIFY_FLAGS
:
1299 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1300 len
= ctdb_tunable_list_len(cd
->data
.tun_list
);
1303 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1304 len
= ctdb_tickle_list_len(cd
->data
.tickles
);
1307 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
1310 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1311 len
= ctdb_uint32_len(cd
->data
.db_id
);
1314 case CTDB_CONTROL_UPDATE_RECORD
:
1317 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
1320 case CTDB_CONTROL_TRANSACTION_START
:
1323 case CTDB_CONTROL_TRANSACTION_COMMIT
:
1326 case CTDB_CONTROL_WIPE_DATABASE
:
1329 case CTDB_CONTROL_UPTIME
:
1330 len
= ctdb_uptime_len(cd
->data
.uptime
);
1333 case CTDB_CONTROL_START_RECOVERY
:
1336 case CTDB_CONTROL_END_RECOVERY
:
1339 case CTDB_CONTROL_RELOAD_NODES_FILE
:
1342 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1343 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1346 case CTDB_CONTROL_ENABLE_MONITOR
:
1349 case CTDB_CONTROL_DISABLE_MONITOR
:
1352 case CTDB_CONTROL_ADD_PUBLIC_IP
:
1355 case CTDB_CONTROL_DEL_PUBLIC_IP
:
1358 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
1361 case CTDB_CONTROL_GET_CAPABILITIES
:
1362 len
= ctdb_uint32_len(cd
->data
.caps
);
1365 case CTDB_CONTROL_RECD_PING
:
1368 case CTDB_CONTROL_RELEASE_IP
:
1371 case CTDB_CONTROL_TAKEOVER_IP
:
1374 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1375 len
= ctdb_public_ip_list_len(cd
->data
.pubip_list
);
1378 case CTDB_CONTROL_GET_NODEMAP
:
1379 len
= ctdb_node_map_len(cd
->data
.nodemap
);
1382 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1383 len
= ctdb_script_list_len(cd
->data
.script_list
);
1386 case CTDB_CONTROL_TRAVERSE_KILL
:
1389 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
1392 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1393 len
= ctdb_string_len(cd
->data
.reclock_file
);
1396 case CTDB_CONTROL_SET_RECLOCK_FILE
:
1399 case CTDB_CONTROL_STOP_NODE
:
1402 case CTDB_CONTROL_CONTINUE_NODE
:
1405 case CTDB_CONTROL_SET_LMASTERROLE
:
1408 case CTDB_CONTROL_SET_RECMASTERROLE
:
1411 case CTDB_CONTROL_ENABLE_SCRIPT
:
1414 case CTDB_CONTROL_DISABLE_SCRIPT
:
1417 case CTDB_CONTROL_SET_BAN_STATE
:
1420 case CTDB_CONTROL_GET_BAN_STATE
:
1421 len
= ctdb_ban_state_len(cd
->data
.ban_state
);
1424 case CTDB_CONTROL_SET_DB_PRIORITY
:
1427 case CTDB_CONTROL_GET_DB_PRIORITY
:
1430 case CTDB_CONTROL_TRANSACTION_CANCEL
:
1433 case CTDB_CONTROL_REGISTER_NOTIFY
:
1436 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
1439 case CTDB_CONTROL_TRANS3_COMMIT
:
1442 case CTDB_CONTROL_GET_DB_SEQNUM
:
1443 len
= ctdb_uint64_len(cd
->data
.seqnum
);
1446 case CTDB_CONTROL_DB_SET_HEALTHY
:
1449 case CTDB_CONTROL_DB_GET_HEALTH
:
1450 len
= ctdb_string_len(cd
->data
.reason
);
1453 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1454 len
= ctdb_public_ip_info_len(cd
->data
.ipinfo
);
1457 case CTDB_CONTROL_GET_IFACES
:
1458 len
= ctdb_iface_list_len(cd
->data
.iface_list
);
1461 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
1464 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
1467 case CTDB_CONTROL_GET_STAT_HISTORY
:
1468 len
= ctdb_statistics_list_len(cd
->data
.stats_list
);
1471 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
1474 case CTDB_CONTROL_SET_DB_READONLY
:
1477 case CTDB_CONTROL_CHECK_SRVIDS
:
1478 len
= ctdb_uint8_array_len(cd
->data
.u8_array
);
1481 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1484 case CTDB_CONTROL_GET_DB_STATISTICS
:
1485 len
= ctdb_db_statistics_len(cd
->data
.dbstats
);
1488 case CTDB_CONTROL_SET_DB_STICKY
:
1491 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
1494 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1497 case CTDB_CONTROL_RECEIVE_RECORDS
:
1498 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1501 case CTDB_CONTROL_IPREALLOCATED
:
1504 case CTDB_CONTROL_GET_RUNSTATE
:
1505 len
= ctdb_uint32_len(cd
->data
.runstate
);
1508 case CTDB_CONTROL_DB_DETACH
:
1511 case CTDB_CONTROL_GET_NODES_FILE
:
1512 len
= ctdb_node_map_len(cd
->data
.nodemap
);
1515 case CTDB_CONTROL_DB_FREEZE
:
1518 case CTDB_CONTROL_DB_THAW
:
1521 case CTDB_CONTROL_DB_TRANSACTION_START
:
1524 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
1527 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
1530 case CTDB_CONTROL_DB_PULL
:
1531 len
= ctdb_uint32_len(cd
->data
.num_records
);
1534 case CTDB_CONTROL_DB_PUSH_START
:
1537 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1538 len
= ctdb_uint32_len(cd
->data
.num_records
);
1545 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data
*cd
,
1548 switch (cd
->opcode
) {
1549 case CTDB_CONTROL_STATISTICS
:
1550 ctdb_statistics_push(cd
->data
.stats
, buf
);
1553 case CTDB_CONTROL_GETDBPATH
:
1554 ctdb_string_push(cd
->data
.db_path
, buf
);
1557 case CTDB_CONTROL_GETVNNMAP
:
1558 ctdb_vnn_map_push(cd
->data
.vnnmap
, buf
);
1561 case CTDB_CONTROL_GET_DEBUG
:
1562 ctdb_uint32_push(cd
->data
.loglevel
, buf
);
1565 case CTDB_CONTROL_GET_DBMAP
:
1566 ctdb_dbid_map_push(cd
->data
.dbmap
, buf
);
1569 case CTDB_CONTROL_PULL_DB
:
1570 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1573 case CTDB_CONTROL_PUSH_DB
:
1576 case CTDB_CONTROL_DB_ATTACH
:
1577 ctdb_uint32_push(cd
->data
.db_id
, buf
);
1580 case CTDB_CONTROL_GET_DBNAME
:
1581 ctdb_string_push(cd
->data
.db_name
, buf
);
1584 case CTDB_CONTROL_DUMP_MEMORY
:
1585 ctdb_string_push(cd
->data
.mem_str
, buf
);
1588 case CTDB_CONTROL_GET_PID
:
1591 case CTDB_CONTROL_GET_RECMASTER
:
1594 case CTDB_CONTROL_GET_TUNABLE
:
1595 ctdb_uint32_push(cd
->data
.tun_value
, buf
);
1598 case CTDB_CONTROL_LIST_TUNABLES
:
1599 ctdb_var_list_push(cd
->data
.tun_var_list
, buf
);
1602 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1603 ctdb_tunable_list_push(cd
->data
.tun_list
, buf
);
1606 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1607 ctdb_tickle_list_push(cd
->data
.tickles
, buf
);
1610 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1611 ctdb_uint32_push(cd
->data
.db_id
, buf
);
1614 case CTDB_CONTROL_UPTIME
:
1615 ctdb_uptime_push(cd
->data
.uptime
, buf
);
1618 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1619 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1622 case CTDB_CONTROL_GET_CAPABILITIES
:
1623 ctdb_uint32_push(cd
->data
.caps
, buf
);
1626 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1627 ctdb_public_ip_list_push(cd
->data
.pubip_list
, buf
);
1630 case CTDB_CONTROL_GET_NODEMAP
:
1631 ctdb_node_map_push(cd
->data
.nodemap
, buf
);
1634 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1635 ctdb_script_list_push(cd
->data
.script_list
, buf
);
1638 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1639 ctdb_string_push(cd
->data
.reclock_file
, buf
);
1642 case CTDB_CONTROL_GET_BAN_STATE
:
1643 ctdb_ban_state_push(cd
->data
.ban_state
, buf
);
1646 case CTDB_CONTROL_GET_DB_PRIORITY
:
1649 case CTDB_CONTROL_GET_DB_SEQNUM
:
1650 ctdb_uint64_push(cd
->data
.seqnum
, buf
);
1653 case CTDB_CONTROL_DB_GET_HEALTH
:
1654 ctdb_string_push(cd
->data
.reason
, buf
);
1657 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1658 ctdb_public_ip_info_push(cd
->data
.ipinfo
, buf
);
1661 case CTDB_CONTROL_GET_IFACES
:
1662 ctdb_iface_list_push(cd
->data
.iface_list
, buf
);
1665 case CTDB_CONTROL_GET_STAT_HISTORY
:
1666 ctdb_statistics_list_push(cd
->data
.stats_list
, buf
);
1669 case CTDB_CONTROL_CHECK_SRVIDS
:
1670 ctdb_uint8_array_push(cd
->data
.u8_array
, buf
);
1673 case CTDB_CONTROL_GET_DB_STATISTICS
:
1674 ctdb_db_statistics_push(cd
->data
.dbstats
, buf
);
1677 case CTDB_CONTROL_RECEIVE_RECORDS
:
1678 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1681 case CTDB_CONTROL_GET_RUNSTATE
:
1682 ctdb_uint32_push(cd
->data
.runstate
, buf
);
1685 case CTDB_CONTROL_GET_NODES_FILE
:
1686 ctdb_node_map_push(cd
->data
.nodemap
, buf
);
1689 case CTDB_CONTROL_DB_PULL
:
1690 ctdb_uint32_push(cd
->data
.num_records
, buf
);
1693 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1694 ctdb_uint32_push(cd
->data
.num_records
, buf
);
1699 static int ctdb_reply_control_data_pull(uint8_t *buf
, size_t buflen
,
1700 uint32_t opcode
, TALLOC_CTX
*mem_ctx
,
1701 struct ctdb_reply_control_data
*cd
)
1704 cd
->opcode
= opcode
;
1707 case CTDB_CONTROL_STATISTICS
:
1708 ret
= ctdb_statistics_pull(buf
, buflen
, mem_ctx
,
1712 case CTDB_CONTROL_GETDBPATH
:
1713 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1717 case CTDB_CONTROL_GETVNNMAP
:
1718 ret
= ctdb_vnn_map_pull(buf
, buflen
, mem_ctx
,
1722 case CTDB_CONTROL_GET_DEBUG
:
1723 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1724 &cd
->data
.loglevel
);
1727 case CTDB_CONTROL_GET_DBMAP
:
1728 ret
= ctdb_dbid_map_pull(buf
, buflen
, mem_ctx
,
1732 case CTDB_CONTROL_PULL_DB
:
1733 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1737 case CTDB_CONTROL_PUSH_DB
:
1740 case CTDB_CONTROL_DB_ATTACH
:
1741 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1745 case CTDB_CONTROL_GET_DBNAME
:
1746 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1750 case CTDB_CONTROL_DUMP_MEMORY
:
1751 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1755 case CTDB_CONTROL_GET_PID
:
1758 case CTDB_CONTROL_GET_RECMASTER
:
1761 case CTDB_CONTROL_GET_TUNABLE
:
1762 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1763 &cd
->data
.tun_value
);
1766 case CTDB_CONTROL_LIST_TUNABLES
:
1767 ret
= ctdb_var_list_pull(buf
, buflen
, mem_ctx
,
1768 &cd
->data
.tun_var_list
);
1771 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1772 ret
= ctdb_tunable_list_pull(buf
, buflen
, mem_ctx
,
1773 &cd
->data
.tun_list
);
1776 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1777 ret
= ctdb_tickle_list_pull(buf
, buflen
, mem_ctx
,
1781 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1782 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1786 case CTDB_CONTROL_UPTIME
:
1787 ret
= ctdb_uptime_pull(buf
, buflen
, mem_ctx
,
1791 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1792 ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1796 case CTDB_CONTROL_GET_CAPABILITIES
:
1797 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1801 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1802 ret
= ctdb_public_ip_list_pull(buf
, buflen
, mem_ctx
,
1803 &cd
->data
.pubip_list
);
1806 case CTDB_CONTROL_GET_NODEMAP
:
1807 ret
= ctdb_node_map_pull(buf
, buflen
, mem_ctx
,
1811 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1812 ret
= ctdb_script_list_pull(buf
, buflen
, mem_ctx
,
1813 &cd
->data
.script_list
);
1816 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1817 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1818 &cd
->data
.reclock_file
);
1821 case CTDB_CONTROL_GET_BAN_STATE
:
1822 ret
= ctdb_ban_state_pull(buf
, buflen
, mem_ctx
,
1823 &cd
->data
.ban_state
);
1826 case CTDB_CONTROL_GET_DB_PRIORITY
:
1829 case CTDB_CONTROL_GET_DB_SEQNUM
:
1830 ret
= ctdb_uint64_pull(buf
, buflen
, mem_ctx
,
1834 case CTDB_CONTROL_DB_GET_HEALTH
:
1835 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1839 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1840 ret
= ctdb_public_ip_info_pull(buf
, buflen
, mem_ctx
,
1844 case CTDB_CONTROL_GET_IFACES
:
1845 ret
= ctdb_iface_list_pull(buf
, buflen
, mem_ctx
,
1846 &cd
->data
.iface_list
);
1849 case CTDB_CONTROL_GET_STAT_HISTORY
:
1850 ret
= ctdb_statistics_list_pull(buf
, buflen
, mem_ctx
,
1851 &cd
->data
.stats_list
);
1854 case CTDB_CONTROL_CHECK_SRVIDS
:
1855 ret
= ctdb_uint8_array_pull(buf
, buflen
, mem_ctx
,
1856 &cd
->data
.u8_array
);
1859 case CTDB_CONTROL_GET_DB_STATISTICS
:
1860 ret
= ctdb_db_statistics_pull(buf
, buflen
, mem_ctx
,
1864 case CTDB_CONTROL_RECEIVE_RECORDS
:
1865 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1869 case CTDB_CONTROL_GET_RUNSTATE
:
1870 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1871 &cd
->data
.runstate
);
1874 case CTDB_CONTROL_GET_NODES_FILE
:
1875 ret
= ctdb_node_map_pull(buf
, buflen
, mem_ctx
,
1879 case CTDB_CONTROL_DB_PULL
:
1880 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1881 &cd
->data
.num_records
);
1884 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1885 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1886 &cd
->data
.num_records
);
1893 size_t ctdb_req_control_len(struct ctdb_req_header
*h
,
1894 struct ctdb_req_control
*c
)
1896 return offsetof(struct ctdb_req_control_wire
, data
) +
1897 ctdb_req_control_data_len(&c
->rdata
);
1900 int ctdb_req_control_push(struct ctdb_req_header
*h
,
1901 struct ctdb_req_control
*request
,
1902 uint8_t *buf
, size_t *buflen
)
1904 struct ctdb_req_control_wire
*wire
=
1905 (struct ctdb_req_control_wire
*)buf
;
1908 length
= ctdb_req_control_len(h
, request
);
1909 if (*buflen
< length
) {
1914 h
->length
= *buflen
;
1915 ctdb_req_header_push(h
, (uint8_t *)&wire
->hdr
);
1917 wire
->opcode
= request
->opcode
;
1918 wire
->pad
= request
->pad
;
1919 wire
->srvid
= request
->srvid
;
1920 wire
->client_id
= request
->client_id
;
1921 wire
->flags
= request
->flags
;
1923 wire
->datalen
= ctdb_req_control_data_len(&request
->rdata
);
1924 ctdb_req_control_data_push(&request
->rdata
, wire
->data
);
1929 int ctdb_req_control_pull(uint8_t *buf
, size_t buflen
,
1930 struct ctdb_req_header
*h
,
1931 TALLOC_CTX
*mem_ctx
,
1932 struct ctdb_req_control
*c
)
1934 struct ctdb_req_control_wire
*wire
=
1935 (struct ctdb_req_control_wire
*)buf
;
1939 length
= offsetof(struct ctdb_req_control_wire
, data
);
1940 if (buflen
< length
) {
1943 if (buflen
< length
+ wire
->datalen
) {
1948 ret
= ctdb_req_header_pull((uint8_t *)&wire
->hdr
, buflen
, h
);
1954 c
->opcode
= wire
->opcode
;
1956 c
->srvid
= wire
->srvid
;
1957 c
->client_id
= wire
->client_id
;
1958 c
->flags
= wire
->flags
;
1960 ret
= ctdb_req_control_data_pull(wire
->data
, wire
->datalen
,
1961 c
->opcode
, mem_ctx
, &c
->rdata
);
1969 size_t ctdb_reply_control_len(struct ctdb_req_header
*h
,
1970 struct ctdb_reply_control
*c
)
1972 return offsetof(struct ctdb_reply_control_wire
, data
) +
1974 ctdb_reply_control_data_len(&c
->rdata
) :
1975 ctdb_string_len(c
->errmsg
));
1978 int ctdb_reply_control_push(struct ctdb_req_header
*h
,
1979 struct ctdb_reply_control
*reply
,
1980 uint8_t *buf
, size_t *buflen
)
1982 struct ctdb_reply_control_wire
*wire
=
1983 (struct ctdb_reply_control_wire
*)buf
;
1986 length
= ctdb_reply_control_len(h
, reply
);
1987 if (*buflen
< length
) {
1992 h
->length
= *buflen
;
1993 ctdb_req_header_push(h
, (uint8_t *)&wire
->hdr
);
1995 wire
->status
= reply
->status
;
1997 if (reply
->status
== 0) {
1998 wire
->datalen
= ctdb_reply_control_data_len(&reply
->rdata
);
2000 ctdb_reply_control_data_push(&reply
->rdata
, wire
->data
);
2003 wire
->errorlen
= ctdb_string_len(reply
->errmsg
);
2004 ctdb_string_push(reply
->errmsg
, wire
->data
+ wire
->datalen
);
2010 int ctdb_reply_control_pull(uint8_t *buf
, size_t buflen
, uint32_t opcode
,
2011 struct ctdb_req_header
*h
,
2012 TALLOC_CTX
*mem_ctx
,
2013 struct ctdb_reply_control
*c
)
2015 struct ctdb_reply_control_wire
*wire
=
2016 (struct ctdb_reply_control_wire
*)buf
;
2020 length
= offsetof(struct ctdb_reply_control_wire
, data
);
2021 if (buflen
< length
) {
2024 if (buflen
< length
+ wire
->datalen
+ wire
->errorlen
) {
2029 ret
= ctdb_req_header_pull((uint8_t *)&wire
->hdr
, buflen
, h
);
2035 c
->status
= wire
->status
;
2037 if (c
->status
!= -1) {
2038 ret
= ctdb_reply_control_data_pull(wire
->data
, wire
->datalen
,
2046 ret
= ctdb_string_pull(wire
->data
+ wire
->datalen
, wire
->errorlen
,
2047 mem_ctx
, &c
->errmsg
);