[lttng-dev] [PATCH] tests: test_ctf_writer: replace HOST_NAME_MAX
Sebastian Andrzej Siewior
sebastian at breakpoint.cc
Tue Aug 5 16:02:51 EDT 2014
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 <sebastian at 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
More information about the lttng-dev
mailing list