SCCS-vsn: sbin/XNSrouted/tables.c 5.8
SCCS-vsn: sbin/XNSrouted/table.h 5.2
*
* @(#)table.h 5.1 (Berkeley) 6/4/85 (routed/table.h)
*
*
* @(#)table.h 5.1 (Berkeley) 6/4/85 (routed/table.h)
*
- * @(#)table.h 5.1 (Berkeley) %G%
+ * @(#)table.h 5.2 (Berkeley) %G%
struct rt_entry *rt_back;
};
struct rt_entry *rt_back;
};
+#ifdef RTM_ADD
+#define rtentry ortentry
+#endif
+
struct rt_entry {
struct rt_entry *rt_forw;
struct rt_entry *rt_back;
struct rt_entry {
struct rt_entry *rt_forw;
struct rt_entry *rt_back;
-static char sccsid[] = "@(#)tables.c 5.7 (Berkeley) %G%";
+static char sccsid[] = "@(#)tables.c 5.8 (Berkeley) %G%";
#endif
extern char *xns_ntoa();
#endif
extern char *xns_ntoa();
+#define FIXLEN(s) { if ((s)->sa_len == 0) (s)->sa_len = sizeof (*(s));}
int install = !DEBUG; /* if 1 call kernel */
int delete = 1;
int install = !DEBUG; /* if 1 call kernel */
int delete = 1;
int af = dst->sa_family, flags;
u_int hash;
int af = dst->sa_family, flags;
u_int hash;
+ FIXLEN(dst);
+ FIXLEN(gate);
if (af >= AF_MAX)
return;
(*afswitch[af].af_hash)(dst, &h);
if (af >= AF_MAX)
return;
(*afswitch[af].af_hash)(dst, &h);
int doioctl = 0, metricchanged = 0;
struct rtentry oldroute;
int doioctl = 0, metricchanged = 0;
struct rtentry oldroute;
if (!equal(&rt->rt_router, gate))
doioctl++;
if (metric != rt->rt_metric)
if (!equal(&rt->rt_router, gate))
doioctl++;
if (metric != rt->rt_metric)
TRACE_ACTION(CHANGE TO, rt);
}
if (doioctl && install) {
TRACE_ACTION(CHANGE TO, rt);
}
if (doioctl && install) {
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
syslog(LOG_ERR, "SIOCADDRT dst %s, gw %s: %m",
xns_ntoa(&((struct sockaddr_ns *)&rt->rt_dst)->sns_addr),
xns_ntoa(&((struct sockaddr_ns *)&rt->rt_router)->sns_addr));
if (delete && ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
syslog(LOG_ERR, "SIOCADDRT dst %s, gw %s: %m",
xns_ntoa(&((struct sockaddr_ns *)&rt->rt_dst)->sns_addr),
xns_ntoa(&((struct sockaddr_ns *)&rt->rt_router)->sns_addr));
if (delete && ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
+#else
+ if (delete && ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
+ perror("SIOCDELRT");
+ if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
+ syslog(LOG_ERR, "SIOCADDRT dst %s, gw %s: %m",
+ xns_ntoa(&((struct sockaddr_ns *)&rt->rt_dst)->sns_addr),
+ xns_ntoa(&((struct sockaddr_ns *)&rt->rt_router)->sns_addr));
+#endif
+ struct sockaddr *sa = &(rt->rt_rt.rt_gateway);
+ FIXLEN(sa);
+#undef rt_dst
+ sa = &(rt->rt_rt.rt_dst);
+ FIXLEN(sa);
if (rt->rt_state & RTS_INTERFACE) {
syslog(LOG_ERR, "deleting route to interface %s (timed out)",
rt->rt_ifp->int_name);
if (rt->rt_state & RTS_INTERFACE) {
syslog(LOG_ERR, "deleting route to interface %s (timed out)",
rt->rt_ifp->int_name);