sd_varlink_reply_and_upgrade(3) — Linux manual page

NAME | SYNOPSIS | DESCRIPTION | RETURN VALUE | NOTES | HISTORY | SEE ALSO | COLOPHON

SD_VARLI..._UPGRADE(3) sd_varlink_reply_and_upgradeSD_VARLI..._UPGRADE(3)

NAME         top

       sd_varlink_reply_and_upgrade, sd_varlink_respond_and_upgrade,
       sd_varlink_respond_and_upgradeb, sd_varlink_respond_and_upgradebo,
       sd_varlink_bind_upgrade, sd_varlink_upgrade_t - Reply to a Varlink
       method call and take over the connection for a raw protocol

SYNOPSIS         top

       #include <systemd/sd-varlink.h>

       typedef int (*sd_varlink_upgrade_t)(sd_varlink *link, int input_fd, int output_fd, void *userdata);

       int sd_varlink_reply_and_upgrade(sd_varlink *link,
                                        sd_json_variant *parameters,
                                        int *ret_input_fd,
                                        int *ret_output_fd);

       int sd_varlink_respond_and_upgrade(sd_varlink *link,
                                          sd_json_variant *parameters);

       int sd_varlink_respond_and_upgradeb(sd_varlink *link, ...);

       int sd_varlink_respond_and_upgradebo(sd_varlink *link, ...);

       int sd_varlink_bind_upgrade(sd_varlink *link,
                                   sd_varlink_upgrade_t callback);

DESCRIPTION         top

       These functions implement the server side of a Varlink protocol
       upgrade. A Varlink client may request an upgrade when invoking a
       method (see sd_varlink_call(3) and the SD_VARLINK_METHOD_UPGRADE
       flag passed to method callbacks). If a method is invoked this way,
       the server may send one final reply and then abandon the Varlink
       protocol on the connection entirely, handing the underlying socket
       or pipe file descriptors back to the caller so that an arbitrary,
       non-Varlink ("raw") protocol may be spoken over them instead. This
       is useful for methods that negotiate a switch to a streaming or
       binary protocol, in a manner similar to the "Upgrade:" mechanism
       of HTTP.

       sd_varlink_reply_and_upgrade() sends a final reply to the
       currently processed method call and then takes over the
       connection's file descriptors synchronously. It takes the Varlink
       connection object, a JSON object with the reply parameters (which
       may be NULL), and two output pointers for the file descriptors.
       The parameters object is validated against the method's declared
       reply signature, if known. The reply is flushed to the connection
       before the file descriptors are returned, so that the client has
       received the full reply before the caller starts speaking the
       upgraded protocol. On success the connection is detached from its
       event loop (if any) and disconnected, and ownership of the file
       descriptors is transferred to the caller, which is responsible for
       eventually closing them with close(2).

       The returned file descriptors are switched to blocking mode. For
       bidirectional sockets a single underlying file descriptor carries
       both directions; in this case ret_input_fd and ret_output_fd are
       returned as two independent (duplicated) descriptors referring to
       the same socket, so they may be closed separately. For transports
       backed by a pair of pipes the two descriptors differ and refer to
       the distinct read and write ends. Either ret_input_fd or
       ret_output_fd (but not both) may be NULL; in that case the
       unwanted direction is shut down (if they refer to the same socket,
       see shutdown(2)) or closed (if separate file descriptors) rather
       than returned.

       Note that sd_varlink_reply_and_upgrade() blocks synchronously
       until the reply has been flushed to the socket. A misbehaving or
       adversarial client that stops reading could stall the caller. It
       should hence not be used in servers that multiplex many Varlink
       connections in a single event loop, as one stalled connection
       would block progress on all others. Use
       sd_varlink_respond_and_upgrade() in that case instead.

       sd_varlink_respond_and_upgrade() is the asynchronous counterpart
       of sd_varlink_reply_and_upgrade(). It enqueues the final reply and
       returns immediately, without blocking and without returning the
       file descriptors directly. The reply is subsequently flushed by
       the event loop during regular sd_varlink_process(3) invocations.
       Once the reply has been fully flushed, the connection's file
       descriptors are handed to the upgrade callback previously
       registered with sd_varlink_bind_upgrade(), and the Varlink
       connection is disconnected. This variant is the right choice for
       servers that handle many connections concurrently, as it never
       blocks on a single client.

       sd_varlink_respond_and_upgradeb() is similar to
       sd_varlink_respond_and_upgrade(), but instead of expecting a fully
       constructed sd_json_variant object carrying the reply parameters,
       this object is constructed on-the-fly from the variadic argument
       list, in a style identical to sd_json_build(3).
       sd_varlink_respond_and_upgradebo() is identical to
       sd_varlink_respond_and_upgradeb(), but an enclosing JSON object is
       added implicitly, so that the argument list is expected to consist
       of object field pairs only, in a style identical to
       sd_json_buildo(3).

       sd_varlink_bind_upgrade() registers the upgrade callback that is
       invoked once a reply enqueued via sd_varlink_respond_and_upgrade()
       (or one of its variants) has been flushed to the connection. The
       callback is of type sd_varlink_upgrade_t and receives the Varlink
       connection object, the input and output file descriptors of the
       (now upgraded) connection, and the userdata pointer associated
       with the connection (see sd_varlink_set_userdata(3)). Ownership of
       the two file descriptors is transferred to the callback
       (regardless if the callback later fails or not). The descriptor
       semantics (blocking mode, duplication for bidirectional sockets,
       distinct ends for pipe pairs) match those described for
       sd_varlink_reply_and_upgrade() above. Passing NULL as callback
       removes a previously registered callback.

RETURN VALUE         top

       On success, sd_varlink_reply_and_upgrade(),
       sd_varlink_respond_and_upgrade(),
       sd_varlink_respond_and_upgradeb() and
       sd_varlink_respond_and_upgradebo() return a positive integer.
       sd_varlink_bind_upgrade() returns a non-negative integer on
       success. On failure, they all return a negative errno-style error
       code.

   Errors
       Returned errors may indicate the following problems:

       -EINVAL
           An argument is invalid.

       -ENOTCONN
           The Varlink connection object is not connected.

       -EBUSY
           The connection is not currently processing a method call, so
           there is no reply to send. When returned by
           sd_varlink_bind_upgrade(), a different upgrade callback was
           already registered on the connection.

       -EPROTO
           The currently processed method call did not request a protocol
           upgrade, hence the connection may not be taken over.

       -EBADMSG
           The client sent unexpected data before the upgrade completed,
           i.e. it pipelined raw protocol data before receiving the
           upgrade reply.

       -ENOMEM
           Memory allocation failed.

NOTES         top

       Functions described here are available as a shared library, which
       can be compiled against and linked to with the
       libsystemd pkg-config(1) file.

       The code described here uses getenv(3), which is declared to be
       not multi-thread-safe. This means that the code calling the
       functions described here must not call setenv(3) from a parallel
       thread. It is recommended to only do calls to setenv() from an
       early phase of the program when no other threads have been
       started.

HISTORY         top

       sd_varlink_reply_and_upgrade() was added in version 261.

       sd_varlink_respond_and_upgrade(),
       sd_varlink_respond_and_upgradeb(),
       sd_varlink_respond_and_upgradebo() and sd_varlink_bind_upgrade()
       were added in version 262.

SEE ALSO         top

       systemd(1), sd-varlink(3), sd_varlink_reply(3),
       sd_varlink_call(3), sd_varlink_call_and_upgrade(3),
       sd_varlink_process(3), sd_varlink_set_userdata(3),
       sd_json_build(3)

COLOPHON         top

       This page is part of the systemd (systemd system and service
       manager) project.  Information about the project can be found at
       ⟨http://www.freedesktop.org/wiki/Software/systemd⟩.  If you have a
       bug report for this manual page, see
       ⟨http://www.freedesktop.org/wiki/Software/systemd/#bugreports⟩.
       This page was obtained from the project's upstream Git repository
       ⟨https://github.com/systemd/systemd.git⟩ on 2026-08-04.  (At that
       time, the date of the most recent commit that was found in the
       repository was 2026-08-03.)  If you discover any rendering
       problems in this HTML version of the page, or you believe there is
       a better or more up-to-date source for the page, or you have
       corrections or improvements to the information in this COLOPHON
       (which is not part of the original manual page), send a mail to
       man-pages@man7.org

systemd 262~devel                                  SD_VARLI..._UPGRADE(3)

Pages that refer to this page: sd_varlink_call_and_upgrade(3)systemd.directives(7)systemd.index(7)