diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-08-10 00:27:22 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-08-10 00:27:22 +0200 |
commit | 6567edd10b0ebd3333f4283decd90e1d57a42885 (patch) | |
tree | cfcc85ba62b5006d7a23ce7f8465a1a97d4b2ac9 | |
parent | 4919565c152f2ecee760b5419c947764e991ab3e (diff) | |
download | busybox-w32-6567edd10b0ebd3333f4283decd90e1d57a42885.tar.gz busybox-w32-6567edd10b0ebd3333f4283decd90e1d57a42885.tar.bz2 busybox-w32-6567edd10b0ebd3333f4283decd90e1d57a42885.zip |
udhcp[cd]: fix binding to network aliases. Closes 5432, 5438
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/udhcp/socket.c | 10 |
1 files changed, 9 insertions, 1 deletions
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) | |||
80 | { | 80 | { |
81 | int fd; | 81 | int fd; |
82 | struct sockaddr_in addr; | 82 | struct sockaddr_in addr; |
83 | char *colon; | ||
83 | 84 | ||
84 | log1("Opening listen socket on *:%d %s", port, inf); | 85 | log1("Opening listen socket on *:%d %s", port, inf); |
85 | fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); | 86 | 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) | |||
88 | if (setsockopt_broadcast(fd) == -1) | 89 | if (setsockopt_broadcast(fd) == -1) |
89 | bb_perror_msg_and_die("SO_BROADCAST"); | 90 | bb_perror_msg_and_die("SO_BROADCAST"); |
90 | 91 | ||
91 | /* NB: bug 1032 says this doesn't work on ethernet aliases (ethN:M) */ | 92 | /* SO_BINDTODEVICE doesn't work on ethernet aliases (ethN:M) */ |
93 | colon = strrchr(inf, ':'); | ||
94 | if (colon) | ||
95 | *colon = '\0'; | ||
96 | |||
92 | if (setsockopt_bindtodevice(fd, inf)) | 97 | if (setsockopt_bindtodevice(fd, inf)) |
93 | xfunc_die(); /* warning is already printed */ | 98 | xfunc_die(); /* warning is already printed */ |
94 | 99 | ||
100 | if (colon) | ||
101 | *colon = ':'; | ||
102 | |||
95 | memset(&addr, 0, sizeof(addr)); | 103 | memset(&addr, 0, sizeof(addr)); |
96 | addr.sin_family = AF_INET; | 104 | addr.sin_family = AF_INET; |
97 | addr.sin_port = htons(port); | 105 | addr.sin_port = htons(port); |