nbt_server: Fix a typo ("domian->domain")
[Samba.git] / ctdb / protocol / protocol_control.c
blob12a78e1792d10dcf01f460c21b9ba52c1c429c23
1 /*
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/>.
20 #include "replace.h"
21 #include "system/network.h"
23 #include <talloc.h>
24 #include <tdb.h>
26 #include "protocol.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)
32 size_t len = 0;
33 uint32_t u32;
35 if (cd == NULL) {
36 return 0;
39 switch (cd->opcode) {
40 case CTDB_CONTROL_PROCESS_EXISTS:
41 len = ctdb_pid_len(&cd->data.pid);
42 break;
44 case CTDB_CONTROL_STATISTICS:
45 break;
47 case CTDB_CONTROL_PING:
48 break;
50 case CTDB_CONTROL_GETDBPATH:
51 len = ctdb_uint32_len(&cd->data.db_id);
52 break;
54 case CTDB_CONTROL_GETVNNMAP:
55 break;
57 case CTDB_CONTROL_SETVNNMAP:
58 len = ctdb_vnn_map_len(cd->data.vnnmap);
59 break;
61 case CTDB_CONTROL_GET_DEBUG:
62 break;
64 case CTDB_CONTROL_SET_DEBUG:
65 len = ctdb_uint32_len(&cd->data.loglevel);
66 break;
68 case CTDB_CONTROL_GET_DBMAP:
69 break;
71 case CTDB_CONTROL_PULL_DB:
72 len = ctdb_pulldb_len(cd->data.pulldb);
73 break;
75 case CTDB_CONTROL_PUSH_DB:
76 len = ctdb_rec_buffer_len(cd->data.recbuf);
77 break;
79 case CTDB_CONTROL_GET_RECMODE:
80 break;
82 case CTDB_CONTROL_SET_RECMODE:
83 len = ctdb_uint32_len(&cd->data.recmode);
84 break;
86 case CTDB_CONTROL_STATISTICS_RESET:
87 break;
89 case CTDB_CONTROL_DB_ATTACH:
90 len = ctdb_string_len(&cd->data.db_name);
91 break;
93 case CTDB_CONTROL_SET_CALL:
94 break;
96 case CTDB_CONTROL_TRAVERSE_START:
97 len = ctdb_traverse_start_len(cd->data.traverse_start);
98 break;
100 case CTDB_CONTROL_TRAVERSE_ALL:
101 len = ctdb_traverse_all_len(cd->data.traverse_all);
102 break;
104 case CTDB_CONTROL_TRAVERSE_DATA:
105 len = ctdb_rec_data_len(cd->data.rec_data);
106 break;
108 case CTDB_CONTROL_REGISTER_SRVID:
109 break;
111 case CTDB_CONTROL_DEREGISTER_SRVID:
112 break;
114 case CTDB_CONTROL_GET_DBNAME:
115 len = ctdb_uint32_len(&cd->data.db_id);
116 break;
118 case CTDB_CONTROL_ENABLE_SEQNUM:
119 len = ctdb_uint32_len(&cd->data.db_id);
120 break;
122 case CTDB_CONTROL_UPDATE_SEQNUM:
123 len = ctdb_uint32_len(&cd->data.db_id);
124 break;
126 case CTDB_CONTROL_DUMP_MEMORY:
127 break;
129 case CTDB_CONTROL_GET_PID:
130 break;
132 case CTDB_CONTROL_GET_RECMASTER:
133 break;
135 case CTDB_CONTROL_SET_RECMASTER:
136 len = ctdb_uint32_len(&cd->data.recmaster);
137 break;
139 case CTDB_CONTROL_FREEZE:
140 break;
142 case CTDB_CONTROL_GET_PNN:
143 break;
145 case CTDB_CONTROL_SHUTDOWN:
146 break;
148 case CTDB_CONTROL_GET_MONMODE:
149 break;
151 case CTDB_CONTROL_TCP_CLIENT:
152 len = ctdb_connection_len(cd->data.conn);
153 break;
155 case CTDB_CONTROL_TCP_ADD:
156 len = ctdb_connection_len(cd->data.conn);
157 break;
159 case CTDB_CONTROL_TCP_REMOVE:
160 len = ctdb_connection_len(cd->data.conn);
161 break;
163 case CTDB_CONTROL_STARTUP:
164 break;
166 case CTDB_CONTROL_SET_TUNABLE:
167 len = ctdb_tunable_len(cd->data.tunable);
168 break;
170 case CTDB_CONTROL_GET_TUNABLE:
171 len = ctdb_stringn_len(&cd->data.tun_var);
172 break;
174 case CTDB_CONTROL_LIST_TUNABLES:
175 break;
177 case CTDB_CONTROL_MODIFY_FLAGS:
178 len = ctdb_node_flag_change_len(cd->data.flag_change);
179 break;
181 case CTDB_CONTROL_GET_ALL_TUNABLES:
182 break;
184 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
185 len = ctdb_sock_addr_len(cd->data.addr);
186 break;
188 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
189 len = ctdb_tickle_list_len(cd->data.tickles);
190 break;
192 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
193 len = ctdb_string_len(&cd->data.db_name);
194 break;
196 case CTDB_CONTROL_UPDATE_RECORD:
197 len = ctdb_rec_buffer_len(cd->data.recbuf);
198 break;
200 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
201 len = ctdb_addr_info_len(cd->data.addr_info);
202 break;
204 case CTDB_CONTROL_WIPE_DATABASE:
205 len = ctdb_transdb_len(cd->data.transdb);
206 break;
208 case CTDB_CONTROL_UPTIME:
209 break;
211 case CTDB_CONTROL_START_RECOVERY:
212 break;
214 case CTDB_CONTROL_END_RECOVERY:
215 break;
217 case CTDB_CONTROL_RELOAD_NODES_FILE:
218 break;
220 case CTDB_CONTROL_TRY_DELETE_RECORDS:
221 len = ctdb_rec_buffer_len(cd->data.recbuf);
222 break;
224 case CTDB_CONTROL_ENABLE_MONITOR:
225 break;
227 case CTDB_CONTROL_DISABLE_MONITOR:
228 break;
230 case CTDB_CONTROL_ADD_PUBLIC_IP:
231 len = ctdb_addr_info_len(cd->data.addr_info);
232 break;
234 case CTDB_CONTROL_DEL_PUBLIC_IP:
235 len = ctdb_addr_info_len(cd->data.addr_info);
236 break;
238 case CTDB_CONTROL_GET_CAPABILITIES:
239 break;
241 case CTDB_CONTROL_RECD_PING:
242 break;
244 case CTDB_CONTROL_RELEASE_IP:
245 len = ctdb_public_ip_len(cd->data.pubip);
246 break;
248 case CTDB_CONTROL_TAKEOVER_IP:
249 len = ctdb_public_ip_len(cd->data.pubip);
250 break;
252 case CTDB_CONTROL_GET_PUBLIC_IPS:
253 break;
255 case CTDB_CONTROL_GET_NODEMAP:
256 break;
258 case CTDB_CONTROL_TRAVERSE_KILL:
259 len = ctdb_traverse_start_len(cd->data.traverse_start);
260 break;
262 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
263 len = ctdb_double_len(&cd->data.reclock_latency);
264 break;
266 case CTDB_CONTROL_GET_RECLOCK_FILE:
267 break;
269 case CTDB_CONTROL_STOP_NODE:
270 break;
272 case CTDB_CONTROL_CONTINUE_NODE:
273 break;
275 case CTDB_CONTROL_SET_LMASTERROLE:
276 len = ctdb_uint32_len(&cd->data.role);
277 break;
279 case CTDB_CONTROL_SET_RECMASTERROLE:
280 len = ctdb_uint32_len(&cd->data.role);
281 break;
283 case CTDB_CONTROL_SET_BAN_STATE:
284 len = ctdb_ban_state_len(cd->data.ban_state);
285 break;
287 case CTDB_CONTROL_GET_BAN_STATE:
288 break;
290 case CTDB_CONTROL_REGISTER_NOTIFY:
291 len = ctdb_notify_data_len(cd->data.notify);
292 break;
294 case CTDB_CONTROL_DEREGISTER_NOTIFY:
295 len = ctdb_uint64_len(&cd->data.srvid);
296 break;
298 case CTDB_CONTROL_TRANS3_COMMIT:
299 len = ctdb_rec_buffer_len(cd->data.recbuf);
300 break;
302 case CTDB_CONTROL_GET_DB_SEQNUM:
303 u32 = 0;
304 len = ctdb_uint32_len(&cd->data.db_id) + ctdb_uint32_len(&u32);
305 break;
307 case CTDB_CONTROL_DB_SET_HEALTHY:
308 len = ctdb_uint32_len(&cd->data.db_id);
309 break;
311 case CTDB_CONTROL_DB_GET_HEALTH:
312 len = ctdb_uint32_len(&cd->data.db_id);
313 break;
315 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
316 len = ctdb_sock_addr_len(cd->data.addr);
317 break;
319 case CTDB_CONTROL_GET_IFACES:
320 break;
322 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
323 len = ctdb_iface_len(cd->data.iface);
324 break;
326 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
327 len = ctdb_connection_len(cd->data.conn);
328 break;
330 case CTDB_CONTROL_GET_STAT_HISTORY:
331 break;
333 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
334 len = ctdb_key_data_len(cd->data.key);
335 break;
337 case CTDB_CONTROL_SET_DB_READONLY:
338 len = ctdb_uint32_len(&cd->data.db_id);
339 break;
341 case CTDB_CONTROL_CHECK_SRVIDS:
342 break;
344 case CTDB_CONTROL_TRAVERSE_START_EXT:
345 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
346 break;
348 case CTDB_CONTROL_GET_DB_STATISTICS:
349 len = ctdb_uint32_len(&cd->data.db_id);
350 break;
352 case CTDB_CONTROL_SET_DB_STICKY:
353 len = ctdb_uint32_len(&cd->data.db_id);
354 break;
356 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
357 break;
359 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
360 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
361 break;
363 case CTDB_CONTROL_RECEIVE_RECORDS:
364 len = ctdb_rec_buffer_len(cd->data.recbuf);
365 break;
367 case CTDB_CONTROL_IPREALLOCATED:
368 break;
370 case CTDB_CONTROL_GET_RUNSTATE:
371 break;
373 case CTDB_CONTROL_DB_DETACH:
374 len = ctdb_uint32_len(&cd->data.db_id);
375 break;
377 case CTDB_CONTROL_GET_NODES_FILE:
378 break;
380 case CTDB_CONTROL_DB_FREEZE:
381 len = ctdb_uint32_len(&cd->data.db_id);
382 break;
384 case CTDB_CONTROL_DB_THAW:
385 len = ctdb_uint32_len(&cd->data.db_id);
386 break;
388 case CTDB_CONTROL_DB_TRANSACTION_START:
389 len = ctdb_transdb_len(cd->data.transdb);
390 break;
392 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
393 len = ctdb_transdb_len(cd->data.transdb);
394 break;
396 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
397 len = ctdb_uint32_len(&cd->data.db_id);
398 break;
400 case CTDB_CONTROL_DB_PULL:
401 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
402 break;
404 case CTDB_CONTROL_DB_PUSH_START:
405 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
406 break;
408 case CTDB_CONTROL_DB_PUSH_CONFIRM:
409 len = ctdb_uint32_len(&cd->data.db_id);
410 break;
412 case CTDB_CONTROL_DB_OPEN_FLAGS:
413 len = ctdb_uint32_len(&cd->data.db_id);
414 break;
416 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
417 len = ctdb_string_len(&cd->data.db_name);
418 break;
420 case CTDB_CONTROL_CHECK_PID_SRVID:
421 len = ctdb_pid_srvid_len(cd->data.pid_srvid);
422 break;
424 case CTDB_CONTROL_TUNNEL_REGISTER:
425 break;
427 case CTDB_CONTROL_TUNNEL_DEREGISTER:
428 break;
431 return len;
434 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
435 uint8_t *buf, size_t *npush)
437 size_t np = 0, offset;
438 uint32_t u32;
440 switch (cd->opcode) {
441 case CTDB_CONTROL_PROCESS_EXISTS:
442 ctdb_pid_push(&cd->data.pid, buf, &np);
443 break;
445 case CTDB_CONTROL_GETDBPATH:
446 ctdb_uint32_push(&cd->data.db_id, buf, &np);
447 break;
449 case CTDB_CONTROL_SETVNNMAP:
450 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
451 break;
453 case CTDB_CONTROL_SET_DEBUG:
454 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
455 break;
457 case CTDB_CONTROL_PULL_DB:
458 ctdb_pulldb_push(cd->data.pulldb, buf, &np);
459 break;
461 case CTDB_CONTROL_PUSH_DB:
462 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
463 break;
465 case CTDB_CONTROL_SET_RECMODE:
466 ctdb_uint32_push(&cd->data.recmode, buf, &np);
467 break;
469 case CTDB_CONTROL_DB_ATTACH:
470 ctdb_string_push(&cd->data.db_name, buf, &np);
471 break;
473 case CTDB_CONTROL_SET_CALL:
474 break;
476 case CTDB_CONTROL_TRAVERSE_START:
477 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
478 break;
480 case CTDB_CONTROL_TRAVERSE_ALL:
481 ctdb_traverse_all_push(cd->data.traverse_all, buf, &np);
482 break;
484 case CTDB_CONTROL_TRAVERSE_DATA:
485 ctdb_rec_data_push(cd->data.rec_data, buf, &np);
486 break;
488 case CTDB_CONTROL_GET_DBNAME:
489 ctdb_uint32_push(&cd->data.db_id, buf, &np);
490 break;
492 case CTDB_CONTROL_ENABLE_SEQNUM:
493 ctdb_uint32_push(&cd->data.db_id, buf, &np);
494 break;
496 case CTDB_CONTROL_UPDATE_SEQNUM:
497 ctdb_uint32_push(&cd->data.db_id, buf, &np);
498 break;
500 case CTDB_CONTROL_SET_RECMASTER:
501 ctdb_uint32_push(&cd->data.recmaster, buf, &np);
502 break;
504 case CTDB_CONTROL_TCP_CLIENT:
505 ctdb_connection_push(cd->data.conn, buf, &np);
506 break;
508 case CTDB_CONTROL_TCP_ADD:
509 ctdb_connection_push(cd->data.conn, buf, &np);
510 break;
512 case CTDB_CONTROL_TCP_REMOVE:
513 ctdb_connection_push(cd->data.conn, buf, &np);
514 break;
516 case CTDB_CONTROL_SET_TUNABLE:
517 ctdb_tunable_push(cd->data.tunable, buf, &np);
518 break;
520 case CTDB_CONTROL_GET_TUNABLE:
521 ctdb_stringn_push(&cd->data.tun_var, buf, &np);
522 break;
524 case CTDB_CONTROL_MODIFY_FLAGS:
525 ctdb_node_flag_change_push(cd->data.flag_change, buf, &np);
526 break;
528 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
529 ctdb_sock_addr_push(cd->data.addr, buf, &np);
530 break;
532 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
533 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
534 break;
536 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
537 ctdb_string_push(&cd->data.db_name, buf, &np);
538 break;
540 case CTDB_CONTROL_UPDATE_RECORD:
541 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
542 break;
544 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
545 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
546 break;
548 case CTDB_CONTROL_WIPE_DATABASE:
549 ctdb_transdb_push(cd->data.transdb, buf, &np);
550 break;
552 case CTDB_CONTROL_TRY_DELETE_RECORDS:
553 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
554 break;
556 case CTDB_CONTROL_ADD_PUBLIC_IP:
557 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
558 break;
560 case CTDB_CONTROL_DEL_PUBLIC_IP:
561 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
562 break;
564 case CTDB_CONTROL_RELEASE_IP:
565 ctdb_public_ip_push(cd->data.pubip, buf, &np);
566 break;
568 case CTDB_CONTROL_TAKEOVER_IP:
569 ctdb_public_ip_push(cd->data.pubip, buf, &np);
570 break;
572 case CTDB_CONTROL_TRAVERSE_KILL:
573 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
574 break;
576 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
577 ctdb_double_push(&cd->data.reclock_latency, buf, &np);
578 break;
580 case CTDB_CONTROL_SET_LMASTERROLE:
581 ctdb_uint32_push(&cd->data.role, buf, &np);
582 break;
584 case CTDB_CONTROL_SET_RECMASTERROLE:
585 ctdb_uint32_push(&cd->data.role, buf, &np);
586 break;
588 case CTDB_CONTROL_SET_BAN_STATE:
589 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
590 break;
592 case CTDB_CONTROL_REGISTER_NOTIFY:
593 ctdb_notify_data_push(cd->data.notify, buf, &np);
594 break;
596 case CTDB_CONTROL_DEREGISTER_NOTIFY:
597 ctdb_uint64_push(&cd->data.srvid, buf, &np);
598 break;
600 case CTDB_CONTROL_TRANS3_COMMIT:
601 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
602 break;
604 case CTDB_CONTROL_GET_DB_SEQNUM:
605 u32 = 0;
606 offset = 0;
607 ctdb_uint32_push(&cd->data.db_id, buf, &np);
608 offset += np;
609 ctdb_uint32_push(&u32, buf+offset, &np);
610 offset += np;
611 np = offset;
612 break;
614 case CTDB_CONTROL_DB_SET_HEALTHY:
615 ctdb_uint32_push(&cd->data.db_id, buf, &np);
616 break;
618 case CTDB_CONTROL_DB_GET_HEALTH:
619 ctdb_uint32_push(&cd->data.db_id, buf, &np);
620 break;
622 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
623 ctdb_sock_addr_push(cd->data.addr, buf, &np);
624 break;
626 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
627 ctdb_iface_push(cd->data.iface, buf, &np);
628 break;
630 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
631 ctdb_connection_push(cd->data.conn, buf, &np);
632 break;
634 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
635 ctdb_key_data_push(cd->data.key, buf, &np);
636 break;
638 case CTDB_CONTROL_SET_DB_READONLY:
639 ctdb_uint32_push(&cd->data.db_id, buf, &np);
640 break;
642 case CTDB_CONTROL_CHECK_SRVIDS:
643 break;
645 case CTDB_CONTROL_TRAVERSE_START_EXT:
646 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf,
647 &np);
648 break;
650 case CTDB_CONTROL_GET_DB_STATISTICS:
651 ctdb_uint32_push(&cd->data.db_id, buf, &np);
652 break;
654 case CTDB_CONTROL_SET_DB_STICKY:
655 ctdb_uint32_push(&cd->data.db_id, buf, &np);
656 break;
658 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
659 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf,
660 &np);
661 break;
663 case CTDB_CONTROL_RECEIVE_RECORDS:
664 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
665 break;
667 case CTDB_CONTROL_DB_DETACH:
668 ctdb_uint32_push(&cd->data.db_id, buf, &np);
669 break;
671 case CTDB_CONTROL_DB_FREEZE:
672 ctdb_uint32_push(&cd->data.db_id, buf, &np);
673 break;
675 case CTDB_CONTROL_DB_THAW:
676 ctdb_uint32_push(&cd->data.db_id, buf, &np);
677 break;
679 case CTDB_CONTROL_DB_TRANSACTION_START:
680 ctdb_transdb_push(cd->data.transdb, buf, &np);
681 break;
683 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
684 ctdb_transdb_push(cd->data.transdb, buf, &np);
685 break;
687 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
688 ctdb_uint32_push(&cd->data.db_id, buf, &np);
689 break;
691 case CTDB_CONTROL_DB_PULL:
692 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
693 break;
695 case CTDB_CONTROL_DB_PUSH_START:
696 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
697 break;
699 case CTDB_CONTROL_DB_PUSH_CONFIRM:
700 ctdb_uint32_push(&cd->data.db_id, buf, &np);
701 break;
703 case CTDB_CONTROL_DB_OPEN_FLAGS:
704 ctdb_uint32_push(&cd->data.db_id, buf, &np);
705 break;
707 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
708 ctdb_string_push(&cd->data.db_name, buf, &np);
709 break;
711 case CTDB_CONTROL_CHECK_PID_SRVID:
712 ctdb_pid_srvid_push(cd->data.pid_srvid, buf, &np);
713 break;
716 *npush = np;
719 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
720 uint32_t opcode,
721 TALLOC_CTX *mem_ctx,
722 struct ctdb_req_control_data *cd,
723 size_t *npull)
725 size_t np = 0, offset;
726 uint32_t u32;
727 int ret = 0;
729 cd->opcode = opcode;
731 switch (opcode) {
732 case CTDB_CONTROL_PROCESS_EXISTS:
733 ret = ctdb_pid_pull(buf, buflen, &cd->data.pid, &np);
734 break;
736 case CTDB_CONTROL_GETDBPATH:
737 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
738 break;
740 case CTDB_CONTROL_SETVNNMAP:
741 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
742 &cd->data.vnnmap, &np);
743 break;
745 case CTDB_CONTROL_SET_DEBUG:
746 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
747 break;
749 case CTDB_CONTROL_PULL_DB:
750 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
751 &cd->data.pulldb, &np);
752 break;
754 case CTDB_CONTROL_PUSH_DB:
755 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
756 &cd->data.recbuf, &np);
757 break;
759 case CTDB_CONTROL_SET_RECMODE:
760 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
761 break;
763 case CTDB_CONTROL_DB_ATTACH:
764 ret = ctdb_string_pull(buf, buflen, mem_ctx,
765 &cd->data.db_name, &np);
766 break;
768 case CTDB_CONTROL_SET_CALL:
769 break;
771 case CTDB_CONTROL_TRAVERSE_START:
772 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
773 &cd->data.traverse_start, &np);
774 break;
776 case CTDB_CONTROL_TRAVERSE_ALL:
777 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
778 &cd->data.traverse_all, &np);
779 break;
781 case CTDB_CONTROL_TRAVERSE_DATA:
782 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
783 &cd->data.rec_data, &np);
784 break;
786 case CTDB_CONTROL_GET_DBNAME:
787 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
788 break;
790 case CTDB_CONTROL_ENABLE_SEQNUM:
791 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
792 break;
794 case CTDB_CONTROL_UPDATE_SEQNUM:
795 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
796 break;
798 case CTDB_CONTROL_SET_RECMASTER:
799 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmaster, &np);
800 break;
802 case CTDB_CONTROL_TCP_CLIENT:
803 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
804 &cd->data.conn, &np);
805 break;
807 case CTDB_CONTROL_TCP_ADD:
808 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
809 &cd->data.conn, &np);
810 break;
812 case CTDB_CONTROL_TCP_REMOVE:
813 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
814 &cd->data.conn, &np);
815 break;
817 case CTDB_CONTROL_SET_TUNABLE:
818 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
819 &cd->data.tunable, &np);
820 break;
822 case CTDB_CONTROL_GET_TUNABLE:
823 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
824 &cd->data.tun_var, &np);
825 break;
827 case CTDB_CONTROL_MODIFY_FLAGS:
828 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
829 &cd->data.flag_change, &np);
830 break;
832 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
833 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
834 &cd->data.addr, &np);
835 break;
837 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
838 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
839 &cd->data.tickles, &np);
840 break;
842 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
843 ret = ctdb_string_pull(buf, buflen, mem_ctx,
844 &cd->data.db_name, &np);
845 break;
847 case CTDB_CONTROL_UPDATE_RECORD:
848 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
849 &cd->data.recbuf, &np);
850 break;
852 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
853 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
854 &cd->data.addr_info, &np);
855 break;
857 case CTDB_CONTROL_WIPE_DATABASE:
858 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
859 &cd->data.transdb, &np);
860 break;
862 case CTDB_CONTROL_TRY_DELETE_RECORDS:
863 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
864 &cd->data.recbuf, &np);
865 break;
867 case CTDB_CONTROL_ADD_PUBLIC_IP:
868 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
869 &cd->data.addr_info, &np);
870 break;
872 case CTDB_CONTROL_DEL_PUBLIC_IP:
873 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
874 &cd->data.addr_info, &np);
875 break;
877 case CTDB_CONTROL_RELEASE_IP:
878 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
879 &cd->data.pubip, &np);
880 break;
882 case CTDB_CONTROL_TAKEOVER_IP:
883 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
884 &cd->data.pubip, &np);
885 break;
887 case CTDB_CONTROL_TRAVERSE_KILL:
888 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
889 &cd->data.traverse_start, &np);
890 break;
892 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
893 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
894 &np);
895 break;
897 case CTDB_CONTROL_SET_LMASTERROLE:
898 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
899 break;
901 case CTDB_CONTROL_SET_RECMASTERROLE:
902 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
903 break;
905 case CTDB_CONTROL_SET_BAN_STATE:
906 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
907 &cd->data.ban_state, &np);
908 break;
910 case CTDB_CONTROL_REGISTER_NOTIFY:
911 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
912 &cd->data.notify, &np);
913 break;
915 case CTDB_CONTROL_DEREGISTER_NOTIFY:
916 ret = ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
917 break;
919 case CTDB_CONTROL_TRANS3_COMMIT:
920 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
921 &cd->data.recbuf, &np);
922 break;
924 case CTDB_CONTROL_GET_DB_SEQNUM:
925 offset = 0;
926 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
927 if (ret != 0) {
928 break;
930 offset += np;
931 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
932 offset += np;
933 np = offset;
934 break;
936 case CTDB_CONTROL_DB_SET_HEALTHY:
937 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
938 break;
940 case CTDB_CONTROL_DB_GET_HEALTH:
941 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
942 break;
944 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
945 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
946 &cd->data.addr, &np);
947 break;
949 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
950 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
951 &cd->data.iface, &np);
952 break;
954 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
955 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
956 &cd->data.conn, &np);
957 break;
959 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
960 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
961 &cd->data.key, &np);
962 break;
964 case CTDB_CONTROL_SET_DB_READONLY:
965 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
966 break;
968 case CTDB_CONTROL_CHECK_SRVIDS:
969 break;
971 case CTDB_CONTROL_TRAVERSE_START_EXT:
972 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
973 &cd->data.traverse_start_ext,
974 &np);
975 break;
977 case CTDB_CONTROL_GET_DB_STATISTICS:
978 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
979 break;
981 case CTDB_CONTROL_SET_DB_STICKY:
982 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
983 break;
985 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
986 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
987 &cd->data.traverse_all_ext,
988 &np);
989 break;
991 case CTDB_CONTROL_RECEIVE_RECORDS:
992 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
993 &cd->data.recbuf, &np);
994 break;
996 case CTDB_CONTROL_DB_DETACH:
997 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
998 break;
1000 case CTDB_CONTROL_DB_FREEZE:
1001 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1002 break;
1004 case CTDB_CONTROL_DB_THAW:
1005 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1006 break;
1008 case CTDB_CONTROL_DB_TRANSACTION_START:
1009 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1010 &cd->data.transdb, &np);
1011 break;
1013 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1014 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1015 &cd->data.transdb, &np);
1016 break;
1018 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1019 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1020 break;
1022 case CTDB_CONTROL_DB_PULL:
1023 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1024 &cd->data.pulldb_ext, &np);
1025 break;
1027 case CTDB_CONTROL_DB_PUSH_START:
1028 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1029 &cd->data.pulldb_ext, &np);
1030 break;
1032 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1033 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1034 break;
1036 case CTDB_CONTROL_DB_OPEN_FLAGS:
1037 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1038 break;
1040 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1041 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1042 &cd->data.db_name, &np);
1043 break;
1045 case CTDB_CONTROL_CHECK_PID_SRVID:
1046 ret = ctdb_pid_srvid_pull(buf, buflen, mem_ctx,
1047 &cd->data.pid_srvid, &np);
1048 break;
1051 if (ret != 0) {
1052 return ret;
1055 *npull = np;
1056 return 0;
1059 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1061 size_t len = 0;
1063 if (cd == NULL) {
1064 return 0;
1067 switch (cd->opcode) {
1068 case CTDB_CONTROL_PROCESS_EXISTS:
1069 break;
1071 case CTDB_CONTROL_STATISTICS:
1072 len = ctdb_statistics_len(cd->data.stats);
1073 break;
1075 case CTDB_CONTROL_PING:
1076 break;
1078 case CTDB_CONTROL_GETDBPATH:
1079 len = ctdb_string_len(&cd->data.db_path);
1080 break;
1082 case CTDB_CONTROL_GETVNNMAP:
1083 len = ctdb_vnn_map_len(cd->data.vnnmap);
1084 break;
1086 case CTDB_CONTROL_SETVNNMAP:
1087 break;
1089 case CTDB_CONTROL_GET_DEBUG:
1090 len = ctdb_uint32_len(&cd->data.loglevel);
1091 break;
1093 case CTDB_CONTROL_SET_DEBUG:
1094 break;
1096 case CTDB_CONTROL_GET_DBMAP:
1097 len = ctdb_dbid_map_len(cd->data.dbmap);
1098 break;
1100 case CTDB_CONTROL_PULL_DB:
1101 len = ctdb_rec_buffer_len(cd->data.recbuf);
1102 break;
1104 case CTDB_CONTROL_PUSH_DB:
1105 break;
1107 case CTDB_CONTROL_GET_RECMODE:
1108 break;
1110 case CTDB_CONTROL_SET_RECMODE:
1111 break;
1113 case CTDB_CONTROL_STATISTICS_RESET:
1114 break;
1116 case CTDB_CONTROL_DB_ATTACH:
1117 len = ctdb_uint32_len(&cd->data.db_id);
1118 break;
1120 case CTDB_CONTROL_SET_CALL:
1121 break;
1123 case CTDB_CONTROL_TRAVERSE_START:
1124 break;
1126 case CTDB_CONTROL_TRAVERSE_ALL:
1127 break;
1129 case CTDB_CONTROL_TRAVERSE_DATA:
1130 break;
1132 case CTDB_CONTROL_REGISTER_SRVID:
1133 break;
1135 case CTDB_CONTROL_DEREGISTER_SRVID:
1136 break;
1138 case CTDB_CONTROL_GET_DBNAME:
1139 len = ctdb_string_len(&cd->data.db_name);
1140 break;
1142 case CTDB_CONTROL_ENABLE_SEQNUM:
1143 break;
1145 case CTDB_CONTROL_UPDATE_SEQNUM:
1146 break;
1148 case CTDB_CONTROL_DUMP_MEMORY:
1149 len = ctdb_string_len(&cd->data.mem_str);
1150 break;
1152 case CTDB_CONTROL_GET_PID:
1153 break;
1155 case CTDB_CONTROL_GET_RECMASTER:
1156 break;
1158 case CTDB_CONTROL_SET_RECMASTER:
1159 break;
1161 case CTDB_CONTROL_FREEZE:
1162 break;
1164 case CTDB_CONTROL_GET_PNN:
1165 break;
1167 case CTDB_CONTROL_SHUTDOWN:
1168 break;
1170 case CTDB_CONTROL_GET_MONMODE:
1171 break;
1173 case CTDB_CONTROL_TCP_CLIENT:
1174 break;
1176 case CTDB_CONTROL_TCP_ADD:
1177 break;
1179 case CTDB_CONTROL_TCP_REMOVE:
1180 break;
1182 case CTDB_CONTROL_STARTUP:
1183 break;
1185 case CTDB_CONTROL_SET_TUNABLE:
1186 break;
1188 case CTDB_CONTROL_GET_TUNABLE:
1189 len = ctdb_uint32_len(&cd->data.tun_value);
1190 break;
1192 case CTDB_CONTROL_LIST_TUNABLES:
1193 len = ctdb_var_list_len(cd->data.tun_var_list);
1194 break;
1196 case CTDB_CONTROL_MODIFY_FLAGS:
1197 break;
1199 case CTDB_CONTROL_GET_ALL_TUNABLES:
1200 len = ctdb_tunable_list_len(cd->data.tun_list);
1201 break;
1203 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1204 len = ctdb_tickle_list_len(cd->data.tickles);
1205 break;
1207 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1208 break;
1210 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1211 len = ctdb_uint32_len(&cd->data.db_id);
1212 break;
1214 case CTDB_CONTROL_UPDATE_RECORD:
1215 break;
1217 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1218 break;
1220 case CTDB_CONTROL_WIPE_DATABASE:
1221 break;
1223 case CTDB_CONTROL_UPTIME:
1224 len = ctdb_uptime_len(cd->data.uptime);
1225 break;
1227 case CTDB_CONTROL_START_RECOVERY:
1228 break;
1230 case CTDB_CONTROL_END_RECOVERY:
1231 break;
1233 case CTDB_CONTROL_RELOAD_NODES_FILE:
1234 break;
1236 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1237 len = ctdb_rec_buffer_len(cd->data.recbuf);
1238 break;
1240 case CTDB_CONTROL_ENABLE_MONITOR:
1241 break;
1243 case CTDB_CONTROL_DISABLE_MONITOR:
1244 break;
1246 case CTDB_CONTROL_ADD_PUBLIC_IP:
1247 break;
1249 case CTDB_CONTROL_DEL_PUBLIC_IP:
1250 break;
1252 case CTDB_CONTROL_GET_CAPABILITIES:
1253 len = ctdb_uint32_len(&cd->data.caps);
1254 break;
1256 case CTDB_CONTROL_RECD_PING:
1257 break;
1259 case CTDB_CONTROL_RELEASE_IP:
1260 break;
1262 case CTDB_CONTROL_TAKEOVER_IP:
1263 break;
1265 case CTDB_CONTROL_GET_PUBLIC_IPS:
1266 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1267 break;
1269 case CTDB_CONTROL_GET_NODEMAP:
1270 len = ctdb_node_map_len(cd->data.nodemap);
1271 break;
1273 case CTDB_CONTROL_TRAVERSE_KILL:
1274 break;
1276 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1277 break;
1279 case CTDB_CONTROL_GET_RECLOCK_FILE:
1280 len = ctdb_string_len(&cd->data.reclock_file);
1281 break;
1283 case CTDB_CONTROL_STOP_NODE:
1284 break;
1286 case CTDB_CONTROL_CONTINUE_NODE:
1287 break;
1289 case CTDB_CONTROL_SET_LMASTERROLE:
1290 break;
1292 case CTDB_CONTROL_SET_RECMASTERROLE:
1293 break;
1295 case CTDB_CONTROL_SET_BAN_STATE:
1296 break;
1298 case CTDB_CONTROL_GET_BAN_STATE:
1299 len = ctdb_ban_state_len(cd->data.ban_state);
1300 break;
1302 case CTDB_CONTROL_SET_DB_PRIORITY:
1303 break;
1305 case CTDB_CONTROL_GET_DB_PRIORITY:
1306 break;
1308 case CTDB_CONTROL_REGISTER_NOTIFY:
1309 break;
1311 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1312 break;
1314 case CTDB_CONTROL_TRANS3_COMMIT:
1315 break;
1317 case CTDB_CONTROL_GET_DB_SEQNUM:
1318 len = ctdb_uint64_len(&cd->data.seqnum);
1319 break;
1321 case CTDB_CONTROL_DB_SET_HEALTHY:
1322 break;
1324 case CTDB_CONTROL_DB_GET_HEALTH:
1325 len = ctdb_string_len(&cd->data.reason);
1326 break;
1328 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1329 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1330 break;
1332 case CTDB_CONTROL_GET_IFACES:
1333 len = ctdb_iface_list_len(cd->data.iface_list);
1334 break;
1336 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1337 break;
1339 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1340 break;
1342 case CTDB_CONTROL_GET_STAT_HISTORY:
1343 len = ctdb_statistics_list_len(cd->data.stats_list);
1344 break;
1346 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1347 break;
1349 case CTDB_CONTROL_SET_DB_READONLY:
1350 break;
1352 case CTDB_CONTROL_CHECK_SRVIDS:
1353 break;
1355 case CTDB_CONTROL_TRAVERSE_START_EXT:
1356 break;
1358 case CTDB_CONTROL_GET_DB_STATISTICS:
1359 len = ctdb_db_statistics_len(cd->data.dbstats);
1360 break;
1362 case CTDB_CONTROL_SET_DB_STICKY:
1363 break;
1365 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1366 break;
1368 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1369 break;
1371 case CTDB_CONTROL_RECEIVE_RECORDS:
1372 len = ctdb_rec_buffer_len(cd->data.recbuf);
1373 break;
1375 case CTDB_CONTROL_IPREALLOCATED:
1376 break;
1378 case CTDB_CONTROL_GET_RUNSTATE:
1379 len = ctdb_uint32_len(&cd->data.runstate);
1380 break;
1382 case CTDB_CONTROL_DB_DETACH:
1383 break;
1385 case CTDB_CONTROL_GET_NODES_FILE:
1386 len = ctdb_node_map_len(cd->data.nodemap);
1387 break;
1389 case CTDB_CONTROL_DB_FREEZE:
1390 break;
1392 case CTDB_CONTROL_DB_THAW:
1393 break;
1395 case CTDB_CONTROL_DB_TRANSACTION_START:
1396 break;
1398 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1399 break;
1401 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1402 break;
1404 case CTDB_CONTROL_DB_PULL:
1405 len = ctdb_uint32_len(&cd->data.num_records);
1406 break;
1408 case CTDB_CONTROL_DB_PUSH_START:
1409 break;
1411 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1412 len = ctdb_uint32_len(&cd->data.num_records);
1413 break;
1415 case CTDB_CONTROL_DB_OPEN_FLAGS:
1416 len = ctdb_int32_len(&cd->data.tdb_flags);
1417 break;
1419 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1420 len = ctdb_uint32_len(&cd->data.db_id);
1421 break;
1423 case CTDB_CONTROL_CHECK_PID_SRVID:
1424 break;
1426 case CTDB_CONTROL_TUNNEL_REGISTER:
1427 break;
1429 case CTDB_CONTROL_TUNNEL_DEREGISTER:
1430 break;
1433 return len;
1436 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1437 uint8_t *buf, size_t *npush)
1439 size_t np = 0;
1441 switch (cd->opcode) {
1442 case CTDB_CONTROL_STATISTICS:
1443 ctdb_statistics_push(cd->data.stats, buf, &np);
1444 break;
1446 case CTDB_CONTROL_GETDBPATH:
1447 ctdb_string_push(&cd->data.db_path, buf, &np);
1448 break;
1450 case CTDB_CONTROL_GETVNNMAP:
1451 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
1452 break;
1454 case CTDB_CONTROL_GET_DEBUG:
1455 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1456 break;
1458 case CTDB_CONTROL_GET_DBMAP:
1459 ctdb_dbid_map_push(cd->data.dbmap, buf, &np);
1460 break;
1462 case CTDB_CONTROL_PULL_DB:
1463 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1464 break;
1466 case CTDB_CONTROL_PUSH_DB:
1467 break;
1469 case CTDB_CONTROL_DB_ATTACH:
1470 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1471 break;
1473 case CTDB_CONTROL_GET_DBNAME:
1474 ctdb_string_push(&cd->data.db_name, buf, &np);
1475 break;
1477 case CTDB_CONTROL_DUMP_MEMORY:
1478 ctdb_string_push(&cd->data.mem_str, buf, &np);
1479 break;
1481 case CTDB_CONTROL_GET_PID:
1482 break;
1484 case CTDB_CONTROL_GET_RECMASTER:
1485 break;
1487 case CTDB_CONTROL_GET_TUNABLE:
1488 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1489 break;
1491 case CTDB_CONTROL_LIST_TUNABLES:
1492 ctdb_var_list_push(cd->data.tun_var_list, buf, &np);
1493 break;
1495 case CTDB_CONTROL_GET_ALL_TUNABLES:
1496 ctdb_tunable_list_push(cd->data.tun_list, buf, &np);
1497 break;
1499 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1500 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
1501 break;
1503 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1504 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1505 break;
1507 case CTDB_CONTROL_UPTIME:
1508 ctdb_uptime_push(cd->data.uptime, buf, &np);
1509 break;
1511 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1512 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1513 break;
1515 case CTDB_CONTROL_GET_CAPABILITIES:
1516 ctdb_uint32_push(&cd->data.caps, buf, &np);
1517 break;
1519 case CTDB_CONTROL_GET_PUBLIC_IPS:
1520 ctdb_public_ip_list_push(cd->data.pubip_list, buf, &np);
1521 break;
1523 case CTDB_CONTROL_GET_NODEMAP:
1524 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1525 break;
1527 case CTDB_CONTROL_GET_RECLOCK_FILE:
1528 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1529 break;
1531 case CTDB_CONTROL_GET_BAN_STATE:
1532 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
1533 break;
1535 case CTDB_CONTROL_GET_DB_PRIORITY:
1536 break;
1538 case CTDB_CONTROL_GET_DB_SEQNUM:
1539 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1540 break;
1542 case CTDB_CONTROL_DB_GET_HEALTH:
1543 ctdb_string_push(&cd->data.reason, buf, &np);
1544 break;
1546 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1547 ctdb_public_ip_info_push(cd->data.ipinfo, buf, &np);
1548 break;
1550 case CTDB_CONTROL_GET_IFACES:
1551 ctdb_iface_list_push(cd->data.iface_list, buf, &np);
1552 break;
1554 case CTDB_CONTROL_GET_STAT_HISTORY:
1555 ctdb_statistics_list_push(cd->data.stats_list, buf, &np);
1556 break;
1558 case CTDB_CONTROL_CHECK_SRVIDS:
1559 break;
1561 case CTDB_CONTROL_GET_DB_STATISTICS:
1562 ctdb_db_statistics_push(cd->data.dbstats, buf, &np);
1563 break;
1565 case CTDB_CONTROL_RECEIVE_RECORDS:
1566 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1567 break;
1569 case CTDB_CONTROL_GET_RUNSTATE:
1570 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1571 break;
1573 case CTDB_CONTROL_GET_NODES_FILE:
1574 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1575 break;
1577 case CTDB_CONTROL_DB_PULL:
1578 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1579 break;
1581 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1582 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1583 break;
1585 case CTDB_CONTROL_DB_OPEN_FLAGS:
1586 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1587 break;
1589 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1590 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1591 break;
1593 case CTDB_CONTROL_CHECK_PID_SRVID:
1594 break;
1597 *npush = np;
1600 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1601 uint32_t opcode, TALLOC_CTX *mem_ctx,
1602 struct ctdb_reply_control_data *cd,
1603 size_t *npull)
1605 size_t np = 0;
1606 int ret = 0;
1608 cd->opcode = opcode;
1610 switch (opcode) {
1611 case CTDB_CONTROL_STATISTICS:
1612 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1613 &cd->data.stats, &np);
1614 break;
1616 case CTDB_CONTROL_GETDBPATH:
1617 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1618 &cd->data.db_path, &np);
1619 break;
1621 case CTDB_CONTROL_GETVNNMAP:
1622 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1623 &cd->data.vnnmap, &np);
1624 break;
1626 case CTDB_CONTROL_GET_DEBUG:
1627 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1628 break;
1630 case CTDB_CONTROL_GET_DBMAP:
1631 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1632 &cd->data.dbmap, &np);
1633 break;
1635 case CTDB_CONTROL_PULL_DB:
1636 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1637 &cd->data.recbuf, &np);
1638 break;
1640 case CTDB_CONTROL_PUSH_DB:
1641 break;
1643 case CTDB_CONTROL_DB_ATTACH:
1644 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1645 break;
1647 case CTDB_CONTROL_GET_DBNAME:
1648 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1649 &cd->data.db_name, &np);
1650 break;
1652 case CTDB_CONTROL_DUMP_MEMORY:
1653 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1654 &cd->data.mem_str, &np);
1655 break;
1657 case CTDB_CONTROL_GET_PID:
1658 break;
1660 case CTDB_CONTROL_GET_RECMASTER:
1661 break;
1663 case CTDB_CONTROL_GET_TUNABLE:
1664 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1665 &np);
1666 break;
1668 case CTDB_CONTROL_LIST_TUNABLES:
1669 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1670 &cd->data.tun_var_list, &np);
1671 break;
1673 case CTDB_CONTROL_GET_ALL_TUNABLES:
1674 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1675 &cd->data.tun_list, &np);
1676 break;
1678 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1679 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1680 &cd->data.tickles, &np);
1681 break;
1683 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1684 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1685 break;
1687 case CTDB_CONTROL_UPTIME:
1688 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1689 &cd->data.uptime, &np);
1690 break;
1692 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1693 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1694 &cd->data.recbuf, &np);
1695 break;
1697 case CTDB_CONTROL_GET_CAPABILITIES:
1698 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1699 break;
1701 case CTDB_CONTROL_GET_PUBLIC_IPS:
1702 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1703 &cd->data.pubip_list, &np);
1704 break;
1706 case CTDB_CONTROL_GET_NODEMAP:
1707 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1708 &cd->data.nodemap, &np);
1709 break;
1711 case CTDB_CONTROL_GET_RECLOCK_FILE:
1712 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1713 &cd->data.reclock_file, &np);
1714 break;
1716 case CTDB_CONTROL_GET_BAN_STATE:
1717 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1718 &cd->data.ban_state, &np);
1719 break;
1721 case CTDB_CONTROL_GET_DB_PRIORITY:
1722 break;
1724 case CTDB_CONTROL_GET_DB_SEQNUM:
1725 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1726 break;
1728 case CTDB_CONTROL_DB_GET_HEALTH:
1729 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1730 &cd->data.reason, &np);
1731 break;
1733 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1734 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1735 &cd->data.ipinfo, &np);
1736 break;
1738 case CTDB_CONTROL_GET_IFACES:
1739 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1740 &cd->data.iface_list, &np);
1741 break;
1743 case CTDB_CONTROL_GET_STAT_HISTORY:
1744 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1745 &cd->data.stats_list, &np);
1746 break;
1748 case CTDB_CONTROL_CHECK_SRVIDS:
1749 break;
1751 case CTDB_CONTROL_GET_DB_STATISTICS:
1752 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1753 &cd->data.dbstats, &np);
1754 break;
1756 case CTDB_CONTROL_RECEIVE_RECORDS:
1757 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1758 &cd->data.recbuf, &np);
1759 break;
1761 case CTDB_CONTROL_GET_RUNSTATE:
1762 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1763 break;
1765 case CTDB_CONTROL_GET_NODES_FILE:
1766 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1767 &cd->data.nodemap, &np);
1768 break;
1770 case CTDB_CONTROL_DB_PULL:
1771 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1772 &np);
1773 break;
1775 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1776 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1777 &np);
1778 break;
1780 case CTDB_CONTROL_DB_OPEN_FLAGS:
1781 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1782 break;
1784 case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1785 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1786 break;
1788 case CTDB_CONTROL_CHECK_PID_SRVID:
1789 break;
1792 if (ret != 0) {
1793 return ret;
1796 *npull = np;
1797 return 0;
1800 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1801 struct ctdb_req_control *c)
1803 uint32_t u32 = 0;
1805 return ctdb_req_header_len(h) +
1806 ctdb_uint32_len(&c->opcode) +
1807 ctdb_uint32_len(&c->pad) +
1808 ctdb_uint64_len(&c->srvid) +
1809 ctdb_uint32_len(&c->client_id) +
1810 ctdb_uint32_len(&c->flags) +
1811 ctdb_uint32_len(&u32) +
1812 ctdb_req_control_data_len(&c->rdata);
1815 int ctdb_req_control_push(struct ctdb_req_header *h,
1816 struct ctdb_req_control *c,
1817 uint8_t *buf, size_t *buflen)
1819 size_t offset = 0, np;
1820 size_t length;
1821 uint32_t u32;
1823 length = ctdb_req_control_len(h, c);
1824 if (*buflen < length) {
1825 *buflen = length;
1826 return EMSGSIZE;
1829 h->length = *buflen;
1830 ctdb_req_header_push(h, buf+offset, &np);
1831 offset += np;
1833 ctdb_uint32_push(&c->opcode, buf+offset, &np);
1834 offset += np;
1836 ctdb_uint32_push(&c->pad, buf+offset, &np);
1837 offset += np;
1839 ctdb_uint64_push(&c->srvid, buf+offset, &np);
1840 offset += np;
1842 ctdb_uint32_push(&c->client_id, buf+offset, &np);
1843 offset += np;
1845 ctdb_uint32_push(&c->flags, buf+offset, &np);
1846 offset += np;
1848 u32 = ctdb_req_control_data_len(&c->rdata);
1849 ctdb_uint32_push(&u32, buf+offset, &np);
1850 offset += np;
1852 ctdb_req_control_data_push(&c->rdata, buf+offset, &np);
1853 offset += np;
1855 if (offset > *buflen) {
1856 return EMSGSIZE;
1859 return 0;
1862 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1863 struct ctdb_req_header *h,
1864 TALLOC_CTX *mem_ctx,
1865 struct ctdb_req_control *c)
1867 struct ctdb_req_header header;
1868 size_t offset = 0, np;
1869 uint32_t u32;
1870 int ret;
1872 ret = ctdb_req_header_pull(buf+offset, buflen-offset, &header, &np);
1873 if (ret != 0) {
1874 return ret;
1876 offset += np;
1878 if (h != NULL) {
1879 *h = header;
1882 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->opcode, &np);
1883 if (ret != 0) {
1884 return ret;
1886 offset += np;
1888 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->pad, &np);
1889 if (ret != 0) {
1890 return ret;
1892 offset += np;
1894 ret = ctdb_uint64_pull(buf+offset, buflen-offset, &c->srvid, &np);
1895 if (ret != 0) {
1896 return ret;
1898 offset += np;
1900 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->client_id, &np);
1901 if (ret != 0) {
1902 return ret;
1904 offset += np;
1906 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->flags, &np);
1907 if (ret != 0) {
1908 return ret;
1910 offset += np;
1912 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
1913 if (ret != 0) {
1914 return ret;
1916 offset += np;
1918 if (u32 > buflen-offset) {
1919 return EMSGSIZE;
1922 ret = ctdb_req_control_data_pull(buf+offset, u32, c->opcode, mem_ctx,
1923 &c->rdata, &np);
1924 if (ret != 0) {
1925 return ret;
1927 offset += np;
1929 if (offset > buflen) {
1930 return EMSGSIZE;
1933 return 0;
1936 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1937 struct ctdb_reply_control *c)
1939 uint32_t dsize, esize;
1941 if (c->status == 0) {
1942 dsize = ctdb_reply_control_data_len(&c->rdata);
1943 esize = 0;
1944 } else {
1945 dsize = 0;
1946 esize = ctdb_string_len(&c->errmsg);
1949 return ctdb_req_header_len(h) +
1950 ctdb_int32_len(&c->status) +
1951 ctdb_uint32_len(&dsize) +
1952 ctdb_uint32_len(&esize) +
1953 dsize + esize;
1956 int ctdb_reply_control_push(struct ctdb_req_header *h,
1957 struct ctdb_reply_control *c,
1958 uint8_t *buf, size_t *buflen)
1960 size_t offset = 0, np;
1961 size_t length;
1962 uint32_t dsize, esize;
1964 length = ctdb_reply_control_len(h, c);
1965 if (*buflen < length) {
1966 *buflen = length;
1967 return EMSGSIZE;
1970 h->length = *buflen;
1971 ctdb_req_header_push(h, buf+offset, &np);
1972 offset += np;
1974 ctdb_int32_push(&c->status, buf+offset, &np);
1975 offset += np;
1977 if (c->status == 0) {
1978 dsize = ctdb_reply_control_data_len(&c->rdata);
1979 esize = 0;
1980 } else {
1981 dsize = 0;
1982 esize = ctdb_string_len(&c->errmsg);
1985 ctdb_uint32_push(&dsize, buf+offset, &np);
1986 offset += np;
1988 ctdb_uint32_push(&esize, buf+offset, &np);
1989 offset += np;
1991 if (c->status == 0) {
1992 ctdb_reply_control_data_push(&c->rdata, buf+offset, &np);
1993 } else {
1994 ctdb_string_push(&c->errmsg, buf+offset, &np);
1996 offset += np;
1998 return 0;
2001 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
2002 struct ctdb_req_header *h,
2003 TALLOC_CTX *mem_ctx,
2004 struct ctdb_reply_control *c)
2006 struct ctdb_req_header header;
2007 size_t offset = 0, np;
2008 uint32_t dsize, esize;
2009 int ret;
2011 ret = ctdb_req_header_pull(buf+offset, buflen-offset, &header, &np);
2012 if (ret != 0) {
2013 return ret;
2015 offset += np;
2017 if (h != NULL) {
2018 *h = header;
2021 ret = ctdb_int32_pull(buf+offset, buflen-offset, &c->status, &np);
2022 if (ret != 0) {
2023 return ret;
2025 offset += np;
2027 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &dsize, &np);
2028 if (ret != 0) {
2029 return ret;
2031 offset += np;
2033 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &esize, &np);
2034 if (ret != 0) {
2035 return ret;
2037 offset += np;
2039 c->errmsg = NULL;
2041 if (c->status == 0) {
2042 if (buflen-offset < dsize) {
2043 return EMSGSIZE;
2046 ret = ctdb_reply_control_data_pull(buf+offset, dsize,
2047 opcode, mem_ctx, &c->rdata,
2048 &np);
2049 if (ret != 0) {
2050 return ret;
2052 offset += np;
2054 } else {
2055 if (buflen-offset < esize) {
2056 return EMSGSIZE;
2059 ret = ctdb_string_pull(buf+offset, esize, mem_ctx, &c->errmsg,
2060 &np);
2061 if (ret != 0) {
2062 return ret;
2064 offset += np;
2067 return 0;