2 #include <gio/gunixfdmessage.h>
3 #include <sys/socket.h>
7 /* ensures that no FDs are left open at the end */
9 check_fd_list (const gint *fd_list)
13 for (i = 0; i < 40; i++)
18 g_assert_cmpint (fd_list[i], ==, my_fd);
21 for (i = 0; i < 40; i++)
26 create_fd_list (gint *fd_list)
30 for (i = 0; i < 40; i++)
33 g_assert_cmpint (fd_list[i], >, 0);
36 for (i = 0; i < 40; i++)
43 GUnixFDMessage *message;
45 GUnixFDList *list, *l2;
58 create_fd_list (fd_list);
60 s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
61 g_assert_cmpint (s, ==, 0);
64 list = g_unix_fd_list_new_from_array (sv, -1);
65 message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new_with_fd_list (list));
66 g_object_unref (list);
68 g_assert (g_unix_fd_message_get_fd_list (message) == list);
69 g_object_get (message, "fd-list", &l2, NULL);
70 g_assert (l2 == list);
71 g_assert_cmpint (g_unix_fd_list_get_length (list), ==, 2);
73 peek = g_unix_fd_list_peek_fds (list, &s);
74 g_assert_cmpint (s, ==, 2);
75 stolen = g_unix_fd_message_steal_fds (message, &s);
76 g_assert_cmpint (s, ==, 2);
77 g_assert (stolen == peek);
79 g_assert_cmpint (stolen[0], ==, sv[0]);
80 g_assert_cmpint (stolen[1], ==, sv[1]);
81 g_assert_cmpint (stolen[2], ==, sv[2]);
84 g_unix_fd_message_append_fd (message, sv[0], NULL);
86 g_assert_cmpint (s, ==, 0);
87 g_unix_fd_message_append_fd (message, sv[1], NULL);
89 g_assert_cmpint (s, ==, 0);
91 s = close (g_unix_fd_list_get (list, 0, NULL));
92 g_assert_cmpint (s, ==, 0);
93 s = close (g_unix_fd_list_get (list, 1, NULL));
94 g_assert_cmpint (s, ==, 0);
95 s = close (g_unix_fd_list_get (list, 0, NULL));
96 g_assert_cmpint (s, ==, 0);
97 s = close (g_unix_fd_list_get (list, 1, NULL));
98 g_assert_cmpint (s, ==, 0);
99 s = close (g_unix_fd_list_get (list, 0, NULL));
100 g_assert_cmpint (s, ==, 0);
101 s = close (g_unix_fd_list_get (list, 1, NULL));
102 g_assert_cmpint (s, ==, 0);
104 g_object_unref (message);
105 g_object_unref (list);
109 message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new ());
110 list = g_unix_fd_message_get_fd_list (message);
112 g_assert_cmpint (s, ==, 0);
114 s = g_unix_fd_list_append (list, sv[0], NULL);
115 g_assert_cmpint (s, >=, 0);
116 s = g_unix_fd_list_append (list, sv[1], NULL);
117 g_assert_cmpint (s, >=, 0);
120 g_assert_cmpint (s, ==, 0);
122 g_assert_cmpint (s, ==, 0);
123 s = close (g_unix_fd_list_get (list, 0, NULL));
124 g_assert_cmpint (s, ==, 0);
125 s = close (g_unix_fd_list_get (list, 1, NULL));
126 g_assert_cmpint (s, ==, 0);
128 s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
129 g_assert_cmpint (s, ==, 0);
131 sockets[0] = g_socket_new_from_fd (sv[0], NULL);
132 g_assert (G_IS_SOCKET (sockets[0]));
133 sockets[1] = g_socket_new_from_fd (sv[1], NULL);
134 g_assert (G_IS_SOCKET (sockets[1]));
139 s = g_socket_send_message (sockets[0], NULL, &ov, 1,
140 (GSocketControlMessage **) &message,
142 g_assert_cmpint (s, ==, 1);
143 g_object_unref (message);
150 s = g_socket_receive_message (sockets[1], NULL, &iv, 1,
151 (GSocketControlMessage ***) &mv,
152 &nm, &flags, NULL, NULL);
153 g_assert_cmpint (s, ==, 1);
154 g_object_unref (sockets[0]);
155 g_object_unref (sockets[1]);
157 g_assert_cmpint (nm, ==, 1);
161 g_assert (G_IS_UNIX_FD_MESSAGE (message));
162 list = g_object_ref (g_unix_fd_message_get_fd_list (message));
163 g_object_unref (message);
165 peek = g_unix_fd_list_peek_fds (list, &s);
166 g_assert_cmpint (s, ==, 2);
167 sv[0] = g_unix_fd_list_get (list, 1, NULL);
169 strcpy (buffer, "failure to say failure to say 'i love gnome-panel!'.");
170 s = write (sv[0], buffer, strlen (buffer) + 1);
171 g_assert_cmpint (s, ==, strlen (buffer) + 1);
174 memset (buffer, 0xff, sizeof buffer);
176 s = read (peek[0], buffer, sizeof buffer);
177 g_assert_cmpint (s, ==, 53);
178 g_assert_cmpstr (buffer, ==,
179 "failure to say failure to say 'i love gnome-panel!'.");
181 g_object_unref (list);
183 check_fd_list (fd_list);
187 main (int argc, char **argv)
189 g_test_init (&argc, &argv, NULL);
193 g_test_add_func ("/unix-streams/file-descriptors", test_fds);