# define X11_UNIX_PATH "/tmp/.X11-unix/X"
#endif
-#define ipv4_is_loopback(addr) (inet_netof(addr) == IN_LOOPBACKNET)
-
struct Socket_tag {
struct socket_function_table *fn;
/* the above variable absolutely *must* be the first in this structure */
return !strcmp(name, "localhost");
}
+#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_LOCAL:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
int sk_address_is_local(SockAddr addr)
{
return 0; /* we don't know; assume not */
else {
#ifndef NO_IPV6
- if (addr->family == AF_INET)
- return ipv4_is_loopback(
- ((struct sockaddr_in *)addr->ai->ai_addr)->sin_addr);
- else if (addr->family == AF_INET6)
- return IN6_IS_ADDR_LOOPBACK(
- &((struct sockaddr_in6 *)addr->ai->ai_addr)->sin6_addr);
- else
- return 0;
+ return sockaddr_is_loopback(addr->ai->ai_addr);
#else
struct in_addr a;
assert(addr->family == AF_INET);
* On a listening socket, the readability event means a
* connection is ready to be accepted.
*/
- struct sockaddr_in isa;
- int addrlen = sizeof(struct sockaddr_in);
+#ifdef NO_IPV6
+ struct sockaddr_in ss;
+#else
+ struct sockaddr_storage ss;
+#endif
+ socklen_t addrlen = sizeof(ss);
int t; /* socket of connection */
- memset(&isa, 0, sizeof(struct sockaddr_in));
- t = accept(s->s,(struct sockaddr *)&isa,(socklen_t *) &addrlen);
+ memset(&ss, 0, addrlen);
+ t = accept(s->s, (struct sockaddr *)&ss, &addrlen);
if (t < 0) {
break;
}
- if (s->localhost_only && !ipv4_is_loopback(isa.sin_addr)) {
+ if (s->localhost_only &&
+ !sockaddr_is_loopback((struct sockaddr *)&ss)) {
close(t); /* someone let nonlocal through?! */
} else if (plug_accepting(s->plug, t)) {
close(t); /* denied or error */