Subject: Re: [IPV6]: ROUTE:read ifname in rt6_info_route()

From: Brian Haley <[email-masked]>
Date: Thu, 16 Apr 2009 12:17:28 -0400

Stephen Hemminger wrote:
> On Thu, 16 Apr 2009 04:38:00 -0700 (PDT)
> David Miller <[email-masked]> wrote:
> 
>> From: Yuta sugiura <[email-masked]>
>> Date: Thu, 16 Apr 2009 20:05:05 +0900
>>
>>> Hi,
>>> I have a suggestion about /proc/net/IPv6_route format.
>>> In rt6_info_route(), interface name is treated as a maximum 8
>>> characters.
>>> But the type of (struct rt6_inf *)->u.dst.dev->name is char[IFNAMESIZ=
>>> 16]
>>> so, I think that it should change "%8s" to "%16s".
>> Isn't there a way to pass the field length as a paramenter
>> to formatting functions?  Then we can just pass in
>> IFNAMESIZE as that parameter.
> 
> 	seq_printf(m, " %08x %08x %08x %08x %*s\n"
>                    rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt),
>  		   rt->u.dst.__use, rt->rt6i_flags,
>                    IFNAMESIZE, 
>  		   rt->rt6i_dev ? rt->rt6i_dev->name : "")

Does the kernel actually truncate an interface name more than 8 chars long in
the original version?  I did a quick test in userspace and found that

	printf("%*s\n", 1, "foo");

prints:

foo

I think the width specifier is used for *minimum* width, not maximum.

-Brian