return 0;
}
-struct stringn_wire {
- uint32_t length;
- uint8_t str[1];
-};
-
-size_t ctdb_stringn_len(const char *str)
+size_t ctdb_stringn_len(const char **in)
{
- return sizeof(uint32_t) + ctdb_string_len(&str);
+ uint32_t u32 = ctdb_string_len(in);
+
+ return ctdb_uint32_len(&u32) + u32;
}
-void ctdb_stringn_push(const char *str, uint8_t *buf)
+void ctdb_stringn_push(const char **in, uint8_t *buf, size_t *npush)
{
- struct stringn_wire *wire = (struct stringn_wire *)buf;
- size_t np;
+ size_t offset = 0, np;
+ uint32_t u32 = ctdb_string_len(in);
- wire->length = ctdb_string_len(&str);
- ctdb_string_push(&str, wire->str, &np);
+ ctdb_uint32_push(&u32, buf+offset, &np);
+ offset += np;
+
+ ctdb_string_push(in, buf+offset, &np);
+ offset += np;
+
+ *npush = offset;
}
int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- const char **out)
+ const char **out, size_t *npull)
{
- char *str;
- struct stringn_wire *wire = (struct stringn_wire *)buf;
+ size_t offset = 0, np;
+ uint32_t u32;
+ int ret;
- if (buflen < sizeof(uint32_t)) {
- return EMSGSIZE;
- }
- if (wire->length > buflen) {
- return EMSGSIZE;
- }
- if (sizeof(uint32_t) + wire->length < sizeof(uint32_t)) {
- return EMSGSIZE;
- }
- if (buflen < sizeof(uint32_t) + wire->length) {
- return EMSGSIZE;
+ ret = ctdb_uint32_pull(buf+offset, buflen-offset, &u32, &np);
+ if (ret != 0) {
+ return ret;
}
+ offset += np;
- if (wire->length == 0) {
- *out = NULL;
- return 0;
+ if (buflen-offset < u32) {
+ return EMSGSIZE;
}
- str = talloc_strndup(mem_ctx, (char *)wire->str, wire->length);
- if (str == NULL) {
- return ENOMEM;
+ ret = ctdb_string_pull(buf+offset, u32, mem_ctx, out, &np);
+ if (ret != 0) {
+ return ret;
}
+ offset += np;
- *out = str;
+ *npull = offset;
return 0;
}
break;
case CTDB_CONTROL_GET_TUNABLE:
- len = ctdb_stringn_len(cd->data.tun_var);
+ len = ctdb_stringn_len(&cd->data.tun_var);
break;
case CTDB_CONTROL_LIST_TUNABLES:
break;
case CTDB_CONTROL_GET_TUNABLE:
- ctdb_stringn_push(cd->data.tun_var, buf);
+ ctdb_stringn_push(&cd->data.tun_var, buf, &np);
break;
case CTDB_CONTROL_MODIFY_FLAGS:
case CTDB_CONTROL_GET_TUNABLE:
ret = ctdb_stringn_pull(buf, buflen, mem_ctx,
- &cd->data.tun_var);
+ &cd->data.tun_var, &np);
break;
case CTDB_CONTROL_MODIFY_FLAGS:
{
return ctdb_event_len(in->event) +
ctdb_uint32_len(&in->timeout) +
- ctdb_stringn_len(in->arg_str);
+ ctdb_stringn_len(&in->arg_str);
}
static void ctdb_event_request_run_push(struct ctdb_event_request_run *in,
ctdb_uint32_push(&in->timeout, buf+offset, &np);
offset += np;
- ctdb_stringn_push(in->arg_str, buf+offset);
+ ctdb_stringn_push(&in->arg_str, buf+offset, &np);
}
static int ctdb_event_request_run_pull(uint8_t *buf, size_t buflen,
offset += np;
ret = ctdb_stringn_pull(buf+offset, buflen-offset,
- rdata, &rdata->arg_str);
+ rdata, &rdata->arg_str, &np);
if (ret != 0) {
goto fail;
}
static size_t ctdb_event_request_script_enable_len(
struct ctdb_event_request_script_enable *in)
{
- return ctdb_stringn_len(in->script_name);
+ return ctdb_stringn_len(&in->script_name);
}
static void ctdb_event_request_script_enable_push(
struct ctdb_event_request_script_enable *in,
uint8_t *buf)
{
- ctdb_stringn_push(in->script_name, buf);
+ size_t np;
+
+ ctdb_stringn_push(&in->script_name, buf, &np);
}
static int ctdb_event_request_script_enable_pull(
struct ctdb_event_request_script_enable **out)
{
struct ctdb_event_request_script_enable *rdata;
+ size_t np;
int ret;
rdata = talloc(mem_ctx, struct ctdb_event_request_script_enable);
return ENOMEM;
}
- ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name);
+ ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name, &np);
if (ret != 0) {
talloc_free(rdata);
return ret;
static size_t ctdb_event_request_script_disable_len(
struct ctdb_event_request_script_disable *in)
{
- return ctdb_stringn_len(in->script_name);
+ return ctdb_stringn_len(&in->script_name);
}
static void ctdb_event_request_script_disable_push(
struct ctdb_event_request_script_disable *in,
uint8_t *buf)
{
- ctdb_stringn_push(in->script_name, buf);
+ size_t np;
+
+ ctdb_stringn_push(&in->script_name, buf, &np);
}
static int ctdb_event_request_script_disable_pull(
struct ctdb_event_request_script_disable **out)
{
struct ctdb_event_request_script_disable *rdata;
+ size_t np;
int ret;
rdata = talloc(mem_ctx, struct ctdb_event_request_script_disable);
return ENOMEM;
}
- ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name);
+ ret = ctdb_stringn_pull(buf, buflen, rdata, &rdata->script_name, &np);
if (ret != 0) {
talloc_free(rdata);
return ret;
int ctdb_string_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
const char **out, size_t *npull);
-size_t ctdb_stringn_len(const char *str);
-void ctdb_stringn_push(const char *str, uint8_t *buf);
+size_t ctdb_stringn_len(const char **in);
+void ctdb_stringn_push(const char **in, uint8_t *buf, size_t *npush);
int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- const char **out);
+ const char **out, size_t *npull);
size_t ctdb_pid_len(pid_t pid);
void ctdb_pid_push(pid_t pid, uint8_t *buf);
}
PROTOCOL_TYPE2_TEST(const char *, ctdb_string);
-
-static void test_ctdb_stringn(void)
-{
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
- const char *p1, *p2;
- size_t buflen;
- int ret;
-
- fill_ctdb_string(mem_ctx, &p1);
- buflen = ctdb_stringn_len(p1);
- ctdb_stringn_push(p1, BUFFER);
- ret = ctdb_stringn_pull(BUFFER, buflen, mem_ctx, &p2);
- assert(ret == 0);
- verify_ctdb_string(&p1, &p2);
- talloc_free(mem_ctx);
-}
+PROTOCOL_TYPE2_TEST(const char *, ctdb_stringn);
static void test_ctdb_pid(void)
{
test_ctdb_chararray();
TEST_FUNC(ctdb_string)();
- test_ctdb_stringn();
+ TEST_FUNC(ctdb_stringn)();
test_ctdb_pid();
}
}
+void fill_ctdb_stringn(TALLOC_CTX *mem_ctx, const char **p)
+{
+ fill_ctdb_string(mem_ctx, p);
+}
+
+void verify_ctdb_stringn(const char **p1, const char **p2)
+{
+ verify_ctdb_string(p1, p2);
+}
+
void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p)
{
p->dsize = rand_int(1024) + 1;
void fill_ctdb_string(TALLOC_CTX *mem_ctx, const char **p);
void verify_ctdb_string(const char **p1, const char **p2);
+void fill_ctdb_stringn(TALLOC_CTX *mem_ctx, const char **p);
+void verify_ctdb_stringn(const char **p1, const char **p2);
+
void fill_tdb_data_nonnull(TALLOC_CTX *mem_ctx, TDB_DATA *p);
void fill_tdb_data(TALLOC_CTX *mem_ctx, TDB_DATA *p);
void verify_tdb_data(TDB_DATA *p1, TDB_DATA *p2);