From 970274aac9280da11fd166d84b8d4a325187bc55 Mon Sep 17 00:00:00 2001 From: ngie Date: Sat, 27 May 2017 23:26:10 +0000 Subject: [PATCH] MFC r316099: lib/libkvm: start adding basic tests for kvm(3) - kvm_close: add a testcase to verify support for errno = EINVAL / -1 (see D10065) when kd == NULL is provided to the libcall. - kvm_geterr: -- Add a negative testcase for kd == NULL returning "" (see D10022). -- Add two positive testcases: --- test the error case using kvm_write on a O_RDONLY descriptor. --- test the "no error" case using kvm_read(3) and kvm_nlist(3) as helper routines and by injecting a bogus error message via _kvm_err (an internal API) _kvm_err was used as there isn't a formalized way to clear the error output, and because kvm_nlist always returns ENOENT with the NULL terminator today. - kvm_open, kvm_open2: -- Add some basic negative tests for kvm_open(3) and kvm_open2(3). Testing positive cases with a specific `corefile`/`execfile`/`resolver` requires more work and would require user intervention today in order to reliably test this out. MFC note: lib/libkvm/kvm_open2_test is not compiled/tested because ^/stable/10 lacks the kvm_open2(3) libcall. git-svn-id: svn://svn.freebsd.org/base/stable/10@319012 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- etc/mtree/BSD.tests.dist | 2 + lib/libkvm/Makefile | 6 ++ lib/libkvm/tests/Makefile | 24 +++++ lib/libkvm/tests/kvm_close_test.c | 57 ++++++++++++ lib/libkvm/tests/kvm_geterr_test.c | 142 +++++++++++++++++++++++++++++ lib/libkvm/tests/kvm_open2_test.c | 117 ++++++++++++++++++++++++ lib/libkvm/tests/kvm_open_test.c | 105 +++++++++++++++++++++ lib/libkvm/tests/kvm_test_common.c | 49 ++++++++++ lib/libkvm/tests/kvm_test_common.h | 40 ++++++++ 9 files changed, 542 insertions(+) create mode 100644 lib/libkvm/tests/Makefile create mode 100644 lib/libkvm/tests/kvm_close_test.c create mode 100644 lib/libkvm/tests/kvm_geterr_test.c create mode 100644 lib/libkvm/tests/kvm_open2_test.c create mode 100644 lib/libkvm/tests/kvm_open_test.c create mode 100644 lib/libkvm/tests/kvm_test_common.c create mode 100644 lib/libkvm/tests/kvm_test_common.h diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index 4ea9a375f..c5d036706 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -310,6 +310,8 @@ .. libcrypt .. + libkvm + .. libmp .. libnv diff --git a/lib/libkvm/Makefile b/lib/libkvm/Makefile index f21a1bfc1..adbbddbf1 100644 --- a/lib/libkvm/Makefile +++ b/lib/libkvm/Makefile @@ -34,4 +34,10 @@ MLINKS+=kvm_getprocs.3 kvm_getargv.3 kvm_getprocs.3 kvm_getenvv.3 MLINKS+=kvm_open.3 kvm_close.3 kvm_open.3 kvm_openfiles.3 MLINKS+=kvm_read.3 kvm_write.3 +.include + +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + .include diff --git a/lib/libkvm/tests/Makefile b/lib/libkvm/tests/Makefile new file mode 100644 index 000000000..0de6984e7 --- /dev/null +++ b/lib/libkvm/tests/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +ATF_TESTS_C+= kvm_close_test +ATF_TESTS_C+= kvm_geterr_test +ATF_TESTS_C+= kvm_open_test +# NB: kvm_open2(3) isn't available on ^/stable/10 +#ATF_TESTS_C+= kvm_open2_test + +CFLAGS.kvm_geterr_test+= -I${.CURDIR:H} + +DPADD+= ${LIBKVM} +LDADD+= -lkvm + +WARNS?= 6 + +BINDIR= ${TESTSDIR} + +.for t in kvm_geterr_test kvm_open_test kvm_open2_test +SRCS.$t= $t.c kvm_test_common.c +.endfor + +.include diff --git a/lib/libkvm/tests/kvm_close_test.c b/lib/libkvm/tests/kvm_close_test.c new file mode 100644 index 000000000..ab626df11 --- /dev/null +++ b/lib/libkvm/tests/kvm_close_test.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +ATF_TC(kvm_close_negative_test_NULL); +ATF_TC_HEAD(kvm_close_negative_test_NULL, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test that kvm_close(NULL) succeeds without error"); +} + +ATF_TC_BODY(kvm_close_negative_test_NULL, tc) +{ + + ATF_REQUIRE_ERRNO(EINVAL, kvm_close(NULL) == -1); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, kvm_close_negative_test_NULL); + + return (atf_no_error()); +} diff --git a/lib/libkvm/tests/kvm_geterr_test.c b/lib/libkvm/tests/kvm_geterr_test.c new file mode 100644 index 000000000..e97bdd6b8 --- /dev/null +++ b/lib/libkvm/tests/kvm_geterr_test.c @@ -0,0 +1,142 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "kvm_private.h" + +#include "kvm_test_common.h" + +ATF_TC(kvm_geterr_negative_test_NULL); +ATF_TC_HEAD(kvm_geterr_negative_test_NULL, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test that kvm_geterr(NULL) returns NULL"); +} + +ATF_TC_BODY(kvm_geterr_negative_test_NULL, tc) +{ + + ATF_REQUIRE(!errbuf_has_error(kvm_geterr(NULL))); +} + +/* 1100090 was where kvm_open2(3) was introduced. */ +#if __FreeBSD_version >= 1100091 +ATF_TC(kvm_geterr_positive_test_error); +ATF_TC_HEAD(kvm_geterr_positive_test_error, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test that kvm_geterr(kd) when kd doesn't contain an error returns \"\""); + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_geterr_positive_test_error, tc) +{ + kvm_t *kd; + char *error_msg; + + errbuf_clear(); + kd = kvm_open2(NULL, NULL, O_RDONLY, errbuf, NULL); + ATF_CHECK(!errbuf_has_error(errbuf)); + ATF_REQUIRE_MSG(kd != NULL, "kvm_open2 failed: %s", errbuf); + ATF_REQUIRE_MSG(kvm_write(kd, 0, NULL, 0) == -1, + "kvm_write succeeded unexpectedly on an O_RDONLY file descriptor"); + error_msg = kvm_geterr(kd); + ATF_CHECK(errbuf_has_error(error_msg)); + ATF_REQUIRE_MSG(kvm_close(kd) == 0, "kvm_close failed: %s", + strerror(errno)); +} + +ATF_TC(kvm_geterr_positive_test_no_error); +ATF_TC_HEAD(kvm_geterr_positive_test_no_error, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "test that kvm_geterr(kd) when kd contains an error returns an error message"); + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_geterr_positive_test_no_error, tc) +{ +#define ALL_IS_WELL "that ends well" + kvm_t *kd; + char *error_msg; + struct nlist nl[] = { +#define SYMNAME "_mp_maxcpus" +#define X_MAXCPUS 0 + { SYMNAME, 0, 0, 0, 0 }, + { NULL, 0, 0, 0, 0 }, + }; + ssize_t rc; + int mp_maxcpus, retcode; + + errbuf_clear(); + kd = kvm_open2(NULL, NULL, O_RDONLY, errbuf, NULL); + ATF_CHECK(!errbuf_has_error(errbuf)); + ATF_REQUIRE_MSG(kd != NULL, "kvm_open2 failed: %s", errbuf); + retcode = kvm_nlist(kd, nl); + ATF_REQUIRE_MSG(retcode != -1, + "kvm_nlist failed (returned %d): %s", retcode, kvm_geterr(kd)); + if (nl[X_MAXCPUS].n_type == 0) + atf_tc_skip("symbol (\"%s\") couldn't be found", SYMNAME); + _kvm_err(kd, NULL, "%s", ALL_IS_WELL); /* XXX: internal API */ + rc = kvm_read(kd, nl[X_MAXCPUS].n_value, &mp_maxcpus, + sizeof(mp_maxcpus)); + + ATF_REQUIRE_MSG(rc != -1, "kvm_read failed: %s", kvm_geterr(kd)); + error_msg = kvm_geterr(kd); + ATF_REQUIRE_MSG(strcmp(error_msg, ALL_IS_WELL) == 0, + "error message changed: %s", error_msg); + ATF_REQUIRE_MSG(kvm_close(kd) == 0, "kvm_close failed: %s", + strerror(errno)); +} +#endif + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, kvm_geterr_negative_test_NULL); +#if __FreeBSD_version >= 1100091 + ATF_TP_ADD_TC(tp, kvm_geterr_positive_test_error); + ATF_TP_ADD_TC(tp, kvm_geterr_positive_test_no_error); +#endif + + return (atf_no_error()); +} diff --git a/lib/libkvm/tests/kvm_open2_test.c b/lib/libkvm/tests/kvm_open2_test.c new file mode 100644 index 000000000..77b9158d8 --- /dev/null +++ b/lib/libkvm/tests/kvm_open2_test.c @@ -0,0 +1,117 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "kvm_test_common.h" + +ATF_TC_WITHOUT_HEAD(kvm_open2_negative_test_nonexistent_corefile); +ATF_TC_BODY(kvm_open2_negative_test_nonexistent_corefile, tc) +{ + + errbuf_clear(); + ATF_CHECK(kvm_open2(NULL, "/nonexistent", O_RDONLY, NULL, NULL) == NULL); + ATF_CHECK(!errbuf_has_error(errbuf)); + errbuf_clear(); + ATF_CHECK(kvm_open2(NULL, "/nonexistent", O_RDONLY, + errbuf, NULL) == NULL); + ATF_CHECK(errbuf_has_error(errbuf)); +} + +ATF_TC_WITHOUT_HEAD(kvm_open2_negative_test_nonexistent_execfile); +ATF_TC_BODY(kvm_open2_negative_test_nonexistent_execfile, tc) +{ + + errbuf_clear(); + ATF_CHECK(kvm_open2("/nonexistent", _PATH_DEVZERO, O_RDONLY, + NULL, NULL) == NULL); + ATF_CHECK(strlen(errbuf) == 0); + errbuf_clear(); + ATF_CHECK(kvm_open2("/nonexistent", _PATH_DEVZERO, O_RDONLY, + errbuf, NULL) == NULL); + ATF_CHECK(errbuf_has_error(errbuf)); +} + +ATF_TC(kvm_open2_negative_test_invalid_corefile); +ATF_TC_HEAD(kvm_open2_negative_test_invalid_corefile, tc) +{ + + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_open2_negative_test_invalid_corefile, tc) +{ + kvm_t *kd; + + errbuf_clear(); + atf_utils_create_file("some-file", "this is a text file"); + kd = kvm_open2(NULL, "some-file", O_RDONLY, errbuf, NULL); + ATF_CHECK(errbuf_has_error(errbuf)); + ATF_REQUIRE_MSG(kd == NULL, "kvm_open2 succeeded"); +} + +ATF_TC(kvm_open2_negative_test_invalid_execfile); +ATF_TC_HEAD(kvm_open2_negative_test_invalid_execfile, tc) +{ + + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_open2_negative_test_invalid_execfile, tc) +{ + kvm_t *kd; + + errbuf_clear(); + atf_utils_create_file("some-file", "this is a text file"); + kd = kvm_open2("some-file", "/bin/sh", O_RDONLY, errbuf, NULL); + ATF_CHECK(errbuf_has_error(errbuf)); + ATF_REQUIRE_MSG(kd == NULL, "kvm_open2 succeeded unexpectedly"); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, kvm_open2_negative_test_invalid_corefile); + ATF_TP_ADD_TC(tp, kvm_open2_negative_test_invalid_execfile); + ATF_TP_ADD_TC(tp, kvm_open2_negative_test_nonexistent_corefile); + ATF_TP_ADD_TC(tp, kvm_open2_negative_test_nonexistent_execfile); + + return (atf_no_error()); +} diff --git a/lib/libkvm/tests/kvm_open_test.c b/lib/libkvm/tests/kvm_open_test.c new file mode 100644 index 000000000..995993bb7 --- /dev/null +++ b/lib/libkvm/tests/kvm_open_test.c @@ -0,0 +1,105 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "kvm_test_common.h" + +ATF_TC_WITHOUT_HEAD(kvm_open_negative_test_nonexistent_corefile); +ATF_TC_BODY(kvm_open_negative_test_nonexistent_corefile, tc) +{ + + ATF_CHECK(kvm_open(NULL, "/nonexistent", NULL, O_RDONLY, NULL) == NULL); + ATF_CHECK(kvm_open(NULL, "/nonexistent", NULL, O_RDONLY, + getprogname()) == NULL); +} + +ATF_TC_WITHOUT_HEAD(kvm_open_negative_test_nonexistent_execfile); +ATF_TC_BODY(kvm_open_negative_test_nonexistent_execfile, tc) +{ + + ATF_CHECK(kvm_open("/nonexistent", _PATH_DEVZERO, NULL, O_RDONLY, + NULL) == NULL); + ATF_CHECK(kvm_open("/nonexistent", _PATH_DEVZERO, NULL, O_RDONLY, + getprogname()) == NULL); +} + +ATF_TC(kvm_open_negative_test_invalid_corefile); +ATF_TC_HEAD(kvm_open_negative_test_invalid_corefile, tc) +{ + + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_open_negative_test_invalid_corefile, tc) +{ + kvm_t *kd; + + atf_utils_create_file("some-file", "this is a text file"); + kd = kvm_open(NULL, "some-file", NULL, O_RDONLY, getprogname()); + ATF_REQUIRE_MSG(kd == NULL, "kvm_open didn't return NULL on failure"); +} + +ATF_TC(kvm_open_negative_test_invalid_execfile); +ATF_TC_HEAD(kvm_open_negative_test_invalid_execfile, tc) +{ + + atf_tc_set_md_var(tc, "require.user", "root"); +} + +ATF_TC_BODY(kvm_open_negative_test_invalid_execfile, tc) +{ + kvm_t *kd; + + atf_utils_create_file("some-file", "this is a text file"); + kd = kvm_open("some-file", "/bin/sh", NULL, O_RDONLY, getprogname()); + ATF_REQUIRE_MSG(kd == NULL, "kvm_open succeeded unexpectedly"); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, kvm_open_negative_test_invalid_corefile); + ATF_TP_ADD_TC(tp, kvm_open_negative_test_invalid_execfile); + ATF_TP_ADD_TC(tp, kvm_open_negative_test_nonexistent_corefile); + ATF_TP_ADD_TC(tp, kvm_open_negative_test_nonexistent_execfile); + + return (atf_no_error()); +} diff --git a/lib/libkvm/tests/kvm_test_common.c b/lib/libkvm/tests/kvm_test_common.c new file mode 100644 index 000000000..ae9f081bd --- /dev/null +++ b/lib/libkvm/tests/kvm_test_common.c @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include "kvm_test_common.h" + +char errbuf[_POSIX2_LINE_MAX]; + +void +errbuf_clear(void) +{ + + strcpy(errbuf, ""); +} + +bool +errbuf_has_error(const char *_errbuf) +{ + + return (strcmp(_errbuf, "")); +} diff --git a/lib/libkvm/tests/kvm_test_common.h b/lib/libkvm/tests/kvm_test_common.h new file mode 100644 index 000000000..1540a080f --- /dev/null +++ b/lib/libkvm/tests/kvm_test_common.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2017 Ngie Cooper + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __KVM_TEST_COMMON_H__ + +#include +#include +#include + +extern char errbuf[_POSIX2_LINE_MAX]; + +void errbuf_clear(void); +bool errbuf_has_error(const char *); + +#endif -- 2.42.0