From 2afebc2b639e5819c16fc0c02c28243c61d686fd Mon Sep 17 00:00:00 2001 From: joe Date: Fri, 10 Aug 2007 13:05:10 +0000 Subject: * src/ne_socket.h (ne_iaddr_reverse), src/ne_socket.c (ne_iaddr_reverse): New function. * test/socket.c (addr_reverse): New tests. * macros/neon.m4 (LIBNEON_SOURCE_CHECKS): Check for getnameinfo too. git-svn-id: http://svn.webdav.org/repos/projects/neon/trunk@1220 61a7d7f5-40b7-0310-9c16-bb0ea8cb1845 --- macros/neon.m4 | 2 +- src/ne_socket.c | 19 ++++++++++++++++++- src/ne_socket.h | 5 +++++ test/socket.c | 26 +++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/macros/neon.m4 b/macros/neon.m4 index 74ec207..c8e9d96 100644 --- a/macros/neon.m4 +++ b/macros/neon.m4 @@ -631,7 +631,7 @@ NE_SEARCH_LIBS(getaddrinfo, nsl,, AC_MSG_NOTICE([getaddrinfo support disabled on HP-UX 11.0x/11.1x]) ;; *) ne_enable_gai=yes - NE_CHECK_FUNCS(gai_strerror inet_ntop,,[ne_enable_gai=no; break]) ;; + NE_CHECK_FUNCS(gai_strerror getnameinfo inet_ntop,,[ne_enable_gai=no; break]) ;; esac ]) diff --git a/src/ne_socket.c b/src/ne_socket.c index d4dcb06..c1a4230 100644 --- a/src/ne_socket.c +++ b/src/ne_socket.c @@ -1,6 +1,6 @@ /* Socket handling routines - Copyright (C) 1998-2006, Joe Orton , + Copyright (C) 1998-2007, Joe Orton , Copyright (C) 1999-2000 Tommi Komulainen Copyright (C) 2004 Aleix Conchillo Flaque @@ -955,6 +955,23 @@ char *ne_iaddr_print(const ne_inet_addr *ia, char *buf, size_t bufsiz) return buf; } +int ne_iaddr_reverse(const ne_inet_addr *ia, char *buf, size_t bufsiz) +{ +#ifdef USE_GETADDRINFO + return getnameinfo(ia->ai_addr, ia->ai_addrlen, buf, bufsiz, + NULL, 0, 0); +#else + struct hostent *hp; + + hp = gethostbyaddr(ia, sizeof *ia, AF_INET); + if (hp && hp->h_name) { + ne_strnzcpy(buf, hp->h_name, bufsiz); + return 0; + } + return -1; +#endif +} + void ne_addr_destroy(ne_sock_addr *addr) { #ifdef USE_GETADDRINFO diff --git a/src/ne_socket.h b/src/ne_socket.h index dfdfb60..26a129d 100644 --- a/src/ne_socket.h +++ b/src/ne_socket.h @@ -110,6 +110,11 @@ ne_iaddr_type ne_iaddr_typeof(const ne_inet_addr *ia); * buffer 'buffer', which is of length 'bufsiz'. Returns 'buffer'. */ char *ne_iaddr_print(const ne_inet_addr *ia, char *buffer, size_t bufsiz); +/* Perform the reverse name lookup on network address 'ia', placing + * the returned name in the 'buf' buffer (of length 'bufsiz') if + * successful. Returns zero on success, or non-zero on error. */ +int ne_iaddr_reverse(const ne_inet_addr *ia, char *buf, size_t bufsiz); + /* Destroy a network address object created using ne_iaddr_make. */ void ne_iaddr_free(ne_inet_addr *addr); diff --git a/test/socket.c b/test/socket.c index 9d82878..6fdf720 100644 --- a/test/socket.c +++ b/test/socket.c @@ -1,6 +1,6 @@ /* Socket handling tests - Copyright (C) 2002-2006, Joe Orton + Copyright (C) 2002-2007, Joe Orton This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -316,6 +316,29 @@ static int addr_compare(void) return OK; } +static int addr_reverse(void) +{ + ne_inet_addr *ia = ne_iaddr_make(ne_iaddr_ipv4, raw_127); + char buf[128]; + + ONN("ne_iaddr_make returned NULL", ia == NULL); + + ONN("reverse lookup for 127.0.0.1 failed", + ne_iaddr_reverse(ia, buf, sizeof buf) != 0); + + ONV(!(strcmp(buf, "localhost.localdomain") == 0 + || strcmp(buf, "localhost") == 0), + ("reverse lookup for 127.0.0.1 got %s", buf)); + + char *c = canonical_dns("www.manyfish.co.uk"); + ONV(strcmp(c, "monolith.manyfish.co.uk"), + ("canon failed: %s", c)); + + ne_iaddr_free(ia); + + return OK; +} + static int just_connect(void) { ne_socket *sock; @@ -1041,6 +1064,7 @@ ne_test tests[] = { T(addr_make_v4), T(addr_make_v6), T(addr_compare), + T(addr_reverse), T(just_connect), T(addr_connect), T(read_close), -- cgit v1.2.1