/src/wget2/lib/xgetaname-impl.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* xgetaname-impl.c -- common implementation of xgethostname and xgetdomainname |
2 | | |
3 | | Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2025 Free Software |
4 | | Foundation, Inc. |
5 | | |
6 | | This program is free software: you can redistribute it and/or modify |
7 | | it under the terms of the GNU General Public License as published by |
8 | | the Free Software Foundation, either version 3 of the License, or |
9 | | (at your option) any later version. |
10 | | |
11 | | This program is distributed in the hope that it will be useful, |
12 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | GNU General Public License for more details. |
15 | | |
16 | | You should have received a copy of the GNU General Public License |
17 | | along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
18 | | |
19 | | /* written by Jim Meyering and Paul Eggert */ |
20 | | |
21 | | #include <stdlib.h> |
22 | | #include <errno.h> |
23 | | #include <string.h> |
24 | | #include <unistd.h> |
25 | | |
26 | | #include "xalloc.h" |
27 | | |
28 | | /* Return the current host or domain name in malloc'd storage. |
29 | | If malloc fails, exit. |
30 | | Upon any other failure, return NULL and set errno. */ |
31 | | char * |
32 | | XGETANAME (void) |
33 | 8.76k | { |
34 | 8.76k | char buf[100]; |
35 | 8.76k | idx_t size = sizeof buf; |
36 | 8.76k | char *name = buf; |
37 | 8.76k | char *alloc = NULL; |
38 | | |
39 | 8.76k | while (1) |
40 | 8.76k | { |
41 | | /* Use SIZE_1 here rather than SIZE to work around the bug in |
42 | | SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME |
43 | | even when the name is as long as the supplied buffer. */ |
44 | 8.76k | idx_t size_1 = size - 1; |
45 | 8.76k | name[size_1] = '\0'; |
46 | 8.76k | errno = 0; |
47 | 8.76k | if (GETANAME (name, size_1) == 0) |
48 | 8.76k | { |
49 | | /* Check whether the name was possibly truncated; POSIX does not |
50 | | specify whether a truncated name is null-terminated. */ |
51 | 8.76k | idx_t actual_size = strlen (name) + 1; |
52 | 8.76k | if (actual_size < size_1) |
53 | 8.76k | return alloc ? alloc : ximemdup (name, actual_size); |
54 | 0 | errno = 0; |
55 | 0 | } |
56 | 0 | free (alloc); |
57 | 0 | if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL |
58 | | /* macOS/Darwin does this when SIZE_1 is too small. */ |
59 | 0 | && errno != ENOMEM) |
60 | 0 | return NULL; |
61 | 0 | name = alloc = xpalloc (NULL, &size, 1, -1, 1); |
62 | 0 | } |
63 | 8.76k | } |