318d8a428ee1b5c2b6fc57e60ef3bc070de95b09
[vlendec/samba-autobuild/.git] / ctdb / protocol / protocol_control.c
1 /*
2    CTDB protocol marshalling
3
4    Copyright (C) Amitay Isaacs  2015
5
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.
10
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.
15
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/>.
18 */
19
20 #include "replace.h"
21 #include "system/network.h"
22
23 #include <talloc.h>
24 #include <tdb.h>
25
26 #include "protocol.h"
27 #include "protocol_api.h"
28 #include "protocol_private.h"
29
30 struct ctdb_req_control_wire {
31         struct ctdb_req_header hdr;
32         uint32_t opcode;
33         uint32_t pad;
34         uint64_t srvid;
35         uint32_t client_id;
36         uint32_t flags;
37         uint32_t datalen;
38         uint8_t data[1];
39 };
40
41 struct ctdb_reply_control_wire {
42         struct ctdb_req_header hdr;
43         int32_t status;
44         uint32_t datalen;
45         uint32_t errorlen;
46         uint8_t data[1];
47 };
48
49 static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
50 {
51         size_t len = 0;
52         uint32_t u32;
53
54         if (cd == NULL) {
55                 return 0;
56         }
57
58         switch (cd->opcode) {
59         case CTDB_CONTROL_PROCESS_EXISTS:
60                 len = ctdb_pid_len(&cd->data.pid);
61                 break;
62
63         case CTDB_CONTROL_STATISTICS:
64                 break;
65
66         case CTDB_CONTROL_PING:
67                 break;
68
69         case CTDB_CONTROL_GETDBPATH:
70                 len = ctdb_uint32_len(&cd->data.db_id);
71                 break;
72
73         case CTDB_CONTROL_GETVNNMAP:
74                 break;
75
76         case CTDB_CONTROL_SETVNNMAP:
77                 len = ctdb_vnn_map_len(cd->data.vnnmap);
78                 break;
79
80         case CTDB_CONTROL_GET_DEBUG:
81                 break;
82
83         case CTDB_CONTROL_SET_DEBUG:
84                 len = ctdb_uint32_len(&cd->data.loglevel);
85                 break;
86
87         case CTDB_CONTROL_GET_DBMAP:
88                 break;
89
90         case CTDB_CONTROL_PULL_DB:
91                 len = ctdb_pulldb_len(cd->data.pulldb);
92                 break;
93
94         case CTDB_CONTROL_PUSH_DB:
95                 len = ctdb_rec_buffer_len(cd->data.recbuf);
96                 break;
97
98         case CTDB_CONTROL_GET_RECMODE:
99                 break;
100
101         case CTDB_CONTROL_SET_RECMODE:
102                 len = ctdb_uint32_len(&cd->data.recmode);
103                 break;
104
105         case CTDB_CONTROL_STATISTICS_RESET:
106                 break;
107
108         case CTDB_CONTROL_DB_ATTACH:
109                 len = ctdb_string_len(&cd->data.db_name);
110                 break;
111
112         case CTDB_CONTROL_SET_CALL:
113                 break;
114
115         case CTDB_CONTROL_TRAVERSE_START:
116                 len = ctdb_traverse_start_len(cd->data.traverse_start);
117                 break;
118
119         case CTDB_CONTROL_TRAVERSE_ALL:
120                 len = ctdb_traverse_all_len(cd->data.traverse_all);
121                 break;
122
123         case CTDB_CONTROL_TRAVERSE_DATA:
124                 len = ctdb_rec_data_len(cd->data.rec_data);
125                 break;
126
127         case CTDB_CONTROL_REGISTER_SRVID:
128                 break;
129
130         case CTDB_CONTROL_DEREGISTER_SRVID:
131                 break;
132
133         case CTDB_CONTROL_GET_DBNAME:
134                 len = ctdb_uint32_len(&cd->data.db_id);
135                 break;
136
137         case CTDB_CONTROL_ENABLE_SEQNUM:
138                 len = ctdb_uint32_len(&cd->data.db_id);
139                 break;
140
141         case CTDB_CONTROL_UPDATE_SEQNUM:
142                 len = ctdb_uint32_len(&cd->data.db_id);
143                 break;
144
145         case CTDB_CONTROL_DUMP_MEMORY:
146                 break;
147
148         case CTDB_CONTROL_GET_PID:
149                 break;
150
151         case CTDB_CONTROL_GET_RECMASTER:
152                 break;
153
154         case CTDB_CONTROL_SET_RECMASTER:
155                 len = ctdb_uint32_len(&cd->data.recmaster);
156                 break;
157
158         case CTDB_CONTROL_FREEZE:
159                 break;
160
161         case CTDB_CONTROL_GET_PNN:
162                 break;
163
164         case CTDB_CONTROL_SHUTDOWN:
165                 break;
166
167         case CTDB_CONTROL_GET_MONMODE:
168                 break;
169
170         case CTDB_CONTROL_TCP_CLIENT:
171                 len = ctdb_connection_len(cd->data.conn);
172                 break;
173
174         case CTDB_CONTROL_TCP_ADD:
175                 len = ctdb_connection_len(cd->data.conn);
176                 break;
177
178         case CTDB_CONTROL_TCP_REMOVE:
179                 len = ctdb_connection_len(cd->data.conn);
180                 break;
181
182         case CTDB_CONTROL_STARTUP:
183                 break;
184
185         case CTDB_CONTROL_SET_TUNABLE:
186                 len = ctdb_tunable_len(cd->data.tunable);
187                 break;
188
189         case CTDB_CONTROL_GET_TUNABLE:
190                 len = ctdb_stringn_len(&cd->data.tun_var);
191                 break;
192
193         case CTDB_CONTROL_LIST_TUNABLES:
194                 break;
195
196         case CTDB_CONTROL_MODIFY_FLAGS:
197                 len = ctdb_node_flag_change_len(cd->data.flag_change);
198                 break;
199
200         case CTDB_CONTROL_GET_ALL_TUNABLES:
201                 break;
202
203         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
204                 len = ctdb_sock_addr_len(cd->data.addr);
205                 break;
206
207         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
208                 len = ctdb_tickle_list_len(cd->data.tickles);
209                 break;
210
211         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
212                 len = ctdb_string_len(&cd->data.db_name);
213                 break;
214
215         case CTDB_CONTROL_UPDATE_RECORD:
216                 len = ctdb_rec_buffer_len(cd->data.recbuf);
217                 break;
218
219         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
220                 len = ctdb_addr_info_len(cd->data.addr_info);
221                 break;
222
223         case CTDB_CONTROL_WIPE_DATABASE:
224                 len = ctdb_transdb_len(cd->data.transdb);
225                 break;
226
227         case CTDB_CONTROL_UPTIME:
228                 break;
229
230         case CTDB_CONTROL_START_RECOVERY:
231                 break;
232
233         case CTDB_CONTROL_END_RECOVERY:
234                 break;
235
236         case CTDB_CONTROL_RELOAD_NODES_FILE:
237                 break;
238
239         case CTDB_CONTROL_TRY_DELETE_RECORDS:
240                 len = ctdb_rec_buffer_len(cd->data.recbuf);
241                 break;
242
243         case CTDB_CONTROL_ENABLE_MONITOR:
244                 break;
245
246         case CTDB_CONTROL_DISABLE_MONITOR:
247                 break;
248
249         case CTDB_CONTROL_ADD_PUBLIC_IP:
250                 len = ctdb_addr_info_len(cd->data.addr_info);
251                 break;
252
253         case CTDB_CONTROL_DEL_PUBLIC_IP:
254                 len = ctdb_addr_info_len(cd->data.addr_info);
255                 break;
256
257         case CTDB_CONTROL_GET_CAPABILITIES:
258                 break;
259
260         case CTDB_CONTROL_RECD_PING:
261                 break;
262
263         case CTDB_CONTROL_RELEASE_IP:
264                 len = ctdb_public_ip_len(cd->data.pubip);
265                 break;
266
267         case CTDB_CONTROL_TAKEOVER_IP:
268                 len = ctdb_public_ip_len(cd->data.pubip);
269                 break;
270
271         case CTDB_CONTROL_GET_PUBLIC_IPS:
272                 break;
273
274         case CTDB_CONTROL_GET_NODEMAP:
275                 break;
276
277         case CTDB_CONTROL_TRAVERSE_KILL:
278                 len = ctdb_traverse_start_len(cd->data.traverse_start);
279                 break;
280
281         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
282                 len = ctdb_double_len(&cd->data.reclock_latency);
283                 break;
284
285         case CTDB_CONTROL_GET_RECLOCK_FILE:
286                 break;
287
288         case CTDB_CONTROL_STOP_NODE:
289                 break;
290
291         case CTDB_CONTROL_CONTINUE_NODE:
292                 break;
293
294         case CTDB_CONTROL_SET_LMASTERROLE:
295                 len = ctdb_uint32_len(&cd->data.role);
296                 break;
297
298         case CTDB_CONTROL_SET_RECMASTERROLE:
299                 len = ctdb_uint32_len(&cd->data.role);
300                 break;
301
302         case CTDB_CONTROL_SET_BAN_STATE:
303                 len = ctdb_ban_state_len(cd->data.ban_state);
304                 break;
305
306         case CTDB_CONTROL_GET_BAN_STATE:
307                 break;
308
309         case CTDB_CONTROL_REGISTER_NOTIFY:
310                 len = ctdb_notify_data_len(cd->data.notify);
311                 break;
312
313         case CTDB_CONTROL_DEREGISTER_NOTIFY:
314                 len = ctdb_uint64_len(&cd->data.srvid);
315                 break;
316
317         case CTDB_CONTROL_TRANS3_COMMIT:
318                 len = ctdb_rec_buffer_len(cd->data.recbuf);
319                 break;
320
321         case CTDB_CONTROL_GET_DB_SEQNUM:
322                 u32 = 0;
323                 len = ctdb_uint32_len(&cd->data.db_id) + ctdb_uint32_len(&u32);
324                 break;
325
326         case CTDB_CONTROL_DB_SET_HEALTHY:
327                 len = ctdb_uint32_len(&cd->data.db_id);
328                 break;
329
330         case CTDB_CONTROL_DB_GET_HEALTH:
331                 len = ctdb_uint32_len(&cd->data.db_id);
332                 break;
333
334         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
335                 len = ctdb_sock_addr_len(cd->data.addr);
336                 break;
337
338         case CTDB_CONTROL_GET_IFACES:
339                 break;
340
341         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
342                 len = ctdb_iface_len(cd->data.iface);
343                 break;
344
345         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
346                 len = ctdb_connection_len(cd->data.conn);
347                 break;
348
349         case CTDB_CONTROL_GET_STAT_HISTORY:
350                 break;
351
352         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
353                 len = ctdb_key_data_len(cd->data.key);
354                 break;
355
356         case CTDB_CONTROL_SET_DB_READONLY:
357                 len = ctdb_uint32_len(&cd->data.db_id);
358                 break;
359
360         case CTDB_CONTROL_CHECK_SRVIDS:
361                 break;
362
363         case CTDB_CONTROL_TRAVERSE_START_EXT:
364                 len = ctdb_traverse_start_ext_len(cd->data.traverse_start_ext);
365                 break;
366
367         case CTDB_CONTROL_GET_DB_STATISTICS:
368                 len = ctdb_uint32_len(&cd->data.db_id);
369                 break;
370
371         case CTDB_CONTROL_SET_DB_STICKY:
372                 len = ctdb_uint32_len(&cd->data.db_id);
373                 break;
374
375         case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
376                 break;
377
378         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
379                 len = ctdb_traverse_all_ext_len(cd->data.traverse_all_ext);
380                 break;
381
382         case CTDB_CONTROL_RECEIVE_RECORDS:
383                 len = ctdb_rec_buffer_len(cd->data.recbuf);
384                 break;
385
386         case CTDB_CONTROL_IPREALLOCATED:
387                 break;
388
389         case CTDB_CONTROL_GET_RUNSTATE:
390                 break;
391
392         case CTDB_CONTROL_DB_DETACH:
393                 len = ctdb_uint32_len(&cd->data.db_id);
394                 break;
395
396         case CTDB_CONTROL_GET_NODES_FILE:
397                 break;
398
399         case CTDB_CONTROL_DB_FREEZE:
400                 len = ctdb_uint32_len(&cd->data.db_id);
401                 break;
402
403         case CTDB_CONTROL_DB_THAW:
404                 len = ctdb_uint32_len(&cd->data.db_id);
405                 break;
406
407         case CTDB_CONTROL_DB_TRANSACTION_START:
408                 len = ctdb_transdb_len(cd->data.transdb);
409                 break;
410
411         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
412                 len = ctdb_transdb_len(cd->data.transdb);
413                 break;
414
415         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
416                 len = ctdb_uint32_len(&cd->data.db_id);
417                 break;
418
419         case CTDB_CONTROL_DB_PULL:
420                 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
421                 break;
422
423         case CTDB_CONTROL_DB_PUSH_START:
424                 len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
425                 break;
426
427         case CTDB_CONTROL_DB_PUSH_CONFIRM:
428                 len = ctdb_uint32_len(&cd->data.db_id);
429                 break;
430
431         case CTDB_CONTROL_DB_OPEN_FLAGS:
432                 len = ctdb_uint32_len(&cd->data.db_id);
433                 break;
434
435         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
436                 len = ctdb_string_len(&cd->data.db_name);
437                 break;
438         }
439
440         return len;
441 }
442
443 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
444                                        uint8_t *buf, size_t *npush)
445 {
446         size_t np = 0, offset;
447         uint32_t u32;
448
449         switch (cd->opcode) {
450         case CTDB_CONTROL_PROCESS_EXISTS:
451                 ctdb_pid_push(&cd->data.pid, buf, &np);
452                 break;
453
454         case CTDB_CONTROL_GETDBPATH:
455                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
456                 break;
457
458         case CTDB_CONTROL_SETVNNMAP:
459                 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
460                 break;
461
462         case CTDB_CONTROL_SET_DEBUG:
463                 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
464                 break;
465
466         case CTDB_CONTROL_PULL_DB:
467                 ctdb_pulldb_push(cd->data.pulldb, buf, &np);
468                 break;
469
470         case CTDB_CONTROL_PUSH_DB:
471                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
472                 break;
473
474         case CTDB_CONTROL_SET_RECMODE:
475                 ctdb_uint32_push(&cd->data.recmode, buf, &np);
476                 break;
477
478         case CTDB_CONTROL_DB_ATTACH:
479                 ctdb_string_push(&cd->data.db_name, buf, &np);
480                 break;
481
482         case CTDB_CONTROL_SET_CALL:
483                 break;
484
485         case CTDB_CONTROL_TRAVERSE_START:
486                 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
487                 break;
488
489         case CTDB_CONTROL_TRAVERSE_ALL:
490                 ctdb_traverse_all_push(cd->data.traverse_all, buf, &np);
491                 break;
492
493         case CTDB_CONTROL_TRAVERSE_DATA:
494                 ctdb_rec_data_push(cd->data.rec_data, buf, &np);
495                 break;
496
497         case CTDB_CONTROL_GET_DBNAME:
498                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
499                 break;
500
501         case CTDB_CONTROL_ENABLE_SEQNUM:
502                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
503                 break;
504
505         case CTDB_CONTROL_UPDATE_SEQNUM:
506                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
507                 break;
508
509         case CTDB_CONTROL_SET_RECMASTER:
510                 ctdb_uint32_push(&cd->data.recmaster, buf, &np);
511                 break;
512
513         case CTDB_CONTROL_TCP_CLIENT:
514                 ctdb_connection_push(cd->data.conn, buf, &np);
515                 break;
516
517         case CTDB_CONTROL_TCP_ADD:
518                 ctdb_connection_push(cd->data.conn, buf, &np);
519                 break;
520
521         case CTDB_CONTROL_TCP_REMOVE:
522                 ctdb_connection_push(cd->data.conn, buf, &np);
523                 break;
524
525         case CTDB_CONTROL_SET_TUNABLE:
526                 ctdb_tunable_push(cd->data.tunable, buf, &np);
527                 break;
528
529         case CTDB_CONTROL_GET_TUNABLE:
530                 ctdb_stringn_push(&cd->data.tun_var, buf, &np);
531                 break;
532
533         case CTDB_CONTROL_MODIFY_FLAGS:
534                 ctdb_node_flag_change_push(cd->data.flag_change, buf, &np);
535                 break;
536
537         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
538                 ctdb_sock_addr_push(cd->data.addr, buf, &np);
539                 break;
540
541         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
542                 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
543                 break;
544
545         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
546                 ctdb_string_push(&cd->data.db_name, buf, &np);
547                 break;
548
549         case CTDB_CONTROL_UPDATE_RECORD:
550                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
551                 break;
552
553         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
554                 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
555                 break;
556
557         case CTDB_CONTROL_WIPE_DATABASE:
558                 ctdb_transdb_push(cd->data.transdb, buf, &np);
559                 break;
560
561         case CTDB_CONTROL_TRY_DELETE_RECORDS:
562                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
563                 break;
564
565         case CTDB_CONTROL_ADD_PUBLIC_IP:
566                 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
567                 break;
568
569         case CTDB_CONTROL_DEL_PUBLIC_IP:
570                 ctdb_addr_info_push(cd->data.addr_info, buf, &np);
571                 break;
572
573         case CTDB_CONTROL_RELEASE_IP:
574                 ctdb_public_ip_push(cd->data.pubip, buf, &np);
575                 break;
576
577         case CTDB_CONTROL_TAKEOVER_IP:
578                 ctdb_public_ip_push(cd->data.pubip, buf, &np);
579                 break;
580
581         case CTDB_CONTROL_TRAVERSE_KILL:
582                 ctdb_traverse_start_push(cd->data.traverse_start, buf, &np);
583                 break;
584
585         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
586                 ctdb_double_push(&cd->data.reclock_latency, buf, &np);
587                 break;
588
589         case CTDB_CONTROL_SET_LMASTERROLE:
590                 ctdb_uint32_push(&cd->data.role, buf, &np);
591                 break;
592
593         case CTDB_CONTROL_SET_RECMASTERROLE:
594                 ctdb_uint32_push(&cd->data.role, buf, &np);
595                 break;
596
597         case CTDB_CONTROL_SET_BAN_STATE:
598                 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
599                 break;
600
601         case CTDB_CONTROL_REGISTER_NOTIFY:
602                 ctdb_notify_data_push(cd->data.notify, buf, &np);
603                 break;
604
605         case CTDB_CONTROL_DEREGISTER_NOTIFY:
606                 ctdb_uint64_push(&cd->data.srvid, buf, &np);
607                 break;
608
609         case CTDB_CONTROL_TRANS3_COMMIT:
610                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
611                 break;
612
613         case CTDB_CONTROL_GET_DB_SEQNUM:
614                 u32 = 0;
615                 offset = 0;
616                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
617                 offset += np;
618                 ctdb_uint32_push(&u32, buf+offset, &np);
619                 offset += np;
620                 np = offset;
621                 break;
622
623         case CTDB_CONTROL_DB_SET_HEALTHY:
624                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
625                 break;
626
627         case CTDB_CONTROL_DB_GET_HEALTH:
628                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
629                 break;
630
631         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
632                 ctdb_sock_addr_push(cd->data.addr, buf, &np);
633                 break;
634
635         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
636                 ctdb_iface_push(cd->data.iface, buf, &np);
637                 break;
638
639         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
640                 ctdb_connection_push(cd->data.conn, buf, &np);
641                 break;
642
643         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
644                 ctdb_key_data_push(cd->data.key, buf, &np);
645                 break;
646
647         case CTDB_CONTROL_SET_DB_READONLY:
648                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
649                 break;
650
651         case CTDB_CONTROL_CHECK_SRVIDS:
652                 break;
653
654         case CTDB_CONTROL_TRAVERSE_START_EXT:
655                 ctdb_traverse_start_ext_push(cd->data.traverse_start_ext, buf,
656                                              &np);
657                 break;
658
659         case CTDB_CONTROL_GET_DB_STATISTICS:
660                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
661                 break;
662
663         case CTDB_CONTROL_SET_DB_STICKY:
664                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
665                 break;
666
667         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
668                 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf,
669                                            &np);
670                 break;
671
672         case CTDB_CONTROL_RECEIVE_RECORDS:
673                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
674                 break;
675
676         case CTDB_CONTROL_DB_DETACH:
677                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
678                 break;
679
680         case CTDB_CONTROL_DB_FREEZE:
681                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
682                 break;
683
684         case CTDB_CONTROL_DB_THAW:
685                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
686                 break;
687
688         case CTDB_CONTROL_DB_TRANSACTION_START:
689                 ctdb_transdb_push(cd->data.transdb, buf, &np);
690                 break;
691
692         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
693                 ctdb_transdb_push(cd->data.transdb, buf, &np);
694                 break;
695
696         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
697                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
698                 break;
699
700         case CTDB_CONTROL_DB_PULL:
701                 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
702                 break;
703
704         case CTDB_CONTROL_DB_PUSH_START:
705                 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
706                 break;
707
708         case CTDB_CONTROL_DB_PUSH_CONFIRM:
709                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
710                 break;
711
712         case CTDB_CONTROL_DB_OPEN_FLAGS:
713                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
714                 break;
715
716         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
717                 ctdb_string_push(&cd->data.db_name, buf, &np);
718                 break;
719         }
720
721         *npush = np;
722 }
723
724 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
725                                       uint32_t opcode,
726                                       TALLOC_CTX *mem_ctx,
727                                       struct ctdb_req_control_data *cd,
728                                       size_t *npull)
729 {
730         size_t np = 0, offset;
731         uint32_t u32;
732         int ret = 0;
733
734         cd->opcode = opcode;
735
736         switch (opcode) {
737         case CTDB_CONTROL_PROCESS_EXISTS:
738                 ret = ctdb_pid_pull(buf, buflen, &cd->data.pid, &np);
739                 break;
740
741         case CTDB_CONTROL_GETDBPATH:
742                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
743                 break;
744
745         case CTDB_CONTROL_SETVNNMAP:
746                 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
747                                         &cd->data.vnnmap, &np);
748                 break;
749
750         case CTDB_CONTROL_SET_DEBUG:
751                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
752                 break;
753
754         case CTDB_CONTROL_PULL_DB:
755                 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
756                                        &cd->data.pulldb, &np);
757                 break;
758
759         case CTDB_CONTROL_PUSH_DB:
760                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
761                                            &cd->data.recbuf, &np);
762                 break;
763
764         case CTDB_CONTROL_SET_RECMODE:
765                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
766                 break;
767
768         case CTDB_CONTROL_DB_ATTACH:
769                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
770                                        &cd->data.db_name, &np);
771                 break;
772
773         case CTDB_CONTROL_SET_CALL:
774                 break;
775
776         case CTDB_CONTROL_TRAVERSE_START:
777                 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
778                                                &cd->data.traverse_start, &np);
779                 break;
780
781         case CTDB_CONTROL_TRAVERSE_ALL:
782                 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
783                                              &cd->data.traverse_all, &np);
784                 break;
785
786         case CTDB_CONTROL_TRAVERSE_DATA:
787                 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
788                                          &cd->data.rec_data, &np);
789                 break;
790
791         case CTDB_CONTROL_GET_DBNAME:
792                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
793                 break;
794
795         case CTDB_CONTROL_ENABLE_SEQNUM:
796                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
797                 break;
798
799         case CTDB_CONTROL_UPDATE_SEQNUM:
800                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
801                 break;
802
803         case CTDB_CONTROL_SET_RECMASTER:
804                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmaster, &np);
805                 break;
806
807         case CTDB_CONTROL_TCP_CLIENT:
808                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
809                                            &cd->data.conn, &np);
810                 break;
811
812         case CTDB_CONTROL_TCP_ADD:
813                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
814                                            &cd->data.conn, &np);
815                 break;
816
817         case CTDB_CONTROL_TCP_REMOVE:
818                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
819                                            &cd->data.conn, &np);
820                 break;
821
822         case CTDB_CONTROL_SET_TUNABLE:
823                 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
824                                         &cd->data.tunable, &np);
825                 break;
826
827         case CTDB_CONTROL_GET_TUNABLE:
828                 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
829                                         &cd->data.tun_var, &np);
830                 break;
831
832         case CTDB_CONTROL_MODIFY_FLAGS:
833                 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
834                                                  &cd->data.flag_change, &np);
835                 break;
836
837         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
838                 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
839                                           &cd->data.addr, &np);
840                 break;
841
842         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
843                 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
844                                             &cd->data.tickles, &np);
845                 break;
846
847         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
848                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
849                                        &cd->data.db_name, &np);
850                 break;
851
852         case CTDB_CONTROL_UPDATE_RECORD:
853                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
854                                            &cd->data.recbuf, &np);
855                 break;
856
857         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
858                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
859                                           &cd->data.addr_info, &np);
860                 break;
861
862         case CTDB_CONTROL_WIPE_DATABASE:
863                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
864                                        &cd->data.transdb, &np);
865                 break;
866
867         case CTDB_CONTROL_TRY_DELETE_RECORDS:
868                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
869                                            &cd->data.recbuf, &np);
870                 break;
871
872         case CTDB_CONTROL_ADD_PUBLIC_IP:
873                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
874                                           &cd->data.addr_info, &np);
875                 break;
876
877         case CTDB_CONTROL_DEL_PUBLIC_IP:
878                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
879                                           &cd->data.addr_info, &np);
880                 break;
881
882         case CTDB_CONTROL_RELEASE_IP:
883                 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
884                                           &cd->data.pubip, &np);
885                 break;
886
887         case CTDB_CONTROL_TAKEOVER_IP:
888                 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
889                                           &cd->data.pubip, &np);
890                 break;
891
892         case CTDB_CONTROL_TRAVERSE_KILL:
893                 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
894                                                &cd->data.traverse_start, &np);
895                 break;
896
897         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
898                 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
899                                        &np);
900                 break;
901
902         case CTDB_CONTROL_SET_LMASTERROLE:
903                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
904                 break;
905
906         case CTDB_CONTROL_SET_RECMASTERROLE:
907                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
908                 break;
909
910         case CTDB_CONTROL_SET_BAN_STATE:
911                 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
912                                           &cd->data.ban_state, &np);
913                 break;
914
915         case CTDB_CONTROL_REGISTER_NOTIFY:
916                 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
917                                             &cd->data.notify, &np);
918                 break;
919
920         case CTDB_CONTROL_DEREGISTER_NOTIFY:
921                 ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
922                 break;
923
924         case CTDB_CONTROL_TRANS3_COMMIT:
925                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
926                                            &cd->data.recbuf, &np);
927                 break;
928
929         case CTDB_CONTROL_GET_DB_SEQNUM:
930                 offset = 0;
931                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
932                 if (ret != 0) {
933                         break;
934                 }
935                 offset += np;
936                 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
937                 offset += np;
938                 np = offset;
939                 break;
940
941         case CTDB_CONTROL_DB_SET_HEALTHY:
942                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
943                 break;
944
945         case CTDB_CONTROL_DB_GET_HEALTH:
946                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
947                 break;
948
949         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
950                 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
951                                           &cd->data.addr, &np);
952                 break;
953
954         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
955                 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
956                                       &cd->data.iface, &np);
957                 break;
958
959         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
960                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
961                                            &cd->data.conn, &np);
962                 break;
963
964         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
965                 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
966                                          &cd->data.key, &np);
967                 break;
968
969         case CTDB_CONTROL_SET_DB_READONLY:
970                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
971                 break;
972
973         case CTDB_CONTROL_CHECK_SRVIDS:
974                 break;
975
976         case CTDB_CONTROL_TRAVERSE_START_EXT:
977                 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
978                                                    &cd->data.traverse_start_ext,
979                                                    &np);
980                 break;
981
982         case CTDB_CONTROL_GET_DB_STATISTICS:
983                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
984                 break;
985
986         case CTDB_CONTROL_SET_DB_STICKY:
987                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
988                 break;
989
990         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
991                 ret = ctdb_traverse_all_ext_pull(buf, buflen, mem_ctx,
992                                                  &cd->data.traverse_all_ext,
993                                                  &np);
994                 break;
995
996         case CTDB_CONTROL_RECEIVE_RECORDS:
997                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
998                                            &cd->data.recbuf, &np);
999                 break;
1000
1001         case CTDB_CONTROL_DB_DETACH:
1002                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1003                 break;
1004
1005         case CTDB_CONTROL_DB_FREEZE:
1006                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1007                 break;
1008
1009         case CTDB_CONTROL_DB_THAW:
1010                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1011                 break;
1012
1013         case CTDB_CONTROL_DB_TRANSACTION_START:
1014                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1015                                         &cd->data.transdb, &np);
1016                 break;
1017
1018         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1019                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1020                                         &cd->data.transdb, &np);
1021                 break;
1022
1023         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1024                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1025                 break;
1026
1027         case CTDB_CONTROL_DB_PULL:
1028                 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1029                                            &cd->data.pulldb_ext, &np);
1030                 break;
1031
1032         case CTDB_CONTROL_DB_PUSH_START:
1033                 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1034                                            &cd->data.pulldb_ext, &np);
1035                 break;
1036
1037         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1038                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1039                 break;
1040
1041         case CTDB_CONTROL_DB_OPEN_FLAGS:
1042                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1043                 break;
1044
1045         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1046                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1047                                        &cd->data.db_name, &np);
1048                 break;
1049         }
1050
1051         if (ret != 0) {
1052                 return ret;
1053         }
1054
1055         *npull = np;
1056         return 0;
1057 }
1058
1059 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1060 {
1061         size_t len = 0;
1062
1063         if (cd == NULL) {
1064                 return 0;
1065         }
1066
1067         switch (cd->opcode) {
1068         case CTDB_CONTROL_PROCESS_EXISTS:
1069                 break;
1070
1071         case CTDB_CONTROL_STATISTICS:
1072                 len = ctdb_statistics_len(cd->data.stats);
1073                 break;
1074
1075         case CTDB_CONTROL_PING:
1076                 break;
1077
1078         case CTDB_CONTROL_GETDBPATH:
1079                 len = ctdb_string_len(&cd->data.db_path);
1080                 break;
1081
1082         case CTDB_CONTROL_GETVNNMAP:
1083                 len = ctdb_vnn_map_len(cd->data.vnnmap);
1084                 break;
1085
1086         case CTDB_CONTROL_SETVNNMAP:
1087                 break;
1088
1089         case CTDB_CONTROL_GET_DEBUG:
1090                 len = ctdb_uint32_len(&cd->data.loglevel);
1091                 break;
1092
1093         case CTDB_CONTROL_SET_DEBUG:
1094                 break;
1095
1096         case CTDB_CONTROL_GET_DBMAP:
1097                 len = ctdb_dbid_map_len(cd->data.dbmap);
1098                 break;
1099
1100         case CTDB_CONTROL_PULL_DB:
1101                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1102                 break;
1103
1104         case CTDB_CONTROL_PUSH_DB:
1105                 break;
1106
1107         case CTDB_CONTROL_GET_RECMODE:
1108                 break;
1109
1110         case CTDB_CONTROL_SET_RECMODE:
1111                 break;
1112
1113         case CTDB_CONTROL_STATISTICS_RESET:
1114                 break;
1115
1116         case CTDB_CONTROL_DB_ATTACH:
1117                 len = ctdb_uint32_len(&cd->data.db_id);
1118                 break;
1119
1120         case CTDB_CONTROL_SET_CALL:
1121                 break;
1122
1123         case CTDB_CONTROL_TRAVERSE_START:
1124                 break;
1125
1126         case CTDB_CONTROL_TRAVERSE_ALL:
1127                 break;
1128
1129         case CTDB_CONTROL_TRAVERSE_DATA:
1130                 break;
1131
1132         case CTDB_CONTROL_REGISTER_SRVID:
1133                 break;
1134
1135         case CTDB_CONTROL_DEREGISTER_SRVID:
1136                 break;
1137
1138         case CTDB_CONTROL_GET_DBNAME:
1139                 len = ctdb_string_len(&cd->data.db_name);
1140                 break;
1141
1142         case CTDB_CONTROL_ENABLE_SEQNUM:
1143                 break;
1144
1145         case CTDB_CONTROL_UPDATE_SEQNUM:
1146                 break;
1147
1148         case CTDB_CONTROL_DUMP_MEMORY:
1149                 len = ctdb_string_len(&cd->data.mem_str);
1150                 break;
1151
1152         case CTDB_CONTROL_GET_PID:
1153                 break;
1154
1155         case CTDB_CONTROL_GET_RECMASTER:
1156                 break;
1157
1158         case CTDB_CONTROL_SET_RECMASTER:
1159                 break;
1160
1161         case CTDB_CONTROL_FREEZE:
1162                 break;
1163
1164         case CTDB_CONTROL_GET_PNN:
1165                 break;
1166
1167         case CTDB_CONTROL_SHUTDOWN:
1168                 break;
1169
1170         case CTDB_CONTROL_GET_MONMODE:
1171                 break;
1172
1173         case CTDB_CONTROL_TCP_CLIENT:
1174                 break;
1175
1176         case CTDB_CONTROL_TCP_ADD:
1177                 break;
1178
1179         case CTDB_CONTROL_TCP_REMOVE:
1180                 break;
1181
1182         case CTDB_CONTROL_STARTUP:
1183                 break;
1184
1185         case CTDB_CONTROL_SET_TUNABLE:
1186                 break;
1187
1188         case CTDB_CONTROL_GET_TUNABLE:
1189                 len = ctdb_uint32_len(&cd->data.tun_value);
1190                 break;
1191
1192         case CTDB_CONTROL_LIST_TUNABLES:
1193                 len = ctdb_var_list_len(cd->data.tun_var_list);
1194                 break;
1195
1196         case CTDB_CONTROL_MODIFY_FLAGS:
1197                 break;
1198
1199         case CTDB_CONTROL_GET_ALL_TUNABLES:
1200                 len = ctdb_tunable_list_len(cd->data.tun_list);
1201                 break;
1202
1203         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1204                 len = ctdb_tickle_list_len(cd->data.tickles);
1205                 break;
1206
1207         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1208                 break;
1209
1210         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1211                 len = ctdb_uint32_len(&cd->data.db_id);
1212                 break;
1213
1214         case CTDB_CONTROL_UPDATE_RECORD:
1215                 break;
1216
1217         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1218                 break;
1219
1220         case CTDB_CONTROL_WIPE_DATABASE:
1221                 break;
1222
1223         case CTDB_CONTROL_UPTIME:
1224                 len = ctdb_uptime_len(cd->data.uptime);
1225                 break;
1226
1227         case CTDB_CONTROL_START_RECOVERY:
1228                 break;
1229
1230         case CTDB_CONTROL_END_RECOVERY:
1231                 break;
1232
1233         case CTDB_CONTROL_RELOAD_NODES_FILE:
1234                 break;
1235
1236         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1237                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1238                 break;
1239
1240         case CTDB_CONTROL_ENABLE_MONITOR:
1241                 break;
1242
1243         case CTDB_CONTROL_DISABLE_MONITOR:
1244                 break;
1245
1246         case CTDB_CONTROL_ADD_PUBLIC_IP:
1247                 break;
1248
1249         case CTDB_CONTROL_DEL_PUBLIC_IP:
1250                 break;
1251
1252         case CTDB_CONTROL_GET_CAPABILITIES:
1253                 len = ctdb_uint32_len(&cd->data.caps);
1254                 break;
1255
1256         case CTDB_CONTROL_RECD_PING:
1257                 break;
1258
1259         case CTDB_CONTROL_RELEASE_IP:
1260                 break;
1261
1262         case CTDB_CONTROL_TAKEOVER_IP:
1263                 break;
1264
1265         case CTDB_CONTROL_GET_PUBLIC_IPS:
1266                 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1267                 break;
1268
1269         case CTDB_CONTROL_GET_NODEMAP:
1270                 len = ctdb_node_map_len(cd->data.nodemap);
1271                 break;
1272
1273         case CTDB_CONTROL_TRAVERSE_KILL:
1274                 break;
1275
1276         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1277                 break;
1278
1279         case CTDB_CONTROL_GET_RECLOCK_FILE:
1280                 len = ctdb_string_len(&cd->data.reclock_file);
1281                 break;
1282
1283         case CTDB_CONTROL_STOP_NODE:
1284                 break;
1285
1286         case CTDB_CONTROL_CONTINUE_NODE:
1287                 break;
1288
1289         case CTDB_CONTROL_SET_LMASTERROLE:
1290                 break;
1291
1292         case CTDB_CONTROL_SET_RECMASTERROLE:
1293                 break;
1294
1295         case CTDB_CONTROL_SET_BAN_STATE:
1296                 break;
1297
1298         case CTDB_CONTROL_GET_BAN_STATE:
1299                 len = ctdb_ban_state_len(cd->data.ban_state);
1300                 break;
1301
1302         case CTDB_CONTROL_SET_DB_PRIORITY:
1303                 break;
1304
1305         case CTDB_CONTROL_GET_DB_PRIORITY:
1306                 break;
1307
1308         case CTDB_CONTROL_REGISTER_NOTIFY:
1309                 break;
1310
1311         case CTDB_CONTROL_DEREGISTER_NOTIFY:
1312                 break;
1313
1314         case CTDB_CONTROL_TRANS3_COMMIT:
1315                 break;
1316
1317         case CTDB_CONTROL_GET_DB_SEQNUM:
1318                 len = ctdb_uint64_len(&cd->data.seqnum);
1319                 break;
1320
1321         case CTDB_CONTROL_DB_SET_HEALTHY:
1322                 break;
1323
1324         case CTDB_CONTROL_DB_GET_HEALTH:
1325                 len = ctdb_string_len(&cd->data.reason);
1326                 break;
1327
1328         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1329                 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1330                 break;
1331
1332         case CTDB_CONTROL_GET_IFACES:
1333                 len = ctdb_iface_list_len(cd->data.iface_list);
1334                 break;
1335
1336         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1337                 break;
1338
1339         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1340                 break;
1341
1342         case CTDB_CONTROL_GET_STAT_HISTORY:
1343                 len = ctdb_statistics_list_len(cd->data.stats_list);
1344                 break;
1345
1346         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1347                 break;
1348
1349         case CTDB_CONTROL_SET_DB_READONLY:
1350                 break;
1351
1352         case CTDB_CONTROL_CHECK_SRVIDS:
1353                 break;
1354
1355         case CTDB_CONTROL_TRAVERSE_START_EXT:
1356                 break;
1357
1358         case CTDB_CONTROL_GET_DB_STATISTICS:
1359                 len = ctdb_db_statistics_len(cd->data.dbstats);
1360                 break;
1361
1362         case CTDB_CONTROL_SET_DB_STICKY:
1363                 break;
1364
1365         case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1366                 break;
1367
1368         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1369                 break;
1370
1371         case CTDB_CONTROL_RECEIVE_RECORDS:
1372                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1373                 break;
1374
1375         case CTDB_CONTROL_IPREALLOCATED:
1376                 break;
1377
1378         case CTDB_CONTROL_GET_RUNSTATE:
1379                 len = ctdb_uint32_len(&cd->data.runstate);
1380                 break;
1381
1382         case CTDB_CONTROL_DB_DETACH:
1383                 break;
1384
1385         case CTDB_CONTROL_GET_NODES_FILE:
1386                 len = ctdb_node_map_len(cd->data.nodemap);
1387                 break;
1388
1389         case CTDB_CONTROL_DB_FREEZE:
1390                 break;
1391
1392         case CTDB_CONTROL_DB_THAW:
1393                 break;
1394
1395         case CTDB_CONTROL_DB_TRANSACTION_START:
1396                 break;
1397
1398         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1399                 break;
1400
1401         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1402                 break;
1403
1404         case CTDB_CONTROL_DB_PULL:
1405                 len = ctdb_uint32_len(&cd->data.num_records);
1406                 break;
1407
1408         case CTDB_CONTROL_DB_PUSH_START:
1409                 break;
1410
1411         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1412                 len = ctdb_uint32_len(&cd->data.num_records);
1413                 break;
1414
1415         case CTDB_CONTROL_DB_OPEN_FLAGS:
1416                 len = ctdb_int32_len(&cd->data.tdb_flags);
1417                 break;
1418
1419         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1420                 len = ctdb_uint32_len(&cd->data.db_id);
1421                 break;
1422         }
1423
1424         return len;
1425 }
1426
1427 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1428                                          uint8_t *buf, size_t *npush)
1429 {
1430         size_t np = 0;
1431
1432         switch (cd->opcode) {
1433         case CTDB_CONTROL_STATISTICS:
1434                 ctdb_statistics_push(cd->data.stats, buf, &np);
1435                 break;
1436
1437         case CTDB_CONTROL_GETDBPATH:
1438                 ctdb_string_push(&cd->data.db_path, buf, &np);
1439                 break;
1440
1441         case CTDB_CONTROL_GETVNNMAP:
1442                 ctdb_vnn_map_push(cd->data.vnnmap, buf, &np);
1443                 break;
1444
1445         case CTDB_CONTROL_GET_DEBUG:
1446                 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1447                 break;
1448
1449         case CTDB_CONTROL_GET_DBMAP:
1450                 ctdb_dbid_map_push(cd->data.dbmap, buf, &np);
1451                 break;
1452
1453         case CTDB_CONTROL_PULL_DB:
1454                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1455                 break;
1456
1457         case CTDB_CONTROL_PUSH_DB:
1458                 break;
1459
1460         case CTDB_CONTROL_DB_ATTACH:
1461                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1462                 break;
1463
1464         case CTDB_CONTROL_GET_DBNAME:
1465                 ctdb_string_push(&cd->data.db_name, buf, &np);
1466                 break;
1467
1468         case CTDB_CONTROL_DUMP_MEMORY:
1469                 ctdb_string_push(&cd->data.mem_str, buf, &np);
1470                 break;
1471
1472         case CTDB_CONTROL_GET_PID:
1473                 break;
1474
1475         case CTDB_CONTROL_GET_RECMASTER:
1476                 break;
1477
1478         case CTDB_CONTROL_GET_TUNABLE:
1479                 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1480                 break;
1481
1482         case CTDB_CONTROL_LIST_TUNABLES:
1483                 ctdb_var_list_push(cd->data.tun_var_list, buf, &np);
1484                 break;
1485
1486         case CTDB_CONTROL_GET_ALL_TUNABLES:
1487                 ctdb_tunable_list_push(cd->data.tun_list, buf, &np);
1488                 break;
1489
1490         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1491                 ctdb_tickle_list_push(cd->data.tickles, buf, &np);
1492                 break;
1493
1494         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1495                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1496                 break;
1497
1498         case CTDB_CONTROL_UPTIME:
1499                 ctdb_uptime_push(cd->data.uptime, buf, &np);
1500                 break;
1501
1502         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1503                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1504                 break;
1505
1506         case CTDB_CONTROL_GET_CAPABILITIES:
1507                 ctdb_uint32_push(&cd->data.caps, buf, &np);
1508                 break;
1509
1510         case CTDB_CONTROL_GET_PUBLIC_IPS:
1511                 ctdb_public_ip_list_push(cd->data.pubip_list, buf, &np);
1512                 break;
1513
1514         case CTDB_CONTROL_GET_NODEMAP:
1515                 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1516                 break;
1517
1518         case CTDB_CONTROL_GET_RECLOCK_FILE:
1519                 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1520                 break;
1521
1522         case CTDB_CONTROL_GET_BAN_STATE:
1523                 ctdb_ban_state_push(cd->data.ban_state, buf, &np);
1524                 break;
1525
1526         case CTDB_CONTROL_GET_DB_PRIORITY:
1527                 break;
1528
1529         case CTDB_CONTROL_GET_DB_SEQNUM:
1530                 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1531                 break;
1532
1533         case CTDB_CONTROL_DB_GET_HEALTH:
1534                 ctdb_string_push(&cd->data.reason, buf, &np);
1535                 break;
1536
1537         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1538                 ctdb_public_ip_info_push(cd->data.ipinfo, buf, &np);
1539                 break;
1540
1541         case CTDB_CONTROL_GET_IFACES:
1542                 ctdb_iface_list_push(cd->data.iface_list, buf, &np);
1543                 break;
1544
1545         case CTDB_CONTROL_GET_STAT_HISTORY:
1546                 ctdb_statistics_list_push(cd->data.stats_list, buf, &np);
1547                 break;
1548
1549         case CTDB_CONTROL_CHECK_SRVIDS:
1550                 break;
1551
1552         case CTDB_CONTROL_GET_DB_STATISTICS:
1553                 ctdb_db_statistics_push(cd->data.dbstats, buf, &np);
1554                 break;
1555
1556         case CTDB_CONTROL_RECEIVE_RECORDS:
1557                 ctdb_rec_buffer_push(cd->data.recbuf, buf, &np);
1558                 break;
1559
1560         case CTDB_CONTROL_GET_RUNSTATE:
1561                 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1562                 break;
1563
1564         case CTDB_CONTROL_GET_NODES_FILE:
1565                 ctdb_node_map_push(cd->data.nodemap, buf, &np);
1566                 break;
1567
1568         case CTDB_CONTROL_DB_PULL:
1569                 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1570                 break;
1571
1572         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1573                 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1574                 break;
1575
1576         case CTDB_CONTROL_DB_OPEN_FLAGS:
1577                 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1578                 break;
1579
1580         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1581                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1582                 break;
1583         }
1584
1585         *npush = np;
1586 }
1587
1588 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1589                                         uint32_t opcode, TALLOC_CTX *mem_ctx,
1590                                         struct ctdb_reply_control_data *cd,
1591                                         size_t *npull)
1592 {
1593         size_t np = 0;
1594         int ret = 0;
1595
1596         cd->opcode = opcode;
1597
1598         switch (opcode) {
1599         case CTDB_CONTROL_STATISTICS:
1600                 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1601                                            &cd->data.stats, &np);
1602                 break;
1603
1604         case CTDB_CONTROL_GETDBPATH:
1605                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1606                                        &cd->data.db_path, &np);
1607                 break;
1608
1609         case CTDB_CONTROL_GETVNNMAP:
1610                 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1611                                         &cd->data.vnnmap, &np);
1612                 break;
1613
1614         case CTDB_CONTROL_GET_DEBUG:
1615                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1616                 break;
1617
1618         case CTDB_CONTROL_GET_DBMAP:
1619                 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1620                                          &cd->data.dbmap, &np);
1621                 break;
1622
1623         case CTDB_CONTROL_PULL_DB:
1624                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1625                                            &cd->data.recbuf, &np);
1626                 break;
1627
1628         case CTDB_CONTROL_PUSH_DB:
1629                 break;
1630
1631         case CTDB_CONTROL_DB_ATTACH:
1632                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1633                 break;
1634
1635         case CTDB_CONTROL_GET_DBNAME:
1636                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1637                                        &cd->data.db_name, &np);
1638                 break;
1639
1640         case CTDB_CONTROL_DUMP_MEMORY:
1641                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1642                                        &cd->data.mem_str, &np);
1643                 break;
1644
1645         case CTDB_CONTROL_GET_PID:
1646                 break;
1647
1648         case CTDB_CONTROL_GET_RECMASTER:
1649                 break;
1650
1651         case CTDB_CONTROL_GET_TUNABLE:
1652                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1653                                        &np);
1654                 break;
1655
1656         case CTDB_CONTROL_LIST_TUNABLES:
1657                 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1658                                          &cd->data.tun_var_list, &np);
1659                 break;
1660
1661         case CTDB_CONTROL_GET_ALL_TUNABLES:
1662                 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1663                                              &cd->data.tun_list, &np);
1664                 break;
1665
1666         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1667                 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1668                                             &cd->data.tickles, &np);
1669                 break;
1670
1671         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1672                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1673                 break;
1674
1675         case CTDB_CONTROL_UPTIME:
1676                 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1677                                        &cd->data.uptime, &np);
1678                 break;
1679
1680         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1681                 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1682                                      &cd->data.recbuf, &np);
1683                 break;
1684
1685         case CTDB_CONTROL_GET_CAPABILITIES:
1686                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1687                 break;
1688
1689         case CTDB_CONTROL_GET_PUBLIC_IPS:
1690                 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1691                                                &cd->data.pubip_list, &np);
1692                 break;
1693
1694         case CTDB_CONTROL_GET_NODEMAP:
1695                 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1696                                          &cd->data.nodemap, &np);
1697                 break;
1698
1699         case CTDB_CONTROL_GET_RECLOCK_FILE:
1700                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1701                                        &cd->data.reclock_file, &np);
1702                 break;
1703
1704         case CTDB_CONTROL_GET_BAN_STATE:
1705                 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1706                                           &cd->data.ban_state, &np);
1707                 break;
1708
1709         case CTDB_CONTROL_GET_DB_PRIORITY:
1710                 break;
1711
1712         case CTDB_CONTROL_GET_DB_SEQNUM:
1713                 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1714                 break;
1715
1716         case CTDB_CONTROL_DB_GET_HEALTH:
1717                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1718                                        &cd->data.reason, &np);
1719                 break;
1720
1721         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1722                 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1723                                                &cd->data.ipinfo, &np);
1724                 break;
1725
1726         case CTDB_CONTROL_GET_IFACES:
1727                 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1728                                            &cd->data.iface_list, &np);
1729                 break;
1730
1731         case CTDB_CONTROL_GET_STAT_HISTORY:
1732                 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1733                                                 &cd->data.stats_list, &np);
1734                 break;
1735
1736         case CTDB_CONTROL_CHECK_SRVIDS:
1737                 break;
1738
1739         case CTDB_CONTROL_GET_DB_STATISTICS:
1740                 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1741                                               &cd->data.dbstats, &np);
1742                 break;
1743
1744         case CTDB_CONTROL_RECEIVE_RECORDS:
1745                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1746                                            &cd->data.recbuf, &np);
1747                 break;
1748
1749         case CTDB_CONTROL_GET_RUNSTATE:
1750                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1751                 break;
1752
1753         case CTDB_CONTROL_GET_NODES_FILE:
1754                 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1755                                          &cd->data.nodemap, &np);
1756                 break;
1757
1758         case CTDB_CONTROL_DB_PULL:
1759                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1760                                        &np);
1761                 break;
1762
1763         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1764                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1765                                        &np);
1766                 break;
1767
1768         case CTDB_CONTROL_DB_OPEN_FLAGS:
1769                 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1770                 break;
1771
1772         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1773                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1774                 break;
1775         }
1776
1777         if (ret != 0) {
1778                 return ret;
1779         }
1780
1781         *npull = np;
1782         return 0;
1783 }
1784
1785 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1786                             struct ctdb_req_control *c)
1787 {
1788         return offsetof(struct ctdb_req_control_wire, data) +
1789                 ctdb_req_control_data_len(&c->rdata);
1790 }
1791
1792 int ctdb_req_control_push(struct ctdb_req_header *h,
1793                           struct ctdb_req_control *request,
1794                           uint8_t *buf, size_t *buflen)
1795 {
1796         struct ctdb_req_control_wire *wire =
1797                 (struct ctdb_req_control_wire *)buf;
1798         size_t length, np;
1799
1800         length = ctdb_req_control_len(h, request);
1801         if (*buflen < length) {
1802                 *buflen = length;
1803                 return EMSGSIZE;
1804         }
1805
1806         h->length = *buflen;
1807         ctdb_req_header_push(h, (uint8_t *)&wire->hdr, &np);
1808
1809         wire->opcode = request->opcode;
1810         wire->pad = request->pad;
1811         wire->srvid = request->srvid;
1812         wire->client_id = request->client_id;
1813         wire->flags = request->flags;
1814
1815         wire->datalen = ctdb_req_control_data_len(&request->rdata);
1816         ctdb_req_control_data_push(&request->rdata, wire->data, &np);
1817
1818         return 0;
1819 }
1820
1821 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1822                           struct ctdb_req_header *h,
1823                           TALLOC_CTX *mem_ctx,
1824                           struct ctdb_req_control *c)
1825 {
1826         struct ctdb_req_control_wire *wire =
1827                 (struct ctdb_req_control_wire *)buf;
1828         size_t length, np;
1829         int ret;
1830
1831         length = offsetof(struct ctdb_req_control_wire, data);
1832         if (buflen < length) {
1833                 return EMSGSIZE;
1834         }
1835         if (wire->datalen > buflen) {
1836                 return EMSGSIZE;
1837         }
1838         if (length + wire->datalen < length) {
1839                 return EMSGSIZE;
1840         }
1841         if (buflen < length + wire->datalen) {
1842                 return EMSGSIZE;
1843         }
1844
1845         if (h != NULL) {
1846                 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h,
1847                                            &np);
1848                 if (ret != 0) {
1849                         return ret;
1850                 }
1851         }
1852
1853         c->opcode = wire->opcode;
1854         c->pad = wire->pad;
1855         c->srvid = wire->srvid;
1856         c->client_id = wire->client_id;
1857         c->flags = wire->flags;
1858
1859         ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1860                                          c->opcode, mem_ctx, &c->rdata, &np);
1861         if (ret != 0) {
1862                 return ret;
1863         }
1864
1865         return 0;
1866 }
1867
1868 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1869                               struct ctdb_reply_control *c)
1870 {
1871         return offsetof(struct ctdb_reply_control_wire, data) +
1872                 (c->status == 0 ?
1873                         ctdb_reply_control_data_len(&c->rdata) :
1874                         ctdb_string_len(&c->errmsg));
1875 }
1876
1877 int ctdb_reply_control_push(struct ctdb_req_header *h,
1878                             struct ctdb_reply_control *reply,
1879                             uint8_t *buf, size_t *buflen)
1880 {
1881         struct ctdb_reply_control_wire *wire =
1882                 (struct ctdb_reply_control_wire *)buf;
1883         size_t length, np;
1884
1885         length = ctdb_reply_control_len(h, reply);
1886         if (*buflen < length) {
1887                 *buflen = length;
1888                 return EMSGSIZE;
1889         }
1890
1891         h->length = *buflen;
1892         ctdb_req_header_push(h, (uint8_t *)&wire->hdr, &np);
1893
1894         wire->status = reply->status;
1895
1896         if (reply->status == 0) {
1897                 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1898                 wire->errorlen = 0;
1899                 ctdb_reply_control_data_push(&reply->rdata, wire->data, &np);
1900         } else {
1901                 wire->datalen = 0;
1902                 wire->errorlen = ctdb_string_len(&reply->errmsg);
1903                 ctdb_string_push(&reply->errmsg, wire->data + wire->datalen,
1904                                  &np);
1905         }
1906
1907         return 0;
1908 }
1909
1910 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1911                             struct ctdb_req_header *h,
1912                             TALLOC_CTX *mem_ctx,
1913                             struct ctdb_reply_control *c)
1914 {
1915         struct ctdb_reply_control_wire *wire =
1916                 (struct ctdb_reply_control_wire *)buf;
1917         size_t length, np;
1918         int ret;
1919
1920         length = offsetof(struct ctdb_reply_control_wire, data);
1921         if (buflen < length) {
1922                 return EMSGSIZE;
1923         }
1924         if (wire->datalen > buflen || wire->errorlen > buflen) {
1925                 return EMSGSIZE;
1926         }
1927         if (length + wire->datalen < length) {
1928                 return EMSGSIZE;
1929         }
1930         if (length + wire->datalen + wire->errorlen < length) {
1931                 return EMSGSIZE;
1932         }
1933         if (buflen < length + wire->datalen + wire->errorlen) {
1934                 return EMSGSIZE;
1935         }
1936
1937         if (h != NULL) {
1938                 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h,
1939                                            &np);
1940                 if (ret != 0) {
1941                         return ret;
1942                 }
1943         }
1944
1945         c->status = wire->status;
1946
1947         if (c->status != -1) {
1948                 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
1949                                                    opcode, mem_ctx,
1950                                                    &c->rdata, &np);
1951                 if (ret != 0) {
1952                         return ret;
1953                 }
1954         }
1955
1956         ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
1957                                mem_ctx, &c->errmsg, &np);
1958         if (ret != 0) {
1959                 return ret;
1960         }
1961
1962         return 0;
1963 }