+int
+rtgateinfo(info)
+ register struct rt_addrinfo *info;
+{
+ struct ifaddr *ifa;
+ struct ifnet *ifp;
+ int error = 0;
+/* Sleazy use of local variables throughout this function and next, XXX!!!! */
+#define dst info->rti_info[RTAX_DST]
+#define gateway info->rti_info[RTAX_GATEWAY]
+#define netmask info->rti_info[RTAX_NETMASK]
+#define ifaaddr info->rti_info[RTAX_IFA]
+#define ifpaddr info->rti_info[RTAX_IFP]
+#define flags info->rti_flags
+
+ /* ifp may be specified by sockaddr_dl
+ when protcol address is ambiguous */
+ if (info->rti_ifp == 0 && ifpaddr) {
+ ifa = ifa_ifwithnet(ifpaddr);
+ info->rti_ifp = ifa ? ifa->ifa_ifp : 0;
+ }
+ if (info->rti_ifa == 0) {
+ struct sockaddr *sa;
+ if (ifp = info->rti_ifp) {
+ sa = ifaaddr ? ifaaddr : (gateway ? gateway : dst);
+ info->rti_ifa = ifaof_ifpforaddr(sa, ifp);
+ } else
+ info->rti_ifa = ifa_ifwithroute(flags, dst, gateway);
+ }
+ if (ifa = info->rti_ifa) {
+ if (info->rti_ifp == 0)
+ info->rti_ifp = ifa->ifa_ifp;
+ if (gateway == 0)
+ gateway = ifa->ifa_addr;
+ } else
+ error = ENETUNREACH;
+ return error;
+}
+
+