introduce setsockopt_reuseaddr(int fd), setsockopt_broadcast(int fd),

use them where appropriate. 200 bytes saved
This commit is contained in:
Denis Vlasenko 2006-11-22 23:22:06 +00:00
parent b40bdb383a
commit 48237b0c88
16 changed files with 40 additions and 42 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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");
} }

View File

@ -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);

View File

@ -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);

View File

@ -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)) {

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;
} }