diff options
Diffstat (limited to 'src/pulsecore/socket-util.c')
-rw-r--r-- | src/pulsecore/socket-util.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c index 085edeb8..f721f699 100644 --- a/src/pulsecore/socket-util.c +++ b/src/pulsecore/socket-util.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. @@ -129,8 +127,8 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) { return; #endif } - } + #ifndef OS_IS_WIN32 pa_snprintf(c, l, "Unknown network client"); return; @@ -144,7 +142,7 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) { } void pa_make_socket_low_delay(int fd) { - + #ifdef SO_PRIORITY int priority; pa_assert(fd >= 0); @@ -157,7 +155,7 @@ void pa_make_socket_low_delay(int fd) { void pa_make_tcp_socket_low_delay(int fd) { pa_assert(fd >= 0); - + pa_make_socket_low_delay(fd); #if defined(SOL_TCP) || defined(IPPROTO_TCP) @@ -171,7 +169,7 @@ void pa_make_tcp_socket_low_delay(int fd) { pa_log_warn("TCP_NODELAY failed: %s", pa_cstrerror(errno)); } #endif - + #if defined(IPTOS_LOWDELAY) && defined(IP_TOS) && (defined(SOL_IP) || defined(IPPROTO_IP)) { int tos = IPTOS_LOWDELAY; @@ -187,9 +185,9 @@ void pa_make_tcp_socket_low_delay(int fd) { void pa_make_udp_socket_low_delay(int fd) { pa_assert(fd >= 0); - + pa_make_socket_low_delay(fd); - + #if defined(IPTOS_LOWDELAY) && defined(IP_TOS) && (defined(SOL_IP) || defined(IPPROTO_IP)) { int tos = IPTOS_LOWDELAY; @@ -284,3 +282,40 @@ int pa_unix_socket_remove_stale(const char *fn) { } #endif /* HAVE_SYS_UN_H */ + + +pa_bool_t pa_socket_address_is_local(const struct sockaddr *sa) { + pa_assert(sa); + + switch (sa->sa_family) { + case AF_UNIX: + return TRUE; + + case AF_INET: + return ((const struct sockaddr_in*) sa)->sin_addr.s_addr == INADDR_LOOPBACK; + + case AF_INET6: + return memcmp(&((const struct sockaddr_in6*) sa)->sin6_addr, &in6addr_loopback, sizeof(struct in6_addr)) == 0; + + default: + return FALSE; + } +} + +pa_bool_t pa_socket_is_local(int fd) { + + union { + struct sockaddr sa; + struct sockaddr_in in; + struct sockaddr_in6 in6; +#ifdef HAVE_SYS_UN_H + struct sockaddr_un un; +#endif + } sa; + socklen_t sa_len = sizeof(sa); + + if (getpeername(fd, &sa.sa, &sa_len) < 0) + return FALSE; + + return pa_socket_address_is_local(&sa.sa); +} |