[systemd-devel] sd-bus: get size of array container in D-Bus message

Lennart Poettering lennart at poettering.net
Mon Aug 7 13:42:37 UTC 2023


On Mi, 02.08.23 06:39, Stanislav Angelovič (stanislav.angelovic at protonmail.com) wrote:

> Hi folks,
>
> I have a quick question: is there a way to get container size when
> deserializing an array from a D-Bus message (be it an array of
> trivial or non-trivial D-Bus types)? Say I enter a container with
> sd_bus_message_enter_container​, and then, before reading individual
> elements, I'd like to get the number of elements in that array in
> that message (so I can reserve storage on my side, etc.).

The D-Bus marshalling format does not allow us to determine this
efficiently: for arrays it only encodes the size in bytes in the
serialization, not the number of entries. Given that array element
sizes can have varying sizes (consider strings or variants) we thus
cannot determine the array's number of elements efficiently ahead of
time, except by iterating through the potentially huge array.

You can implement a helper for that, but we don't provide an API for
that, since it might make people write inefficient code, by assuming
this was a fast call.

Generally, consumers are better off using an exponential realloc()
loop for growing their data structures as they parse messages.

Yeah, this is not fun, but hey, this is C, so nothing is "fun".

Lennart

--
Lennart Poettering, Berlin


More information about the systemd-devel mailing list