]>
Commit | Line | Data |
---|---|---|
1fe6d37e | 1 | /* SPDX-License-Identifier: MIT-0 */ |
f4d74c61 | 2 | |
040cb664 | 3 | #define _GNU_SOURCE 1 |
afb9c0c9 ZJS |
4 | #include <errno.h> |
5 | #include <stdbool.h> | |
6 | #include <stddef.h> | |
7 | #include <stdlib.h> | |
8 | #include <stdio.h> | |
9 | #include <systemd/sd-bus.h> | |
10 | ||
11 | #define _cleanup_(f) __attribute__((cleanup(f))) | |
12 | ||
13 | typedef struct object { | |
14 | char *name; | |
15 | uint32_t number; | |
16 | } object; | |
17 | ||
18 | static int method(sd_bus_message *m, void *userdata, sd_bus_error *error) { | |
e84f70e1 YW |
19 | int r; |
20 | ||
afb9c0c9 | 21 | printf("Got called with userdata=%p\n", userdata); |
0cfb00d9 LB |
22 | |
23 | if (sd_bus_message_is_method_call(m, | |
24 | "org.freedesktop.systemd.VtableExample", | |
25 | "Method4")) | |
26 | return 1; | |
27 | ||
28 | const char *string; | |
e84f70e1 YW |
29 | r = sd_bus_message_read(m, "s", &string); |
30 | if (r < 0) { | |
31 | fprintf(stderr, "sd_bus_message_read() failed: %s\n", strerror(-r)); | |
32 | return 0; | |
33 | } | |
34 | ||
35 | r = sd_bus_reply_method_return(m, "s", string); | |
36 | if (r < 0) { | |
37 | fprintf(stderr, "sd_bus_reply_method_return() failed: %s\n", strerror(-r)); | |
38 | return 0; | |
39 | } | |
0cfb00d9 | 40 | |
afb9c0c9 ZJS |
41 | return 1; |
42 | } | |
43 | ||
44 | static const sd_bus_vtable vtable[] = { | |
45 | SD_BUS_VTABLE_START(0), | |
46 | SD_BUS_METHOD( | |
47 | "Method1", "s", "s", method, 0), | |
48 | SD_BUS_METHOD_WITH_NAMES_OFFSET( | |
49 | "Method2", | |
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), | |
eff7c2d3 DDM |
54 | SD_BUS_METHOD_WITH_ARGS_OFFSET( |
55 | "Method3", | |
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( | |
61 | "Method4", | |
62 | SD_BUS_NO_ARGS, | |
63 | SD_BUS_NO_RESULT, | |
64 | method, | |
65 | SD_BUS_VTABLE_UNPRIVILEGED), | |
66 | SD_BUS_SIGNAL( | |
67 | "Signal1", | |
68 | "so", | |
69 | 0), | |
70 | SD_BUS_SIGNAL_WITH_NAMES( | |
71 | "Signal2", | |
72 | "so", SD_BUS_PARAM(string) SD_BUS_PARAM(path), | |
73 | 0), | |
74 | SD_BUS_SIGNAL_WITH_ARGS( | |
75 | "Signal3", | |
76 | SD_BUS_ARGS("s", string, "o", path), | |
77 | 0), | |
afb9c0c9 ZJS |
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), | |
86 | SD_BUS_VTABLE_END | |
87 | }; | |
88 | ||
afb9c0c9 ZJS |
89 | int main(int argc, char **argv) { |
90 | _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; | |
e84f70e1 | 91 | int r; |
afb9c0c9 ZJS |
92 | |
93 | sd_bus_default(&bus); | |
94 | ||
95 | object object = { .number = 666 }; | |
e84f70e1 YW |
96 | object.name = strdup("name"); |
97 | if (!object.name) { | |
98 | fprintf(stderr, "OOM\n"); | |
99 | return EXIT_FAILURE; | |
100 | } | |
afb9c0c9 | 101 | |
e84f70e1 YW |
102 | r = sd_bus_add_object_vtable(bus, NULL, |
103 | "/org/freedesktop/systemd/VtableExample", | |
104 | "org.freedesktop.systemd.VtableExample", | |
105 | vtable, | |
106 | &object); | |
107 | if (r < 0) { | |
108 | fprintf(stderr, "sd_bus_add_object_vtable() failed: %s\n", strerror(-r)); | |
109 | return EXIT_FAILURE; | |
110 | } | |
afb9c0c9 | 111 | |
e84f70e1 YW |
112 | r = sd_bus_request_name(bus, |
113 | "org.freedesktop.systemd.VtableExample", | |
114 | 0); | |
115 | if (r < 0) { | |
116 | fprintf(stderr, "sd_bus_request_name() failed: %s\n", strerror(-r)); | |
117 | return EXIT_FAILURE; | |
118 | } | |
0cfb00d9 | 119 | |
ed0cb346 | 120 | for (;;) { |
e84f70e1 YW |
121 | r = sd_bus_wait(bus, UINT64_MAX); |
122 | if (r < 0) { | |
123 | fprintf(stderr, "sd_bus_wait() failed: %s\n", strerror(-r)); | |
124 | return EXIT_FAILURE; | |
125 | } | |
126 | ||
127 | r = sd_bus_process(bus, NULL); | |
128 | if (r < 0) { | |
129 | fprintf(stderr, "sd_bus_process() failed: %s\n", strerror(-r)); | |
130 | return EXIT_FAILURE; | |
131 | } | |
132 | } | |
133 | ||
134 | r = sd_bus_release_name(bus, "org.freedesktop.systemd.VtableExample"); | |
135 | if (r < 0) { | |
136 | fprintf(stderr, "sd_bus_release_name() failed: %s\n", strerror(-r)); | |
137 | return EXIT_FAILURE; | |
afb9c0c9 ZJS |
138 | } |
139 | ||
140 | free(object.name); | |
141 | ||
142 | return 0; | |
143 | } |