+
+ 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;
+ }
+ break;
+#endif
+#ifdef NS
+ case AF_NS:
+ {
+ extern struct sockaddr_ns ns_netmask;
+ netmask = (struct sockaddr *)&ns_netmask;
+ }
+#endif
+ }
+ error = rtrequest(req, &(entry->rt_dst), &(entry->rt_gateway), netmask,
+ entry->rt_flags, (struct rtentry **)0);
+ rt_missmsg((req == RTM_ADD ? RTM_OLDADD : RTM_OLDDEL),
+ &(entry->rt_dst), &(entry->rt_gateway),
+ netmask, SA(0), entry->rt_flags, error);
+ return (error);
+#endif