diff options
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index cb5bc04ff82b..a8630063d14d 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -616,6 +616,23 @@ static char *ip6_addr_string(char *buf, char *end, u8 *addr, int field_width, | |||
616 | return string(buf, end, ip6_addr, field_width, precision, flags & ~SPECIAL); | 616 | return string(buf, end, ip6_addr, field_width, precision, flags & ~SPECIAL); |
617 | } | 617 | } |
618 | 618 | ||
619 | static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width, | ||
620 | int precision, int flags) | ||
621 | { | ||
622 | char ip4_addr[4 * 4]; /* (4 * 3 decimal digits), 3 dots and trailing zero */ | ||
623 | char *p = ip4_addr; | ||
624 | int i; | ||
625 | |||
626 | for (i = 0; i < 4; i++) { | ||
627 | p = put_dec_trunc(p, addr[i]); | ||
628 | if (i != 3) | ||
629 | *p++ = '.'; | ||
630 | } | ||
631 | *p = '\0'; | ||
632 | |||
633 | return string(buf, end, ip4_addr, field_width, precision, flags & ~SPECIAL); | ||
634 | } | ||
635 | |||
619 | /* | 636 | /* |
620 | * Show a '%p' thing. A kernel extension is that the '%p' is followed | 637 | * Show a '%p' thing. A kernel extension is that the '%p' is followed |
621 | * by an extra set of alphanumeric characters that are extended format | 638 | * by an extra set of alphanumeric characters that are extended format |
@@ -629,6 +646,10 @@ static char *ip6_addr_string(char *buf, char *end, u8 *addr, int field_width, | |||
629 | * addresses (not the name nor the flags) | 646 | * addresses (not the name nor the flags) |
630 | * - 'M' For a 6-byte MAC address, it prints the address in the | 647 | * - 'M' For a 6-byte MAC address, it prints the address in the |
631 | * usual colon-separated hex notation | 648 | * usual colon-separated hex notation |
649 | * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way (dot-separated | ||
650 | * decimal for v4 and colon separated network-order 16 bit hex for v6) | ||
651 | * - 'i' [46] for 'raw' IPv4/IPv6 addresses, IPv6 omits the colons, IPv4 is | ||
652 | currently the same | ||
632 | * - '6' For a IPv6 address prints the address in network-ordered 16 bit hex | 653 | * - '6' For a IPv6 address prints the address in network-ordered 16 bit hex |
633 | * with colon separators | 654 | * with colon separators |
634 | * | 655 | * |
@@ -650,6 +671,16 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field | |||
650 | return mac_address_string(buf, end, ptr, field_width, precision, flags); | 671 | return mac_address_string(buf, end, ptr, field_width, precision, flags); |
651 | case '6': | 672 | case '6': |
652 | return ip6_addr_string(buf, end, ptr, field_width, precision, flags); | 673 | return ip6_addr_string(buf, end, ptr, field_width, precision, flags); |
674 | case 'i': | ||
675 | flags |= SPECIAL; | ||
676 | /* Fallthrough */ | ||
677 | case 'I': | ||
678 | if (fmt[1] == '6') | ||
679 | return ip6_addr_string(buf, end, ptr, field_width, precision, flags); | ||
680 | if (fmt[1] == '4') | ||
681 | return ip4_addr_string(buf, end, ptr, field_width, precision, flags); | ||
682 | flags &= ~SPECIAL; | ||
683 | break; | ||
653 | } | 684 | } |
654 | flags |= SMALL; | 685 | flags |= SMALL; |
655 | if (field_width == -1) { | 686 | if (field_width == -1) { |