libiproute: make rt_addr_n2a() and format_host() return auto strings
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 14 Oct 2015 11:56:42 +0000 (13:56 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 14 Oct 2015 11:56:42 +0000 (13:56 +0200)
function                                             old     new   delta
rt_addr_n2a                                           56      53      -3
print_addrinfo                                      1227    1178     -49
print_neigh                                          933     881     -52
print_rule                                           689     617     -72
print_tunnel                                         640     560     -80
print_route                                         1727    1588    -139
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/6 up/down: 0/-395)           Total: -395 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/libiproute/ipaddress.c
networking/libiproute/ipneigh.c
networking/libiproute/iproute.c
networking/libiproute/iprule.c
networking/libiproute/iptunnel.c
networking/libiproute/utils.c
networking/libiproute/utils.h

index c0f27c70ded11b1671206e0c29e2e10b759eecb4..5c975d8c5198eb2669c1eaebf510d7a10565f48b 100644 (file)
@@ -214,8 +214,7 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
 {
        struct ifaddrmsg *ifa = NLMSG_DATA(n);
        int len = n->nlmsg_len;
-       struct rtattr * rta_tb[IFA_MAX+1];
-       char abuf[256];
+       struct rtattr *rta_tb[IFA_MAX+1];
 
        if (n->nlmsg_type != RTM_NEWADDR && n->nlmsg_type != RTM_DELADDR)
                return 0;
@@ -291,9 +290,9 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
                printf("    family %d ", ifa->ifa_family);
 
        if (rta_tb[IFA_LOCAL]) {
-               fputs(rt_addr_n2a(ifa->ifa_family,
-                                             RTA_DATA(rta_tb[IFA_LOCAL]),
-                                             abuf, sizeof(abuf)), stdout);
+               fputs(rt_addr_n2a(ifa->ifa_family, RTA_DATA(rta_tb[IFA_LOCAL])),
+                       stdout
+               );
 
                if (rta_tb[IFA_ADDRESS] == NULL
                 || memcmp(RTA_DATA(rta_tb[IFA_ADDRESS]), RTA_DATA(rta_tb[IFA_LOCAL]), 4) == 0
@@ -301,25 +300,22 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
                        printf("/%d ", ifa->ifa_prefixlen);
                } else {
                        printf(" peer %s/%d ",
-                               rt_addr_n2a(ifa->ifa_family,
-                                           RTA_DATA(rta_tb[IFA_ADDRESS]),
-                                           abuf, sizeof(abuf)),
-                               ifa->ifa_prefixlen);
+                               rt_addr_n2a(ifa->ifa_family, RTA_DATA(rta_tb[IFA_ADDRESS])),
+                               ifa->ifa_prefixlen
+                       );
                }
        }
 
        if (rta_tb[IFA_BROADCAST]) {
                printf("brd %s ",
                        rt_addr_n2a(ifa->ifa_family,
-                                       RTA_DATA(rta_tb[IFA_BROADCAST]),
-                                       abuf, sizeof(abuf))
+                               RTA_DATA(rta_tb[IFA_BROADCAST]))
                );
        }
        if (rta_tb[IFA_ANYCAST]) {
                printf("any %s ",
                        rt_addr_n2a(ifa->ifa_family,
-                                       RTA_DATA(rta_tb[IFA_ANYCAST]),
-                                       abuf, sizeof(abuf))
+                               RTA_DATA(rta_tb[IFA_ANYCAST]))
                );
        }
        printf("scope %s ", rtnl_rtscope_n2a(ifa->ifa_scope));
index 6588c12f1a09a0ba648eed0019416f7f4258414e..179505c2de41f328090826761fe149a69aefe235 100644 (file)
@@ -91,7 +91,6 @@ static int FAST_FUNC print_neigh(const struct sockaddr_nl *who UNUSED_PARAM,
        struct ndmsg *r = NLMSG_DATA(n);
        int len = n->nlmsg_len;
        struct rtattr *tb[NDA_MAX+1];
-       char abuf[256];
 
        if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH) {
                bb_error_msg_and_die("not RTM_NEWNEIGH: %08x %08x %08x",
@@ -155,8 +154,8 @@ static int FAST_FUNC print_neigh(const struct sockaddr_nl *who UNUSED_PARAM,
                printf("%s ",
                       format_host(r->ndm_family,
                                   RTA_PAYLOAD(tb[NDA_DST]),
-                                  RTA_DATA(tb[NDA_DST]),
-                                  abuf, sizeof(abuf)));
+                                  RTA_DATA(tb[NDA_DST]))
+               );
        }
        if (!G_filter.index && r->ndm_ifindex)
                printf("dev %s ", ll_index_to_name(r->ndm_ifindex));
index 0d291440547dfb5e30ec7b5f4137bef98e511abd..d232ee6fd6fe296a6cc1b3afa14d24212ba73d25 100644 (file)
@@ -61,7 +61,6 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
        struct rtmsg *r = NLMSG_DATA(n);
        int len = n->nlmsg_len;
        struct rtattr *tb[RTA_MAX+1];
-       char abuf[256];
        inet_prefix dst;
        inet_prefix src;
        int host_len = -1;
@@ -218,17 +217,15 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
 
        if (tb[RTA_DST]) {
                if (r->rtm_dst_len != host_len) {
-                       printf("%s/%u ", rt_addr_n2a(r->rtm_family,
-                                               RTA_DATA(tb[RTA_DST]),
-                                               abuf, sizeof(abuf)),
-                                       r->rtm_dst_len
-                                       );
+                       printf("%s/%u ",
+                               rt_addr_n2a(r->rtm_family, RTA_DATA(tb[RTA_DST])),
+                               r->rtm_dst_len
+                       );
                } else {
                        printf("%s ", format_host(r->rtm_family,
                                                RTA_PAYLOAD(tb[RTA_DST]),
-                                               RTA_DATA(tb[RTA_DST]),
-                                               abuf, sizeof(abuf))
-                                       );
+                                               RTA_DATA(tb[RTA_DST]))
+                       );
                }
        } else if (r->rtm_dst_len) {
                printf("0/%d ", r->rtm_dst_len);
@@ -237,17 +234,15 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
        }
        if (tb[RTA_SRC]) {
                if (r->rtm_src_len != host_len) {
-                       printf("from %s/%u ", rt_addr_n2a(r->rtm_family,
-                                               RTA_DATA(tb[RTA_SRC]),
-                                               abuf, sizeof(abuf)),
-                                       r->rtm_src_len
-                                       );
+                       printf("from %s/%u ",
+                               rt_addr_n2a(r->rtm_family, RTA_DATA(tb[RTA_SRC])),
+                               r->rtm_src_len
+                       );
                } else {
                        printf("from %s ", format_host(r->rtm_family,
                                                RTA_PAYLOAD(tb[RTA_SRC]),
-                                               RTA_DATA(tb[RTA_SRC]),
-                                               abuf, sizeof(abuf))
-                                       );
+                                               RTA_DATA(tb[RTA_SRC]))
+                       );
                }
        } else if (r->rtm_src_len) {
                printf("from 0/%u ", r->rtm_src_len);
@@ -255,8 +250,8 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
        if (tb[RTA_GATEWAY] && G_filter.rvia.bitlen != host_len) {
                printf("via %s ", format_host(r->rtm_family,
                                        RTA_PAYLOAD(tb[RTA_GATEWAY]),
-                                       RTA_DATA(tb[RTA_GATEWAY]),
-                                       abuf, sizeof(abuf)));
+                                       RTA_DATA(tb[RTA_GATEWAY]))
+               );
        }
        if (tb[RTA_OIF]) {
                printf("dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
@@ -269,8 +264,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
                   and symbolic name will not be useful.
                 */
                printf(" src %s ", rt_addr_n2a(r->rtm_family,
-                                       RTA_DATA(tb[RTA_PREFSRC]),
-                                       abuf, sizeof(abuf)));
+                                       RTA_DATA(tb[RTA_PREFSRC])));
        }
        if (tb[RTA_PRIORITY]) {
                printf(" metric %d ", *(uint32_t*)RTA_DATA(tb[RTA_PRIORITY]));
index c3b2109829d52080757ed9016b7126f57065c0d2..dba64346f382899d1f054301c07f494680c762c7 100644 (file)
@@ -44,7 +44,6 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM,
        int len = n->nlmsg_len;
        int host_len = -1;
        struct rtattr * tb[RTA_MAX+1];
-       char abuf[256];
 
        if (n->nlmsg_type != RTM_NEWRULE)
                return 0;
@@ -71,16 +70,14 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM,
        printf("from ");
        if (tb[RTA_SRC]) {
                if (r->rtm_src_len != host_len) {
-                       printf("%s/%u", rt_addr_n2a(r->rtm_family,
-                                                       RTA_DATA(tb[RTA_SRC]),
-                                                       abuf, sizeof(abuf)),
+                       printf("%s/%u",
+                               rt_addr_n2a(r->rtm_family, RTA_DATA(tb[RTA_SRC])),
                                r->rtm_src_len
                        );
                } else {
                        fputs(format_host(r->rtm_family,
                                                RTA_PAYLOAD(tb[RTA_SRC]),
-                                               RTA_DATA(tb[RTA_SRC]),
-                                               abuf, sizeof(abuf)),
+                                               RTA_DATA(tb[RTA_SRC])),
                                stdout
                        );
                }
@@ -94,15 +91,13 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM,
        if (tb[RTA_DST]) {
                if (r->rtm_dst_len != host_len) {
                        printf("to %s/%u ", rt_addr_n2a(r->rtm_family,
-                                                        RTA_DATA(tb[RTA_DST]),
-                                                        abuf, sizeof(abuf)),
+                                                        RTA_DATA(tb[RTA_DST])),
                                r->rtm_dst_len
                                );
                } else {
                        printf("to %s ", format_host(r->rtm_family,
                                                       RTA_PAYLOAD(tb[RTA_DST]),
-                                                      RTA_DATA(tb[RTA_DST]),
-                                                      abuf, sizeof(abuf)));
+                                                      RTA_DATA(tb[RTA_DST])));
                }
        } else if (r->rtm_dst_len) {
                printf("to 0/%d ", r->rtm_dst_len);
@@ -139,8 +134,8 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM,
                        printf("map-to %s ",
                                format_host(r->rtm_family,
                                            RTA_PAYLOAD(tb[RTA_GATEWAY]),
-                                           RTA_DATA(tb[RTA_GATEWAY]),
-                                           abuf, sizeof(abuf)));
+                                           RTA_DATA(tb[RTA_GATEWAY]))
+                       );
                } else
                        printf("masquerade");
        } else if (r->rtm_type != RTN_UNICAST)
index b88c3a40137a03e9ad247b7109aa9c76fc26322d..eb136e435d837d9b46ccae1d608aeb887b80a977 100644 (file)
@@ -404,22 +404,18 @@ static int do_del(char **argv)
 
 static void print_tunnel(struct ip_tunnel_parm *p)
 {
-       char s1[256];
-       char s2[256];
-       char s3[64];
-       char s4[64];
-
-       format_host(AF_INET, 4, &p->iph.daddr, s1, sizeof(s1));
-       format_host(AF_INET, 4, &p->iph.saddr, s2, sizeof(s2));
-       inet_ntop(AF_INET, &p->i_key, s3, sizeof(s3));
-       inet_ntop(AF_INET, &p->o_key, s4, sizeof(s4));
+       char s3[INET_ADDRSTRLEN];
+       char s4[INET_ADDRSTRLEN];
 
        printf("%s: %s/ip  remote %s  local %s ",
-              p->name,
-              p->iph.protocol == IPPROTO_IPIP ? "ip" :
-              (p->iph.protocol == IPPROTO_GRE ? "gre" :
-               (p->iph.protocol == IPPROTO_IPV6 ? "ipv6" : "unknown")),
-              p->iph.daddr ? s1 : "any", p->iph.saddr ? s2 : "any");
+               p->name,
+               p->iph.protocol == IPPROTO_IPIP ? "ip" :
+                       p->iph.protocol == IPPROTO_GRE ? "gre" :
+                       p->iph.protocol == IPPROTO_IPV6 ? "ipv6" :
+                       "unknown",
+               p->iph.daddr ? format_host(AF_INET, 4, &p->iph.daddr) : "any",
+               p->iph.saddr ? format_host(AF_INET, 4, &p->iph.saddr) : "any"
+       );
        if (p->link) {
                char *n = do_ioctl_get_ifname(p->link);
                if (n) {
@@ -442,9 +438,11 @@ static void print_tunnel(struct ip_tunnel_parm *p)
        if (!(p->iph.frag_off & htons(IP_DF)))
                printf(" nopmtudisc");
 
+       inet_ntop(AF_INET, &p->i_key, s3, sizeof(s3));
+       inet_ntop(AF_INET, &p->o_key, s4, sizeof(s4));
        if ((p->i_flags & GRE_KEY) && (p->o_flags & GRE_KEY) && p->o_key == p->i_key)
                printf(" key %s", s3);
-       else if ((p->i_flags | p->o_flags) & GRE_KEY) {
+       else {
                if (p->i_flags & GRE_KEY)
                        printf(" ikey %s ", s3);
                if (p->o_flags & GRE_KEY)
index 7f7cb420320ef631a696f3398fd8d2a9cfb05a59..42025bc669015f0ac56ab08a3f02df73f9e32ae7 100644 (file)
@@ -276,20 +276,21 @@ int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits)
        return 0;
 }
 
-const char *rt_addr_n2a(int af,
-               void *addr, char *buf, int buflen)
+const char *rt_addr_n2a(int af, void *addr)
 {
        switch (af) {
        case AF_INET:
        case AF_INET6:
-               return inet_ntop(af, addr, buf, buflen);
+               return inet_ntop(af, addr,
+                       auto_string(xzalloc(INET6_ADDRSTRLEN)), INET6_ADDRSTRLEN
+               );
        default:
                return "???";
        }
 }
 
 #ifdef RESOLVE_HOSTNAMES
-const char *format_host(int af, int len, void *addr, char *buf, int buflen)
+const char *format_host(int af, int len, void *addr)
 {
        if (resolve_hosts) {
                struct hostent *h_ent;
@@ -308,11 +309,10 @@ const char *format_host(int af, int len, void *addr, char *buf, int buflen)
                if (len > 0) {
                        h_ent = gethostbyaddr(addr, len, af);
                        if (h_ent != NULL) {
-                               safe_strncpy(buf, h_ent->h_name, buflen);
-                               return buf;
+                               return auto_string(xstrdup(h_ent->h_name));
                        }
                }
        }
-       return rt_addr_n2a(af, addr, buf, buflen);
+       return rt_addr_n2a(af, addr);
 }
 #endif
index 9bbed6481df1f711f33d54d7027946e91bfe2381..408d5f65ffd5ccc5c095b14f9911474d8555369b 100644 (file)
@@ -66,12 +66,12 @@ extern unsigned get_unsigned(char *arg, const char *errmsg);
 extern uint32_t get_u32(char *arg, const char *errmsg);
 extern uint16_t get_u16(char *arg, const char *errmsg);
 
-extern const char *rt_addr_n2a(int af, void *addr, char *buf, int buflen);
+extern const char *rt_addr_n2a(int af, void *addr);
 #ifdef RESOLVE_HOSTNAMES
-extern const char *format_host(int af, int len, void *addr, char *buf, int buflen);
+extern const char *format_host(int af, int len, void *addr);
 #else
-#define format_host(af, len, addr, buf, buflen) \
-       rt_addr_n2a(af, addr, buf, buflen)
+#define format_host(af, len, addr) \
+       rt_addr_n2a(af, addr)
 #endif
 
 void invarg_1_to_2(const char *, const char *) NORETURN;