Blame gio/tests/unix-fd.c

Packit ae235b
#include <gio/gio.h>
Packit ae235b
#include <gio/gnetworking.h>
Packit ae235b
#include <gio/gunixfdmessage.h>
Packit ae235b
#include <gio/gunixsocketaddress.h>
Packit ae235b
#include <string.h>
Packit ae235b
#include <unistd.h>
Packit ae235b
Packit ae235b
/* ensures that no FDs are left open at the end */
Packit ae235b
static void
Packit ae235b
check_fd_list (const gint *fd_list)
Packit ae235b
{
Packit ae235b
  gint i;
Packit ae235b
Packit ae235b
  for (i = 0; i < 40; i++)
Packit ae235b
    {
Packit ae235b
      int my_fd;
Packit ae235b
Packit ae235b
      my_fd = dup (0);
Packit ae235b
      g_assert_cmpint (fd_list[i], ==, my_fd);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  for (i = 0; i < 40; i++)
Packit ae235b
    close (fd_list[i]);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
create_fd_list (gint *fd_list)
Packit ae235b
{
Packit ae235b
  gint i;
Packit ae235b
Packit ae235b
  for (i = 0; i < 40; i++)
Packit ae235b
    {
Packit ae235b
      fd_list[i] = dup (0);
Packit ae235b
      g_assert_cmpint (fd_list[i], >, 0);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  for (i = 0; i < 40; i++)
Packit ae235b
    close (fd_list[i]);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_fds (void)
Packit ae235b
{
Packit ae235b
  GError *err = NULL;
Packit ae235b
  GUnixFDMessage *message;
Packit ae235b
  GUnixFDMessage **mv;
Packit ae235b
  GUnixFDList *list, *l2;
Packit ae235b
  GSocket *sockets[2];
Packit ae235b
  GSocketAddress *addr;
Packit ae235b
  const gint *peek;
Packit ae235b
  char buffer[1024];
Packit ae235b
  gint fd_list[40];
Packit ae235b
  GOutputVector ov;
Packit ae235b
  GInputVector iv;
Packit ae235b
  gint *stolen;
Packit ae235b
  gint sv[3];
Packit ae235b
  gint flags;
Packit ae235b
  gint nm;
Packit ae235b
  gint s;
Packit ae235b
  gchar *path;
Packit ae235b
  GByteArray *array;
Packit ae235b
  gboolean abstract;
Packit ae235b
  GUnixSocketAddressType type;
Packit ae235b
Packit ae235b
  create_fd_list (fd_list);
Packit ae235b
Packit ae235b
  s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  sv[2] = -1;
Packit ae235b
Packit ae235b
  list = g_unix_fd_list_new_from_array (sv, -1);
Packit ae235b
  message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new_with_fd_list (list));
Packit ae235b
  g_object_unref (list);
Packit ae235b
Packit ae235b
  g_assert (g_unix_fd_message_get_fd_list (message) == list);
Packit ae235b
  g_object_get (message, "fd-list", &l2, NULL);
Packit ae235b
  g_assert (l2 == list);
Packit ae235b
  g_assert_cmpint (g_unix_fd_list_get_length (list), ==, 2);
Packit ae235b
Packit ae235b
  peek = g_unix_fd_list_peek_fds (list, &s);
Packit ae235b
  g_assert_cmpint (s, ==, 2);
Packit ae235b
  stolen = g_unix_fd_message_steal_fds (message, &s);
Packit ae235b
  g_assert_cmpint (s, ==, 2);
Packit ae235b
  g_assert (stolen == peek);
Packit ae235b
Packit ae235b
  g_assert_cmpint (stolen[0], ==, sv[0]);
Packit ae235b
  g_assert_cmpint (stolen[1], ==, sv[1]);
Packit ae235b
  g_assert_cmpint (stolen[2], ==, sv[2]);
Packit ae235b
  g_free (stolen);
Packit ae235b
Packit ae235b
  g_unix_fd_message_append_fd (message, sv[0], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  s = close (sv[0]);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  g_unix_fd_message_append_fd (message, sv[1], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  s = close (sv[1]);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
Packit ae235b
  s = close (g_unix_fd_list_get (list, 0, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 1, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 0, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 1, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 0, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 1, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
Packit ae235b
  g_object_unref (message);
Packit ae235b
  g_object_unref (list);
Packit ae235b
Packit ae235b
  message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new ());
Packit ae235b
  list = g_unix_fd_message_get_fd_list (message);
Packit ae235b
  s = pipe (sv);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
Packit ae235b
  s = g_unix_fd_list_append (list, sv[0], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, >=, 0);
Packit ae235b
  s = g_unix_fd_list_append (list, sv[1], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, >=, 0);
Packit ae235b
Packit ae235b
  s = close (sv[0]);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (sv[1]);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 0, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
  s = close (g_unix_fd_list_get (list, 1, &err));
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
Packit ae235b
  s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
Packit ae235b
  g_assert_cmpint (s, ==, 0);
Packit ae235b
Packit ae235b
  sockets[0] = g_socket_new_from_fd (sv[0], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert (G_IS_SOCKET (sockets[0]));
Packit ae235b
  sockets[1] = g_socket_new_from_fd (sv[1], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert (G_IS_SOCKET (sockets[1]));
Packit ae235b
Packit ae235b
  addr = g_socket_get_local_address (sockets[0], &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert (G_IS_UNIX_SOCKET_ADDRESS (addr));
Packit ae235b
  g_assert_cmpint (g_unix_socket_address_get_address_type (G_UNIX_SOCKET_ADDRESS (addr)), ==, G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
Packit ae235b
  g_assert_cmpint (g_unix_socket_address_get_path_len (G_UNIX_SOCKET_ADDRESS (addr)), ==, 0);
Packit ae235b
Packit ae235b
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit ae235b
  g_assert (!g_unix_socket_address_get_is_abstract (G_UNIX_SOCKET_ADDRESS (addr)));
Packit ae235b
G_GNUC_END_IGNORE_DEPRECATIONS
Packit ae235b
Packit ae235b
  g_object_get (addr,
Packit ae235b
                "path", &path,
Packit ae235b
                "path-as-array", &array,
Packit ae235b
                "abstract", &abstract,
Packit ae235b
                "address-type", &type,
Packit ae235b
                NULL);
Packit ae235b
  g_assert_cmpstr (path, ==, "");
Packit ae235b
  g_assert_cmpint (array->len, ==, 0);
Packit ae235b
  g_assert (!abstract);
Packit ae235b
  g_assert (type == G_UNIX_SOCKET_ADDRESS_ANONYMOUS);
Packit ae235b
  g_free (path);
Packit ae235b
  g_byte_array_free (array, TRUE);
Packit ae235b
Packit ae235b
  g_object_unref (addr);
Packit ae235b
Packit ae235b
  buffer[0] = 0xff;
Packit ae235b
  ov.buffer = buffer;
Packit ae235b
  ov.size = 1;
Packit ae235b
  s = g_socket_send_message (sockets[0], NULL, &ov, 1,
Packit ae235b
                             (GSocketControlMessage **) &message,
Packit ae235b
                             1, 0, NULL, &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 1);
Packit ae235b
  g_object_unref (message);
Packit ae235b
Packit ae235b
  message = NULL;
Packit ae235b
Packit ae235b
  flags = 0;
Packit ae235b
  iv.buffer = buffer;
Packit ae235b
  iv.size = 1;
Packit ae235b
  s = g_socket_receive_message (sockets[1], NULL, &iv, 1,
Packit ae235b
                                (GSocketControlMessage ***) &mv,
Packit ae235b
                                &nm, &flags, NULL, &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
  g_assert_cmpint (s, ==, 1);
Packit ae235b
  g_object_unref (sockets[0]);
Packit ae235b
  g_object_unref (sockets[1]);
Packit ae235b
Packit ae235b
  g_assert_cmpint (nm, ==, 1);
Packit ae235b
  message = mv[0];
Packit ae235b
  g_free (mv);
Packit ae235b
Packit ae235b
  g_assert (G_IS_UNIX_FD_MESSAGE (message));
Packit ae235b
  list = g_object_ref (g_unix_fd_message_get_fd_list (message));
Packit ae235b
  g_object_unref (message);
Packit ae235b
Packit ae235b
  peek = g_unix_fd_list_peek_fds (list, &s);
Packit ae235b
  g_assert_cmpint (s, ==, 2);
Packit ae235b
  sv[0] = g_unix_fd_list_get (list, 1, &err;;
Packit ae235b
  g_assert_no_error (err);
Packit ae235b
Packit ae235b
  strcpy (buffer, "failure to say failure to say 'i love gnome-panel!'.");
Packit ae235b
  s = write (sv[0], buffer, strlen (buffer) + 1);
Packit ae235b
  g_assert_cmpint (s, ==, strlen (buffer) + 1);
Packit ae235b
Packit ae235b
  close (sv[0]);
Packit ae235b
  memset (buffer, 0xff, sizeof buffer);
Packit ae235b
Packit ae235b
  s = read (peek[0], buffer, sizeof buffer);
Packit ae235b
  g_assert_cmpint (s, ==, 53);
Packit ae235b
  g_assert_cmpstr (buffer, ==,
Packit ae235b
                   "failure to say failure to say 'i love gnome-panel!'.");
Packit ae235b
Packit ae235b
  g_object_unref (list);
Packit ae235b
Packit ae235b
  check_fd_list (fd_list);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int argc, char **argv)
Packit ae235b
{
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
Packit ae235b
  g_test_add_func ("/unix-streams/file-descriptors", test_fds);
Packit ae235b
Packit ae235b
  return g_test_run();
Packit ae235b
Packit ae235b
}