- struct sockaddr net, *netp = &net;
- register caddr_t cp, cp2, cp3;
- caddr_t cplim, freeit = 0;
- int len;
-
- if (flags & RTF_HOST || ifa->ifa_netmask == 0) {
- (void) rtrequest(cmd, ifa->ifa_dstaddr, ifa->ifa_addr,
- (struct sockaddr *)0, flags, (struct rtentry **)0);
- } else {
- if ((len = ifa->ifa_addr->sa_len) >= sizeof (*netp)) {
- R_Malloc(freeit, caddr_t, len);
- if (freeit == 0)
- return;
- netp = (struct sockaddr *)freeit;
- }
- bzero((caddr_t)netp, len);
- cp = (caddr_t) netp->sa_data;
- cp3 = (caddr_t) ifa->ifa_netmask->sa_data;
- cplim = ifa->ifa_netmask->sa_len +
- (caddr_t) ifa->ifa_netmask;
- cp2 = 1 + (caddr_t)ifa->ifa_addr;
- netp->sa_family = *cp2++;
- netp->sa_len = len;
- while (cp3 < cplim)
- *cp++ = *cp2++ & *cp3++;
- (void) rtrequest(cmd, netp, ifa->ifa_addr, ifa->ifa_netmask,
- flags, (struct rtentry **)0);
- if (freeit)
- free((caddr_t)freeit, M_RTABLE);
- }
+ return rtrequest(cmd, ifa->ifa_dstaddr, ifa->ifa_addr,
+ ifa->ifa_netmask, flags | ifa->ifa_flags, &ifa->ifa_rt);