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