(getnameinfo_verified): handle the case of forward but no backward DNS
information, and also describe the desired behaviour. from Love <lha@stacken.kth.se> git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@11395 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999 - 2001 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1999 - 2002 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -38,6 +38,14 @@ RCSID("$Id$");
|
|||||||
|
|
||||||
#include "roken.h"
|
#include "roken.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to obtain a verified name for the address in `sa, salen' (much
|
||||||
|
* similar to getnameinfo).
|
||||||
|
* Verified in this context means that forwards and backwards lookups
|
||||||
|
* in DNS are consistent. If that fails, return an error if the
|
||||||
|
* NI_NAMEREQD flag is set or return the numeric address as a string.
|
||||||
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
getnameinfo_verified(const struct sockaddr *sa, socklen_t salen,
|
getnameinfo_verified(const struct sockaddr *sa, socklen_t salen,
|
||||||
char *host, size_t hostlen,
|
char *host, size_t hostlen,
|
||||||
@@ -60,13 +68,13 @@ getnameinfo_verified(const struct sockaddr *sa, socklen_t salen,
|
|||||||
ret = getnameinfo (sa, salen, host, hostlen, serv, servlen,
|
ret = getnameinfo (sa, salen, host, hostlen, serv, servlen,
|
||||||
flags | NI_NUMERICSERV);
|
flags | NI_NUMERICSERV);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto fail;
|
||||||
|
|
||||||
memset (&hints, 0, sizeof(hints));
|
memset (&hints, 0, sizeof(hints));
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
ret = getaddrinfo (host, serv, &hints, &ai);
|
ret = getaddrinfo (host, serv, &hints, &ai);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto fail;
|
||||||
for (a = ai; a != NULL; a = a->ai_next) {
|
for (a = ai; a != NULL; a = a->ai_next) {
|
||||||
if (a->ai_addrlen == salen
|
if (a->ai_addrlen == salen
|
||||||
&& memcmp (a->ai_addr, sa, salen) == 0) {
|
&& memcmp (a->ai_addr, sa, salen) == 0) {
|
||||||
@@ -75,6 +83,7 @@ getnameinfo_verified(const struct sockaddr *sa, socklen_t salen,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
freeaddrinfo (ai);
|
freeaddrinfo (ai);
|
||||||
|
fail:
|
||||||
if (flags & NI_NAMEREQD)
|
if (flags & NI_NAMEREQD)
|
||||||
return EAI_NONAME;
|
return EAI_NONAME;
|
||||||
ret = getnameinfo (sa, salen, host, hostlen, serv, servlen,
|
ret = getnameinfo (sa, salen, host, hostlen, serv, servlen,
|
||||||
|
Reference in New Issue
Block a user