PageRenderTime 53ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/glib-2.33.6/gio/tests/unix-fd.c

#
C | 240 lines | 198 code | 41 blank | 1 comment | 8 complexity | 02d0e78951361370b679b2e80d2986af MD5 | raw file
Possible License(s): AGPL-3.0, LGPL-2.0
  1. #include <gio/gio.h>
  2. #include <gio/gunixfdmessage.h>
  3. #include <gio/gunixsocketaddress.h>
  4. #include <sys/socket.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. /* ensures that no FDs are left open at the end */
  8. static void
  9. check_fd_list (const gint *fd_list)
  10. {
  11. gint i;
  12. for (i = 0; i < 40; i++)
  13. {
  14. int my_fd;
  15. my_fd = dup (0);
  16. g_assert_cmpint (fd_list[i], ==, my_fd);
  17. }
  18. for (i = 0; i < 40; i++)
  19. close (fd_list[i]);
  20. }
  21. static void
  22. create_fd_list (gint *fd_list)
  23. {
  24. gint i;
  25. for (i = 0; i < 40; i++)
  26. {
  27. fd_list[i] = dup (0);
  28. g_assert_cmpint (fd_list[i], >, 0);
  29. }
  30. for (i = 0; i < 40; i++)
  31. close (fd_list[i]);
  32. }
  33. static void
  34. test_fds (void)
  35. {
  36. GError *err = NULL;
  37. GUnixFDMessage *message;
  38. GUnixFDMessage **mv;
  39. GUnixFDList *list, *l2;
  40. GSocket *sockets[2];
  41. GSocketAddress *addr;
  42. const gint *peek;
  43. char buffer[1024];
  44. gint fd_list[40];
  45. GOutputVector ov;
  46. GInputVector iv;
  47. gint *stolen;
  48. gint sv[3];
  49. gint flags;
  50. gint nm;
  51. gint s;
  52. gchar *path;
  53. GByteArray *array;
  54. gboolean abstract;
  55. GUnixSocketAddressType type;
  56. create_fd_list (fd_list);
  57. s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
  58. g_assert_cmpint (s, ==, 0);
  59. sv[2] = -1;
  60. list = g_unix_fd_list_new_from_array (sv, -1);
  61. message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new_with_fd_list (list));
  62. g_object_unref (list);
  63. g_assert (g_unix_fd_message_get_fd_list (message) == list);
  64. g_object_get (message, "fd-list", &l2, NULL);
  65. g_assert (l2 == list);
  66. g_assert_cmpint (g_unix_fd_list_get_length (list), ==, 2);
  67. peek = g_unix_fd_list_peek_fds (list, &s);
  68. g_assert_cmpint (s, ==, 2);
  69. stolen = g_unix_fd_message_steal_fds (message, &s);
  70. g_assert_cmpint (s, ==, 2);
  71. g_assert (stolen == peek);
  72. g_assert_cmpint (stolen[0], ==, sv[0]);
  73. g_assert_cmpint (stolen[1], ==, sv[1]);
  74. g_assert_cmpint (stolen[2], ==, sv[2]);
  75. g_free (stolen);
  76. g_unix_fd_message_append_fd (message, sv[0], &err);
  77. g_assert_no_error (err);
  78. s = close (sv[0]);
  79. g_assert_cmpint (s, ==, 0);
  80. g_unix_fd_message_append_fd (message, sv[1], &err);
  81. g_assert_no_error (err);
  82. s = close (sv[1]);
  83. g_assert_cmpint (s, ==, 0);
  84. s = close (g_unix_fd_list_get (list, 0, &err));
  85. g_assert_no_error (err);
  86. g_assert_cmpint (s, ==, 0);
  87. s = close (g_unix_fd_list_get (list, 1, &err));
  88. g_assert_no_error (err);
  89. g_assert_cmpint (s, ==, 0);
  90. s = close (g_unix_fd_list_get (list, 0, &err));
  91. g_assert_no_error (err);
  92. g_assert_cmpint (s, ==, 0);
  93. s = close (g_unix_fd_list_get (list, 1, &err));
  94. g_assert_no_error (err);
  95. g_assert_cmpint (s, ==, 0);
  96. s = close (g_unix_fd_list_get (list, 0, &err));
  97. g_assert_no_error (err);
  98. g_assert_cmpint (s, ==, 0);
  99. s = close (g_unix_fd_list_get (list, 1, &err));
  100. g_assert_no_error (err);
  101. g_assert_cmpint (s, ==, 0);
  102. g_object_unref (message);
  103. g_object_unref (list);
  104. message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new ());
  105. list = g_unix_fd_message_get_fd_list (message);
  106. s = pipe (sv);
  107. g_assert_cmpint (s, ==, 0);
  108. s = g_unix_fd_list_append (list, sv[0], &err);
  109. g_assert_no_error (err);
  110. g_assert_cmpint (s, >=, 0);
  111. s = g_unix_fd_list_append (list, sv[1], &err);
  112. g_assert_no_error (err);
  113. g_assert_cmpint (s, >=, 0);
  114. s = close (sv[0]);
  115. g_assert_cmpint (s, ==, 0);
  116. s = close (sv[1]);
  117. g_assert_cmpint (s, ==, 0);
  118. s = close (g_unix_fd_list_get (list, 0, &err));
  119. g_assert_no_error (err);
  120. g_assert_cmpint (s, ==, 0);
  121. s = close (g_unix_fd_list_get (list, 1, &err));
  122. g_assert_no_error (err);
  123. g_assert_cmpint (s, ==, 0);
  124. s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
  125. g_assert_cmpint (s, ==, 0);
  126. sockets[0] = g_socket_new_from_fd (sv[0], &err);
  127. g_assert_no_error (err);
  128. g_assert (G_IS_SOCKET (sockets[0]));
  129. sockets[1] = g_socket_new_from_fd (sv[1], &err);
  130. g_assert_no_error (err);
  131. g_assert (G_IS_SOCKET (sockets[1]));
  132. addr = g_socket_get_local_address (sockets[0], &err);
  133. g_assert_no_error (err);
  134. g_assert (G_IS_UNIX_SOCKET_ADDRESS (addr));
  135. g_assert_cmpint (g_unix_socket_address_get_address_type (G_UNIX_SOCKET_ADDRESS (addr)), ==, G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
  136. g_assert_cmpint (g_unix_socket_address_get_path_len (G_UNIX_SOCKET_ADDRESS (addr)), ==, 0);
  137. g_object_get (addr,
  138. "path", &path,
  139. "path-as-array", &array,
  140. "abstract", &abstract,
  141. "address-type", &type,
  142. NULL);
  143. g_assert_cmpstr (path, ==, "");
  144. g_assert_cmpint (array->len, ==, 0);
  145. g_assert (!abstract);
  146. g_assert (type == G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
  147. g_free (path);
  148. g_byte_array_free (array, TRUE);
  149. g_object_unref (addr);
  150. buffer[0] = 0xff;
  151. ov.buffer = buffer;
  152. ov.size = 1;
  153. s = g_socket_send_message (sockets[0], NULL, &ov, 1,
  154. (GSocketControlMessage **) &message,
  155. 1, 0, NULL, &err);
  156. g_assert_no_error (err);
  157. g_assert_cmpint (s, ==, 1);
  158. g_object_unref (message);
  159. message = NULL;
  160. flags = 0;
  161. iv.buffer = buffer;
  162. iv.size = 1;
  163. s = g_socket_receive_message (sockets[1], NULL, &iv, 1,
  164. (GSocketControlMessage ***) &mv,
  165. &nm, &flags, NULL, &err);
  166. g_assert_no_error (err);
  167. g_assert_cmpint (s, ==, 1);
  168. g_object_unref (sockets[0]);
  169. g_object_unref (sockets[1]);
  170. g_assert_cmpint (nm, ==, 1);
  171. message = mv[0];
  172. g_free (mv);
  173. g_assert (G_IS_UNIX_FD_MESSAGE (message));
  174. list = g_object_ref (g_unix_fd_message_get_fd_list (message));
  175. g_object_unref (message);
  176. peek = g_unix_fd_list_peek_fds (list, &s);
  177. g_assert_cmpint (s, ==, 2);
  178. sv[0] = g_unix_fd_list_get (list, 1, &err);
  179. g_assert_no_error (err);
  180. strcpy (buffer, "failure to say failure to say 'i love gnome-panel!'.");
  181. s = write (sv[0], buffer, strlen (buffer) + 1);
  182. g_assert_cmpint (s, ==, strlen (buffer) + 1);
  183. close (sv[0]);
  184. memset (buffer, 0xff, sizeof buffer);
  185. s = read (peek[0], buffer, sizeof buffer);
  186. g_assert_cmpint (s, ==, 53);
  187. g_assert_cmpstr (buffer, ==,
  188. "failure to say failure to say 'i love gnome-panel!'.");
  189. g_object_unref (list);
  190. check_fd_list (fd_list);
  191. }
  192. int
  193. main (int argc, char **argv)
  194. {
  195. g_test_init (&argc, &argv, NULL);
  196. g_type_init ();
  197. g_test_add_func ("/unix-streams/file-descriptors", test_fds);
  198. return g_test_run();
  199. }