From 06391f1cb774647c1336a2d3b4a1e1604fc17768 Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Mon, 12 Apr 2021 12:57:28 +0200 Subject: gnulib: Import the gethostname module. * lib/gethostname.c, m4/gethostname.m4: New files. * lib/Makefile.am, m4/gnulib-cache.m4, m4/gnulib-comp.m4: Update by running gnulib-tool. --- lib/Makefile.am | 11 ++++++ lib/gethostname.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ m4/gethostname.m4 | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ m4/gnulib-cache.m4 | 2 + m4/gnulib-comp.m4 | 12 ++++++ 5 files changed, 236 insertions(+) create mode 100644 lib/gethostname.c create mode 100644 m4/gethostname.m4 diff --git a/lib/Makefile.am b/lib/Makefile.am index cb29c3136..9ed7b2544 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -73,6 +73,7 @@ # func \ # gendocs \ # getaddrinfo \ +# gethostname \ # getlogin \ # getpeername \ # getsockname \ @@ -170,6 +171,7 @@ libgnu_la_LDFLAGS += $(COPYSIGN_LIBM) libgnu_la_LDFLAGS += $(FLOOR_LIBM) libgnu_la_LDFLAGS += $(FREXP_LIBM) libgnu_la_LDFLAGS += $(GETADDRINFO_LIB) +libgnu_la_LDFLAGS += $(GETHOSTNAME_LIB) libgnu_la_LDFLAGS += $(HOSTENT_LIB) libgnu_la_LDFLAGS += $(INET_NTOP_LIB) libgnu_la_LDFLAGS += $(INET_PTON_LIB) @@ -823,6 +825,15 @@ EXTRA_libgnu_la_SOURCES += getdtablesize.c ## end gnulib module getdtablesize +## begin gnulib module gethostname + + +EXTRA_DIST += gethostname.c w32sock.h + +EXTRA_libgnu_la_SOURCES += gethostname.c + +## end gnulib module gethostname + ## begin gnulib module getlogin diff --git a/lib/gethostname.c b/lib/gethostname.c new file mode 100644 index 000000000..857cb1bf3 --- /dev/null +++ b/lib/gethostname.c @@ -0,0 +1,104 @@ +/* gethostname emulation for SysV and POSIX.1. + + Copyright (C) 1992, 2003, 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 Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* David MacKenzie + Windows port by Simon Josefsson */ + +#include + +#if !(defined _WIN32 && !defined __CYGWIN__) +/* Unix API. */ + +/* Specification. */ +#include + +#ifdef HAVE_UNAME +# include +#endif + +#include + +/* Put up to LEN chars of the host name into NAME. + Null terminate it if the name is shorter than LEN. + Return 0 if ok, -1 if error. */ + +#include + +int +gethostname (char *name, size_t len) +{ +#ifdef HAVE_UNAME + struct utsname uts; + + if (uname (&uts) == -1) + return -1; + if (len > sizeof (uts.nodename)) + { + /* More space than we need is available. */ + name[sizeof (uts.nodename)] = '\0'; + len = sizeof (uts.nodename); + } + strncpy (name, uts.nodename, len); +#else + strcpy (name, ""); /* Hardcode your system name if you want. */ +#endif + return 0; +} + +#else +/* Native Windows API. Which primitive to choose? + - gethostname() requires linking with -lws2_32. + - GetComputerName() does not return the right kind of hostname. + - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname, + but it is hard to use portably: + - It requires defining _WIN32_WINNT to at least 0x0500. + - With mingw, it also requires + "#define GetComputerNameEx GetComputerNameExA". + - With older versions of mingw, none of the declarations are present at + all, not even of the enum value ComputerNameDnsHostname. + So we use gethostname(). Linking with -lws2_32 is the least evil. */ + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* Get INT_MAX. */ +#include + +/* Get set_winsock_errno. */ +#include "w32sock.h" + +#include "sockets.h" + +#undef gethostname + +int +rpl_gethostname (char *name, size_t len) +{ + int r; + + if (len > INT_MAX) + len = INT_MAX; + gl_sockets_startup (SOCKETS_1_1); + r = gethostname (name, (int) len); + if (r < 0) + set_winsock_errno (); + + return r; +} + +#endif diff --git a/m4/gethostname.m4 b/m4/gethostname.m4 new file mode 100644 index 000000000..25e9eb20c --- /dev/null +++ b/m4/gethostname.m4 @@ -0,0 +1,107 @@ +# gethostname.m4 serial 15 +dnl Copyright (C) 2002, 2008-2021 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Ensure +# - the gethostname() function, +# - the HOST_NAME_MAX macro in . +AC_DEFUN([gl_FUNC_GETHOSTNAME], +[ + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + gl_PREREQ_SYS_H_WINSOCK2 + + dnl Where is gethostname() defined? + dnl - On native Windows, it is in ws2_32.dll. + dnl - Otherwise it is in libc. + GETHOSTNAME_LIB= + AC_CHECK_FUNCS([gethostname], , [ + AC_CACHE_CHECK([for gethostname in winsock2.h and -lws2_32], + [gl_cv_w32_gethostname], + [gl_cv_w32_gethostname=no + gl_save_LIBS="$LIBS" + LIBS="$LIBS -lws2_32" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_WINSOCK2_H +#include +#endif +#include +]], [[gethostname(NULL, 0);]])], [gl_cv_w32_gethostname=yes]) + LIBS="$gl_save_LIBS" + ]) + if test "$gl_cv_w32_gethostname" = "yes"; then + GETHOSTNAME_LIB="-lws2_32" + fi + ]) + AC_SUBST([GETHOSTNAME_LIB]) + + if test "$ac_cv_func_gethostname" = no; then + HAVE_GETHOSTNAME=0 + fi + + gl_PREREQ_HOST_NAME_MAX +]) + +# Provide HOST_NAME_MAX when lacks it. +AC_DEFUN([gl_PREREQ_HOST_NAME_MAX], [ + dnl - On most Unix systems, use MAXHOSTNAMELEN from instead. + dnl - On Solaris, Cygwin, BeOS, use MAXHOSTNAMELEN from instead. + dnl - On mingw, use 256, because + dnl says: + dnl "if a buffer of 256 bytes is passed in the name parameter and + dnl the namelen parameter is set to 256, the buffer size will always + dnl be adequate." + dnl With this, there is no need to use sysconf (_SC_HOST_NAME_MAX), which + dnl is not a compile-time constant. + dnl We cannot override using the usual technique, because + dnl gl_CHECK_NEXT_HEADERS does not work for . Therefore retrieve + dnl the value of HOST_NAME_MAX at configure time. + AC_CHECK_HEADERS_ONCE([sys/param.h]) + AC_CHECK_HEADERS_ONCE([sys/socket.h]) + AC_CHECK_HEADERS_ONCE([netdb.h]) + AC_CACHE_CHECK([for HOST_NAME_MAX], [gl_cv_decl_HOST_NAME_MAX], [ + gl_cv_decl_HOST_NAME_MAX= + AC_EGREP_CPP([lucky], [ +#include +#ifdef HOST_NAME_MAX +lucky +#endif + ], [gl_cv_decl_HOST_NAME_MAX=yes]) + if test -z "$gl_cv_decl_HOST_NAME_MAX"; then + dnl It's not defined in . Substitute it. + if test "$gl_cv_w32_gethostname" = yes; then + dnl mingw. + gl_cv_decl_HOST_NAME_MAX=256 + else + AC_COMPUTE_INT([gl_cv_decl_HOST_NAME_MAX], [MAXHOSTNAMELEN], [ +#include +#if HAVE_SYS_PARAM_H +# include +#endif +#if HAVE_SYS_SOCKET_H +# include +#endif +#if HAVE_NETDB_H +# include +#endif +], + [dnl The system does not define MAXHOSTNAMELEN in any of the common + dnl headers. Use a safe fallback. + gl_cv_decl_HOST_NAME_MAX=256 + ]) + fi + fi + ]) + if test "$gl_cv_decl_HOST_NAME_MAX" != yes; then + AC_DEFINE_UNQUOTED([HOST_NAME_MAX], [$gl_cv_decl_HOST_NAME_MAX], + [Define HOST_NAME_MAX when does not define it.]) + fi +]) + +# Prerequisites of lib/gethostname.c. +AC_DEFUN([gl_PREREQ_GETHOSTNAME], [ + if test "$gl_cv_w32_gethostname" != "yes"; then + AC_CHECK_FUNCS([uname]) + fi +]) diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4 index 9e6b41b4a..b5b3a07ca 100644 --- a/m4/gnulib-cache.m4 +++ b/m4/gnulib-cache.m4 @@ -78,6 +78,7 @@ # func \ # gendocs \ # getaddrinfo \ +# gethostname \ # getlogin \ # getpeername \ # getsockname \ @@ -177,6 +178,7 @@ gl_MODULES([ func gendocs getaddrinfo + gethostname getlogin getpeername getsockname diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index 0ae96ead7..3501e20a3 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -105,6 +105,7 @@ AC_DEFUN([gl_EARLY], # Code from module gendocs: # Code from module getaddrinfo: # Code from module getdtablesize: + # Code from module gethostname: # Code from module getlogin: # Code from module getpeername: # Code from module getrandom: @@ -409,6 +410,12 @@ AC_DEFUN([gl_INIT], AC_LIBOBJ([gai_strerror]) fi gl_NETDB_MODULE_INDICATOR([getaddrinfo]) + gl_FUNC_GETHOSTNAME + if test $HAVE_GETHOSTNAME = 0; then + AC_LIBOBJ([gethostname]) + gl_PREREQ_GETHOSTNAME + fi + gl_UNISTD_MODULE_INDICATOR([gethostname]) gl_FUNC_GETLOGIN if test $HAVE_GETLOGIN = 0; then AC_LIBOBJ([getlogin]) @@ -1529,6 +1536,9 @@ AC_SUBST([LTALLOCA]) if test $HAVE_GETADDRINFO = 0 || test $REPLACE_GETADDRINFO = 1; then func_gl_gnulib_m4code_sockets fi + if test $HAVE_GETHOSTNAME = 0; then + func_gl_gnulib_m4code_sockets + fi if test $REPLACE_ISFINITE = 1; then func_gl_gnulib_m4code_b1df7117b479d2da59d76deba468ee21 fi @@ -1920,6 +1930,7 @@ AC_DEFUN([gl_FILE_LIST], [ lib/gai_strerror.c lib/getaddrinfo.c lib/getdtablesize.c + lib/gethostname.c lib/getlogin.c lib/getpeername.c lib/getrandom.c @@ -2167,6 +2178,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/func.m4 m4/getaddrinfo.m4 m4/getdtablesize.m4 + m4/gethostname.m4 m4/getlogin.m4 m4/getrandom.m4 m4/gnulib-common.m4 -- cgit v1.2.1