This patch replaces HOST_NAME_MAX by xgethostname() which is a wrapper around malloc() + gethostname() to get a large enough buffer to fit the hostname. xgethostname.c was stolen from coreutils and slightly changed so it works without xreallocte().
This should fix Debian #751337 where the package does not build KFreeBSD due to missing HOST_NAME_MAX. The test suite passed. Signed-off-by: Sebastian Andrzej Siewior <sebast...@breakpoint.cc> --- tests/lib/Makefile.am | 3 +- tests/lib/test_ctf_writer.c | 10 ++++-- tests/lib/xgethostname.c | 76 +++++++++++++++++++++++++++++++++++++++++++++ tests/lib/xgethostname.h | 1 + 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 tests/lib/xgethostname.c create mode 100644 tests/lib/xgethostname.h diff --git a/tests/lib/Makefile.am b/tests/lib/Makefile.am index 7c96e4a..e3543af 100644 --- a/tests/lib/Makefile.am +++ b/tests/lib/Makefile.am @@ -24,7 +24,8 @@ noinst_PROGRAMS = test_seek test_bitfield test_ctf_writer test_seek_SOURCES = test_seek.c test_bitfield_SOURCES = test_bitfield.c -test_ctf_writer_SOURCES = test_ctf_writer.c +test_ctf_writer_SOURCES = test_ctf_writer.c \ + xgethostname.c xgethostname.h SCRIPT_LIST = test_seek_big_trace \ test_seek_empty_packet \ diff --git a/tests/lib/test_ctf_writer.c b/tests/lib/test_ctf_writer.c index c642933..b80f543 100644 --- a/tests/lib/test_ctf_writer.c +++ b/tests/lib/test_ctf_writer.c @@ -39,6 +39,7 @@ #include <fcntl.h> #include <dirent.h> #include "tap/tap.h" +#include "xgethostname.h" #include <math.h> #include <float.h> @@ -1406,7 +1407,7 @@ int main(int argc, char **argv) char *metadata_string; struct bt_ctf_writer *writer; struct utsname name; - char hostname[HOST_NAME_MAX]; + char *hostname; struct bt_ctf_clock *clock, *ret_clock; struct bt_ctf_stream_class *stream_class; struct bt_ctf_stream *stream1; @@ -1432,10 +1433,15 @@ int main(int argc, char **argv) ok(writer, "bt_ctf_create succeeds in creating trace with path"); /* Add environment context to the trace */ - gethostname(hostname, HOST_NAME_MAX); + hostname = xgethostname(); + if (!hostname) { + perror("xgethostname()"); + return -1; + } ok(bt_ctf_writer_add_environment_field(writer, "host", hostname) == 0, "Add host (%s) environment field to writer instance", hostname); + free(hostname); ok(bt_ctf_writer_add_environment_field(NULL, "test_field", "test_value"), "bt_ctf_writer_add_environment_field error with NULL writer"); diff --git a/tests/lib/xgethostname.c b/tests/lib/xgethostname.c new file mode 100644 index 0000000..26ee7ed --- /dev/null +++ b/tests/lib/xgethostname.c @@ -0,0 +1,76 @@ +/* xgethostname.c -- return current hostname with unlimited length + + Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2013 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 <http://www.gnu.org/licenses/>. */ + +/* written by Jim Meyering */ + +#include <config.h> + +/* Specification. */ +#include "xgethostname.h" + +#include <stdlib.h> +#include <errno.h> +#include <unistd.h> + +#ifndef INITIAL_HOSTNAME_LENGTH +# define INITIAL_HOSTNAME_LENGTH 34 +#endif + +/* Return the current hostname in malloc'd storage. + If malloc fails, exit. + Upon any other failure, return NULL and set errno. */ +char *xgethostname (void) +{ + char *hostname = NULL; + size_t size = INITIAL_HOSTNAME_LENGTH; + + while (1) { + char *new_hn; + /* 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. + */ + size_t size_1; + + new_hn = realloc(hostname, size); + if (!new_hn) { + free(hostname); + return NULL; + + } else { + hostname = new_hn; + } + size_1 = size - 1; + hostname[size_1 - 1] = '\0'; + errno = 0; + + if (gethostname (hostname, size_1) == 0) { + if (!hostname[size_1 - 1]) + break; + } else if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL + /* OSX/Darwin does this when the buffer is not large enough */ + && errno != ENOMEM) { + int saved_errno = errno; + free (hostname); + errno = saved_errno; + return NULL; + } + } + + return hostname; +} diff --git a/tests/lib/xgethostname.h b/tests/lib/xgethostname.h new file mode 100644 index 0000000..0177a40 --- /dev/null +++ b/tests/lib/xgethostname.h @@ -0,0 +1 @@ +char *xgethostname (void); -- 2.0.1 -- To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org