]> git.ipfire.org Git - thirdparty/systemd.git/commit
json-stream: hide JsonStreamQueueItem as an implementation detail
authorDaan De Meyer <daan@amutable.com>
Mon, 13 Apr 2026 08:18:04 +0000 (08:18 +0000)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 20 Apr 2026 17:52:32 +0000 (19:52 +0200)
commit8ad4adcb6f900c333da2cb6ac63e21f581d2ce4f
tree5031f803692ea9f914f96e801f70942b67adf907
parent7f5fe3fd48cb83b42f0473f436aadbd25567884f
json-stream: hide JsonStreamQueueItem as an implementation detail

The json-stream API previously exposed JsonStreamQueueItem and several
functions operating on it (json_stream_make_queue_item(),
json_stream_enqueue_item(), json_stream_queue_item_free(),
json_stream_queue_item_get_data()). These existed solely to support
sd-varlink's "defer-and-modify" pattern for streaming replies, where a
reply is held back so its "continues" field can be set before
transmission. This is a varlink protocol concern that should not leak
into the generic transport layer.

Similarly, the fd pushing API (json_stream_push_fd(),
json_stream_reset_pushed_fds()) and the pushed_fds state lived inside
JsonStream, even though fd-to-message association is a protocol-level
concern managed entirely by sd-varlink.

Rework the API so that:

- JsonStreamQueueItem and all its functions become static to
  json-stream.c. The only output API is now json_stream_enqueue_full()
  (accepting explicit fds) and the inline json_stream_enqueue() wrapper
  for the common no-fds case.

- The pushed_fds state moves from JsonStream into sd_varlink, where
  sd_varlink_push_fd() and sd_varlink_reset_fds() manage it directly.

- The deferred reply in sd-varlink changes from a JsonStreamQueueItem*
  to a plain sd_json_variant* plus a separate previous_fds/n_previous_fds
  pair, keeping the protocol-specific bookkeeping in sd-varlink where it
  belongs.

- A new varlink_enqueue() helper wraps json_stream_enqueue_full() with
  the varlink connection's pushed fds, transferring fd ownership to the
  queue item on success.

qmp-client.c is fixed to use the new API as well.
src/libsystemd/sd-json/json-stream.c
src/libsystemd/sd-json/json-stream.h
src/libsystemd/sd-varlink/sd-varlink.c
src/libsystemd/sd-varlink/varlink-internal.h
src/shared/qmp-client.c