X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/32a6eec94d06dd7cd0a81dde8a0b916c80422130..2b058a997c64555ea1fcb748d5658e56a534f7bb:/src/src/ip.c diff --git a/src/src/ip.c b/src/src/ip.c index 4a1877dfd..6706b4479 100644 --- a/src/src/ip.c +++ b/src/src/ip.c @@ -248,13 +248,15 @@ return -1; } -/* +/* Create a socket and connect to host (name or number, ipv6 ok) + at one of port-range. Arguments: type SOCK_DGRAM or SOCK_STREAM af AF_INET6 or AF_INET for the socket type address the remote address, in text form portlo,porthi the remote port range timeout a timeout + connhost if not NULL, host_item filled in with connection details errstr pointer for allocated string on error Return: @@ -262,16 +264,16 @@ Return: */ int ip_connectedsocket(int type, const uschar * hostname, int portlo, int porthi, - int timeout, uschar ** errstr) + int timeout, host_item * connhost, uschar ** errstr) { int namelen, port; host_item shost; host_item *h; -int fd, fd4 = -1, fd6 = -1; +int af, fd, fd4 = -1, fd6 = -1; shost.next = NULL; shost.address = NULL; -shost.port = port; +shost.port = portlo; shost.mx = -1; namelen = Ustrlen(hostname); @@ -295,13 +297,13 @@ if (hostname[0] == '[' && /* Otherwise check for an unadorned IP address */ else if (string_is_ip_address(hostname, NULL) != 0) - shost.name = shost.address = hostname; + shost.name = shost.address = string_copy(hostname); /* Otherwise lookup IP address(es) from the name */ else { - shost.name = hostname; + shost.name = string_copy(hostname); if (host_find_byname(&shost, NULL, HOST_FIND_QUALIFY_SINGLE, NULL, FALSE) != HOST_FOUND) { @@ -315,8 +317,8 @@ else for (h = &shost; h != NULL; h = h->next) { fd = (Ustrchr(h->address, ':') != 0) - ? (fd6 < 0) ? (fd6 = ip_socket(SOCK_STREAM, AF_INET6)) : fd6 - : (fd4 < 0) ? (fd4 = ip_socket(SOCK_STREAM, AF_INET )) : fd4; + ? (fd6 < 0) ? (fd6 = ip_socket(SOCK_STREAM, af = AF_INET6)) : fd6 + : (fd4 < 0) ? (fd4 = ip_socket(SOCK_STREAM, af = AF_INET )) : fd4; if (fd < 0) { @@ -324,11 +326,16 @@ for (h = &shost; h != NULL; h = h->next) goto bad; } - for(port = portlo, port <= porthi; port++) + for(port = portlo; port <= porthi; port++) if (ip_connect(fd, af, h->address, port, timeout) == 0) { if (fd != fd6) close(fd6); if (fd != fd4) close(fd4); + if (connhost) { + h->port = port; + *connhost = *h; + connhost->next = NULL; + } return fd; } }