forked from mirrors/linux
		
	printk: add %I4, %I6, %i4, %i6 format specifiers
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>
This commit is contained in:
		
							parent
							
								
									96631ed16c
								
							
						
					
					
						commit
						4aa996066f
					
				
					 1 changed files with 31 additions and 0 deletions
				
			
		| 
						 | 
					@ -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);
 | 
						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
 | 
					 * Show a '%p' thing.  A kernel extension is that the '%p' is followed
 | 
				
			||||||
 * by an extra set of alphanumeric characters that are extended format
 | 
					 * 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)
 | 
					 *       addresses (not the name nor the flags)
 | 
				
			||||||
 * - 'M' For a 6-byte MAC address, it prints the address in the
 | 
					 * - 'M' For a 6-byte MAC address, it prints the address in the
 | 
				
			||||||
 *       usual colon-separated hex notation
 | 
					 *       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
 | 
					 * - '6' For a IPv6 address prints the address in network-ordered 16 bit hex
 | 
				
			||||||
 *       with colon separators
 | 
					 *       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);
 | 
							return mac_address_string(buf, end, ptr, field_width, precision, flags);
 | 
				
			||||||
	case '6':
 | 
						case '6':
 | 
				
			||||||
		return ip6_addr_string(buf, end, ptr, field_width, precision, flags);
 | 
							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;
 | 
						flags |= SMALL;
 | 
				
			||||||
	if (field_width == -1) {
 | 
						if (field_width == -1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue