add a source addres length parameter to rt_addr_n2a

For some address families (like AF_PACKET) it is helpful to have the
length when prenting the address.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
Eric W. Biederman 2015-03-15 14:48:32 -05:00 committed by Stephen Hemminger
parent 11c39b5e98
commit 26dcdf3a91
11 changed files with 41 additions and 22 deletions

View File

@ -106,7 +106,7 @@ extern int af_byte_len(int af);
extern const char *format_host(int af, int len, const void *addr, extern const char *format_host(int af, int len, const void *addr,
char *buf, int buflen); char *buf, int buflen);
extern const char *rt_addr_n2a(int af, const void *addr, extern const char *rt_addr_n2a(int af, int len, const void *addr,
char *buf, int buflen); char *buf, int buflen);
void missarg(const char *) __attribute__((noreturn)); void missarg(const char *) __attribute__((noreturn));

View File

@ -415,6 +415,7 @@ static void bond_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
if (iptb[i]) if (iptb[i])
fprintf(f, "%s", fprintf(f, "%s",
rt_addr_n2a(AF_INET, rt_addr_n2a(AF_INET,
RTA_PAYLOAD(iptb[i]),
RTA_DATA(iptb[i]), RTA_DATA(iptb[i]),
buf, buf,
INET_ADDRSTRLEN)); INET_ADDRSTRLEN));

View File

@ -116,6 +116,7 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[RTA_SRC]) if (tb[RTA_SRC])
len = snprintf(obuf, sizeof(obuf), len = snprintf(obuf, sizeof(obuf),
"(%s, ", rt_addr_n2a(family, "(%s, ", rt_addr_n2a(family,
RTA_PAYLOAD(tb[RTA_SRC]),
RTA_DATA(tb[RTA_SRC]), RTA_DATA(tb[RTA_SRC]),
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
else else
@ -123,6 +124,7 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[RTA_DST]) if (tb[RTA_DST])
snprintf(obuf + len, sizeof(obuf) - len, snprintf(obuf + len, sizeof(obuf) - len,
"%s)", rt_addr_n2a(family, "%s)", rt_addr_n2a(family,
RTA_PAYLOAD(tb[RTA_DST]),
RTA_DATA(tb[RTA_DST]), RTA_DATA(tb[RTA_DST]),
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
else else

View File

@ -80,7 +80,9 @@ int print_prefix(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
pfx = (struct in6_addr *)RTA_DATA(tb[PREFIX_ADDRESS]); pfx = (struct in6_addr *)RTA_DATA(tb[PREFIX_ADDRESS]);
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "%s", rt_addr_n2a(family, pfx, fprintf(fp, "%s", rt_addr_n2a(family,
RTA_PAYLOAD(tb[PREFIX_ADDRESS]),
pfx,
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
} }
fprintf(fp, "/%u ", prefix->prefix_len); fprintf(fp, "/%u ", prefix->prefix_len);

View File

@ -339,8 +339,9 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[RTA_DST]) { if (tb[RTA_DST]) {
if (r->rtm_dst_len != host_len) { if (r->rtm_dst_len != host_len) {
fprintf(fp, "%s/%u ", rt_addr_n2a(r->rtm_family, fprintf(fp, "%s/%u ", rt_addr_n2a(r->rtm_family,
RTA_DATA(tb[RTA_DST]), RTA_PAYLOAD(tb[RTA_DST]),
abuf, sizeof(abuf)), RTA_DATA(tb[RTA_DST]),
abuf, sizeof(abuf)),
r->rtm_dst_len r->rtm_dst_len
); );
} else { } else {
@ -358,8 +359,9 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[RTA_SRC]) { if (tb[RTA_SRC]) {
if (r->rtm_src_len != host_len) { if (r->rtm_src_len != host_len) {
fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family, fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family,
RTA_DATA(tb[RTA_SRC]), RTA_PAYLOAD(tb[RTA_SRC]),
abuf, sizeof(abuf)), RTA_DATA(tb[RTA_SRC]),
abuf, sizeof(abuf)),
r->rtm_src_len r->rtm_src_len
); );
} else { } else {
@ -401,6 +403,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
*/ */
fprintf(fp, " src %s ", fprintf(fp, " src %s ",
rt_addr_n2a(r->rtm_family, rt_addr_n2a(r->rtm_family,
RTA_PAYLOAD(tb[RTA_PREFSRC]),
RTA_DATA(tb[RTA_PREFSRC]), RTA_DATA(tb[RTA_PREFSRC]),
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
} }

View File

@ -82,8 +82,9 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[FRA_SRC]) { if (tb[FRA_SRC]) {
if (r->rtm_src_len != host_len) { if (r->rtm_src_len != host_len) {
fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family, fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family,
RTA_DATA(tb[FRA_SRC]), RTA_PAYLOAD(tb[FRA_SRC]),
abuf, sizeof(abuf)), RTA_DATA(tb[FRA_SRC]),
abuf, sizeof(abuf)),
r->rtm_src_len r->rtm_src_len
); );
} else { } else {
@ -102,8 +103,9 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[FRA_DST]) { if (tb[FRA_DST]) {
if (r->rtm_dst_len != host_len) { if (r->rtm_dst_len != host_len) {
fprintf(fp, "to %s/%u ", rt_addr_n2a(r->rtm_family, fprintf(fp, "to %s/%u ", rt_addr_n2a(r->rtm_family,
RTA_DATA(tb[FRA_DST]), RTA_PAYLOAD(tb[FRA_DST]),
abuf, sizeof(abuf)), RTA_DATA(tb[FRA_DST]),
abuf, sizeof(abuf)),
r->rtm_dst_len r->rtm_dst_len
); );
} else { } else {

View File

@ -343,7 +343,7 @@ static void print_tunnel(struct ip_tunnel_parm *p)
p->name, p->name,
tnl_strproto(p->iph.protocol), tnl_strproto(p->iph.protocol),
p->iph.daddr ? format_host(AF_INET, 4, &p->iph.daddr, s1, sizeof(s1)) : "any", p->iph.daddr ? format_host(AF_INET, 4, &p->iph.daddr, s1, sizeof(s1)) : "any",
p->iph.saddr ? rt_addr_n2a(AF_INET, &p->iph.saddr, s2, sizeof(s2)) : "any"); p->iph.saddr ? rt_addr_n2a(AF_INET, 4, &p->iph.saddr, s2, sizeof(s2)) : "any");
if (p->iph.protocol == IPPROTO_IPV6 && (p->i_flags & SIT_ISATAP)) { if (p->iph.protocol == IPPROTO_IPV6 && (p->i_flags & SIT_ISATAP)) {
struct ip_tunnel_prl prl[16]; struct ip_tunnel_prl prl[16];

View File

@ -288,10 +288,10 @@ void xfrm_id_info_print(xfrm_address_t *saddr, struct xfrm_id *id,
fputs(title, fp); fputs(title, fp);
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "src %s ", rt_addr_n2a(family, fprintf(fp, "src %s ", rt_addr_n2a(family, sizeof(*saddr),
saddr, abuf, sizeof(abuf))); saddr, abuf, sizeof(abuf)));
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "dst %s", rt_addr_n2a(family, fprintf(fp, "dst %s", rt_addr_n2a(family, sizeof(id->daddr),
&id->daddr, abuf, sizeof(abuf))); &id->daddr, abuf, sizeof(abuf)));
fprintf(fp, "%s", _SL_); fprintf(fp, "%s", _SL_);
@ -455,11 +455,15 @@ void xfrm_selector_print(struct xfrm_selector *sel, __u16 family,
fputs(prefix, fp); fputs(prefix, fp);
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "src %s/%u ", rt_addr_n2a(f, &sel->saddr, abuf, sizeof(abuf)), fprintf(fp, "src %s/%u ",
rt_addr_n2a(f, sizeof(sel->saddr), &sel->saddr,
abuf, sizeof(abuf)),
sel->prefixlen_s); sel->prefixlen_s);
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "dst %s/%u ", rt_addr_n2a(f, &sel->daddr, abuf, sizeof(abuf)), fprintf(fp, "dst %s/%u ",
rt_addr_n2a(f, sizeof(sel->daddr), &sel->daddr,
abuf, sizeof(abuf)),
sel->prefixlen_d); sel->prefixlen_d);
if (sel->proto) if (sel->proto)
@ -755,7 +759,8 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "addr %s", fprintf(fp, "addr %s",
rt_addr_n2a(family, &e->encap_oa, abuf, sizeof(abuf))); rt_addr_n2a(family, sizeof(e->encap_oa), &e->encap_oa,
abuf, sizeof(abuf)));
fprintf(fp, "%s", _SL_); fprintf(fp, "%s", _SL_);
} }
@ -783,7 +788,7 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "%s", fprintf(fp, "%s",
rt_addr_n2a(family, coa, rt_addr_n2a(family, sizeof(*coa), coa,
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
fprintf(fp, "%s", _SL_); fprintf(fp, "%s", _SL_);
} }

View File

@ -285,6 +285,7 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb
if (tb[IFLA_IPTUN_REMOTE]) { if (tb[IFLA_IPTUN_REMOTE]) {
fprintf(f, "remote %s ", fprintf(f, "remote %s ",
rt_addr_n2a(AF_INET6, rt_addr_n2a(AF_INET6,
RTA_PAYLOAD(tb[IFLA_IPTUN_REMOTE]),
RTA_DATA(tb[IFLA_IPTUN_REMOTE]), RTA_DATA(tb[IFLA_IPTUN_REMOTE]),
s1, sizeof(s1))); s1, sizeof(s1)));
} }
@ -292,6 +293,7 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb
if (tb[IFLA_IPTUN_LOCAL]) { if (tb[IFLA_IPTUN_LOCAL]) {
fprintf(f, "local %s ", fprintf(f, "local %s ",
rt_addr_n2a(AF_INET6, rt_addr_n2a(AF_INET6,
RTA_PAYLOAD(tb[IFLA_IPTUN_LOCAL]),
RTA_DATA(tb[IFLA_IPTUN_LOCAL]), RTA_DATA(tb[IFLA_IPTUN_LOCAL]),
s1, sizeof(s1))); s1, sizeof(s1)));
} }

View File

@ -227,7 +227,8 @@ static void xfrm_usersa_print(const struct xfrm_usersa_id *sa_id, __u32 reqid, F
buf[0] = 0; buf[0] = 0;
fprintf(fp, "dst %s ", fprintf(fp, "dst %s ",
rt_addr_n2a(sa_id->family, &sa_id->daddr, buf, sizeof(buf))); rt_addr_n2a(sa_id->family, sizeof(sa_id->daddr), &sa_id->daddr,
buf, sizeof(buf)));
fprintf(fp, " reqid 0x%x", reqid); fprintf(fp, " reqid 0x%x", reqid);
@ -246,7 +247,8 @@ static int xfrm_ae_print(const struct sockaddr_nl *who,
xfrm_ae_flags_print(id->flags, arg); xfrm_ae_flags_print(id->flags, arg);
fprintf(fp,"\n\t"); fprintf(fp,"\n\t");
memset(abuf, '\0', sizeof(abuf)); memset(abuf, '\0', sizeof(abuf));
fprintf(fp, "src %s ", rt_addr_n2a(id->sa_id.family, &id->saddr, fprintf(fp, "src %s ", rt_addr_n2a(id->sa_id.family,
sizeof(id->saddr), &id->saddr,
abuf, sizeof(abuf))); abuf, sizeof(abuf)));
xfrm_usersa_print(&id->sa_id, id->reqid, fp); xfrm_usersa_print(&id->sa_id, id->reqid, fp);
@ -262,7 +264,7 @@ static void xfrm_print_addr(FILE *fp, int family, xfrm_address_t *a)
char buf[256]; char buf[256];
buf[0] = 0; buf[0] = 0;
fprintf(fp, "%s", rt_addr_n2a(family, a, buf, sizeof(buf))); fprintf(fp, "%s", rt_addr_n2a(family, sizeof(*a), a, buf, sizeof(buf)));
} }
static int xfrm_mapping_print(const struct sockaddr_nl *who, static int xfrm_mapping_print(const struct sockaddr_nl *who,

View File

@ -636,7 +636,7 @@ int __get_user_hz(void)
return sysconf(_SC_CLK_TCK); return sysconf(_SC_CLK_TCK);
} }
const char *rt_addr_n2a(int af, const void *addr, char *buf, int buflen) const char *rt_addr_n2a(int af, int len, const void *addr, char *buf, int buflen)
{ {
switch (af) { switch (af) {
case AF_INET: case AF_INET:
@ -723,7 +723,7 @@ const char *format_host(int af, int len, const void *addr,
return n; return n;
} }
#endif #endif
return rt_addr_n2a(af, addr, buf, buflen); return rt_addr_n2a(af, len, addr, buf, buflen);
} }