equal
deleted
inserted
replaced
26 |
26 |
27 #include <errno.h> |
27 #include <errno.h> |
28 #include <string.h> |
28 #include <string.h> |
29 #include <unistd.h> |
29 #include <unistd.h> |
30 #include <sys/socket.h> |
30 #include <sys/socket.h> |
|
31 #include <arpa/inet.h> |
31 #include <fcntl.h> |
32 #include <fcntl.h> |
32 #define LM_SHUTDOWN SHUT_RDWR |
33 #define LM_SHUTDOWN SHUT_RDWR |
33 |
34 |
34 #else /* G_OS_WIN32 */ |
35 #else /* G_OS_WIN32 */ |
35 |
36 |
40 |
41 |
41 #include "lm-internals.h" |
42 #include "lm-internals.h" |
42 #include "lm-connection.h" |
43 #include "lm-connection.h" |
43 #include "lm-sock.h" |
44 #include "lm-sock.h" |
44 #include "lm-debug.h" |
45 #include "lm-debug.h" |
|
46 |
|
47 #define IPV6_MAX_ADDRESS_LEN 46 /* 45 + '\0' */ |
45 |
48 |
46 static gboolean initialised = FALSE; |
49 static gboolean initialised = FALSE; |
47 |
50 |
48 gboolean |
51 gboolean |
49 _lm_sock_library_init (void) |
52 _lm_sock_library_init (void) |
157 _lm_sock_connect (LmSocket sock, |
160 _lm_sock_connect (LmSocket sock, |
158 const struct sockaddr *name, |
161 const struct sockaddr *name, |
159 int namelen) |
162 int namelen) |
160 { |
163 { |
161 return connect (sock, name, namelen); |
164 return connect (sock, name, namelen); |
|
165 } |
|
166 |
|
167 gchar * |
|
168 _lm_sock_get_local_host (LmSocket sock) |
|
169 { |
|
170 struct sockaddr addr_info; |
|
171 void *sock_addr; |
|
172 socklen_t namelen; |
|
173 char addrbuf[IPV6_MAX_ADDRESS_LEN]; |
|
174 const char *host; |
|
175 |
|
176 namelen = sizeof (struct sockaddr); |
|
177 if (getsockname (sock, &addr_info, &namelen)) { |
|
178 return NULL; |
|
179 } |
|
180 |
|
181 switch (addr_info.sa_family) { |
|
182 case AF_INET: |
|
183 |
|
184 sock_addr = & (((struct sockaddr_in *) &addr_info)->sin_addr); |
|
185 break; |
|
186 case AF_INET6: |
|
187 sock_addr = & (((struct sockaddr_in6 *) &addr_info)->sin6_addr); |
|
188 break; |
|
189 default: |
|
190 return NULL; |
|
191 } |
|
192 /* inet_ntoa has been obsoleted in favour of inet_ntop */ |
|
193 host = inet_ntop (addr_info.sa_family, |
|
194 sock_addr, |
|
195 addrbuf, |
|
196 IPV6_MAX_ADDRESS_LEN); |
|
197 |
|
198 return g_strdup (host); |
162 } |
199 } |
163 |
200 |
164 gboolean |
201 gboolean |
165 _lm_sock_is_blocking_error (int err) |
202 _lm_sock_is_blocking_error (int err) |
166 { |
203 { |