|
@@ -109,7 +109,7 @@ build_socks_resolve_request(char **out,
|
|
|
static int
|
|
|
parse_socks4a_resolve_response(const char *hostname,
|
|
|
const char *response, size_t len,
|
|
|
- uint32_t *addr_out)
|
|
|
+ tor_addr_t *addr_out)
|
|
|
{
|
|
|
uint8_t status;
|
|
|
tor_assert(response);
|
|
@@ -140,7 +140,7 @@ parse_socks4a_resolve_response(const char *hostname,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- *addr_out = ntohl(get_uint32(response+4));
|
|
|
+ tor_addr_from_ipv4n(addr_out, get_uint32(response+4));
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -179,7 +179,7 @@ socks5_reason_to_string(char reason)
|
|
|
static int
|
|
|
do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
|
|
|
int reverse, int version,
|
|
|
- uint32_t *result_addr, char **result_hostname)
|
|
|
+ tor_addr_t *result_addr, char **result_hostname)
|
|
|
{
|
|
|
int s;
|
|
|
struct sockaddr_in socksaddr;
|
|
@@ -190,7 +190,7 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
|
|
|
tor_assert(result_addr);
|
|
|
tor_assert(version == 4 || version == 5);
|
|
|
|
|
|
- *result_addr = 0;
|
|
|
+ tor_addr_make_unspec(result_addr);
|
|
|
*result_hostname = NULL;
|
|
|
|
|
|
s = tor_open_socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
|
|
@@ -255,7 +255,7 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
|
|
|
return -1;
|
|
|
}
|
|
|
} else {
|
|
|
- char reply_buf[4];
|
|
|
+ char reply_buf[16];
|
|
|
if (read_all(s, reply_buf, 4, 1) != 4) {
|
|
|
log_err(LD_NET, "Error reading SOCKS5 response.");
|
|
|
return -1;
|
|
@@ -284,8 +284,16 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
|
|
|
log_err(LD_NET, "Error reading address in socks5 response.");
|
|
|
return -1;
|
|
|
}
|
|
|
- *result_addr = ntohl(get_uint32(reply_buf));
|
|
|
+ tor_addr_from_ipv4n(result_addr, get_uint32(reply_buf));
|
|
|
+ } else if (reply_buf[3] == 4) {
|
|
|
+ /* IPv6 address */
|
|
|
+ if (read_all(s, reply_buf, 16, 1) != 16) {
|
|
|
+ log_err(LD_NET, "Error reading address in socks5 response.");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ tor_addr_from_ipv6_bytes(result_addr, reply_buf);
|
|
|
} else if (reply_buf[3] == 3) {
|
|
|
+ /* Domain name */
|
|
|
size_t result_len;
|
|
|
if (read_all(s, reply_buf, 1, 1) != 1) {
|
|
|
log_err(LD_NET, "Error reading address_length in socks5 response.");
|
|
@@ -322,10 +330,8 @@ main(int argc, char **argv)
|
|
|
int isSocks4 = 0, isVerbose = 0, isReverse = 0;
|
|
|
char **arg;
|
|
|
int n_args;
|
|
|
- struct in_addr a;
|
|
|
- uint32_t result = 0;
|
|
|
+ tor_addr_t result;
|
|
|
char *result_hostname = NULL;
|
|
|
- char buf[INET_NTOA_BUF_LEN];
|
|
|
log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t));
|
|
|
|
|
|
init_logging();
|
|
@@ -423,9 +429,7 @@ main(int argc, char **argv)
|
|
|
if (result_hostname) {
|
|
|
printf("%s\n", result_hostname);
|
|
|
} else {
|
|
|
- a.s_addr = htonl(result);
|
|
|
- tor_inet_ntoa(&a, buf, sizeof(buf));
|
|
|
- printf("%s\n", buf);
|
|
|
+ printf("%s\n", fmt_addr(&result));
|
|
|
}
|
|
|
return 0;
|
|
|
}
|