static int do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, uint32_t *result_addr) { int s; struct sockaddr_in socksaddr; char *req, *cp; int r, len; char response_buf[RESPONSE_LEN]; show_msg(MSGDEBUG, "do_resolve: resolving %s\n", hostname); s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s<0) { show_msg(MSGWARN, "do_resolve: problem creating socket\n"); return -1; } memset(&socksaddr, 0, sizeof(socksaddr)); socksaddr.sin_family = AF_INET; socksaddr.sin_port = htons(socksport); socksaddr.sin_addr.s_addr = htonl(sockshost); if (connect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) { show_msg(MSGWARN, "do_resolve: error connecting to SOCKS server\n"); return -1; } if ((len = build_socks4a_resolve_request(&req, "", hostname))<0) { show_msg(MSGWARN, "do_resolve: error generating SOCKS request\n"); return -1; } cp = req; while (len) { r = (int)send(s, cp, len, 0); if (r<0) { show_msg(MSGWARN, "do_resolve: error sending SOCKS request\n"); free(req); return -1; } len -= r; cp += r; } free(req); len = 0; while (len < RESPONSE_LEN) { r = (int)recv(s, response_buf+len, RESPONSE_LEN-len, 0); if (r==0) { show_msg(MSGWARN, "do_resolve: EOF while reading SOCKS response\n"); return -1; } if (r<0) { show_msg(MSGWARN, "do_resolve: error reading SOCKS response\n"); return -1; } len += r; } close(s); if (parse_socks4a_resolve_response(response_buf, RESPONSE_LEN, result_addr) < 0){ show_msg(MSGWARN, "do_resolve: error parsing SOCKS response\n"); return -1; } show_msg(MSGDEBUG, "do_resolve: success\n"); return 0; }
static int do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, uint32_t *result_addr, const void *addr, int version, int reverse, char **result_hostname) { int s; struct sockaddr_in socksaddr; char *req, *cp=NULL; int r, len, hslen; char response_buf[RESPONSE_LEN]; const char *handshake="\x05\x01\x00"; show_msg(MSGDEBUG, "do_resolve: resolving %s\n", hostname); /* Create SOCKS connection */ s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s<0) { show_msg(MSGWARN, "do_resolve: problem creating socket\n"); return -1; } /* Connect to SOCKS server */ memset(&socksaddr, 0, sizeof(socksaddr)); socksaddr.sin_family = AF_INET; socksaddr.sin_port = htons(socksport); socksaddr.sin_addr.s_addr = htonl(sockshost); if (realconnect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) { show_msg(MSGWARN, "do_resolve: error connecting to SOCKS server\n"); realclose(s); return -1; } /* If a SOCKS5 connection, perform handshake */ if (version == 5) { char method_buf[2]; hslen=3; while (hslen) { r = send(s, handshake, hslen, 0); if (r<0) { show_msg(MSGWARN, "do_resolve: error sending SOCKS5 method list.\n"); realclose(s); return -1; } hslen -= r; handshake += r; } len = 0; while (len < METHODRESPONSE_LEN) { r = recv(s, method_buf+len, METHODRESPONSE_LEN-len, 0); if (r==0) { show_msg(MSGWARN, "do_resolve: EOF while reading SOCKS response\n"); realclose(s); return -1; } if (r<0) { show_msg(MSGWARN, "do_resolve: error reading SOCKS response\n"); realclose(s); return -1; } len += r; } if (method_buf[0] != '\x05') { show_msg(MSGWARN, "Unrecognized socks version: %u", (unsigned)method_buf[0]); realclose(s); return -1; } if (method_buf[1] != '\x00') { show_msg(MSGWARN, "Unrecognized socks authentication method: %u", (unsigned)method_buf[1]); realclose(s); return -1; } } /* Create SOCKS request */ if (reverse) { if ((len = build_socks5_resolve_ptr_request(&req, addr))<0) { show_msg(MSGWARN, "do_resolve: error generating reverse SOCKS request\n"); realclose(s); return -1; } }else{ if ((len = build_socks4a_resolve_request(&req, "", hostname))<0) { show_msg(MSGWARN, "do_resolve: error generating SOCKS request\n"); realclose(s); return -1; } } /* Send SOCKS request */ cp = req; while (len) { r = send(s, cp, len, 0); if (r<0) { show_msg(MSGWARN, "do_resolve: error sending SOCKS request\n"); free(req); realclose(s); return -1; } len -= r; cp += r; } free(req); /* Handle SOCKS Response */ if (reverse) { if (parse_socks5_resolve_ptr_response(s, response_buf, RESPONSE_LEN, result_addr, &result_hostname) < 0){ show_msg(MSGWARN, "do_resolve: error parsing SOCKS response\n"); realclose(s); return -1; } }else{ /* Process SOCKS response */ len = 0; while (len < RESPONSE_LEN) { r = recv(s, response_buf+len, RESPONSE_LEN-len, 0); if (r==0) { show_msg(MSGWARN, "do_resolve: EOF while reading SOCKS response\n"); realclose(s); return -1; } if (r<0) { show_msg(MSGWARN, "do_resolve: error reading SOCKS response\n"); realclose(s); return -1; } len += r; } realclose(s); /* Parse SOCKS response */ if (parse_socks4a_resolve_response(response_buf, RESPONSE_LEN, result_addr) < 0){ show_msg(MSGWARN, "do_resolve: error parsing SOCKS response\n"); return -1; } } show_msg(MSGDEBUG, "do_resolve: success\n"); return 0; }