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_RUN_EVENTSCRIPTS
:
258 len
= ctdb_string_len(cd
->data
.event_str
);
261 case CTDB_CONTROL_GET_CAPABILITIES
:
264 case CTDB_CONTROL_RECD_PING
:
267 case CTDB_CONTROL_RELEASE_IP
:
268 len
= ctdb_public_ip_len(cd
->data
.pubip
);
271 case CTDB_CONTROL_TAKEOVER_IP
:
272 len
= ctdb_public_ip_len(cd
->data
.pubip
);
275 case CTDB_CONTROL_GET_PUBLIC_IPS
:
278 case CTDB_CONTROL_GET_NODEMAP
:
281 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
282 len
= ctdb_uint32_len(cd
->data
.event
);
285 case CTDB_CONTROL_TRAVERSE_KILL
:
286 len
= ctdb_traverse_start_len(cd
->data
.traverse_start
);
289 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
290 len
= ctdb_double_len(cd
->data
.reclock_latency
);
293 case CTDB_CONTROL_GET_RECLOCK_FILE
:
296 case CTDB_CONTROL_STOP_NODE
:
299 case CTDB_CONTROL_CONTINUE_NODE
:
302 case CTDB_CONTROL_SET_LMASTERROLE
:
303 len
= ctdb_uint32_len(cd
->data
.role
);
306 case CTDB_CONTROL_SET_RECMASTERROLE
:
307 len
= ctdb_uint32_len(cd
->data
.role
);
310 case CTDB_CONTROL_ENABLE_SCRIPT
:
311 len
= ctdb_string_len(cd
->data
.script
);
314 case CTDB_CONTROL_DISABLE_SCRIPT
:
315 len
= ctdb_string_len(cd
->data
.script
);
318 case CTDB_CONTROL_SET_BAN_STATE
:
319 len
= ctdb_ban_state_len(cd
->data
.ban_state
);
322 case CTDB_CONTROL_GET_BAN_STATE
:
325 case CTDB_CONTROL_REGISTER_NOTIFY
:
326 len
= ctdb_notify_data_len(cd
->data
.notify
);
329 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
330 len
= ctdb_uint64_len(cd
->data
.srvid
);
333 case CTDB_CONTROL_TRANS3_COMMIT
:
334 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
337 case CTDB_CONTROL_GET_DB_SEQNUM
:
338 u64
= cd
->data
.db_id
;
339 len
= ctdb_uint64_len(u64
);
342 case CTDB_CONTROL_DB_SET_HEALTHY
:
343 len
= ctdb_uint32_len(cd
->data
.db_id
);
346 case CTDB_CONTROL_DB_GET_HEALTH
:
347 len
= ctdb_uint32_len(cd
->data
.db_id
);
350 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
351 len
= ctdb_sock_addr_len(cd
->data
.addr
);
354 case CTDB_CONTROL_GET_IFACES
:
357 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
358 len
= ctdb_iface_len(cd
->data
.iface
);
361 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
362 len
= ctdb_connection_len(cd
->data
.conn
);
365 case CTDB_CONTROL_GET_STAT_HISTORY
:
368 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
369 len
= ctdb_key_data_len(cd
->data
.key
);
372 case CTDB_CONTROL_SET_DB_READONLY
:
373 len
= ctdb_uint32_len(cd
->data
.db_id
);
376 case CTDB_CONTROL_CHECK_SRVIDS
:
377 len
= ctdb_uint64_array_len(cd
->data
.u64_array
);
380 case CTDB_CONTROL_TRAVERSE_START_EXT
:
381 len
= ctdb_traverse_start_ext_len(cd
->data
.traverse_start_ext
);
384 case CTDB_CONTROL_GET_DB_STATISTICS
:
385 len
= ctdb_uint32_len(cd
->data
.db_id
);
388 case CTDB_CONTROL_SET_DB_STICKY
:
389 len
= ctdb_uint32_len(cd
->data
.db_id
);
392 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
395 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
396 len
= ctdb_traverse_all_ext_len(cd
->data
.traverse_all_ext
);
399 case CTDB_CONTROL_RECEIVE_RECORDS
:
400 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
403 case CTDB_CONTROL_IPREALLOCATED
:
406 case CTDB_CONTROL_GET_RUNSTATE
:
409 case CTDB_CONTROL_DB_DETACH
:
410 len
= ctdb_uint32_len(cd
->data
.db_id
);
413 case CTDB_CONTROL_GET_NODES_FILE
:
416 case CTDB_CONTROL_DB_FREEZE
:
417 len
= ctdb_uint32_len(cd
->data
.db_id
);
420 case CTDB_CONTROL_DB_THAW
:
421 len
= ctdb_uint32_len(cd
->data
.db_id
);
424 case CTDB_CONTROL_DB_TRANSACTION_START
:
425 len
= ctdb_transdb_len(cd
->data
.transdb
);
428 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
429 len
= ctdb_transdb_len(cd
->data
.transdb
);
432 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
433 len
= ctdb_uint32_len(cd
->data
.db_id
);
436 case CTDB_CONTROL_DB_PULL
:
437 len
= ctdb_pulldb_ext_len(cd
->data
.pulldb_ext
);
440 case CTDB_CONTROL_DB_PUSH_START
:
441 len
= ctdb_pulldb_ext_len(cd
->data
.pulldb_ext
);
444 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
445 len
= ctdb_uint32_len(cd
->data
.db_id
);
452 static void ctdb_req_control_data_push(struct ctdb_req_control_data
*cd
,
457 switch (cd
->opcode
) {
458 case CTDB_CONTROL_PROCESS_EXISTS
:
459 ctdb_pid_push(cd
->data
.pid
, buf
);
462 case CTDB_CONTROL_GETDBPATH
:
463 ctdb_uint32_push(cd
->data
.db_id
, buf
);
466 case CTDB_CONTROL_SETVNNMAP
:
467 ctdb_vnn_map_push(cd
->data
.vnnmap
, buf
);
470 case CTDB_CONTROL_SET_DEBUG
:
471 ctdb_uint32_push(cd
->data
.loglevel
, buf
);
474 case CTDB_CONTROL_PULL_DB
:
475 ctdb_pulldb_push(cd
->data
.pulldb
, buf
);
478 case CTDB_CONTROL_PUSH_DB
:
479 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
482 case CTDB_CONTROL_SET_RECMODE
:
483 ctdb_uint32_push(cd
->data
.recmode
, buf
);
486 case CTDB_CONTROL_DB_ATTACH
:
487 ctdb_string_push(cd
->data
.db_name
, buf
);
490 case CTDB_CONTROL_SET_CALL
:
493 case CTDB_CONTROL_TRAVERSE_START
:
494 ctdb_traverse_start_push(cd
->data
.traverse_start
, buf
);
497 case CTDB_CONTROL_TRAVERSE_ALL
:
498 ctdb_traverse_all_push(cd
->data
.traverse_all
, buf
);
501 case CTDB_CONTROL_TRAVERSE_DATA
:
502 ctdb_rec_data_push(cd
->data
.rec_data
, buf
);
505 case CTDB_CONTROL_GET_DBNAME
:
506 ctdb_uint32_push(cd
->data
.db_id
, buf
);
509 case CTDB_CONTROL_ENABLE_SEQNUM
:
510 ctdb_uint32_push(cd
->data
.db_id
, buf
);
513 case CTDB_CONTROL_UPDATE_SEQNUM
:
514 ctdb_uint32_push(cd
->data
.db_id
, buf
);
517 case CTDB_CONTROL_SET_RECMASTER
:
518 ctdb_uint32_push(cd
->data
.recmaster
, buf
);
521 case CTDB_CONTROL_TCP_CLIENT
:
522 ctdb_connection_push(cd
->data
.conn
, buf
);
525 case CTDB_CONTROL_TCP_ADD
:
526 ctdb_connection_push(cd
->data
.conn
, buf
);
529 case CTDB_CONTROL_TCP_REMOVE
:
530 ctdb_connection_push(cd
->data
.conn
, buf
);
533 case CTDB_CONTROL_SET_TUNABLE
:
534 ctdb_tunable_push(cd
->data
.tunable
, buf
);
537 case CTDB_CONTROL_GET_TUNABLE
:
538 ctdb_stringn_push(cd
->data
.tun_var
, buf
);
541 case CTDB_CONTROL_MODIFY_FLAGS
:
542 ctdb_node_flag_change_push(cd
->data
.flag_change
, buf
);
545 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
546 ctdb_sock_addr_push(cd
->data
.addr
, buf
);
549 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
550 ctdb_tickle_list_push(cd
->data
.tickles
, buf
);
553 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
554 ctdb_string_push(cd
->data
.db_name
, buf
);
557 case CTDB_CONTROL_UPDATE_RECORD
:
558 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
561 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
562 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
565 case CTDB_CONTROL_WIPE_DATABASE
:
566 ctdb_transdb_push(cd
->data
.transdb
, buf
);
569 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
570 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
573 case CTDB_CONTROL_ADD_PUBLIC_IP
:
574 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
577 case CTDB_CONTROL_DEL_PUBLIC_IP
:
578 ctdb_addr_info_push(cd
->data
.addr_info
, buf
);
581 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
582 ctdb_string_push(cd
->data
.event_str
, buf
);
585 case CTDB_CONTROL_RELEASE_IP
:
586 ctdb_public_ip_push(cd
->data
.pubip
, buf
);
589 case CTDB_CONTROL_TAKEOVER_IP
:
590 ctdb_public_ip_push(cd
->data
.pubip
, buf
);
593 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
594 ctdb_uint32_push(cd
->data
.event
, buf
);
597 case CTDB_CONTROL_TRAVERSE_KILL
:
598 ctdb_traverse_start_push(cd
->data
.traverse_start
, buf
);
601 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
602 ctdb_double_push(cd
->data
.reclock_latency
, buf
);
605 case CTDB_CONTROL_SET_LMASTERROLE
:
606 ctdb_uint32_push(cd
->data
.role
, buf
);
609 case CTDB_CONTROL_SET_RECMASTERROLE
:
610 ctdb_uint32_push(cd
->data
.role
, buf
);
613 case CTDB_CONTROL_ENABLE_SCRIPT
:
614 ctdb_string_push(cd
->data
.script
, buf
);
617 case CTDB_CONTROL_DISABLE_SCRIPT
:
618 ctdb_string_push(cd
->data
.script
, buf
);
621 case CTDB_CONTROL_SET_BAN_STATE
:
622 ctdb_ban_state_push(cd
->data
.ban_state
, buf
);
625 case CTDB_CONTROL_REGISTER_NOTIFY
:
626 ctdb_notify_data_push(cd
->data
.notify
, buf
);
629 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
630 ctdb_uint64_push(cd
->data
.srvid
, buf
);
633 case CTDB_CONTROL_TRANS3_COMMIT
:
634 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
637 case CTDB_CONTROL_GET_DB_SEQNUM
:
638 u64
= cd
->data
.db_id
;
639 ctdb_uint64_push(u64
, buf
);
642 case CTDB_CONTROL_DB_SET_HEALTHY
:
643 ctdb_uint32_push(cd
->data
.db_id
, buf
);
646 case CTDB_CONTROL_DB_GET_HEALTH
:
647 ctdb_uint32_push(cd
->data
.db_id
, buf
);
650 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
651 ctdb_sock_addr_push(cd
->data
.addr
, buf
);
654 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
655 ctdb_iface_push(cd
->data
.iface
, buf
);
658 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
659 ctdb_connection_push(cd
->data
.conn
, buf
);
662 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
663 ctdb_key_data_push(cd
->data
.key
, buf
);
666 case CTDB_CONTROL_SET_DB_READONLY
:
667 ctdb_uint32_push(cd
->data
.db_id
, buf
);
670 case CTDB_CONTROL_CHECK_SRVIDS
:
671 ctdb_uint64_array_push(cd
->data
.u64_array
, buf
);
674 case CTDB_CONTROL_TRAVERSE_START_EXT
:
675 ctdb_traverse_start_ext_push(cd
->data
.traverse_start_ext
, buf
);
678 case CTDB_CONTROL_GET_DB_STATISTICS
:
679 ctdb_uint32_push(cd
->data
.db_id
, buf
);
682 case CTDB_CONTROL_SET_DB_STICKY
:
683 ctdb_uint32_push(cd
->data
.db_id
, buf
);
686 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
687 ctdb_traverse_all_ext_push(cd
->data
.traverse_all_ext
, buf
);
690 case CTDB_CONTROL_RECEIVE_RECORDS
:
691 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
694 case CTDB_CONTROL_DB_DETACH
:
695 ctdb_uint32_push(cd
->data
.db_id
, buf
);
698 case CTDB_CONTROL_DB_FREEZE
:
699 ctdb_uint32_push(cd
->data
.db_id
, buf
);
702 case CTDB_CONTROL_DB_THAW
:
703 ctdb_uint32_push(cd
->data
.db_id
, buf
);
706 case CTDB_CONTROL_DB_TRANSACTION_START
:
707 ctdb_transdb_push(cd
->data
.transdb
, buf
);
710 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
711 ctdb_transdb_push(cd
->data
.transdb
, buf
);
714 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
715 ctdb_uint32_push(cd
->data
.db_id
, buf
);
718 case CTDB_CONTROL_DB_PULL
:
719 ctdb_pulldb_ext_push(cd
->data
.pulldb_ext
, buf
);
722 case CTDB_CONTROL_DB_PUSH_START
:
723 ctdb_pulldb_ext_push(cd
->data
.pulldb_ext
, buf
);
726 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
727 ctdb_uint32_push(cd
->data
.db_id
, buf
);
732 static int ctdb_req_control_data_pull(uint8_t *buf
, size_t buflen
,
735 struct ctdb_req_control_data
*cd
)
743 case CTDB_CONTROL_PROCESS_EXISTS
:
744 ret
= ctdb_pid_pull(buf
, buflen
, mem_ctx
,
748 case CTDB_CONTROL_GETDBPATH
:
749 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
753 case CTDB_CONTROL_SETVNNMAP
:
754 ret
= ctdb_vnn_map_pull(buf
, buflen
, mem_ctx
,
758 case CTDB_CONTROL_SET_DEBUG
:
759 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
763 case CTDB_CONTROL_PULL_DB
:
764 ret
= ctdb_pulldb_pull(buf
, buflen
, mem_ctx
,
768 case CTDB_CONTROL_PUSH_DB
:
769 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
773 case CTDB_CONTROL_SET_RECMODE
:
774 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
778 case CTDB_CONTROL_DB_ATTACH
:
779 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
783 case CTDB_CONTROL_SET_CALL
:
786 case CTDB_CONTROL_TRAVERSE_START
:
787 ret
= ctdb_traverse_start_pull(buf
, buflen
, mem_ctx
,
788 &cd
->data
.traverse_start
);
791 case CTDB_CONTROL_TRAVERSE_ALL
:
792 ret
= ctdb_traverse_all_pull(buf
, buflen
, mem_ctx
,
793 &cd
->data
.traverse_all
);
796 case CTDB_CONTROL_TRAVERSE_DATA
:
797 ret
= ctdb_rec_data_pull(buf
, buflen
, mem_ctx
,
801 case CTDB_CONTROL_GET_DBNAME
:
802 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
806 case CTDB_CONTROL_ENABLE_SEQNUM
:
807 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
811 case CTDB_CONTROL_UPDATE_SEQNUM
:
812 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
816 case CTDB_CONTROL_SET_RECMASTER
:
817 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
818 &cd
->data
.recmaster
);
821 case CTDB_CONTROL_TCP_CLIENT
:
822 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
826 case CTDB_CONTROL_TCP_ADD
:
827 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
831 case CTDB_CONTROL_TCP_REMOVE
:
832 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
836 case CTDB_CONTROL_SET_TUNABLE
:
837 ret
= ctdb_tunable_pull(buf
, buflen
, mem_ctx
,
841 case CTDB_CONTROL_GET_TUNABLE
:
842 ret
= ctdb_stringn_pull(buf
, buflen
, mem_ctx
,
846 case CTDB_CONTROL_MODIFY_FLAGS
:
847 ret
= ctdb_node_flag_change_pull(buf
, buflen
, mem_ctx
,
848 &cd
->data
.flag_change
);
851 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
852 ret
= ctdb_sock_addr_pull(buf
, buflen
, mem_ctx
,
856 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
857 ret
= ctdb_tickle_list_pull(buf
, buflen
, mem_ctx
,
861 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
862 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
866 case CTDB_CONTROL_UPDATE_RECORD
:
867 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
871 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
872 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
873 &cd
->data
.addr_info
);
876 case CTDB_CONTROL_WIPE_DATABASE
:
877 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
881 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
882 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
886 case CTDB_CONTROL_ADD_PUBLIC_IP
:
887 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
888 &cd
->data
.addr_info
);
891 case CTDB_CONTROL_DEL_PUBLIC_IP
:
892 ret
= ctdb_addr_info_pull(buf
, buflen
, mem_ctx
,
893 &cd
->data
.addr_info
);
896 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
897 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
898 &cd
->data
.event_str
);
901 case CTDB_CONTROL_RELEASE_IP
:
902 ret
= ctdb_public_ip_pull(buf
, buflen
, mem_ctx
,
906 case CTDB_CONTROL_TAKEOVER_IP
:
907 ret
= ctdb_public_ip_pull(buf
, buflen
, mem_ctx
,
911 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
912 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
916 case CTDB_CONTROL_TRAVERSE_KILL
:
917 ret
= ctdb_traverse_start_pull(buf
, buflen
, mem_ctx
,
918 &cd
->data
.traverse_start
);
921 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
922 ret
= ctdb_double_pull(buf
, buflen
, mem_ctx
,
923 &cd
->data
.reclock_latency
);
926 case CTDB_CONTROL_SET_LMASTERROLE
:
927 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
931 case CTDB_CONTROL_SET_RECMASTERROLE
:
932 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
936 case CTDB_CONTROL_ENABLE_SCRIPT
:
937 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
941 case CTDB_CONTROL_DISABLE_SCRIPT
:
942 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
946 case CTDB_CONTROL_SET_BAN_STATE
:
947 ret
= ctdb_ban_state_pull(buf
, buflen
, mem_ctx
,
948 &cd
->data
.ban_state
);
951 case CTDB_CONTROL_REGISTER_NOTIFY
:
952 ret
= ctdb_notify_data_pull(buf
, buflen
, mem_ctx
,
956 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
957 ctdb_uint64_pull(buf
, buflen
, mem_ctx
,
961 case CTDB_CONTROL_TRANS3_COMMIT
:
962 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
966 case CTDB_CONTROL_GET_DB_SEQNUM
:
967 ret
= ctdb_uint64_pull(buf
, buflen
, mem_ctx
, &u64
);
968 cd
->data
.db_id
= (uint32_t)u64
;
971 case CTDB_CONTROL_DB_SET_HEALTHY
:
972 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
976 case CTDB_CONTROL_DB_GET_HEALTH
:
977 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
981 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
982 ret
= ctdb_sock_addr_pull(buf
, buflen
, mem_ctx
,
986 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
987 ret
= ctdb_iface_pull(buf
, buflen
, mem_ctx
,
991 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
992 ret
= ctdb_connection_pull(buf
, buflen
, mem_ctx
,
996 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
997 ret
= ctdb_key_data_pull(buf
, buflen
, mem_ctx
,
1001 case CTDB_CONTROL_SET_DB_READONLY
:
1002 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1006 case CTDB_CONTROL_CHECK_SRVIDS
:
1007 ret
= ctdb_uint64_array_pull(buf
, buflen
, mem_ctx
,
1008 &cd
->data
.u64_array
);
1011 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1012 ret
= ctdb_traverse_start_ext_pull(buf
, buflen
, mem_ctx
,
1013 &cd
->data
.traverse_start_ext
);
1016 case CTDB_CONTROL_GET_DB_STATISTICS
:
1017 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1021 case CTDB_CONTROL_SET_DB_STICKY
:
1022 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1026 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1027 ret
= ctdb_traverse_all_ext_pull(buf
, buflen
, mem_ctx
,
1028 &cd
->data
.traverse_all_ext
);
1031 case CTDB_CONTROL_RECEIVE_RECORDS
:
1032 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1036 case CTDB_CONTROL_DB_DETACH
:
1037 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1041 case CTDB_CONTROL_DB_FREEZE
:
1042 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1046 case CTDB_CONTROL_DB_THAW
:
1047 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1051 case CTDB_CONTROL_DB_TRANSACTION_START
:
1052 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
1056 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
1057 ret
= ctdb_transdb_pull(buf
, buflen
, mem_ctx
,
1061 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
1062 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1066 case CTDB_CONTROL_DB_PULL
:
1067 ret
= ctdb_pulldb_ext_pull(buf
, buflen
, mem_ctx
,
1068 &cd
->data
.pulldb_ext
);
1071 case CTDB_CONTROL_DB_PUSH_START
:
1072 ret
= ctdb_pulldb_ext_pull(buf
, buflen
, mem_ctx
,
1073 &cd
->data
.pulldb_ext
);
1076 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1077 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1085 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data
*cd
)
1093 switch (cd
->opcode
) {
1094 case CTDB_CONTROL_PROCESS_EXISTS
:
1097 case CTDB_CONTROL_STATISTICS
:
1098 len
= ctdb_statistics_len(cd
->data
.stats
);
1101 case CTDB_CONTROL_PING
:
1104 case CTDB_CONTROL_GETDBPATH
:
1105 len
= ctdb_string_len(cd
->data
.db_path
);
1108 case CTDB_CONTROL_GETVNNMAP
:
1109 len
= ctdb_vnn_map_len(cd
->data
.vnnmap
);
1112 case CTDB_CONTROL_SETVNNMAP
:
1115 case CTDB_CONTROL_GET_DEBUG
:
1116 len
= ctdb_uint32_len(cd
->data
.loglevel
);
1119 case CTDB_CONTROL_SET_DEBUG
:
1122 case CTDB_CONTROL_GET_DBMAP
:
1123 len
= ctdb_dbid_map_len(cd
->data
.dbmap
);
1126 case CTDB_CONTROL_PULL_DB
:
1127 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1130 case CTDB_CONTROL_PUSH_DB
:
1133 case CTDB_CONTROL_GET_RECMODE
:
1136 case CTDB_CONTROL_SET_RECMODE
:
1139 case CTDB_CONTROL_STATISTICS_RESET
:
1142 case CTDB_CONTROL_DB_ATTACH
:
1143 len
= ctdb_uint32_len(cd
->data
.db_id
);
1146 case CTDB_CONTROL_SET_CALL
:
1149 case CTDB_CONTROL_TRAVERSE_START
:
1152 case CTDB_CONTROL_TRAVERSE_ALL
:
1155 case CTDB_CONTROL_TRAVERSE_DATA
:
1158 case CTDB_CONTROL_REGISTER_SRVID
:
1161 case CTDB_CONTROL_DEREGISTER_SRVID
:
1164 case CTDB_CONTROL_GET_DBNAME
:
1165 len
= ctdb_string_len(cd
->data
.db_name
);
1168 case CTDB_CONTROL_ENABLE_SEQNUM
:
1171 case CTDB_CONTROL_UPDATE_SEQNUM
:
1174 case CTDB_CONTROL_DUMP_MEMORY
:
1175 len
= ctdb_string_len(cd
->data
.mem_str
);
1178 case CTDB_CONTROL_GET_PID
:
1181 case CTDB_CONTROL_GET_RECMASTER
:
1184 case CTDB_CONTROL_SET_RECMASTER
:
1187 case CTDB_CONTROL_FREEZE
:
1190 case CTDB_CONTROL_GET_PNN
:
1193 case CTDB_CONTROL_SHUTDOWN
:
1196 case CTDB_CONTROL_GET_MONMODE
:
1199 case CTDB_CONTROL_TCP_CLIENT
:
1202 case CTDB_CONTROL_TCP_ADD
:
1205 case CTDB_CONTROL_TCP_REMOVE
:
1208 case CTDB_CONTROL_STARTUP
:
1211 case CTDB_CONTROL_SET_TUNABLE
:
1214 case CTDB_CONTROL_GET_TUNABLE
:
1215 len
= ctdb_uint32_len(cd
->data
.tun_value
);
1218 case CTDB_CONTROL_LIST_TUNABLES
:
1219 len
= ctdb_var_list_len(cd
->data
.tun_var_list
);
1222 case CTDB_CONTROL_MODIFY_FLAGS
:
1225 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1226 len
= ctdb_tunable_list_len(cd
->data
.tun_list
);
1229 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1230 len
= ctdb_tickle_list_len(cd
->data
.tickles
);
1233 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
1236 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1237 len
= ctdb_uint32_len(cd
->data
.db_id
);
1240 case CTDB_CONTROL_UPDATE_RECORD
:
1243 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
1246 case CTDB_CONTROL_WIPE_DATABASE
:
1249 case CTDB_CONTROL_UPTIME
:
1250 len
= ctdb_uptime_len(cd
->data
.uptime
);
1253 case CTDB_CONTROL_START_RECOVERY
:
1256 case CTDB_CONTROL_END_RECOVERY
:
1259 case CTDB_CONTROL_RELOAD_NODES_FILE
:
1262 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1263 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1266 case CTDB_CONTROL_ENABLE_MONITOR
:
1269 case CTDB_CONTROL_DISABLE_MONITOR
:
1272 case CTDB_CONTROL_ADD_PUBLIC_IP
:
1275 case CTDB_CONTROL_DEL_PUBLIC_IP
:
1278 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
1281 case CTDB_CONTROL_GET_CAPABILITIES
:
1282 len
= ctdb_uint32_len(cd
->data
.caps
);
1285 case CTDB_CONTROL_RECD_PING
:
1288 case CTDB_CONTROL_RELEASE_IP
:
1291 case CTDB_CONTROL_TAKEOVER_IP
:
1294 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1295 len
= ctdb_public_ip_list_len(cd
->data
.pubip_list
);
1298 case CTDB_CONTROL_GET_NODEMAP
:
1299 len
= ctdb_node_map_len(cd
->data
.nodemap
);
1302 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1303 len
= ctdb_script_list_len(cd
->data
.script_list
);
1306 case CTDB_CONTROL_TRAVERSE_KILL
:
1309 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
1312 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1313 len
= ctdb_string_len(cd
->data
.reclock_file
);
1316 case CTDB_CONTROL_STOP_NODE
:
1319 case CTDB_CONTROL_CONTINUE_NODE
:
1322 case CTDB_CONTROL_SET_LMASTERROLE
:
1325 case CTDB_CONTROL_SET_RECMASTERROLE
:
1328 case CTDB_CONTROL_ENABLE_SCRIPT
:
1331 case CTDB_CONTROL_DISABLE_SCRIPT
:
1334 case CTDB_CONTROL_SET_BAN_STATE
:
1337 case CTDB_CONTROL_GET_BAN_STATE
:
1338 len
= ctdb_ban_state_len(cd
->data
.ban_state
);
1341 case CTDB_CONTROL_SET_DB_PRIORITY
:
1344 case CTDB_CONTROL_GET_DB_PRIORITY
:
1347 case CTDB_CONTROL_REGISTER_NOTIFY
:
1350 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
1353 case CTDB_CONTROL_TRANS3_COMMIT
:
1356 case CTDB_CONTROL_GET_DB_SEQNUM
:
1357 len
= ctdb_uint64_len(cd
->data
.seqnum
);
1360 case CTDB_CONTROL_DB_SET_HEALTHY
:
1363 case CTDB_CONTROL_DB_GET_HEALTH
:
1364 len
= ctdb_string_len(cd
->data
.reason
);
1367 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1368 len
= ctdb_public_ip_info_len(cd
->data
.ipinfo
);
1371 case CTDB_CONTROL_GET_IFACES
:
1372 len
= ctdb_iface_list_len(cd
->data
.iface_list
);
1375 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
1378 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
1381 case CTDB_CONTROL_GET_STAT_HISTORY
:
1382 len
= ctdb_statistics_list_len(cd
->data
.stats_list
);
1385 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
1388 case CTDB_CONTROL_SET_DB_READONLY
:
1391 case CTDB_CONTROL_CHECK_SRVIDS
:
1392 len
= ctdb_uint8_array_len(cd
->data
.u8_array
);
1395 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1398 case CTDB_CONTROL_GET_DB_STATISTICS
:
1399 len
= ctdb_db_statistics_len(cd
->data
.dbstats
);
1402 case CTDB_CONTROL_SET_DB_STICKY
:
1405 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
1408 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1411 case CTDB_CONTROL_RECEIVE_RECORDS
:
1412 len
= ctdb_rec_buffer_len(cd
->data
.recbuf
);
1415 case CTDB_CONTROL_IPREALLOCATED
:
1418 case CTDB_CONTROL_GET_RUNSTATE
:
1419 len
= ctdb_uint32_len(cd
->data
.runstate
);
1422 case CTDB_CONTROL_DB_DETACH
:
1425 case CTDB_CONTROL_GET_NODES_FILE
:
1426 len
= ctdb_node_map_len(cd
->data
.nodemap
);
1429 case CTDB_CONTROL_DB_FREEZE
:
1432 case CTDB_CONTROL_DB_THAW
:
1435 case CTDB_CONTROL_DB_TRANSACTION_START
:
1438 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
1441 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
1444 case CTDB_CONTROL_DB_PULL
:
1445 len
= ctdb_uint32_len(cd
->data
.num_records
);
1448 case CTDB_CONTROL_DB_PUSH_START
:
1451 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1452 len
= ctdb_uint32_len(cd
->data
.num_records
);
1459 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data
*cd
,
1462 switch (cd
->opcode
) {
1463 case CTDB_CONTROL_STATISTICS
:
1464 ctdb_statistics_push(cd
->data
.stats
, buf
);
1467 case CTDB_CONTROL_GETDBPATH
:
1468 ctdb_string_push(cd
->data
.db_path
, buf
);
1471 case CTDB_CONTROL_GETVNNMAP
:
1472 ctdb_vnn_map_push(cd
->data
.vnnmap
, buf
);
1475 case CTDB_CONTROL_GET_DEBUG
:
1476 ctdb_uint32_push(cd
->data
.loglevel
, buf
);
1479 case CTDB_CONTROL_GET_DBMAP
:
1480 ctdb_dbid_map_push(cd
->data
.dbmap
, buf
);
1483 case CTDB_CONTROL_PULL_DB
:
1484 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1487 case CTDB_CONTROL_PUSH_DB
:
1490 case CTDB_CONTROL_DB_ATTACH
:
1491 ctdb_uint32_push(cd
->data
.db_id
, buf
);
1494 case CTDB_CONTROL_GET_DBNAME
:
1495 ctdb_string_push(cd
->data
.db_name
, buf
);
1498 case CTDB_CONTROL_DUMP_MEMORY
:
1499 ctdb_string_push(cd
->data
.mem_str
, buf
);
1502 case CTDB_CONTROL_GET_PID
:
1505 case CTDB_CONTROL_GET_RECMASTER
:
1508 case CTDB_CONTROL_GET_TUNABLE
:
1509 ctdb_uint32_push(cd
->data
.tun_value
, buf
);
1512 case CTDB_CONTROL_LIST_TUNABLES
:
1513 ctdb_var_list_push(cd
->data
.tun_var_list
, buf
);
1516 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1517 ctdb_tunable_list_push(cd
->data
.tun_list
, buf
);
1520 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1521 ctdb_tickle_list_push(cd
->data
.tickles
, buf
);
1524 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1525 ctdb_uint32_push(cd
->data
.db_id
, buf
);
1528 case CTDB_CONTROL_UPTIME
:
1529 ctdb_uptime_push(cd
->data
.uptime
, buf
);
1532 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1533 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1536 case CTDB_CONTROL_GET_CAPABILITIES
:
1537 ctdb_uint32_push(cd
->data
.caps
, buf
);
1540 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1541 ctdb_public_ip_list_push(cd
->data
.pubip_list
, buf
);
1544 case CTDB_CONTROL_GET_NODEMAP
:
1545 ctdb_node_map_push(cd
->data
.nodemap
, buf
);
1548 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1549 ctdb_script_list_push(cd
->data
.script_list
, buf
);
1552 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1553 ctdb_string_push(cd
->data
.reclock_file
, buf
);
1556 case CTDB_CONTROL_GET_BAN_STATE
:
1557 ctdb_ban_state_push(cd
->data
.ban_state
, buf
);
1560 case CTDB_CONTROL_GET_DB_PRIORITY
:
1563 case CTDB_CONTROL_GET_DB_SEQNUM
:
1564 ctdb_uint64_push(cd
->data
.seqnum
, buf
);
1567 case CTDB_CONTROL_DB_GET_HEALTH
:
1568 ctdb_string_push(cd
->data
.reason
, buf
);
1571 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1572 ctdb_public_ip_info_push(cd
->data
.ipinfo
, buf
);
1575 case CTDB_CONTROL_GET_IFACES
:
1576 ctdb_iface_list_push(cd
->data
.iface_list
, buf
);
1579 case CTDB_CONTROL_GET_STAT_HISTORY
:
1580 ctdb_statistics_list_push(cd
->data
.stats_list
, buf
);
1583 case CTDB_CONTROL_CHECK_SRVIDS
:
1584 ctdb_uint8_array_push(cd
->data
.u8_array
, buf
);
1587 case CTDB_CONTROL_GET_DB_STATISTICS
:
1588 ctdb_db_statistics_push(cd
->data
.dbstats
, buf
);
1591 case CTDB_CONTROL_RECEIVE_RECORDS
:
1592 ctdb_rec_buffer_push(cd
->data
.recbuf
, buf
);
1595 case CTDB_CONTROL_GET_RUNSTATE
:
1596 ctdb_uint32_push(cd
->data
.runstate
, buf
);
1599 case CTDB_CONTROL_GET_NODES_FILE
:
1600 ctdb_node_map_push(cd
->data
.nodemap
, buf
);
1603 case CTDB_CONTROL_DB_PULL
:
1604 ctdb_uint32_push(cd
->data
.num_records
, buf
);
1607 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1608 ctdb_uint32_push(cd
->data
.num_records
, buf
);
1613 static int ctdb_reply_control_data_pull(uint8_t *buf
, size_t buflen
,
1614 uint32_t opcode
, TALLOC_CTX
*mem_ctx
,
1615 struct ctdb_reply_control_data
*cd
)
1618 cd
->opcode
= opcode
;
1621 case CTDB_CONTROL_STATISTICS
:
1622 ret
= ctdb_statistics_pull(buf
, buflen
, mem_ctx
,
1626 case CTDB_CONTROL_GETDBPATH
:
1627 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1631 case CTDB_CONTROL_GETVNNMAP
:
1632 ret
= ctdb_vnn_map_pull(buf
, buflen
, mem_ctx
,
1636 case CTDB_CONTROL_GET_DEBUG
:
1637 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1638 &cd
->data
.loglevel
);
1641 case CTDB_CONTROL_GET_DBMAP
:
1642 ret
= ctdb_dbid_map_pull(buf
, buflen
, mem_ctx
,
1646 case CTDB_CONTROL_PULL_DB
:
1647 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1651 case CTDB_CONTROL_PUSH_DB
:
1654 case CTDB_CONTROL_DB_ATTACH
:
1655 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1659 case CTDB_CONTROL_GET_DBNAME
:
1660 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1664 case CTDB_CONTROL_DUMP_MEMORY
:
1665 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1669 case CTDB_CONTROL_GET_PID
:
1672 case CTDB_CONTROL_GET_RECMASTER
:
1675 case CTDB_CONTROL_GET_TUNABLE
:
1676 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1677 &cd
->data
.tun_value
);
1680 case CTDB_CONTROL_LIST_TUNABLES
:
1681 ret
= ctdb_var_list_pull(buf
, buflen
, mem_ctx
,
1682 &cd
->data
.tun_var_list
);
1685 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1686 ret
= ctdb_tunable_list_pull(buf
, buflen
, mem_ctx
,
1687 &cd
->data
.tun_list
);
1690 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1691 ret
= ctdb_tickle_list_pull(buf
, buflen
, mem_ctx
,
1695 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1696 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1700 case CTDB_CONTROL_UPTIME
:
1701 ret
= ctdb_uptime_pull(buf
, buflen
, mem_ctx
,
1705 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1706 ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1710 case CTDB_CONTROL_GET_CAPABILITIES
:
1711 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1715 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1716 ret
= ctdb_public_ip_list_pull(buf
, buflen
, mem_ctx
,
1717 &cd
->data
.pubip_list
);
1720 case CTDB_CONTROL_GET_NODEMAP
:
1721 ret
= ctdb_node_map_pull(buf
, buflen
, mem_ctx
,
1725 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1726 ret
= ctdb_script_list_pull(buf
, buflen
, mem_ctx
,
1727 &cd
->data
.script_list
);
1730 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1731 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1732 &cd
->data
.reclock_file
);
1735 case CTDB_CONTROL_GET_BAN_STATE
:
1736 ret
= ctdb_ban_state_pull(buf
, buflen
, mem_ctx
,
1737 &cd
->data
.ban_state
);
1740 case CTDB_CONTROL_GET_DB_PRIORITY
:
1743 case CTDB_CONTROL_GET_DB_SEQNUM
:
1744 ret
= ctdb_uint64_pull(buf
, buflen
, mem_ctx
,
1748 case CTDB_CONTROL_DB_GET_HEALTH
:
1749 ret
= ctdb_string_pull(buf
, buflen
, mem_ctx
,
1753 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1754 ret
= ctdb_public_ip_info_pull(buf
, buflen
, mem_ctx
,
1758 case CTDB_CONTROL_GET_IFACES
:
1759 ret
= ctdb_iface_list_pull(buf
, buflen
, mem_ctx
,
1760 &cd
->data
.iface_list
);
1763 case CTDB_CONTROL_GET_STAT_HISTORY
:
1764 ret
= ctdb_statistics_list_pull(buf
, buflen
, mem_ctx
,
1765 &cd
->data
.stats_list
);
1768 case CTDB_CONTROL_CHECK_SRVIDS
:
1769 ret
= ctdb_uint8_array_pull(buf
, buflen
, mem_ctx
,
1770 &cd
->data
.u8_array
);
1773 case CTDB_CONTROL_GET_DB_STATISTICS
:
1774 ret
= ctdb_db_statistics_pull(buf
, buflen
, mem_ctx
,
1778 case CTDB_CONTROL_RECEIVE_RECORDS
:
1779 ret
= ctdb_rec_buffer_pull(buf
, buflen
, mem_ctx
,
1783 case CTDB_CONTROL_GET_RUNSTATE
:
1784 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1785 &cd
->data
.runstate
);
1788 case CTDB_CONTROL_GET_NODES_FILE
:
1789 ret
= ctdb_node_map_pull(buf
, buflen
, mem_ctx
,
1793 case CTDB_CONTROL_DB_PULL
:
1794 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1795 &cd
->data
.num_records
);
1798 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1799 ret
= ctdb_uint32_pull(buf
, buflen
, mem_ctx
,
1800 &cd
->data
.num_records
);
1807 size_t ctdb_req_control_len(struct ctdb_req_header
*h
,
1808 struct ctdb_req_control
*c
)
1810 return offsetof(struct ctdb_req_control_wire
, data
) +
1811 ctdb_req_control_data_len(&c
->rdata
);
1814 int ctdb_req_control_push(struct ctdb_req_header
*h
,
1815 struct ctdb_req_control
*request
,
1816 uint8_t *buf
, size_t *buflen
)
1818 struct ctdb_req_control_wire
*wire
=
1819 (struct ctdb_req_control_wire
*)buf
;
1822 length
= ctdb_req_control_len(h
, request
);
1823 if (*buflen
< length
) {
1828 h
->length
= *buflen
;
1829 ctdb_req_header_push(h
, (uint8_t *)&wire
->hdr
);
1831 wire
->opcode
= request
->opcode
;
1832 wire
->pad
= request
->pad
;
1833 wire
->srvid
= request
->srvid
;
1834 wire
->client_id
= request
->client_id
;
1835 wire
->flags
= request
->flags
;
1837 wire
->datalen
= ctdb_req_control_data_len(&request
->rdata
);
1838 ctdb_req_control_data_push(&request
->rdata
, wire
->data
);
1843 int ctdb_req_control_pull(uint8_t *buf
, size_t buflen
,
1844 struct ctdb_req_header
*h
,
1845 TALLOC_CTX
*mem_ctx
,
1846 struct ctdb_req_control
*c
)
1848 struct ctdb_req_control_wire
*wire
=
1849 (struct ctdb_req_control_wire
*)buf
;
1853 length
= offsetof(struct ctdb_req_control_wire
, data
);
1854 if (buflen
< length
) {
1857 if (wire
->datalen
> buflen
) {
1860 if (length
+ wire
->datalen
< length
) {
1863 if (buflen
< length
+ wire
->datalen
) {
1868 ret
= ctdb_req_header_pull((uint8_t *)&wire
->hdr
, buflen
, h
);
1874 c
->opcode
= wire
->opcode
;
1876 c
->srvid
= wire
->srvid
;
1877 c
->client_id
= wire
->client_id
;
1878 c
->flags
= wire
->flags
;
1880 ret
= ctdb_req_control_data_pull(wire
->data
, wire
->datalen
,
1881 c
->opcode
, mem_ctx
, &c
->rdata
);
1889 size_t ctdb_reply_control_len(struct ctdb_req_header
*h
,
1890 struct ctdb_reply_control
*c
)
1892 return offsetof(struct ctdb_reply_control_wire
, data
) +
1894 ctdb_reply_control_data_len(&c
->rdata
) :
1895 ctdb_string_len(c
->errmsg
));
1898 int ctdb_reply_control_push(struct ctdb_req_header
*h
,
1899 struct ctdb_reply_control
*reply
,
1900 uint8_t *buf
, size_t *buflen
)
1902 struct ctdb_reply_control_wire
*wire
=
1903 (struct ctdb_reply_control_wire
*)buf
;
1906 length
= ctdb_reply_control_len(h
, reply
);
1907 if (*buflen
< length
) {
1912 h
->length
= *buflen
;
1913 ctdb_req_header_push(h
, (uint8_t *)&wire
->hdr
);
1915 wire
->status
= reply
->status
;
1917 if (reply
->status
== 0) {
1918 wire
->datalen
= ctdb_reply_control_data_len(&reply
->rdata
);
1920 ctdb_reply_control_data_push(&reply
->rdata
, wire
->data
);
1923 wire
->errorlen
= ctdb_string_len(reply
->errmsg
);
1924 ctdb_string_push(reply
->errmsg
, wire
->data
+ wire
->datalen
);
1930 int ctdb_reply_control_pull(uint8_t *buf
, size_t buflen
, uint32_t opcode
,
1931 struct ctdb_req_header
*h
,
1932 TALLOC_CTX
*mem_ctx
,
1933 struct ctdb_reply_control
*c
)
1935 struct ctdb_reply_control_wire
*wire
=
1936 (struct ctdb_reply_control_wire
*)buf
;
1940 length
= offsetof(struct ctdb_reply_control_wire
, data
);
1941 if (buflen
< length
) {
1944 if (wire
->datalen
> buflen
|| wire
->errorlen
> buflen
) {
1947 if (length
+ wire
->datalen
< length
) {
1950 if (length
+ wire
->datalen
+ wire
->errorlen
< length
) {
1953 if (buflen
< length
+ wire
->datalen
+ wire
->errorlen
) {
1958 ret
= ctdb_req_header_pull((uint8_t *)&wire
->hdr
, buflen
, h
);
1964 c
->status
= wire
->status
;
1966 if (c
->status
!= -1) {
1967 ret
= ctdb_reply_control_data_pull(wire
->data
, wire
->datalen
,
1975 ret
= ctdb_string_pull(wire
->data
+ wire
->datalen
, wire
->errorlen
,
1976 mem_ctx
, &c
->errmsg
);