diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3/sd_bus_add_object.3')
-rw-r--r-- | upstream/mageia-cauldron/man3/sd_bus_add_object.3 | 774 |
1 files changed, 774 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3/sd_bus_add_object.3 b/upstream/mageia-cauldron/man3/sd_bus_add_object.3 new file mode 100644 index 00000000..559034e1 --- /dev/null +++ b/upstream/mageia-cauldron/man3/sd_bus_add_object.3 @@ -0,0 +1,774 @@ +'\" t +.TH "SD_BUS_ADD_OBJECT" "3" "" "systemd 255" "sd_bus_add_object" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +sd_bus_add_object, sd_bus_add_fallback, sd_bus_add_object_vtable, sd_bus_add_fallback_vtable, sd_bus_add_filter, SD_BUS_VTABLE_CAPABILITY, SD_BUS_VTABLE_START, SD_BUS_VTABLE_END, SD_BUS_METHOD_WITH_NAMES_OFFSET, SD_BUS_METHOD_WITH_NAMES, SD_BUS_METHOD_WITH_OFFSET, SD_BUS_METHOD, SD_BUS_SIGNAL_WITH_NAMES, SD_BUS_SIGNAL, SD_BUS_WRITABLE_PROPERTY, SD_BUS_PROPERTY, SD_BUS_PARAM \- Declare properties and methods for a D\-Bus path +.SH "SYNOPSIS" +.sp +.ft B +.nf +#include <systemd/sd\-bus\-vtable\&.h> +.fi +.ft +.sp +.HP \w'typedef\ int\ (*sd_bus_message_handler_t)('u +.BI "typedef int (*sd_bus_message_handler_t)(sd_bus_message\ *" "m" ", void\ *" "userdata" ", sd_bus_error\ *" "ret_error" ");" +.HP \w'typedef\ int\ (*sd_bus_property_get_t)('u +.BI "typedef int (*sd_bus_property_get_t)(sd_bus\ *" "bus" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "property" ", sd_bus_message\ *" "reply" ", void\ *" "userdata" ", sd_bus_error\ *" "ret_error" ");" +.HP \w'typedef\ int\ (*sd_bus_property_set_t)('u +.BI "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" ");" +.HP \w'typedef\ int\ (*sd_bus_object_find_t)('u +.BI "typedef int (*sd_bus_object_find_t)(const\ char\ *" "path" ", const\ char\ *" "interface" ", void\ *" "userdata" ", void\ **" "ret_found" ", sd_bus_error\ *" "ret_error" ");" +.HP \w'int\ sd_bus_add_object('u +.BI "int sd_bus_add_object(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "path" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ");" +.HP \w'int\ sd_bus_add_fallback('u +.BI "int sd_bus_add_fallback(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "path" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ");" +.HP \w'int\ sd_bus_add_object_vtable('u +.BI "int sd_bus_add_object_vtable(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ sd_bus_vtable\ *" "vtable" ", void\ *" "userdata" ");" +.HP \w'int\ sd_bus_add_fallback_vtable('u +.BI "int sd_bus_add_fallback_vtable(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "prefix" ", const\ char\ *" "interface" ", const\ sd_bus_vtable\ *" "vtable" ", sd_bus_object_find_t\ " "find" ", void\ *" "userdata" ");" +.HP \w'int\ sd_bus_add_filter('u +.BI "int sd_bus_add_filter(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ");" +.PP +\fBSD_BUS_VTABLE_CAPABILITY(\fR\fB\fIcapability\fR\fR\fB)\fR +.PP +\fBSD_BUS_VTABLE_START(\fR\fB\fIflags\fR\fR\fB)\fR +.PP +\fBSD_BUS_VTABLE_END\fR +.PP +\fBSD_BUS_METHOD_WITH_ARGS_OFFSET(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIargs\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIoffset\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_METHOD_WITH_ARGS(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIargs\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_METHOD_WITH_NAMES_OFFSET(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIin_names\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIout_names\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIoffset\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_METHOD_WITH_NAMES(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIin_names\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIout_names\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_METHOD_WITH_OFFSET(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIoffset\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_METHOD(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIresult\fR\fR\fB, \fR\fB\fIhandler\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_SIGNAL_WITH_ARGS(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIargs\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_SIGNAL_WITH_NAMES(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fInames\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_SIGNAL(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_WRITABLE_PROPERTY(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIget\fR\fR\fB, \fR\fB\fIset\fR\fR\fB, \fR\fB\fIoffset\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_PROPERTY(\fR\fB\fImember\fR\fR\fB, \fR\fB\fIsignature\fR\fR\fB, \fR\fB\fIget\fR\fR\fB, \fR\fB\fIoffset\fR\fR\fB, \fR\fB\fIflags\fR\fR\fB) \fR +.PP +\fBSD_BUS_PARAM(\fR\fB\fIname\fR\fR\fB)\fR +.PP +\fBSD_BUS_ARGS(\fR\fB\fI\&.\&.\&.\fR\fR\fB)\fR +.PP +\fBSD_BUS_RESULT(\fR\fB\fI\&.\&.\&.\fR\fR\fB)\fR +.PP +\fBSD_BUS_NO_ARGS\fR +.PP +\fBSD_BUS_NO_RESULT\fR +.SH "DESCRIPTION" +.PP +\fBsd_bus_add_object_vtable()\fR +is used to declare attributes for the object path +\fIpath\fR +connected to the bus connection +\fIbus\fR +under the interface +\fIinterface\fR\&. The table +\fIvtable\fR +may contain property declarations using +\fBSD_BUS_PROPERTY()\fR +or +\fBSD_BUS_WRITABLE_PROPERTY()\fR, method declarations using +\fBSD_BUS_METHOD()\fR, +\fBSD_BUS_METHOD_WITH_NAMES()\fR, +\fBSD_BUS_METHOD_WITH_OFFSET()\fR, or +\fBSD_BUS_METHOD_WITH_NAMES_OFFSET()\fR, and signal declarations using +\fBSD_BUS_SIGNAL_WITH_NAMES()\fR +or +\fBSD_BUS_SIGNAL()\fR, see below\&. The +\fIuserdata\fR +parameter contains a pointer that will be passed to various callback functions\&. It may be specified as +\fBNULL\fR +if no value is necessary\&. An interface can have any number of vtables attached to it\&. +.PP +\fBsd_bus_add_fallback_vtable()\fR +is similar to +\fBsd_bus_add_object_vtable()\fR, but is used to register "fallback" attributes\&. When looking for an attribute declaration, bus object paths registered with +\fBsd_bus_add_object_vtable()\fR +are checked first\&. If no match is found, the fallback vtables are checked for each prefix of the bus object path, i\&.e\&. with the last slash\-separated components successively removed\&. This allows the vtable to be used for an arbitrary number of dynamically created objects\&. +.PP +Parameter +\fIfind\fR +is a function which is used to locate the target object based on the bus object path +\fIpath\fR\&. It must return +\fB1\fR +and set the +\fIret_found\fR +output parameter if the object is found, return +\fB0\fR +if the object was not found, and return a negative errno\-style error code or initialize the error structure +\fIret_error\fR +on error\&. The pointer passed in +\fIret_found\fR +will be used as the +\fIuserdata\fR +parameter for the callback functions (offset by the +\fIoffset\fR +offsets as specified in the vtable entries)\&. +.PP +\fBsd_bus_add_object()\fR +attaches a callback directly to the object path +\fIpath\fR\&. An object path can have any number of callbacks attached to it\&. Each callback is prepended to the list of callbacks which are always called in order\&. +\fBsd_bus_add_fallback()\fR +is similar to +\fBsd_bus_add_object()\fR +but applies to fallback paths instead\&. +.PP +\fBsd_bus_add_filter()\fR +installs a callback that is invoked for each incoming D\-Bus message\&. Filters can be used to handle logic common to all messages received by a service (e\&.g\&. authentication or authorization)\&. +.PP +When a request is received, any associated callbacks are called sequentially until a callback returns a non\-zero integer\&. Return zero from a callback to give other callbacks the chance to process the request\&. Callbacks are called in the following order: first, global callbacks installed with +\fBsd_bus_add_filter()\fR +are called\&. Second, callbacks attached directly to the request object path are called, followed by any D\-Bus method callbacks attached to the request object path, interface and member\&. Finally, the property callbacks attached to the request object path, interface and member are called\&. If the final callback returns zero, an error reply is sent back to the caller indicating no matching object for the request was found\&. +.PP +Note that you can return a positive integer from a +\fImethod\fR +callback without immediately sending a reply\&. This informs sd\-bus this callback will take responsibility for replying to the request without forcing the callback to produce a reply immediately\&. This allows a callback to perform any number of asynchronous operations required to construct a reply\&. However, if producing a reply takes too long, the method call will time out at the caller\&. This is only available to methods and not properties\&. +.PP +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 +\fBsd_bus_reply_method_errno\fR(3) +was called\&. Additionally, all callbacks take a +sd_bus_error +output parameter that can be used to provide more detailed error information\&. If +\fIret_error\fR +is set when the callback finishes, the corresponding D\-Bus error is sent back to the caller as if +\fBsd_bus_reply_method_error\fR(3) +was called\&. Any error stored in +\fIret_error\fR +takes priority over any negative values returned by the same callback when determining which error to send back to the caller\&. Use +\fBsd_bus_error_set\fR(3) +or one of its variants to set +\fIret_error\fR +and return a negative integer from a callback with a single function call\&. To send an error reply after a callback has already finished, use +\fBsd_bus_reply_method_errno\fR(3) +or one of its variants\&. +.PP +For all functions, a match slot is created internally\&. If the output parameter +\fIslot\fR +is +\fBNULL\fR, a "floating" slot object is created, see +\fBsd_bus_slot_set_floating\fR(3)\&. Otherwise, a pointer to the slot object is returned\&. In that case, the reference to the slot object should be dropped when the vtable is not needed anymore, see +\fBsd_bus_slot_unref\fR(3)\&. +.SS "The sd_bus_vtable array" +.PP +The array consists of the structures of type +sd_bus_vtable, but it should never be filled in manually, but through one of the following macros: +.PP +\fBSD_BUS_VTABLE_START(\fR\fB\fIflags\fR\fR\fB)\fR, \fBSD_BUS_VTABLE_END\fR +.RS 4 +Those must always be the first and last element\&. The +\fIflags\fR +parameter can be used to set attributes that apply to the whole array; see the "Flags" section below\&. +.RE +.PP +\fBSD_BUS_METHOD_WITH_ARGS_OFFSET()\fR, \fBSD_BUS_METHOD_WITH_ARGS()\fR +.RS 4 +Declare a D\-Bus method with the name +\fImember\fR, arguments +\fIargs\fR +and result +\fIresult\fR\&. +\fIargs\fR +expects a sequence of argument type/name pairs wrapped in the +\fBSD_BUS_ARGS()\fR +macro\&. The elements at even indices in this list describe the types of the method\*(Aqs arguments\&. The method\*(Aqs parameter signature is the concatenation of all the string literals at even indices in +\fIargs\fR\&. If a method has no parameters, pass +\fBSD_BUS_NO_ARGS\fR +to +\fIargs\fR\&. The elements at uneven indices describe the names of the method\*(Aqs arguments\&. +\fIresult\fR +expects a sequence of type/name pairs wrapped in the +\fBSD_BUS_RESULT()\fR +macro in the same format as +\fBSD_BUS_ARGS()\fR\&. The method\*(Aqs result signature is the concatenation of all the string literals at even indices in +\fIresult\fR\&. If a method has no result, pass +\fBSD_BUS_NO_RESULT\fR +to +\fIresult\fR\&. Note that argument types are expected to be quoted string literals and argument names are expected to be unquoted string literals\&. See below for a complete example\&. +.sp +The handler function +\fIhandler\fR +must be of type +\fBsd_bus_message_handler_t\fR\&. It will be called to handle the incoming messages that call this method\&. It receives a pointer that is the +\fIuserdata\fR +parameter passed to the registration function offset by +\fIoffset\fR +bytes\&. This may be used to pass pointers to different fields in the same data structure to different methods in the same vtable\&. To send a reply from +\fIhandler\fR, call +\fBsd_bus_reply_method_return\fR(3) +with the message the callback was invoked with\&. Parameter +\fIflags\fR +is a combination of flags, see below\&. +.sp +\fBSD_BUS_METHOD_WITH_ARGS()\fR +is a shorthand for calling +\fBSD_BUS_METHOD_WITH_ARGS_OFFSET()\fR +with an offset of zero\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_METHOD_WITH_NAMES_OFFSET()\fR, \fBSD_BUS_METHOD_WITH_NAMES()\fR, \fBSD_BUS_METHOD_WITH_OFFSET()\fR, \fBSD_BUS_METHOD()\fR +.RS 4 +Declare a D\-Bus method with the name +\fImember\fR, parameter signature +\fIsignature\fR, result signature +\fIresult\fR\&. Parameters +\fIin_names\fR +and +\fIout_names\fR +specify the argument names of the input and output arguments in the function signature\&. +\fIin_names\fR +and +\fIout_names\fR +should be created using the +\fBSD_BUS_PARAM()\fR +macro, see below\&. In all other regards, this macro behaves exactly the same as +\fBSD_BUS_METHOD_WITH_ARGS_OFFSET()\fR\&. +.sp +\fBSD_BUS_METHOD_WITH_NAMES()\fR, +\fBSD_BUS_METHOD_WITH_OFFSET()\fR, and +\fBSD_BUS_METHOD()\fR +are variants which specify zero offset (\fIuserdata\fR +parameter is passed with no change), leave the names unset (i\&.e\&. no parameter names), or both\&. +.sp +Prefer using +\fBSD_BUS_METHOD_WITH_ARGS_OFFSET()\fR +and +\fBSD_BUS_METHOD_WITH_ARGS()\fR +over these macros as they allow specifying argument types and names next to each other which is less error\-prone than first specifying all argument types followed by specifying all argument names\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_SIGNAL_WITH_ARGS()\fR +.RS 4 +Declare a D\-Bus signal with the name +\fImember\fR +and arguments +\fIargs\fR\&. +\fIargs\fR +expects a sequence of argument type/name pairs wrapped in the +\fBSD_BUS_ARGS()\fR +macro\&. The elements at even indices in this list describe the types of the signal\*(Aqs arguments\&. The signal\*(Aqs parameter signature is the concatenation of all the string literals at even indices in +\fIargs\fR\&. If a signal has no parameters, pass +\fBSD_BUS_NO_ARGS\fR +to +\fIargs\fR\&. The elements at uneven indices describe the names of the signal\*(Aqs arguments\&. Parameter +\fIflags\fR +is a combination of flags\&. See below for a complete example\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_SIGNAL_WITH_NAMES()\fR, \fBSD_BUS_SIGNAL()\fR +.RS 4 +Declare a D\-Bus signal with the name +\fImember\fR, parameter signature +\fIsignature\fR, and argument names +\fInames\fR\&. +\fInames\fR +should be created using the +\fBSD_BUS_PARAM()\fR +macro, see below\&. Parameter +\fIflags\fR +is a combination of flags, see below\&. +.sp +\fBSD_BUS_SIGNAL()\fR +is equivalent to +\fBSD_BUS_SIGNAL_WITH_NAMES()\fR +with the +\fInames\fR +parameter unset (i\&.e\&. no parameter names)\&. +.sp +Prefer using +\fBSD_BUS_SIGNAL_WITH_ARGS()\fR +over these macros as it allows specifying argument types and names next to each other which is less error\-prone than first specifying all argument types followed by specifying all argument names\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_WRITABLE_PROPERTY()\fR, \fBSD_BUS_PROPERTY()\fR +.RS 4 +Declare a D\-Bus property with the name +\fImember\fR +and value signature +\fIsignature\fR\&. Parameters +\fIget\fR +and +\fIset\fR +are the getter and setter methods\&. They are called with a pointer that is the +\fIuserdata\fR +parameter passed to the registration function offset by +\fIoffset\fR +bytes\&. This may be used pass pointers to different fields in the same data structure to different setters and getters in the same vtable\&. Parameter +\fIflags\fR +is a combination of flags, see below\&. +.sp +The setter and getter methods may be omitted (specified as +\fBNULL\fR), if the property is one of the basic types or +"as" +in case of read\-only properties\&. In those cases, the +\fIuserdata\fR +and +\fIoffset\fR +parameters must together point to a valid variable of the corresponding type\&. A default setter and getter will be provided, which simply copy the argument between this variable and the message\&. +.sp +\fBSD_BUS_PROPERTY()\fR +is used to define a read\-only property\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_PARAM()\fR +.RS 4 +Parameter names should be wrapped in this macro, see the example below\&. +.sp +Added in version 246\&. +.RE +.SS "Flags" +.PP +The +\fIflags\fR +parameter is used to specify a combination of +\m[blue]\fBD\-Bus annotations\fR\m[]\&\s-2\u[1]\d\s+2\&. +.PP +\fBSD_BUS_VTABLE_DEPRECATED\fR +.RS 4 +Mark this vtable entry as deprecated using the +\fBorg\&.freedesktop\&.DBus\&.Deprecated\fR +annotation in introspection data\&. If specified for +\fBSD_BUS_VTABLE_START()\fR, the annotation is applied to the enclosing interface\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_HIDDEN\fR +.RS 4 +Make this vtable entry hidden\&. It will not be shown in introspection data\&. If specified for +\fBSD_BUS_VTABLE_START()\fR, all entries in the array are hidden\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_METHOD_NO_REPLY\fR +.RS 4 +Mark this vtable entry as a method that will not return a reply using the +\fBorg\&.freedesktop\&.DBus\&.Method\&.NoReply\fR +annotation in introspection data\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_PROPERTY_CONST\fR, \fBSD_BUS_VTABLE_PROPERTY_EMITS_CHANGE\fR, \fBSD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION\fR +.RS 4 +Those three flags correspond to different values of the +\fBorg\&.freedesktop\&.DBus\&.Property\&.EmitsChangedSignal\fR +annotation, which specifies whether the +\fBorg\&.freedesktop\&.DBus\&.Properties\&.PropertiesChanged\fR +signal is emitted whenever the property changes\&. +\fBSD_BUS_VTABLE_PROPERTY_CONST\fR +corresponds to +\fBconst\fR +and means that the property never changes during the lifetime of the object it belongs to, so no signal needs to be emitted\&. +\fBSD_BUS_VTABLE_PROPERTY_EMITS_CHANGE\fR +corresponds to +\fBtrue\fR +and means that the signal is emitted\&. +\fBSD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION\fR +corresponds to +\fBinvalidates\fR +and means that the signal is emitted, but the value is not included in the signal\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_PROPERTY_EXPLICIT\fR +.RS 4 +Mark this vtable property entry as requiring explicit request to for the value to be shown (generally because the value is large or slow to calculate)\&. This entry cannot be combined with +\fBSD_BUS_VTABLE_PROPERTY_EMITS_CHANGE\fR, and will not be shown in property listings by default (e\&.g\&. +\fBbusctl introspect\fR)\&. This corresponds to the +\fBorg\&.freedesktop\&.systemd1\&.Explicit\fR +annotation in introspection data\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_SENSITIVE\fR +.RS 4 +Mark this vtable method entry as processing sensitive data\&. When set, incoming method call messages and their outgoing reply messages are marked as sensitive using +\fBsd_bus_message_sensitive\fR(3), so that they are erased from memory when freed\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_ABSOLUTE_OFFSET\fR +.RS 4 +Mark this vtable method or property entry so that the user data pointer passed to its associated handler functions is determined slightly differently: instead of adding the offset parameter of the entry to the user data pointer specified during vtable registration, the offset is passed directly, converted to a pointer, without taking the user data pointer specified during vtable registration into account\&. +.sp +Added in version 246\&. +.RE +.PP +\fBSD_BUS_VTABLE_CAPABILITY(\fR\fB\fIcapability\fR\fR\fB)\fR +.RS 4 +Access to this vtable entry will be allowed if the calling process has the capability +\fIcapability\fR, as described in +\fBsd_bus_query_sender_privilege\fR(3)\&. If used for +\fBSD_BUS_VTABLE_START()\fR, provides a default for all entries in the array\&. If not specified, either for an individual entry or the whole array, +\fBCAP_SYS_ADMIN\fR +is checked by default\&. See +\fBcapabilities\fR(7) +for information about capabilities\&. +.sp +Note that vtable entries may be marked as unprivileged and the whole bus may be marked as trusted, see the discussion of +\fBSD_BUS_VTABLE_UNPRIVILEGED\fR +below\&. +.sp +Added in version 251\&. +.RE +.PP +\fBSD_BUS_VTABLE_UNPRIVILEGED\fR +.RS 4 +Mark this vtable entry as unprivileged\&. Access to privileged entries is limited to users with appropriate capabilities as described above\&. In practice many vtable entries are marked as unprivileged, and either are open to everyone, or the decision whether to allow access is taken later, e\&.g\&. by delegating to +\m[blue]\fBpolkit\fR\m[]\&\s-2\u[2]\d\s+2\&. +.sp +The whole bus may be marked as trusted, in which case annotations at the entry level are ignored, see +\fBsd_bus_set_trusted\fR(3)\&. +.sp +When +\fInot\fR +specified, the +\fBorg\&.freedesktop\&.systemd1\&.Privileged\fR +annotation with value +"true" +will be shown in introspection data\&. +.sp +Note that this page describes checks implemented in the D\-Bus client\&. The D\-Bus server has an additional policy that may permit or deny connections, see "CONFIGURATION FILE" in +\fBdbus-daemon\fR(1)\&. +.sp +Added in version 246\&. +.RE +.SH "EXAMPLES" +.PP +\fBExample\ \&1.\ \&Create a simple listener on the bus\fR +.sp +.if n \{\ +.RS 4 +.\} +.nf +/* SPDX\-License\-Identifier: MIT\-0 */ + +#include <errno\&.h> +#include <stdbool\&.h> +#include <stddef\&.h> +#include <stdlib\&.h> +#include <stdio\&.h> +#include <systemd/sd\-bus\&.h> + +#define _cleanup_(f) __attribute__((cleanup(f))) + +#define check(x) ({ \e + int r = (x); \e + errno = r < 0 ? \-r : 0; \e + printf(#x ": %m\en"); \e + if (r < 0) \e + return EXIT_FAILURE; \e + }) + +typedef struct object { + char *name; + uint32_t number; +} object; + +static int method(sd_bus_message *m, void *userdata, sd_bus_error *error) { + printf("Got called with userdata=%p\en", userdata); + + if (sd_bus_message_is_method_call(m, + "org\&.freedesktop\&.systemd\&.VtableExample", + "Method4")) + return 1; + + const char *string; + check(sd_bus_message_read(m, "s", &string)); + check(sd_bus_reply_method_return(m, "s", string)); + + return 1; +} + +static const sd_bus_vtable vtable[] = { + SD_BUS_VTABLE_START(0), + SD_BUS_METHOD( + "Method1", "s", "s", method, 0), + SD_BUS_METHOD_WITH_NAMES_OFFSET( + "Method2", + "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), + "s", SD_BUS_PARAM(returnstring), + method, offsetof(object, number), + SD_BUS_VTABLE_DEPRECATED), + SD_BUS_METHOD_WITH_ARGS_OFFSET( + "Method3", + SD_BUS_ARGS("s", string, "o", path), + SD_BUS_RESULT("s", returnstring), + method, offsetof(object, number), + SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS( + "Method4", + SD_BUS_NO_ARGS, + SD_BUS_NO_RESULT, + method, + SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_SIGNAL( + "Signal1", + "so", + 0), + SD_BUS_SIGNAL_WITH_NAMES( + "Signal2", + "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), + 0), + SD_BUS_SIGNAL_WITH_ARGS( + "Signal3", + SD_BUS_ARGS("s", string, "o", path), + 0), + SD_BUS_WRITABLE_PROPERTY( + "AutomaticStringProperty", "s", NULL, NULL, + offsetof(object, name), + SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), + SD_BUS_WRITABLE_PROPERTY( + "AutomaticIntegerProperty", "u", NULL, NULL, + offsetof(object, number), + SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), + SD_BUS_VTABLE_END +}; + +int main(int argc, char **argv) { + _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; + + sd_bus_default(&bus); + + object object = { \&.number = 666 }; + check((object\&.name = strdup("name")) != NULL); + + check(sd_bus_add_object_vtable(bus, NULL, + "/org/freedesktop/systemd/VtableExample", + "org\&.freedesktop\&.systemd\&.VtableExample", + vtable, + &object)); + + check(sd_bus_request_name(bus, + "org\&.freedesktop\&.systemd\&.VtableExample", + 0)); + + for (;;) { + check(sd_bus_wait(bus, UINT64_MAX)); + check(sd_bus_process(bus, NULL)); + } + + check(sd_bus_release_name(bus, "org\&.freedesktop\&.systemd\&.VtableExample")); + free(object\&.name); + + return 0; +} +.fi +.if n \{\ +.RE +.\} +.PP +This creates a simple client on the bus (the user bus, when run as normal user)\&. We may use the D\-Bus +\fBorg\&.freedesktop\&.DBus\&.Introspectable\&.Introspect\fR +call to acquire the XML description of the interface: +.sp +.if n \{\ +.RS 4 +.\} +.nf +<!DOCTYPE node PUBLIC "\-//freedesktop//DTD D\-BUS Object Introspection 1\&.0//EN" +"https://www\&.freedesktop\&.org/standards/dbus/1\&.0/introspect\&.dtd"> +<!\-\- SPDX\-License\-Identifier: LGPL\-2\&.1\-or\-later \-\-> +<node> + <interface name="org\&.freedesktop\&.DBus\&.Peer"> + <method name="Ping"/> + <method name="GetMachineId"> + <arg type="s" name="machine_uuid" direction="out"/> + </method> + </interface> + <interface name="org\&.freedesktop\&.DBus\&.Introspectable"> + <method name="Introspect"> + <arg name="xml_data" type="s" direction="out"/> + </method> + </interface> + <interface name="org\&.freedesktop\&.DBus\&.Properties"> + <method name="Get"> + <arg name="interface_name" direction="in" type="s"/> + <arg name="property_name" direction="in" type="s"/> + <arg name="value" direction="out" type="v"/> + </method> + <method name="GetAll"> + <arg name="interface_name" direction="in" type="s"/> + <arg name="props" direction="out" type="a{sv}"/> + </method> + <method name="Set"> + <arg name="interface_name" direction="in" type="s"/> + <arg name="property_name" direction="in" type="s"/> + <arg name="value" direction="in" type="v"/> + </method> + <signal name="PropertiesChanged"> + <arg type="s" name="interface_name"/> + <arg type="a{sv}" name="changed_properties"/> + <arg type="as" name="invalidated_properties"/> + </signal> + </interface> + <interface name="org\&.freedesktop\&.systemd\&.VtableExample"> + <method name="Method1"> + <arg type="s" direction="in"/> + <arg type="s" direction="out"/> + </method> + <method name="Method2"> + <arg type="s" name="string" direction="in"/> + <arg type="o" name="path" direction="in"/> + <arg type="s" name="returnstring" direction="out"/> + <annotation name="org\&.freedesktop\&.DBus\&.Deprecated" value="true"/> + </method> + <property name="AutomaticStringProperty" type="s" access="readwrite"> + </property> + <property name="AutomaticIntegerProperty" type="u" access="readwrite"> + <annotation name="org\&.freedesktop\&.DBus\&.Property\&.EmitsChangedSignal" value="invalidates"/> + </property> + </interface> +</node> + +.fi +.if n \{\ +.RE +.\} +.SH "RETURN VALUE" +.PP +On success, +\fBsd_bus_add_object_vtable()\fR +and +\fBsd_bus_add_fallback_vtable()\fR +return a non\-negative integer\&. On failure, they return a negative errno\-style error code\&. +.SS "Errors" +.PP +Returned errors may indicate the following problems: +.PP +\fB\-EINVAL\fR +.RS 4 +One of the required parameters is +\fBNULL\fR +or invalid\&. A reserved D\-Bus interface was passed as the +\fIinterface\fR +parameter\&. +.sp +Added in version 246\&. +.RE +.PP +\fB\-ENOPKG\fR +.RS 4 +The bus cannot be resolved\&. +.sp +Added in version 246\&. +.RE +.PP +\fB\-ECHILD\fR +.RS 4 +The bus was created in a different process, library or module instance\&. +.sp +Added in version 246\&. +.RE +.PP +\fB\-ENOMEM\fR +.RS 4 +Memory allocation failed\&. +.sp +Added in version 246\&. +.RE +.PP +\fB\-EPROTOTYPE\fR +.RS 4 +\fBsd_bus_add_object_vtable()\fR +and +\fBsd_bus_add_fallback_vtable()\fR +have been both called for the same bus object path, which is not allowed\&. +.sp +Added in version 246\&. +.RE +.PP +\fB\-EEXIST\fR +.RS 4 +This vtable has already been registered for this +\fIinterface\fR +and +\fIpath\fR\&. +.sp +Added in version 246\&. +.RE +.SH "NOTES" +.PP +Functions described here are available as a shared library, which can be compiled against and linked to with the +\fBlibsystemd\fR\ \&\fBpkg-config\fR(1) +file\&. +.PP +The code described here uses +\fBgetenv\fR(3), which is declared to be not multi\-thread\-safe\&. This means that the code calling the functions described here must not call +\fBsetenv\fR(3) +from a parallel thread\&. It is recommended to only do calls to +\fBsetenv()\fR +from an early phase of the program when no other threads have been started\&. +.SH "HISTORY" +.PP +\fBsd_bus_property_get_t()\fR, +\fBsd_bus_property_set_t()\fR, +\fBsd_bus_object_find_t()\fR, +\fBsd_bus_add_object()\fR, +\fBsd_bus_add_fallback()\fR, +\fBsd_bus_add_object_vtable()\fR, +\fBsd_bus_add_fallback_vtable()\fR, and +\fBsd_bus_add_filter()\fR +were added in version 246\&. +.SH "SEE ALSO" +.PP +\fBsd-bus\fR(3), +\fBbusctl\fR(1), +\fBsd_bus_emit_properties_changed\fR(3), +\fBsd_bus_emit_object_added\fR(3) +.SH "NOTES" +.IP " 1." 4 +D-Bus annotations +.RS 4 +\%https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format +.RE +.IP " 2." 4 +polkit +.RS 4 +\%https://www.freedesktop.org/software/polkit/docs/latest/ +.RE |