| 405 | } |
| 406 | |
| 407 | const char * |
| 408 | fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags) |
| 409 | { |
| 410 | static char buf[128]; |
| 411 | const char *cp; |
| 412 | |
| 413 | if (sa == NULL) |
| 414 | return ("null"); |
| 415 | |
| 416 | switch(sa->sa_family) { |
| 417 | #ifdef INET6 |
| 418 | case AF_INET6: |
| 419 | /* |
| 420 | * The sa6->sin6_scope_id must be filled here because |
| 421 | * this sockaddr is extracted from kmem(4) directly |
| 422 | * and has KAME-specific embedded scope id in |
| 423 | * sa6->sin6_addr.s6_addr[2]. |
| 424 | */ |
| 425 | in6_fillscopeid(satosin6(sa)); |
| 426 | /* FALLTHROUGH */ |
| 427 | #endif /*INET6*/ |
| 428 | case AF_INET: |
| 429 | if (flags & RTF_HOST) |
| 430 | cp = routename(sa, numeric_addr); |
| 431 | else if (mask) |
| 432 | cp = netname(sa, mask); |
| 433 | else |
| 434 | cp = netname(sa, NULL); |
| 435 | break; |
| 436 | case AF_NETGRAPH: |
| 437 | { |
| 438 | strlcpy(buf, ((struct sockaddr_ng *)sa)->sg_data, |
| 439 | sizeof(buf)); |
| 440 | cp = buf; |
| 441 | break; |
| 442 | } |
| 443 | case AF_LINK: |
| 444 | { |
| 445 | #if 0 |
| 446 | struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; |
| 447 | |
| 448 | /* Interface route. */ |
| 449 | if (sdl->sdl_nlen) |
| 450 | cp = sdl->sdl_data; |
| 451 | else |
| 452 | #endif |
| 453 | cp = routename(sa, 1); |
| 454 | break; |
| 455 | } |
| 456 | default: |
| 457 | { |
| 458 | u_char *s = (u_char *)sa->sa_data, *slim; |
| 459 | char *cq, *cqlim; |
| 460 | |
| 461 | cq = buf; |
| 462 | slim = sa->sa_len + (u_char *) sa; |
| 463 | cqlim = cq + sizeof(buf) - sizeof(" ffff"); |
| 464 | snprintf(cq, sizeof(buf), "(%d)", sa->sa_family); |
no test coverage detected