Deleted Added
full compact
19c19
< * $FreeBSD: head/contrib/tcp_wrappers/hosts_access.c 51495 1999-09-21 09:09:57Z sheldonh $
---
> * $FreeBSD: head/contrib/tcp_wrappers/hosts_access.c 56977 2000-02-03 10:27:03Z shin $
28a29,31
> #ifdef INT32_T
> typedef uint32_t u_int32_t;
> #endif
29a33,35
> #ifdef INET6
> #include <sys/socket.h>
> #endif
86a93,96
> #ifdef INET6
> static int masked_match4();
> static int masked_match6();
> #endif
315a326,332
> #ifdef INET6
> /* convert IPv4 mapped IPv6 address to IPv4 address */
> if (STRN_EQ(string, "::ffff:", 7)
> && dot_quad_addr(string + 7) != INADDR_NONE) {
> string += 7;
> }
> #endif
325a343,358
> #ifdef INET6
> struct in6_addr pat, addr;
> int len, ret;
> char ch;
>
> len = strlen(tok);
> if (*tok == '[' && tok[len - 1] == ']') {
> ch = tok[len - 1];
> tok[len - 1] = '\0';
> ret = inet_pton(AF_INET6, tok + 1, pat.s6_addr);
> tok[len - 1] = ch;
> if (ret != 1 || inet_pton(AF_INET6, string, addr.s6_addr) != 1)
> return NO;
> return (!memcmp(&pat, &addr, sizeof(struct in6_addr)));
> }
> #endif
331a365
> #ifdef INET6
336a371,387
> return (masked_match4(net_tok, mask_tok, string) ||
> masked_match6(net_tok, mask_tok, string));
> }
>
> static int masked_match4(net_tok, mask_tok, string)
> #else
> static int masked_match(net_tok, mask_tok, string)
> #endif
> char *net_tok;
> char *mask_tok;
> char *string;
> {
> #ifdef INET6
> u_int32_t net;
> u_int32_t mask;
> u_int32_t addr;
> #else
339a391
> #endif
350a403
> #ifndef INET6
351a405
> #endif
355a410,460
>
> #ifdef INET6
> static int masked_match6(net_tok, mask_tok, string)
> char *net_tok;
> char *mask_tok;
> char *string;
> {
> struct in6_addr net, addr;
> u_int32_t mask;
> int len, mask_len, i = 0;
> char ch;
>
> if (inet_pton(AF_INET6, string, addr.s6_addr) != 1)
> return NO;
>
> if (IN6_IS_ADDR_V4MAPPED(&addr)) {
> if ((*(u_int32_t *)&net.s6_addr[12] = dot_quad_addr(net_tok)) == INADDR_NONE
> || (mask = dot_quad_addr(mask_tok)) == INADDR_NONE)
> return (NO);
> return ((*(u_int32_t *)&addr.s6_addr[12] & mask) == *(u_int32_t *)&net.s6_addr[12]);
> }
>
> /* match IPv6 address against netnumber/prefixlen */
> len = strlen(net_tok);
> if (*net_tok != '[' || net_tok[len - 1] != ']')
> return NO;
> ch = net_tok[len - 1];
> net_tok[len - 1] = '\0';
> if (inet_pton(AF_INET6, net_tok + 1, net.s6_addr) != 1) {
> net_tok[len - 1] = ch;
> return NO;
> }
> net_tok[len - 1] = ch;
> if ((mask_len = atoi(mask_tok)) < 0 || mask_len > 128)
> return NO;
>
> while (mask_len > 0) {
> if (mask_len < 32) {
> mask = htonl(~(0xffffffff >> mask_len));
> if ((*(u_int32_t *)&addr.s6_addr[i] & mask) != (*(u_int32_t *)&net.s6_addr[i] & mask))
> return NO;
> break;
> }
> if (*(u_int32_t *)&addr.s6_addr[i] != *(u_int32_t *)&net.s6_addr[i])
> return NO;
> i += 4;
> mask_len -= 32;
> }
> return YES;
> }
> #endif /* INET6 */