>From 9af2d6c99c9353a4160c99d84134330c1beab246 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 7 Aug 2021 23:30:53 +0200 Subject: [PATCH 1/2] xgetdomainname: Ensure .c file starts with '#include '. * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. * lib/xgetdomainname.c: Include . Include xgetaname-impl.h instead of xgethostname.c. * modules/xgethostname (Files): Add lib/xgetaname-impl.h. * modules/xgetdomainname (Files): Likewise. (Depends-on): Remove xgethostname. Add free-posix, xalloc. --- ChangeLog | 11 +++++++++ lib/xgetaname-impl.h | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/xgetdomainname.c | 5 +++- lib/xgethostname.c | 52 ++++------------------------------------- modules/xgetdomainname | 4 +++- modules/xgethostname | 1 + 6 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 lib/xgetaname-impl.h diff --git a/ChangeLog b/ChangeLog index 8e3707f..9073c37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2021-08-07 Bruno Haible + xgetdomainname: Ensure .c file starts with '#include '. + * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. + * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. + * lib/xgetdomainname.c: Include . Include xgetaname-impl.h + instead of xgethostname.c. + * modules/xgethostname (Files): Add lib/xgetaname-impl.h. + * modules/xgetdomainname (Files): Likewise. + (Depends-on): Remove xgethostname. Add free-posix, xalloc. + +2021-08-07 Bruno Haible + xstrndup: Improve GCC 11 allocation-deallocation checking. * lib/xstrndup.h: Include instead of . (xstrndup): Declare that deallocation must happen through 'free'. diff --git a/lib/xgetaname-impl.h b/lib/xgetaname-impl.h new file mode 100644 index 0000000..ce62000 --- /dev/null +++ b/lib/xgetaname-impl.h @@ -0,0 +1,63 @@ +/* xgetaname-impl.c -- common implementation of xgethostname and xgetdomainname + + Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2021 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Paul Eggert */ + +#include +#include +#include +#include + +#include "xalloc.h" + +/* Return the current host or domain name in malloc'd storage. + If malloc fails, exit. + Upon any other failure, return NULL and set errno. */ +char * +XGETANAME (void) +{ + char buf[100]; + idx_t size = sizeof buf; + char *name = buf; + char *alloc = NULL; + + while (1) + { + /* Use SIZE_1 here rather than SIZE to work around the bug in + SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME + even when the name is as long as the supplied buffer. */ + idx_t size_1 = size - 1; + name[size_1] = '\0'; + errno = 0; + if (GETANAME (name, size_1) == 0) + { + /* Check whether the name was possibly truncated; POSIX does not + specify whether a truncated name is null-terminated. */ + idx_t actual_size = strlen (name) + 1; + if (actual_size < size_1) + return alloc ? alloc : ximemdup (name, actual_size); + errno = 0; + } + free (alloc); + if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL + /* macOS/Darwin does this when SIZE_1 is too small. */ + && errno != ENOMEM) + return NULL; + name = alloc = xpalloc (NULL, &size, 1, -1, 1); + } +} diff --git a/lib/xgetdomainname.c b/lib/xgetdomainname.c index c854dd3..08ba7fa 100644 --- a/lib/xgetdomainname.c +++ b/lib/xgetdomainname.c @@ -15,8 +15,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include + +/* Specification. */ #include "xgetdomainname.h" #define GETANAME getdomainname #define XGETANAME xgetdomainname -#include "xgethostname.c" +#include "xgetaname-impl.h" diff --git a/lib/xgethostname.c b/lib/xgethostname.c index 84c2f27..69dd857 100644 --- a/lib/xgethostname.c +++ b/lib/xgethostname.c @@ -20,53 +20,9 @@ #include -#ifndef GETANAME /* Specification. */ -# include "xgethostname.h" -# define GETANAME gethostname -# define XGETANAME xgethostname -#endif +#include "xgethostname.h" -#include -#include -#include -#include - -#include "xalloc.h" - -/* Return the current host or domain name in malloc'd storage. - If malloc fails, exit. - Upon any other failure, return NULL and set errno. */ -char * -XGETANAME (void) -{ - char buf[100]; - idx_t size = sizeof buf; - char *name = buf; - char *alloc = NULL; - - while (1) - { - /* Use SIZE_1 here rather than SIZE to work around the bug in - SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME - even when the name is as long as the supplied buffer. */ - idx_t size_1 = size - 1; - name[size_1] = '\0'; - errno = 0; - if (GETANAME (name, size_1) == 0) - { - /* Check whether the name was possibly truncated; POSIX does not - specify whether a truncated name is null-terminated. */ - idx_t actual_size = strlen (name) + 1; - if (actual_size < size_1) - return alloc ? alloc : ximemdup (name, actual_size); - errno = 0; - } - free (alloc); - if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL - /* macOS/Darwin does this when SIZE_1 is too small. */ - && errno != ENOMEM) - return NULL; - name = alloc = xpalloc (NULL, &size, 1, -1, 1); - } -} +#define GETANAME gethostname +#define XGETANAME xgethostname +#include "xgetaname-impl.h" diff --git a/modules/xgetdomainname b/modules/xgetdomainname index c1417c8..ec68362 100644 --- a/modules/xgetdomainname +++ b/modules/xgetdomainname @@ -4,10 +4,12 @@ Return machine's domainname, without size limitations. Files: lib/xgetdomainname.h lib/xgetdomainname.c +lib/xgetaname-impl.h Depends-on: +free-posix getdomainname -xgethostname +xalloc configure.ac: diff --git a/modules/xgethostname b/modules/xgethostname index 846df1c..ec25db0 100644 --- a/modules/xgethostname +++ b/modules/xgethostname @@ -4,6 +4,7 @@ Return machine's hostname, without size limitations. Files: lib/xgethostname.h lib/xgethostname.c +lib/xgetaname-impl.h Depends-on: free-posix -- 2.7.4