int r;
assert_return(m, -EINVAL);
- assert_return(p, -EINVAL);
assert_return(!m->sealed, -EPERM);
assert_return(bus_type_is_basic(type), -EINVAL);
assert_return(!m->poisoned, -ESTALE);
break;
case SD_BUS_TYPE_BOOLEAN:
+
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
align = sz = 4;
assert_cc(sizeof(int) == sizeof(uint32_t));
case SD_BUS_TYPE_UNIX_FD: {
int z, *f;
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
if (!m->allow_fds) {
r = -ENOTSUP;
goto fail;
}
default:
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
align = bus_type_get_alignment(type);
sz = bus_type_get_size(type);
break;
return index >= c->begin + BUS_MESSAGE_BSWAP32(m, *c->array_size);
}
-int sd_bus_message_at_end(sd_bus_message *m, int complete) {
+_public_ int sd_bus_message_at_end(sd_bus_message *m, int complete) {
assert_return(m, -EINVAL);
assert_return(m->sealed, -EPERM);
case SD_BUS_TYPE_BOOLEAN:
if (p)
- *(unsigned*) p = !!*(uint32_t*) q;
+ *(int*) p = !!*(uint32_t*) q;
break;
case SD_BUS_TYPE_INT16:
assert_return(m, -EINVAL);
assert_return(m->sealed, -EPERM);
- assert_return(m->n_containers > 0, -EINVAL);
+ assert_return(m->n_containers > 0, -ENXIO);
c = message_get_container(m);
if (c->enclosing == SD_BUS_TYPE_ARRAY) {
} else {
if (c->signature && c->signature[c->index] != 0)
- return -EINVAL;
+ return -EBUSY;
}
free(c->signature);
c = message_get_container(m);
sz = BUS_MESSAGE_BSWAP32(m, *c->array_size);
- r = message_peek_body(m, &m->rindex, align, sz, &p);
- if (r < 0)
- goto fail;
- if (r == 0) {
- r = -EBADMSG;
- goto fail;
+ if (sz == 0)
+ /* Zero length array, let's return some aligned
+ * pointer that is not NULL */
+ p = (uint8_t*) NULL + align;
+ else {
+ r = message_peek_body(m, &m->rindex, align, sz, &p);
+ if (r < 0)
+ goto fail;
+ if (r == 0) {
+ r = -EBADMSG;
+ goto fail;
+ }
}
r = sd_bus_message_exit_container(m);
if (!streq(signature, "s"))
return -EBADMSG;
- r = message_peek_field_string(m, service_name_is_valid, &ri, &m->destination);
+ r = message_peek_field_string(m, sender_name_is_valid, &ri, &m->destination);
break;
case SD_BUS_MESSAGE_HEADER_SENDER:
if (!streq(signature, "s"))
return -EBADMSG;
- r = message_peek_field_string(m, service_name_is_valid, &ri, &m->sender);
+ r = message_peek_field_string(m, sender_name_is_valid, &ri, &m->sender);
break;
return r;
}
- fprintf(f, "BEGIN_MESSAGE \"%s\" {\n", strempty(m->root_container.signature));
+ fprintf(f, "MESSAGE \"%s\" {\n", strempty(m->root_container.signature));
for(;;) {
_cleanup_free_ char *prefix = NULL;
log_error("Failed to peek type: %s", strerror(-r));
return r;
}
+
if (r == 0) {
if (level <= 1)
break;
if (!prefix)
return log_oom();
- if (type == SD_BUS_TYPE_ARRAY)
- fprintf(f, "%s} END_ARRAY \n", prefix);
- else if (type == SD_BUS_TYPE_VARIANT)
- fprintf(f, "%s} END_VARIANT\n", prefix);
- else if (type == SD_BUS_TYPE_STRUCT)
- fprintf(f, "%s} END_STRUCT\n", prefix);
- else if (type == SD_BUS_TYPE_DICT_ENTRY)
- fprintf(f, "%s} END_DICT_ENTRY\n", prefix);
-
+ fprintf(f, "%s};\n", prefix);
continue;
}
}
if (type == SD_BUS_TYPE_ARRAY)
- fprintf(f, "%sBEGIN_ARRAY \"%s\" {\n", prefix, contents);
+ fprintf(f, "%sARRAY \"%s\" {\n", prefix, contents);
else if (type == SD_BUS_TYPE_VARIANT)
- fprintf(f, "%sBEGIN_VARIANT \"%s\" {\n", prefix, contents);
+ fprintf(f, "%sVARIANT \"%s\" {\n", prefix, contents);
else if (type == SD_BUS_TYPE_STRUCT)
- fprintf(f, "%sBEGIN_STRUCT \"%s\" {\n", prefix, contents);
+ fprintf(f, "%sSTRUCT \"%s\" {\n", prefix, contents);
else if (type == SD_BUS_TYPE_DICT_ENTRY)
- fprintf(f, "%sBEGIN_DICT_ENTRY \"%s\" {\n", prefix, contents);
+ fprintf(f, "%sDICT_ENTRY \"%s\" {\n", prefix, contents);
level ++;
switch (type) {
case SD_BUS_TYPE_BYTE:
- fprintf(f, "%sBYTE: %u\n", prefix, basic.u8);
+ fprintf(f, "%sBYTE %u;\n", prefix, basic.u8);
break;
case SD_BUS_TYPE_BOOLEAN:
- fprintf(f, "%sBOOLEAN: %s\n", prefix, yes_no(basic.i));
+ fprintf(f, "%sBOOLEAN %s;\n", prefix, yes_no(basic.i));
break;
case SD_BUS_TYPE_INT16:
- fprintf(f, "%sINT16: %i\n", prefix, basic.s16);
+ fprintf(f, "%sINT16 %i;\n", prefix, basic.s16);
break;
case SD_BUS_TYPE_UINT16:
- fprintf(f, "%sUINT16: %u\n", prefix, basic.u16);
+ fprintf(f, "%sUINT16 %u;\n", prefix, basic.u16);
break;
case SD_BUS_TYPE_INT32:
- fprintf(f, "%sINT32: %i\n", prefix, basic.s32);
+ fprintf(f, "%sINT32 %i;\n", prefix, basic.s32);
break;
case SD_BUS_TYPE_UINT32:
- fprintf(f, "%sUINT32: %u\n", prefix, basic.u32);
+ fprintf(f, "%sUINT32 %u;\n", prefix, basic.u32);
break;
case SD_BUS_TYPE_INT64:
- fprintf(f, "%sINT64: %lli\n", prefix, (long long) basic.s64);
+ fprintf(f, "%sINT64 %lli;\n", prefix, (long long) basic.s64);
break;
case SD_BUS_TYPE_UINT64:
- fprintf(f, "%sUINT64: %llu\n", prefix, (unsigned long long) basic.u64);
+ fprintf(f, "%sUINT64 %llu;\n", prefix, (unsigned long long) basic.u64);
break;
case SD_BUS_TYPE_DOUBLE:
- fprintf(f, "%sDOUBLE: %g\n", prefix, basic.d64);
+ fprintf(f, "%sDOUBLE %g;\n", prefix, basic.d64);
break;
case SD_BUS_TYPE_STRING:
- fprintf(f, "%sSTRING: \"%s\"\n", prefix, basic.string);
+ fprintf(f, "%sSTRING \"%s\";\n", prefix, basic.string);
break;
case SD_BUS_TYPE_OBJECT_PATH:
- fprintf(f, "%sOBJECT_PATH: \"%s\"\n", prefix, basic.string);
+ fprintf(f, "%sOBJECT_PATH \"%s\";\n", prefix, basic.string);
break;
case SD_BUS_TYPE_SIGNATURE:
- fprintf(f, "%sSIGNATURE: \"%s\"\n", prefix, basic.string);
+ fprintf(f, "%sSIGNATURE \"%s\";\n", prefix, basic.string);
break;
case SD_BUS_TYPE_UNIX_FD:
- fprintf(f, "%sUNIX_FD: %i\n", prefix, basic.i);
+ fprintf(f, "%sUNIX_FD %i;\n", prefix, basic.i);
break;
default:
}
}
- fprintf(f, "} END_MESSAGE\n");
+ fprintf(f, "};\n");
return 0;
}
if (r < 0)
return r;
- return 0;
+ return 1;
}
_public_ int sd_bus_message_read_strv(sd_bus_message *m, char ***l) {