+#define ipv4_is_loopback(addr) \
+ (((addr).s_addr & htonl(0xff000000)) == htonl(0x7f000000))
+
+static int sockaddr_is_loopback(struct sockaddr *sa)
+{
+ struct sockaddr_in *sin;
+#ifndef NO_IPV6
+ struct sockaddr_in6 *sin6;
+#endif
+
+ switch (sa->sa_family) {
+ case AF_INET:
+ sin = (struct sockaddr_in *)sa;
+ return ipv4_is_loopback(sin->sin_addr);
+#ifndef NO_IPV6
+ case AF_INET6:
+ sin6 = (struct sockaddr_in6 *)sa;
+ return IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr);
+#endif
+ case AF_UNIX:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+