From 6567edd10b0ebd3333f4283decd90e1d57a42885 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 10 Aug 2012 00:27:22 +0200 Subject: udhcp[cd]: fix binding to network aliases. Closes 5432, 5438 Signed-off-by: Denys Vlasenko --- networking/udhcp/socket.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'networking/udhcp/socket.c') diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index a5220ba74..a42106960 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c @@ -80,6 +80,7 @@ int FAST_FUNC udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) { int fd; struct sockaddr_in addr; + char *colon; log1("Opening listen socket on *:%d %s", port, inf); fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -88,10 +89,17 @@ int FAST_FUNC udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) if (setsockopt_broadcast(fd) == -1) bb_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)) xfunc_die(); /* warning is already printed */ + if (colon) + *colon = ':'; + memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); -- cgit v1.2.3