]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/test-bus-kernel.c
tree-wide: expose "p"-suffix unref calls in public APIs to make gcc cleanup easy
[thirdparty/systemd.git] / src / libsystemd / sd-bus / test-bus-kernel.c
CommitLineData
dd418b9a
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2013 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
9097fe29
LP
22#include <fcntl.h>
23
dd418b9a 24#include "sd-bus.h"
07630cea 25
b5efdb8a 26#include "alloc-util.h"
07630cea 27#include "bus-dump.h"
d4d00020 28#include "bus-kernel.h"
057171ef 29#include "bus-util.h"
3ffd4af2 30#include "fd-util.h"
07630cea
LP
31#include "log.h"
32#include "util.h"
dd418b9a
LP
33
34int main(int argc, char *argv[]) {
35 _cleanup_close_ int bus_ref = -1;
3acc1daf 36 _cleanup_free_ char *name = NULL, *bus_name = NULL, *address = NULL, *bname = NULL;
4afd3348
LP
37 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
38 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
e9a967f9 39 const char *ua = NULL, *ub = NULL, *the_string = NULL;
dd418b9a 40 sd_bus *a, *b;
9097fe29 41 int r, pipe_fds[2];
5972fe95 42 const char *nn;
dd418b9a 43
fd8d62d9
LP
44 log_set_max_level(LOG_DEBUG);
45
79ccff06
ZJS
46 assert_se(asprintf(&name, "deine-mutter-%u", (unsigned) getpid()) >= 0);
47
48 bus_ref = bus_kernel_create_bus(name, false, &bus_name);
4e3431bc
LP
49 if (bus_ref == -ENOENT)
50 return EXIT_TEST_SKIP;
51
dd418b9a
LP
52 assert_se(bus_ref >= 0);
53
296f3c53 54 address = strappend("kernel:path=", bus_name);
dd418b9a
LP
55 assert_se(address);
56
57 r = sd_bus_new(&a);
58 assert_se(r >= 0);
59
60 r = sd_bus_new(&b);
61 assert_se(r >= 0);
62
455971c1 63 r = sd_bus_set_description(a, "a");
5972fe95
LP
64 assert_se(r >= 0);
65
dd418b9a
LP
66 r = sd_bus_set_address(a, address);
67 assert_se(r >= 0);
68
69 r = sd_bus_set_address(b, address);
70 assert_se(r >= 0);
71
4fc31988 72 assert_se(sd_bus_negotiate_timestamp(a, 1) >= 0);
b5dae4c7 73 assert_se(sd_bus_negotiate_creds(a, true, _SD_BUS_CREDS_ALL) >= 0);
264ad849 74
b5dae4c7
LP
75 assert_se(sd_bus_negotiate_timestamp(b, 0) >= 0);
76 assert_se(sd_bus_negotiate_creds(b, true, 0) >= 0);
264ad849 77
dd418b9a
LP
78 r = sd_bus_start(a);
79 assert_se(r >= 0);
80
81 r = sd_bus_start(b);
82 assert_se(r >= 0);
83
b5dae4c7
LP
84 assert_se(sd_bus_negotiate_timestamp(b, 1) >= 0);
85 assert_se(sd_bus_negotiate_creds(b, true, _SD_BUS_CREDS_ALL) >= 0);
86
dd418b9a
LP
87 r = sd_bus_get_unique_name(a, &ua);
88 assert_se(r >= 0);
296f3c53 89 printf("unique a: %s\n", ua);
dd418b9a 90
455971c1 91 r = sd_bus_get_description(a, &nn);
dd418b9a 92 assert_se(r >= 0);
5972fe95 93 printf("name of a: %s\n", nn);
dd418b9a 94
5972fe95
LP
95 r = sd_bus_get_unique_name(b, &ub);
96 assert_se(r >= 0);
296f3c53
LP
97 printf("unique b: %s\n", ub);
98
455971c1 99 r = sd_bus_get_description(b, &nn);
5972fe95
LP
100 assert_se(r >= 0);
101 printf("name of b: %s\n", nn);
102
3acc1daf
LP
103 assert_se(bus_kernel_get_bus_name(b, &bname) >= 0);
104 assert_se(endswith(bname, name));
105
a43b9ca3
LP
106 r = sd_bus_call_method(a, "this.doesnt.exist", "/foo", "meh.mah", "muh", &error, NULL, "s", "yayayay");
107 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_SERVICE_UNKNOWN));
108 assert_se(r == -EHOSTUNREACH);
109
19befb2d 110 r = sd_bus_add_match(b, NULL, "interface='waldo.com',member='Piep'", NULL, NULL);
86312ab8 111 assert_se(r >= 0);
b030d1f8 112
a56f19c4 113 r = sd_bus_emit_signal(a, "/foo/bar/waldo", "waldo.com", "Piep", "sss", "I am a string", "/this/is/a/path", "and.this.a.domain.name");
e9a967f9
LP
114 assert_se(r >= 0);
115
ae095f86
LP
116 r = sd_bus_try_close(b);
117 assert_se(r == -EBUSY);
118
766c5809 119 r = sd_bus_process_priority(b, -10, &m);
83e30358 120 assert_se(r == 0);
766c5809 121
e9a967f9
LP
122 r = sd_bus_process(b, &m);
123 assert_se(r > 0);
124 assert_se(m);
125
d55192ad 126 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
f9be01f3
LP
127 assert_se(sd_bus_message_rewind(m, true) >= 0);
128
e9a967f9
LP
129 r = sd_bus_message_read(m, "s", &the_string);
130 assert_se(r >= 0);
131 assert_se(streq(the_string, "I am a string"));
132
3583882c
LP
133 sd_bus_message_unref(m);
134 m = NULL;
135
ed7d0b22 136 r = sd_bus_request_name(a, "net.x0pointer.foobar", 0);
f08838da
LP
137 assert_se(r >= 0);
138
151b9b96 139 r = sd_bus_message_new_method_call(b, &m, "net.x0pointer.foobar", "/a/path", "an.inter.face", "AMethod");
3583882c
LP
140 assert_se(r >= 0);
141
9097fe29
LP
142 assert_se(pipe2(pipe_fds, O_CLOEXEC) >= 0);
143
144 assert_se(write(pipe_fds[1], "x", 1) == 1);
145
03e334a1 146 pipe_fds[1] = safe_close(pipe_fds[1]);
9097fe29
LP
147
148 r = sd_bus_message_append(m, "h", pipe_fds[0]);
149 assert_se(r >= 0);
150
03e334a1 151 pipe_fds[0] = safe_close(pipe_fds[0]);
9097fe29 152
3583882c
LP
153 r = sd_bus_send(b, m, NULL);
154 assert_se(r >= 0);
155
156 for (;;) {
157 sd_bus_message_unref(m);
158 m = NULL;
159 r = sd_bus_process(a, &m);
160 assert_se(r > 0);
161 assert_se(m);
162
d55192ad 163 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
3583882c 164 assert_se(sd_bus_message_rewind(m, true) >= 0);
2da833ac 165
9097fe29
LP
166 if (sd_bus_message_is_method_call(m, "an.inter.face", "AMethod")) {
167 int fd;
168 char x;
169
170 r = sd_bus_message_read(m, "h", &fd);
171 assert_se(r >= 0);
172
173 assert_se(read(fd, &x, 1) == 1);
174 assert_se(x == 'x');
2da833ac 175 break;
9097fe29 176 }
3583882c
LP
177 }
178
ed7d0b22 179 r = sd_bus_release_name(a, "net.x0pointer.foobar");
f08838da
LP
180 assert_se(r >= 0);
181
ed7d0b22 182 r = sd_bus_release_name(a, "net.x0pointer.foobar");
01f6c9d4 183 assert_se(r == -ESRCH);
f08838da 184
ae095f86
LP
185 r = sd_bus_try_close(a);
186 assert_se(r >= 0);
187
296f3c53
LP
188 sd_bus_unref(a);
189 sd_bus_unref(b);
dd418b9a
LP
190
191 return 0;
192}