2 This file is part of systemd.
4 Copyright 2013 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include "alloc-util.h"
26 #include "bus-kernel.h"
32 int main(int argc
, char *argv
[]) {
33 _cleanup_close_
int bus_ref
= -1;
34 _cleanup_free_
char *name
= NULL
, *bus_name
= NULL
, *address
= NULL
, *bname
= NULL
;
35 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
36 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
37 const char *ua
= NULL
, *ub
= NULL
, *the_string
= NULL
;
42 log_set_max_level(LOG_DEBUG
);
44 assert_se(asprintf(&name
, "deine-mutter-%u", (unsigned) getpid()) >= 0);
46 bus_ref
= bus_kernel_create_bus(name
, false, &bus_name
);
47 if (bus_ref
== -ENOENT
)
48 return EXIT_TEST_SKIP
;
50 assert_se(bus_ref
>= 0);
52 address
= strappend("kernel:path=", bus_name
);
61 r
= sd_bus_set_description(a
, "a");
64 r
= sd_bus_set_address(a
, address
);
67 r
= sd_bus_set_address(b
, address
);
70 assert_se(sd_bus_negotiate_timestamp(a
, 1) >= 0);
71 assert_se(sd_bus_negotiate_creds(a
, true, _SD_BUS_CREDS_ALL
) >= 0);
73 assert_se(sd_bus_negotiate_timestamp(b
, 0) >= 0);
74 assert_se(sd_bus_negotiate_creds(b
, true, 0) >= 0);
82 assert_se(sd_bus_negotiate_timestamp(b
, 1) >= 0);
83 assert_se(sd_bus_negotiate_creds(b
, true, _SD_BUS_CREDS_ALL
) >= 0);
85 r
= sd_bus_get_unique_name(a
, &ua
);
87 printf("unique a: %s\n", ua
);
89 r
= sd_bus_get_description(a
, &nn
);
91 printf("name of a: %s\n", nn
);
93 r
= sd_bus_get_unique_name(b
, &ub
);
95 printf("unique b: %s\n", ub
);
97 r
= sd_bus_get_description(b
, &nn
);
99 printf("name of b: %s\n", nn
);
101 assert_se(bus_kernel_get_bus_name(b
, &bname
) >= 0);
102 assert_se(endswith(bname
, name
));
104 r
= sd_bus_call_method(a
, "this.doesnt.exist", "/foo", "meh.mah", "muh", &error
, NULL
, "s", "yayayay");
105 assert_se(sd_bus_error_has_name(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
));
106 assert_se(r
== -EHOSTUNREACH
);
108 r
= sd_bus_add_match(b
, NULL
, "interface='waldo.com',member='Piep'", NULL
, NULL
);
111 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");
114 r
= sd_bus_try_close(b
);
115 assert_se(r
== -EBUSY
);
117 r
= sd_bus_process_priority(b
, -10, &m
);
120 r
= sd_bus_process(b
, &m
);
124 bus_message_dump(m
, stdout
, BUS_MESSAGE_DUMP_WITH_HEADER
);
125 assert_se(sd_bus_message_rewind(m
, true) >= 0);
127 r
= sd_bus_message_read(m
, "s", &the_string
);
129 assert_se(streq(the_string
, "I am a string"));
131 sd_bus_message_unref(m
);
134 r
= sd_bus_request_name(a
, "net.x0pointer.foobar", 0);
137 r
= sd_bus_message_new_method_call(b
, &m
, "net.x0pointer.foobar", "/a/path", "an.inter.face", "AMethod");
140 assert_se(pipe2(pipe_fds
, O_CLOEXEC
) >= 0);
142 assert_se(write(pipe_fds
[1], "x", 1) == 1);
144 pipe_fds
[1] = safe_close(pipe_fds
[1]);
146 r
= sd_bus_message_append(m
, "h", pipe_fds
[0]);
149 pipe_fds
[0] = safe_close(pipe_fds
[0]);
151 r
= sd_bus_send(b
, m
, NULL
);
155 sd_bus_message_unref(m
);
157 r
= sd_bus_process(a
, &m
);
161 bus_message_dump(m
, stdout
, BUS_MESSAGE_DUMP_WITH_HEADER
);
162 assert_se(sd_bus_message_rewind(m
, true) >= 0);
164 if (sd_bus_message_is_method_call(m
, "an.inter.face", "AMethod")) {
168 r
= sd_bus_message_read(m
, "h", &fd
);
171 assert_se(read(fd
, &x
, 1) == 1);
177 r
= sd_bus_release_name(a
, "net.x0pointer.foobar");
180 r
= sd_bus_release_name(a
, "net.x0pointer.foobar");
181 assert_se(r
== -ESRCH
);
183 r
= sd_bus_try_close(a
);