[PATCH 2/4] Implement a DNS Resolver Module

Jeff Layton jlayton at redhat.com
Wed Jul 7 08:02:57 EDT 2010


On Wed, 07 Jul 2010 10:14:11 +0100
David Howells <dhowells at redhat.com> wrote:

-----------------[snip]----------------

> diff --git a/net/dnsresolver/resolv_unc_to_ip.c b/net/dnsresolver/resolv_unc_to_ip.c
> new file mode 100644
> index 0000000..169f9d9
> --- /dev/null
> +++ b/net/dnsresolver/resolv_unc_to_ip.c
> @@ -0,0 +1,111 @@
> +/*
> + *   Copyright (c) 2007 Igor Mammedov
> + *   Author(s): Igor Mammedov (niallain at gmail.com)
> + *              Steve French (sfrench at us.ibm.com)
> + *              Wang Lei (wang840925 at gmail.com)
> + *
> + *   Routines used for Universal Naming Convention (UNC) path style hostname to
> + *   IP address translation.  For this function to work, the userspace tool
> + *   dns.upcall is needed and something like the following lines should be
> + *   added to the /etc/request-key.conf file:
> + *
> + *	create dns_resolver * * /sbin/dns.upcall %k
> + *
> + *   This library is free software; you can redistribute it and/or modify
> + *   it under the terms of the GNU Lesser General Public License as published
> + *   by the Free Software Foundation; either version 2.1 of the License, or
> + *   (at your option) any later version.
> + *
> + *   This library is distributed in the hope that it will be useful,
> + *   but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> + *   the GNU Lesser General Public License for more details.
> + *
> + *   You should have received a copy of the GNU Lesser General Public License
> + *   along with this library; if not, write to the Free Software
> + *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/socket.h>
> +#include <linux/in.h>
> +#include <linux/inet.h>
> +#include <linux/in6.h>
> +#include <linux/string.h>
> +#include <linux/dns_resolver.h>
> +#include <keys/dnsresolver-type.h>
> +#include "internal.h"
> +
> +/**
> + * dns_resolve_unc_to_ip - Resolve UNC server name to ip address.
> + * @unc: UNC path specifying the server
> + * @ip_addr: Where to return the IP address.
> + *
> + * The IP address will be returned in string form, and the caller is
> + * responsible for freeing it.
> + *
> + * Returns 0 on success, -ve on error.
> + */
> +int
> +dns_resolve_unc_to_ip(const char *unc, char **ip_addr)
> +{
> +	struct in_addr s4;
> +	struct in6_addr	s6;
> +	char *name, *sep;
> +	int len, rc;
> +
> +	kenter("%s,", unc);
> +
> +	rc = -EINVAL;
> +	if (!ip_addr || !unc)
> +		goto out;
> +
> +	len = strlen(unc);
> +	if (len < 3)
> +		goto out;
> +
> +	/* discount leading slashes for cifs */
> +	len -= 2;
> +	unc += 2;
> +
> +	/* search for server name delimiter */
> +	sep = memchr(unc, '\\', len);
> +	if (sep)
> +		len = sep - unc;
> +	kdebug("server name:%*.*s", len, len, unc);
> +
> +	rc = -ENOMEM;
> +	name = kmalloc(len + 1, GFP_KERNEL);
> +	if (!name)
> +		goto out;
> +
> +	memcpy(name, unc, len);
> +	name[len] = 0;
> +	kdebug("name to resolve '%s'", name);
> +
> +	/* Try to convert a string to an IPv4 address */
> +	rc = in4_pton(name, len, (void *)&s4.s_addr, '\\', NULL);
> +	if (rc > 0) {
> +		*ip_addr = name;
> +		kleave(" = 0 [UNC is IPv4]");
> +		return 0;
> +	}
> +
> +	/* Try to convert a string to an IPv6 address */
> +	rc = in6_pton(name, len, (void *)&s6.s6_addr, '\\', NULL);
> +	if (rc > 0) {
> +		*ip_addr = name;
> +		kleave(" = 0 [UNC is IPv6]");
> +		return 0;
> +	}
> +
> +	/* perform the upcall */
> +	rc = request_dns_resolution(name, NULL, ip_addr);
> +	kfree(name);
> +
> +out:
> +	kleave(" = %d", rc);
> +	return rc;
> +}
> +EXPORT_SYMBOL(dns_resolve_unc_to_ip);
> 

I'm not sold that the above function really belongs in generic code. It
seems like it might make more sense to have a cifs function that parses
out the host portion of the UNC and then pass that to a generic
function that does the in4_pton/in6_pton and then the upcall if that
fails?

Nice work on the set. Moving the DNS upcall into generic code is
definitely a good move.

-- 
Jeff Layton <jlayton at redhat.com>



More information about the linux-afs mailing list