- }
- np->n_flags = ifreq.ifr_flags;
- if (np->n_flags & IFF_POINTOPOINT) {
- if (ioctl(s, SIOCGIFDSTADDR, (char *)&ifreq) < 0) {
- perror("rwhod: ioctl (get dstaddr)");
- free((char *)np);
- continue;
- }
- /* we assume addresses are all the same size */
- bcopy((char *)&ifreq.ifr_dstaddr,
- np->n_addr, np->n_addrlen);
- }
- if (np->n_flags & IFF_BROADCAST) {
- /* we assume addresses are all the same size */
- sin = (struct sockaddr_in *)np->n_addr;
- sin->sin_addr =
- inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
- }
- /* gag, wish we could get rid of Internet dependencies */
- sin = (struct sockaddr_in *)np->n_addr;
- sin->sin_port = sp->s_port;
+ len = sizeof(*np) + dstaddr->sa_len + sdl->sdl_nlen + 1;
+ np = (struct neighbor *)malloc(len);
+ if (np == NULL)
+ quit("malloc of neighbor structure");
+ memset(np, 0, len);
+ np->n_flags = flags;
+ np->n_addr = (struct sockaddr *)(np + 1);
+ np->n_addrlen = dstaddr->sa_len;
+ np->n_name = np->n_addrlen + (char *)np->n_addr;