2 CTDB protocol marshalling
4 Copyright (C) Amitay Isaacs 2015-2017
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "system/network.h"
27 #include "protocol_private.h"
28 #include "protocol_api.h"
30 size_t ctdb_tdb_data_len(TDB_DATA *in)
32 return in->dsize > UINT32_MAX ? UINT32_MAX : in->dsize;
35 void ctdb_tdb_data_push(TDB_DATA *in, uint8_t *buf, size_t *npush)
37 size_t len = ctdb_tdb_data_len(in);
40 memcpy(buf, in->dptr, len);
46 int ctdb_tdb_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
47 TDB_DATA *out, size_t *npull)
51 if (buflen > UINT32_MAX) {
57 val.dptr = talloc_memdup(mem_ctx, buf, buflen);
58 if (val.dptr == NULL) {
70 size_t ctdb_tdb_datan_len(TDB_DATA *in)
72 uint32_t u32 = ctdb_tdb_data_len(in);
74 return ctdb_uint32_len(&u32) + u32;
77 void ctdb_tdb_datan_push(TDB_DATA *in, uint8_t *buf, size_t *npush)
79 size_t offset = 0, np;
80 uint32_t u32 = ctdb_tdb_data_len(in);
82 ctdb_uint32_push(&u32, buf+offset, &np);
85 ctdb_tdb_data_push(in, buf+offset, &np);
91 int ctdb_tdb_datan_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
92 TDB_DATA *out, size_t *npull)
94 size_t offset = 0, np;
98 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
104 if (buflen-offset < u32) {
108 ret = ctdb_tdb_data_pull(buf+offset, u32, mem_ctx, out, &np);
118 size_t ctdb_latency_counter_len(struct ctdb_latency_counter *in)
120 return ctdb_int32_len(&in->num) +
121 ctdb_padding_len(4) +
122 ctdb_double_len(&in->min) +
123 ctdb_double_len(&in->max) +
124 ctdb_double_len(&in->total);
127 void ctdb_latency_counter_push(struct ctdb_latency_counter *in, uint8_t *buf,
130 size_t offset = 0, np;
132 ctdb_int32_push(&in->num, buf+offset, &np);
135 ctdb_padding_push(4, buf+offset, &np);
138 ctdb_double_push(&in->min, buf+offset, &np);
141 ctdb_double_push(&in->max, buf+offset, &np);
144 ctdb_double_push(&in->total, buf+offset, &np);
150 int ctdb_latency_counter_pull(uint8_t *buf, size_t buflen,
151 struct ctdb_latency_counter *out, size_t *npull)
153 size_t offset = 0, np;
156 ret = ctdb_int32_pull(buf+offset, buflen-offset, &out->num, &np);
162 ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
168 ret = ctdb_double_pull(buf+offset, buflen-offset, &out->min, &np);
174 ret = ctdb_double_pull(buf+offset, buflen-offset, &out->max, &np);
180 ret = ctdb_double_pull(buf+offset, buflen-offset, &out->total, &np);
190 size_t ctdb_statistics_len(struct ctdb_statistics *in)
192 return ctdb_uint32_len(&in->num_clients) +
193 ctdb_uint32_len(&in->frozen) +
194 ctdb_uint32_len(&in->recovering) +
195 ctdb_uint32_len(&in->client_packets_sent) +
196 ctdb_uint32_len(&in->client_packets_recv) +
197 ctdb_uint32_len(&in->node_packets_sent) +
198 ctdb_uint32_len(&in->node_packets_recv) +
199 ctdb_uint32_len(&in->keepalive_packets_sent) +
200 ctdb_uint32_len(&in->keepalive_packets_recv) +
201 ctdb_uint32_len(&in->node.req_call) +
202 ctdb_uint32_len(&in->node.reply_call) +
203 ctdb_uint32_len(&in->node.req_dmaster) +
204 ctdb_uint32_len(&in->node.reply_dmaster) +
205 ctdb_uint32_len(&in->node.reply_error) +
206 ctdb_uint32_len(&in->node.req_message) +
207 ctdb_uint32_len(&in->node.req_control) +
208 ctdb_uint32_len(&in->node.reply_control) +
209 ctdb_uint32_len(&in->client.req_call) +
210 ctdb_uint32_len(&in->client.req_message) +
211 ctdb_uint32_len(&in->client.req_control) +
212 ctdb_uint32_len(&in->timeouts.call) +
213 ctdb_uint32_len(&in->timeouts.control) +
214 ctdb_uint32_len(&in->timeouts.traverse) +
215 ctdb_padding_len(4) +
216 ctdb_latency_counter_len(&in->reclock.ctdbd) +
217 ctdb_latency_counter_len(&in->reclock.recd) +
218 ctdb_uint32_len(&in->locks.num_calls) +
219 ctdb_uint32_len(&in->locks.num_current) +
220 ctdb_uint32_len(&in->locks.num_pending) +
221 ctdb_uint32_len(&in->locks.num_failed) +
222 ctdb_latency_counter_len(&in->locks.latency) +
223 MAX_COUNT_BUCKETS * ctdb_uint32_len(&in->locks.buckets[0]) +
224 ctdb_uint32_len(&in->total_calls) +
225 ctdb_uint32_len(&in->pending_calls) +
226 ctdb_uint32_len(&in->childwrite_calls) +
227 ctdb_uint32_len(&in->pending_childwrite_calls) +
228 ctdb_uint32_len(&in->memory_used) +
229 ctdb_uint32_len(&in->__last_counter) +
230 ctdb_uint32_len(&in->max_hop_count) +
232 ctdb_uint32_len(&in->hop_count_bucket[0]) +
233 ctdb_padding_len(4) +
234 ctdb_latency_counter_len(&in->call_latency) +
235 ctdb_latency_counter_len(&in->childwrite_latency) +
236 ctdb_uint32_len(&in->num_recoveries) +
237 ctdb_padding_len(4) +
238 ctdb_timeval_len(&in->statistics_start_time) +
239 ctdb_timeval_len(&in->statistics_current_time) +
240 ctdb_uint32_len(&in->total_ro_delegations) +
241 ctdb_uint32_len(&in->total_ro_revokes);
244 void ctdb_statistics_push(struct ctdb_statistics *in, uint8_t *buf,
247 size_t offset = 0, np;
250 ctdb_uint32_push(&in->num_clients, buf+offset, &np);
253 ctdb_uint32_push(&in->frozen, buf+offset, &np);
256 ctdb_uint32_push(&in->recovering, buf+offset, &np);
259 ctdb_uint32_push(&in->client_packets_sent, buf+offset, &np);
262 ctdb_uint32_push(&in->client_packets_recv, buf+offset, &np);
265 ctdb_uint32_push(&in->node_packets_sent, buf+offset, &np);
268 ctdb_uint32_push(&in->node_packets_recv, buf+offset, &np);
271 ctdb_uint32_push(&in->keepalive_packets_sent, buf+offset, &np);
274 ctdb_uint32_push(&in->keepalive_packets_recv, buf+offset, &np);
277 ctdb_uint32_push(&in->node.req_call, buf+offset, &np);
280 ctdb_uint32_push(&in->node.reply_call, buf+offset, &np);
283 ctdb_uint32_push(&in->node.req_dmaster, buf+offset, &np);
286 ctdb_uint32_push(&in->node.reply_dmaster, buf+offset, &np);
289 ctdb_uint32_push(&in->node.reply_error, buf+offset, &np);
292 ctdb_uint32_push(&in->node.req_message, buf+offset, &np);
295 ctdb_uint32_push(&in->node.req_control, buf+offset, &np);
298 ctdb_uint32_push(&in->node.reply_control, buf+offset, &np);
301 ctdb_uint32_push(&in->client.req_call, buf+offset, &np);
304 ctdb_uint32_push(&in->client.req_message, buf+offset, &np);
307 ctdb_uint32_push(&in->client.req_control, buf+offset, &np);
310 ctdb_uint32_push(&in->timeouts.call, buf+offset, &np);
313 ctdb_uint32_push(&in->timeouts.control, buf+offset, &np);
316 ctdb_uint32_push(&in->timeouts.traverse, buf+offset, &np);
319 ctdb_padding_push(4, buf+offset, &np);
322 ctdb_latency_counter_push(&in->reclock.ctdbd, buf+offset, &np);
325 ctdb_latency_counter_push(&in->reclock.recd, buf+offset, &np);
328 ctdb_uint32_push(&in->locks.num_calls, buf+offset, &np);
331 ctdb_uint32_push(&in->locks.num_current, buf+offset, &np);
334 ctdb_uint32_push(&in->locks.num_pending, buf+offset, &np);
337 ctdb_uint32_push(&in->locks.num_failed, buf+offset, &np);
340 ctdb_latency_counter_push(&in->locks.latency, buf+offset, &np);
343 for (i=0; i<MAX_COUNT_BUCKETS; i++) {
344 ctdb_uint32_push(&in->locks.buckets[i], buf+offset, &np);
348 ctdb_uint32_push(&in->total_calls, buf+offset, &np);
351 ctdb_uint32_push(&in->pending_calls, buf+offset, &np);
354 ctdb_uint32_push(&in->childwrite_calls, buf+offset, &np);
357 ctdb_uint32_push(&in->pending_childwrite_calls, buf+offset, &np);
360 ctdb_uint32_push(&in->memory_used, buf+offset, &np);
363 ctdb_uint32_push(&in->__last_counter, buf+offset, &np);
366 ctdb_uint32_push(&in->max_hop_count, buf+offset, &np);
369 for (i=0; i<MAX_COUNT_BUCKETS; i++) {
370 ctdb_uint32_push(&in->hop_count_bucket[i], buf+offset, &np);
374 ctdb_padding_push(4, buf+offset, &np);
377 ctdb_latency_counter_push(&in->call_latency, buf+offset, &np);
380 ctdb_latency_counter_push(&in->childwrite_latency, buf+offset, &np);
383 ctdb_uint32_push(&in->num_recoveries, buf+offset, &np);
386 ctdb_padding_push(4, buf+offset, &np);
389 ctdb_timeval_push(&in->statistics_start_time, buf+offset, &np);
392 ctdb_timeval_push(&in->statistics_current_time, buf+offset, &np);
395 ctdb_uint32_push(&in->total_ro_delegations, buf+offset, &np);
398 ctdb_uint32_push(&in->total_ro_revokes, buf+offset, &np);
404 static int ctdb_statistics_pull_elems(uint8_t *buf, size_t buflen,
406 struct ctdb_statistics *out,
409 size_t offset = 0, np;
412 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->num_clients,
419 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->frozen, &np);
425 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->recovering,
432 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
433 &out->client_packets_sent, &np);
439 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
440 &out->client_packets_recv, &np);
446 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
447 &out->node_packets_sent, &np);
453 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
454 &out->node_packets_recv, &np);
460 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
461 &out->keepalive_packets_sent, &np);
467 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
468 &out->keepalive_packets_recv, &np);
474 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
475 &out->node.req_call, &np);
481 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
482 &out->node.reply_call, &np);
488 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
489 &out->node.req_dmaster, &np);
495 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
496 &out->node.reply_dmaster, &np);
502 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
503 &out->node.reply_error, &np);
509 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
510 &out->node.req_message, &np);
516 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
517 &out->node.req_control, &np);
523 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
524 &out->node.reply_control, &np);
530 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
531 &out->client.req_call, &np);
537 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
538 &out->client.req_message, &np);
544 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
545 &out->client.req_control, &np);
551 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
552 &out->timeouts.call, &np);
558 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
559 &out->timeouts.control, &np);
565 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
566 &out->timeouts.traverse, &np);
572 ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
578 ret = ctdb_latency_counter_pull(buf+offset, buflen-offset,
579 &out->reclock.ctdbd, &np);
585 ret = ctdb_latency_counter_pull(buf+offset, buflen-offset,
586 &out->reclock.recd, &np);
592 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
593 &out->locks.num_calls, &np);
599 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
600 &out->locks.num_current, &np);
606 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
607 &out->locks.num_pending, &np);
613 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
614 &out->locks.num_failed, &np);
620 ret = ctdb_latency_counter_pull(buf+offset, buflen-offset,
621 &out->locks.latency, &np);
627 for (i=0; i<MAX_COUNT_BUCKETS; i++) {
628 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
629 &out->locks.buckets[i], &np);
636 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
637 &out->total_calls, &np);
643 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
644 &out->pending_calls, &np);
650 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
651 &out->childwrite_calls, &np);
657 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
658 &out->pending_childwrite_calls, &np);
664 ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->memory_used,
671 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
672 &out->__last_counter, &np);
678 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
679 &out->max_hop_count, &np);
685 for (i=0; i<MAX_COUNT_BUCKETS; i++) {
686 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
687 &out->hop_count_bucket[i], &np);
694 ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
700 ret = ctdb_latency_counter_pull(buf+offset, buflen-offset,
701 &out->call_latency, &np);
707 ret = ctdb_latency_counter_pull(buf+offset, buflen-offset,
708 &out->childwrite_latency, &np);
714 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
715 &out->num_recoveries, &np);
721 ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
727 ret = ctdb_timeval_pull(buf+offset, buflen-offset,
728 &out->statistics_start_time, &np);
734 ret = ctdb_timeval_pull(buf+offset, buflen-offset,
735 &out->statistics_current_time, &np);
741 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
742 &out->total_ro_delegations, &np);
748 ret = ctdb_uint32_pull(buf+offset, buflen-offset,
749 &out->total_ro_revokes, &np);
759 int ctdb_statistics_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
760 struct ctdb_statistics **out, size_t *npull)
762 struct ctdb_statistics *val;
766 val = talloc(mem_ctx, struct ctdb_statistics);
771 ret = ctdb_statistics_pull_elems(buf, buflen, val, val, &np);
782 struct ctdb_statistics_list_wire {
784 struct ctdb_statistics stats[1];
787 size_t ctdb_statistics_list_len(struct ctdb_statistics_list *stats_list)
789 return offsetof(struct ctdb_statistics_list_wire, stats) +
790 stats_list->num * sizeof(struct ctdb_statistics);
793 void ctdb_statistics_list_push(struct ctdb_statistics_list *stats_list,
796 struct ctdb_statistics_list_wire *wire =
797 (struct ctdb_statistics_list_wire *)buf;
799 wire->num = stats_list->num;
800 memcpy(wire->stats, stats_list->stats,
801 stats_list->num * sizeof(struct ctdb_statistics));
804 int ctdb_statistics_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
805 struct ctdb_statistics_list **out)
807 struct ctdb_statistics_list *stats_list;
808 struct ctdb_statistics_list_wire *wire =
809 (struct ctdb_statistics_list_wire *)buf;
811 if (buflen < offsetof(struct ctdb_statistics_list_wire, stats)) {
814 if (wire->num > buflen / sizeof(struct ctdb_statistics)) {
817 if (offsetof(struct ctdb_statistics_list_wire, stats) +
818 wire->num * sizeof(struct ctdb_statistics) <
819 offsetof(struct ctdb_statistics_list_wire, stats)) {
822 if (buflen < offsetof(struct ctdb_statistics_list_wire, stats) +
823 wire->num * sizeof(struct ctdb_statistics)) {
827 stats_list = talloc(mem_ctx, struct ctdb_statistics_list);
828 if (stats_list == NULL) {
832 stats_list->num = wire->num;
834 stats_list->stats = talloc_array(stats_list, struct ctdb_statistics,
836 if (stats_list->stats == NULL) {
837 talloc_free(stats_list);
841 memcpy(stats_list->stats, wire->stats,
842 wire->num * sizeof(struct ctdb_statistics));
848 struct ctdb_vnn_map_wire {
854 size_t ctdb_vnn_map_len(struct ctdb_vnn_map *vnnmap)
856 return offsetof(struct ctdb_vnn_map, map) +
857 vnnmap->size * sizeof(uint32_t);
860 void ctdb_vnn_map_push(struct ctdb_vnn_map *vnnmap, uint8_t *buf)
862 struct ctdb_vnn_map_wire *wire = (struct ctdb_vnn_map_wire *)buf;
864 memcpy(wire, vnnmap, offsetof(struct ctdb_vnn_map, map));
865 memcpy(wire->map, vnnmap->map, vnnmap->size * sizeof(uint32_t));
868 int ctdb_vnn_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
869 struct ctdb_vnn_map **out)
871 struct ctdb_vnn_map *vnnmap;
872 struct ctdb_vnn_map_wire *wire = (struct ctdb_vnn_map_wire *)buf;
874 if (buflen < offsetof(struct ctdb_vnn_map_wire, map)) {
877 if (wire->size > buflen / sizeof(uint32_t)) {
880 if (offsetof(struct ctdb_vnn_map_wire, map) +
881 wire->size * sizeof(uint32_t) <
882 offsetof(struct ctdb_vnn_map_wire, map)) {
885 if (buflen < offsetof(struct ctdb_vnn_map_wire, map) +
886 wire->size * sizeof(uint32_t)) {
890 vnnmap = talloc(mem_ctx, struct ctdb_vnn_map);
891 if (vnnmap == NULL) {
895 memcpy(vnnmap, wire, offsetof(struct ctdb_vnn_map, map));
897 vnnmap->map = talloc_memdup(vnnmap, wire->map,
898 wire->size * sizeof(uint32_t));
899 if (vnnmap->map == NULL) {
908 struct ctdb_dbid_map_wire {
910 struct ctdb_dbid dbs[1];
913 size_t ctdb_dbid_map_len(struct ctdb_dbid_map *dbmap)
915 return sizeof(uint32_t) + dbmap->num * sizeof(struct ctdb_dbid);
918 void ctdb_dbid_map_push(struct ctdb_dbid_map *dbmap, uint8_t *buf)
920 struct ctdb_dbid_map_wire *wire = (struct ctdb_dbid_map_wire *)buf;
922 wire->num = dbmap->num;
923 memcpy(wire->dbs, dbmap->dbs, dbmap->num * sizeof(struct ctdb_dbid));
926 int ctdb_dbid_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
927 struct ctdb_dbid_map **out)
929 struct ctdb_dbid_map *dbmap;
930 struct ctdb_dbid_map_wire *wire = (struct ctdb_dbid_map_wire *)buf;
932 if (buflen < sizeof(uint32_t)) {
935 if (wire->num > buflen / sizeof(struct ctdb_dbid)) {
938 if (sizeof(uint32_t) + wire->num * sizeof(struct ctdb_dbid) <
942 if (buflen < sizeof(uint32_t) + wire->num * sizeof(struct ctdb_dbid)) {
946 dbmap = talloc(mem_ctx, struct ctdb_dbid_map);
951 dbmap->num = wire->num;
953 dbmap->dbs = talloc_memdup(dbmap, wire->dbs,
954 wire->num * sizeof(struct ctdb_dbid));
955 if (dbmap->dbs == NULL) {
964 size_t ctdb_pulldb_len(struct ctdb_pulldb *pulldb)
966 return sizeof(struct ctdb_pulldb);
969 void ctdb_pulldb_push(struct ctdb_pulldb *pulldb, uint8_t *buf)
971 memcpy(buf, pulldb, sizeof(struct ctdb_pulldb));
974 int ctdb_pulldb_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
975 struct ctdb_pulldb **out)
977 struct ctdb_pulldb *pulldb;
979 if (buflen < sizeof(struct ctdb_pulldb)) {
983 pulldb = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_pulldb));
984 if (pulldb == NULL) {
992 size_t ctdb_pulldb_ext_len(struct ctdb_pulldb_ext *pulldb)
994 return sizeof(struct ctdb_pulldb_ext);
997 void ctdb_pulldb_ext_push(struct ctdb_pulldb_ext *pulldb, uint8_t *buf)
999 memcpy(buf, pulldb, sizeof(struct ctdb_pulldb_ext));
1002 int ctdb_pulldb_ext_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1003 struct ctdb_pulldb_ext **out)
1005 struct ctdb_pulldb_ext *pulldb;
1007 if (buflen < sizeof(struct ctdb_pulldb_ext)) {
1011 pulldb = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_pulldb_ext));
1012 if (pulldb == NULL) {
1020 size_t ctdb_ltdb_header_len(struct ctdb_ltdb_header *header)
1022 return sizeof(struct ctdb_ltdb_header);
1025 void ctdb_ltdb_header_push(struct ctdb_ltdb_header *header, uint8_t *buf)
1027 memcpy(buf, header, sizeof(struct ctdb_ltdb_header));
1030 int ctdb_ltdb_header_pull(uint8_t *buf, size_t buflen,
1031 struct ctdb_ltdb_header *header)
1033 if (buflen < sizeof(struct ctdb_ltdb_header)) {
1037 memcpy(header, buf, sizeof(struct ctdb_ltdb_header));
1041 int ctdb_ltdb_header_extract(TDB_DATA *data, struct ctdb_ltdb_header *header)
1045 ret = ctdb_ltdb_header_pull(data->dptr, data->dsize, header);
1050 data->dptr += sizeof(struct ctdb_ltdb_header);
1051 data->dsize -= sizeof(struct ctdb_ltdb_header);
1056 struct ctdb_rec_data_wire {
1064 size_t ctdb_rec_data_len(struct ctdb_rec_data *rec)
1066 return offsetof(struct ctdb_rec_data_wire, data) +
1067 rec->key.dsize + rec->data.dsize +
1068 (rec->header == NULL ? 0 : sizeof(struct ctdb_ltdb_header));
1071 void ctdb_rec_data_push(struct ctdb_rec_data *rec, uint8_t *buf)
1073 struct ctdb_rec_data_wire *wire = (struct ctdb_rec_data_wire *)buf;
1076 wire->length = ctdb_rec_data_len(rec);
1077 wire->reqid = rec->reqid;
1078 wire->keylen = rec->key.dsize;
1079 wire->datalen = rec->data.dsize;
1080 if (rec->header != NULL) {
1081 wire->datalen += sizeof(struct ctdb_ltdb_header);
1084 memcpy(wire->data, rec->key.dptr, rec->key.dsize);
1085 offset = rec->key.dsize;
1086 if (rec->header != NULL) {
1087 memcpy(&wire->data[offset], rec->header,
1088 sizeof(struct ctdb_ltdb_header));
1089 offset += sizeof(struct ctdb_ltdb_header);
1091 if (rec->data.dsize > 0) {
1092 memcpy(&wire->data[offset], rec->data.dptr, rec->data.dsize);
1096 static int ctdb_rec_data_pull_data(uint8_t *buf, size_t buflen,
1098 struct ctdb_ltdb_header **header,
1099 TDB_DATA *key, TDB_DATA *data,
1102 struct ctdb_rec_data_wire *wire = (struct ctdb_rec_data_wire *)buf;
1105 if (buflen < offsetof(struct ctdb_rec_data_wire, data)) {
1108 if (wire->keylen > buflen || wire->datalen > buflen) {
1111 if (offsetof(struct ctdb_rec_data_wire, data) + wire->keylen <
1112 offsetof(struct ctdb_rec_data_wire, data)) {
1115 if (offsetof(struct ctdb_rec_data_wire, data) +
1116 wire->keylen + wire->datalen <
1117 offsetof(struct ctdb_rec_data_wire, data)) {
1120 if (buflen < offsetof(struct ctdb_rec_data_wire, data) +
1121 wire->keylen + wire->datalen) {
1125 *reqid = wire->reqid;
1127 key->dsize = wire->keylen;
1128 key->dptr = wire->data;
1129 offset = wire->keylen;
1131 /* Always set header to NULL. If it is required, exact it using
1132 * ctdb_rec_data_extract_header()
1136 data->dsize = wire->datalen;
1137 data->dptr = &wire->data[offset];
1139 *reclen = offsetof(struct ctdb_rec_data_wire, data) +
1140 wire->keylen + wire->datalen;
1145 static int ctdb_rec_data_pull_elems(uint8_t *buf, size_t buflen,
1146 TALLOC_CTX *mem_ctx,
1147 struct ctdb_rec_data *out)
1150 struct ctdb_ltdb_header *header;
1155 ret = ctdb_rec_data_pull_data(buf, buflen, &reqid, &header,
1156 &key, &data, &reclen);
1164 out->key.dsize = key.dsize;
1165 if (key.dsize > 0) {
1166 out->key.dptr = talloc_memdup(mem_ctx, key.dptr, key.dsize);
1167 if (out->key.dptr == NULL) {
1172 out->data.dsize = data.dsize;
1173 if (data.dsize > 0) {
1174 out->data.dptr = talloc_memdup(mem_ctx, data.dptr, data.dsize);
1175 if (out->data.dptr == NULL) {
1183 int ctdb_rec_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1184 struct ctdb_rec_data **out)
1186 struct ctdb_rec_data *rec;
1189 rec = talloc(mem_ctx, struct ctdb_rec_data);
1194 ret = ctdb_rec_data_pull_elems(buf, buflen, rec, rec);
1203 struct ctdb_rec_buffer_wire {
1209 size_t ctdb_rec_buffer_len(struct ctdb_rec_buffer *recbuf)
1211 return offsetof(struct ctdb_rec_buffer_wire, data) + recbuf->buflen;
1214 void ctdb_rec_buffer_push(struct ctdb_rec_buffer *recbuf, uint8_t *buf)
1216 struct ctdb_rec_buffer_wire *wire = (struct ctdb_rec_buffer_wire *)buf;
1218 wire->db_id = recbuf->db_id;
1219 wire->count = recbuf->count;
1220 if (recbuf->buflen > 0) {
1221 memcpy(wire->data, recbuf->buf, recbuf->buflen);
1225 int ctdb_rec_buffer_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1226 struct ctdb_rec_buffer **out)
1228 struct ctdb_rec_buffer *recbuf;
1229 struct ctdb_rec_buffer_wire *wire = (struct ctdb_rec_buffer_wire *)buf;
1232 if (buflen < offsetof(struct ctdb_rec_buffer_wire, data)) {
1236 recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
1237 if (recbuf == NULL) {
1241 recbuf->db_id = wire->db_id;
1242 recbuf->count = wire->count;
1244 offset = offsetof(struct ctdb_rec_buffer_wire, data);
1245 recbuf->buflen = buflen - offset;
1246 recbuf->buf = talloc_memdup(recbuf, wire->data, recbuf->buflen);
1247 if (recbuf->buf == NULL) {
1248 talloc_free(recbuf);
1256 struct ctdb_rec_buffer *ctdb_rec_buffer_init(TALLOC_CTX *mem_ctx,
1259 struct ctdb_rec_buffer *recbuf;
1261 recbuf = talloc_zero(mem_ctx, struct ctdb_rec_buffer);
1262 if (recbuf == NULL) {
1266 recbuf->db_id = db_id;
1271 int ctdb_rec_buffer_add(TALLOC_CTX *mem_ctx, struct ctdb_rec_buffer *recbuf,
1272 uint32_t reqid, struct ctdb_ltdb_header *header,
1273 TDB_DATA key, TDB_DATA data)
1275 struct ctdb_rec_data recdata;
1279 recdata.reqid = reqid;
1280 recdata.header = header;
1282 recdata.data = data;
1284 len = ctdb_rec_data_len(&recdata);
1286 ptr = talloc_realloc(mem_ctx, recbuf->buf, uint8_t,
1287 recbuf->buflen + len);
1292 ctdb_rec_data_push(&recdata, &ptr[recbuf->buflen]);
1296 recbuf->buflen += len;
1300 int ctdb_rec_buffer_traverse(struct ctdb_rec_buffer *recbuf,
1301 ctdb_rec_parser_func_t func,
1304 struct ctdb_ltdb_header *header;
1307 size_t offset, reclen;
1311 for (i=0; i<recbuf->count; i++) {
1312 ret = ctdb_rec_data_pull_data(&recbuf->buf[offset],
1313 recbuf->buflen - offset,
1315 &key, &data, &reclen);
1320 ret = func(reqid, header, key, data, private_data);
1331 int ctdb_rec_buffer_write(struct ctdb_rec_buffer *recbuf, int fd)
1335 n = write(fd, &recbuf->db_id, sizeof(uint32_t));
1336 if (n == -1 || n != sizeof(uint32_t)) {
1337 return (errno != 0 ? errno : EIO);
1339 n = write(fd, &recbuf->count, sizeof(uint32_t));
1340 if (n == -1 || n != sizeof(uint32_t)) {
1341 return (errno != 0 ? errno : EIO);
1343 n = write(fd, &recbuf->buflen, sizeof(size_t));
1344 if (n == -1 || n != sizeof(size_t)) {
1345 return (errno != 0 ? errno : EIO);
1347 n = write(fd, recbuf->buf, recbuf->buflen);
1348 if (n == -1 || n != recbuf->buflen) {
1349 return (errno != 0 ? errno : EIO);
1355 int ctdb_rec_buffer_read(int fd, TALLOC_CTX *mem_ctx,
1356 struct ctdb_rec_buffer **out)
1358 struct ctdb_rec_buffer *recbuf;
1361 recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
1362 if (recbuf == NULL) {
1366 n = read(fd, &recbuf->db_id, sizeof(uint32_t));
1367 if (n == -1 || n != sizeof(uint32_t)) {
1368 return (errno != 0 ? errno : EIO);
1370 n = read(fd, &recbuf->count, sizeof(uint32_t));
1371 if (n == -1 || n != sizeof(uint32_t)) {
1372 return (errno != 0 ? errno : EIO);
1374 n = read(fd, &recbuf->buflen, sizeof(size_t));
1375 if (n == -1 || n != sizeof(size_t)) {
1376 return (errno != 0 ? errno : EIO);
1379 recbuf->buf = talloc_size(recbuf, recbuf->buflen);
1380 if (recbuf->buf == NULL) {
1384 n = read(fd, recbuf->buf, recbuf->buflen);
1385 if (n == -1 || n != recbuf->buflen) {
1386 return (errno != 0 ? errno : EIO);
1393 size_t ctdb_traverse_start_len(struct ctdb_traverse_start *traverse)
1395 return sizeof(struct ctdb_traverse_start);
1398 void ctdb_traverse_start_push(struct ctdb_traverse_start *traverse,
1401 memcpy(buf, traverse, sizeof(struct ctdb_traverse_start));
1404 int ctdb_traverse_start_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1405 struct ctdb_traverse_start **out)
1407 struct ctdb_traverse_start *traverse;
1409 if (buflen < sizeof(struct ctdb_traverse_start)) {
1413 traverse = talloc_memdup(mem_ctx, buf,
1414 sizeof(struct ctdb_traverse_start));
1415 if (traverse == NULL) {
1423 size_t ctdb_traverse_all_len(struct ctdb_traverse_all *traverse)
1425 return sizeof(struct ctdb_traverse_all);
1428 void ctdb_traverse_all_push(struct ctdb_traverse_all *traverse, uint8_t *buf)
1430 memcpy(buf, traverse, sizeof(struct ctdb_traverse_all));
1433 int ctdb_traverse_all_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1434 struct ctdb_traverse_all **out)
1436 struct ctdb_traverse_all *traverse;
1438 if (buflen < sizeof(struct ctdb_traverse_all)) {
1442 traverse = talloc_memdup(mem_ctx, buf,
1443 sizeof(struct ctdb_traverse_all));
1444 if (traverse == NULL) {
1452 size_t ctdb_traverse_start_ext_len(struct ctdb_traverse_start_ext *traverse)
1454 return sizeof(struct ctdb_traverse_start_ext);
1457 void ctdb_traverse_start_ext_push(struct ctdb_traverse_start_ext *traverse,
1460 memcpy(buf, traverse, sizeof(struct ctdb_traverse_start_ext));
1463 int ctdb_traverse_start_ext_pull(uint8_t *buf, size_t buflen,
1464 TALLOC_CTX *mem_ctx,
1465 struct ctdb_traverse_start_ext **out)
1467 struct ctdb_traverse_start_ext *traverse;
1469 if (buflen < sizeof(struct ctdb_traverse_start_ext)) {
1473 traverse = talloc_memdup(mem_ctx, buf,
1474 sizeof(struct ctdb_traverse_start_ext));
1475 if (traverse == NULL) {
1483 size_t ctdb_traverse_all_ext_len(struct ctdb_traverse_all_ext *traverse)
1485 return sizeof(struct ctdb_traverse_all_ext);
1488 void ctdb_traverse_all_ext_push(struct ctdb_traverse_all_ext *traverse,
1491 memcpy(buf, traverse, sizeof(struct ctdb_traverse_all_ext));
1494 int ctdb_traverse_all_ext_pull(uint8_t *buf, size_t buflen,
1495 TALLOC_CTX *mem_ctx,
1496 struct ctdb_traverse_all_ext **out)
1498 struct ctdb_traverse_all_ext *traverse;
1500 if (buflen < sizeof(struct ctdb_traverse_all_ext)) {
1504 traverse = talloc_memdup(mem_ctx, buf,
1505 sizeof(struct ctdb_traverse_all_ext));
1506 if (traverse == NULL) {
1514 size_t ctdb_sock_addr_len(ctdb_sock_addr *addr)
1516 return sizeof(ctdb_sock_addr);
1519 void ctdb_sock_addr_push(ctdb_sock_addr *addr, uint8_t *buf)
1521 memcpy(buf, addr, sizeof(ctdb_sock_addr));
1524 static int ctdb_sock_addr_pull_elems(uint8_t *buf, size_t buflen,
1525 TALLOC_CTX *mem_ctx, ctdb_sock_addr *out)
1527 if (buflen < sizeof(ctdb_sock_addr)) {
1531 memcpy(out, buf, sizeof(ctdb_sock_addr));
1536 int ctdb_sock_addr_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1537 ctdb_sock_addr **out)
1539 ctdb_sock_addr *addr;
1542 addr = talloc(mem_ctx, ctdb_sock_addr);
1547 ret = ctdb_sock_addr_pull_elems(buf, buflen, addr, addr);
1556 size_t ctdb_connection_len(struct ctdb_connection *conn)
1558 return sizeof(struct ctdb_connection);
1561 void ctdb_connection_push(struct ctdb_connection *conn, uint8_t *buf)
1563 memcpy(buf, conn, sizeof(struct ctdb_connection));
1566 static int ctdb_connection_pull_elems(uint8_t *buf, size_t buflen,
1567 TALLOC_CTX *mem_ctx,
1568 struct ctdb_connection *out)
1570 if (buflen < sizeof(struct ctdb_connection)) {
1574 memcpy(out, buf, sizeof(struct ctdb_connection));
1579 int ctdb_connection_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1580 struct ctdb_connection **out)
1582 struct ctdb_connection *conn;
1585 conn = talloc(mem_ctx, struct ctdb_connection);
1590 ret = ctdb_connection_pull_elems(buf, buflen, conn, conn);
1599 struct ctdb_tunable_wire {
1605 size_t ctdb_tunable_len(struct ctdb_tunable *tunable)
1607 return offsetof(struct ctdb_tunable_wire, name) +
1608 strlen(tunable->name) + 1;
1611 void ctdb_tunable_push(struct ctdb_tunable *tunable, uint8_t *buf)
1613 struct ctdb_tunable_wire *wire = (struct ctdb_tunable_wire *)buf;
1615 wire->value = tunable->value;
1616 wire->length = strlen(tunable->name) + 1;
1617 memcpy(wire->name, tunable->name, wire->length);
1620 int ctdb_tunable_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1621 struct ctdb_tunable **out)
1623 struct ctdb_tunable *tunable;
1624 struct ctdb_tunable_wire *wire = (struct ctdb_tunable_wire *)buf;
1626 if (buflen < offsetof(struct ctdb_tunable_wire, name)) {
1629 if (wire->length > buflen) {
1632 if (offsetof(struct ctdb_tunable_wire, name) + wire->length <
1633 offsetof(struct ctdb_tunable_wire, name)) {
1636 if (buflen < offsetof(struct ctdb_tunable_wire, name) + wire->length) {
1640 tunable = talloc(mem_ctx, struct ctdb_tunable);
1641 if (tunable == NULL) {
1645 tunable->value = wire->value;
1646 tunable->name = talloc_memdup(tunable, wire->name, wire->length);
1647 if (tunable->name == NULL) {
1648 talloc_free(tunable);
1656 size_t ctdb_node_flag_change_len(struct ctdb_node_flag_change *flag_change)
1658 return sizeof(struct ctdb_node_flag_change);
1661 void ctdb_node_flag_change_push(struct ctdb_node_flag_change *flag_change,
1664 memcpy(buf, flag_change, sizeof(struct ctdb_node_flag_change));
1667 int ctdb_node_flag_change_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1668 struct ctdb_node_flag_change **out)
1670 struct ctdb_node_flag_change *flag_change;
1672 if (buflen < sizeof(struct ctdb_node_flag_change)) {
1676 flag_change = talloc_memdup(mem_ctx, buf,
1677 sizeof(struct ctdb_node_flag_change));
1678 if (flag_change == NULL) {
1686 struct ctdb_var_list_wire {
1691 size_t ctdb_var_list_len(struct ctdb_var_list *var_list)
1694 size_t len = sizeof(uint32_t);
1696 for (i=0; i<var_list->count; i++) {
1697 len += strlen(var_list->var[i]) + 1;
1702 void ctdb_var_list_push(struct ctdb_var_list *var_list, uint8_t *buf)
1704 struct ctdb_var_list_wire *wire = (struct ctdb_var_list_wire *)buf;
1708 if (var_list->count > 0) {
1709 n = sprintf(wire->list_str, "%s", var_list->var[0]);
1712 for (i=1; i<var_list->count; i++) {
1713 n = sprintf(&wire->list_str[offset], ":%s", var_list->var[i]);
1716 wire->length = offset + 1;
1719 int ctdb_var_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1720 struct ctdb_var_list **out)
1722 struct ctdb_var_list *var_list = NULL;
1723 struct ctdb_var_list_wire *wire = (struct ctdb_var_list_wire *)buf;
1724 char *str, *s, *tok, *ptr;
1727 if (buflen < sizeof(uint32_t)) {
1730 if (wire->length > buflen) {
1733 if (sizeof(uint32_t) + wire->length < sizeof(uint32_t)) {
1736 if (buflen < sizeof(uint32_t) + wire->length) {
1740 str = talloc_strndup(mem_ctx, (char *)wire->list_str, wire->length);
1745 var_list = talloc_zero(mem_ctx, struct ctdb_var_list);
1746 if (var_list == NULL) {
1751 while ((tok = strtok_r(s, ":", &ptr)) != NULL) {
1753 list = talloc_realloc(var_list, var_list->var, const char *,
1759 var_list->var = list;
1760 var_list->var[var_list->count] = talloc_strdup(var_list, tok);
1761 if (var_list->var[var_list->count] == NULL) {
1773 talloc_free(var_list);
1777 size_t ctdb_tunable_list_len(struct ctdb_tunable_list *tun_list)
1779 return sizeof(struct ctdb_tunable_list);
1782 void ctdb_tunable_list_push(struct ctdb_tunable_list *tun_list, uint8_t *buf)
1784 memcpy(buf, tun_list, sizeof(struct ctdb_tunable_list));
1787 int ctdb_tunable_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1788 struct ctdb_tunable_list **out)
1790 struct ctdb_tunable_list *tun_list;
1792 if (buflen < sizeof(struct ctdb_tunable_list)) {
1796 tun_list = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_tunable_list));
1797 if (tun_list == NULL) {
1805 struct ctdb_tickle_list_wire {
1806 ctdb_sock_addr addr;
1808 struct ctdb_connection conn[1];
1811 size_t ctdb_tickle_list_len(struct ctdb_tickle_list *tickles)
1813 return offsetof(struct ctdb_tickle_list, conn) +
1814 tickles->num * sizeof(struct ctdb_connection);
1817 void ctdb_tickle_list_push(struct ctdb_tickle_list *tickles, uint8_t *buf)
1819 struct ctdb_tickle_list_wire *wire =
1820 (struct ctdb_tickle_list_wire *)buf;
1824 memcpy(&wire->addr, &tickles->addr, sizeof(ctdb_sock_addr));
1825 wire->num = tickles->num;
1827 offset = offsetof(struct ctdb_tickle_list_wire, conn);
1828 for (i=0; i<tickles->num; i++) {
1829 ctdb_connection_push(&tickles->conn[i], &buf[offset]);
1830 offset += ctdb_connection_len(&tickles->conn[i]);
1834 int ctdb_tickle_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1835 struct ctdb_tickle_list **out)
1837 struct ctdb_tickle_list *tickles;
1838 struct ctdb_tickle_list_wire *wire =
1839 (struct ctdb_tickle_list_wire *)buf;
1843 if (buflen < offsetof(struct ctdb_tickle_list_wire, conn)) {
1846 if (wire->num > buflen / sizeof(struct ctdb_connection)) {
1849 if (offsetof(struct ctdb_tickle_list_wire, conn) +
1850 wire->num * sizeof(struct ctdb_connection) <
1851 offsetof(struct ctdb_tickle_list_wire, conn)) {
1854 if (buflen < offsetof(struct ctdb_tickle_list_wire, conn) +
1855 wire->num * sizeof(struct ctdb_connection)) {
1859 tickles = talloc(mem_ctx, struct ctdb_tickle_list);
1860 if (tickles == NULL) {
1864 offset = offsetof(struct ctdb_tickle_list, conn);
1865 memcpy(tickles, wire, offset);
1867 tickles->conn = talloc_array(tickles, struct ctdb_connection,
1869 if (tickles->conn == NULL) {
1870 talloc_free(tickles);
1874 for (i=0; i<wire->num; i++) {
1875 ret = ctdb_connection_pull_elems(&buf[offset], buflen-offset,
1879 talloc_free(tickles);
1882 offset += ctdb_connection_len(&tickles->conn[i]);
1889 struct ctdb_addr_info_wire {
1890 ctdb_sock_addr addr;
1896 size_t ctdb_addr_info_len(struct ctdb_addr_info *arp)
1900 len = offsetof(struct ctdb_addr_info_wire, iface);
1901 if (arp->iface != NULL) {
1902 len += strlen(arp->iface)+1;
1908 void ctdb_addr_info_push(struct ctdb_addr_info *addr_info, uint8_t *buf)
1910 struct ctdb_addr_info_wire *wire = (struct ctdb_addr_info_wire *)buf;
1912 wire->addr = addr_info->addr;
1913 wire->mask = addr_info->mask;
1914 if (addr_info->iface == NULL) {
1917 wire->len = strlen(addr_info->iface)+1;
1918 memcpy(wire->iface, addr_info->iface, wire->len);
1922 int ctdb_addr_info_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1923 struct ctdb_addr_info **out)
1925 struct ctdb_addr_info *addr_info;
1926 struct ctdb_addr_info_wire *wire = (struct ctdb_addr_info_wire *)buf;
1928 if (buflen < offsetof(struct ctdb_addr_info_wire, iface)) {
1931 if (wire->len > buflen) {
1934 if (offsetof(struct ctdb_addr_info_wire, iface) + wire->len <
1935 offsetof(struct ctdb_addr_info_wire, iface)) {
1938 if (buflen < offsetof(struct ctdb_addr_info_wire, iface) + wire->len) {
1942 addr_info = talloc(mem_ctx, struct ctdb_addr_info);
1943 if (addr_info == NULL) {
1947 addr_info->addr = wire->addr;
1948 addr_info->mask = wire->mask;
1950 if (wire->len == 0) {
1951 addr_info->iface = NULL;
1953 addr_info->iface = talloc_strndup(addr_info, wire->iface,
1955 if (addr_info->iface == NULL) {
1956 talloc_free(addr_info);
1965 size_t ctdb_transdb_len(struct ctdb_transdb *transdb)
1967 return sizeof(struct ctdb_transdb);
1970 void ctdb_transdb_push(struct ctdb_transdb *transdb, uint8_t *buf)
1972 memcpy(buf, transdb, sizeof(struct ctdb_transdb));
1975 int ctdb_transdb_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
1976 struct ctdb_transdb **out)
1978 struct ctdb_transdb *transdb;
1980 if (buflen < sizeof(struct ctdb_transdb)) {
1984 transdb = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_transdb));
1985 if (transdb == NULL) {
1993 size_t ctdb_uptime_len(struct ctdb_uptime *uptime)
1995 return sizeof(struct ctdb_uptime);
1998 void ctdb_uptime_push(struct ctdb_uptime *uptime, uint8_t *buf)
2000 memcpy(buf, uptime, sizeof(struct ctdb_uptime));
2003 int ctdb_uptime_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2004 struct ctdb_uptime **out)
2006 struct ctdb_uptime *uptime;
2008 if (buflen < sizeof(struct ctdb_uptime)) {
2012 uptime = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_uptime));
2013 if (uptime == NULL) {
2021 size_t ctdb_public_ip_len(struct ctdb_public_ip *pubip)
2023 return sizeof(struct ctdb_public_ip);
2026 void ctdb_public_ip_push(struct ctdb_public_ip *pubip, uint8_t *buf)
2028 memcpy(buf, pubip, sizeof(struct ctdb_public_ip));
2031 static int ctdb_public_ip_pull_elems(uint8_t *buf, size_t buflen,
2032 TALLOC_CTX *mem_ctx,
2033 struct ctdb_public_ip *out)
2035 if (buflen < sizeof(struct ctdb_public_ip)) {
2039 memcpy(out, buf, sizeof(struct ctdb_public_ip));
2044 int ctdb_public_ip_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2045 struct ctdb_public_ip **out)
2047 struct ctdb_public_ip *pubip;
2050 pubip = talloc(mem_ctx, struct ctdb_public_ip);
2051 if (pubip == NULL) {
2055 ret = ctdb_public_ip_pull_elems(buf, buflen, pubip, pubip);
2064 struct ctdb_public_ip_list_wire {
2066 struct ctdb_public_ip ip[1];
2069 size_t ctdb_public_ip_list_len(struct ctdb_public_ip_list *pubip_list)
2074 len = sizeof(uint32_t);
2075 for (i=0; i<pubip_list->num; i++) {
2076 len += ctdb_public_ip_len(&pubip_list->ip[i]);
2081 void ctdb_public_ip_list_push(struct ctdb_public_ip_list *pubip_list,
2084 struct ctdb_public_ip_list_wire *wire =
2085 (struct ctdb_public_ip_list_wire *)buf;
2089 wire->num = pubip_list->num;
2091 offset = offsetof(struct ctdb_public_ip_list_wire, ip);
2092 for (i=0; i<pubip_list->num; i++) {
2093 ctdb_public_ip_push(&pubip_list->ip[i], &buf[offset]);
2094 offset += ctdb_public_ip_len(&pubip_list->ip[i]);
2098 int ctdb_public_ip_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2099 struct ctdb_public_ip_list **out)
2101 struct ctdb_public_ip_list *pubip_list;
2102 struct ctdb_public_ip_list_wire *wire =
2103 (struct ctdb_public_ip_list_wire *)buf;
2108 if (buflen < sizeof(uint32_t)) {
2111 if (wire->num > buflen / sizeof(struct ctdb_public_ip)) {
2114 if (sizeof(uint32_t) + wire->num * sizeof(struct ctdb_public_ip) <
2118 if (buflen < sizeof(uint32_t) +
2119 wire->num * sizeof(struct ctdb_public_ip)) {
2123 pubip_list = talloc(mem_ctx, struct ctdb_public_ip_list);
2124 if (pubip_list == NULL) {
2128 pubip_list->num = wire->num;
2129 if (wire->num == 0) {
2130 pubip_list->ip = NULL;
2134 pubip_list->ip = talloc_array(pubip_list, struct ctdb_public_ip,
2136 if (pubip_list->ip == NULL) {
2137 talloc_free(pubip_list);
2141 offset = offsetof(struct ctdb_public_ip_list_wire, ip);
2142 for (i=0; i<wire->num; i++) {
2143 ret = ctdb_public_ip_pull_elems(&buf[offset], buflen-offset,
2145 &pubip_list->ip[i]);
2147 talloc_free(pubip_list);
2150 offset += ctdb_public_ip_len(&pubip_list->ip[i]);
2157 size_t ctdb_node_and_flags_len(struct ctdb_node_and_flags *node)
2159 return sizeof(struct ctdb_node_and_flags);
2162 void ctdb_node_and_flags_push(struct ctdb_node_and_flags *node, uint8_t *buf)
2164 memcpy(buf, node, sizeof(struct ctdb_node_and_flags));
2167 static int ctdb_node_and_flags_pull_elems(TALLOC_CTX *mem_ctx,
2168 uint8_t *buf, size_t buflen,
2169 struct ctdb_node_and_flags *out)
2171 if (buflen < sizeof(struct ctdb_node_and_flags)) {
2175 memcpy(out, buf, sizeof(struct ctdb_node_and_flags));
2180 int ctdb_node_and_flags_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2181 struct ctdb_node_and_flags **out)
2183 struct ctdb_node_and_flags *node;
2186 node = talloc(mem_ctx, struct ctdb_node_and_flags);
2191 ret = ctdb_node_and_flags_pull_elems(node, buf, buflen, node);
2200 struct ctdb_node_map_wire {
2202 struct ctdb_node_and_flags node[1];
2205 size_t ctdb_node_map_len(struct ctdb_node_map *nodemap)
2207 return sizeof(uint32_t) +
2208 nodemap->num * sizeof(struct ctdb_node_and_flags);
2211 void ctdb_node_map_push(struct ctdb_node_map *nodemap, uint8_t *buf)
2213 struct ctdb_node_map_wire *wire = (struct ctdb_node_map_wire *)buf;
2217 wire->num = nodemap->num;
2219 offset = offsetof(struct ctdb_node_map_wire, node);
2220 for (i=0; i<nodemap->num; i++) {
2221 ctdb_node_and_flags_push(&nodemap->node[i], &buf[offset]);
2222 offset += ctdb_node_and_flags_len(&nodemap->node[i]);
2226 int ctdb_node_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2227 struct ctdb_node_map **out)
2229 struct ctdb_node_map *nodemap;
2230 struct ctdb_node_map_wire *wire = (struct ctdb_node_map_wire *)buf;
2235 if (buflen < sizeof(uint32_t)) {
2238 if (wire->num > buflen / sizeof(struct ctdb_node_and_flags)) {
2241 if (sizeof(uint32_t) + wire->num * sizeof(struct ctdb_node_and_flags) <
2245 if (buflen < sizeof(uint32_t) +
2246 wire->num * sizeof(struct ctdb_node_and_flags)) {
2250 nodemap = talloc(mem_ctx, struct ctdb_node_map);
2251 if (nodemap == NULL) {
2255 nodemap->num = wire->num;
2256 nodemap->node = talloc_array(nodemap, struct ctdb_node_and_flags,
2258 if (nodemap->node == NULL) {
2259 talloc_free(nodemap);
2263 offset = offsetof(struct ctdb_node_map_wire, node);
2264 for (i=0; i<wire->num; i++) {
2265 ret = ctdb_node_and_flags_pull_elems(nodemap->node,
2270 talloc_free(nodemap);
2273 offset += ctdb_node_and_flags_len(&nodemap->node[i]);
2280 size_t ctdb_script_len(struct ctdb_script *script)
2282 return sizeof(struct ctdb_script);
2285 void ctdb_script_push(struct ctdb_script *script, uint8_t *buf)
2287 memcpy(buf, script, sizeof(struct ctdb_script));
2290 static int ctdb_script_pull_elems(uint8_t *buf, size_t buflen,
2291 TALLOC_CTX *mem_ctx,
2292 struct ctdb_script *out)
2294 if (buflen < sizeof(struct ctdb_script)) {
2298 memcpy(out, buf, sizeof(struct ctdb_script));
2303 int ctdb_script_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2304 struct ctdb_script **out)
2306 struct ctdb_script *script;
2309 script = talloc(mem_ctx, struct ctdb_script);
2310 if (script == NULL) {
2314 ret = ctdb_script_pull_elems(buf, buflen, script, script);
2316 TALLOC_FREE(script);
2323 struct ctdb_script_list_wire {
2324 uint32_t num_scripts;
2325 struct ctdb_script script[1];
2328 size_t ctdb_script_list_len(struct ctdb_script_list *script_list)
2333 if (script_list == NULL) {
2337 len = offsetof(struct ctdb_script_list_wire, script);
2338 for (i=0; i<script_list->num_scripts; i++) {
2339 len += ctdb_script_len(&script_list->script[i]);
2344 void ctdb_script_list_push(struct ctdb_script_list *script_list, uint8_t *buf)
2346 struct ctdb_script_list_wire *wire =
2347 (struct ctdb_script_list_wire *)buf;
2351 if (script_list == NULL) {
2355 wire->num_scripts = script_list->num_scripts;
2357 offset = offsetof(struct ctdb_script_list_wire, script);
2358 for (i=0; i<script_list->num_scripts; i++) {
2359 ctdb_script_push(&script_list->script[i], &buf[offset]);
2360 offset += ctdb_script_len(&script_list->script[i]);
2364 int ctdb_script_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2365 struct ctdb_script_list **out)
2367 struct ctdb_script_list *script_list;
2368 struct ctdb_script_list_wire *wire =
2369 (struct ctdb_script_list_wire *)buf;
2374 /* If event scripts have never been run, the result will be NULL */
2380 offset = offsetof(struct ctdb_script_list_wire, script);
2382 if (buflen < offset) {
2385 if (wire->num_scripts > buflen / sizeof(struct ctdb_script)) {
2388 if (offset + wire->num_scripts * sizeof(struct ctdb_script) < offset) {
2391 if (buflen < offset + wire->num_scripts * sizeof(struct ctdb_script)) {
2395 script_list = talloc(mem_ctx, struct ctdb_script_list);
2396 if (script_list == NULL) {
2401 script_list->num_scripts = wire->num_scripts;
2402 script_list->script = talloc_array(script_list, struct ctdb_script,
2404 if (script_list->script == NULL) {
2405 talloc_free(script_list);
2409 for (i=0; i<wire->num_scripts; i++) {
2410 ret = ctdb_script_pull_elems(&buf[offset], buflen-offset,
2411 script_list->script,
2412 &script_list->script[i]);
2414 talloc_free(script_list);
2417 offset += ctdb_script_len(&script_list->script[i]);
2424 size_t ctdb_ban_state_len(struct ctdb_ban_state *ban_state)
2426 return sizeof(struct ctdb_ban_state);
2429 void ctdb_ban_state_push(struct ctdb_ban_state *ban_state, uint8_t *buf)
2431 memcpy(buf, ban_state, sizeof(struct ctdb_ban_state));
2434 int ctdb_ban_state_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2435 struct ctdb_ban_state **out)
2437 struct ctdb_ban_state *ban_state;
2439 if (buflen < sizeof(struct ctdb_ban_state)) {
2443 ban_state = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_ban_state));
2444 if (ban_state == NULL) {
2452 struct ctdb_notify_data_wire {
2458 size_t ctdb_notify_data_len(struct ctdb_notify_data *notify)
2460 return offsetof(struct ctdb_notify_data_wire, data) +
2464 void ctdb_notify_data_push(struct ctdb_notify_data *notify, uint8_t *buf)
2466 struct ctdb_notify_data_wire *wire =
2467 (struct ctdb_notify_data_wire *)buf;
2469 wire->srvid = notify->srvid;
2470 wire->len = notify->data.dsize;
2471 memcpy(wire->data, notify->data.dptr, notify->data.dsize);
2474 int ctdb_notify_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2475 struct ctdb_notify_data **out)
2477 struct ctdb_notify_data *notify;
2478 struct ctdb_notify_data_wire *wire =
2479 (struct ctdb_notify_data_wire *)buf;
2481 if (buflen < offsetof(struct ctdb_notify_data_wire, data)) {
2484 if (wire->len > buflen) {
2487 if (offsetof(struct ctdb_notify_data_wire, data) + wire->len <
2488 offsetof(struct ctdb_notify_data_wire, data)) {
2491 if (buflen < offsetof(struct ctdb_notify_data_wire, data) + wire->len) {
2495 notify = talloc(mem_ctx, struct ctdb_notify_data);
2496 if (notify == NULL) {
2500 notify->srvid = wire->srvid;
2501 notify->data.dsize = wire->len;
2502 notify->data.dptr = talloc_memdup(notify, wire->data, wire->len);
2503 if (notify->data.dptr == NULL) {
2504 talloc_free(notify);
2512 size_t ctdb_iface_len(struct ctdb_iface *iface)
2514 return sizeof(struct ctdb_iface);
2517 void ctdb_iface_push(struct ctdb_iface *iface, uint8_t *buf)
2519 memcpy(buf, iface, sizeof(struct ctdb_iface));
2522 static int ctdb_iface_pull_elems(uint8_t *buf, size_t buflen,
2523 TALLOC_CTX *mem_ctx,
2524 struct ctdb_iface *out)
2526 if (buflen < sizeof(struct ctdb_iface)) {
2530 memcpy(out, buf, sizeof(struct ctdb_iface));
2535 int ctdb_iface_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2536 struct ctdb_iface **out)
2538 struct ctdb_iface *iface;
2541 iface = talloc(mem_ctx, struct ctdb_iface);
2542 if (iface == NULL) {
2546 ret = ctdb_iface_pull_elems(buf, buflen, iface, iface);
2555 struct ctdb_iface_list_wire {
2557 struct ctdb_iface iface[1];
2560 size_t ctdb_iface_list_len(struct ctdb_iface_list *iface_list)
2562 return sizeof(uint32_t) +
2563 iface_list->num * sizeof(struct ctdb_iface);
2566 void ctdb_iface_list_push(struct ctdb_iface_list *iface_list, uint8_t *buf)
2568 struct ctdb_iface_list_wire *wire =
2569 (struct ctdb_iface_list_wire *)buf;
2571 wire->num = iface_list->num;
2572 memcpy(wire->iface, iface_list->iface,
2573 iface_list->num * sizeof(struct ctdb_iface));
2576 int ctdb_iface_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2577 struct ctdb_iface_list **out)
2579 struct ctdb_iface_list *iface_list;
2580 struct ctdb_iface_list_wire *wire =
2581 (struct ctdb_iface_list_wire *)buf;
2583 if (buflen < sizeof(uint32_t)) {
2586 if (wire->num > buflen / sizeof(struct ctdb_iface)) {
2589 if (sizeof(uint32_t) + wire->num * sizeof(struct ctdb_iface) <
2593 if (buflen < sizeof(uint32_t) + wire->num * sizeof(struct ctdb_iface)) {
2597 iface_list = talloc(mem_ctx, struct ctdb_iface_list);
2598 if (iface_list == NULL) {
2602 iface_list->num = wire->num;
2603 iface_list->iface = talloc_array(iface_list, struct ctdb_iface,
2605 if (iface_list->iface == NULL) {
2606 talloc_free(iface_list);
2610 memcpy(iface_list->iface, wire->iface,
2611 wire->num * sizeof(struct ctdb_iface));
2617 struct ctdb_public_ip_info_wire {
2618 struct ctdb_public_ip ip;
2619 uint32_t active_idx;
2621 struct ctdb_iface ifaces[1];
2624 size_t ctdb_public_ip_info_len(struct ctdb_public_ip_info *ipinfo)
2626 return offsetof(struct ctdb_public_ip_info_wire, num) +
2627 ctdb_iface_list_len(ipinfo->ifaces);
2630 void ctdb_public_ip_info_push(struct ctdb_public_ip_info *ipinfo, uint8_t *buf)
2632 struct ctdb_public_ip_info_wire *wire =
2633 (struct ctdb_public_ip_info_wire *)buf;
2636 offset = offsetof(struct ctdb_public_ip_info_wire, num);
2637 memcpy(wire, ipinfo, offset);
2638 wire->num = ipinfo->ifaces->num;
2639 memcpy(wire->ifaces, ipinfo->ifaces->iface,
2640 ipinfo->ifaces->num * sizeof(struct ctdb_iface));
2643 int ctdb_public_ip_info_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2644 struct ctdb_public_ip_info **out)
2646 struct ctdb_public_ip_info *ipinfo;
2647 struct ctdb_public_ip_info_wire *wire =
2648 (struct ctdb_public_ip_info_wire *)buf;
2650 if (buflen < offsetof(struct ctdb_public_ip_info_wire, ifaces)) {
2653 if (wire->num > buflen / sizeof(struct ctdb_iface)) {
2656 if (offsetof(struct ctdb_public_ip_info_wire, ifaces) +
2657 wire->num * sizeof(struct ctdb_iface) <
2658 offsetof(struct ctdb_public_ip_info_wire, ifaces)) {
2661 if (buflen < offsetof(struct ctdb_public_ip_info_wire, ifaces) +
2662 wire->num * sizeof(struct ctdb_iface)) {
2666 ipinfo = talloc(mem_ctx, struct ctdb_public_ip_info);
2667 if (ipinfo == NULL) {
2671 memcpy(ipinfo, wire, offsetof(struct ctdb_public_ip_info_wire, num));
2673 ipinfo->ifaces = talloc(ipinfo, struct ctdb_iface_list);
2674 if (ipinfo->ifaces == NULL) {
2675 talloc_free(ipinfo);
2679 ipinfo->ifaces->num = wire->num;
2680 ipinfo->ifaces->iface = talloc_array(ipinfo->ifaces, struct ctdb_iface,
2682 if (ipinfo->ifaces->iface == NULL) {
2683 talloc_free(ipinfo);
2687 memcpy(ipinfo->ifaces->iface, wire->ifaces,
2688 wire->num * sizeof(struct ctdb_iface));
2694 struct ctdb_key_data_wire {
2696 struct ctdb_ltdb_header header;
2701 size_t ctdb_key_data_len(struct ctdb_key_data *key)
2703 return offsetof(struct ctdb_key_data_wire, key) + key->key.dsize;
2706 void ctdb_key_data_push(struct ctdb_key_data *key, uint8_t *buf)
2708 struct ctdb_key_data_wire *wire = (struct ctdb_key_data_wire *)buf;
2710 memcpy(wire, key, offsetof(struct ctdb_key_data, key));
2711 wire->keylen = key->key.dsize;
2712 memcpy(wire->key, key->key.dptr, key->key.dsize);
2715 int ctdb_key_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2716 struct ctdb_key_data **out)
2718 struct ctdb_key_data *key_data;
2719 struct ctdb_key_data_wire *wire = (struct ctdb_key_data_wire *)buf;
2721 if (buflen < offsetof(struct ctdb_key_data_wire, key)) {
2724 if (wire->keylen > buflen) {
2727 if (offsetof(struct ctdb_key_data_wire, key) + wire->keylen <
2728 offsetof(struct ctdb_key_data_wire, key)) {
2731 if (buflen < offsetof(struct ctdb_key_data_wire, key) + wire->keylen) {
2735 key_data = talloc(mem_ctx, struct ctdb_key_data);
2736 if (key_data == NULL) {
2740 memcpy(key_data, wire, offsetof(struct ctdb_key_data, key));
2742 key_data->key.dsize = wire->keylen;
2743 key_data->key.dptr = talloc_memdup(key_data, wire->key, wire->keylen);
2744 if (key_data->key.dptr == NULL) {
2745 talloc_free(key_data);
2753 struct ctdb_db_statistics_wire {
2754 struct ctdb_db_statistics dbstats;
2755 char hot_keys_wire[1];
2758 size_t ctdb_db_statistics_len(struct ctdb_db_statistics *dbstats)
2763 len = sizeof(struct ctdb_db_statistics);
2764 for (i=0; i<MAX_HOT_KEYS; i++) {
2765 len += dbstats->hot_keys[i].key.dsize;
2770 void ctdb_db_statistics_push(struct ctdb_db_statistics *dbstats, void *buf)
2772 struct ctdb_db_statistics_wire *wire =
2773 (struct ctdb_db_statistics_wire *)buf;
2777 dbstats->num_hot_keys = MAX_HOT_KEYS;
2778 memcpy(wire, dbstats, sizeof(struct ctdb_db_statistics));
2781 for (i=0; i<MAX_HOT_KEYS; i++) {
2782 memcpy(&wire->hot_keys_wire[offset],
2783 dbstats->hot_keys[i].key.dptr,
2784 dbstats->hot_keys[i].key.dsize);
2785 offset += dbstats->hot_keys[i].key.dsize;
2789 int ctdb_db_statistics_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2790 struct ctdb_db_statistics **out)
2792 struct ctdb_db_statistics *dbstats;
2793 struct ctdb_db_statistics_wire *wire =
2794 (struct ctdb_db_statistics_wire *)buf;
2798 if (buflen < sizeof(struct ctdb_db_statistics)) {
2803 for (i=0; i<wire->dbstats.num_hot_keys; i++) {
2804 if (wire->dbstats.hot_keys[i].key.dsize > buflen) {
2807 if (offset + wire->dbstats.hot_keys[i].key.dsize < offset) {
2810 offset += wire->dbstats.hot_keys[i].key.dsize;
2811 if (offset > buflen) {
2815 if (sizeof(struct ctdb_db_statistics) + offset <
2816 sizeof(struct ctdb_db_statistics)) {
2819 if (buflen < sizeof(struct ctdb_db_statistics) + offset) {
2823 dbstats = talloc(mem_ctx, struct ctdb_db_statistics);
2824 if (dbstats == NULL) {
2828 memcpy(dbstats, wire, sizeof(struct ctdb_db_statistics));
2831 for (i=0; i<wire->dbstats.num_hot_keys; i++) {
2835 key_size = dbstats->hot_keys[i].key.dsize;
2836 ptr = talloc_memdup(mem_ctx, &wire->hot_keys_wire[offset],
2839 talloc_free(dbstats);
2842 dbstats->hot_keys[i].key.dptr = ptr;
2850 size_t ctdb_election_message_len(struct ctdb_election_message *election)
2852 return sizeof(struct ctdb_election_message);
2855 void ctdb_election_message_push(struct ctdb_election_message *election,
2858 memcpy(buf, election, sizeof(struct ctdb_election_message));
2861 int ctdb_election_message_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2862 struct ctdb_election_message **out)
2864 struct ctdb_election_message *election;
2866 if (buflen < sizeof(struct ctdb_election_message)) {
2870 election = talloc_memdup(mem_ctx, buf,
2871 sizeof(struct ctdb_election_message));
2872 if (election == NULL) {
2880 size_t ctdb_srvid_message_len(struct ctdb_srvid_message *msg)
2882 return sizeof(struct ctdb_srvid_message);
2885 void ctdb_srvid_message_push(struct ctdb_srvid_message *msg, uint8_t *buf)
2887 memcpy(buf, msg, sizeof(struct ctdb_srvid_message));
2890 int ctdb_srvid_message_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2891 struct ctdb_srvid_message **out)
2893 struct ctdb_srvid_message *msg;
2895 if (buflen < sizeof(struct ctdb_srvid_message)) {
2899 msg = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_srvid_message));
2908 size_t ctdb_disable_message_len(struct ctdb_disable_message *disable)
2910 return sizeof(struct ctdb_disable_message);
2913 void ctdb_disable_message_push(struct ctdb_disable_message *disable,
2916 memcpy(buf, disable, sizeof(struct ctdb_disable_message));
2919 int ctdb_disable_message_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2920 struct ctdb_disable_message **out)
2922 struct ctdb_disable_message *disable;
2924 if (buflen < sizeof(struct ctdb_disable_message)) {
2928 disable = talloc_memdup(mem_ctx, buf,
2929 sizeof(struct ctdb_disable_message));
2930 if (disable == NULL) {
2938 size_t ctdb_server_id_len(struct ctdb_server_id *sid)
2940 return sizeof(struct ctdb_server_id);
2943 void ctdb_server_id_push(struct ctdb_server_id *sid, uint8_t *buf)
2945 memcpy(buf, sid, sizeof(struct ctdb_server_id));
2948 int ctdb_server_id_pull(uint8_t *buf, size_t buflen,
2949 struct ctdb_server_id *sid)
2951 if (buflen < sizeof(struct ctdb_server_id)) {
2955 memcpy(sid, buf, sizeof(struct ctdb_server_id));
2959 size_t ctdb_g_lock_len(struct ctdb_g_lock *lock)
2961 return sizeof(struct ctdb_g_lock);
2964 void ctdb_g_lock_push(struct ctdb_g_lock *lock, uint8_t *buf)
2966 memcpy(buf, lock, sizeof(struct ctdb_g_lock));
2969 int ctdb_g_lock_pull(uint8_t *buf, size_t buflen, struct ctdb_g_lock *lock)
2971 if (buflen < sizeof(struct ctdb_g_lock)) {
2975 memcpy(lock, buf, sizeof(struct ctdb_g_lock));
2979 size_t ctdb_g_lock_list_len(struct ctdb_g_lock_list *lock_list)
2981 return lock_list->num * sizeof(struct ctdb_g_lock);
2984 void ctdb_g_lock_list_push(struct ctdb_g_lock_list *lock_list, uint8_t *buf)
2989 for (i=0; i<lock_list->num; i++) {
2990 ctdb_g_lock_push(&lock_list->lock[i], &buf[offset]);
2991 offset += sizeof(struct ctdb_g_lock);
2995 int ctdb_g_lock_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
2996 struct ctdb_g_lock_list **out)
2998 struct ctdb_g_lock_list *lock_list;
3003 lock_list = talloc_zero(mem_ctx, struct ctdb_g_lock_list);
3004 if (lock_list == NULL) {
3008 count = buflen / sizeof(struct ctdb_g_lock);
3009 lock_list->lock = talloc_array(lock_list, struct ctdb_g_lock, count);
3010 if (lock_list->lock == NULL) {
3011 talloc_free(lock_list);
3016 for (i=0; i<count; i++) {
3017 ret = ctdb_g_lock_pull(&buf[offset], buflen-offset,
3018 &lock_list->lock[i]);
3020 talloc_free(lock_list);
3023 offset += sizeof(struct ctdb_g_lock);
3026 lock_list->num = count;