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 * |
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 (address: inet_address); |
26 | port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); |
27 | res = g_strdup_printf (format: "%s:%d" , str, port); |
28 | g_free (mem: 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 (format: "%s:%s" , |
36 | unix_socket_address_types[g_unix_socket_address_get_address_type (address: uaddr)], |
37 | g_unix_socket_address_get_path (address: 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 | int i, len; |
49 | |
50 | for (i = 0; i < G_N_ELEMENTS (unix_socket_address_types); i++) |
51 | { |
52 | len = strlen (s: unix_socket_address_types[i]); |
53 | if (!strncmp (s1: name, s2: unix_socket_address_types[i], n: len) && |
54 | name[len] == ':') |
55 | { |
56 | return g_unix_socket_address_new_with_type (path: name + len + 1, path_len: -1, |
57 | type: (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 | func: (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 | func: (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 (microseconds: 1000*1000*cancel_timeout); |
120 | g_print (format: "Cancelling\n" ); |
121 | g_cancellable_cancel (cancellable); |
122 | return NULL; |
123 | } |
124 | |