]> git.ipfire.org Git - thirdparty/systemd.git/blame - man/vtable-example.c
Merge pull request #32963 from yuwata/test-64-btrfs
[thirdparty/systemd.git] / man / vtable-example.c
CommitLineData
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
13typedef struct object {
14 char *name;
15 uint32_t number;
16} object;
17
18static 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
44static 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
89int 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}