TALLOC_CTX *mem_ctx,
struct ctdb_req_message_data *c);
+/* From protocol/protocol_keepalive.c */
+
+size_t ctdb_req_keepalive_len(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c);
+
+int ctdb_req_keepalive_push(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c,
+ uint8_t *buf, size_t *buflen);
+
+int ctdb_req_keepalive_pull(uint8_t *buf, size_t buflen,
+ struct ctdb_req_header *h,
+ TALLOC_CTX *mem_ctx,
+ struct ctdb_req_keepalive *c);
+
/* From protocol/protocol_event.c */
void ctdb_event_header_fill(struct ctdb_event_header *h, uint32_t reqid);
fprintf(fp, "\n");
}
+static void ctdb_req_keepalive_print(struct ctdb_req_keepalive *c, FILE *fp)
+{
+ fprintf(fp, "Data\n");
+ fprintf(fp, " version:0x%"PRIx32, c->version);
+ fprintf(fp, " uptime:%"PRIu32, c->uptime);
+ fprintf(fp, "\n");
+}
+
/*
* Parse routines
*/
ctdb_reply_control_print(&c, fp);
}
+static void ctdb_req_keepalive_parse(uint8_t *buf, size_t buflen, FILE *fp,
+ TALLOC_CTX *mem_ctx)
+{
+ struct ctdb_req_keepalive c;
+ int ret;
+
+ ret = ctdb_req_keepalive_pull(buf, buflen, NULL, mem_ctx, &c);
+ if (ret != 0) {
+ fprintf(fp, "Failed to parse CTDB_REQ_KEEPALIVE\n");
+ return;
+ }
+
+ ctdb_req_keepalive_print(&c, fp);
+}
+
/*
* Packet print
*/
break;
case CTDB_REQ_KEEPALIVE:
+ ctdb_req_keepalive_parse(buf, buflen, fp, mem_ctx);
break;
default:
--- /dev/null
+/*
+ CTDB protocol marshalling
+
+ Copyright (C) Amitay Isaacs 2017
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <talloc.h>
+#include <tdb.h>
+
+#include "protocol.h"
+#include "protocol_api.h"
+#include "protocol_private.h"
+
+size_t ctdb_req_keepalive_len(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c)
+{
+ return ctdb_req_header_len(h) +
+ ctdb_uint32_len(&c->version) +
+ ctdb_uint32_len(&c->uptime);
+}
+
+int ctdb_req_keepalive_push(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c,
+ uint8_t *buf, size_t *buflen)
+{
+ size_t length, offset = 0, np;
+
+ length = ctdb_req_keepalive_len(h, c);
+ if (*buflen < length) {
+ *buflen = length;
+ return EMSGSIZE;
+ }
+
+ h->length = *buflen;
+ ctdb_req_header_push(h, buf+offset, &np);
+ offset += np;
+
+ ctdb_uint32_push(&c->version, buf+offset, &np);
+ offset += np;
+
+ ctdb_uint32_push(&c->uptime, buf+offset, &np);
+ offset += np;
+
+ return 0;
+}
+
+int ctdb_req_keepalive_pull(uint8_t *buf, size_t buflen,
+ struct ctdb_req_header *h,
+ TALLOC_CTX *mem_ctx,
+ struct ctdb_req_keepalive *c)
+{
+ struct ctdb_req_header header;
+ size_t offset = 0, np;
+ int ret;
+
+ ret = ctdb_req_header_pull(buf, buflen, &header, &np);
+ if (ret != 0) {
+ return ret;
+ }
+ offset += np;
+
+ if (h != NULL) {
+ *h = header;
+ }
+
+ ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->version, &np);
+ if (ret != 0) {
+ return ret;
+ }
+ offset += np;
+
+ ret = ctdb_uint32_pull(buf+offset, buflen-offset, &c->uptime, &np);
+ if (ret != 0) {
+ return ret;
+ }
+ offset += np;
+
+ return 0;
+}
generate_message_output "ctdb_message_data"
generate_message_output "ctdb_req_message"
echo "ctdb_req_message_data"
+ echo "ctdb_req_keepalive"
)
ok "$output"
assert(c->srvid == c2->srvid);
verify_tdb_data(&c->data, &c2->data);
}
+
+void fill_ctdb_req_keepalive(TALLOC_CTX *mem_ctx,
+ struct ctdb_req_keepalive *c)
+{
+ c->version = rand32();
+ c->uptime = rand32();
+}
+
+void verify_ctdb_req_keepalive(struct ctdb_req_keepalive *c,
+ struct ctdb_req_keepalive *c2)
+{
+ assert(c->version == c2->version);
+ assert(c->uptime == c2->uptime);
+}
void verify_ctdb_req_message_data(struct ctdb_req_message_data *c,
struct ctdb_req_message_data *c2);
+void fill_ctdb_req_keepalive(TALLOC_CTX *mem_ctx,
+ struct ctdb_req_keepalive *c);
+void verify_ctdb_req_keepalive(struct ctdb_req_keepalive *c,
+ struct ctdb_req_keepalive *c2);
+
#endif /* __CTDB_PROTOCOL_COMMON_CTDB_H__ */
#include "protocol/protocol_call.c"
#include "protocol/protocol_control.c"
#include "protocol/protocol_message.c"
+#include "protocol/protocol_keepalive.c"
#include "tests/src/protocol_common.h"
#include "tests/src/protocol_common_ctdb.h"
return 0;
}
+struct ctdb_req_keepalive_wire {
+ struct ctdb_req_header hdr;
+ uint32_t version;
+ uint32_t uptime;
+};
+
+static size_t ctdb_req_keepalive_len_old(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c)
+{
+ return sizeof(struct ctdb_req_keepalive_wire);
+}
+
+static int ctdb_req_keepalive_push_old(struct ctdb_req_header *h,
+ struct ctdb_req_keepalive *c,
+ uint8_t *buf, size_t *buflen)
+{
+ struct ctdb_req_keepalive_wire *wire =
+ (struct ctdb_req_keepalive_wire *)buf;
+ size_t length;
+
+ length = ctdb_req_keepalive_len_old(h, c);
+ if (*buflen < length) {
+ *buflen = length;
+ return EMSGSIZE;
+ }
+
+ h->length = *buflen;
+ ctdb_req_header_push_old(h, (uint8_t *)&wire->hdr);
+
+ wire->version = c->version;
+ wire->uptime = c->uptime;
+
+ return 0;
+}
+
+static int ctdb_req_keepalive_pull_old(uint8_t *buf, size_t buflen,
+ struct ctdb_req_header *h,
+ TALLOC_CTX *mem_ctx,
+ struct ctdb_req_keepalive *c)
+{
+ struct ctdb_req_keepalive_wire *wire =
+ (struct ctdb_req_keepalive_wire *)buf;
+ size_t length;
+ int ret;
+
+ length = sizeof(struct ctdb_req_keepalive_wire);
+ if (buflen < length) {
+ return EMSGSIZE;
+ }
+
+ if (h != NULL) {
+ ret = ctdb_req_header_pull_old((uint8_t *)&wire->hdr, buflen,
+ h);
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ c->version = wire->version;
+ c->uptime = wire->uptime;
+
+ return 0;
+}
+
COMPAT_CTDB1_TEST(struct ctdb_req_header, ctdb_req_header);
COMPAT_CTDB7_TEST(struct ctdb_req_message, ctdb_req_message, CTDB_REQ_MESSAGE);
COMPAT_CTDB4_TEST(struct ctdb_req_message_data, ctdb_req_message_data, CTDB_REQ_MESSAGE);
+COMPAT_CTDB4_TEST(struct ctdb_req_keepalive, ctdb_req_keepalive, CTDB_REQ_KEEPALIVE);
+
#define NUM_CONTROLS 151
int main(int argc, char *argv[])
}
COMPAT_TEST_FUNC(ctdb_req_message_data)();
+ COMPAT_TEST_FUNC(ctdb_req_keepalive)();
+
return 0;
}
#include "protocol/protocol_call.c"
#include "protocol/protocol_control.c"
#include "protocol/protocol_message.c"
+#include "protocol/protocol_keepalive.c"
#include "protocol/protocol_packet.c"
#include "tests/src/protocol_common.h"
PROTOCOL_CTDB4_TEST(struct ctdb_req_message_data, ctdb_req_message_data,
CTDB_REQ_MESSAGE);
+PROTOCOL_CTDB4_TEST(struct ctdb_req_keepalive, ctdb_req_keepalive,
+ CTDB_REQ_KEEPALIVE);
+
int main(int argc, char *argv[])
{
uint32_t opcode;
}
TEST_FUNC(ctdb_req_message_data)();
+ TEST_FUNC(ctdb_req_keepalive)();
+
return 0;
}
protocol_call.c
protocol_message.c
protocol_control.c
+ protocol_keepalive.c
protocol_client.c
protocol_debug.c
protocol_util.c