1 /* SPDX-License-Identifier: MIT-0 */
9 #include <systemd/sd-bus.h>
11 #define _cleanup_(f) __attribute__((cleanup(f)))
13 typedef struct object
{
18 static int method(sd_bus_message
*m
, void *userdata
, sd_bus_error
*error
) {
21 printf("Got called with userdata=%p\n", userdata
);
23 if (sd_bus_message_is_method_call(m
,
24 "org.freedesktop.systemd.VtableExample",
29 r
= sd_bus_message_read(m
, "s", &string
);
31 fprintf(stderr
, "sd_bus_message_read() failed: %s\n", strerror(-r
));
35 r
= sd_bus_reply_method_return(m
, "s", string
);
37 fprintf(stderr
, "sd_bus_reply_method_return() failed: %s\n", strerror(-r
));
44 static const sd_bus_vtable vtable
[] = {
45 SD_BUS_VTABLE_START(0),
47 "Method1", "s", "s", method
, 0),
48 SD_BUS_METHOD_WITH_NAMES_OFFSET(
50 "so", SD_BUS_PARAM(string
) SD_BUS_PARAM(path
),
51 "s", SD_BUS_PARAM(returnstring
),
52 method
, offsetof(object
, number
),
53 SD_BUS_VTABLE_DEPRECATED
),
54 SD_BUS_METHOD_WITH_ARGS_OFFSET(
56 SD_BUS_ARGS("s", string
, "o", path
),
57 SD_BUS_RESULT("s", returnstring
),
58 method
, offsetof(object
, number
),
59 SD_BUS_VTABLE_UNPRIVILEGED
),
60 SD_BUS_METHOD_WITH_ARGS(
65 SD_BUS_VTABLE_UNPRIVILEGED
),
70 SD_BUS_SIGNAL_WITH_NAMES(
72 "so", SD_BUS_PARAM(string
) SD_BUS_PARAM(path
),
74 SD_BUS_SIGNAL_WITH_ARGS(
76 SD_BUS_ARGS("s", string
, "o", path
),
78 SD_BUS_WRITABLE_PROPERTY(
79 "AutomaticStringProperty", "s", NULL
, NULL
,
80 offsetof(object
, name
),
81 SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
82 SD_BUS_WRITABLE_PROPERTY(
83 "AutomaticIntegerProperty", "u", NULL
, NULL
,
84 offsetof(object
, number
),
85 SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
89 int main(int argc
, char **argv
) {
90 _cleanup_(sd_bus_flush_close_unrefp
) sd_bus
*bus
= NULL
;
95 object object
= { .number
= 666 };
96 object
.name
= strdup("name");
98 fprintf(stderr
, "OOM\n");
102 r
= sd_bus_add_object_vtable(bus
, NULL
,
103 "/org/freedesktop/systemd/VtableExample",
104 "org.freedesktop.systemd.VtableExample",
108 fprintf(stderr
, "sd_bus_add_object_vtable() failed: %s\n", strerror(-r
));
112 r
= sd_bus_request_name(bus
,
113 "org.freedesktop.systemd.VtableExample",
116 fprintf(stderr
, "sd_bus_request_name() failed: %s\n", strerror(-r
));
121 r
= sd_bus_wait(bus
, UINT64_MAX
);
123 fprintf(stderr
, "sd_bus_wait() failed: %s\n", strerror(-r
));
127 r
= sd_bus_process(bus
, NULL
);
129 fprintf(stderr
, "sd_bus_process() failed: %s\n", strerror(-r
));
134 r
= sd_bus_release_name(bus
, "org.freedesktop.systemd.VtableExample");
136 fprintf(stderr
, "sd_bus_release_name() failed: %s\n", strerror(-r
));