summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-04-11 12:25:32 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-04-11 12:25:32 -0600
commit57d2acba435f67d561b63e6635330f182edc5047 (patch)
tree75ae50c7989a55783fcac71695fc4296ef1257a4 /apps
parentfb9444d0919f03b59d58f726f05993968ecdfdd7 (diff)
downloadpx4-nuttx-57d2acba435f67d561b63e6635330f182edc5047.tar.gz
px4-nuttx-57d2acba435f67d561b63e6635330f182edc5047.tar.bz2
px4-nuttx-57d2acba435f67d561b63e6635330f182edc5047.zip
Long needed clean up of DNS resolver for coding style and naming conventions
Diffstat (limited to 'apps')
-rw-r--r--apps/ChangeLog.txt2
-rw-r--r--apps/examples/README.txt6
-rw-r--r--apps/examples/discover/Kconfig2
-rw-r--r--apps/examples/discover/discover_main.c4
-rw-r--r--apps/examples/tcpecho/Kconfig2
-rw-r--r--apps/examples/tcpecho/tcpecho_main.c4
-rw-r--r--apps/examples/uip/uip_main.c4
-rw-r--r--apps/examples/xmlrpc/Kconfig2
-rw-r--r--apps/examples/xmlrpc/xmlrpc_main.c4
-rw-r--r--apps/include/netutils/resolv.h153
-rw-r--r--apps/netutils/Make.defs2
-rw-r--r--apps/netutils/resolv/Kconfig22
-rw-r--r--apps/netutils/resolv/resolv.c401
-rw-r--r--apps/nshlib/Kconfig2
-rw-r--r--apps/nshlib/nsh_netcmds.c6
-rw-r--r--apps/nshlib/nsh_netinit.c6
16 files changed, 419 insertions, 203 deletions
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt
index 27b1ce47b..b952ebe74 100644
--- a/apps/ChangeLog.txt
+++ b/apps/ChangeLog.txt
@@ -876,3 +876,5 @@
* apps/netutils/ntpclient/ and apps/include/netufils/ntpclient.h: Add
a very primitive NTP client. The initial check-in is untested and
probably incomplete (2014-4-10).
+ * apps/netutils/resolv: Long needed major clean up for coding style
+ and unification of naming conventions (resolv vs dns) (2014-4-11).
diff --git a/apps/examples/README.txt b/apps/examples/README.txt
index 42ba317bd..23e83f48f 100644
--- a/apps/examples/README.txt
+++ b/apps/examples/README.txt
@@ -703,7 +703,7 @@ examples/nsh
CONFIG_NETUTILS_UIPLIB=y
CONFIG_NETUTILS_DHCPC=y
- CONFIG_NETUTILS_RESOLV=y
+ CONFIG_NETUTILS_DNSCLIENT=y
CONFIG_NETUTILS_TFTPC=y
CONFIG_NETUTILS_WEBCLIENT=y
@@ -1683,7 +1683,7 @@ examples/uip
CONFIG_NETUTILS_UIPLIB=y
CONFIG_NETUTILS_DHCPC=y
- CONFIG_NETUTILS_RESOLV=y
+ CONFIG_NETUTILS_DNSCLIENT=y
CONFIG_NETUTILS_WEBSERVER=y
NOTE: This example does depend on the perl script at
@@ -1905,7 +1905,7 @@ examples/wget
libraries in the defconfig file:
CONFIG_NETUTILS_UIPLIB=y
- CONFIG_NETUTILS_RESOLV=y
+ CONFIG_NETUTILS_DNSCLIENT=y
CONFIG_NETUTILS_WEBCLIENT=y
examples/wget
diff --git a/apps/examples/discover/Kconfig b/apps/examples/discover/Kconfig
index 1cbb7f120..9b137b60f 100644
--- a/apps/examples/discover/Kconfig
+++ b/apps/examples/discover/Kconfig
@@ -22,7 +22,7 @@ config EXAMPLES_DISCOVER_DHCPC
default n
depends on EXAMPLES_DISCOVER && !NSH_BUILTIN_APPS
select NETUTILS_DHCPC
- select NETUTILS_RESOLV
+ select NETUTILS_DNSCLIENT
config EXAMPLES_DISCOVER_NOMAC
bool "Use Canned MAC Address"
diff --git a/apps/examples/discover/discover_main.c b/apps/examples/discover/discover_main.c
index 9c8f5f512..d8b32d315 100644
--- a/apps/examples/discover/discover_main.c
+++ b/apps/examples/discover/discover_main.c
@@ -134,7 +134,7 @@ int discover_main(int argc, char *argv[])
#ifdef CONFIG_EXAMPLES_DISCOVER_DHCPC
/* Set up the resolver */
- resolv_init();
+ dns_bind();
/* Get the MAC address of the NIC */
@@ -167,7 +167,7 @@ int discover_main(int argc, char *argv[])
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
diff --git a/apps/examples/tcpecho/Kconfig b/apps/examples/tcpecho/Kconfig
index cc063e0a5..ffa6397df 100644
--- a/apps/examples/tcpecho/Kconfig
+++ b/apps/examples/tcpecho/Kconfig
@@ -31,7 +31,7 @@ config EXAMPLES_TCPECHO_DHCPC
default n
depends on EXAMPLES_TCPECHO && !NSH_BUILTIN_APPS
select NETUTILS_DHCPC
- select NETUTILS_RESOLV
+ select NETUTILS_DNSCLIENT
config EXAMPLES_TCPECHO_NOMAC
bool "Use Canned MAC Address"
diff --git a/apps/examples/tcpecho/tcpecho_main.c b/apps/examples/tcpecho/tcpecho_main.c
index e70028fce..fbc6e2ddd 100644
--- a/apps/examples/tcpecho/tcpecho_main.c
+++ b/apps/examples/tcpecho/tcpecho_main.c
@@ -146,7 +146,7 @@ static int tcpecho_netsetup()
#ifdef CONFIG_EXAMPLES_TCPECHO_DHCPC
/* Set up the resolver */
- resolv_init();
+ dns_bind();
/* Get the MAC address of the NIC */
@@ -184,7 +184,7 @@ static int tcpecho_netsetup()
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
diff --git a/apps/examples/uip/uip_main.c b/apps/examples/uip/uip_main.c
index 8e485441c..35454a0dd 100644
--- a/apps/examples/uip/uip_main.c
+++ b/apps/examples/uip/uip_main.c
@@ -154,7 +154,7 @@ int uip_main(int argc, char *argv[])
#ifdef CONFIG_EXAMPLES_UIP_DHCPC
/* Set up the resolver */
- resolv_init();
+ dns_bind();
/* Get the MAC address of the NIC */
@@ -184,7 +184,7 @@ int uip_main(int argc, char *argv[])
}
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
printf("IP: %s\n", inet_ntoa(ds.ipaddr));
diff --git a/apps/examples/xmlrpc/Kconfig b/apps/examples/xmlrpc/Kconfig
index 80ee5a225..aa47e4672 100644
--- a/apps/examples/xmlrpc/Kconfig
+++ b/apps/examples/xmlrpc/Kconfig
@@ -23,7 +23,7 @@ config EXAMPLES_XMLRPC_DHCPC
default n
depends on EXAMPLES_XMLRPC && !NSH_BUILTIN_APPS
select NETUTILS_DHCPC
- select NETUTILS_RESOLV
+ select NETUTILS_DNSCLIENT
config EXAMPLES_XMLRPC_NOMAC
bool "Use Canned MAC Address"
diff --git a/apps/examples/xmlrpc/xmlrpc_main.c b/apps/examples/xmlrpc/xmlrpc_main.c
index 5f5ce5f06..3a743bb82 100644
--- a/apps/examples/xmlrpc/xmlrpc_main.c
+++ b/apps/examples/xmlrpc/xmlrpc_main.c
@@ -311,7 +311,7 @@ static int xmlrpc_netinit(void)
#ifdef CONFIG_EXAMPLES_XMLRPC_DHCPC
/* Set up the resolver */
- resolv_init();
+ dns_bind();
/* Get the MAC address of the NIC */
@@ -345,7 +345,7 @@ static int xmlrpc_netinit(void)
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
diff --git a/apps/include/netutils/resolv.h b/apps/include/netutils/resolv.h
index 8d2142732..9447432a1 100644
--- a/apps/include/netutils/resolv.h
+++ b/apps/include/netutils/resolv.h
@@ -3,7 +3,7 @@
* DNS resolver code header file.
* Author Adam Dunkels <adam@dunkels.com>
*
- * Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009, 2011-2012, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Inspired by/based on uIP logic by Adam Dunkels:
@@ -37,8 +37,8 @@
*
****************************************************************************/
-#ifndef __APPS_INCLUDE_NETUTILS_RESOLVE_H
-#define __APPS_INCLUDE_NETUTILS_RESOLVE_H
+#ifndef __APPS_INCLUDE_NETUTILS_DNSCLIENT_H
+#define __APPS_INCLUDE_NETUTILS_DNSCLIENT_H
/****************************************************************************
* Included Files
@@ -55,45 +55,144 @@
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
-extern "C" {
+extern "C"
+{
#else
#define EXTERN extern
#endif
-/* Functions. */
+/****************************************************************************
+ * Name: dns_bind_sock
+ *
+ * Description:
+ * Initialize the DNS resolver using the caller provided socket.
+ *
+ ****************************************************************************/
+
+int dns_bind_sock(FAR int *sockfd);
-EXTERN int resolv_init(void);
-EXTERN int resolv_create(int *sockfd);
-EXTERN int resolv_release(int *sockfd);
-EXTERN int resolv_gethostip_socket(int sockfd, const char *hostname, in_addr_t *ipaddr);
-EXTERN int resolv_gethostip(const char *hostname, in_addr_t *ipaddr);
+/****************************************************************************
+ * Name: dns_bind
+ *
+ * Description:
+ * Initialize the DNS resolver using an internal, share-able socket.
+ *
+ ****************************************************************************/
+
+int dns_bind(void);
+
+/****************************************************************************
+ * Name: dns_free_sock
+ *
+ * Description:
+ * Release the DNS resolver by closing the socket.
+ *
+ ****************************************************************************/
+
+int dns_free_sock(FAR int *sockfd);
+
+/****************************************************************************
+ * Name: dns_query_sock
+ *
+ * Description:
+ * Using the DNS resolver socket (sockfd), look up the the 'hostname', and
+ * return its IP address in 'ipaddr'
+ *
+ * Returned Value:
+ * Returns zero (OK) if the query was successful.
+ *
+ ****************************************************************************/
+
+int dns_query_sock(int sockfd, FAR const char *hostname, FAR in_addr_t *ipaddr);
+
+/****************************************************************************
+ * Name: dns_query
+ *
+ * Description:
+ * Using the internal DNS resolver socket, look up the the 'hostname', and
+ * return its IP address in 'ipaddr'
+ *
+ * Returned Value:
+ * Returns zero (OK) if the query was successful.
+ *
+ ****************************************************************************/
+
+int dns_query(FAR const char *hostname, FAR in_addr_t *ipaddr);
+
+/****************************************************************************
+ * Name: dns_setserver
+ *
+ * Description:
+ * Configure which DNS server to use for queries
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+void dns_setserver(FAR const struct in6_addr *dnsserver);
+#else
+void dns_setserver(FAR const struct in_addr *dnsserver);
+#endif
+
+/****************************************************************************
+ * Name: dns_getserver
+ *
+ * Description:
+ * Obtain the currently configured DNS server.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+void dns_getserver(FAR const struct in_addr *dnsserver);
+#else
+void dns_getserver(FAR struct in_addr *dnsserver);
+#endif
+
+/****************************************************************************
+ * Name: dns_whois_socket
+ *
+ * Description:
+ * Get the binding for 'name' using the DNS server accessed via 'sockfd'
+ *
+ ****************************************************************************/
#ifdef CONFIG_NET_IPv6
-EXTERN void resolv_conf(FAR const struct in6_addr *dnsserver);
-EXTERN void resolv_getserver(FAR const struct in_addr *dnsserver);
-EXTERN int resolv_query(FAR const char *name, FAR struct sockaddr_in6 *addr);
-EXTERN int resolv_query_socket(int sockfd, FAR const char *name, FAR struct sockaddr_in6 *addr);
+int dns_whois_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in6 *addr);
#else
-EXTERN void resolv_conf(FAR const struct in_addr *dnsserver);
-EXTERN void resolv_getserver(FAR struct in_addr *dnsserver);
-EXTERN int resolv_query(FAR const char *name, FAR struct sockaddr_in *addr);
-EXTERN int resolv_query_socket(int sockfd, FAR const char *name, FAR struct sockaddr_in *addr);
+int dns_whois_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in *addr);
#endif
-EXTERN int dns_gethostip(const char *hostname, in_addr_t *ipaddr);
+/****************************************************************************
+ * Name: dns_whois
+ *
+ * Description:
+ * Get the binding for 'name' using the DNS server accessed via the DNS
+ * resolvers internal socket.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+int dns_whois(FAR const char *name, FAR struct sockaddr_in6 *addr);
+#else
+int dns_whois(FAR const char *name, FAR struct sockaddr_in *addr);
+#endif
-#define dns_init resolv_init
-#define dns_bind resolv_create
-#define dns_query resolv_gethostip_socket
-#define dns_free resolv_release
+/****************************************************************************
+ * Name: dns_gethostip
+ *
+ * Descriptions:
+ * Combines the operations of dns_bind_sock(), dns_query_sock(), and
+ * dns_free_sock() to obtain the the IP address ('ipaddr') associated with
+ * the 'hostname' in one operation.
+ *
+ ****************************************************************************/
-#define dns_setserver resolv_conf
-#define dns_getserver resolv_getserver
-#define dns_whois resolv_query
+int dns_gethostip(FAR const char *hostname, FAR in_addr_t *ipaddr);
#undef EXTERN
#if defined(__cplusplus)
}
#endif
-#endif /* __APPS_INCLUDE_NETUTILS_RESOLVE_H */
+#endif /* __APPS_INCLUDE_NETUTILS_DNSCLIENT_H */
diff --git a/apps/netutils/Make.defs b/apps/netutils/Make.defs
index 7e1d5eb1c..f883304ec 100644
--- a/apps/netutils/Make.defs
+++ b/apps/netutils/Make.defs
@@ -62,7 +62,7 @@ ifeq ($(CONFIG_NETUTILS_NTPCLIENT),y)
CONFIGURED_APPS += netutils/ntpclient
endif
-ifeq ($(CONFIG_NETUTILS_RESOLV),y)
+ifeq ($(CONFIG_NETUTILS_DNSCLIENT),y)
CONFIGURED_APPS += netutils/resolv
endif
diff --git a/apps/netutils/resolv/Kconfig b/apps/netutils/resolv/Kconfig
index 82fe3a81d..91f41ab98 100644
--- a/apps/netutils/resolv/Kconfig
+++ b/apps/netutils/resolv/Kconfig
@@ -3,25 +3,27 @@
# see misc/tools/kconfig-language.txt.
#
-config NETUTILS_RESOLV
- bool "Name resolution"
+config NETUTILS_DNSCLIENT
+ bool "DNS Name resolution"
default n
depends on NET && NET_UDP && NET_BROADCAST
---help---
Enable support for the name resolution.
-config NET_RESOLV_ENTRIES
- int "Number of resolver entries"
+if NETUTILS_DNSCLIENT
+
+config NETUTILS_DNSCLIENT_ENTRIES
+ int "Number of DNS resolver entries"
default 8
- depends on NETUTILS_RESOLV
---help---
Number of resolver entries. Default: 8
-config NET_RESOLV_MAXRESPONSE
+config NETUTILS_DNSCLIENT_MAXRESPONSE
int "Max response size"
default 96
- depends on NETUTILS_RESOLV
---help---
- This setting determines the maximum size of response message that can be
- received by the DNS resolver. The default is 96 but may need to be larger on
- enterprise networks (perhaps 176).
+ This setting determines the maximum size of response message that
+ can be received by the DNS resolver. The default is 96 but may
+ need to be larger on enterprise networks (perhaps 176).
+
+endif # NETUTILS_DNSCLIENT
diff --git a/apps/netutils/resolv/resolv.c b/apps/netutils/resolv/resolv.c
index 5d447ee49..32bbda511 100644
--- a/apps/netutils/resolv/resolv.c
+++ b/apps/netutils/resolv/resolv.c
@@ -4,15 +4,10 @@
*
* The uIP DNS resolver functions are used to lookup a hostname and
* map it to a numerical IP address. It maintains a list of resolved
- * hostnames that can be queried with the resolv_lookup()
- * function. New hostnames can be resolved using the resolv_query()
- * function.
+ * hostnames that can be queried. New hostnames can be resolved using the
+ * dns_whois() function.
*
- * When a hostname has been resolved (or found to be non-existant),
- * the resolver code calls a callback function called resolv_found()
- * that must be implemented by the module that uses the resolver.
- *
- * Copyright (C) 2007, 2009, 2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2009, 2012, 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Based heavily on portions of uIP:
@@ -68,17 +63,17 @@
#include <apps/netutils/uiplib.h>
/****************************************************************************
- * Definitions
+ * Pre-processor Definitions
****************************************************************************/
-#ifndef CONFIG_NET_RESOLV_ENTRIES
-#define RESOLV_ENTRIES 4
-#else /* CONFIG_NET_RESOLV_ENTRIES */
-#define RESOLV_ENTRIES CONFIG_NET_RESOLV_ENTRIES
-#endif /* CONFIG_NET_RESOLV_ENTRIES */
+#ifndef CONFIG_NETUTILS_DNSCLIENT_ENTRIES
+# define RESOLV_ENTRIES 4
+#else /* CONFIG_NETUTILS_DNSCLIENT_ENTRIES */
+# define RESOLV_ENTRIES CONFIG_NETUTILS_DNSCLIENT_ENTRIES
+#endif /* CONFIG_NETUTILS_DNSCLIENT_ENTRIES */
#ifndef NULL
-#define NULL (void *)0
+# define NULL (void *)0
#endif /* NULL */
/* The maximum number of retries when asking for a name */
@@ -99,16 +94,16 @@
#define SEND_BUFFER_SIZE 64
-#ifdef CONFIG_NET_RESOLV_MAXRESPONSE
-# define RECV_BUFFER_SIZE CONFIG_NET_RESOLV_MAXRESPONSE
+#ifdef CONFIG_NETUTILS_DNSCLIENT_MAXRESPONSE
+# define RECV_BUFFER_SIZE CONFIG_NETUTILS_DNSCLIENT_MAXRESPONSE
#else
# define RECV_BUFFER_SIZE 96
#endif
#ifdef CONFIG_NET_IPv6
-#define ADDRLEN sizeof(struct sockaddr_in6)
+# define ADDRLEN sizeof(struct sockaddr_in6)
#else
-#define ADDRLEN sizeof(struct sockaddr_in)
+# define ADDRLEN sizeof(struct sockaddr_in)
#endif
/****************************************************************************
@@ -120,7 +115,8 @@
struct dns_hdr
{
uint16_t id;
- uint8_t flags1, flags2;
+ uint8_t flags1;
+ uint8_t flags2;
uint16_t numquestions;
uint16_t numanswers;
uint16_t numauthrr;
@@ -177,9 +173,15 @@ static struct sockaddr_in g_dnsserver;
* Private Functions
****************************************************************************/
-/* Walk through a compact encoded DNS name and return the end of it. */
+/****************************************************************************
+ * Name: parse_name
+ *
+ * Description:
+ * Walk through a compact encoded DNS name and return the end of it.
+ *
+ ****************************************************************************/
-static unsigned char *parse_name(unsigned char *query)
+static FAR unsigned char *parse_name(FAR unsigned char *query)
{
unsigned char n;
@@ -194,29 +196,37 @@ static unsigned char *parse_name(unsigned char *query)
}
}
while(*query != 0);
+
return query + 1;
}
-/* Runs through the list of names to see if there are any that have
- * not yet been queried and, if so, sends out a query.
- */
+/****************************************************************************
+ * Name: send_query_socket
+ *
+ * Description:
+ * Runs through the list of names to see if there are any that have
+ * not yet been queried and, if so, sends out a query.
+ *
+ ****************************************************************************/
#ifdef CONFIG_NET_IPv6
-static int send_query_socket(int sockfd, const char *name, struct sockaddr_in6 *addr)
+static int send_query_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in6 *addr)
#else
-static int send_query_socket(int sockfd, const char *name, struct sockaddr_in *addr)
+static int send_query_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in *addr)
#endif
{
- register struct dns_hdr *hdr;
- char *query;
- char *nptr;
- const char *nameptr;
+ register FAR struct dns_hdr *hdr;
+ FAR char *query;
+ FAR char *nptr;
+ FAR const char *nameptr;
uint8_t seqno = g_seqno++;
static unsigned char endquery[] = {0, 0, 1, 0, 1};
char buffer[SEND_BUFFER_SIZE];
int n;
- hdr = (struct dns_hdr*)buffer;
+ hdr = (FAR struct dns_hdr*)buffer;
memset(hdr, 0, sizeof(struct dns_hdr));
hdr->id = htons(seqno);
hdr->flags1 = DNS_FLAG1_RD;
@@ -235,6 +245,7 @@ static int send_query_socket(int sockfd, const char *name, struct sockaddr_in *a
*query++ = *nameptr;
n++;
}
+
*nptr = n;
}
while(*nameptr != 0);
@@ -247,32 +258,43 @@ static int send_query_socket(int sockfd, const char *name, struct sockaddr_in *a
DEBUGASSERT(((struct sockaddr *)addr)->sa_family == AF_INET);
#endif
- return sendto(sockfd, buffer, query + 5 - buffer, 0, (struct sockaddr*)addr, ADDRLEN);
+ return sendto(sockfd, buffer, query + 5 - buffer,
+ 0, (struct sockaddr*)addr, ADDRLEN);
}
+/****************************************************************************
+ * Name: send_query
+ ****************************************************************************/
+
#if 0 /* Not used */
#ifdef CONFIG_NET_IPv6
-static int send_query(const char *name, struct sockaddr_in6 *addr)
+static int send_query(FAR const char *name, FAR struct sockaddr_in6 *addr)
#else
-static int send_query(const char *name, struct sockaddr_in *addr)
+static int send_query(FAR const char *name, FAR struct sockaddr_in *addr)
#endif
{
return send_query_socket(g_sockfd, name, addr);
}
#endif
-/* Called when new UDP data arrives */
+/****************************************************************************
+ * Name: recv_response_socket
+ *
+ * Description:
+ * Called when new UDP data arrives
+ *
+ ****************************************************************************/
#ifdef CONFIG_NET_IPv6
-#error "Not implemented"
+# error "Not implemented"
#else
-int recv_response_socket(int sockfd, struct sockaddr_in *addr)
+int recv_response_socket(int sockfd, FAR struct sockaddr_in *addr)
#endif
{
- unsigned char *nameptr;
+ FAR unsigned char *nameptr;
char buffer[RECV_BUFFER_SIZE];
- struct dns_answer *ans;
- struct dns_hdr *hdr;
+ FAR struct dns_answer *ans;
+ FAR struct dns_hdr *hdr;
#if 0 /* Not used */
uint8_t nquestions;
#endif
@@ -287,7 +309,7 @@ int recv_response_socket(int sockfd, struct sockaddr_in *addr)
return ret;
}
- hdr = (struct dns_hdr *)buffer;
+ hdr = (FAR struct dns_hdr *)buffer;
ndbg("ID %d\n", htons(hdr->id));
ndbg("Query %d\n", hdr->flags1 & DNS_FLAG1_RESPONSE);
@@ -312,8 +334,8 @@ int recv_response_socket(int sockfd, struct sockaddr_in *addr)
#endif
nanswers = htons(hdr->numanswers);
- /* Skip the name in the question. XXX: This should really be
- * checked agains the name in the question, to be sure that they
+ /* Skip the name in the question. TODO: This should really be
+ * checked against the name in the question, to be sure that they
* match.
*/
@@ -350,12 +372,13 @@ int recv_response_socket(int sockfd, struct sockaddr_in *addr)
{
/* Compressed name. */
- nameptr +=2;
- ndbg("Compressed anwser\n");
+ nameptr += 2;
+ ndbg("Compressed answer\n");
}
else
{
/* Not compressed name. */
+
nameptr = parse_name(nameptr);
}
@@ -367,16 +390,19 @@ int recv_response_socket(int sockfd, struct sockaddr_in *addr)
/* Check for IP address type and Internet class. Others are discarded. */
- if (ans->type == HTONS(1) && ans->class == HTONS(1) && ans->len == HTONS(4))
+ if (ans->type == HTONS(1) &&
+ ans->class == HTONS(1) &&
+ ans->len == HTONS(4))
{
- ans->ipaddr.s_addr = *(uint32_t*)(nameptr+10);
+ ans->ipaddr.s_addr = *(FAR uint32_t *)(nameptr + 10);
+
ndbg("IP address %d.%d.%d.%d\n",
(ans->ipaddr.s_addr ) & 0xff,
(ans->ipaddr.s_addr >> 8 ) & 0xff,
(ans->ipaddr.s_addr >> 16 ) & 0xff,
(ans->ipaddr.s_addr >> 24 ) & 0xff);
- /* XXX: we should really check that this IP address is the one
+ /* TODO: we should really check that this IP address is the one
* we want.
*/
@@ -392,10 +418,14 @@ int recv_response_socket(int sockfd, struct sockaddr_in *addr)
return ERROR;
}
+/****************************************************************************
+ * Name: recv_response
+ ****************************************************************************/
+
#ifdef CONFIG_NET_IPv6
-#error "Not implemented"
+# error "Not implemented"
#else
-int recv_response(struct sockaddr_in *addr)
+int recv_response(FAR struct sockaddr_in *addr)
#endif
{
return recv_response_socket(g_sockfd, addr);
@@ -406,14 +436,93 @@ int recv_response(struct sockaddr_in *addr)
****************************************************************************/
/****************************************************************************
- * Name: resolv_gethostip
+ * Name: dns_bind_sock
+ *
+ * Description:
+ * Initialize the DNS resolver using the caller provided socket.
+ *
+ ****************************************************************************/
+
+int dns_bind_sock(FAR int *sockfd)
+{
+ struct timeval tv;
+ int ret;
+
+ if (*sockfd >= 0) dns_free_sock(sockfd);
+
+ *sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (*sockfd < 0)
+ {
+ return ERROR;
+ }
+
+ /* Set up a receive timeout */
+
+ tv.tv_sec = 30;
+ tv.tv_usec = 0;
+
+ ret = setsockopt(*sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv,
+ sizeof(struct timeval));
+
+ if (ret < 0)
+ {
+ close(*sockfd);
+ *sockfd = -1;
+ return ERROR;
+ }
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: dns_bind
+ *
+ * Description:
+ * Initialize the DNS resolver using an internal, share-able socket.
+ *
+ ****************************************************************************/
+
+int dns_bind(void)
+{
+ return dns_bind_sock(&g_sockfd);
+}
+
+/****************************************************************************
+ * Name: dns_free_sock
+ *
+ * Description:
+ * Release the DNS resolver by closing the socket.
+ *
****************************************************************************/
-int resolv_gethostip_socket(int sockfd, const char *hostname, in_addr_t *ipaddr)
+int dns_free_sock(FAR int *sockfd)
+{
+ if (*sockfd >= 0)
+ {
+ close(*sockfd);
+ *sockfd = -1;
+ }
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: dns_query_sock
+ *
+ * Description:
+ * Using the DNS resolver socket (sockfd), look up the the 'hostname', and
+ * return its IP address in 'ipaddr'
+ *
+ * Returned Value:
+ * Returns zero (OK) if the query was successful.
+ *
+ ****************************************************************************/
+
+int dns_query_sock(int sockfd, FAR const char *hostname, FAR in_addr_t *ipaddr)
{
#ifdef CONFIG_HAVE_GETHOSTBYNAME
- struct hostent *he;
+ FAR struct hostent *he;
nvdbg("Getting address of %s\n", hostname);
he = gethostbyname(hostname);
@@ -445,7 +554,7 @@ int resolv_gethostip_socket(int sockfd, const char *hostname, in_addr_t *ipaddr)
* the host name to an IP address.
*/
- if (resolv_query_socket(sockfd, hostname, &addr) < 0)
+ if (dns_whois_socket(sockfd, hostname, &addr) < 0)
{
/* Needs to set the errno here */
@@ -456,37 +565,86 @@ int resolv_gethostip_socket(int sockfd, const char *hostname, in_addr_t *ipaddr)
*ipaddr = addr.sin_addr.s_addr;
}
- return OK;
+ return OK;
#endif
}
-int resolv_gethostip(const char *hostname, in_addr_t *ipaddr)
+/****************************************************************************
+ * Name: dns_query
+ *
+ * Description:
+ * Using the internal DNS resolver socket, look up the the 'hostname', and
+ * return its IP address in 'ipaddr'
+ *
+ * Returned Value:
+ * Returns zero (OK) if the query was successful.
+ *
+ ****************************************************************************/
+
+int dns_query(FAR const char *hostname, FAR in_addr_t *ipaddr)
{
- return resolv_gethostip_socket(g_sockfd, hostname, ipaddr);
+ return dns_query_sock(g_sockfd, hostname, ipaddr);
}
-int dns_gethostip(const char *hostname, in_addr_t *ipaddr)
+/****************************************************************************
+ * Name: dns_setserver
+ *
+ * Description:
+ * Configure which DNS server to use for queries
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+void dns_setserver(FAR const struct in6_addr *dnsserver)
+#else
+void dns_setserver(FAR const struct in_addr *dnsserver)
+#endif
{
- int sockfd = -1;
- int ret=ERROR;
+ g_dnsserver.sin_family = AF_INET;
+ g_dnsserver.sin_port = HTONS(53);
+#ifdef CONFIG_NET_IPv6
+ memcpy(&g_dnsserver.sin6_addr, dnsserver, ADDRLEN);
+#else
+ g_dnsserver.sin_addr.s_addr = dnsserver->s_addr;
+#endif
+}
- resolv_create(&sockfd);
- if (sockfd >= 0)
- {
- ret = resolv_gethostip_socket(sockfd, hostname, ipaddr);
- resolv_release(&sockfd);
- }
+/****************************************************************************
+ * Name: dns_getserver
+ *
+ * Description:
+ * Obtain the currently configured DNS server.
+ *
+ ****************************************************************************/
- return ret;
+#ifdef CONFIG_NET_IPv6
+void dns_getserver(FAR struct in6_addr *dnsserver)
+#else
+void dns_getserver(FAR struct in_addr *dnsserver)
+#endif
+{
+#ifdef CONFIG_NET_IPv6
+ memcpy(dnsserver, &g_dnsserver.sin6_addr, ADDRLEN);
+#else
+ dnsserver->s_addr = g_dnsserver.sin_addr.s_addr;
+#endif
}
-/* Get the binding for name. */
+/****************************************************************************
+ * Name: dns_whois_socket
+ *
+ * Description:
+ * Get the binding for 'name' using the DNS server accessed via 'sockfd'
+ *
+ ****************************************************************************/
#ifdef CONFIG_NET_IPv6
-int resolv_query_socket(int sockfd, FAR const char *name, FAR struct sockaddr_in6 *addr)
+int dns_whois_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in6 *addr)
#else
-int resolv_query_socket(int sockfd, FAR const char *name, FAR struct sockaddr_in *addr)
+int dns_whois_socket(int sockfd, FAR const char *name,
+ FAR struct sockaddr_in *addr)
#endif
{
int retries;
@@ -520,91 +678,46 @@ int resolv_query_socket(int sockfd, FAR const char *name, FAR struct sockaddr_in
return ERROR;
}
-#ifdef CONFIG_NET_IPv6
-int resolv_query(FAR const char *name, FAR struct sockaddr_in6 *addr)
-#else
-int resolv_query(FAR const char *name, FAR struct sockaddr_in *addr)
-#endif
-{
- return resolv_query_socket(g_sockfd, name, addr);
-}
-
-/* Obtain the currently configured DNS server. */
-
-#ifdef CONFIG_NET_IPv6
-void resolv_getserver(struct in6_addr *dnsserver)
-#else
-void resolv_getserver(struct in_addr *dnsserver)
-#endif
-{
-#ifdef CONFIG_NET_IPv6
- memcpy(dnsserver, &g_dnsserver.sin6_addr, ADDRLEN);
-#else
- dnsserver->s_addr = g_dnsserver.sin_addr.s_addr;
-#endif
-}
-
-/* Configure which DNS server to use for queries */
+/****************************************************************************
+ * Name: dns_whois
+ *
+ * Description:
+ * Get the binding for 'name' using the DNS server accessed via the DNS
+ * resolvers internal socket.
+ *
+ ****************************************************************************/
#ifdef CONFIG_NET_IPv6
-void resolv_conf(const struct in6_addr *dnsserver)
-#else
-void resolv_conf(const struct in_addr *dnsserver)
-#endif
-{
- g_dnsserver.sin_family = AF_INET;
- g_dnsserver.sin_port = HTONS(53);
-#ifdef CONFIG_NET_IPv6
- memcpy(&g_dnsserver.sin6_addr, dnsserver, ADDRLEN);
+int dns_whois(FAR const char *name, FAR struct sockaddr_in6 *addr)
#else
- g_dnsserver.sin_addr.s_addr = dnsserver->s_addr;
+int dns_whois(FAR const char *name, FAR struct sockaddr_in *addr)
#endif
-}
-
-/* Release the resolver. */
-
-int resolv_release(int *sockfd)
{
- if (*sockfd >= 0)
- {
- close(*sockfd);
- *sockfd = -1;
- }
-
- return OK;
+ return dns_whois_socket(g_sockfd, name, addr);
}
-/* Create the resolver. */
+/****************************************************************************
+ * Name: dns_gethostip
+ *
+ * Descriptions:
+ * Combines the operations of dns_bind_sock(), dns_query_sock(), and
+ * dns_free_sock() to obtain the the IP address ('ipaddr') associated with
+ * the 'hostname' in one operation.
+ *
+ ****************************************************************************/
-int resolv_create(int *sockfd)
+int dns_gethostip(FAR const char *hostname, FAR in_addr_t *ipaddr)
{
- struct timeval tv;
-
- if (*sockfd >= 0) resolv_release(sockfd);
-
- *sockfd = socket(PF_INET, SOCK_DGRAM, 0);
- if (*sockfd < 0)
- {
- return ERROR;
- }
-
- /* Set up a receive timeout */
+ int sockfd = -1;
+ int ret=ERROR;
- tv.tv_sec = 30;
- tv.tv_usec = 0;
- if (setsockopt(*sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)) < 0)
+ dns_bind_sock(&sockfd);
+ if (sockfd >= 0)
{
- close(*sockfd);
- *sockfd = -1;
- return ERROR;
+ ret = dns_query_sock(sockfd, hostname, ipaddr);
+ dns_free_sock(&sockfd);
}
- return OK;
+ return ret;
}
-/* Initalize the resolver. */
-
-int resolv_init(void)
-{
- return resolv_create(&g_sockfd);
-}
diff --git a/apps/nshlib/Kconfig b/apps/nshlib/Kconfig
index 1de11376a..1dec22740 100644
--- a/apps/nshlib/Kconfig
+++ b/apps/nshlib/Kconfig
@@ -825,7 +825,7 @@ config NSH_NETMASK
config NSH_DNS
bool "Use DNS"
default n
- depends on NSH_LIBRARY && NETUTILS_RESOLV
+ depends on NSH_LIBRARY && NETUTILS_DNSCLIENT
---help---
Configure to use a DNS.
diff --git a/apps/nshlib/nsh_netcmds.c b/apps/nshlib/nsh_netcmds.c
index 024fb248e..b1789d123 100644
--- a/apps/nshlib/nsh_netcmds.c
+++ b/apps/nshlib/nsh_netcmds.c
@@ -320,7 +320,7 @@ int ifconfig_callback(FAR struct uip_driver_s *dev, void *arg)
nsh_output(vtbl, "Mask:%s\n", inet_ntoa(addr));
#if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS)
- resolv_getserver(&addr);
+ dns_getserver(&addr);
nsh_output(vtbl, "\tDNSaddr:%s\n", inet_ntoa(addr));
#endif
@@ -770,7 +770,7 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
addr.s_addr = gip;
}
- resolv_conf(&addr);
+ dns_setserver(&addr);
#endif
#if defined(CONFIG_NSH_DHCPC)
@@ -807,7 +807,7 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
diff --git a/apps/nshlib/nsh_netinit.c b/apps/nshlib/nsh_netinit.c
index 58d238312..9a44f4905 100644
--- a/apps/nshlib/nsh_netinit.c
+++ b/apps/nshlib/nsh_netinit.c
@@ -132,10 +132,10 @@ int nsh_netinit(void)
#if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS)
/* Set up the resolver */
- resolv_init();
+ dns_bind();
#if defined(CONFIG_NSH_DNS)
addr.s_addr = HTONL(CONFIG_NSH_DNSIPADDR);
- resolv_conf(&addr);
+ dns_setserver(&addr);
#endif
#endif
@@ -167,7 +167,7 @@ int nsh_netinit(void)
}
if (ds.dnsaddr.s_addr != 0)
{
- resolv_conf(&ds.dnsaddr);
+ dns_setserver(&ds.dnsaddr);
}
dhcpc_close(handle);
}