312 |
|
struct sockaddr_in saddr, daddr; |
313 |
|
|
314 |
|
saddr = *addr; |
315 |
< |
if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) |
315 |
> |
if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) { |
316 |
|
saddr.sin_addr.s_addr = so->so_faddr.s_addr; |
317 |
+ |
if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff)) |
318 |
+ |
saddr.sin_addr.s_addr = alias_addr.s_addr; |
319 |
+ |
} |
320 |
|
daddr.sin_addr = so->so_laddr; |
321 |
|
daddr.sin_port = so->so_lport; |
322 |
|
|
661 |
|
getsockname(so->s,(struct sockaddr *)&addr,&addrlen); |
662 |
|
so->so_fport = addr.sin_port; |
663 |
|
if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) |
664 |
< |
so->so_faddr = our_addr; |
664 |
> |
so->so_faddr = alias_addr; |
665 |
|
else |
666 |
|
so->so_faddr = addr.sin_addr; |
667 |
|
|