]>
Commit | Line | Data |
---|---|---|
1fe6d37e | 1 | /* SPDX-License-Identifier: MIT-0 */ |
f4d74c61 | 2 | |
afb9c0c9 ZJS |
3 | #include <errno.h> |
4 | #include <stdbool.h> | |
5 | #include <stddef.h> | |
6 | #include <stdlib.h> | |
7 | #include <stdio.h> | |
8 | #include <systemd/sd-bus.h> | |
9 | ||
10 | #define _cleanup_(f) __attribute__((cleanup(f))) | |
11 | ||
0cfb00d9 LB |
12 | #define check(x) ({ \ |
13 | int r = (x); \ | |
14 | errno = r < 0 ? -r : 0; \ | |
15 | printf(#x ": %m\n"); \ | |
16 | if (r < 0) \ | |
17 | return EXIT_FAILURE; \ | |
18 | }) | |
19 | ||
afb9c0c9 ZJS |
20 | typedef struct object { |
21 | char *name; | |
22 | uint32_t number; | |
23 | } object; | |
24 | ||
25 | static int method(sd_bus_message *m, void *userdata, sd_bus_error *error) { | |
26 | printf("Got called with userdata=%p\n", userdata); | |
0cfb00d9 LB |
27 | |
28 | if (sd_bus_message_is_method_call(m, | |
29 | "org.freedesktop.systemd.VtableExample", | |
30 | "Method4")) | |
31 | return 1; | |
32 | ||
33 | const char *string; | |
34 | check(sd_bus_message_read(m, "s", &string)); | |
35 | check(sd_bus_reply_method_return(m, "s", string)); | |
36 | ||
afb9c0c9 ZJS |
37 | return 1; |
38 | } | |
39 | ||
40 | static const sd_bus_vtable vtable[] = { | |
41 | SD_BUS_VTABLE_START(0), | |
42 | SD_BUS_METHOD( | |
43 | "Method1", "s", "s", method, 0), | |
44 | SD_BUS_METHOD_WITH_NAMES_OFFSET( | |
45 | "Method2", | |
46 | "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), | |
47 | "s", SD_BUS_PARAM(returnstring), | |
48 | method, offsetof(object, number), | |
49 | SD_BUS_VTABLE_DEPRECATED), | |
eff7c2d3 DDM |
50 | SD_BUS_METHOD_WITH_ARGS_OFFSET( |
51 | "Method3", | |
52 | SD_BUS_ARGS("s", string, "o", path), | |
53 | SD_BUS_RESULT("s", returnstring), | |
54 | method, offsetof(object, number), | |
55 | SD_BUS_VTABLE_UNPRIVILEGED), | |
56 | SD_BUS_METHOD_WITH_ARGS( | |
57 | "Method4", | |
58 | SD_BUS_NO_ARGS, | |
59 | SD_BUS_NO_RESULT, | |
60 | method, | |
61 | SD_BUS_VTABLE_UNPRIVILEGED), | |
62 | SD_BUS_SIGNAL( | |
63 | "Signal1", | |
64 | "so", | |
65 | 0), | |
66 | SD_BUS_SIGNAL_WITH_NAMES( | |
67 | "Signal2", | |
68 | "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), | |
69 | 0), | |
70 | SD_BUS_SIGNAL_WITH_ARGS( | |
71 | "Signal3", | |
72 | SD_BUS_ARGS("s", string, "o", path), | |
73 | 0), | |
afb9c0c9 ZJS |
74 | SD_BUS_WRITABLE_PROPERTY( |
75 | "AutomaticStringProperty", "s", NULL, NULL, | |
76 | offsetof(object, name), | |
77 | SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
78 | SD_BUS_WRITABLE_PROPERTY( | |
79 | "AutomaticIntegerProperty", "u", NULL, NULL, | |
80 | offsetof(object, number), | |
81 | SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), | |
82 | SD_BUS_VTABLE_END | |
83 | }; | |
84 | ||
afb9c0c9 ZJS |
85 | int main(int argc, char **argv) { |
86 | _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; | |
87 | ||
88 | sd_bus_default(&bus); | |
89 | ||
90 | object object = { .number = 666 }; | |
91 | check((object.name = strdup("name")) != NULL); | |
92 | ||
0cfb00d9 LB |
93 | check(sd_bus_add_object_vtable(bus, NULL, |
94 | "/org/freedesktop/systemd/VtableExample", | |
afb9c0c9 ZJS |
95 | "org.freedesktop.systemd.VtableExample", |
96 | vtable, | |
97 | &object)); | |
98 | ||
0cfb00d9 LB |
99 | check(sd_bus_request_name(bus, |
100 | "org.freedesktop.systemd.VtableExample", | |
101 | 0)); | |
102 | ||
ed0cb346 | 103 | for (;;) { |
afb9c0c9 ZJS |
104 | check(sd_bus_wait(bus, UINT64_MAX)); |
105 | check(sd_bus_process(bus, NULL)); | |
106 | } | |
107 | ||
0cfb00d9 | 108 | check(sd_bus_release_name(bus, "org.freedesktop.systemd.VtableExample")); |
afb9c0c9 ZJS |
109 | free(object.name); |
110 | ||
111 | return 0; | |
112 | } |