test-bus-chat.c revision c49b30a23583ff39daaa26696bcab478d2fee0bb
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering This file is part of systemd.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering Copyright 2013 Lennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering systemd is free software; you can redistribute it and/or modify it
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering under the terms of the GNU Lesser General Public License as published by
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering (at your option) any later version.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering systemd is distributed in the hope that it will be useful, but
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering Lesser General Public License for more details.
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering You should have received a copy of the GNU Lesser General Public License
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
de190aef08bb267b645205a747762df573b36834Lennart Poetteringstatic int match_callback(sd_bus *bus, sd_bus_message *m, void *userdata) {
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poettering log_info("Match triggered! interface=%s member=%s", strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member(m)));
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poetteringstatic int object_callback(sd_bus *bus, sd_bus_message *m, void *userdata) {
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering if (sd_bus_message_is_method_error(m, NULL))
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering if (sd_bus_message_is_method_call(m, "org.object.test", "Foobar")) {
c2373f848dddcc1827cf715c5ef778dc8d475761Lennart Poettering log_info("Invoked Foobar() on %s", sd_bus_message_get_path(m));
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering r = sd_bus_reply_method_return(bus, m, NULL);
c2373f848dddcc1827cf715c5ef778dc8d475761Lennart Poettering log_error("Failed to send reply: %s", strerror(-r));
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt log_error("Failed to connect to user bus: %s", strerror(-r));
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier log_error("Failed to get server ID: %s", strerror(-r));
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier log_error("Failed to get unique name: %s", strerror(-r));
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier log_info("Peer ID is " SD_ID128_FORMAT_STR ".", SD_ID128_FORMAT_VAL(id));
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering log_info("Can send file handles: %i", sd_bus_can_send(bus, 'h'));
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering r = sd_bus_request_name(bus, "org.freedesktop.systemd.test", 0);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier log_error("Failed to acquire name: %s", strerror(-r));
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering r = sd_bus_add_fallback(bus, "/foo/bar", object_callback, NULL);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier log_error("Failed to add object: %s", strerror(-r));
7560fffcd2531786b9c1ca657667a43e90331326Lennart Poettering r = sd_bus_add_match(bus, "type='signal',interface='foo.bar',member='Notify'", match_callback, NULL);
0ac38b707212e9aa40e25d65ffbae648cc9116f5Lennart Poettering log_error("Failed to add match: %s", strerror(-r));
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek r = sd_bus_add_match(bus, "type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged'", match_callback, NULL);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_error("Failed to add match: %s", strerror(-r));
c6878637502b1717a110a9a7e8bba32a8583fcdfLennart Poettering bus_match_dump(&bus->match_callbacks, 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek bool client1_gone = false, client2_gone = false;
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek while (!client1_gone || !client2_gone) {
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_error("Failed to process requests: %s", strerror(-r));
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek r = sd_bus_wait(bus, (uint64_t) -1);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_error("Failed to wait: %s", strerror(-r));
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek sd_bus_message_get_pid(m, &pid);
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering sd_bus_message_get_selinux_context(m, &label);
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering log_info("Got message! member=%s pid=%lu label=%s",
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering (unsigned long) pid,
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek /* bus_message_dump(m); */
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek /* sd_bus_message_rewind(m, true); */
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek if (sd_bus_message_is_method_call(m, "org.freedesktop.systemd.test", "LowerCase")) {
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther _cleanup_free_ char *lowercase = NULL;
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther r = sd_bus_message_read(m, "s", &hello);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_error("Failed to get parameter: %s", strerror(-r));
if (!lowercase) {
r = log_oom();
goto fail;
goto fail;
goto fail;
client1_gone = true;
goto fail;
client2_gone = true;
goto fail;
int fd;
goto fail;
goto fail;
goto fail;
bus, m,
goto fail;
fail:
if (bus) {
static void* client1(void*p) {
const char *hello;
goto finish;
r = sd_bus_call_method(
bus,
&error,
&reply,
goto finish;
goto finish;
r = -errno;
goto finish;
r = sd_bus_call_method(
bus,
&error,
NULL,
goto finish;
errno = 0;
goto finish;
if (bus) {
bus,
return INT_TO_PTR(r);
bool *x = userdata;
static void* client2(void*p) {
bool quit = false;
const char *mid;
goto finish;
bus,
"org.object.test",
goto finish;
goto finish;
m = NULL;
bus,
goto finish;
goto finish;
m = NULL;
bus,
goto finish;
goto finish;
goto finish;
m = NULL;
bus,
goto finish;
m = NULL;
bus,
goto finish;
goto finish;
while (!quit) {
goto finish;
goto finish;
if (bus) {
bus,
goto finish;
return INT_TO_PTR(r);
return EXIT_TEST_SKIP;
return EXIT_FAILURE;
return EXIT_FAILURE;
return EXIT_FAILURE;
if (PTR_TO_INT(p) < 0)
return EXIT_FAILURE;
return EXIT_FAILURE;
if (PTR_TO_INT(p) < 0)
return EXIT_FAILURE;
return EXIT_FAILURE;
return EXIT_SUCCESS;