printk: add %I4, %I6, %i4, %i6 format specifiers
authorHarvey Harrison <harvey.harrison@gmail.com>
Wed, 29 Oct 2008 19:49:58 +0000 (12:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Oct 2008 19:49:58 +0000 (12:49 -0700)
For use in printing IPv4, or IPv6 addresses in the usual way:

%i4 and %I4 are currently equivalent and print the address in
dot-separated decimal x.x.x.x

%I6 prints 16-bit network order hex with colon separators:
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

%i6 omits the colons.

Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
lib/vsprintf.c

index cb5bc04ff82b460419c42bcda7b15c339cec01dd..a8630063d14df2d9d442ed3543e9f8289874d93f 100644 (file)
@@ -616,6 +616,23 @@ static char *ip6_addr_string(char *buf, char *end, u8 *addr, int field_width,
        return string(buf, end, ip6_addr, field_width, precision, flags & ~SPECIAL);
 }
 
+static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width,
+                        int precision, int flags)
+{
+       char ip4_addr[4 * 4]; /* (4 * 3 decimal digits), 3 dots and trailing zero */
+       char *p = ip4_addr;
+       int i;
+
+       for (i = 0; i < 4; i++) {
+               p = put_dec_trunc(p, addr[i]);
+               if (i != 3)
+                       *p++ = '.';
+       }
+       *p = '\0';
+
+       return string(buf, end, ip4_addr, field_width, precision, flags & ~SPECIAL);
+}
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * 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,
  *       addresses (not the name nor the flags)
  * - 'M' For a 6-byte MAC address, it prints the address in the
  *       usual colon-separated hex notation
+ * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way (dot-separated
+ *       decimal for v4 and colon separated network-order 16 bit hex for v6)
+ * - 'i' [46] for 'raw' IPv4/IPv6 addresses, IPv6 omits the colons, IPv4 is
+         currently the same
  * - '6' For a IPv6 address prints the address in network-ordered 16 bit hex
  *       with colon separators
  *
@@ -650,6 +671,16 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field
                return mac_address_string(buf, end, ptr, field_width, precision, flags);
        case '6':
                return ip6_addr_string(buf, end, ptr, field_width, precision, flags);
+       case 'i':
+               flags |= SPECIAL;
+               /* Fallthrough */
+       case 'I':
+               if (fmt[1] == '6')
+                       return ip6_addr_string(buf, end, ptr, field_width, precision, flags);
+               if (fmt[1] == '4')
+                       return ip4_addr_string(buf, end, ptr, field_width, precision, flags);
+               flags &= ~SPECIAL;
+               break;
        }
        flags |= SMALL;
        if (field_width == -1) {