introduce setsockopt_reuseaddr(int fd), setsockopt_broadcast(int fd),
use them where appropriate. 200 bytes saved
This commit is contained in:
parent
b40bdb383a
commit
48237b0c88
@ -244,6 +244,8 @@ typedef union {
|
|||||||
} sockaddr_inet;
|
} sockaddr_inet;
|
||||||
extern int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen);
|
extern int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen);
|
||||||
extern int create_and_bind_socket_ip4or6(const char *hostaddr, int port);
|
extern int create_and_bind_socket_ip4or6(const char *hostaddr, int port);
|
||||||
|
extern int setsockopt_reuseaddr(int fd);
|
||||||
|
extern int setsockopt_broadcast(int fd);
|
||||||
|
|
||||||
|
|
||||||
extern char *xstrdup(const char *s);
|
extern char *xstrdup(const char *s);
|
||||||
|
@ -67,6 +67,16 @@ int xconnect_tcp_v4(struct sockaddr_in *s_addr)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const int one = 1;
|
||||||
|
int setsockopt_reuseaddr(int fd)
|
||||||
|
{
|
||||||
|
return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
|
||||||
|
}
|
||||||
|
int setsockopt_broadcast(int fd)
|
||||||
|
{
|
||||||
|
return setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one));
|
||||||
|
}
|
||||||
|
|
||||||
int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen)
|
int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
@ -116,7 +126,6 @@ int xsocket_stream_ip4or6(sa_family_t *fp)
|
|||||||
|
|
||||||
int create_and_bind_socket_ip4or6(const char *hostaddr, int port)
|
int create_and_bind_socket_ip4or6(const char *hostaddr, int port)
|
||||||
{
|
{
|
||||||
static const int on = 1;
|
|
||||||
int fd;
|
int fd;
|
||||||
sockaddr_inet sa;
|
sockaddr_inet sa;
|
||||||
|
|
||||||
@ -128,7 +137,7 @@ int create_and_bind_socket_ip4or6(const char *hostaddr, int port)
|
|||||||
fd = xsocket(sa.sa.sa_family, SOCK_STREAM, 0);
|
fd = xsocket(sa.sa.sa_family, SOCK_STREAM, 0);
|
||||||
} else
|
} else
|
||||||
fd = xsocket_stream_ip4or6(&sa.sa.sa_family);
|
fd = xsocket_stream_ip4or6(&sa.sa.sa_family);
|
||||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
|
setsockopt_reuseaddr(fd);
|
||||||
|
|
||||||
/* if (port >= 0) { */
|
/* if (port >= 0) { */
|
||||||
#if ENABLE_FEATURE_IPV6
|
#if ENABLE_FEATURE_IPV6
|
||||||
|
@ -354,7 +354,7 @@ int arping_main(int argc, char **argv)
|
|||||||
bb_error_msg_and_die("bind");
|
bb_error_msg_and_die("bind");
|
||||||
}
|
}
|
||||||
} else if (!(cfg&dad)) {
|
} else if (!(cfg&dad)) {
|
||||||
int on = 1;
|
static const int on = 1;
|
||||||
socklen_t alen = sizeof(saddr);
|
socklen_t alen = sizeof(saddr);
|
||||||
|
|
||||||
saddr.sin_port = htons(1025);
|
saddr.sin_port = htons(1025);
|
||||||
|
@ -200,12 +200,9 @@ static int listen_socket(char *iface_addr, int listen_port)
|
|||||||
struct sockaddr_in a;
|
struct sockaddr_in a;
|
||||||
char msg[100];
|
char msg[100];
|
||||||
int s;
|
int s;
|
||||||
int yes = 1;
|
|
||||||
s = xsocket(PF_INET, SOCK_DGRAM, 0);
|
s = xsocket(PF_INET, SOCK_DGRAM, 0);
|
||||||
#ifdef SO_REUSEADDR
|
if (setsockopt_reuseaddr(s) < 0)
|
||||||
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0)
|
|
||||||
bb_perror_msg_and_die("setsockopt() failed");
|
bb_perror_msg_and_die("setsockopt() failed");
|
||||||
#endif
|
|
||||||
memset(&a, 0, sizeof(a));
|
memset(&a, 0, sizeof(a));
|
||||||
a.sin_port = htons(listen_port);
|
a.sin_port = htons(listen_port);
|
||||||
a.sin_family = AF_INET;
|
a.sin_family = AF_INET;
|
||||||
|
@ -175,8 +175,7 @@ int ether_wake_main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* This is necessary for broadcasts to work */
|
/* This is necessary for broadcasts to work */
|
||||||
if (flags /*& 1 [OPT_BROADCAST]*/) {
|
if (flags /*& 1 [OPT_BROADCAST]*/) {
|
||||||
int one = 1;
|
if (setsockopt_broadcast(s) < 0)
|
||||||
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (void *)&one, sizeof(one)) < 0)
|
|
||||||
bb_perror_msg("SO_BROADCAST");
|
bb_perror_msg("SO_BROADCAST");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,17 +77,16 @@ static void inetbind(void)
|
|||||||
int s, port;
|
int s, port;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
int len = sizeof(addr);
|
int len = sizeof(addr);
|
||||||
int one = 1;
|
|
||||||
struct servent *se;
|
struct servent *se;
|
||||||
|
|
||||||
if ((se = getservbyname("identd", "tcp")) == NULL)
|
se = getservbyname("identd", "tcp");
|
||||||
port = IDENT_PORT;
|
port = IDENT_PORT;
|
||||||
else
|
if (se)
|
||||||
port = se->s_port;
|
port = se->s_port;
|
||||||
|
|
||||||
s = xsocket(AF_INET, SOCK_STREAM, 0);
|
s = xsocket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
|
setsockopt_reuseaddr(s);
|
||||||
|
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
addr.sin_addr.s_addr = inet_addr(bind_ip_address);
|
addr.sin_addr.s_addr = inet_addr(bind_ip_address);
|
||||||
|
@ -802,7 +802,6 @@ static int openServer(void)
|
|||||||
{
|
{
|
||||||
struct sockaddr_in lsocket;
|
struct sockaddr_in lsocket;
|
||||||
int fd;
|
int fd;
|
||||||
int on = 1;
|
|
||||||
|
|
||||||
/* create the socket right now */
|
/* create the socket right now */
|
||||||
/* inet_addr() returns a value that is already in network order */
|
/* inet_addr() returns a value that is already in network order */
|
||||||
@ -814,9 +813,13 @@ static int openServer(void)
|
|||||||
/* tell the OS it's OK to reuse a previous address even though */
|
/* tell the OS it's OK to reuse a previous address even though */
|
||||||
/* it may still be in a close down state. Allows bind to succeed. */
|
/* it may still be in a close down state. Allows bind to succeed. */
|
||||||
#ifdef SO_REUSEPORT
|
#ifdef SO_REUSEPORT
|
||||||
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (void *)&on, sizeof(on));
|
{
|
||||||
|
static const int on = 1;
|
||||||
|
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT,
|
||||||
|
(void *)&on, sizeof(on));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
|
setsockopt_reuseaddr(fd);
|
||||||
#endif
|
#endif
|
||||||
xbind(fd, (struct sockaddr *)&lsocket, sizeof(lsocket));
|
xbind(fd, (struct sockaddr *)&lsocket, sizeof(lsocket));
|
||||||
xlisten(fd, 9);
|
xlisten(fd, 9);
|
||||||
|
@ -419,7 +419,6 @@ static int bump_nofile (void)
|
|||||||
|
|
||||||
static void setup(servtab_t *sep)
|
static void setup(servtab_t *sep)
|
||||||
{
|
{
|
||||||
int on = 1;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
sep->se_fd = socket(sep->se_family, sep->se_socktype, 0);
|
sep->se_fd = socket(sep->se_family, sep->se_socktype, 0);
|
||||||
@ -427,11 +426,8 @@ static void setup(servtab_t *sep)
|
|||||||
bb_perror_msg("%s/%s: socket", sep->se_service, sep->se_proto);
|
bb_perror_msg("%s/%s: socket", sep->se_service, sep->se_proto);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#define turnon(fd, opt) \
|
if (setsockopt_reuseaddr(sep->se_fd) < 0)
|
||||||
setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof(on))
|
|
||||||
if (turnon(sep->se_fd, SO_REUSEADDR) < 0)
|
|
||||||
bb_perror_msg("setsockopt(SO_REUSEADDR)");
|
bb_perror_msg("setsockopt(SO_REUSEADDR)");
|
||||||
#undef turnon
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_INETD_RPC
|
#ifdef CONFIG_FEATURE_INETD_RPC
|
||||||
if (isrpcservice(sep)) {
|
if (isrpcservice(sep)) {
|
||||||
|
@ -85,8 +85,7 @@ int nc_main(int argc, char **argv)
|
|||||||
if (!cfd) {
|
if (!cfd) {
|
||||||
sfd = xsocket(AF_INET, SOCK_STREAM, 0);
|
sfd = xsocket(AF_INET, SOCK_STREAM, 0);
|
||||||
fcntl(sfd, F_SETFD, FD_CLOEXEC);
|
fcntl(sfd, F_SETFD, FD_CLOEXEC);
|
||||||
opt = 1;
|
setsockopt_reuseaddr(sfd);
|
||||||
setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
|
|
||||||
address.sin_family = AF_INET;
|
address.sin_family = AF_INET;
|
||||||
|
|
||||||
// Set local port.
|
// Set local port.
|
||||||
|
@ -351,9 +351,7 @@ static void ping(const char *host)
|
|||||||
memcpy(&pingaddr.sin_addr, hostent->h_addr, sizeof(pingaddr.sin_addr));
|
memcpy(&pingaddr.sin_addr, hostent->h_addr, sizeof(pingaddr.sin_addr));
|
||||||
|
|
||||||
/* enable broadcast pings */
|
/* enable broadcast pings */
|
||||||
sockopt = 1;
|
setsockopt_broadcast(pingsock);
|
||||||
setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
|
|
||||||
sizeof(sockopt));
|
|
||||||
|
|
||||||
/* set recv buf for broadcast pings */
|
/* set recv buf for broadcast pings */
|
||||||
sockopt = 48 * 1024;
|
sockopt = 48 * 1024;
|
||||||
|
@ -356,9 +356,7 @@ static void ping(const char *host)
|
|||||||
#endif /*ICMP6_FILTER*/
|
#endif /*ICMP6_FILTER*/
|
||||||
|
|
||||||
/* enable broadcast pings */
|
/* enable broadcast pings */
|
||||||
sockopt = 1;
|
setsockopt_broadcast(pingsock);
|
||||||
setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
|
|
||||||
sizeof(sockopt));
|
|
||||||
|
|
||||||
/* set recv buf for broadcast pings */
|
/* set recv buf for broadcast pings */
|
||||||
sockopt = 48 * 1024;
|
sockopt = 48 * 1024;
|
||||||
|
@ -103,7 +103,7 @@ static void telopt(byte c);
|
|||||||
static int subneg(byte c);
|
static int subneg(byte c);
|
||||||
|
|
||||||
/* Some globals */
|
/* Some globals */
|
||||||
static int one = 1;
|
static const int one = 1;
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_TELNET_TTYPE
|
#ifdef CONFIG_FEATURE_TELNET_TTYPE
|
||||||
static char *ttype;
|
static char *ttype;
|
||||||
|
@ -888,13 +888,14 @@ getaddr(u_int32_t *ap, const char *host)
|
|||||||
int
|
int
|
||||||
traceroute_main(int argc, char *argv[])
|
traceroute_main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
static const int on = 1;
|
||||||
|
|
||||||
int code, n;
|
int code, n;
|
||||||
unsigned char *outp;
|
unsigned char *outp;
|
||||||
u_int32_t *ap;
|
u_int32_t *ap;
|
||||||
struct sockaddr_in *from = (struct sockaddr_in *)&wherefrom;
|
struct sockaddr_in *from = (struct sockaddr_in *)&wherefrom;
|
||||||
struct sockaddr_in *to = (struct sockaddr_in *)&whereto;
|
struct sockaddr_in *to = (struct sockaddr_in *)&whereto;
|
||||||
struct hostinfo *hi;
|
struct hostinfo *hi;
|
||||||
int on = 1;
|
|
||||||
int ttl, probe, i;
|
int ttl, probe, i;
|
||||||
int seq = 0;
|
int seq = 0;
|
||||||
int tos = 0;
|
int tos = 0;
|
||||||
|
@ -44,9 +44,7 @@ struct arpMsg {
|
|||||||
/* FIXME: match response against chaddr */
|
/* FIXME: match response against chaddr */
|
||||||
int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
|
int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
|
||||||
{
|
{
|
||||||
|
|
||||||
int timeout = 2;
|
int timeout = 2;
|
||||||
int optval = 1;
|
|
||||||
int s; /* socket */
|
int s; /* socket */
|
||||||
int rv = 1; /* return value */
|
int rv = 1; /* return value */
|
||||||
struct sockaddr addr; /* for interface name */
|
struct sockaddr addr; /* for interface name */
|
||||||
@ -56,12 +54,13 @@ int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
|
|||||||
time_t prevTime;
|
time_t prevTime;
|
||||||
|
|
||||||
|
|
||||||
if ((s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP))) == -1) {
|
s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));
|
||||||
|
if (s == -1) {
|
||||||
bb_perror_msg(bb_msg_can_not_create_raw_socket);
|
bb_perror_msg(bb_msg_can_not_create_raw_socket);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) {
|
if (setsockopt_broadcast(s) == -1) {
|
||||||
bb_perror_msg("cannot setsocketopt on raw socket");
|
bb_perror_msg("cannot setsocketopt on raw socket");
|
||||||
close(s);
|
close(s);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -173,7 +173,6 @@ int udhcp_kernel_packet(struct dhcpMessage *payload,
|
|||||||
uint32_t source_ip, int source_port,
|
uint32_t source_ip, int source_port,
|
||||||
uint32_t dest_ip, int dest_port)
|
uint32_t dest_ip, int dest_port)
|
||||||
{
|
{
|
||||||
int n = 1;
|
|
||||||
int fd, result;
|
int fd, result;
|
||||||
struct sockaddr_in client;
|
struct sockaddr_in client;
|
||||||
|
|
||||||
@ -181,7 +180,7 @@ int udhcp_kernel_packet(struct dhcpMessage *payload,
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
|
if (setsockopt_reuseaddr(fd) == -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,6 @@ int listen_socket(uint32_t ip, int port, char *inf)
|
|||||||
struct ifreq interface;
|
struct ifreq interface;
|
||||||
int fd;
|
int fd;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
int n = 1;
|
|
||||||
|
|
||||||
DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf);
|
DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf);
|
||||||
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
@ -107,17 +106,17 @@ int listen_socket(uint32_t ip, int port, char *inf)
|
|||||||
addr.sin_port = htons(port);
|
addr.sin_port = htons(port);
|
||||||
addr.sin_addr.s_addr = ip;
|
addr.sin_addr.s_addr = ip;
|
||||||
|
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
|
if (setsockopt_reuseaddr(fd) == -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) {
|
if (setsockopt_broadcast(fd) == -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(interface.ifr_name, inf, IFNAMSIZ);
|
strncpy(interface.ifr_name, inf, IFNAMSIZ);
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) {
|
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user