1 /* #included into both socket-client.c and socket-server.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 * socket_address_to_string(GSocketAddress * address)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 * socket_address_from_string(const char * name)45 socket_address_from_string (const char *name) 46 { 47 #ifdef G_OS_UNIX 48 int 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 source_ready(GPollableInputStream * stream,gpointer data)65 source_ready (GPollableInputStream *stream, 66 gpointer data) 67 { 68 g_main_loop_quit (loop); 69 return FALSE; 70 } 71 72 static void ensure_socket_condition(GSocket * socket,GIOCondition condition,GCancellable * cancellable)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 ensure_connection_condition(GIOStream * stream,GIOCondition condition,GCancellable * cancellable)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 cancel_thread(gpointer data)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 } 124