summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2007-08-10 13:05:10 +0000
committerjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2007-08-10 13:05:10 +0000
commit2afebc2b639e5819c16fc0c02c28243c61d686fd (patch)
treed0256c697558361c0191ea8729b9a95090291770
parentc5560c55cc241aeb952b0530e5d1f4682f288168 (diff)
downloadneon-2afebc2b639e5819c16fc0c02c28243c61d686fd.tar.gz
* 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
-rw-r--r--macros/neon.m42
-rw-r--r--src/ne_socket.c19
-rw-r--r--src/ne_socket.h5
-rw-r--r--test/socket.c26
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 <joe@manyfish.co.uk>,
+ Copyright (C) 1998-2007, Joe Orton <joe@manyfish.co.uk>,
Copyright (C) 1999-2000 Tommi Komulainen <Tommi.Komulainen@iki.fi>
Copyright (C) 2004 Aleix Conchillo Flaque <aleix@member.fsf.org>
@@ -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 <joe@manyfish.co.uk>
+ Copyright (C) 2002-2007, Joe Orton <joe@manyfish.co.uk>
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),