Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/canon-host.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* Host name canonicalization | - | ||||||||||||||||||||||||
2 | - | |||||||||||||||||||||||||
3 | Copyright (C) 2005-2018 Free Software Foundation, Inc. | - | ||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||
5 | Written by Derek Price <derek@ximbiot.com>. | - | ||||||||||||||||||||||||
6 | - | |||||||||||||||||||||||||
7 | This program is free software: you can redistribute it and/or modify | - | ||||||||||||||||||||||||
8 | it under the terms of the GNU General Public License as published by | - | ||||||||||||||||||||||||
9 | the Free Software Foundation; either version 3, or (at your option) | - | ||||||||||||||||||||||||
10 | any later version. | - | ||||||||||||||||||||||||
11 | - | |||||||||||||||||||||||||
12 | This program is distributed in the hope that it will be useful, | - | ||||||||||||||||||||||||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||||||||||||||||||||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||||||||||||||||||||
15 | GNU General Public License for more details. | - | ||||||||||||||||||||||||
16 | - | |||||||||||||||||||||||||
17 | You should have received a copy of the GNU General Public License | - | ||||||||||||||||||||||||
18 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ | - | ||||||||||||||||||||||||
19 | - | |||||||||||||||||||||||||
20 | #include <config.h> | - | ||||||||||||||||||||||||
21 | - | |||||||||||||||||||||||||
22 | #include "canon-host.h" | - | ||||||||||||||||||||||||
23 | - | |||||||||||||||||||||||||
24 | #include <string.h> | - | ||||||||||||||||||||||||
25 | #include <netdb.h> | - | ||||||||||||||||||||||||
26 | - | |||||||||||||||||||||||||
27 | /* Store the last error for the single-threaded version of this function. */ | - | ||||||||||||||||||||||||
28 | static int last_cherror; | - | ||||||||||||||||||||||||
29 | - | |||||||||||||||||||||||||
30 | /* Single-threaded of wrapper for canon_host_r. After a NULL return, error | - | ||||||||||||||||||||||||
31 | messages may be retrieved via ch_strerror(). */ | - | ||||||||||||||||||||||||
32 | char * | - | ||||||||||||||||||||||||
33 | canon_host (const char *host) | - | ||||||||||||||||||||||||
34 | { | - | ||||||||||||||||||||||||
35 | return canon_host_r (host, &last_cherror); never executed: return canon_host_r (host, &last_cherror); | 0 | ||||||||||||||||||||||||
36 | } | - | ||||||||||||||||||||||||
37 | - | |||||||||||||||||||||||||
38 | /* Return a malloc'd string containing the canonical hostname associated with | - | ||||||||||||||||||||||||
39 | HOST, or NULL if a canonical name cannot be determined. On NULL return, | - | ||||||||||||||||||||||||
40 | if CHERROR is not NULL, set *CHERROR to an error code as returned by | - | ||||||||||||||||||||||||
41 | getaddrinfo(). Use ch_strerror_r() or gai_strerror() to convert a *CHERROR | - | ||||||||||||||||||||||||
42 | value to a string suitable for error messages. | - | ||||||||||||||||||||||||
43 | - | |||||||||||||||||||||||||
44 | WARNINGS | - | ||||||||||||||||||||||||
45 | HOST must be a string representation of a resolvable name for this host. | - | ||||||||||||||||||||||||
46 | Strings containing an IP address in dotted decimal notation will be | - | ||||||||||||||||||||||||
47 | returned as-is, without further resolution. | - | ||||||||||||||||||||||||
48 | - | |||||||||||||||||||||||||
49 | The use of the word "canonical" in this context is unfortunate but | - | ||||||||||||||||||||||||
50 | entrenched. The value returned by this function will be the end result | - | ||||||||||||||||||||||||
51 | of the resolution of any CNAME chains in the DNS. There may only be one | - | ||||||||||||||||||||||||
52 | such value for any given hostname, though the actual IP address | - | ||||||||||||||||||||||||
53 | referenced by this value and the device using that IP address may each | - | ||||||||||||||||||||||||
54 | actually have any number of such "canonical" hostnames. See the POSIX | - | ||||||||||||||||||||||||
55 | getaddrinfo spec <http://www.opengroup.org/susv3xsh/getaddrinfo.html">, | - | ||||||||||||||||||||||||
56 | RFC 1034 <https://www.ietf.org/rfc/rfc1034.txt>, & RFC 2181 | - | ||||||||||||||||||||||||
57 | <https://www.ietf.org/rfc/rfc2181.txt> for more on what this confusing | - | ||||||||||||||||||||||||
58 | term really refers to. */ | - | ||||||||||||||||||||||||
59 | char * | - | ||||||||||||||||||||||||
60 | canon_host_r (char const *host, int *cherror) | - | ||||||||||||||||||||||||
61 | { | - | ||||||||||||||||||||||||
62 | char *retval = NULL; | - | ||||||||||||||||||||||||
63 | static struct addrinfo hints; | - | ||||||||||||||||||||||||
64 | struct addrinfo *res = NULL; | - | ||||||||||||||||||||||||
65 | int status; | - | ||||||||||||||||||||||||
66 | - | |||||||||||||||||||||||||
67 | hints.ai_flags = AI_CANONNAME; | - | ||||||||||||||||||||||||
68 | status = getaddrinfo (host, NULL, &hints, &res); | - | ||||||||||||||||||||||||
69 | if (!status)
| 0 | ||||||||||||||||||||||||
70 | { | - | ||||||||||||||||||||||||
71 | /* https://lists.gnu.org/r/bug-coreutils/2006-09/msg00300.html | - | ||||||||||||||||||||||||
72 | says Darwin 7.9.0 getaddrinfo returns 0 but sets | - | ||||||||||||||||||||||||
73 | res->ai_canonname to NULL. */ | - | ||||||||||||||||||||||||
74 | retval = strdup (res->ai_canonname ? res->ai_canonname : host); never executed: __retval = (char *) memcpy (__retval, res->ai_canonname ? res->ai_canonname : host , __len);
| 0 | ||||||||||||||||||||||||
75 | if (!retval && cherror)
| 0 | ||||||||||||||||||||||||
76 | *cherror = EAI_MEMORY; never executed: *cherror = -10 ; | 0 | ||||||||||||||||||||||||
77 | freeaddrinfo (res); | - | ||||||||||||||||||||||||
78 | } never executed: end of block | 0 | ||||||||||||||||||||||||
79 | else if (cherror)
| 0 | ||||||||||||||||||||||||
80 | *cherror = status; never executed: *cherror = status; | 0 | ||||||||||||||||||||||||
81 | - | |||||||||||||||||||||||||
82 | return retval; never executed: return retval; | 0 | ||||||||||||||||||||||||
83 | } | - | ||||||||||||||||||||||||
84 | - | |||||||||||||||||||||||||
85 | /* Return a string describing the last error encountered by canon_host. */ | - | ||||||||||||||||||||||||
86 | const char * | - | ||||||||||||||||||||||||
87 | ch_strerror (void) | - | ||||||||||||||||||||||||
88 | { | - | ||||||||||||||||||||||||
89 | return gai_strerror (last_cherror); never executed: return gai_strerror (last_cherror); | 0 | ||||||||||||||||||||||||
90 | } | - | ||||||||||||||||||||||||
Source code | Switch to Preprocessed file |