static void
build_routes(void)
{
- struct rt *nrs = NULL, *dnr, *or, *rt, *rtn, *rtl;
+ struct rt *nrs = NULL, *dnr, *or, *rt, *rtn, *rtl, *lrt = NULL;
const struct interface *ifp;
for (ifp = ifaces; ifp; ifp = ifp->next) {
continue;
dnr = get_option_routes(ifp->state->new);
dnr = add_subnet_route(dnr, ifp);
- for (rt = dnr; rt && (rtn = rt->next, 1); rt = rtn) {
+ for (rt = dnr; rt && (rtn = rt->next, 1); lrt = rt, rt = rtn) {
rt->iface = ifp;
/* Is this route already in our table? */
if ((find_route(nrs, rt, NULL, NULL)))
else
routes = or->next;
rt = or;
+ rt->iface = ifp;
+ lrt = NULL;
} else {
if (c_route(or, rt, ifp) == 0) {
if (rtl)
}
if (dnr == rt)
dnr = rtn;
- rt->iface = ifp;
+ else if (lrt)
+ lrt->next = rtn;
rt->next = nrs;
nrs = rt;
}
remove_routes(iface);
delete_address(iface);
}
-
run_script(iface, reason);
return 0;
}
(rt.net.s_addr != iface->net.s_addr ||
rt.dest.s_addr !=(iface->addr.s_addr & iface->net.s_addr)))
#else
+ rt.iface = iface;
if (!find_route(routes, &rt, NULL, NULL))
#endif
del_route(iface, &rt.dest, &rt.net, &rt.gate, 0);