2 #include <gio/gnetworking.h>
3 #include <gio/gunixfdmessage.h>
4 #include <gio/gunixsocketaddress.h>
9 #include <glib/gstdio.h>
16 /* ensures that no FDs are left open at the end */
18 check_fd_list (const gint *fd_list)
22 for (i = 0; i < 40; i++)
27 g_assert_cmpint (fd_list[i], ==, my_fd);
30 for (i = 0; i < 40; i++)
31 g_close (fd_list[i], NULL);
35 create_fd_list (gint *fd_list)
39 for (i = 0; i < 40; i++)
42 g_assert_cmpint (fd_list[i], >, 0);
45 for (i = 0; i < 40; i++)
46 g_close (fd_list[i], NULL);
60 create_fd_list (fd_list);
63 s = _pipe (sv, 4096, _O_NOINHERIT | _O_BINARY);
64 g_assert_cmpint (s, ==, 0);
66 g_unix_open_pipe (sv, O_CLOEXEC, &err);
67 g_assert_no_error (err);
69 list = g_unix_fd_list_new_from_array (sv, -1);
70 peek = g_unix_fd_list_peek_fds (list, &s);
71 g_assert_cmpint (s, ==, 2);
72 g_assert_cmpint (peek[0], ==, sv[0]);
73 g_assert_cmpint (peek[1], ==, sv[1]);
75 s = g_unix_fd_list_get (list, 0, &err);
76 g_assert_no_error (err);
78 g_assert_no_error (err);
79 s = g_unix_fd_list_get (list, 1, &err);
80 g_assert_no_error (err);
82 g_assert_no_error (err);
84 s = g_unix_fd_list_append (list, sv[0], &err);
85 g_assert_no_error (err);
86 g_assert_cmpint (s, >=, 0);
87 stolen = g_unix_fd_list_steal_fds (list, &s);
88 g_assert_cmpint (s, ==, 3);
89 g_assert_cmpint (stolen[0], ==, sv[0]);
90 g_assert_cmpint (stolen[1], ==, sv[1]);
91 g_assert_cmpint (stolen[2], >=, 0);
92 g_close (stolen[0], &err);
93 g_assert_no_error (err);
94 g_close (stolen[1], &err);
95 g_assert_no_error (err);
96 g_close (stolen[2], &err);
97 g_assert_no_error (err);
100 g_object_unref (list);
101 check_fd_list (fd_list);
109 GUnixFDMessage *message;
111 GUnixFDList *list, *l2;
113 GSocketAddress *addr;
127 GUnixSocketAddressType type;
129 create_fd_list (fd_list);
131 s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
132 g_assert_cmpint (s, ==, 0);
135 list = g_unix_fd_list_new_from_array (sv, -1);
136 message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new_with_fd_list (list));
137 g_object_unref (list);
139 g_assert (g_unix_fd_message_get_fd_list (message) == list);
140 g_object_get (message, "fd-list", &l2, NULL);
141 g_assert (l2 == list);
142 g_assert_cmpint (g_unix_fd_list_get_length (list), ==, 2);
144 peek = g_unix_fd_list_peek_fds (list, &s);
145 g_assert_cmpint (s, ==, 2);
146 stolen = g_unix_fd_message_steal_fds (message, &s);
147 g_assert_cmpint (s, ==, 2);
148 g_assert (stolen == peek);
150 g_assert_cmpint (stolen[0], ==, sv[0]);
151 g_assert_cmpint (stolen[1], ==, sv[1]);
152 g_assert_cmpint (stolen[2], ==, sv[2]);
155 g_unix_fd_message_append_fd (message, sv[0], &err);
156 g_assert_no_error (err);
157 g_close (sv[0], &err);
158 g_assert_no_error (err);
159 g_unix_fd_message_append_fd (message, sv[1], &err);
160 g_assert_no_error (err);
161 g_close (sv[1], &err);
162 g_assert_no_error (err);
164 for (i = 0; i < 3; i++)
166 s = g_unix_fd_list_get (list, 0, &err);
167 g_assert_no_error (err);
169 g_assert_no_error (err);
170 s = g_unix_fd_list_get (list, 1, &err);
171 g_assert_no_error (err);
173 g_assert_no_error (err);
176 g_object_unref (message);
177 g_object_unref (list);
179 message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new ());
180 list = g_unix_fd_message_get_fd_list (message);
182 g_assert_cmpint (s, ==, 0);
184 s = g_unix_fd_list_append (list, sv[0], &err);
185 g_assert_no_error (err);
186 g_assert_cmpint (s, >=, 0);
187 s = g_unix_fd_list_append (list, sv[1], &err);
188 g_assert_no_error (err);
189 g_assert_cmpint (s, >=, 0);
191 g_close (sv[0], &err);
192 g_assert_no_error (err);
193 g_close (sv[1], &err);
194 g_assert_no_error (err);
195 s = g_unix_fd_list_get (list, 0, &err);
196 g_assert_no_error (err);
198 g_assert_no_error (err);
199 s = g_unix_fd_list_get (list, 1, &err);
200 g_assert_no_error (err);
202 g_assert_no_error (err);
204 s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
205 g_assert_cmpint (s, ==, 0);
207 sockets[0] = g_socket_new_from_fd (sv[0], &err);
208 g_assert_no_error (err);
209 g_assert (G_IS_SOCKET (sockets[0]));
210 sockets[1] = g_socket_new_from_fd (sv[1], &err);
211 g_assert_no_error (err);
212 g_assert (G_IS_SOCKET (sockets[1]));
214 addr = g_socket_get_local_address (sockets[0], &err);
215 g_assert_no_error (err);
216 g_assert (G_IS_UNIX_SOCKET_ADDRESS (addr));
217 g_assert_cmpint (g_unix_socket_address_get_address_type (G_UNIX_SOCKET_ADDRESS (addr)), ==, G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
218 g_assert_cmpint (g_unix_socket_address_get_path_len (G_UNIX_SOCKET_ADDRESS (addr)), ==, 0);
220 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
221 g_assert (!g_unix_socket_address_get_is_abstract (G_UNIX_SOCKET_ADDRESS (addr)));
222 G_GNUC_END_IGNORE_DEPRECATIONS
226 "path-as-array", &array,
227 "abstract", &abstract,
228 "address-type", &type,
230 g_assert_cmpstr (path, ==, "");
231 g_assert_cmpint (array->len, ==, 0);
232 g_assert (!abstract);
233 g_assert (type == G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
235 g_byte_array_free (array, TRUE);
237 g_object_unref (addr);
242 s = g_socket_send_message (sockets[0], NULL, &ov, 1,
243 (GSocketControlMessage **) &message,
245 g_assert_no_error (err);
246 g_assert_cmpint (s, ==, 1);
247 g_object_unref (message);
254 s = g_socket_receive_message (sockets[1], NULL, &iv, 1,
255 (GSocketControlMessage ***) &mv,
256 &nm, &flags, NULL, &err);
257 g_assert_no_error (err);
258 g_assert_cmpint (s, ==, 1);
259 g_object_unref (sockets[0]);
260 g_object_unref (sockets[1]);
262 g_assert_cmpint (nm, ==, 1);
266 g_assert (G_IS_UNIX_FD_MESSAGE (message));
267 list = g_object_ref (g_unix_fd_message_get_fd_list (message));
268 g_object_unref (message);
270 peek = g_unix_fd_list_peek_fds (list, &s);
271 g_assert_cmpint (s, ==, 2);
272 sv[0] = g_unix_fd_list_get (list, 1, &err);
273 g_assert_no_error (err);
275 strcpy (buffer, "failure to say failure to say 'i love gnome-panel!'.");
276 s = write (sv[0], buffer, strlen (buffer) + 1);
277 g_assert_cmpint (s, ==, strlen (buffer) + 1);
279 g_close (sv[0], NULL);
280 memset (buffer, 0xff, sizeof buffer);
282 s = read (peek[0], buffer, sizeof buffer);
283 g_assert_cmpint (s, ==, 53);
284 g_assert_cmpstr (buffer, ==,
285 "failure to say failure to say 'i love gnome-panel!'.");
287 g_object_unref (list);
289 check_fd_list (fd_list);
291 g_test_skip ("FD SCM support doesn’t exist on Windows");
296 main (int argc, char **argv)
298 g_test_init (&argc, &argv, NULL);
300 g_test_add_func ("/unix-fd/fd-list", test_fd_list);
301 g_test_add_func ("/unix-fd/scm", test_scm);