]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/test-bus-track.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2016 Lennart Poettering
7 #include <sys/socket.h>
13 static bool track_cb_called_x
= false;
14 static bool track_cb_called_y
= false;
16 static int track_cb_x(sd_bus_track
*t
, void *userdata
) {
18 log_error("TRACK CB X");
20 assert_se(!track_cb_called_x
);
21 track_cb_called_x
= true;
23 /* This means b's name disappeared. Let's now disconnect, to make sure the track handling on disconnect works
26 assert_se(shutdown(sd_bus_get_fd(sd_bus_track_get_bus(t
)), SHUT_RDWR
) >= 0);
30 static int track_cb_y(sd_bus_track
*t
, void *userdata
) {
33 log_error("TRACK CB Y");
35 assert_se(!track_cb_called_y
);
36 track_cb_called_y
= true;
38 /* We got disconnected, let's close everything */
40 r
= sd_event_exit(sd_bus_get_event(sd_bus_track_get_bus(t
)), EXIT_SUCCESS
);
46 int main(int argc
, char *argv
[]) {
47 _cleanup_(sd_event_unrefp
) sd_event
*event
= NULL
;
48 _cleanup_(sd_bus_track_unrefp
) sd_bus_track
*x
= NULL
, *y
= NULL
;
49 _cleanup_(sd_bus_unrefp
) sd_bus
*a
= NULL
, *b
= NULL
;
53 r
= sd_event_default(&event
);
56 r
= sd_bus_open_user(&a
);
57 if (IN_SET(r
, -ECONNREFUSED
, -ENOENT
)) {
58 log_info("Failed to connect to bus, skipping tests.");
59 return EXIT_TEST_SKIP
;
63 r
= sd_bus_attach_event(a
, event
, SD_EVENT_PRIORITY_NORMAL
);
66 r
= sd_bus_open_user(&b
);
69 r
= sd_bus_attach_event(b
, event
, SD_EVENT_PRIORITY_NORMAL
);
72 /* Watch b's name from a */
73 r
= sd_bus_track_new(a
, &x
, track_cb_x
, NULL
);
76 r
= sd_bus_get_unique_name(b
, &unique
);
79 r
= sd_bus_track_add_name(x
, unique
);
82 /* Watch's a's own name from a */
83 r
= sd_bus_track_new(a
, &y
, track_cb_y
, NULL
);
86 r
= sd_bus_get_unique_name(a
, &unique
);
89 r
= sd_bus_track_add_name(y
, unique
);
92 /* Now make b's name disappear */
95 r
= sd_event_loop(event
);
98 assert_se(track_cb_called_x
);
99 assert_se(track_cb_called_y
);