extern struct hostent *xgethostbyname2(const char *name, int af);
extern int create_icmp_socket(void);
extern int create_icmp6_socket(void);
-extern int xconnect(struct sockaddr_in *s_addr);
+extern void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen);
+extern int xconnect_tcp_v4(struct sockaddr_in *s_addr);
+
extern unsigned short bb_lookup_port(const char *port, const char *protocol, unsigned short default_port);
extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host);
memcpy(&(s_in->sin_addr), he->h_addr_list[0], he->h_length);
}
-int xconnect(struct sockaddr_in *s_addr)
+void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
{
- int s = xsocket(AF_INET, SOCK_STREAM, 0);
- if (connect(s, (struct sockaddr *)s_addr, sizeof(struct sockaddr_in)) < 0)
- {
+ if (connect(s, s_addr, addrlen) < 0) {
if (ENABLE_FEATURE_CLEAN_UP) close(s);
- bb_perror_msg_and_die("unable to connect to remote host (%s)",
- inet_ntoa(s_addr->sin_addr));
+ if (s_addr->sa_family == AF_INET)
+ bb_perror_msg_and_die("unable to connect to remote host (%s)",
+ inet_ntoa(((struct sockaddr_in *)s_addr)->sin_addr));
+ bb_perror_msg_and_die("unable to connect to remote host");
}
+}
+
+int xconnect_tcp_v4(struct sockaddr_in *s_addr)
+{
+ int s = xsocket(AF_INET, SOCK_STREAM, 0);
+ xconnect(s, (struct sockaddr*) s_addr, sizeof(*s_addr));
return s;
}
port_num += xatoul_range(buf_ptr + 1, 0, 255) * 256;
server->s_in->sin_port = htons(port_num);
- return xconnect(server->s_in);
+ return xconnect_tcp_v4(server->s_in);
}
static FILE *ftp_login(ftp_host_info_t *server)
char buf[512];
/* Connect to the command socket */
- control_stream = fdopen(xconnect(server->s_in), "r+");
+ control_stream = fdopen(xconnect_tcp_v4(server->s_in), "r+");
if (control_stream == NULL) {
bb_perror_msg_and_die("cannot open control stream");
}
s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23);
#endif
- G.netfd = xconnect(&s_in);
+ G.netfd = xconnect_tcp_v4(&s_in);
setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
{
FILE *fp;
- fp = fdopen(xconnect(s_in), "r+");
+ fp = fdopen(xconnect_tcp_v4(s_in), "r+");
if (fp == NULL)
bb_perror_msg_and_die("fdopen");
alarm(10);
signal(SIGALRM, socket_timeout);
- fd = xconnect(&s_in);
+ fd = xconnect_tcp_v4(&s_in);
if (safe_read(fd, (void *)&nett, 4) != 4) /* read time from server */
bb_error_msg_and_die("%s did not send the complete time", host);