ctdb-protocol: Fix marshalling for a string
[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)
445 {
446         size_t np, offset;
447         uint32_t u32;
448
449         switch (cd->opcode) {
450         case CTDB_CONTROL_PROCESS_EXISTS:
451                 ctdb_pid_push(cd->data.pid, buf);
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);
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);
468                 break;
469
470         case CTDB_CONTROL_PUSH_DB:
471                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
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);
487                 break;
488
489         case CTDB_CONTROL_TRAVERSE_ALL:
490                 ctdb_traverse_all_push(cd->data.traverse_all, buf);
491                 break;
492
493         case CTDB_CONTROL_TRAVERSE_DATA:
494                 ctdb_rec_data_push(cd->data.rec_data, buf);
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);
515                 break;
516
517         case CTDB_CONTROL_TCP_ADD:
518                 ctdb_connection_push(cd->data.conn, buf);
519                 break;
520
521         case CTDB_CONTROL_TCP_REMOVE:
522                 ctdb_connection_push(cd->data.conn, buf);
523                 break;
524
525         case CTDB_CONTROL_SET_TUNABLE:
526                 ctdb_tunable_push(cd->data.tunable, buf);
527                 break;
528
529         case CTDB_CONTROL_GET_TUNABLE:
530                 ctdb_stringn_push(cd->data.tun_var, buf);
531                 break;
532
533         case CTDB_CONTROL_MODIFY_FLAGS:
534                 ctdb_node_flag_change_push(cd->data.flag_change, buf);
535                 break;
536
537         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
538                 ctdb_sock_addr_push(cd->data.addr, buf);
539                 break;
540
541         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
542                 ctdb_tickle_list_push(cd->data.tickles, buf);
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);
551                 break;
552
553         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
554                 ctdb_addr_info_push(cd->data.addr_info, buf);
555                 break;
556
557         case CTDB_CONTROL_WIPE_DATABASE:
558                 ctdb_transdb_push(cd->data.transdb, buf);
559                 break;
560
561         case CTDB_CONTROL_TRY_DELETE_RECORDS:
562                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
563                 break;
564
565         case CTDB_CONTROL_ADD_PUBLIC_IP:
566                 ctdb_addr_info_push(cd->data.addr_info, buf);
567                 break;
568
569         case CTDB_CONTROL_DEL_PUBLIC_IP:
570                 ctdb_addr_info_push(cd->data.addr_info, buf);
571                 break;
572
573         case CTDB_CONTROL_RELEASE_IP:
574                 ctdb_public_ip_push(cd->data.pubip, buf);
575                 break;
576
577         case CTDB_CONTROL_TAKEOVER_IP:
578                 ctdb_public_ip_push(cd->data.pubip, buf);
579                 break;
580
581         case CTDB_CONTROL_TRAVERSE_KILL:
582                 ctdb_traverse_start_push(cd->data.traverse_start, buf);
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);
599                 break;
600
601         case CTDB_CONTROL_REGISTER_NOTIFY:
602                 ctdb_notify_data_push(cd->data.notify, buf);
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);
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);
633                 break;
634
635         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
636                 ctdb_iface_push(cd->data.iface, buf);
637                 break;
638
639         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
640                 ctdb_connection_push(cd->data.conn, buf);
641                 break;
642
643         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
644                 ctdb_key_data_push(cd->data.key, buf);
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                 break;
657
658         case CTDB_CONTROL_GET_DB_STATISTICS:
659                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
660                 break;
661
662         case CTDB_CONTROL_SET_DB_STICKY:
663                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
664                 break;
665
666         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
667                 ctdb_traverse_all_ext_push(cd->data.traverse_all_ext, buf);
668                 break;
669
670         case CTDB_CONTROL_RECEIVE_RECORDS:
671                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
672                 break;
673
674         case CTDB_CONTROL_DB_DETACH:
675                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
676                 break;
677
678         case CTDB_CONTROL_DB_FREEZE:
679                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
680                 break;
681
682         case CTDB_CONTROL_DB_THAW:
683                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
684                 break;
685
686         case CTDB_CONTROL_DB_TRANSACTION_START:
687                 ctdb_transdb_push(cd->data.transdb, buf);
688                 break;
689
690         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
691                 ctdb_transdb_push(cd->data.transdb, buf);
692                 break;
693
694         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
695                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
696                 break;
697
698         case CTDB_CONTROL_DB_PULL:
699                 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
700                 break;
701
702         case CTDB_CONTROL_DB_PUSH_START:
703                 ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
704                 break;
705
706         case CTDB_CONTROL_DB_PUSH_CONFIRM:
707                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
708                 break;
709
710         case CTDB_CONTROL_DB_OPEN_FLAGS:
711                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
712                 break;
713
714         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
715                 ctdb_string_push(&cd->data.db_name, buf, &np);
716                 break;
717         }
718 }
719
720 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
721                                       uint32_t opcode,
722                                       TALLOC_CTX *mem_ctx,
723                                       struct ctdb_req_control_data *cd)
724 {
725         size_t np, offset;
726         uint32_t u32;
727         int ret = 0;
728
729         cd->opcode = opcode;
730
731         switch (opcode) {
732         case CTDB_CONTROL_PROCESS_EXISTS:
733                 ret = ctdb_pid_pull(buf, buflen, mem_ctx,
734                                     &cd->data.pid);
735                 break;
736
737         case CTDB_CONTROL_GETDBPATH:
738                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
739                 break;
740
741         case CTDB_CONTROL_SETVNNMAP:
742                 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
743                                         &cd->data.vnnmap);
744                 break;
745
746         case CTDB_CONTROL_SET_DEBUG:
747                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
748                 break;
749
750         case CTDB_CONTROL_PULL_DB:
751                 ret = ctdb_pulldb_pull(buf, buflen, mem_ctx,
752                                        &cd->data.pulldb);
753                 break;
754
755         case CTDB_CONTROL_PUSH_DB:
756                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
757                                            &cd->data.recbuf);
758                 break;
759
760         case CTDB_CONTROL_SET_RECMODE:
761                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmode, &np);
762                 break;
763
764         case CTDB_CONTROL_DB_ATTACH:
765                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
766                                        &cd->data.db_name, &np);
767                 break;
768
769         case CTDB_CONTROL_SET_CALL:
770                 break;
771
772         case CTDB_CONTROL_TRAVERSE_START:
773                 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
774                                                &cd->data.traverse_start);
775                 break;
776
777         case CTDB_CONTROL_TRAVERSE_ALL:
778                 ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
779                                              &cd->data.traverse_all);
780                 break;
781
782         case CTDB_CONTROL_TRAVERSE_DATA:
783                 ret = ctdb_rec_data_pull(buf, buflen, mem_ctx,
784                                          &cd->data.rec_data);
785                 break;
786
787         case CTDB_CONTROL_GET_DBNAME:
788                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
789                 break;
790
791         case CTDB_CONTROL_ENABLE_SEQNUM:
792                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
793                 break;
794
795         case CTDB_CONTROL_UPDATE_SEQNUM:
796                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
797                 break;
798
799         case CTDB_CONTROL_SET_RECMASTER:
800                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.recmaster, &np);
801                 break;
802
803         case CTDB_CONTROL_TCP_CLIENT:
804                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
805                                            &cd->data.conn);
806                 break;
807
808         case CTDB_CONTROL_TCP_ADD:
809                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
810                                            &cd->data.conn);
811                 break;
812
813         case CTDB_CONTROL_TCP_REMOVE:
814                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
815                                            &cd->data.conn);
816                 break;
817
818         case CTDB_CONTROL_SET_TUNABLE:
819                 ret = ctdb_tunable_pull(buf, buflen, mem_ctx,
820                                         &cd->data.tunable);
821                 break;
822
823         case CTDB_CONTROL_GET_TUNABLE:
824                 ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
825                                         &cd->data.tun_var);
826                 break;
827
828         case CTDB_CONTROL_MODIFY_FLAGS:
829                 ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
830                                                  &cd->data.flag_change);
831                 break;
832
833         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
834                 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
835                                           &cd->data.addr);
836                 break;
837
838         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
839                 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
840                                             &cd->data.tickles);
841                 break;
842
843         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
844                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
845                                        &cd->data.db_name, &np);
846                 break;
847
848         case CTDB_CONTROL_UPDATE_RECORD:
849                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
850                                            &cd->data.recbuf);
851                 break;
852
853         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
854                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
855                                           &cd->data.addr_info);
856                 break;
857
858         case CTDB_CONTROL_WIPE_DATABASE:
859                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
860                                        &cd->data.transdb);
861                 break;
862
863         case CTDB_CONTROL_TRY_DELETE_RECORDS:
864                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
865                                            &cd->data.recbuf);
866                 break;
867
868         case CTDB_CONTROL_ADD_PUBLIC_IP:
869                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
870                                           &cd->data.addr_info);
871                 break;
872
873         case CTDB_CONTROL_DEL_PUBLIC_IP:
874                 ret = ctdb_addr_info_pull(buf, buflen, mem_ctx,
875                                           &cd->data.addr_info);
876                 break;
877
878         case CTDB_CONTROL_RELEASE_IP:
879                 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
880                                           &cd->data.pubip);
881                 break;
882
883         case CTDB_CONTROL_TAKEOVER_IP:
884                 ret = ctdb_public_ip_pull(buf, buflen, mem_ctx,
885                                           &cd->data.pubip);
886                 break;
887
888         case CTDB_CONTROL_TRAVERSE_KILL:
889                 ret = ctdb_traverse_start_pull(buf, buflen, mem_ctx,
890                                                &cd->data.traverse_start);
891                 break;
892
893         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
894                 ret = ctdb_double_pull(buf, buflen, &cd->data.reclock_latency,
895                                        &np);
896                 break;
897
898         case CTDB_CONTROL_SET_LMASTERROLE:
899                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
900                 break;
901
902         case CTDB_CONTROL_SET_RECMASTERROLE:
903                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.role, &np);
904                 break;
905
906         case CTDB_CONTROL_SET_BAN_STATE:
907                 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
908                                           &cd->data.ban_state);
909                 break;
910
911         case CTDB_CONTROL_REGISTER_NOTIFY:
912                 ret = ctdb_notify_data_pull(buf, buflen, mem_ctx,
913                                             &cd->data.notify);
914                 break;
915
916         case CTDB_CONTROL_DEREGISTER_NOTIFY:
917                 ctdb_uint64_pull(buf, buflen, &cd->data.srvid, &np);
918                 break;
919
920         case CTDB_CONTROL_TRANS3_COMMIT:
921                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
922                                            &cd->data.recbuf);
923                 break;
924
925         case CTDB_CONTROL_GET_DB_SEQNUM:
926                 offset = 0;
927                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
928                 if (ret != 0) {
929                         break;
930                 }
931                 offset += np;
932                 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
933                 offset += np;
934                 np = offset;
935                 break;
936
937         case CTDB_CONTROL_DB_SET_HEALTHY:
938                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
939                 break;
940
941         case CTDB_CONTROL_DB_GET_HEALTH:
942                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
943                 break;
944
945         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
946                 ret = ctdb_sock_addr_pull(buf, buflen, mem_ctx,
947                                           &cd->data.addr);
948                 break;
949
950         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
951                 ret = ctdb_iface_pull(buf, buflen, mem_ctx,
952                                       &cd->data.iface);
953                 break;
954
955         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
956                 ret = ctdb_connection_pull(buf, buflen, mem_ctx,
957                                            &cd->data.conn);
958                 break;
959
960         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
961                 ret = ctdb_key_data_pull(buf, buflen, mem_ctx,
962                                          &cd->data.key);
963                 break;
964
965         case CTDB_CONTROL_SET_DB_READONLY:
966                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
967                 break;
968
969         case CTDB_CONTROL_CHECK_SRVIDS:
970                 break;
971
972         case CTDB_CONTROL_TRAVERSE_START_EXT:
973                 ret = ctdb_traverse_start_ext_pull(buf, buflen, mem_ctx,
974                                                    &cd->data.traverse_start_ext);
975                 break;
976
977         case CTDB_CONTROL_GET_DB_STATISTICS:
978                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
979                 break;
980
981         case CTDB_CONTROL_SET_DB_STICKY:
982                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
983                 break;
984
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                 break;
989
990         case CTDB_CONTROL_RECEIVE_RECORDS:
991                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
992                                            &cd->data.recbuf);
993                 break;
994
995         case CTDB_CONTROL_DB_DETACH:
996                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
997                 break;
998
999         case CTDB_CONTROL_DB_FREEZE:
1000                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1001                 break;
1002
1003         case CTDB_CONTROL_DB_THAW:
1004                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1005                 break;
1006
1007         case CTDB_CONTROL_DB_TRANSACTION_START:
1008                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1009                                         &cd->data.transdb);
1010                 break;
1011
1012         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1013                 ret = ctdb_transdb_pull(buf, buflen, mem_ctx,
1014                                         &cd->data.transdb);
1015                 break;
1016
1017         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1018                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1019                 break;
1020
1021         case CTDB_CONTROL_DB_PULL:
1022                 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1023                                            &cd->data.pulldb_ext);
1024                 break;
1025
1026         case CTDB_CONTROL_DB_PUSH_START:
1027                 ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
1028                                            &cd->data.pulldb_ext);
1029                 break;
1030
1031         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1032                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1033                 break;
1034
1035         case CTDB_CONTROL_DB_OPEN_FLAGS:
1036                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1037                 break;
1038
1039         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1040                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1041                                        &cd->data.db_name, &np);
1042                 break;
1043         }
1044
1045         return ret;
1046 }
1047
1048 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
1049 {
1050         size_t len = 0;
1051
1052         if (cd == NULL) {
1053                 return 0;
1054         }
1055
1056         switch (cd->opcode) {
1057         case CTDB_CONTROL_PROCESS_EXISTS:
1058                 break;
1059
1060         case CTDB_CONTROL_STATISTICS:
1061                 len = ctdb_statistics_len(cd->data.stats);
1062                 break;
1063
1064         case CTDB_CONTROL_PING:
1065                 break;
1066
1067         case CTDB_CONTROL_GETDBPATH:
1068                 len = ctdb_string_len(&cd->data.db_path);
1069                 break;
1070
1071         case CTDB_CONTROL_GETVNNMAP:
1072                 len = ctdb_vnn_map_len(cd->data.vnnmap);
1073                 break;
1074
1075         case CTDB_CONTROL_SETVNNMAP:
1076                 break;
1077
1078         case CTDB_CONTROL_GET_DEBUG:
1079                 len = ctdb_uint32_len(&cd->data.loglevel);
1080                 break;
1081
1082         case CTDB_CONTROL_SET_DEBUG:
1083                 break;
1084
1085         case CTDB_CONTROL_GET_DBMAP:
1086                 len = ctdb_dbid_map_len(cd->data.dbmap);
1087                 break;
1088
1089         case CTDB_CONTROL_PULL_DB:
1090                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1091                 break;
1092
1093         case CTDB_CONTROL_PUSH_DB:
1094                 break;
1095
1096         case CTDB_CONTROL_GET_RECMODE:
1097                 break;
1098
1099         case CTDB_CONTROL_SET_RECMODE:
1100                 break;
1101
1102         case CTDB_CONTROL_STATISTICS_RESET:
1103                 break;
1104
1105         case CTDB_CONTROL_DB_ATTACH:
1106                 len = ctdb_uint32_len(&cd->data.db_id);
1107                 break;
1108
1109         case CTDB_CONTROL_SET_CALL:
1110                 break;
1111
1112         case CTDB_CONTROL_TRAVERSE_START:
1113                 break;
1114
1115         case CTDB_CONTROL_TRAVERSE_ALL:
1116                 break;
1117
1118         case CTDB_CONTROL_TRAVERSE_DATA:
1119                 break;
1120
1121         case CTDB_CONTROL_REGISTER_SRVID:
1122                 break;
1123
1124         case CTDB_CONTROL_DEREGISTER_SRVID:
1125                 break;
1126
1127         case CTDB_CONTROL_GET_DBNAME:
1128                 len = ctdb_string_len(&cd->data.db_name);
1129                 break;
1130
1131         case CTDB_CONTROL_ENABLE_SEQNUM:
1132                 break;
1133
1134         case CTDB_CONTROL_UPDATE_SEQNUM:
1135                 break;
1136
1137         case CTDB_CONTROL_DUMP_MEMORY:
1138                 len = ctdb_string_len(&cd->data.mem_str);
1139                 break;
1140
1141         case CTDB_CONTROL_GET_PID:
1142                 break;
1143
1144         case CTDB_CONTROL_GET_RECMASTER:
1145                 break;
1146
1147         case CTDB_CONTROL_SET_RECMASTER:
1148                 break;
1149
1150         case CTDB_CONTROL_FREEZE:
1151                 break;
1152
1153         case CTDB_CONTROL_GET_PNN:
1154                 break;
1155
1156         case CTDB_CONTROL_SHUTDOWN:
1157                 break;
1158
1159         case CTDB_CONTROL_GET_MONMODE:
1160                 break;
1161
1162         case CTDB_CONTROL_TCP_CLIENT:
1163                 break;
1164
1165         case CTDB_CONTROL_TCP_ADD:
1166                 break;
1167
1168         case CTDB_CONTROL_TCP_REMOVE:
1169                 break;
1170
1171         case CTDB_CONTROL_STARTUP:
1172                 break;
1173
1174         case CTDB_CONTROL_SET_TUNABLE:
1175                 break;
1176
1177         case CTDB_CONTROL_GET_TUNABLE:
1178                 len = ctdb_uint32_len(&cd->data.tun_value);
1179                 break;
1180
1181         case CTDB_CONTROL_LIST_TUNABLES:
1182                 len = ctdb_var_list_len(cd->data.tun_var_list);
1183                 break;
1184
1185         case CTDB_CONTROL_MODIFY_FLAGS:
1186                 break;
1187
1188         case CTDB_CONTROL_GET_ALL_TUNABLES:
1189                 len = ctdb_tunable_list_len(cd->data.tun_list);
1190                 break;
1191
1192         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1193                 len = ctdb_tickle_list_len(cd->data.tickles);
1194                 break;
1195
1196         case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1197                 break;
1198
1199         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1200                 len = ctdb_uint32_len(&cd->data.db_id);
1201                 break;
1202
1203         case CTDB_CONTROL_UPDATE_RECORD:
1204                 break;
1205
1206         case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1207                 break;
1208
1209         case CTDB_CONTROL_WIPE_DATABASE:
1210                 break;
1211
1212         case CTDB_CONTROL_UPTIME:
1213                 len = ctdb_uptime_len(cd->data.uptime);
1214                 break;
1215
1216         case CTDB_CONTROL_START_RECOVERY:
1217                 break;
1218
1219         case CTDB_CONTROL_END_RECOVERY:
1220                 break;
1221
1222         case CTDB_CONTROL_RELOAD_NODES_FILE:
1223                 break;
1224
1225         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1226                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1227                 break;
1228
1229         case CTDB_CONTROL_ENABLE_MONITOR:
1230                 break;
1231
1232         case CTDB_CONTROL_DISABLE_MONITOR:
1233                 break;
1234
1235         case CTDB_CONTROL_ADD_PUBLIC_IP:
1236                 break;
1237
1238         case CTDB_CONTROL_DEL_PUBLIC_IP:
1239                 break;
1240
1241         case CTDB_CONTROL_GET_CAPABILITIES:
1242                 len = ctdb_uint32_len(&cd->data.caps);
1243                 break;
1244
1245         case CTDB_CONTROL_RECD_PING:
1246                 break;
1247
1248         case CTDB_CONTROL_RELEASE_IP:
1249                 break;
1250
1251         case CTDB_CONTROL_TAKEOVER_IP:
1252                 break;
1253
1254         case CTDB_CONTROL_GET_PUBLIC_IPS:
1255                 len = ctdb_public_ip_list_len(cd->data.pubip_list);
1256                 break;
1257
1258         case CTDB_CONTROL_GET_NODEMAP:
1259                 len = ctdb_node_map_len(cd->data.nodemap);
1260                 break;
1261
1262         case CTDB_CONTROL_TRAVERSE_KILL:
1263                 break;
1264
1265         case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1266                 break;
1267
1268         case CTDB_CONTROL_GET_RECLOCK_FILE:
1269                 len = ctdb_string_len(&cd->data.reclock_file);
1270                 break;
1271
1272         case CTDB_CONTROL_STOP_NODE:
1273                 break;
1274
1275         case CTDB_CONTROL_CONTINUE_NODE:
1276                 break;
1277
1278         case CTDB_CONTROL_SET_LMASTERROLE:
1279                 break;
1280
1281         case CTDB_CONTROL_SET_RECMASTERROLE:
1282                 break;
1283
1284         case CTDB_CONTROL_SET_BAN_STATE:
1285                 break;
1286
1287         case CTDB_CONTROL_GET_BAN_STATE:
1288                 len = ctdb_ban_state_len(cd->data.ban_state);
1289                 break;
1290
1291         case CTDB_CONTROL_SET_DB_PRIORITY:
1292                 break;
1293
1294         case CTDB_CONTROL_GET_DB_PRIORITY:
1295                 break;
1296
1297         case CTDB_CONTROL_REGISTER_NOTIFY:
1298                 break;
1299
1300         case CTDB_CONTROL_DEREGISTER_NOTIFY:
1301                 break;
1302
1303         case CTDB_CONTROL_TRANS3_COMMIT:
1304                 break;
1305
1306         case CTDB_CONTROL_GET_DB_SEQNUM:
1307                 len = ctdb_uint64_len(&cd->data.seqnum);
1308                 break;
1309
1310         case CTDB_CONTROL_DB_SET_HEALTHY:
1311                 break;
1312
1313         case CTDB_CONTROL_DB_GET_HEALTH:
1314                 len = ctdb_string_len(&cd->data.reason);
1315                 break;
1316
1317         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1318                 len = ctdb_public_ip_info_len(cd->data.ipinfo);
1319                 break;
1320
1321         case CTDB_CONTROL_GET_IFACES:
1322                 len = ctdb_iface_list_len(cd->data.iface_list);
1323                 break;
1324
1325         case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1326                 break;
1327
1328         case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1329                 break;
1330
1331         case CTDB_CONTROL_GET_STAT_HISTORY:
1332                 len = ctdb_statistics_list_len(cd->data.stats_list);
1333                 break;
1334
1335         case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1336                 break;
1337
1338         case CTDB_CONTROL_SET_DB_READONLY:
1339                 break;
1340
1341         case CTDB_CONTROL_CHECK_SRVIDS:
1342                 break;
1343
1344         case CTDB_CONTROL_TRAVERSE_START_EXT:
1345                 break;
1346
1347         case CTDB_CONTROL_GET_DB_STATISTICS:
1348                 len = ctdb_db_statistics_len(cd->data.dbstats);
1349                 break;
1350
1351         case CTDB_CONTROL_SET_DB_STICKY:
1352                 break;
1353
1354         case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1355                 break;
1356
1357         case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1358                 break;
1359
1360         case CTDB_CONTROL_RECEIVE_RECORDS:
1361                 len = ctdb_rec_buffer_len(cd->data.recbuf);
1362                 break;
1363
1364         case CTDB_CONTROL_IPREALLOCATED:
1365                 break;
1366
1367         case CTDB_CONTROL_GET_RUNSTATE:
1368                 len = ctdb_uint32_len(&cd->data.runstate);
1369                 break;
1370
1371         case CTDB_CONTROL_DB_DETACH:
1372                 break;
1373
1374         case CTDB_CONTROL_GET_NODES_FILE:
1375                 len = ctdb_node_map_len(cd->data.nodemap);
1376                 break;
1377
1378         case CTDB_CONTROL_DB_FREEZE:
1379                 break;
1380
1381         case CTDB_CONTROL_DB_THAW:
1382                 break;
1383
1384         case CTDB_CONTROL_DB_TRANSACTION_START:
1385                 break;
1386
1387         case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1388                 break;
1389
1390         case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1391                 break;
1392
1393         case CTDB_CONTROL_DB_PULL:
1394                 len = ctdb_uint32_len(&cd->data.num_records);
1395                 break;
1396
1397         case CTDB_CONTROL_DB_PUSH_START:
1398                 break;
1399
1400         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1401                 len = ctdb_uint32_len(&cd->data.num_records);
1402                 break;
1403
1404         case CTDB_CONTROL_DB_OPEN_FLAGS:
1405                 len = ctdb_int32_len(&cd->data.tdb_flags);
1406                 break;
1407
1408         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1409                 len = ctdb_uint32_len(&cd->data.db_id);
1410                 break;
1411         }
1412
1413         return len;
1414 }
1415
1416 static void ctdb_reply_control_data_push(struct ctdb_reply_control_data *cd,
1417                                          uint8_t *buf)
1418 {
1419         size_t np;
1420
1421         switch (cd->opcode) {
1422         case CTDB_CONTROL_STATISTICS:
1423                 ctdb_statistics_push(cd->data.stats, buf);
1424                 break;
1425
1426         case CTDB_CONTROL_GETDBPATH:
1427                 ctdb_string_push(&cd->data.db_path, buf, &np);
1428                 break;
1429
1430         case CTDB_CONTROL_GETVNNMAP:
1431                 ctdb_vnn_map_push(cd->data.vnnmap, buf);
1432                 break;
1433
1434         case CTDB_CONTROL_GET_DEBUG:
1435                 ctdb_uint32_push(&cd->data.loglevel, buf, &np);
1436                 break;
1437
1438         case CTDB_CONTROL_GET_DBMAP:
1439                 ctdb_dbid_map_push(cd->data.dbmap, buf);
1440                 break;
1441
1442         case CTDB_CONTROL_PULL_DB:
1443                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1444                 break;
1445
1446         case CTDB_CONTROL_PUSH_DB:
1447                 break;
1448
1449         case CTDB_CONTROL_DB_ATTACH:
1450                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1451                 break;
1452
1453         case CTDB_CONTROL_GET_DBNAME:
1454                 ctdb_string_push(&cd->data.db_name, buf, &np);
1455                 break;
1456
1457         case CTDB_CONTROL_DUMP_MEMORY:
1458                 ctdb_string_push(&cd->data.mem_str, buf, &np);
1459                 break;
1460
1461         case CTDB_CONTROL_GET_PID:
1462                 break;
1463
1464         case CTDB_CONTROL_GET_RECMASTER:
1465                 break;
1466
1467         case CTDB_CONTROL_GET_TUNABLE:
1468                 ctdb_uint32_push(&cd->data.tun_value, buf, &np);
1469                 break;
1470
1471         case CTDB_CONTROL_LIST_TUNABLES:
1472                 ctdb_var_list_push(cd->data.tun_var_list, buf);
1473                 break;
1474
1475         case CTDB_CONTROL_GET_ALL_TUNABLES:
1476                 ctdb_tunable_list_push(cd->data.tun_list, buf);
1477                 break;
1478
1479         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1480                 ctdb_tickle_list_push(cd->data.tickles, buf);
1481                 break;
1482
1483         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1484                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1485                 break;
1486
1487         case CTDB_CONTROL_UPTIME:
1488                 ctdb_uptime_push(cd->data.uptime, buf);
1489                 break;
1490
1491         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1492                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1493                 break;
1494
1495         case CTDB_CONTROL_GET_CAPABILITIES:
1496                 ctdb_uint32_push(&cd->data.caps, buf, &np);
1497                 break;
1498
1499         case CTDB_CONTROL_GET_PUBLIC_IPS:
1500                 ctdb_public_ip_list_push(cd->data.pubip_list, buf);
1501                 break;
1502
1503         case CTDB_CONTROL_GET_NODEMAP:
1504                 ctdb_node_map_push(cd->data.nodemap, buf);
1505                 break;
1506
1507         case CTDB_CONTROL_GET_RECLOCK_FILE:
1508                 ctdb_string_push(&cd->data.reclock_file, buf, &np);
1509                 break;
1510
1511         case CTDB_CONTROL_GET_BAN_STATE:
1512                 ctdb_ban_state_push(cd->data.ban_state, buf);
1513                 break;
1514
1515         case CTDB_CONTROL_GET_DB_PRIORITY:
1516                 break;
1517
1518         case CTDB_CONTROL_GET_DB_SEQNUM:
1519                 ctdb_uint64_push(&cd->data.seqnum, buf, &np);
1520                 break;
1521
1522         case CTDB_CONTROL_DB_GET_HEALTH:
1523                 ctdb_string_push(&cd->data.reason, buf, &np);
1524                 break;
1525
1526         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1527                 ctdb_public_ip_info_push(cd->data.ipinfo, buf);
1528                 break;
1529
1530         case CTDB_CONTROL_GET_IFACES:
1531                 ctdb_iface_list_push(cd->data.iface_list, buf);
1532                 break;
1533
1534         case CTDB_CONTROL_GET_STAT_HISTORY:
1535                 ctdb_statistics_list_push(cd->data.stats_list, buf);
1536                 break;
1537
1538         case CTDB_CONTROL_CHECK_SRVIDS:
1539                 break;
1540
1541         case CTDB_CONTROL_GET_DB_STATISTICS:
1542                 ctdb_db_statistics_push(cd->data.dbstats, buf);
1543                 break;
1544
1545         case CTDB_CONTROL_RECEIVE_RECORDS:
1546                 ctdb_rec_buffer_push(cd->data.recbuf, buf);
1547                 break;
1548
1549         case CTDB_CONTROL_GET_RUNSTATE:
1550                 ctdb_uint32_push(&cd->data.runstate, buf, &np);
1551                 break;
1552
1553         case CTDB_CONTROL_GET_NODES_FILE:
1554                 ctdb_node_map_push(cd->data.nodemap, buf);
1555                 break;
1556
1557         case CTDB_CONTROL_DB_PULL:
1558                 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1559                 break;
1560
1561         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1562                 ctdb_uint32_push(&cd->data.num_records, buf, &np);
1563                 break;
1564
1565         case CTDB_CONTROL_DB_OPEN_FLAGS:
1566                 ctdb_int32_push(&cd->data.tdb_flags, buf, &np);
1567                 break;
1568
1569         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1570                 ctdb_uint32_push(&cd->data.db_id, buf, &np);
1571                 break;
1572         }
1573 }
1574
1575 static int ctdb_reply_control_data_pull(uint8_t *buf, size_t buflen,
1576                                         uint32_t opcode, TALLOC_CTX *mem_ctx,
1577                                         struct ctdb_reply_control_data *cd)
1578 {
1579         size_t np;
1580         int ret = 0;
1581
1582         cd->opcode = opcode;
1583
1584         switch (opcode) {
1585         case CTDB_CONTROL_STATISTICS:
1586                 ret = ctdb_statistics_pull(buf, buflen, mem_ctx,
1587                                            &cd->data.stats);
1588                 break;
1589
1590         case CTDB_CONTROL_GETDBPATH:
1591                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1592                                        &cd->data.db_path, &np);
1593                 break;
1594
1595         case CTDB_CONTROL_GETVNNMAP:
1596                 ret = ctdb_vnn_map_pull(buf, buflen, mem_ctx,
1597                                         &cd->data.vnnmap);
1598                 break;
1599
1600         case CTDB_CONTROL_GET_DEBUG:
1601                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.loglevel, &np);
1602                 break;
1603
1604         case CTDB_CONTROL_GET_DBMAP:
1605                 ret = ctdb_dbid_map_pull(buf, buflen, mem_ctx,
1606                                          &cd->data.dbmap);
1607                 break;
1608
1609         case CTDB_CONTROL_PULL_DB:
1610                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1611                                            &cd->data.recbuf);
1612                 break;
1613
1614         case CTDB_CONTROL_PUSH_DB:
1615                 break;
1616
1617         case CTDB_CONTROL_DB_ATTACH:
1618                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1619                 break;
1620
1621         case CTDB_CONTROL_GET_DBNAME:
1622                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1623                                        &cd->data.db_name, &np);
1624                 break;
1625
1626         case CTDB_CONTROL_DUMP_MEMORY:
1627                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1628                                        &cd->data.mem_str, &np);
1629                 break;
1630
1631         case CTDB_CONTROL_GET_PID:
1632                 break;
1633
1634         case CTDB_CONTROL_GET_RECMASTER:
1635                 break;
1636
1637         case CTDB_CONTROL_GET_TUNABLE:
1638                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.tun_value,
1639                                        &np);
1640                 break;
1641
1642         case CTDB_CONTROL_LIST_TUNABLES:
1643                 ret = ctdb_var_list_pull(buf, buflen, mem_ctx,
1644                                          &cd->data.tun_var_list);
1645                 break;
1646
1647         case CTDB_CONTROL_GET_ALL_TUNABLES:
1648                 ret = ctdb_tunable_list_pull(buf, buflen, mem_ctx,
1649                                              &cd->data.tun_list);
1650                 break;
1651
1652         case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1653                 ret = ctdb_tickle_list_pull(buf, buflen, mem_ctx,
1654                                             &cd->data.tickles);
1655                 break;
1656
1657         case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1658                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1659                 break;
1660
1661         case CTDB_CONTROL_UPTIME:
1662                 ret = ctdb_uptime_pull(buf, buflen, mem_ctx,
1663                                        &cd->data.uptime);
1664                 break;
1665
1666         case CTDB_CONTROL_TRY_DELETE_RECORDS:
1667                 ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1668                                      &cd->data.recbuf);
1669                 break;
1670
1671         case CTDB_CONTROL_GET_CAPABILITIES:
1672                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.caps, &np);
1673                 break;
1674
1675         case CTDB_CONTROL_GET_PUBLIC_IPS:
1676                 ret = ctdb_public_ip_list_pull(buf, buflen, mem_ctx,
1677                                                &cd->data.pubip_list);
1678                 break;
1679
1680         case CTDB_CONTROL_GET_NODEMAP:
1681                 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1682                                          &cd->data.nodemap);
1683                 break;
1684
1685         case CTDB_CONTROL_GET_RECLOCK_FILE:
1686                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1687                                        &cd->data.reclock_file, &np);
1688                 break;
1689
1690         case CTDB_CONTROL_GET_BAN_STATE:
1691                 ret = ctdb_ban_state_pull(buf, buflen, mem_ctx,
1692                                           &cd->data.ban_state);
1693                 break;
1694
1695         case CTDB_CONTROL_GET_DB_PRIORITY:
1696                 break;
1697
1698         case CTDB_CONTROL_GET_DB_SEQNUM:
1699                 ret = ctdb_uint64_pull(buf, buflen, &cd->data.seqnum, &np);
1700                 break;
1701
1702         case CTDB_CONTROL_DB_GET_HEALTH:
1703                 ret = ctdb_string_pull(buf, buflen, mem_ctx,
1704                                        &cd->data.reason, &np);
1705                 break;
1706
1707         case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1708                 ret = ctdb_public_ip_info_pull(buf, buflen, mem_ctx,
1709                                                &cd->data.ipinfo);
1710                 break;
1711
1712         case CTDB_CONTROL_GET_IFACES:
1713                 ret = ctdb_iface_list_pull(buf, buflen, mem_ctx,
1714                                            &cd->data.iface_list);
1715                 break;
1716
1717         case CTDB_CONTROL_GET_STAT_HISTORY:
1718                 ret = ctdb_statistics_list_pull(buf, buflen, mem_ctx,
1719                                                 &cd->data.stats_list);
1720                 break;
1721
1722         case CTDB_CONTROL_CHECK_SRVIDS:
1723                 break;
1724
1725         case CTDB_CONTROL_GET_DB_STATISTICS:
1726                 ret = ctdb_db_statistics_pull(buf, buflen, mem_ctx,
1727                                               &cd->data.dbstats);
1728                 break;
1729
1730         case CTDB_CONTROL_RECEIVE_RECORDS:
1731                 ret = ctdb_rec_buffer_pull(buf, buflen, mem_ctx,
1732                                            &cd->data.recbuf);
1733                 break;
1734
1735         case CTDB_CONTROL_GET_RUNSTATE:
1736                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.runstate, &np);
1737                 break;
1738
1739         case CTDB_CONTROL_GET_NODES_FILE:
1740                 ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
1741                                          &cd->data.nodemap);
1742                 break;
1743
1744         case CTDB_CONTROL_DB_PULL:
1745                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1746                                        &np);
1747                 break;
1748
1749         case CTDB_CONTROL_DB_PUSH_CONFIRM:
1750                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.num_records,
1751                                        &np);
1752                 break;
1753
1754         case CTDB_CONTROL_DB_OPEN_FLAGS:
1755                 ret = ctdb_int32_pull(buf, buflen, &cd->data.tdb_flags, &np);
1756                 break;
1757
1758         case CTDB_CONTROL_DB_ATTACH_REPLICATED:
1759                 ret = ctdb_uint32_pull(buf, buflen, &cd->data.db_id, &np);
1760                 break;
1761         }
1762
1763         return ret;
1764 }
1765
1766 size_t ctdb_req_control_len(struct ctdb_req_header *h,
1767                             struct ctdb_req_control *c)
1768 {
1769         return offsetof(struct ctdb_req_control_wire, data) +
1770                 ctdb_req_control_data_len(&c->rdata);
1771 }
1772
1773 int ctdb_req_control_push(struct ctdb_req_header *h,
1774                           struct ctdb_req_control *request,
1775                           uint8_t *buf, size_t *buflen)
1776 {
1777         struct ctdb_req_control_wire *wire =
1778                 (struct ctdb_req_control_wire *)buf;
1779         size_t length;
1780
1781         length = ctdb_req_control_len(h, request);
1782         if (*buflen < length) {
1783                 *buflen = length;
1784                 return EMSGSIZE;
1785         }
1786
1787         h->length = *buflen;
1788         ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1789
1790         wire->opcode = request->opcode;
1791         wire->pad = request->pad;
1792         wire->srvid = request->srvid;
1793         wire->client_id = request->client_id;
1794         wire->flags = request->flags;
1795
1796         wire->datalen = ctdb_req_control_data_len(&request->rdata);
1797         ctdb_req_control_data_push(&request->rdata, wire->data);
1798
1799         return 0;
1800 }
1801
1802 int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
1803                           struct ctdb_req_header *h,
1804                           TALLOC_CTX *mem_ctx,
1805                           struct ctdb_req_control *c)
1806 {
1807         struct ctdb_req_control_wire *wire =
1808                 (struct ctdb_req_control_wire *)buf;
1809         size_t length;
1810         int ret;
1811
1812         length = offsetof(struct ctdb_req_control_wire, data);
1813         if (buflen < length) {
1814                 return EMSGSIZE;
1815         }
1816         if (wire->datalen > buflen) {
1817                 return EMSGSIZE;
1818         }
1819         if (length + wire->datalen < length) {
1820                 return EMSGSIZE;
1821         }
1822         if (buflen < length + wire->datalen) {
1823                 return EMSGSIZE;
1824         }
1825
1826         if (h != NULL) {
1827                 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1828                 if (ret != 0) {
1829                         return ret;
1830                 }
1831         }
1832
1833         c->opcode = wire->opcode;
1834         c->pad = wire->pad;
1835         c->srvid = wire->srvid;
1836         c->client_id = wire->client_id;
1837         c->flags = wire->flags;
1838
1839         ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
1840                                          c->opcode, mem_ctx, &c->rdata);
1841         if (ret != 0) {
1842                 return ret;
1843         }
1844
1845         return 0;
1846 }
1847
1848 size_t ctdb_reply_control_len(struct ctdb_req_header *h,
1849                               struct ctdb_reply_control *c)
1850 {
1851         return offsetof(struct ctdb_reply_control_wire, data) +
1852                 (c->status == 0 ?
1853                         ctdb_reply_control_data_len(&c->rdata) :
1854                         ctdb_string_len(&c->errmsg));
1855 }
1856
1857 int ctdb_reply_control_push(struct ctdb_req_header *h,
1858                             struct ctdb_reply_control *reply,
1859                             uint8_t *buf, size_t *buflen)
1860 {
1861         struct ctdb_reply_control_wire *wire =
1862                 (struct ctdb_reply_control_wire *)buf;
1863         size_t length, np;
1864
1865         length = ctdb_reply_control_len(h, reply);
1866         if (*buflen < length) {
1867                 *buflen = length;
1868                 return EMSGSIZE;
1869         }
1870
1871         h->length = *buflen;
1872         ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
1873
1874         wire->status = reply->status;
1875
1876         if (reply->status == 0) {
1877                 wire->datalen = ctdb_reply_control_data_len(&reply->rdata);
1878                 wire->errorlen = 0;
1879                 ctdb_reply_control_data_push(&reply->rdata, wire->data);
1880         } else {
1881                 wire->datalen = 0;
1882                 wire->errorlen = ctdb_string_len(&reply->errmsg);
1883                 ctdb_string_push(&reply->errmsg, wire->data + wire->datalen,
1884                                  &np);
1885         }
1886
1887         return 0;
1888 }
1889
1890 int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
1891                             struct ctdb_req_header *h,
1892                             TALLOC_CTX *mem_ctx,
1893                             struct ctdb_reply_control *c)
1894 {
1895         struct ctdb_reply_control_wire *wire =
1896                 (struct ctdb_reply_control_wire *)buf;
1897         size_t length, np;
1898         int ret;
1899
1900         length = offsetof(struct ctdb_reply_control_wire, data);
1901         if (buflen < length) {
1902                 return EMSGSIZE;
1903         }
1904         if (wire->datalen > buflen || wire->errorlen > buflen) {
1905                 return EMSGSIZE;
1906         }
1907         if (length + wire->datalen < length) {
1908                 return EMSGSIZE;
1909         }
1910         if (length + wire->datalen + wire->errorlen < length) {
1911                 return EMSGSIZE;
1912         }
1913         if (buflen < length + wire->datalen + wire->errorlen) {
1914                 return EMSGSIZE;
1915         }
1916
1917         if (h != NULL) {
1918                 ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
1919                 if (ret != 0) {
1920                         return ret;
1921                 }
1922         }
1923
1924         c->status = wire->status;
1925
1926         if (c->status != -1) {
1927                 ret = ctdb_reply_control_data_pull(wire->data, wire->datalen,
1928                                                    opcode, mem_ctx,
1929                                                    &c->rdata);
1930                 if (ret != 0) {
1931                         return ret;
1932                 }
1933         }
1934
1935         ret = ctdb_string_pull(wire->data + wire->datalen, wire->errorlen,
1936                                mem_ctx, &c->errmsg, &np);
1937         if (ret != 0) {
1938                 return ret;
1939         }
1940
1941         return 0;
1942 }