(root)/
glib-2.79.0/
gio/
tests/
socket-common.c
       1  /* #included into both socket-testclient.c and socket-testserver.c */
       2  
       3  #ifdef G_OS_UNIX
       4  static const char *unix_socket_address_types[] = {
       5    "invalid",
       6    "anonymous",
       7    "path",
       8    "abstract",
       9    "padded"
      10  };
      11  #endif
      12  
      13  static char *
      14  socket_address_to_string (GSocketAddress *address)
      15  {
      16    char *res = NULL;
      17  
      18    if (G_IS_INET_SOCKET_ADDRESS (address))
      19      {
      20        GInetAddress *inet_address;
      21        char *str;
      22        int port;
      23  
      24        inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address));
      25        str = g_inet_address_to_string (inet_address);
      26        port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address));
      27        res = g_strdup_printf ("%s:%d", str, port);
      28        g_free (str);
      29      }
      30  #ifdef G_OS_UNIX
      31    else if (G_IS_UNIX_SOCKET_ADDRESS (address))
      32      {
      33        GUnixSocketAddress *uaddr = G_UNIX_SOCKET_ADDRESS (address);
      34  
      35        res = g_strdup_printf ("%s:%s",
      36  			     unix_socket_address_types[g_unix_socket_address_get_address_type (uaddr)],
      37  			     g_unix_socket_address_get_path (uaddr));
      38      }
      39  #endif
      40  
      41    return res;
      42  }
      43  
      44  static GSocketAddress *
      45  socket_address_from_string (const char *name)
      46  {
      47  #ifdef G_OS_UNIX
      48    gsize i, len;
      49  
      50    for (i = 0; i < G_N_ELEMENTS (unix_socket_address_types); i++)
      51      {
      52        len = strlen (unix_socket_address_types[i]);
      53        if (!strncmp (name, unix_socket_address_types[i], len) &&
      54  	  name[len] == ':')
      55  	{
      56  	  return g_unix_socket_address_new_with_type (name + len + 1, -1,
      57  						      (GUnixSocketAddressType)i);
      58  	}
      59      }
      60  #endif
      61    return NULL;
      62  }
      63  
      64  static gboolean
      65  source_ready (GPollableInputStream *stream,
      66  	      gpointer              data)
      67  {
      68    g_main_loop_quit (loop);
      69    return FALSE;
      70  }
      71  
      72  static void
      73  ensure_socket_condition (GSocket      *socket,
      74  			 GIOCondition  condition,
      75  			 GCancellable *cancellable)
      76  {
      77    GSource *source;
      78  
      79    if (!non_blocking)
      80      return;
      81  
      82    source = g_socket_create_source (socket, condition, cancellable);
      83    g_source_set_callback (source,
      84  			 (GSourceFunc) source_ready,
      85  			 NULL, NULL);
      86    g_source_attach (source, NULL);
      87    g_source_unref (source);
      88    g_main_loop_run (loop);
      89  }
      90  
      91  static void
      92  ensure_connection_condition (GIOStream    *stream,
      93  			     GIOCondition  condition,
      94  			     GCancellable *cancellable)
      95  {
      96    GSource *source;
      97  
      98    if (!non_blocking)
      99      return;
     100  
     101    if (condition & G_IO_IN)
     102      source = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (stream)), cancellable);
     103    else
     104      source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (g_io_stream_get_output_stream (stream)), cancellable);
     105  
     106    g_source_set_callback (source,
     107  			 (GSourceFunc) source_ready,
     108  			 NULL, NULL);
     109    g_source_attach (source, NULL);
     110    g_source_unref (source);
     111    g_main_loop_run (loop);
     112  }
     113  
     114  static gpointer
     115  cancel_thread (gpointer data)
     116  {
     117    GCancellable *cancellable = data;
     118  
     119    g_usleep (1000*1000*cancel_timeout);
     120    g_print ("Cancelling\n");
     121    g_cancellable_cancel (cancellable);
     122    return NULL;
     123  }