| 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 |