| 1209 | } |
| 1210 | |
| 1211 | static void |
| 1212 | plist() |
| 1213 | { |
| 1214 | int mib[] = { CTL_NET, PF_INET6, IPPROTO_ICMPV6, ICMPV6CTL_ND6_PRLIST }; |
| 1215 | char *buf; |
| 1216 | struct in6_prefix *p, *ep, *n; |
| 1217 | struct sockaddr_in6 *advrtr; |
| 1218 | size_t l; |
| 1219 | struct timeval now; |
| 1220 | const int niflags = NI_NUMERICHOST; |
| 1221 | int ninflags = nflag ? NI_NUMERICHOST : 0; |
| 1222 | char namebuf[NI_MAXHOST]; |
| 1223 | |
| 1224 | if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &l, NULL, 0) < 0) { |
| 1225 | err(1, "sysctl(ICMPV6CTL_ND6_PRLIST)"); |
| 1226 | /*NOTREACHED*/ |
| 1227 | } |
| 1228 | buf = malloc(l); |
| 1229 | if (!buf) { |
| 1230 | err(1, "malloc"); |
| 1231 | /*NOTREACHED*/ |
| 1232 | } |
| 1233 | if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), buf, &l, NULL, 0) < 0) { |
| 1234 | err(1, "sysctl(ICMPV6CTL_ND6_PRLIST)"); |
| 1235 | /*NOTREACHED*/ |
| 1236 | } |
| 1237 | |
| 1238 | ep = (struct in6_prefix *)(buf + l); |
| 1239 | for (p = (struct in6_prefix *)buf; p < ep; p = n) { |
| 1240 | advrtr = (struct sockaddr_in6 *)(p + 1); |
| 1241 | n = (struct in6_prefix *)&advrtr[p->advrtrs]; |
| 1242 | #ifndef FSTACK |
| 1243 | if (getnameinfo((struct sockaddr *)&p->prefix, |
| 1244 | p->prefix.sin6_len, namebuf, sizeof(namebuf), |
| 1245 | NULL, 0, niflags) != 0) |
| 1246 | #else |
| 1247 | inet_ntop(AF_INET6_LINUX, &p->prefix.sin6_addr, namebuf, sizeof(namebuf)); |
| 1248 | #endif |
| 1249 | strlcpy(namebuf, "?", sizeof(namebuf)); |
| 1250 | printf("%s/%d if=%s\n", namebuf, p->prefixlen, |
| 1251 | if_indextoname(p->if_index, ifix_buf)); |
| 1252 | |
| 1253 | gettimeofday(&now, 0); |
| 1254 | /* |
| 1255 | * meaning of fields, especially flags, is very different |
| 1256 | * by origin. notify the difference to the users. |
| 1257 | */ |
| 1258 | printf("flags=%s%s%s%s%s", |
| 1259 | p->raflags.onlink ? "L" : "", |
| 1260 | p->raflags.autonomous ? "A" : "", |
| 1261 | (p->flags & NDPRF_ONLINK) != 0 ? "O" : "", |
| 1262 | (p->flags & NDPRF_DETACHED) != 0 ? "D" : "", |
| 1263 | #ifdef NDPRF_HOME |
| 1264 | (p->flags & NDPRF_HOME) != 0 ? "H" : "" |
| 1265 | #else |
| 1266 | "" |
| 1267 | #endif |
| 1268 | ); |
no test coverage detected