]> code.delx.au - pulseaudio/commitdiff
add new functions pa_socket_is_local() and pa_socket_address_is_local()
authorLennart Poettering <lennart@poettering.net>
Mon, 16 Jun 2008 18:45:17 +0000 (18:45 +0000)
committerLennart Poettering <lennart@poettering.net>
Mon, 16 Jun 2008 18:45:17 +0000 (18:45 +0000)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2532 fefdeb5f-60dc-0310-8127-8f9354f1896f

src/pulsecore/socket-util.c
src/pulsecore/socket-util.h

index 456accb82c9e8f79c13611b962650351bf0f4c6a..a92d50a533a0c7c17f8ead228cd37f696583db56 100644 (file)
@@ -129,8 +129,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;
@@ -284,3 +284,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);
+}
index a0344c68f90d87870463005e64e1106f72e92858..eeddf9890d7f7de08c3baa1db0436bb8d108f694 100644 (file)
@@ -26,6 +26,9 @@
 ***/
 
 #include <sys/types.h>
+#include <sys/socket.h>
+
+#include <pulsecore/macro.h>
 
 void pa_socket_peer_to_string(int fd, char *c, size_t l);
 
@@ -39,4 +42,7 @@ int pa_socket_set_rcvbuf(int fd, size_t l);
 int pa_unix_socket_is_stale(const char *fn);
 int pa_unix_socket_remove_stale(const char *fn);
 
+pa_bool_t pa_socket_address_is_local(const struct sockaddr *sa);
+pa_bool_t pa_socket_is_local(int fd);
+
 #endif