loudmouth/lm-sock.c
changeset 266 730617b8c682
parent 140 103227122f45
equal deleted inserted replaced
265:ebfc8419758d 266:730617b8c682
    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 {