]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/test-bus-track.c
d224377481a175af007602945b16b4b1a03acbb5
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2016 Lennart Poettering
9 #include <sys/socket.h>
15 static bool track_cb_called_x
= false;
16 static bool track_cb_called_y
= false;
18 static int track_cb_x(sd_bus_track
*t
, void *userdata
) {
20 log_error("TRACK CB X");
22 assert_se(!track_cb_called_x
);
23 track_cb_called_x
= true;
25 /* This means b's name disappeared. Let's now disconnect, to make sure the track handling on disconnect works
28 assert_se(shutdown(sd_bus_get_fd(sd_bus_track_get_bus(t
)), SHUT_RDWR
) >= 0);
32 static int track_cb_y(sd_bus_track
*t
, void *userdata
) {
35 log_error("TRACK CB Y");
37 assert_se(!track_cb_called_y
);
38 track_cb_called_y
= true;
40 /* We got disconnected, let's close everything */
42 r
= sd_event_exit(sd_bus_get_event(sd_bus_track_get_bus(t
)), EXIT_SUCCESS
);
48 int main(int argc
, char *argv
[]) {
49 _cleanup_(sd_event_unrefp
) sd_event
*event
= NULL
;
50 _cleanup_(sd_bus_track_unrefp
) sd_bus_track
*x
= NULL
, *y
= NULL
;
51 _cleanup_(sd_bus_unrefp
) sd_bus
*a
= NULL
, *b
= NULL
;
55 r
= sd_event_default(&event
);
58 r
= sd_bus_open_user(&a
);
59 if (IN_SET(r
, -ECONNREFUSED
, -ENOENT
)) {
60 log_info("Failed to connect to bus, skipping tests.");
61 return EXIT_TEST_SKIP
;
65 r
= sd_bus_attach_event(a
, event
, SD_EVENT_PRIORITY_NORMAL
);
68 r
= sd_bus_open_user(&b
);
71 r
= sd_bus_attach_event(b
, event
, SD_EVENT_PRIORITY_NORMAL
);
74 /* Watch b's name from a */
75 r
= sd_bus_track_new(a
, &x
, track_cb_x
, NULL
);
78 r
= sd_bus_get_unique_name(b
, &unique
);
81 r
= sd_bus_track_add_name(x
, unique
);
84 /* Watch's a's own name from a */
85 r
= sd_bus_track_new(a
, &y
, track_cb_y
, NULL
);
88 r
= sd_bus_get_unique_name(a
, &unique
);
91 r
= sd_bus_track_add_name(y
, unique
);
94 /* Now make b's name disappear */
97 r
= sd_event_loop(event
);
100 assert_se(track_cb_called_x
);
101 assert_se(track_cb_called_y
);