ok
Florian Obser([email protected]) on 2018.04.30 18:26:46 +0200:
> Sync p_rttables() to netstat(1) version. Pointed out by claudio and
> mpi.
>
> Remaining differences are pledge and priority handling which only
> route(8) has.
>
> While here switch flushroutes to get_sysctl() function.
>
> OK?
>
> diff --git route.c route.c
> index d93374578c5..85e76621dd3 100644
> --- route.c
> +++ route.c
> @@ -281,7 +281,7 @@ int
> flushroutes(int argc, char **argv)
> {
> size_t needed;
> - int mib[7], rlen, seqno, af = AF_UNSPEC;
> + int mib[7], mcnt, rlen, seqno, af = AF_UNSPEC;
> char *buf = NULL, *next, *lim = NULL;
> struct rt_msghdr *rtm;
> struct sockaddr *sa;
> @@ -333,21 +333,10 @@ flushroutes(int argc, char **argv)
> mib[4] = NET_RT_DUMP;
> mib[5] = prio;
> mib[6] = tableid;
> - while (1) {
> - if (sysctl(mib, 7, NULL, &needed, NULL, 0) == -1)
> - err(1, "route-sysctl-estimate");
> - if (needed == 0)
> - break;
> - if ((buf = realloc(buf, needed)) == NULL)
> - err(1, "realloc");
> - if (sysctl(mib, 7, buf, &needed, NULL, 0) == -1) {
> - if (errno == ENOMEM)
> - continue;
> - err(1, "actual retrieval of routing table");
> - }
> - lim = buf + needed;
> - break;
> - }
> + mcnt = 7;
> +
> + needed = get_sysctl(mib, mcnt, &buf);
> + lim = buf + needed;
>
> if (pledge("stdio dns", NULL) == -1)
> err(1, "pledge");
> diff --git show.c show.c
> index 5898a19cd45..68731c78591 100644
> --- show.c
> +++ show.c
> @@ -107,6 +107,29 @@ char *routename6(struct sockaddr_in6 *);
> char *netname4(in_addr_t, struct sockaddr_in *);
> char *netname6(struct sockaddr_in6 *, struct sockaddr_in6 *);
>
> +size_t
> +get_sysctl(const int *mib, u_int mcnt, char **buf)
> +{
> + size_t needed;
> +
> + while (1) {
> + if (sysctl(mib, mcnt, NULL, &needed, NULL, 0) == -1)
> + err(1, "sysctl-estimate");
> + if (needed == 0)
> + break;
> + if ((*buf = realloc(*buf, needed)) == NULL)
> + err(1, NULL);
> + if (sysctl(mib, mcnt, *buf, &needed, NULL, 0) == -1) {
> + if (errno == ENOMEM)
> + continue;
> + err(1, "sysctl");
> + }
> + break;
> + }
> +
> + return needed;
> +}
> +
> /*
> * Print routing tables.
> */
> @@ -116,7 +139,7 @@ p_rttables(int af, u_int tableid, char prio)
> struct rt_msghdr *rtm;
> char *buf = NULL, *next, *lim = NULL;
> size_t needed;
> - int mib[7];
> + int mib[7], mcnt;
> struct sockaddr *sa;
>
> mib[0] = CTL_NET;
> @@ -126,22 +149,10 @@ p_rttables(int af, u_int tableid, char prio)
> mib[4] = NET_RT_DUMP;
> mib[5] = prio;
> mib[6] = tableid;
> + mcnt = 7;
>
> - while (1) {
> - if (sysctl(mib, 7, NULL, &needed, NULL, 0) == -1)
> - err(1, "route-sysctl-estimate");
> - if (needed == 0)
> - break;
> - if ((buf = realloc(buf, needed)) == NULL)
> - err(1, NULL);
> - if (sysctl(mib, 7, buf, &needed, NULL, 0) == -1) {
> - if (errno == ENOMEM)
> - continue;
> - err(1, "sysctl of routing table");
> - }
> - lim = buf + needed;
> - break;
> - }
> + needed = get_sysctl(mib, mcnt, &buf);
> + lim = buf + needed;
>
> if (pledge("stdio dns", NULL) == -1)
> err(1, "pledge");
> @@ -156,9 +167,8 @@ p_rttables(int af, u_int tableid, char prio)
> sa = (struct sockaddr *)(next + rtm->rtm_hdrlen);
> p_rtentry(rtm);
> }
> - free(buf);
> - buf = NULL;
> }
> + free(buf);
> }
>
> /*
> diff --git show.h show.h
> index 03999b7fdd7..461d5a39c5e 100644
> --- show.h
> +++ show.h
> @@ -34,6 +34,7 @@ void p_sockaddr(struct sockaddr *, struct sockaddr
> *, int, int);
> char *routename(struct sockaddr *);
> char *netname(struct sockaddr *, struct sockaddr *);
> char *mpls_op(u_int32_t);
> +size_t get_sysctl(const int *, u_int, char **);
>
> extern int nflag;
> extern int Fflag;
>
>
> --
> I'm not entirely sure you are real.
>