=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/netstat/show.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/netstat/show.c 2015/02/06 03:22:00 1.45 --- src/usr.bin/netstat/show.c 2015/02/09 12:25:03 1.46 *************** *** 1,4 **** ! /* $OpenBSD: show.c,v 1.45 2015/02/06 03:22:00 reyk Exp $ */ /* $NetBSD: show.c,v 1.1 1996/11/15 18:01:41 gwr Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: show.c,v 1.46 2015/02/09 12:25:03 claudio Exp $ */ /* $NetBSD: show.c,v 1.1 1996/11/15 18:01:41 gwr Exp $ */ /* *************** *** 103,108 **** --- 103,131 ---- char *routename4(in_addr_t); char *routename6(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. */ *************** *** 123,143 **** mib[5] = 0; mib[6] = tableid; mcnt = 7; ! while (1) { ! if (sysctl(mib, mcnt, 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, mcnt, buf, &needed, NULL, 0) == -1) { ! if (errno == ENOMEM) ! continue; ! err(1, "sysctl of routing table"); ! } ! lim = buf + needed; ! break; ! } printf("Routing tables\n"); --- 146,154 ---- mib[5] = 0; mib[6] = tableid; mcnt = 7; ! ! needed = get_sysctl(mib, mcnt, &buf); ! lim = buf + needed; printf("Routing tables\n");