version 1.35, 2000/02/05 18:46:50 |
version 1.36, 2000/05/18 01:20:48 |
|
|
register char *cp = workbuf; |
register char *cp = workbuf; |
size_t n; |
size_t n; |
|
|
switch(sa->sa_family) { |
switch (sa->sa_family) { |
case AF_INET: |
case AF_INET: |
{ |
{ |
register struct sockaddr_in *sin = (struct sockaddr_in *)sa; |
register struct sockaddr_in *sin = (struct sockaddr_in *)sa; |
|
|
masklen = 0; |
masklen = 0; |
lim = (u_char *)(mask + 1); |
lim = (u_char *)(mask + 1); |
i = 0; |
i = 0; |
for (p = (u_char *)mask; p < lim; p++) { |
if (mask) { |
if (final && *p) { |
for (p = (u_char *)mask; p < lim; p++) { |
illegal++; |
if (final && *p) { |
sin6.sin6_addr.s6_addr[i++] = 0x00; |
illegal++; |
continue; |
sin6.sin6_addr.s6_addr[i++] = 0x00; |
} |
continue; |
|
} |
|
|
switch (*p & 0xff) { |
switch (*p & 0xff) { |
case 0xff: |
case 0xff: |
masklen += 8; |
masklen += 8; |
break; |
break; |
case 0xfe: |
case 0xfe: |
masklen += 7; |
masklen += 7; |
final++; |
final++; |
break; |
break; |
case 0xfc: |
case 0xfc: |
masklen += 6; |
masklen += 6; |
final++; |
final++; |
break; |
break; |
case 0xf8: |
case 0xf8: |
masklen += 5; |
masklen += 5; |
final++; |
final++; |
break; |
break; |
case 0xf0: |
case 0xf0: |
masklen += 4; |
masklen += 4; |
final++; |
final++; |
break; |
break; |
case 0xe0: |
case 0xe0: |
masklen += 3; |
masklen += 3; |
final++; |
final++; |
break; |
break; |
case 0xc0: |
case 0xc0: |
masklen += 2; |
masklen += 2; |
final++; |
final++; |
break; |
break; |
case 0x80: |
case 0x80: |
masklen += 1; |
masklen += 1; |
final++; |
final++; |
break; |
break; |
case 0x00: |
case 0x00: |
final++; |
final++; |
break; |
break; |
default: |
default: |
final++; |
final++; |
illegal++; |
illegal++; |
break; |
break; |
} |
} |
|
|
if (!illegal) |
if (!illegal) |
sin6.sin6_addr.s6_addr[i++] &= *p; |
sin6.sin6_addr.s6_addr[i++] &= *p; |
else |
else |
sin6.sin6_addr.s6_addr[i++] = 0x00; |
sin6.sin6_addr.s6_addr[i++] = 0x00; |
} |
} |
|
} else |
|
masklen = 128; |
|
|
if (masklen == 0 && IN6_IS_ADDR_UNSPECIFIED(&sin6.sin6_addr)) |
if (masklen == 0 && IN6_IS_ADDR_UNSPECIFIED(&sin6.sin6_addr)) |
return("default"); |
return("default"); |