mirror of
https://git.busybox.net/busybox.git
synced 2024-11-24 06:03:27 +08:00
- be C99 friendly. Anonymous unions are a GNU extension. This change is
size-neutral WRT -std=gnu99 and fixes several compilation errors for strict C99 mode.
This commit is contained in:
parent
c882f341ce
commit
8c69afd992
@ -340,7 +340,7 @@ typedef struct len_and_sockaddr {
|
|||||||
#if ENABLE_FEATURE_IPV6
|
#if ENABLE_FEATURE_IPV6
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
#endif
|
#endif
|
||||||
};
|
} u;
|
||||||
} len_and_sockaddr;
|
} len_and_sockaddr;
|
||||||
enum {
|
enum {
|
||||||
LSA_SIZEOF_SA = sizeof(
|
LSA_SIZEOF_SA = sizeof(
|
||||||
|
@ -154,12 +154,11 @@ typedef int socklen_t;
|
|||||||
|
|
||||||
/* linux/loop.h relies on __u64. Make sure we have that as a proper type
|
/* linux/loop.h relies on __u64. Make sure we have that as a proper type
|
||||||
* until userspace is widely fixed. */
|
* until userspace is widely fixed. */
|
||||||
#ifndef __GNUC__
|
#if (defined __INTEL_COMPILER && !defined __GNUC__) || \
|
||||||
#if defined __INTEL_COMPILER
|
(defined __GNUC__ && defined __STRICT_ANSI__)
|
||||||
__extension__ typedef __signed__ long long __s64;
|
__extension__ typedef __signed__ long long __s64;
|
||||||
__extension__ typedef unsigned long long __u64;
|
__extension__ typedef unsigned long long __u64;
|
||||||
#endif /* __INTEL_COMPILER */
|
#endif
|
||||||
#endif /* ifndef __GNUC__ */
|
|
||||||
|
|
||||||
/*----- Kernel versioning ------------------------------------*/
|
/*----- Kernel versioning ------------------------------------*/
|
||||||
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
|
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
|
||||||
|
@ -254,10 +254,10 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
|
|
||||||
local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0);
|
local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0);
|
||||||
lsa = xhost2sockaddr(argv[0], local_port);
|
lsa = xhost2sockaddr(argv[0], local_port);
|
||||||
sock = xsocket(lsa->sa.sa_family, tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
sock = xsocket(lsa->u.sa.sa_family, tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
||||||
setsockopt_reuseaddr(sock);
|
setsockopt_reuseaddr(sock);
|
||||||
sa_len = lsa->len; /* I presume sockaddr len stays the same */
|
sa_len = lsa->len; /* I presume sockaddr len stays the same */
|
||||||
xbind(sock, &lsa->sa, sa_len);
|
xbind(sock, &lsa->u.sa, sa_len);
|
||||||
if (tcp)
|
if (tcp)
|
||||||
xlisten(sock, backlog);
|
xlisten(sock, backlog);
|
||||||
else /* udp: needed for recv_from_to to work: */
|
else /* udp: needed for recv_from_to to work: */
|
||||||
@ -273,7 +273,7 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
char *addr = xmalloc_sockaddr2dotted(&lsa->sa);
|
char *addr = xmalloc_sockaddr2dotted(&lsa->u.sa);
|
||||||
printf("%s: info: listening on %s", applet_name, addr);
|
printf("%s: info: listening on %s", applet_name, addr);
|
||||||
free(addr);
|
free(addr);
|
||||||
#ifndef SSLSVD
|
#ifndef SSLSVD
|
||||||
@ -299,12 +299,12 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
sig_unblock(SIGCHLD);
|
sig_unblock(SIGCHLD);
|
||||||
if (tcp) {
|
if (tcp) {
|
||||||
remote.len = sa_len;
|
remote.len = sa_len;
|
||||||
conn = accept(sock, &remote.sa, &remote.len);
|
conn = accept(sock, &remote.u.sa, &remote.len);
|
||||||
} else {
|
} else {
|
||||||
/* In case recv_from_to won't be able to recover local addr.
|
/* In case recv_from_to won't be able to recover local addr.
|
||||||
* Also sets port - recv_from_to is unable to do it. */
|
* Also sets port - recv_from_to is unable to do it. */
|
||||||
local = *lsa;
|
local = *lsa;
|
||||||
conn = recv_from_to(sock, NULL, 0, MSG_PEEK, &remote.sa, &local.sa, sa_len);
|
conn = recv_from_to(sock, NULL, 0, MSG_PEEK, &remote.u.sa, &local.u.sa, sa_len);
|
||||||
}
|
}
|
||||||
sig_block(SIGCHLD);
|
sig_block(SIGCHLD);
|
||||||
if (conn < 0) {
|
if (conn < 0) {
|
||||||
@ -317,7 +317,7 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
if (max_per_host) {
|
if (max_per_host) {
|
||||||
/* Drop connection immediately if cur_per_host > max_per_host
|
/* Drop connection immediately if cur_per_host > max_per_host
|
||||||
* (minimizing load under SYN flood) */
|
* (minimizing load under SYN flood) */
|
||||||
remote_ip = xmalloc_sockaddr2dotted_noport(&remote.sa);
|
remote_ip = xmalloc_sockaddr2dotted_noport(&remote.u.sa);
|
||||||
cur_per_host = ipsvd_perhost_add(remote_ip, max_per_host, &hccp);
|
cur_per_host = ipsvd_perhost_add(remote_ip, max_per_host, &hccp);
|
||||||
if (cur_per_host > max_per_host) {
|
if (cur_per_host > max_per_host) {
|
||||||
/* ipsvd_perhost_add detected that max is exceeded
|
/* ipsvd_perhost_add detected that max is exceeded
|
||||||
@ -342,14 +342,14 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
/* Make plain write/send work for this socket by supplying default
|
/* Make plain write/send work for this socket by supplying default
|
||||||
* destination address. This also restricts incoming packets
|
* destination address. This also restricts incoming packets
|
||||||
* to ones coming from this remote IP. */
|
* to ones coming from this remote IP. */
|
||||||
xconnect(0, &remote.sa, sa_len);
|
xconnect(0, &remote.u.sa, sa_len);
|
||||||
/* hole? at this point we have no wildcard udp socket...
|
/* hole? at this point we have no wildcard udp socket...
|
||||||
* can this cause clients to get "port unreachable" icmp?
|
* can this cause clients to get "port unreachable" icmp?
|
||||||
* Yup, time window is very small, but it exists (is it?) */
|
* Yup, time window is very small, but it exists (is it?) */
|
||||||
/* Open new non-connected UDP socket for further clients */
|
/* Open new non-connected UDP socket for further clients */
|
||||||
sock = xsocket(lsa->sa.sa_family, tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
sock = xsocket(lsa->u.sa.sa_family, tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
||||||
setsockopt_reuseaddr(sock);
|
setsockopt_reuseaddr(sock);
|
||||||
xbind(sock, &lsa->sa, sa_len);
|
xbind(sock, &lsa->u.sa, sa_len);
|
||||||
socket_want_pktinfo(sock);
|
socket_want_pktinfo(sock);
|
||||||
|
|
||||||
/* Doesn't work:
|
/* Doesn't work:
|
||||||
@ -358,16 +358,16 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
* instead - it will "intercept" all following packets, but child
|
* instead - it will "intercept" all following packets, but child
|
||||||
* does not expect data coming *from fd #1*! */
|
* does not expect data coming *from fd #1*! */
|
||||||
#if 0
|
#if 0
|
||||||
/* Make it so that local addr is fixed to localp->sa
|
/* Make it so that local addr is fixed to localp->u.sa
|
||||||
* and we don't accidentally accept packets to other local IPs. */
|
* and we don't accidentally accept packets to other local IPs. */
|
||||||
/* NB: we possibly bind to the _very_ same_ address & port as the one
|
/* NB: we possibly bind to the _very_ same_ address & port as the one
|
||||||
* already bound in parent! This seems to work in Linux.
|
* already bound in parent! This seems to work in Linux.
|
||||||
* (otherwise we can move socket to fd #0 only if bind succeeds) */
|
* (otherwise we can move socket to fd #0 only if bind succeeds) */
|
||||||
close(0);
|
close(0);
|
||||||
set_nport(localp, htons(local_port));
|
set_nport(localp, htons(local_port));
|
||||||
xmove_fd(xsocket(localp->sa.sa_family, SOCK_DGRAM, 0), 0);
|
xmove_fd(xsocket(localp->u.sa.sa_family, SOCK_DGRAM, 0), 0);
|
||||||
setsockopt_reuseaddr(0); /* crucial */
|
setsockopt_reuseaddr(0); /* crucial */
|
||||||
xbind(0, &localp->sa, localp->len);
|
xbind(0, &localp->u.sa, localp->len);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,11 +395,11 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
close(sock);
|
close(sock);
|
||||||
|
|
||||||
if (need_remote_ip)
|
if (need_remote_ip)
|
||||||
remote_addr = xmalloc_sockaddr2dotted(&remote.sa);
|
remote_addr = xmalloc_sockaddr2dotted(&remote.u.sa);
|
||||||
|
|
||||||
if (need_hostnames) {
|
if (need_hostnames) {
|
||||||
if (option_mask32 & OPT_h) {
|
if (option_mask32 & OPT_h) {
|
||||||
remote_hostname = xmalloc_sockaddr2host_noport(&remote.sa);
|
remote_hostname = xmalloc_sockaddr2host_noport(&remote.u.sa);
|
||||||
if (!remote_hostname) {
|
if (!remote_hostname) {
|
||||||
bb_error_msg("warning: cannot look up hostname for %s", remote_addr);
|
bb_error_msg("warning: cannot look up hostname for %s", remote_addr);
|
||||||
remote_hostname = (char*)"";
|
remote_hostname = (char*)"";
|
||||||
@ -410,11 +410,11 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
* which doesn't know local IP). */
|
* which doesn't know local IP). */
|
||||||
if (tcp) {
|
if (tcp) {
|
||||||
local.len = sa_len;
|
local.len = sa_len;
|
||||||
getsockname(0, &local.sa, &local.len);
|
getsockname(0, &local.u.sa, &local.len);
|
||||||
}
|
}
|
||||||
local_addr = xmalloc_sockaddr2dotted(&local.sa);
|
local_addr = xmalloc_sockaddr2dotted(&local.u.sa);
|
||||||
if (!local_hostname) {
|
if (!local_hostname) {
|
||||||
local_hostname = xmalloc_sockaddr2host_noport(&local.sa);
|
local_hostname = xmalloc_sockaddr2host_noport(&local.u.sa);
|
||||||
if (!local_hostname)
|
if (!local_hostname)
|
||||||
bb_error_msg_and_die("warning: cannot look up hostname for %s"+9, local_addr);
|
bb_error_msg_and_die("warning: cannot look up hostname for %s"+9, local_addr);
|
||||||
}
|
}
|
||||||
@ -440,8 +440,8 @@ int tcpudpsvd_main(int argc, char **argv)
|
|||||||
* from Linux firewall. Useful when you redirect
|
* from Linux firewall. Useful when you redirect
|
||||||
* an outbond connection to local handler, and it needs
|
* an outbond connection to local handler, and it needs
|
||||||
* to know where it originally tried to connect */
|
* to know where it originally tried to connect */
|
||||||
if (tcp && getsockopt(0, SOL_IP, SO_ORIGINAL_DST, &lsa->sa, &lsa->len) == 0) {
|
if (tcp && getsockopt(0, SOL_IP, SO_ORIGINAL_DST, &lsa->u.sa, &lsa->len) == 0) {
|
||||||
char *addr = xmalloc_sockaddr2dotted(&lsa->sa);
|
char *addr = xmalloc_sockaddr2dotted(&lsa->u.sa);
|
||||||
xsetenv("TCPORIGDSTADDR", addr);
|
xsetenv("TCPORIGDSTADDR", addr);
|
||||||
free(addr);
|
free(addr);
|
||||||
}
|
}
|
||||||
|
@ -99,13 +99,13 @@ int get_nport(const struct sockaddr *sa)
|
|||||||
void set_nport(len_and_sockaddr *lsa, unsigned port)
|
void set_nport(len_and_sockaddr *lsa, unsigned port)
|
||||||
{
|
{
|
||||||
#if ENABLE_FEATURE_IPV6
|
#if ENABLE_FEATURE_IPV6
|
||||||
if (lsa->sa.sa_family == AF_INET6) {
|
if (lsa->u.sa.sa_family == AF_INET6) {
|
||||||
lsa->sin6.sin6_port = port;
|
lsa->u.sin6.sin6_port = port;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (lsa->sa.sa_family == AF_INET) {
|
if (lsa->u.sa.sa_family == AF_INET) {
|
||||||
lsa->sin.sin_port = port;
|
lsa->u.sin.sin_port = port;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* What? UNIX socket? IPX?? :) */
|
/* What? UNIX socket? IPX?? :) */
|
||||||
@ -182,9 +182,9 @@ USE_FEATURE_IPV6(sa_family_t af,)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
r = xmalloc(offsetof(len_and_sockaddr, sa) + used_res->ai_addrlen);
|
r = xmalloc(offsetof(len_and_sockaddr, u.sa) + used_res->ai_addrlen);
|
||||||
r->len = used_res->ai_addrlen;
|
r->len = used_res->ai_addrlen;
|
||||||
memcpy(&r->sa, used_res->ai_addr, used_res->ai_addrlen);
|
memcpy(&r->u.sa, used_res->ai_addr, used_res->ai_addrlen);
|
||||||
set_nport(r, htons(port));
|
set_nport(r, htons(port));
|
||||||
ret:
|
ret:
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
@ -246,9 +246,9 @@ int xsocket_type(len_and_sockaddr **lsap, USE_FEATURE_IPV6(int family,) int sock
|
|||||||
len = sizeof(struct sockaddr_in6);
|
len = sizeof(struct sockaddr_in6);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
lsa = xzalloc(offsetof(len_and_sockaddr, sa) + len);
|
lsa = xzalloc(offsetof(len_and_sockaddr, u.sa) + len);
|
||||||
lsa->len = len;
|
lsa->len = len;
|
||||||
lsa->sa.sa_family = family;
|
lsa->u.sa.sa_family = family;
|
||||||
*lsap = lsa;
|
*lsap = lsa;
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@ -266,13 +266,13 @@ static int create_and_bind_or_die(const char *bindaddr, int port, int sock_type)
|
|||||||
if (bindaddr && bindaddr[0]) {
|
if (bindaddr && bindaddr[0]) {
|
||||||
lsa = xdotted2sockaddr(bindaddr, port);
|
lsa = xdotted2sockaddr(bindaddr, port);
|
||||||
/* user specified bind addr dictates family */
|
/* user specified bind addr dictates family */
|
||||||
fd = xsocket(lsa->sa.sa_family, sock_type, 0);
|
fd = xsocket(lsa->u.sa.sa_family, sock_type, 0);
|
||||||
} else {
|
} else {
|
||||||
fd = xsocket_type(&lsa, USE_FEATURE_IPV6(AF_UNSPEC,) sock_type);
|
fd = xsocket_type(&lsa, USE_FEATURE_IPV6(AF_UNSPEC,) sock_type);
|
||||||
set_nport(lsa, htons(port));
|
set_nport(lsa, htons(port));
|
||||||
}
|
}
|
||||||
setsockopt_reuseaddr(fd);
|
setsockopt_reuseaddr(fd);
|
||||||
xbind(fd, &lsa->sa, lsa->len);
|
xbind(fd, &lsa->u.sa, lsa->len);
|
||||||
free(lsa);
|
free(lsa);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@ -294,17 +294,17 @@ int create_and_connect_stream_or_die(const char *peer, int port)
|
|||||||
len_and_sockaddr *lsa;
|
len_and_sockaddr *lsa;
|
||||||
|
|
||||||
lsa = xhost2sockaddr(peer, port);
|
lsa = xhost2sockaddr(peer, port);
|
||||||
fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0);
|
fd = xsocket(lsa->u.sa.sa_family, SOCK_STREAM, 0);
|
||||||
setsockopt_reuseaddr(fd);
|
setsockopt_reuseaddr(fd);
|
||||||
xconnect(fd, &lsa->sa, lsa->len);
|
xconnect(fd, &lsa->u.sa, lsa->len);
|
||||||
free(lsa);
|
free(lsa);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int xconnect_stream(const len_and_sockaddr *lsa)
|
int xconnect_stream(const len_and_sockaddr *lsa)
|
||||||
{
|
{
|
||||||
int fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0);
|
int fd = xsocket(lsa->u.sa.sa_family, SOCK_STREAM, 0);
|
||||||
xconnect(fd, &lsa->sa, lsa->len);
|
xconnect(fd, &lsa->u.sa, lsa->len);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,7 +311,7 @@ int arping_main(int argc, char **argv)
|
|||||||
/* if (!inet_aton(target, &dst)) - not needed */ {
|
/* if (!inet_aton(target, &dst)) - not needed */ {
|
||||||
len_and_sockaddr *lsa;
|
len_and_sockaddr *lsa;
|
||||||
lsa = xhost_and_af2sockaddr(target, 0, AF_INET);
|
lsa = xhost_and_af2sockaddr(target, 0, AF_INET);
|
||||||
memcpy(&dst, &lsa->sin.sin_addr.s_addr, 4);
|
memcpy(&dst, &lsa->u.sin.sin_addr.s_addr, 4);
|
||||||
if (ENABLE_FEATURE_CLEAN_UP)
|
if (ENABLE_FEATURE_CLEAN_UP)
|
||||||
free(lsa);
|
free(lsa);
|
||||||
}
|
}
|
||||||
|
@ -371,11 +371,11 @@ int dnsd_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
lsa = xdotted2sockaddr(listen_interface, port);
|
lsa = xdotted2sockaddr(listen_interface, port);
|
||||||
udps = xsocket(lsa->sa.sa_family, SOCK_DGRAM, 0);
|
udps = xsocket(lsa->u.sa.sa_family, SOCK_DGRAM, 0);
|
||||||
xbind(udps, &lsa->sa, lsa->len);
|
xbind(udps, &lsa->u.sa, lsa->len);
|
||||||
/* xlisten(udps, 50); - ?!! DGRAM sockets are never listened on I think? */
|
/* xlisten(udps, 50); - ?!! DGRAM sockets are never listened on I think? */
|
||||||
bb_info_msg("Accepting UDP packets on %s",
|
bb_info_msg("Accepting UDP packets on %s",
|
||||||
xmalloc_sockaddr2dotted(&lsa->sa));
|
xmalloc_sockaddr2dotted(&lsa->u.sa));
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int r;
|
int r;
|
||||||
@ -385,7 +385,7 @@ int dnsd_main(int argc, char **argv)
|
|||||||
// Or else we can exhibit usual UDP ugliness:
|
// Or else we can exhibit usual UDP ugliness:
|
||||||
// [ip1.multihomed.ip2] <= query to ip1 <= peer
|
// [ip1.multihomed.ip2] <= query to ip1 <= peer
|
||||||
// [ip1.multihomed.ip2] => reply from ip2 => peer (confused)
|
// [ip1.multihomed.ip2] => reply from ip2 => peer (confused)
|
||||||
r = recvfrom(udps, buf, sizeof(buf), 0, &lsa->sa, &fromlen);
|
r = recvfrom(udps, buf, sizeof(buf), 0, &lsa->u.sa, &fromlen);
|
||||||
if (OPT_verbose)
|
if (OPT_verbose)
|
||||||
bb_info_msg("Got UDP packet");
|
bb_info_msg("Got UDP packet");
|
||||||
if (r < 12 || r > 512) {
|
if (r < 12 || r > 512) {
|
||||||
@ -395,7 +395,7 @@ int dnsd_main(int argc, char **argv)
|
|||||||
r = process_packet(buf);
|
r = process_packet(buf);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
continue;
|
continue;
|
||||||
sendto(udps, buf, r, 0, &lsa->sa, fromlen);
|
sendto(udps, buf, r, 0, &lsa->u.sa, fromlen);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -348,7 +348,7 @@ int ftpgetput_main(int argc, char **argv)
|
|||||||
server->lsa = xhost2sockaddr(argv[0], bb_lookup_port(port, "tcp", 21));
|
server->lsa = xhost2sockaddr(argv[0], bb_lookup_port(port, "tcp", 21));
|
||||||
if (verbose_flag) {
|
if (verbose_flag) {
|
||||||
printf("Connecting to %s (%s)\n", argv[0],
|
printf("Connecting to %s (%s)\n", argv[0],
|
||||||
xmalloc_sockaddr2dotted(&server->lsa->sa));
|
xmalloc_sockaddr2dotted(&server->lsa->u.sa));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connect/Setup/Configure the FTP session */
|
/* Connect/Setup/Configure the FTP session */
|
||||||
|
@ -1781,18 +1781,18 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
|
|||||||
iobuf = xmalloc(IOBUF_SIZE);
|
iobuf = xmalloc(IOBUF_SIZE);
|
||||||
|
|
||||||
rmt_ip = 0;
|
rmt_ip = 0;
|
||||||
if (fromAddr->sa.sa_family == AF_INET) {
|
if (fromAddr->u.sa.sa_family == AF_INET) {
|
||||||
rmt_ip = ntohl(fromAddr->sin.sin_addr.s_addr);
|
rmt_ip = ntohl(fromAddr->u.sin.sin_addr.s_addr);
|
||||||
}
|
}
|
||||||
#if ENABLE_FEATURE_IPV6
|
#if ENABLE_FEATURE_IPV6
|
||||||
if (fromAddr->sa.sa_family == AF_INET6
|
if (fromAddr->u.sa.sa_family == AF_INET6
|
||||||
&& fromAddr->sin6.sin6_addr.s6_addr32[0] == 0
|
&& fromAddr->u.sin6.sin6_addr.s6_addr32[0] == 0
|
||||||
&& fromAddr->sin6.sin6_addr.s6_addr32[1] == 0
|
&& fromAddr->u.sin6.sin6_addr.s6_addr32[1] == 0
|
||||||
&& ntohl(fromAddr->sin6.sin6_addr.s6_addr32[2]) == 0xffff)
|
&& ntohl(fromAddr->u.sin6.sin6_addr.s6_addr32[2]) == 0xffff)
|
||||||
rmt_ip = ntohl(fromAddr->sin6.sin6_addr.s6_addr32[3]);
|
rmt_ip = ntohl(fromAddr->u.sin6.sin6_addr.s6_addr32[3]);
|
||||||
#endif
|
#endif
|
||||||
if (ENABLE_FEATURE_HTTPD_CGI || DEBUG || verbose) {
|
if (ENABLE_FEATURE_HTTPD_CGI || DEBUG || verbose) {
|
||||||
rmt_ip_str = xmalloc_sockaddr2dotted(&fromAddr->sa);
|
rmt_ip_str = xmalloc_sockaddr2dotted(&fromAddr->u.sa);
|
||||||
}
|
}
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
/* this trick makes -v logging much simpler */
|
/* this trick makes -v logging much simpler */
|
||||||
@ -2047,7 +2047,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
|
|||||||
lsa = host2sockaddr(proxy_entry->host_port, 80);
|
lsa = host2sockaddr(proxy_entry->host_port, 80);
|
||||||
if (lsa == NULL)
|
if (lsa == NULL)
|
||||||
send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR);
|
send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR);
|
||||||
if (connect(proxy_fd, &lsa->sa, lsa->len) < 0)
|
if (connect(proxy_fd, &lsa->u.sa, lsa->len) < 0)
|
||||||
send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR);
|
send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR);
|
||||||
fdprintf(proxy_fd, "%s %s%s%s%s HTTP/%c.%c\r\n",
|
fdprintf(proxy_fd, "%s %s%s%s%s HTTP/%c.%c\r\n",
|
||||||
prequest, /* GET or POST */
|
prequest, /* GET or POST */
|
||||||
@ -2140,7 +2140,7 @@ static void mini_httpd(int server_socket)
|
|||||||
|
|
||||||
/* Wait for connections... */
|
/* Wait for connections... */
|
||||||
fromAddr.len = LSA_SIZEOF_SA;
|
fromAddr.len = LSA_SIZEOF_SA;
|
||||||
n = accept(server_socket, &fromAddr.sa, &fromAddr.len);
|
n = accept(server_socket, &fromAddr.u.sa, &fromAddr.len);
|
||||||
|
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
continue;
|
continue;
|
||||||
@ -2222,7 +2222,7 @@ static void mini_httpd_inetd(void)
|
|||||||
len_and_sockaddr fromAddr;
|
len_and_sockaddr fromAddr;
|
||||||
|
|
||||||
fromAddr.len = LSA_SIZEOF_SA;
|
fromAddr.len = LSA_SIZEOF_SA;
|
||||||
getpeername(0, &fromAddr.sa, &fromAddr.len);
|
getpeername(0, &fromAddr.u.sa, &fromAddr.len);
|
||||||
handle_incoming_and_exit(&fromAddr);
|
handle_incoming_and_exit(&fromAddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,12 +392,12 @@ int ifconfig_main(int argc, char **argv)
|
|||||||
continue; /* compat stuff */
|
continue; /* compat stuff */
|
||||||
lsa = xhost2sockaddr(host, 0);
|
lsa = xhost2sockaddr(host, 0);
|
||||||
#if ENABLE_FEATURE_IPV6
|
#if ENABLE_FEATURE_IPV6
|
||||||
if (lsa->sa.sa_family == AF_INET6) {
|
if (lsa->u.sa.sa_family == AF_INET6) {
|
||||||
int sockfd6;
|
int sockfd6;
|
||||||
struct in6_ifreq ifr6;
|
struct in6_ifreq ifr6;
|
||||||
|
|
||||||
memcpy((char *) &ifr6.ifr6_addr,
|
memcpy((char *) &ifr6.ifr6_addr,
|
||||||
(char *) &(lsa->sin6.sin6_addr),
|
(char *) &(lsa->u.sin6.sin6_addr),
|
||||||
sizeof(struct in6_addr));
|
sizeof(struct in6_addr));
|
||||||
|
|
||||||
/* Create a channel to the NET kernel. */
|
/* Create a channel to the NET kernel. */
|
||||||
@ -411,7 +411,7 @@ int ifconfig_main(int argc, char **argv)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
sai.sin_addr = lsa->sin.sin_addr;
|
sai.sin_addr = lsa->u.sin.sin_addr;
|
||||||
if (ENABLE_FEATURE_CLEAN_UP)
|
if (ENABLE_FEATURE_CLEAN_UP)
|
||||||
free(lsa);
|
free(lsa);
|
||||||
}
|
}
|
||||||
|
@ -103,14 +103,14 @@ int nc_main(int argc, char **argv)
|
|||||||
if (lport)
|
if (lport)
|
||||||
set_nport(lsa, htons(lport));
|
set_nport(lsa, htons(lport));
|
||||||
setsockopt_reuseaddr(sfd);
|
setsockopt_reuseaddr(sfd);
|
||||||
xbind(sfd, &lsa->sa, lsa->len);
|
xbind(sfd, &lsa->u.sa, lsa->len);
|
||||||
xlisten(sfd, do_listen); /* can be > 1 */
|
xlisten(sfd, do_listen); /* can be > 1 */
|
||||||
/* If we didn't specify a port number,
|
/* If we didn't specify a port number,
|
||||||
* query and print it after listen() */
|
* query and print it after listen() */
|
||||||
if (!lport) {
|
if (!lport) {
|
||||||
socklen_t addrlen = lsa->len;
|
socklen_t addrlen = lsa->len;
|
||||||
getsockname(sfd, &lsa->sa, &addrlen);
|
getsockname(sfd, &lsa->u.sa, &addrlen);
|
||||||
lport = get_nport(&lsa->sa);
|
lport = get_nport(&lsa->u.sa);
|
||||||
fdprintf(2, "%d\n", ntohs(lport));
|
fdprintf(2, "%d\n", ntohs(lport));
|
||||||
}
|
}
|
||||||
close_on_exec_on(sfd);
|
close_on_exec_on(sfd);
|
||||||
|
@ -209,7 +209,7 @@ int ping_main(int argc, char **argv)
|
|||||||
alarm(5); /* give the host 5000ms to respond */
|
alarm(5); /* give the host 5000ms to respond */
|
||||||
|
|
||||||
#if ENABLE_PING6
|
#if ENABLE_PING6
|
||||||
if (lsa->sa.sa_family == AF_INET6)
|
if (lsa->u.sa.sa_family == AF_INET6)
|
||||||
ping6(lsa);
|
ping6(lsa);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -532,12 +532,12 @@ static void ping4(len_and_sockaddr *lsa)
|
|||||||
int sockopt;
|
int sockopt;
|
||||||
|
|
||||||
pingsock = create_icmp_socket();
|
pingsock = create_icmp_socket();
|
||||||
pingaddr.sin = lsa->sin;
|
pingaddr.sin = lsa->u.sin;
|
||||||
if (source_lsa) {
|
if (source_lsa) {
|
||||||
if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
|
if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
|
||||||
&source_lsa->sa, source_lsa->len))
|
&source_lsa->u.sa, source_lsa->len))
|
||||||
bb_error_msg_and_die("can't set multicast source interface");
|
bb_error_msg_and_die("can't set multicast source interface");
|
||||||
xbind(pingsock, &source_lsa->sa, source_lsa->len);
|
xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
|
||||||
}
|
}
|
||||||
if (opt_I)
|
if (opt_I)
|
||||||
setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
|
setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
|
||||||
@ -584,10 +584,10 @@ static void ping6(len_and_sockaddr *lsa)
|
|||||||
char control_buf[CMSG_SPACE(36)];
|
char control_buf[CMSG_SPACE(36)];
|
||||||
|
|
||||||
pingsock = create_icmp6_socket();
|
pingsock = create_icmp6_socket();
|
||||||
pingaddr.sin6 = lsa->sin6;
|
pingaddr.sin6 = lsa->u.sin6;
|
||||||
/* untested whether "-I addr" really works for IPv6: */
|
/* untested whether "-I addr" really works for IPv6: */
|
||||||
if (source_lsa)
|
if (source_lsa)
|
||||||
xbind(pingsock, &source_lsa->sa, source_lsa->len);
|
xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
|
||||||
if (opt_I)
|
if (opt_I)
|
||||||
setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
|
setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
|
||||||
|
|
||||||
@ -670,12 +670,12 @@ static void ping(len_and_sockaddr *lsa)
|
|||||||
printf("PING %s (%s)", hostname, dotted);
|
printf("PING %s (%s)", hostname, dotted);
|
||||||
if (source_lsa) {
|
if (source_lsa) {
|
||||||
printf(" from %s",
|
printf(" from %s",
|
||||||
xmalloc_sockaddr2dotted_noport(&source_lsa->sa));
|
xmalloc_sockaddr2dotted_noport(&source_lsa->u.sa));
|
||||||
}
|
}
|
||||||
printf(": %d data bytes\n", datalen);
|
printf(": %d data bytes\n", datalen);
|
||||||
|
|
||||||
#if ENABLE_PING6
|
#if ENABLE_PING6
|
||||||
if (lsa->sa.sa_family == AF_INET6)
|
if (lsa->u.sa.sa_family == AF_INET6)
|
||||||
ping6(lsa);
|
ping6(lsa);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -720,11 +720,11 @@ int ping_main(int argc, char **argv)
|
|||||||
lsa = xhost_and_af2sockaddr(hostname, 0, AF_INET);
|
lsa = xhost_and_af2sockaddr(hostname, 0, AF_INET);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (source_lsa && source_lsa->sa.sa_family != lsa->sa.sa_family)
|
if (source_lsa && source_lsa->u.sa.sa_family != lsa->u.sa.sa_family)
|
||||||
/* leaking it here... */
|
/* leaking it here... */
|
||||||
source_lsa = NULL;
|
source_lsa = NULL;
|
||||||
|
|
||||||
dotted = xmalloc_sockaddr2dotted_noport(&lsa->sa);
|
dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
|
||||||
ping(lsa);
|
ping(lsa);
|
||||||
pingstats(0);
|
pingstats(0);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
@ -73,14 +73,14 @@ int pscan_main(int argc, char **argv)
|
|||||||
|
|
||||||
/* The SOCK_STREAM socket type is implemented on the TCP/IP protocol. */
|
/* The SOCK_STREAM socket type is implemented on the TCP/IP protocol. */
|
||||||
set_nport(lsap, htons(port));
|
set_nport(lsap, htons(port));
|
||||||
s = xsocket(lsap->sa.sa_family, SOCK_STREAM, 0);
|
s = xsocket(lsap->u.sa.sa_family, SOCK_STREAM, 0);
|
||||||
|
|
||||||
/* We need unblocking socket so we don't need to wait for ETIMEOUT. */
|
/* We need unblocking socket so we don't need to wait for ETIMEOUT. */
|
||||||
/* Nonblocking connect typically "fails" with errno == EINPROGRESS */
|
/* Nonblocking connect typically "fails" with errno == EINPROGRESS */
|
||||||
ndelay_on(s);
|
ndelay_on(s);
|
||||||
DMSG("connect to port %u", port);
|
DMSG("connect to port %u", port);
|
||||||
start = MONOTONIC_US();
|
start = MONOTONIC_US();
|
||||||
if (connect(s, &lsap->sa, lsap->len) == 0) {
|
if (connect(s, &lsap->u.sa, lsap->len) == 0) {
|
||||||
/* Unlikely, for me even localhost fails :) */
|
/* Unlikely, for me even localhost fails :) */
|
||||||
DMSG("connect succeeded");
|
DMSG("connect succeeded");
|
||||||
goto open;
|
goto open;
|
||||||
|
@ -127,7 +127,7 @@ static int tftp( USE_GETPUT(const int cmd,)
|
|||||||
char *cp;
|
char *cp;
|
||||||
|
|
||||||
unsigned org_port;
|
unsigned org_port;
|
||||||
len_and_sockaddr *const from = alloca(offsetof(len_and_sockaddr, sa) + peer_lsa->len);
|
len_and_sockaddr *const from = alloca(offsetof(len_and_sockaddr, u.sa) + peer_lsa->len);
|
||||||
|
|
||||||
/* Can't use RESERVE_CONFIG_BUFFER here since the allocation
|
/* Can't use RESERVE_CONFIG_BUFFER here since the allocation
|
||||||
* size varies meaning BUFFERS_GO_ON_STACK would fail */
|
* size varies meaning BUFFERS_GO_ON_STACK would fail */
|
||||||
@ -138,7 +138,7 @@ static int tftp( USE_GETPUT(const int cmd,)
|
|||||||
|
|
||||||
port = org_port = htons(port);
|
port = org_port = htons(port);
|
||||||
|
|
||||||
socketfd = xsocket(peer_lsa->sa.sa_family, SOCK_DGRAM, 0);
|
socketfd = xsocket(peer_lsa->u.sa.sa_family, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
/* build opcode */
|
/* build opcode */
|
||||||
opcode = TFTP_WRQ;
|
opcode = TFTP_WRQ;
|
||||||
@ -216,7 +216,7 @@ static int tftp( USE_GETPUT(const int cmd,)
|
|||||||
fprintf(stderr, "%02x ", (unsigned char) *cp);
|
fprintf(stderr, "%02x ", (unsigned char) *cp);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
#endif
|
#endif
|
||||||
xsendto(socketfd, xbuf, send_len, &peer_lsa->sa, peer_lsa->len);
|
xsendto(socketfd, xbuf, send_len, &peer_lsa->u.sa, peer_lsa->len);
|
||||||
/* Was it final ACK? then exit */
|
/* Was it final ACK? then exit */
|
||||||
if (finished && (opcode == TFTP_ACK))
|
if (finished && (opcode == TFTP_ACK))
|
||||||
goto ret;
|
goto ret;
|
||||||
@ -229,14 +229,14 @@ static int tftp( USE_GETPUT(const int cmd,)
|
|||||||
unsigned from_port;
|
unsigned from_port;
|
||||||
case 1:
|
case 1:
|
||||||
from->len = peer_lsa->len;
|
from->len = peer_lsa->len;
|
||||||
memset(&from->sa, 0, peer_lsa->len);
|
memset(&from->u.sa, 0, peer_lsa->len);
|
||||||
len = recvfrom(socketfd, rbuf, tftp_bufsize, 0,
|
len = recvfrom(socketfd, rbuf, tftp_bufsize, 0,
|
||||||
&from->sa, &from->len);
|
&from->u.sa, &from->len);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
bb_perror_msg("recvfrom");
|
bb_perror_msg("recvfrom");
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
from_port = get_nport(&from->sa);
|
from_port = get_nport(&from->u.sa);
|
||||||
if (port == org_port) {
|
if (port == org_port) {
|
||||||
/* Our first query went to port 69
|
/* Our first query went to port 69
|
||||||
* but reply will come from different one.
|
* but reply will come from different one.
|
||||||
@ -316,7 +316,7 @@ static int tftp( USE_GETPUT(const int cmd,)
|
|||||||
/*static const uint16_t error_8[2] = { htons(TFTP_ERROR), htons(8) };*/
|
/*static const uint16_t error_8[2] = { htons(TFTP_ERROR), htons(8) };*/
|
||||||
/* thus we open-code big-endian layout */
|
/* thus we open-code big-endian layout */
|
||||||
static const uint8_t error_8[4] = { 0,TFTP_ERROR, 0,8 };
|
static const uint8_t error_8[4] = { 0,TFTP_ERROR, 0,8 };
|
||||||
xsendto(socketfd, error_8, 4, &peer_lsa->sa, peer_lsa->len);
|
xsendto(socketfd, error_8, 4, &peer_lsa->u.sa, peer_lsa->len);
|
||||||
bb_error_msg("server proposes bad blksize %d, exiting", blksize);
|
bb_error_msg("server proposes bad blksize %d, exiting", blksize);
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ int tftp_main(int argc, char **argv)
|
|||||||
|
|
||||||
#if ENABLE_DEBUG_TFTP
|
#if ENABLE_DEBUG_TFTP
|
||||||
fprintf(stderr, "using server '%s', remotefile '%s', localfile '%s'\n",
|
fprintf(stderr, "using server '%s', remotefile '%s', localfile '%s'\n",
|
||||||
xmalloc_sockaddr2dotted(&peer_lsa->sa),
|
xmalloc_sockaddr2dotted(&peer_lsa->u.sa),
|
||||||
remotefile, localfile);
|
remotefile, localfile);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ static int read_ip(const char *line, void *arg)
|
|||||||
lsa = host_and_af2sockaddr(line, 0, AF_INET);
|
lsa = host_and_af2sockaddr(line, 0, AF_INET);
|
||||||
if (!lsa)
|
if (!lsa)
|
||||||
return 0;
|
return 0;
|
||||||
*(uint32_t*)arg = lsa->sin.sin_addr.s_addr;
|
*(uint32_t*)arg = lsa->u.sin.sin_addr.s_addr;
|
||||||
free(lsa);
|
free(lsa);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -535,7 +535,7 @@ int wget_main(int argc, char **argv)
|
|||||||
lsa = xhost2sockaddr(server.host, server.port);
|
lsa = xhost2sockaddr(server.host, server.port);
|
||||||
if (!(opt & WGET_OPT_QUIET)) {
|
if (!(opt & WGET_OPT_QUIET)) {
|
||||||
fprintf(stderr, "Connecting to %s (%s)\n", server.host,
|
fprintf(stderr, "Connecting to %s (%s)\n", server.host,
|
||||||
xmalloc_sockaddr2dotted(&lsa->sa));
|
xmalloc_sockaddr2dotted(&lsa->u.sa));
|
||||||
/* We leak result of xmalloc_sockaddr2dotted */
|
/* We leak result of xmalloc_sockaddr2dotted */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
procps/top.c
24
procps/top.c
@ -594,20 +594,20 @@ static void display_topmem_header(int scr_width)
|
|||||||
/* 9 */ char *anon;
|
/* 9 */ char *anon;
|
||||||
/* 10 */ char *map;
|
/* 10 */ char *map;
|
||||||
/* 11 */ char *slab;
|
/* 11 */ char *slab;
|
||||||
};
|
} u;
|
||||||
char *str[11];
|
char *str[11];
|
||||||
} Z;
|
} Z;
|
||||||
#define total Z.total
|
#define total Z.u.total
|
||||||
#define mfree Z.mfree
|
#define mfree Z.u.mfree
|
||||||
#define buf Z.buf
|
#define buf Z.u.buf
|
||||||
#define cache Z.cache
|
#define cache Z.u.cache
|
||||||
#define swaptotal Z.swaptotal
|
#define swaptotal Z.u.swaptotal
|
||||||
#define swapfree Z.swapfree
|
#define swapfree Z.u.swapfree
|
||||||
#define dirty Z.dirty
|
#define dirty Z.u.dirty
|
||||||
#define mwrite Z.mwrite
|
#define mwrite Z.u.mwrite
|
||||||
#define anon Z.anon
|
#define anon Z.u.anon
|
||||||
#define map Z.map
|
#define map Z.u.map
|
||||||
#define slab Z.slab
|
#define slab Z.u.slab
|
||||||
#define str Z.str
|
#define str Z.str
|
||||||
|
|
||||||
memset(&Z, 0, sizeof(Z));
|
memset(&Z, 0, sizeof(Z));
|
||||||
|
@ -525,7 +525,7 @@ static int try_to_resolve_remote(void)
|
|||||||
if (!G.remoteAddr)
|
if (!G.remoteAddr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return socket(G.remoteAddr->sa.sa_family, SOCK_DGRAM, 0);
|
return socket(G.remoteAddr->u.sa.sa_family, SOCK_DGRAM, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -592,7 +592,7 @@ static void do_syslogd(void)
|
|||||||
}
|
}
|
||||||
/* send message to remote logger, ignore possible error */
|
/* send message to remote logger, ignore possible error */
|
||||||
sendto(G.remoteFD, G.recvbuf, sz, MSG_DONTWAIT,
|
sendto(G.remoteFD, G.recvbuf, sz, MSG_DONTWAIT,
|
||||||
&G.remoteAddr->sa, G.remoteAddr->len);
|
&G.remoteAddr->u.sa, G.remoteAddr->len);
|
||||||
no_luck: ;
|
no_luck: ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1496,7 +1496,7 @@ static int singlemount(struct mntent *mp, int ignore_busy)
|
|||||||
|
|
||||||
// insert ip=... option into string flags.
|
// insert ip=... option into string flags.
|
||||||
|
|
||||||
dotted = xmalloc_sockaddr2dotted_noport(&lsa->sa);
|
dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
|
||||||
ip = xasprintf("ip=%s", dotted);
|
ip = xasprintf("ip=%s", dotted);
|
||||||
parse_mount_options(ip, &filteropts);
|
parse_mount_options(ip, &filteropts);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user