]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/test-bus-track.c
d224377481a175af007602945b16b4b1a03acbb5
[thirdparty/systemd.git] / src / libsystemd / sd-bus / test-bus-track.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 This file is part of systemd.
4
5 Copyright 2016 Lennart Poettering
6 ***/
7
8 #include <errno.h>
9 #include <sys/socket.h>
10
11 #include "sd-bus.h"
12
13 #include "macro.h"
14
15 static bool track_cb_called_x = false;
16 static bool track_cb_called_y = false;
17
18 static int track_cb_x(sd_bus_track *t, void *userdata) {
19
20 log_error("TRACK CB X");
21
22 assert_se(!track_cb_called_x);
23 track_cb_called_x = true;
24
25 /* This means b's name disappeared. Let's now disconnect, to make sure the track handling on disconnect works
26 * as it should. */
27
28 assert_se(shutdown(sd_bus_get_fd(sd_bus_track_get_bus(t)), SHUT_RDWR) >= 0);
29 return 1;
30 }
31
32 static int track_cb_y(sd_bus_track *t, void *userdata) {
33 int r;
34
35 log_error("TRACK CB Y");
36
37 assert_se(!track_cb_called_y);
38 track_cb_called_y = true;
39
40 /* We got disconnected, let's close everything */
41
42 r = sd_event_exit(sd_bus_get_event(sd_bus_track_get_bus(t)), EXIT_SUCCESS);
43 assert_se(r >= 0);
44
45 return 0;
46 }
47
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;
52 const char *unique;
53 int r;
54
55 r = sd_event_default(&event);
56 assert_se(r >= 0);
57
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;
62 }
63 assert_se(r >= 0);
64
65 r = sd_bus_attach_event(a, event, SD_EVENT_PRIORITY_NORMAL);
66 assert_se(r >= 0);
67
68 r = sd_bus_open_user(&b);
69 assert_se(r >= 0);
70
71 r = sd_bus_attach_event(b, event, SD_EVENT_PRIORITY_NORMAL);
72 assert_se(r >= 0);
73
74 /* Watch b's name from a */
75 r = sd_bus_track_new(a, &x, track_cb_x, NULL);
76 assert_se(r >= 0);
77
78 r = sd_bus_get_unique_name(b, &unique);
79 assert_se(r >= 0);
80
81 r = sd_bus_track_add_name(x, unique);
82 assert_se(r >= 0);
83
84 /* Watch's a's own name from a */
85 r = sd_bus_track_new(a, &y, track_cb_y, NULL);
86 assert_se(r >= 0);
87
88 r = sd_bus_get_unique_name(a, &unique);
89 assert_se(r >= 0);
90
91 r = sd_bus_track_add_name(y, unique);
92 assert_se(r >= 0);
93
94 /* Now make b's name disappear */
95 sd_bus_close(b);
96
97 r = sd_event_loop(event);
98 assert_se(r >= 0);
99
100 assert_se(track_cb_called_x);
101 assert_se(track_cb_called_y);
102
103 return 0;
104 }