| 1418 | } |
| 1419 | |
| 1420 | static int |
| 1421 | prefixlen(const char *str) |
| 1422 | { |
| 1423 | int len = atoi(str), q, r; |
| 1424 | int max; |
| 1425 | char *p; |
| 1426 | |
| 1427 | rtm_addrs |= RTA_NETMASK; |
| 1428 | switch (af) { |
| 1429 | #ifdef INET6 |
| 1430 | case AF_INET6: |
| 1431 | { |
| 1432 | struct sockaddr_in6 *sin6 = |
| 1433 | (struct sockaddr_in6 *)&so[RTAX_NETMASK]; |
| 1434 | |
| 1435 | max = 128; |
| 1436 | p = (char *)&sin6->sin6_addr; |
| 1437 | sin6->sin6_family = AF_INET6; |
| 1438 | sin6->sin6_len = sizeof(*sin6); |
| 1439 | break; |
| 1440 | } |
| 1441 | #endif |
| 1442 | #ifdef INET |
| 1443 | case AF_INET: |
| 1444 | { |
| 1445 | struct sockaddr_in *sin = |
| 1446 | (struct sockaddr_in *)&so[RTAX_NETMASK]; |
| 1447 | |
| 1448 | max = 32; |
| 1449 | p = (char *)&sin->sin_addr; |
| 1450 | sin->sin_family = AF_INET; |
| 1451 | sin->sin_len = sizeof(*sin); |
| 1452 | break; |
| 1453 | } |
| 1454 | #endif |
| 1455 | default: |
| 1456 | errx(EX_OSERR, "prefixlen not supported in this af"); |
| 1457 | } |
| 1458 | |
| 1459 | if (len < 0 || max < len) |
| 1460 | errx(EX_USAGE, "%s: invalid prefixlen", str); |
| 1461 | |
| 1462 | q = len >> 3; |
| 1463 | r = len & 7; |
| 1464 | memset((void *)p, 0, max / 8); |
| 1465 | if (q > 0) |
| 1466 | memset((void *)p, 0xff, q); |
| 1467 | if (r > 0) |
| 1468 | *((u_char *)p + q) = (0xff00 >> r) & 0xff; |
| 1469 | if (len == max) |
| 1470 | return (-1); |
| 1471 | else |
| 1472 | return (len); |
| 1473 | } |
| 1474 | |
| 1475 | #ifndef FSTACK |
| 1476 | static void |
no test coverage detected