Blame view
fs/cifs/dns_resolve.c
2.79 KB
197c183f3 [CIFS] Forgot to ... |
1 2 3 4 5 6 |
/* * fs/cifs/dns_resolve.c * * Copyright (c) 2007 Igor Mammedov * Author(s): Igor Mammedov (niallain@gmail.com) * Steve French (sfrench@us.ibm.com) |
1a4240f47 DNS: Separate out... |
7 8 |
* Wang Lei (wang840925@gmail.com) * David Howells (dhowells@redhat.com) |
197c183f3 [CIFS] Forgot to ... |
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
* * Contains the CIFS DFS upcall routines used for hostname to * IP address translation. * * 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 */ |
5a0e3ad6a include cleanup: ... |
27 |
#include <linux/slab.h> |
1a4240f47 DNS: Separate out... |
28 |
#include <linux/dns_resolver.h> |
197c183f3 [CIFS] Forgot to ... |
29 30 31 32 |
#include "dns_resolve.h" #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" |
1a4240f47 DNS: Separate out... |
33 34 35 36 37 38 39 40 41 |
/** * dns_resolve_server_name_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 length of result on success, -ve on error. |
197c183f3 [CIFS] Forgot to ... |
42 43 |
*/ int |
366781c19 [CIFS] DFS build ... |
44 45 |
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) { |
1a4240f47 DNS: Separate out... |
46 47 |
struct sockaddr_storage ss; const char *hostname, *sep; |
197c183f3 [CIFS] Forgot to ... |
48 |
char *name; |
1a4240f47 DNS: Separate out... |
49 |
int len, rc; |
197c183f3 [CIFS] Forgot to ... |
50 |
|
366781c19 [CIFS] DFS build ... |
51 |
if (!ip_addr || !unc) |
197c183f3 [CIFS] Forgot to ... |
52 |
return -EINVAL; |
197c183f3 [CIFS] Forgot to ... |
53 54 |
len = strlen(unc); if (len < 3) { |
b6b38f704 [CIFS] Neaten cER... |
55 |
cFYI(1, "%s: unc is too short: %s", __func__, unc); |
197c183f3 [CIFS] Forgot to ... |
56 57 |
return -EINVAL; } |
d09e860cf [CIFS] Adds to dn... |
58 |
|
1a4240f47 DNS: Separate out... |
59 60 61 |
/* Discount leading slashes for cifs */ len -= 2; hostname = unc + 2; |
197c183f3 [CIFS] Forgot to ... |
62 |
|
1a4240f47 DNS: Separate out... |
63 64 65 |
/* Search for server name delimiter */ sep = memchr(hostname, '\\', len); if (sep) |
ba0386487 cifs: fix parsing... |
66 |
len = sep - hostname; |
1a4240f47 DNS: Separate out... |
67 68 69 70 71 72 73 74 75 76 77 78 |
else cFYI(1, "%s: probably server name is whole unc: %s", __func__, unc); /* Try to interpret hostname as an IPv4 or IPv6 address */ rc = cifs_convert_address((struct sockaddr *)&ss, hostname, len); if (rc > 0) goto name_is_IP_address; /* Perform the upcall */ rc = dns_query(NULL, hostname, len, NULL, ip_addr, NULL); if (rc < 0) |
b80289833 cifs: demote DFS ... |
79 80 |
cFYI(1, "%s: unable to resolve: %*.*s", __func__, len, len, hostname); |
1a4240f47 DNS: Separate out... |
81 82 83 |
else cFYI(1, "%s: resolved: %*.*s to %s", __func__, len, len, hostname, *ip_addr); |
197c183f3 [CIFS] Forgot to ... |
84 |
return rc; |
197c183f3 [CIFS] Forgot to ... |
85 |
|
1a4240f47 DNS: Separate out... |
86 87 88 |
name_is_IP_address: name = kmalloc(len + 1, GFP_KERNEL); if (!name) |
4c0c03ca5 CIFS: Fix a malic... |
89 |
return -ENOMEM; |
1a4240f47 DNS: Separate out... |
90 91 92 93 |
memcpy(name, hostname, len); name[len] = 0; cFYI(1, "%s: unc is IP, skipping dns upcall: %s", __func__, name); *ip_addr = name; |
4c0c03ca5 CIFS: Fix a malic... |
94 |
return 0; |
4c0c03ca5 CIFS: Fix a malic... |
95 |
} |