]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/test-bus-kernel.c
sd-bus: properly handle uninitialized audit creds from kdbus
[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 "util.h"
fd8d62d9 25#include "log.h"
dd418b9a
LP
26
27#include "sd-bus.h"
28#include "bus-message.h"
29#include "bus-error.h"
30#include "bus-kernel.h"
40ca29a1 31#include "bus-util.h"
2b5c5383 32#include "bus-dump.h"
dd418b9a
LP
33
34int main(int argc, char *argv[]) {
35 _cleanup_close_ int bus_ref = -1;
79ccff06 36 _cleanup_free_ char *name = NULL, *bus_name = NULL, *address = NULL;
e9a967f9 37 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
a43b9ca3 38 _cleanup_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
LP
72 assert_se(sd_bus_negotiate_timestamp(a, 1) >= 0);
73 assert_se(sd_bus_negotiate_creds(a, _SD_BUS_CREDS_ALL) >= 0);
264ad849 74
4fc31988
LP
75 assert_se(sd_bus_negotiate_timestamp(b, 1) >= 0);
76 assert_se(sd_bus_negotiate_creds(b, _SD_BUS_CREDS_ALL) >= 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
84 r = sd_bus_get_unique_name(a, &ua);
85 assert_se(r >= 0);
296f3c53 86 printf("unique a: %s\n", ua);
dd418b9a 87
455971c1 88 r = sd_bus_get_description(a, &nn);
dd418b9a 89 assert_se(r >= 0);
5972fe95 90 printf("name of a: %s\n", nn);
dd418b9a 91
5972fe95
LP
92 r = sd_bus_get_unique_name(b, &ub);
93 assert_se(r >= 0);
296f3c53
LP
94 printf("unique b: %s\n", ub);
95
455971c1 96 r = sd_bus_get_description(b, &nn);
5972fe95
LP
97 assert_se(r >= 0);
98 printf("name of b: %s\n", nn);
99
a43b9ca3
LP
100 r = sd_bus_call_method(a, "this.doesnt.exist", "/foo", "meh.mah", "muh", &error, NULL, "s", "yayayay");
101 assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_SERVICE_UNKNOWN));
102 assert_se(r == -EHOSTUNREACH);
103
19befb2d 104 r = sd_bus_add_match(b, NULL, "interface='waldo.com',member='Piep'", NULL, NULL);
86312ab8 105 assert_se(r >= 0);
b030d1f8 106
a56f19c4 107 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
108 assert_se(r >= 0);
109
ae095f86
LP
110 r = sd_bus_try_close(b);
111 assert_se(r == -EBUSY);
112
766c5809
LP
113 r = sd_bus_process_priority(b, -10, &m);
114 assert_se(r == -ENOMSG);
115
e9a967f9
LP
116 r = sd_bus_process(b, &m);
117 assert_se(r > 0);
118 assert_se(m);
119
d55192ad 120 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
f9be01f3
LP
121 assert_se(sd_bus_message_rewind(m, true) >= 0);
122
e9a967f9
LP
123 r = sd_bus_message_read(m, "s", &the_string);
124 assert_se(r >= 0);
125 assert_se(streq(the_string, "I am a string"));
126
3583882c
LP
127 sd_bus_message_unref(m);
128 m = NULL;
129
ed7d0b22 130 r = sd_bus_request_name(a, "net.x0pointer.foobar", 0);
f08838da
LP
131 assert_se(r >= 0);
132
151b9b96 133 r = sd_bus_message_new_method_call(b, &m, "net.x0pointer.foobar", "/a/path", "an.inter.face", "AMethod");
3583882c
LP
134 assert_se(r >= 0);
135
9097fe29
LP
136 assert_se(pipe2(pipe_fds, O_CLOEXEC) >= 0);
137
138 assert_se(write(pipe_fds[1], "x", 1) == 1);
139
03e334a1 140 pipe_fds[1] = safe_close(pipe_fds[1]);
9097fe29
LP
141
142 r = sd_bus_message_append(m, "h", pipe_fds[0]);
143 assert_se(r >= 0);
144
03e334a1 145 pipe_fds[0] = safe_close(pipe_fds[0]);
9097fe29 146
3583882c
LP
147 r = sd_bus_send(b, m, NULL);
148 assert_se(r >= 0);
149
150 for (;;) {
151 sd_bus_message_unref(m);
152 m = NULL;
153 r = sd_bus_process(a, &m);
154 assert_se(r > 0);
155 assert_se(m);
156
d55192ad 157 bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
3583882c 158 assert_se(sd_bus_message_rewind(m, true) >= 0);
2da833ac 159
9097fe29
LP
160 if (sd_bus_message_is_method_call(m, "an.inter.face", "AMethod")) {
161 int fd;
162 char x;
163
164 r = sd_bus_message_read(m, "h", &fd);
165 assert_se(r >= 0);
166
167 assert_se(read(fd, &x, 1) == 1);
168 assert_se(x == 'x');
2da833ac 169 break;
9097fe29 170 }
3583882c
LP
171 }
172
ed7d0b22 173 r = sd_bus_release_name(a, "net.x0pointer.foobar");
f08838da
LP
174 assert_se(r >= 0);
175
ed7d0b22 176 r = sd_bus_release_name(a, "net.x0pointer.foobar");
01f6c9d4 177 assert_se(r == -ESRCH);
f08838da 178
ae095f86
LP
179 r = sd_bus_try_close(a);
180 assert_se(r >= 0);
181
296f3c53
LP
182 sd_bus_unref(a);
183 sd_bus_unref(b);
dd418b9a
LP
184
185 return 0;
186}