udhcpc6: fix binding to network aliases

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2022-12-15 23:57:27 +01:00
parent 6c2ddf808e
commit 02ca565646

View File

@ -95,9 +95,6 @@ int FAST_FUNC d6_read_interface(
close(fd); close(fd);
} }
if (retval == 0)
return retval;
if (retval & (1<<0)) if (retval & (1<<0))
bb_error_msg("can't get %s", "MAC"); bb_error_msg("can't get %s", "MAC");
if (retval & (1<<1)) if (retval & (1<<1))
@ -109,6 +106,7 @@ int FAST_FUNC d6_listen_socket(int port, const char *inf)
{ {
int fd; int fd;
struct sockaddr_in6 addr; struct sockaddr_in6 addr;
char *colon;
log2("opening listen socket on *:%d %s", port, inf); log2("opening listen socket on *:%d %s", port, inf);
fd = xsocket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); fd = xsocket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
@ -117,10 +115,17 @@ int FAST_FUNC d6_listen_socket(int port, const char *inf)
if (setsockopt_broadcast(fd) == -1) if (setsockopt_broadcast(fd) == -1)
bb_simple_perror_msg_and_die("SO_BROADCAST"); bb_simple_perror_msg_and_die("SO_BROADCAST");
/* NB: bug 1032 says this doesn't work on ethernet aliases (ethN:M) */ /* SO_BINDTODEVICE doesn't work on ethernet aliases (ethN:M) */
colon = strrchr(inf, ':');
if (colon)
*colon = '\0';
if (setsockopt_bindtodevice(fd, inf)) if (setsockopt_bindtodevice(fd, inf))
xfunc_die(); /* warning is already printed */ xfunc_die(); /* warning is already printed */
if (colon)
*colon = ':';
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.sin6_family = AF_INET6; addr.sin6_family = AF_INET6;
addr.sin6_port = htons(port); addr.sin6_port = htons(port);