summaryrefslogtreecommitdiffstats
path: root/sbin/route
diff options
context:
space:
mode:
authorambrisko <ambrisko@FreeBSD.org>2004-04-30 22:34:12 +0000
committerambrisko <ambrisko@FreeBSD.org>2004-04-30 22:34:12 +0000
commit8abe6632d3c2a913fdbb461ba5fa74a260ce895c (patch)
tree85e5ce6415aa05ca134796f95d041a6be5fd14ba /sbin/route
parentc14039802334822a4159818e193f9e41eb2cca8e (diff)
downloadFreeBSD-src-8abe6632d3c2a913fdbb461ba5fa74a260ce895c.zip
FreeBSD-src-8abe6632d3c2a913fdbb461ba5fa74a260ce895c.tar.gz
For both ifconfig and route if we didn't get enough memory from the
prior sysctl due to the structure growing between calls try again. Also try again for deleting routes if things fail. We've seen route -f fail this way which does not actually flush all routes. This fixes it. It will whine but it will do the work. PR: 56732 Obtained from: IronPort
Diffstat (limited to 'sbin/route')
-rw-r--r--sbin/route/route.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/sbin/route/route.c b/sbin/route/route.c
index deb9d20..10fbee6 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -201,7 +201,7 @@ flushroutes(argc, argv)
char *argv[];
{
size_t needed;
- int mib[6], rlen, seqno;
+ int mib[6], rlen, seqno, count = 0;
char *buf, *next, *lim;
struct rt_msghdr *rtm;
@@ -232,6 +232,7 @@ flushroutes(argc, argv)
} else
bad: usage(*argv);
}
+retry:
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0; /* protocol */
@@ -242,8 +243,15 @@ bad: usage(*argv);
err(EX_OSERR, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
errx(EX_OSERR, "malloc failed");
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
+ if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
+ if (errno == ENOMEM && count++ < 10) {
+ warnx("Routing table grew, retrying");
+ sleep(1);
+ free(buf);
+ goto retry;
+ }
err(EX_OSERR, "route-sysctl-get");
+ }
lim = buf + needed;
if (verbose)
(void) printf("Examining routing table from sysctl\n");
@@ -268,6 +276,8 @@ bad: usage(*argv);
if (rlen < (int)rtm->rtm_msglen) {
warn("write to routing socket");
(void) printf("got only %d for rlen\n", rlen);
+ free(buf);
+ goto retry;
break;
}
seqno++;
@@ -1105,9 +1115,10 @@ interfaces()
{
size_t needed;
int mib[6];
- char *buf, *lim, *next;
+ char *buf, *lim, *next, count = 0;
struct rt_msghdr *rtm;
+retry2:
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0; /* protocol */
@@ -1118,8 +1129,15 @@ interfaces()
err(EX_OSERR, "route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
errx(EX_OSERR, "malloc failed");
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
+ if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
+ if (errno == ENOMEM && count++ < 10) {
+ warnx("Routing table grew, retrying");
+ sleep(1);
+ free(buf);
+ goto retry2;
+ }
err(EX_OSERR, "actual retrieval of interface table");
+ }
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)next;
OpenPOWER on IntegriCloud