+ } else
+ error = EHOSTUNREACH;
+done:
+ if (rt) {
+ if (rtp && !error)
+ *rtp = rt;
+ else
+ rtfree(rt);
+ }
+ if (error)
+ rtstat.rts_badredirect++;
+ else
+ (stat && (*stat)++);
+ rt_missmsg(RTM_REDIRECT, dst, gateway, netmask, src, flags, error);
+}
+
+/*
+* Routing table ioctl interface.
+*/
+rtioctl(req, data)
+ int req;
+ caddr_t data;
+{
+#ifndef COMPAT_43
+ return (EOPNOTSUPP);
+#else
+ register struct ortentry *entry = (struct ortentry *)data;
+ int error;
+ struct sockaddr *netmask = 0;
+
+ if (req == SIOCADDRT)
+ req = RTM_ADD;
+ else if (req == SIOCDELRT)
+ req = RTM_DELETE;
+ else
+ return (EINVAL);
+
+ if (error = suser(u.u_cred, &u.u_acflag))
+ return (error);
+#if BYTE_ORDER != BIG_ENDIAN
+ if (entry->rt_dst.sa_family == 0 && entry->rt_dst.sa_len < 16) {
+ entry->rt_dst.sa_family = entry->rt_dst.sa_len;
+ entry->rt_dst.sa_len = 16;
+ }
+ if (entry->rt_gateway.sa_family == 0 && entry->rt_gateway.sa_len < 16) {
+ entry->rt_gateway.sa_family = entry->rt_gateway.sa_len;
+ entry->rt_gateway.sa_len = 16;
+ }
+#else
+ if (entry->rt_dst.sa_len == 0)
+ entry->rt_dst.sa_len = 16;
+ if (entry->rt_gateway.sa_len == 0)
+ entry->rt_gateway.sa_len = 16;
+#endif
+ if ((entry->rt_flags & RTF_HOST) == 0)
+ switch (entry->rt_dst.sa_family) {
+#ifdef INET
+ case AF_INET:
+ {
+ extern struct sockaddr_in icmpmask;
+ struct sockaddr_in *dst_in =
+ (struct sockaddr_in *)&entry->rt_dst;
+
+ in_sockmaskof(dst_in->sin_addr, &icmpmask);
+ netmask = (struct sockaddr *)&icmpmask;
+ }