1006 |
*/ |
*/ |
1007 |
|
|
1008 |
int |
int |
1009 |
resolve(char *hostname, char *ip, int *version) |
resolve (char *hostname, char *ip, int *version) |
1010 |
{ |
{ |
1011 |
|
char ipbuffer[NI_MAXHOST]; |
1012 |
|
struct addrinfo *res; |
1013 |
|
|
1014 |
|
if (version != NULL) |
1015 |
|
*version = 0; |
1016 |
|
|
1017 |
|
if (getaddrinfo(hostname, NULL, NULL, &res) != 0) |
1018 |
|
return 1; |
1019 |
|
|
1020 |
|
if (!res) |
1021 |
|
return 1; |
1022 |
|
|
1023 |
|
if (getnameinfo(res->ai_addr, res->ai_addrlen, ipbuffer, sizeof(ipbuffer), NULL, 0, NI_NUMERICHOST) != 0) |
1024 |
|
{ |
1025 |
|
freeaddrinfo (res); |
1026 |
|
return 1; |
1027 |
|
} |
1028 |
|
|
1029 |
|
if ((res->ai_family == AF_INET) && (version != NULL)) |
1030 |
|
*version = 4; |
1031 |
|
if ((res->ai_family == AF_INET6) && (version != NULL)) |
1032 |
|
*version = 6; |
1033 |
|
|
1034 |
|
strcpy(ip, ipbuffer); |
1035 |
|
|
1036 |
char ipbuffer[NI_MAXHOST]; |
freeaddrinfo (res); |
1037 |
struct addrinfo *res; |
|
1038 |
|
return 0; |
|
if (version != NULL) |
|
|
*version = 0; |
|
|
|
|
|
if (getaddrinfo(hostname, NULL, NULL, &res) != 0) |
|
|
return 1; |
|
|
|
|
|
if (!res) |
|
|
return 1; |
|
|
|
|
|
if (getnameinfo(res->ai_addr, res->ai_addrlen, ipbuffer, sizeof(ipbuffer), NULL, 0, NI_NUMERICHOST) != 0) |
|
|
return 1; |
|
|
|
|
|
if ((res->ai_family == AF_INET) && (version != NULL)) |
|
|
*version = 4; |
|
|
if ((res->ai_family == AF_INET6) && (version != NULL)) |
|
|
*version = 6; |
|
|
|
|
|
strcpy(ip, ipbuffer); |
|
|
|
|
|
return 0; |
|
1039 |
} |
} |
1040 |
|
|
1041 |
/* |
/* |
1253 |
struct addrinfo hints, *res; |
struct addrinfo hints, *res; |
1254 |
|
|
1255 |
if (cfg_proxy_use) |
if (cfg_proxy_use) |
1256 |
{ |
{ |
1257 |
memset (&hints, 0, sizeof(hints)); |
memset (&hints, 0, sizeof(hints)); |
1258 |
hints.ai_family = (cfg_proxy_ipv6) ? AF_INET6 : AF_INET; |
hints.ai_family = (cfg_proxy_ipv6) ? AF_INET6 : AF_INET; |
1259 |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_socktype = SOCK_STREAM; |
1260 |
if (getaddrinfo (cfg_proxy_address, NULL, &hints, &res) !=0) |
if (getaddrinfo (cfg_proxy_address, NULL, &hints, &res) !=0) |
1261 |
{ |
{ |
1262 |
write(server->child_write, "1", 1); |
write(server->child_write, "1", 1); |
1263 |
return 0; |
return 0; |
1264 |
} |
} |
1265 |
if ((cfg_proxy_ipv6 && (res->ai_family != AF_INET6)) |
if ((cfg_proxy_ipv6 && (res->ai_family != AF_INET6)) |
1266 |
|| ((!cfg_proxy_ipv6 && (res->ai_family != AF_INET)))) |
|| ((!cfg_proxy_ipv6 && (res->ai_family != AF_INET)))) |
1267 |
{ |
{ |
1268 |
write(server->child_write, "2", 1); |
write(server->child_write, "2", 1); |
1269 |
|
freeaddrinfo (res); |
1270 |
return 0; |
return 0; |
1271 |
} |
} |
1272 |
|
|
1273 |
if (cfg_proxy_ipv6) |
if (cfg_proxy_ipv6) |
1274 |
((struct sockaddr_in6 *)(res->ai_addr))->sin6_port = htons (cfg_proxy_port); |
((struct sockaddr_in6 *)(res->ai_addr))->sin6_port = htons (cfg_proxy_port); |
1275 |
else |
else |
1276 |
((struct sockaddr_in *)(res->ai_addr))->sin_port = htons (cfg_proxy_port); |
((struct sockaddr_in *)(res->ai_addr))->sin_port = htons (cfg_proxy_port); |
1277 |
|
|
1278 |
if (connect (server->sock, res->ai_addr, res->ai_addrlen) != 0) |
if (connect (server->sock, res->ai_addr, res->ai_addrlen) != 0) |
1279 |
{ |
{ |
1280 |
write(server->child_write, "3", 1); |
write(server->child_write, "3", 1); |
1281 |
|
freeaddrinfo (res); |
1282 |
return 0; |
return 0; |
1283 |
} |
} |
1284 |
|
|
1285 |
if (pass_proxy(server)) |
if (pass_proxy(server)) |
1286 |
{ |
{ |
1287 |
write(server->child_write, "4", 1); |
write(server->child_write, "4", 1); |
1288 |
|
freeaddrinfo (res); |
1289 |
return 0; |
return 0; |
1290 |
} |
} |
1291 |
} |
} |
1292 |
else |
else |
1293 |
{ |
{ |
1294 |
memset (&hints, 0, sizeof(hints)); |
memset (&hints, 0, sizeof(hints)); |
1295 |
hints.ai_family = (server->ipv6) ? AF_INET6 : AF_INET; |
hints.ai_family = (server->ipv6) ? AF_INET6 : AF_INET; |
1296 |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_socktype = SOCK_STREAM; |
1297 |
if (getaddrinfo (server->address, NULL, &hints, &res) !=0) |
if (getaddrinfo (server->address, NULL, &hints, &res) !=0) |
1298 |
{ |
{ |
1299 |
write(server->child_write, "1", 1); |
write(server->child_write, "1", 1); |
1300 |
return 0; |
return 0; |
1301 |
} |
} |
1302 |
if ((server->ipv6 && (res->ai_family != AF_INET6)) |
if ((server->ipv6 && (res->ai_family != AF_INET6)) |
1303 |
|| ((!server->ipv6 && (res->ai_family != AF_INET)))) |
|| ((!server->ipv6 && (res->ai_family != AF_INET)))) |
1304 |
{ |
{ |
1305 |
write(server->child_write, "2", 1); |
write(server->child_write, "2", 1); |
1306 |
|
freeaddrinfo (res); |
1307 |
return 0; |
return 0; |
1308 |
} |
} |
1309 |
|
|
1310 |
if (server->ipv6) |
if (server->ipv6) |
1311 |
((struct sockaddr_in6 *)(res->ai_addr))->sin6_port = htons (server->port); |
((struct sockaddr_in6 *)(res->ai_addr))->sin6_port = htons (server->port); |
1312 |
else |
else |
1313 |
((struct sockaddr_in *)(res->ai_addr))->sin_port = htons (server->port); |
((struct sockaddr_in *)(res->ai_addr))->sin_port = htons (server->port); |
1314 |
|
|
1315 |
if (connect (server->sock, res->ai_addr, res->ai_addrlen) != 0) |
if (connect (server->sock, res->ai_addr, res->ai_addrlen) != 0) |
1316 |
{ |
{ |
1317 |
write(server->child_write, "3", 1); |
write(server->child_write, "3", 1); |
1318 |
|
freeaddrinfo (res); |
1319 |
return 0; |
return 0; |
1320 |
} |
} |
1321 |
} |
} |
1322 |
|
|
1323 |
write (server->child_write, "0", 1); |
write (server->child_write, "0", 1); |
1324 |
|
freeaddrinfo (res); |
1325 |
return 0; |
return 0; |
1326 |
} |
} |
1327 |
|
|