*: fix SO_BINDTODEVICE. Kernel wants at least IFNAMSIZ bytes there.

This commit is contained in:
Denis Vlasenko
2008-12-10 11:12:16 +00:00
parent 0d94820adf
commit e53738558f
5 changed files with 21 additions and 6 deletions
+15
View File
@@ -8,6 +8,7 @@
*/
#include <netinet/in.h>
#include <net/if.h>
#include "libbb.h"
void FAST_FUNC setsockopt_reuseaddr(int fd)
@@ -18,6 +19,20 @@ int FAST_FUNC setsockopt_broadcast(int fd)
{
return setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &const_int_1, sizeof(const_int_1));
}
int FAST_FUNC setsockopt_bindtodevice(int fd, const char *iface)
{
int r;
struct ifreq ifr;
strncpy_IFNAMSIZ(ifr.ifr_name, iface);
/* Actually, ifr_name is at offset 0, and in practice
* just giving char[IFNAMSIZ] instead of struct ifreq works too.
* But just in case it's not true on some obscure arch... */
r = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
if (r)
bb_perror_msg("can't bind to interface %s", iface);
return r;
}
void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
{