SCCS-vsn: sbin/routed/output.c 5.13
SCCS-vsn: sbin/routed/tables.c 5.16
SCCS-vsn: sbin/routed/input.c 5.21
SCCS-vsn: sbin/routed/table.h 5.7
SCCS-vsn: sbin/routed/af.c 5.9
-static char sccsid[] = "@(#)af.c 5.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)af.c 5.9 (Berkeley) %G%";
#endif /* not lint */
#include "defs.h"
#endif /* not lint */
#include "defs.h"
int af_max = sizeof(afswitch) / sizeof(afswitch[0]);
int af_max = sizeof(afswitch) / sizeof(afswitch[0]);
-struct sockaddr_in inet_default = { AF_INET, INADDR_ANY };
+struct sockaddr_in inet_default = {
+#ifdef RTM_ADD
+ sizeof (inet_default),
+#endif
+ AF_INET, INADDR_ANY };
inet_hash(sin, hp)
register struct sockaddr_in *sin;
inet_hash(sin, hp)
register struct sockaddr_in *sin;
sin = &dst;
if (sin->sin_port == 0)
sin->sin_port = sp->s_port;
sin = &dst;
if (sin->sin_port == 0)
sin->sin_port = sp->s_port;
+ if (sin->sin_len == 0)
+ sin->sin_len = sizeof (*sin);
if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
perror("sendto");
}
if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
perror("sendto");
}
+ sin->sin_len = sizeof(*sin);
-static char sccsid[] = "@(#)input.c 5.20 (Berkeley) %G%";
+static char sccsid[] = "@(#)input.c 5.21 (Berkeley) %G%";
count -= sizeof (struct netinfo);
#if BSD < 198810
count -= sizeof (struct netinfo);
#if BSD < 198810
- if (sizeof(n->rip_dst.sa_family) > 1)/* XXX */
- n->rip_dst.sa_family =
- ntohs(n->rip_dst.sa_family);
+ if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
+ n->rip_dst.sa_family = ntohs(n->rip_dst.sa_family);
+#else
+#define osa(x) ((struct osockaddr *)(&(x)))
+ n->rip_dst.sa_family =
+ ntohs(osa(n->rip_dst)->sa_family);
+ n->rip_dst.sa_len = sizeof(n->rip_dst);
#endif
n->rip_metric = ntohl(n->rip_metric);
/*
#endif
n->rip_metric = ntohl(n->rip_metric);
/*
rt = rtlookup(&n->rip_dst);
else
rt = 0;
rt = rtlookup(&n->rip_dst);
else
rt = 0;
+#define min(a, b) (a < b ? a : b)
n->rip_metric = rt == 0 ? HOPCNT_INFINITY :
min(rt->rt_metric + 1, HOPCNT_INFINITY);
#if BSD < 198810
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family = htons(n->rip_dst.sa_family);
n->rip_metric = rt == 0 ? HOPCNT_INFINITY :
min(rt->rt_metric + 1, HOPCNT_INFINITY);
#if BSD < 198810
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family = htons(n->rip_dst.sa_family);
+#else
+ osa(n->rip_dst)->sa_family =
+ htons(n->rip_dst.sa_family);
#endif
n->rip_metric = htonl(n->rip_metric);
}
#endif
n->rip_metric = htonl(n->rip_metric);
}
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family =
ntohs(n->rip_dst.sa_family);
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family =
ntohs(n->rip_dst.sa_family);
+#else
+ n->rip_dst.sa_family =
+ ntohs(osa(n->rip_dst)->sa_family);
+ n->rip_dst.sa_len = sizeof(n->rip_dst);
#endif
n->rip_metric = ntohl(n->rip_metric);
if (n->rip_dst.sa_family >= af_max ||
#endif
n->rip_metric = ntohl(n->rip_metric);
if (n->rip_dst.sa_family >= af_max ||
-static char sccsid[] = "@(#)output.c 5.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)output.c 5.13 (Berkeley) %G%";
#if BSD < 198810
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family = htons(n->rip_dst.sa_family);
#if BSD < 198810
if (sizeof(n->rip_dst.sa_family) > 1) /* XXX */
n->rip_dst.sa_family = htons(n->rip_dst.sa_family);
+#else
+#define osa(x) ((struct osockaddr *)(&(x)))
+ osa(n->rip_dst)->sa_family = htons(n->rip_dst.sa_family);
#endif
n->rip_metric = htonl(rt->rt_metric);
n++;
#endif
n->rip_metric = htonl(rt->rt_metric);
n++;
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#)table.h 5.6 (Berkeley) %G%
+ * @(#)table.h 5.7 (Berkeley) %G%
struct rt_entry *rt_forw;
struct rt_entry *rt_back;
};
struct rt_entry *rt_forw;
struct rt_entry *rt_back;
};
+#ifdef RTM_ADD
+#define rtentry ortentry
+#endif
struct rt_entry {
struct rt_entry *rt_forw;
struct rt_entry {
struct rt_entry *rt_forw;
-static char sccsid[] = "@(#)tables.c 5.15 (Berkeley) %G%";
+static char sccsid[] = "@(#)tables.c 5.16 (Berkeley) %G%";
+#ifdef RTM_ADD
+#define FIXLEN(s) {if ((s)->sa_len == 0) (s)->sa_len = sizeof *(s);}
+#else
+#define FIXLEN(s) { }
+#endif
+
int install = !DEBUG; /* if 1 call kernel */
/*
int install = !DEBUG; /* if 1 call kernel */
/*
/*
* Subnet flag isn't visible to kernel, move to state. XXX
*/
/*
* Subnet flag isn't visible to kernel, move to state. XXX
*/
+ FIXLEN(dst);
+ FIXLEN(gate);
if (flags & RTF_SUBNET) {
state |= RTS_SUBNET;
flags &= ~RTF_SUBNET;
if (flags & RTF_SUBNET) {
state |= RTS_SUBNET;
flags &= ~RTF_SUBNET;
rt->rt_timer = 0;
rt->rt_flags = RTF_UP | flags;
rt->rt_state = state | RTS_CHANGED;
rt->rt_timer = 0;
rt->rt_flags = RTF_UP | flags;
rt->rt_state = state | RTS_CHANGED;
- rt->rt_ifp = if_ifwithdstaddr(&rt->rt_router);
+ rt->rt_ifp = if_ifwithdstaddr(&rt->rt_dst);
if (rt->rt_ifp == 0)
rt->rt_ifp = if_ifwithnet(&rt->rt_router);
if ((state & RTS_INTERFACE) == 0)
if (rt->rt_ifp == 0)
rt->rt_ifp = if_ifwithnet(&rt->rt_router);
if ((state & RTS_INTERFACE) == 0)
int add = 0, delete = 0, newgateway = 0;
struct rtentry oldroute;
int add = 0, delete = 0, newgateway = 0;
struct rtentry oldroute;
+ FIXLEN(gate);
+ FIXLEN(&(rt->rt_router));
+ FIXLEN(&(rt->rt_dst));
if (!equal(&rt->rt_router, gate)) {
newgateway++;
TRACE_ACTION("CHANGE FROM ", rt);
if (!equal(&rt->rt_router, gate)) {
newgateway++;
TRACE_ACTION("CHANGE FROM ", rt);
rt->rt_state |= RTS_CHANGED;
if (newgateway)
TRACE_ACTION("CHANGE TO ", rt);
rt->rt_state |= RTS_CHANGED;
if (newgateway)
TRACE_ACTION("CHANGE TO ", rt);
if (add && install)
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
perror("SIOCADDRT");
if (delete && install)
if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
if (add && install)
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
perror("SIOCADDRT");
if (delete && install)
if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
+#else
+ if (delete && install)
+ if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
+ perror("SIOCDELRT");
+ if (add && install) {
+ if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
+ perror("SIOCADDRT");
+ }
+#endif
{
TRACE_ACTION("DELETE", rt);
{
TRACE_ACTION("DELETE", rt);
+ FIXLEN(&(rt->rt_router));
+ FIXLEN(&(rt->rt_dst));
if (rt->rt_metric < HOPCNT_INFINITY) {
if ((rt->rt_state & (RTS_INTERFACE|RTS_INTERNAL)) == RTS_INTERFACE)
syslog(LOG_ERR,
if (rt->rt_metric < HOPCNT_INFINITY) {
if ((rt->rt_state & (RTS_INTERFACE|RTS_INTERNAL)) == RTS_INTERFACE)
syslog(LOG_ERR,