summaryrefslogtreecommitdiff
path: root/lib/xgetdomainname.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2021-04-03 16:07:21 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2021-04-03 16:07:38 -0700
commitf30ed230ed479fb1de1cfabadad7b3905ec8b641 (patch)
tree7a2fb09aed6aa752e73eae67f031bf2c11d2a2c8 /lib/xgetdomainname.c
parent0cdb81c92993b8b1e41aee9df2170f5dc35e86b8 (diff)
downloadgnulib-f30ed230ed479fb1de1cfabadad7b3905ec8b641.tar.gz
xgethostname: reorganize / simplify
xgethostname and xgetdomainname were essentially copies long ago, but they’ve diverged. Bring them back together again by implementing the (rarely used) latter in terms of the former. And avoid some unnecessary realloc calls while we’re at it. * lib/xgetdomainname.c: Rewrite from scratch so that it merely includes xgethostname.c with a few preliminaries. * lib/xgethostname.c: Generalize so that it can be included from xgetdomainname.c. (GETANAME, XGETANAME): New macros. (INITIAL_HOSTNAME_LENGTH): Remove. No need for this parameter. Use 100 instead, as few hostnames are longer than that. (XGETANAME): Try getting the hostname into the stack first, as that avoids a malloc call in the usual case. Check for both POSIX-style truncation and SunOS 5.5 bug in a cleaner way, by simply checking string length. Don’t use x2realloc, which wastes time preserving buffer garbage; use xpalloc with NULL instead. Don’t bother shrinking buffer in the very rare case where the hostname is longer than sizeof buf; it’s not worth the aggravation. * modules/xgetdomainname (Depends-on): Remove free-posix, xalloc. Add xgethostname.
Diffstat (limited to 'lib/xgetdomainname.c')
-rw-r--r--lib/xgetdomainname.c92
1 files changed, 4 insertions, 88 deletions
diff --git a/lib/xgetdomainname.c b/lib/xgetdomainname.c
index d77c9b7040..3c0aefd1db 100644
--- a/lib/xgetdomainname.c
+++ b/lib/xgetdomainname.c
@@ -1,89 +1,5 @@
-/* xgetdomainname.c -- Return the NIS domain name, without size limitations.
- Copyright (C) 1992, 1996, 2000-2001, 2003-2004, 2006, 2008-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 <https://www.gnu.org/licenses/>. */
-
-/* Based on xgethostname.c, written by Jim Meyering. */
-
-#include <config.h>
-
-/* Specification. */
+/* Return the NIS domain name, without size limitations. */
#include "xgetdomainname.h"
-
-/* Get getdomainname. */
-#include <unistd.h>
-
-/* Get errno. */
-#include <errno.h>
-
-/* Get strlen. */
-#include <string.h>
-
-/* Get free. */
-#include <stdlib.h>
-
-#include "xalloc.h"
-
-#ifndef INITIAL_DOMAINNAME_LENGTH
-# define INITIAL_DOMAINNAME_LENGTH 34
-#endif
-
-/* Return the NIS domain name of the machine, in malloc'd storage.
- WARNING! The NIS domain name is unrelated to the fully qualified host name
- of the machine. It is also unrelated to email addresses.
- WARNING! The NIS domain name is usually the empty string or "(none)" when
- not using NIS.
- If malloc fails, exit.
- Upon any other failure, set errno and return NULL. */
-char *
-xgetdomainname (void)
-{
- char *domainname;
- size_t size;
-
- size = INITIAL_DOMAINNAME_LENGTH;
- domainname = xmalloc (size);
- while (1)
- {
- int k = size - 1;
- int err;
-
- errno = 0;
- domainname[k] = '\0';
- err = getdomainname (domainname, size);
- if (err >= 0 && domainname[k] == '\0')
- break;
- else if (err < 0 && errno != EINVAL)
- {
- free (domainname);
- return NULL;
- }
- size *= 2;
- domainname = xrealloc (domainname, size);
- }
-
- /* Shrink DOMAINNAME before returning it. */
- {
- size_t actual_size = strlen (domainname) + 1;
- if (actual_size < size)
- {
- char *shrinked_domainname = realloc (domainname, actual_size);
- if (shrinked_domainname != NULL)
- domainname = shrinked_domainname;
- }
- }
-
- return domainname;
-}
+#define GETANAME getdomainname
+#define XGETANAME xgetdomainname
+#include "xgethostname.c"