How to get the return value using the command busctl set-property?

Patrick Williams patrick at stwcx.xyz
Sat Apr 17 00:58:03 AEST 2021


On Fri, Apr 16, 2021 at 04:46:00AM +0000, Bruce Lee (李昀峻) wrote:
> Does busctl set-property can get its return value?
...
> If can get its return value from set-property, how to do it?

There isn't really a return value from a set-property call; there is
only a possiblity of error.

If you look at 'man SD_BUS_PROPERTY' you'll see the function type
for a property set is:

       typedef int (*sd_bus_property_set_t)(sd_bus *bus, const char *path,
                                            const char *interface,
                                            const char *property,
                                            sd_bus_message *value,
                                            void *userdata,
                                            sd_bus_error *ret_error);

This is where the 'int' return you're seeing from these set-property
handlers coming from.  The way systemd handles the return code is that
any negative number becomes a negative errno style value that systemd
turns into an appropriate error message back across the dbus.  There is
a paragraph in the manpage with more details:

       If a callback was invoked to handle a request that expects a reply and
       the callback returns a negative value, the value is interpreted as a
       negative errno-style error code and sent back to the caller as a D-Bus
       error as if sd_bus_reply_method_errno(3) was called. Additionally, all
       callbacks take a sd_bus_error output parameter that can be used to
       provide more detailed error information. If ret_error is set when the
       callback finishes, the corresponding D-Bus error is sent back to the
       caller as if sd_bus_reply_method_error(3) was called. Any error stored
       in ret_error takes priority over any negative values returned by the
       same callback when determining which error to send back to the caller.

The *best* way for a set-property handler to return an error is to use
the sd_bus_reply_method_error or fill out the ret_error with
sd_bus_error_set.  Both the ASIO object_server.hpp and the
sdbus++-generated server bindings catch excpetions thrown out of the
set-property handlers and turn them into sd_bus_error_set calls.

Other than the negative value indicating a errno, the positive value has
no meaning and does not do anything at a dbus level.

-- 
Patrick Williams
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20210416/a3c1cb3d/attachment.sig>


More information about the openbmc mailing list