chiark / gitweb /
Fix write-only use of a few variables
[elogind.git] / src / libsystemd-bus / test-bus-zero-copy.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <fcntl.h>
23 #include <sys/mman.h>
24
25 #include "util.h"
26 #include "log.h"
27
28 #include "sd-bus.h"
29 #include "sd-memfd.h"
30 #include "bus-message.h"
31 #include "bus-error.h"
32 #include "bus-kernel.h"
33
34 #define FIRST_ARRAY 17
35 #define SECOND_ARRAY 33
36
37 #define STRING_SIZE 123
38
39 int main(int argc, char *argv[]) {
40         _cleanup_free_ char *bus_name = NULL, *address = NULL;
41         uint8_t *p;
42         sd_bus *a, *b;
43         int r, bus_ref;
44         sd_bus_message *m;
45         sd_memfd *f;
46         uint64_t sz;
47         uint32_t u32;
48         size_t i, l;
49         char *s;
50
51         log_set_max_level(LOG_DEBUG);
52
53         bus_ref = bus_kernel_create("deine-mutter", &bus_name);
54         if (bus_ref == -ENOENT)
55                 return EXIT_TEST_SKIP;
56
57         assert_se(bus_ref >= 0);
58
59         address = strappend("kernel:path=", bus_name);
60         assert_se(address);
61
62         r = sd_bus_new(&a);
63         assert_se(r >= 0);
64
65         r = sd_bus_new(&b);
66         assert_se(r >= 0);
67
68         r = sd_bus_set_address(a, address);
69         assert_se(r >= 0);
70
71         r = sd_bus_set_address(b, address);
72         assert_se(r >= 0);
73
74         r = sd_bus_start(a);
75         assert_se(r >= 0);
76
77         r = sd_bus_start(b);
78         assert_se(r >= 0);
79
80         r = sd_bus_message_new_method_call(b, ":1.1", "/a/path", "an.inter.face", "AMethod", &m);
81         assert_se(r >= 0);
82
83         r = sd_bus_message_open_container(m, 'r', "aysay");
84         assert_se(r >= 0);
85
86         r = sd_bus_message_append_array_space(m, 'y', FIRST_ARRAY, (void**) &p);
87         assert_se(r >= 0);
88
89         memset(p, 'L', FIRST_ARRAY);
90
91         r = sd_memfd_new_and_map(&f, STRING_SIZE, (void**) &s);
92         assert_se(r >= 0);
93
94         for (i = 0; i < STRING_SIZE-1; i++)
95                 s[i] = '0' + (i % 10);
96
97         s[STRING_SIZE-1] = 0;
98         munmap(s, STRING_SIZE);
99
100         r = sd_memfd_get_size(f, &sz);
101         assert_se(r >= 0);
102         assert_se(sz == STRING_SIZE);
103
104         r = sd_bus_message_append_string_memfd(m, f);
105         assert_se(r >= 0);
106
107         sd_memfd_free(f);
108
109         r = sd_memfd_new_and_map(&f, SECOND_ARRAY, (void**) &p);
110         assert_se(r >= 0);
111
112         memset(p, 'P', SECOND_ARRAY);
113         munmap(p, SECOND_ARRAY);
114
115         r = sd_memfd_get_size(f, &sz);
116         assert_se(r >= 0);
117         assert_se(sz == SECOND_ARRAY);
118
119         r = sd_bus_message_append_array_memfd(m, 'y', f);
120         assert_se(r >= 0);
121
122         sd_memfd_free(f);
123
124         r = sd_bus_message_close_container(m);
125         assert_se(r >= 0);
126
127         r = sd_bus_message_append(m, "u", 4711);
128         assert_se(r >= 0);
129
130         r = bus_message_seal(m, 55);
131         assert_se(r >= 0);
132
133         bus_message_dump(m);
134
135         r = sd_bus_send(b, m, NULL);
136         assert_se(r >= 0);
137
138         sd_bus_message_unref(m);
139
140         r = sd_bus_process(a, &m);
141         assert_se(r > 0);
142
143         bus_message_dump(m);
144         sd_bus_message_rewind(m, true);
145
146         r = sd_bus_message_enter_container(m, 'r', "aysay");
147         assert_se(r > 0);
148
149         r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l);
150         assert_se(r > 0);
151         assert_se(l == FIRST_ARRAY);
152
153         for (i = 0; i < l; i++)
154                 assert_se(p[i] == 'L');
155
156         r = sd_bus_message_read(m, "s", &s);
157         assert_se(r > 0);
158
159         for (i = 0; i < STRING_SIZE-1; i++)
160                 assert_se(s[i] == (char) ('0' + (i % 10)));
161         assert_se(s[STRING_SIZE-1] == 0);
162
163         r = sd_bus_message_read_array(m, 'y', (const void**) &p, &l);
164         assert_se(r > 0);
165         assert_se(l == SECOND_ARRAY);
166
167         for (i = 0; i < l; i++)
168                 assert_se(p[i] == 'P');
169
170         r = sd_bus_message_exit_container(m);
171         assert_se(r > 0);
172
173         r = sd_bus_message_read(m, "u", &u32);
174         assert_se(r > 0);
175         assert_se(u32 == 4711);
176
177         sd_bus_message_unref(m);
178
179         sd_bus_unref(a);
180         sd_bus_unref(b);
181
182         return 0;
183 }