Try to resolve hostnames into ip addresses
Dont assume everyone just uses dotted-decimal always on their networks. Try resolve hostnames specified in the iscsi URLs into addresses
This commit is contained in:
+17
-4
@@ -27,6 +27,7 @@
|
|||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <netdb.h>
|
||||||
#include "iscsi.h"
|
#include "iscsi.h"
|
||||||
#include "iscsi-private.h"
|
#include "iscsi-private.h"
|
||||||
#include "slist.h"
|
#include "slist.h"
|
||||||
@@ -81,10 +82,22 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
|
|||||||
sin->sin_family = AF_INET;
|
sin->sin_family = AF_INET;
|
||||||
sin->sin_port = htons(port);
|
sin->sin_port = htons(port);
|
||||||
if (inet_pton(AF_INET, addr, &sin->sin_addr) != 1) {
|
if (inet_pton(AF_INET, addr, &sin->sin_addr) != 1) {
|
||||||
iscsi_set_error(iscsi, "Invalid target:%s "
|
struct hostent *he;
|
||||||
"Failed to convert to ip address.", addr);
|
|
||||||
free(addr);
|
he = gethostbyname2(addr, AF_INET);
|
||||||
return -1;
|
if (he == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Invalid target:%s "
|
||||||
|
"Failed to resolve hostname.", addr);
|
||||||
|
free(addr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (he->h_addrtype != AF_INET) {
|
||||||
|
iscsi_set_error(iscsi, "Invalid target:%s "
|
||||||
|
"Can not resolve into IPv4.", addr);
|
||||||
|
free(addr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sin->sin_addr.s_addr = *(uint32_t *)he->h_addr_list[0];
|
||||||
}
|
}
|
||||||
free(addr);
|
free(addr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user