mirror of https://github.com/xemu-project/xemu.git
* Fixes for qtests and unit tests to be more portable to non-POSIX platforms
-----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmMz9MQRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbVUKRAAnubo/wtHqjxg/yVO68odX2LFI2koligA LcEAnhGkVJ/Pe/+Qo9yVbcOY6k6xfGQU3VIipqvLEwPAdSF0E43EJxlImBNm8/Zq MggjNoepXRhdFGULONSmSNm7HJykLH/CHdmBjPLrbpkTCwWG1gg64xP9fI+b8mGf vST0ADuYloLDA9J45UbC33AD+9dQsy2GeOs8X99O6ysKF3htEqMD3vBdqKiJSwgT 2c7UqySGECn6kMHl7iAdipRNUghSgzpUe8LcH4jP7Y1XnoB3zwC/+VrOVwFESI6y LVFsC8u7cEKKSYunoowfQTgHvYbCuSdrDqljy17NE5qRMziKMTnhXaQNR5wtBKNt HZxvc082P/QDFdBYYY3MIjB27r/I6x0t6Xl4IVwLz7bK0xfHFF8Ba2Lr57/2RTc/ SMPDxGrMicTPnPDU/Cw5VROMmw0OC/tVpJMGo1VjVnNESo581RAMApyzkWiUyfZj ktKd+4ihmqrBXcZHVjKbIufa6eKNuktlkfv72dnJY4XoUlDHlbDYaVuknybZmxWK 9/CDVDG72s5Cqm+M47Q56IagVVZwIGrUP0u3j3h/v0rnHZehY8Qzr3SLEfeqmUb6 nP7MP+ItZFZtMITdvXb3OtyeVuM0ZSw8kt+/evpvC9zB6FjgYl/e5FppsO0HxB/O PeeV43Bk270= =n+FM -----END PGP SIGNATURE----- Merge tag 'pull-request-2022-09-28' of https://gitlab.com/thuth/qemu into staging * Fixes for qtests and unit tests to be more portable to non-POSIX platforms # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmMz9MQRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbVUKRAAnubo/wtHqjxg/yVO68odX2LFI2koligA # LcEAnhGkVJ/Pe/+Qo9yVbcOY6k6xfGQU3VIipqvLEwPAdSF0E43EJxlImBNm8/Zq # MggjNoepXRhdFGULONSmSNm7HJykLH/CHdmBjPLrbpkTCwWG1gg64xP9fI+b8mGf # vST0ADuYloLDA9J45UbC33AD+9dQsy2GeOs8X99O6ysKF3htEqMD3vBdqKiJSwgT # 2c7UqySGECn6kMHl7iAdipRNUghSgzpUe8LcH4jP7Y1XnoB3zwC/+VrOVwFESI6y # LVFsC8u7cEKKSYunoowfQTgHvYbCuSdrDqljy17NE5qRMziKMTnhXaQNR5wtBKNt # HZxvc082P/QDFdBYYY3MIjB27r/I6x0t6Xl4IVwLz7bK0xfHFF8Ba2Lr57/2RTc/ # SMPDxGrMicTPnPDU/Cw5VROMmw0OC/tVpJMGo1VjVnNESo581RAMApyzkWiUyfZj # ktKd+4ihmqrBXcZHVjKbIufa6eKNuktlkfv72dnJY4XoUlDHlbDYaVuknybZmxWK # 9/CDVDG72s5Cqm+M47Q56IagVVZwIGrUP0u3j3h/v0rnHZehY8Qzr3SLEfeqmUb6 # nP7MP+ItZFZtMITdvXb3OtyeVuM0ZSw8kt+/evpvC9zB6FjgYl/e5FppsO0HxB/O # PeeV43Bk270= # =n+FM # -----END PGP SIGNATURE----- # gpg: Signature made Wed 28 Sep 2022 03:16:20 EDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2022-09-28' of https://gitlab.com/thuth/qemu: (37 commits) docs/devel: testing: Document writing portable test cases tests/qtest: boot-serial-test: Close the serial file before starting QEMU tests/qtest: vhost-user-test: Avoid using hardcoded /tmp tests/qtest: qmp-test: Avoid using hardcoded /tmp tests/qtest: pflash-cfi02-test: Avoid using hardcoded /tmp tests/qtest: hd-geo-test: Avoid using hardcoded /tmp tests/x86: Move common code to function in device-plug-test .gitlab-ci.d/windows.yml: Display meson test logs tests/qtest: migration-test: Skip running some TLS cases for win32 tests/qtest: libqtest: Replace the call to close a socket with closesocket() tests/qtest: microbit-test: Fix socket access for win32 tests/qtest: virtio-net-failover: Disable migration tests for win32 tests/qtest: ide-test: Open file in binary mode tests/qtest: migration-test: Disable IO redirection for win32 tests/qtest: bios-tables-test: Adapt the case for win32 tests/qtest: {ahci, ide}-test: Use relative path for temporary files for win32 tests/qtest: libqtest: Exclude the *_fds APIs for win32 tests/qtest: libqtest: Adapt global_qtest declaration for win32 tests/qtest: qmp-test: Skip running test_qmp_oob for win32 tests/qtest: Build test-filter-{mirror, redirector} cases for posix only ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
c8de6ec63d
|
@ -61,7 +61,7 @@ msys2-64bit:
|
|||
- .\msys64\usr\bin\bash -lc './configure --target-list=x86_64-softmmu
|
||||
--enable-capstone --without-default-devices'
|
||||
- .\msys64\usr\bin\bash -lc 'make'
|
||||
- .\msys64\usr\bin\bash -lc 'make check'
|
||||
- .\msys64\usr\bin\bash -lc 'make check || { cat build/meson-logs/testlog.txt; exit 1; } ;'
|
||||
|
||||
msys2-32bit:
|
||||
extends: .shared_msys2_builder
|
||||
|
@ -94,4 +94,4 @@ msys2-32bit:
|
|||
- cd output
|
||||
- ..\msys64\usr\bin\bash -lc "../configure --target-list=ppc64-softmmu"
|
||||
- ..\msys64\usr\bin\bash -lc 'make'
|
||||
- ..\msys64\usr\bin\bash -lc 'make check'
|
||||
- ..\msys64\usr\bin\bash -lc 'make check || { cat meson-logs/testlog.txt; exit 1; } ;'
|
||||
|
|
|
@ -81,6 +81,36 @@ QTest cases can be executed with
|
|||
|
||||
make check-qtest
|
||||
|
||||
Writing portable test cases
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Both unit tests and qtests can run on POSIX hosts as well as Windows hosts.
|
||||
Care must be taken when writing portable test cases that can be built and run
|
||||
successfully on various hosts. The following list shows some best practices:
|
||||
|
||||
* Use portable APIs from glib whenever necessary, e.g.: g_setenv(),
|
||||
g_mkdtemp(), g_mkdir().
|
||||
* Avoid using hardcoded /tmp for temporary file directory.
|
||||
Use g_get_tmp_dir() instead.
|
||||
* Bear in mind that Windows has different special string representation for
|
||||
stdin/stdout/stderr and null devices. For example if your test case uses
|
||||
"/dev/fd/2" and "/dev/null" on Linux, remember to use "2" and "nul" on
|
||||
Windows instead. Also IO redirection does not work on Windows, so avoid
|
||||
using "2>nul" whenever necessary.
|
||||
* If your test cases uses the blkdebug feature, use relative path to pass
|
||||
the config and image file paths in the command line as Windows absolute
|
||||
path contains the delimiter ":" which will confuse the blkdebug parser.
|
||||
* Use double quotes in your extra QEMU commmand line in your test cases
|
||||
instead of single quotes, as Windows does not drop single quotes when
|
||||
passing the command line to QEMU.
|
||||
* Windows opens a file in text mode by default, while a POSIX compliant
|
||||
implementation treats text files and binary files the same. So if your
|
||||
test cases opens a file to write some data and later wants to compare the
|
||||
written data with the original one, be sure to pass the letter 'b' as
|
||||
part of the mode string to fopen(), or O_BINARY flag for the open() call.
|
||||
* If a certain test case can only run on POSIX or Linux hosts, use a proper
|
||||
#ifdef in the codes. If the whole test suite cannot run on Windows, disable
|
||||
the build in the meson.build file.
|
||||
|
||||
QAPI schema tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -44,9 +44,9 @@
|
|||
#define TEST_IMAGE_SIZE_MB_SMALL 64
|
||||
|
||||
/*** Globals ***/
|
||||
static char tmp_path[] = "/tmp/qtest.XXXXXX";
|
||||
static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
|
||||
static char mig_socket[] = "/tmp/qtest-migration.XXXXXX";
|
||||
static char *tmp_path;
|
||||
static char *debug_path;
|
||||
static char *mig_socket;
|
||||
static bool ahci_pedantic;
|
||||
static const char *imgfmt;
|
||||
static unsigned test_image_size_mb;
|
||||
|
@ -1437,10 +1437,10 @@ static void test_ncq_simple(void)
|
|||
|
||||
static int prepare_iso(size_t size, unsigned char **buf, char **name)
|
||||
{
|
||||
char cdrom_path[] = "/tmp/qtest.iso.XXXXXX";
|
||||
g_autofree char *cdrom_path = NULL;
|
||||
unsigned char *patt;
|
||||
ssize_t ret;
|
||||
int fd = mkstemp(cdrom_path);
|
||||
int fd = g_file_open_tmp("qtest.iso.XXXXXX", &cdrom_path, NULL);
|
||||
|
||||
g_assert(fd != -1);
|
||||
g_assert(buf);
|
||||
|
@ -1833,7 +1833,7 @@ static void create_ahci_io_test(enum IOMode type, enum AddrMode addr,
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *arch;
|
||||
const char *arch, *base;
|
||||
int ret;
|
||||
int fd;
|
||||
int c;
|
||||
|
@ -1871,8 +1871,22 @@ int main(int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* "base" stores the starting point where we create temporary files.
|
||||
*
|
||||
* On Windows, this is set to the relative path of current working
|
||||
* directory, because the absolute path causes the blkdebug filename
|
||||
* parser fail to parse "blkdebug:path/to/config:path/to/image".
|
||||
*/
|
||||
#ifndef _WIN32
|
||||
base = g_get_tmp_dir();
|
||||
#else
|
||||
base = ".";
|
||||
#endif
|
||||
|
||||
/* Create a temporary image */
|
||||
fd = mkstemp(tmp_path);
|
||||
tmp_path = g_strdup_printf("%s/qtest.XXXXXX", base);
|
||||
fd = g_mkstemp(tmp_path);
|
||||
g_assert(fd >= 0);
|
||||
if (have_qemu_img()) {
|
||||
imgfmt = "qcow2";
|
||||
|
@ -1889,12 +1903,13 @@ int main(int argc, char **argv)
|
|||
close(fd);
|
||||
|
||||
/* Create temporary blkdebug instructions */
|
||||
fd = mkstemp(debug_path);
|
||||
debug_path = g_strdup_printf("%s/qtest-blkdebug.XXXXXX", base);
|
||||
fd = g_mkstemp(debug_path);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
/* Reserve a hollow file to use as a socket for migration tests */
|
||||
fd = mkstemp(mig_socket);
|
||||
fd = g_file_open_tmp("qtest-migration.XXXXXX", &mig_socket, NULL);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
|
@ -1947,8 +1962,11 @@ int main(int argc, char **argv)
|
|||
|
||||
/* Cleanup */
|
||||
unlink(tmp_path);
|
||||
g_free(tmp_path);
|
||||
unlink(debug_path);
|
||||
g_free(debug_path);
|
||||
unlink(mig_socket);
|
||||
g_free(mig_socket);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -608,16 +608,15 @@ static void test_write_block_protect_bottom_bit(void)
|
|||
flash_reset();
|
||||
}
|
||||
|
||||
static char tmp_path[] = "/tmp/qtest.m25p80.XXXXXX";
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
g_autofree char *tmp_path = NULL;
|
||||
int ret;
|
||||
int fd;
|
||||
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
|
||||
fd = mkstemp(tmp_path);
|
||||
fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
|
||||
g_assert(fd >= 0);
|
||||
ret = ftruncate(fd, FLASH_SIZE);
|
||||
g_assert(ret == 0);
|
||||
|
|
|
@ -1615,6 +1615,12 @@ static void test_acpi_virt_viot(void)
|
|||
free_test_data(&data);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
# define DEV_NULL "/dev/null"
|
||||
#else
|
||||
# define DEV_NULL "nul"
|
||||
#endif
|
||||
|
||||
static void test_acpi_q35_slic(void)
|
||||
{
|
||||
test_data data = {
|
||||
|
@ -1622,9 +1628,9 @@ static void test_acpi_q35_slic(void)
|
|||
.variant = ".slic",
|
||||
};
|
||||
|
||||
test_acpi_one("-acpitable sig=SLIC,oem_id='CRASH ',oem_table_id='ME',"
|
||||
"oem_rev=00002210,asl_compiler_id='qemu',"
|
||||
"asl_compiler_rev=00000000,data=/dev/null",
|
||||
test_acpi_one("-acpitable sig=SLIC,oem_id=\"CRASH \",oem_table_id=ME,"
|
||||
"oem_rev=00002210,asl_compiler_id=qemu,"
|
||||
"asl_compiler_rev=00000000,data=" DEV_NULL,
|
||||
&data);
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
|
|
@ -224,15 +224,16 @@ static bool check_guest_output(QTestState *qts, const testdef_t *test, int fd)
|
|||
static void test_machine(const void *data)
|
||||
{
|
||||
const testdef_t *test = data;
|
||||
char serialtmp[] = "/tmp/qtest-boot-serial-sXXXXXX";
|
||||
char codetmp[] = "/tmp/qtest-boot-serial-cXXXXXX";
|
||||
g_autofree char *serialtmp = NULL;
|
||||
g_autofree char *codetmp = NULL;
|
||||
const char *codeparam = "";
|
||||
const uint8_t *code = NULL;
|
||||
QTestState *qts;
|
||||
int ser_fd;
|
||||
|
||||
ser_fd = mkstemp(serialtmp);
|
||||
ser_fd = g_file_open_tmp("qtest-boot-serial-sXXXXXX", &serialtmp, NULL);
|
||||
g_assert(ser_fd != -1);
|
||||
close(ser_fd);
|
||||
|
||||
if (test->kernel) {
|
||||
code = test->kernel;
|
||||
|
@ -246,7 +247,7 @@ static void test_machine(const void *data)
|
|||
ssize_t wlen;
|
||||
int code_fd;
|
||||
|
||||
code_fd = mkstemp(codetmp);
|
||||
code_fd = g_file_open_tmp("qtest-boot-serial-cXXXXXX", &codetmp, NULL);
|
||||
g_assert(code_fd != -1);
|
||||
wlen = write(code_fd, code, test->codesize);
|
||||
g_assert(wlen == test->codesize);
|
||||
|
@ -266,6 +267,8 @@ static void test_machine(const void *data)
|
|||
unlink(codetmp);
|
||||
}
|
||||
|
||||
ser_fd = open(serialtmp, O_RDONLY);
|
||||
g_assert(ser_fd != -1);
|
||||
if (!check_guest_output(qts, test, ser_fd)) {
|
||||
g_error("Failed to find expected string. Please check '%s'",
|
||||
serialtmp);
|
||||
|
|
|
@ -93,10 +93,9 @@ static void cxl_2root_port(void)
|
|||
static void cxl_t3d(void)
|
||||
{
|
||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
||||
const char *tmpfs;
|
||||
g_autofree const char *tmpfs = NULL;
|
||||
|
||||
tmpfs = g_mkdtemp(template);
|
||||
tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
|
||||
|
||||
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_RP QEMU_T3D, tmpfs, tmpfs);
|
||||
|
||||
|
@ -107,10 +106,9 @@ static void cxl_t3d(void)
|
|||
static void cxl_1pxb_2rp_2t3d(void)
|
||||
{
|
||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
||||
const char *tmpfs;
|
||||
g_autofree const char *tmpfs = NULL;
|
||||
|
||||
tmpfs = g_mkdtemp(template);
|
||||
tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
|
||||
|
||||
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_2RP QEMU_2T3D,
|
||||
tmpfs, tmpfs, tmpfs, tmpfs);
|
||||
|
@ -122,10 +120,9 @@ static void cxl_1pxb_2rp_2t3d(void)
|
|||
static void cxl_2pxb_4rp_4t3d(void)
|
||||
{
|
||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
||||
const char *tmpfs;
|
||||
g_autofree const char *tmpfs = NULL;
|
||||
|
||||
tmpfs = g_mkdtemp(template);
|
||||
tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
|
||||
|
||||
g_string_printf(cmdline, QEMU_2PXB_CMD QEMU_4RP QEMU_4T3D,
|
||||
tmpfs, tmpfs, tmpfs, tmpfs, tmpfs, tmpfs,
|
||||
|
|
|
@ -61,6 +61,18 @@ static void wait_device_deleted_event(QTestState *qtest, const char *id)
|
|||
}
|
||||
}
|
||||
|
||||
static void process_device_remove(QTestState *qtest, const char *id)
|
||||
{
|
||||
/*
|
||||
* Request device removal. As the guest is not running, the request won't
|
||||
* be processed. However during system reset, the removal will be
|
||||
* handled, removing the device.
|
||||
*/
|
||||
device_del(qtest, id);
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, id);
|
||||
}
|
||||
|
||||
static void test_pci_unplug_request(void)
|
||||
{
|
||||
const char *arch = qtest_get_arch();
|
||||
|
@ -73,14 +85,7 @@ static void test_pci_unplug_request(void)
|
|||
QTestState *qtest = qtest_initf("%s -device virtio-mouse-pci,id=dev0",
|
||||
machine_addition);
|
||||
|
||||
/*
|
||||
* Request device removal. As the guest is not running, the request won't
|
||||
* be processed. However during system reset, the removal will be
|
||||
* handled, removing the device.
|
||||
*/
|
||||
device_del(qtest, "dev0");
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, "dev0");
|
||||
process_device_remove(qtest, "dev0");
|
||||
|
||||
qtest_quit(qtest);
|
||||
}
|
||||
|
@ -98,14 +103,7 @@ static void test_pci_unplug_json_request(void)
|
|||
"%s -device \"{'driver': 'virtio-mouse-pci', 'id': 'dev0'}\"",
|
||||
machine_addition);
|
||||
|
||||
/*
|
||||
* Request device removal. As the guest is not running, the request won't
|
||||
* be processed. However during system reset, the removal will be
|
||||
* handled, removing the device.
|
||||
*/
|
||||
device_del(qtest, "dev0");
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, "dev0");
|
||||
process_device_remove(qtest, "dev0");
|
||||
|
||||
qtest_quit(qtest);
|
||||
}
|
||||
|
@ -128,9 +126,7 @@ static void test_spapr_cpu_unplug_request(void)
|
|||
"-device power9_v2.0-spapr-cpu-core,core-id=1,id=dev0");
|
||||
|
||||
/* similar to test_pci_unplug_request */
|
||||
device_del(qtest, "dev0");
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, "dev0");
|
||||
process_device_remove(qtest, "dev0");
|
||||
|
||||
qtest_quit(qtest);
|
||||
}
|
||||
|
@ -144,9 +140,7 @@ static void test_spapr_memory_unplug_request(void)
|
|||
"-device pc-dimm,id=dev0,memdev=mem0");
|
||||
|
||||
/* similar to test_pci_unplug_request */
|
||||
device_del(qtest, "dev0");
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, "dev0");
|
||||
process_device_remove(qtest, "dev0");
|
||||
|
||||
qtest_quit(qtest);
|
||||
}
|
||||
|
@ -158,9 +152,7 @@ static void test_spapr_phb_unplug_request(void)
|
|||
qtest = qtest_initf("-device spapr-pci-host-bridge,index=1,id=dev0");
|
||||
|
||||
/* similar to test_pci_unplug_request */
|
||||
device_del(qtest, "dev0");
|
||||
system_reset(qtest);
|
||||
wait_device_deleted_event(qtest, "dev0");
|
||||
process_device_remove(qtest, "dev0");
|
||||
|
||||
qtest_quit(qtest);
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ enum {
|
|||
DSKCHG = 0x80,
|
||||
};
|
||||
|
||||
static char test_image[] = "/tmp/qtest.XXXXXX";
|
||||
static char *test_image;
|
||||
|
||||
#define assert_bit_set(data, mask) g_assert_cmphex((data) & (mask), ==, (mask))
|
||||
#define assert_bit_clear(data, mask) g_assert_cmphex((data) & (mask), ==, 0)
|
||||
|
@ -608,7 +608,7 @@ int main(int argc, char **argv)
|
|||
int ret;
|
||||
|
||||
/* Create a temporary raw image */
|
||||
fd = mkstemp(test_image);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &test_image, NULL);
|
||||
g_assert(fd >= 0);
|
||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||
g_assert(ret == 0);
|
||||
|
@ -640,6 +640,7 @@ int main(int argc, char **argv)
|
|||
/* Cleanup */
|
||||
qtest_end();
|
||||
unlink(test_image);
|
||||
g_free(test_image);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@ typedef struct generic_fuzz_config {
|
|||
} generic_fuzz_config;
|
||||
|
||||
static inline gchar *generic_fuzzer_virtio_9p_args(void){
|
||||
char tmpdir[] = "/tmp/qemu-fuzz.XXXXXX";
|
||||
g_assert_nonnull(g_mkdtemp(tmpdir));
|
||||
g_autofree char *tmpdir = g_dir_make_tmp("qemu-fuzz.XXXXXX", NULL);
|
||||
g_assert_nonnull(tmpdir);
|
||||
|
||||
return g_strdup_printf("-machine q35 -nodefaults "
|
||||
"-device virtio-9p,fsdev=hshare,mount_tag=hshare "
|
||||
|
|
|
@ -181,10 +181,10 @@ static void drive_destroy(void *path)
|
|||
static char *drive_create(void)
|
||||
{
|
||||
int fd, ret;
|
||||
char *t_path = g_strdup("/tmp/qtest.XXXXXX");
|
||||
char *t_path;
|
||||
|
||||
/* Create a temporary raw image */
|
||||
fd = mkstemp(t_path);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
|
||||
g_assert_cmpint(fd, >=, 0);
|
||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||
g_assert_cmpint(ret, ==, 0);
|
||||
|
|
|
@ -27,16 +27,16 @@
|
|||
|
||||
static char *create_test_img(int secs)
|
||||
{
|
||||
char *template = strdup("/tmp/qtest.XXXXXX");
|
||||
char *template;
|
||||
int fd, ret;
|
||||
|
||||
fd = mkstemp(template);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &template, NULL);
|
||||
g_assert(fd >= 0);
|
||||
ret = ftruncate(fd, (off_t)secs * 512);
|
||||
close(fd);
|
||||
|
||||
if (ret) {
|
||||
free(template);
|
||||
g_free(template);
|
||||
template = NULL;
|
||||
}
|
||||
|
||||
|
@ -422,9 +422,8 @@ static MBRpartitions empty_mbr = { {false, 0, 0, 0, 0, 0, 0, 0, 0},
|
|||
|
||||
static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
||||
{
|
||||
const char *template = "/tmp/qtest.XXXXXX";
|
||||
char *raw_path = strdup(template);
|
||||
char *qcow2_path = strdup(template);
|
||||
g_autofree char *raw_path = NULL;
|
||||
char *qcow2_path;
|
||||
char cmd[100 + 2 * PATH_MAX];
|
||||
uint8_t buf[512] = {};
|
||||
int i, ret, fd, offset;
|
||||
|
@ -468,7 +467,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
|||
offset += 0x10;
|
||||
}
|
||||
|
||||
fd = mkstemp(raw_path);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &raw_path, NULL);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
|
@ -478,7 +477,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
|||
g_assert(ret == sizeof(buf));
|
||||
close(fd);
|
||||
|
||||
fd = mkstemp(qcow2_path);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &qcow2_path, NULL);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
|
@ -506,7 +505,6 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
|||
free(qemu_img_abs_path);
|
||||
|
||||
unlink(raw_path);
|
||||
free(raw_path);
|
||||
|
||||
return qcow2_path;
|
||||
}
|
||||
|
@ -714,7 +712,7 @@ static void test_override(TestArgs *args, CHSResult expected[])
|
|||
|
||||
for (i = 0; i < args->n_drives; i++) {
|
||||
unlink(args->drives[i]);
|
||||
free(args->drives[i]);
|
||||
g_free(args->drives[i]);
|
||||
}
|
||||
g_free(args->drives);
|
||||
g_strfreev(args->argv);
|
||||
|
@ -867,7 +865,7 @@ static void test_override_scsi_hot_unplug(void)
|
|||
|
||||
for (i = 0; i < args->n_drives; i++) {
|
||||
unlink(args->drives[i]);
|
||||
free(args->drives[i]);
|
||||
g_free(args->drives[i]);
|
||||
}
|
||||
g_free(args->drives);
|
||||
g_strfreev(args->argv);
|
||||
|
@ -927,7 +925,7 @@ static void test_override_virtio_hot_unplug(void)
|
|||
|
||||
for (i = 0; i < args->n_drives; i++) {
|
||||
unlink(args->drives[i]);
|
||||
free(args->drives[i]);
|
||||
g_free(args->drives[i]);
|
||||
}
|
||||
g_free(args->drives);
|
||||
g_strfreev(args->argv);
|
||||
|
@ -987,7 +985,7 @@ test_add_done:
|
|||
for (i = 0; i < backend_last; i++) {
|
||||
if (img_file_name[i]) {
|
||||
unlink(img_file_name[i]);
|
||||
free(img_file_name[i]);
|
||||
g_free(img_file_name[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -278,56 +278,34 @@ static void test_i440fx_pam(gconstpointer opaque)
|
|||
qtest_end();
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
#define BLOB_SIZE ((size_t)65536)
|
||||
#define ISA_BIOS_MAXSZ ((size_t)(128 * 1024))
|
||||
|
||||
/* Create a blob file, and return its absolute pathname as a dynamically
|
||||
/*
|
||||
* Create a blob file, and return its absolute pathname as a dynamically
|
||||
* allocated string.
|
||||
* The file is closed before the function returns.
|
||||
* In case of error, NULL is returned. The function prints the error message.
|
||||
* In case of error, the function aborts and prints the error message.
|
||||
*/
|
||||
static char *create_blob_file(void)
|
||||
{
|
||||
int ret, fd;
|
||||
int i, fd;
|
||||
char *pathname;
|
||||
GError *error = NULL;
|
||||
g_autofree uint8_t *buf = g_malloc(BLOB_SIZE);
|
||||
|
||||
ret = -1;
|
||||
fd = g_file_open_tmp("blob_XXXXXX", &pathname, &error);
|
||||
if (fd == -1) {
|
||||
fprintf(stderr, "unable to create blob file: %s\n", error->message);
|
||||
g_error_free(error);
|
||||
} else {
|
||||
if (ftruncate(fd, BLOB_SIZE) == -1) {
|
||||
fprintf(stderr, "ftruncate(\"%s\", %zu): %s\n", pathname,
|
||||
BLOB_SIZE, strerror(errno));
|
||||
} else {
|
||||
void *buf;
|
||||
g_assert_no_error(error);
|
||||
close(fd);
|
||||
|
||||
buf = mmap(NULL, BLOB_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
if (buf == MAP_FAILED) {
|
||||
fprintf(stderr, "mmap(\"%s\", %zu): %s\n", pathname, BLOB_SIZE,
|
||||
strerror(errno));
|
||||
} else {
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < BLOB_SIZE; ++i) {
|
||||
((uint8_t *)buf)[i] = i;
|
||||
}
|
||||
munmap(buf, BLOB_SIZE);
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
if (ret == -1) {
|
||||
unlink(pathname);
|
||||
g_free(pathname);
|
||||
}
|
||||
for (i = 0; i < BLOB_SIZE; i++) {
|
||||
buf[i] = i;
|
||||
}
|
||||
|
||||
return ret == -1 ? NULL : pathname;
|
||||
g_file_set_contents(pathname, (char *)buf, BLOB_SIZE, &error);
|
||||
g_assert_no_error(error);
|
||||
|
||||
return pathname;
|
||||
}
|
||||
|
||||
static void test_i440fx_firmware(FirmwareTestFixture *fixture,
|
||||
|
@ -398,8 +376,6 @@ static void request_pflash(FirmwareTestFixture *fixture,
|
|||
fixture->is_bios = false;
|
||||
}
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
TestData data;
|
||||
|
@ -410,10 +386,8 @@ int main(int argc, char **argv)
|
|||
|
||||
qtest_add_data_func("i440fx/defaults", &data, test_i440fx_defaults);
|
||||
qtest_add_data_func("i440fx/pam", &data, test_i440fx_pam);
|
||||
#ifndef _WIN32
|
||||
add_firmware_test("i440fx/firmware/bios", request_bios);
|
||||
add_firmware_test("i440fx/firmware/pflash", request_pflash);
|
||||
#endif
|
||||
|
||||
return g_test_run();
|
||||
}
|
||||
|
|
|
@ -121,8 +121,8 @@ enum {
|
|||
static QPCIBus *pcibus = NULL;
|
||||
static QGuestAllocator guest_malloc;
|
||||
|
||||
static char tmp_path[] = "/tmp/qtest.XXXXXX";
|
||||
static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
|
||||
static char *tmp_path;
|
||||
static char *debug_path;
|
||||
|
||||
static QTestState *ide_test_start(const char *cmdline_fmt, ...)
|
||||
{
|
||||
|
@ -892,7 +892,7 @@ static void cdrom_pio_impl(int nblocks)
|
|||
|
||||
/* Prepopulate the CDROM with an interesting pattern */
|
||||
generate_pattern(pattern, patt_len, ATAPI_BLOCK_SIZE);
|
||||
fh = fopen(tmp_path, "w+");
|
||||
fh = fopen(tmp_path, "wb+");
|
||||
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, patt_blocks, fh);
|
||||
g_assert_cmpint(ret, ==, patt_blocks);
|
||||
fclose(fh);
|
||||
|
@ -993,7 +993,7 @@ static void test_cdrom_dma(void)
|
|||
prdt[0].size = cpu_to_le32(len | PRDT_EOT);
|
||||
|
||||
generate_pattern(pattern, ATAPI_BLOCK_SIZE * 16, ATAPI_BLOCK_SIZE);
|
||||
fh = fopen(tmp_path, "w+");
|
||||
fh = fopen(tmp_path, "wb+");
|
||||
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, 16, fh);
|
||||
g_assert_cmpint(ret, ==, 16);
|
||||
fclose(fh);
|
||||
|
@ -1011,16 +1011,32 @@ static void test_cdrom_dma(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *base;
|
||||
int fd;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* "base" stores the starting point where we create temporary files.
|
||||
*
|
||||
* On Windows, this is set to the relative path of current working
|
||||
* directory, because the absolute path causes the blkdebug filename
|
||||
* parser fail to parse "blkdebug:path/to/config:path/to/image".
|
||||
*/
|
||||
#ifndef _WIN32
|
||||
base = g_get_tmp_dir();
|
||||
#else
|
||||
base = ".";
|
||||
#endif
|
||||
|
||||
/* Create temporary blkdebug instructions */
|
||||
fd = mkstemp(debug_path);
|
||||
debug_path = g_strdup_printf("%s/qtest-blkdebug.XXXXXX", base);
|
||||
fd = g_mkstemp(debug_path);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
/* Create a temporary raw image */
|
||||
fd = mkstemp(tmp_path);
|
||||
tmp_path = g_strdup_printf("%s/qtest.XXXXXX", base);
|
||||
fd = g_mkstemp(tmp_path);
|
||||
g_assert(fd >= 0);
|
||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||
g_assert(ret == 0);
|
||||
|
@ -1049,7 +1065,9 @@ int main(int argc, char **argv)
|
|||
|
||||
/* Cleanup */
|
||||
unlink(tmp_path);
|
||||
g_free(tmp_path);
|
||||
unlink(debug_path);
|
||||
g_free(debug_path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,11 @@
|
|||
|
||||
#include "libqtest.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
QTestState *global_qtest __attribute__((common, weak));
|
||||
#else
|
||||
__declspec(selectany) QTestState *global_qtest;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* qtest_start:
|
||||
|
|
|
@ -97,7 +97,7 @@ static int socket_accept(int sock)
|
|||
(void *)&timeout, sizeof(timeout))) {
|
||||
fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
|
||||
__func__, strerror(errno));
|
||||
close(sock);
|
||||
closesocket(sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ static int socket_accept(int sock)
|
|||
if (ret == -1) {
|
||||
fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
|
||||
}
|
||||
close(sock);
|
||||
closesocket(sock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -265,8 +265,10 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
|
|||
|
||||
s = g_new(QTestState, 1);
|
||||
|
||||
socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
|
||||
qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
|
||||
socket_path = g_strdup_printf("%s/qtest-%d.sock",
|
||||
g_get_tmp_dir(), getpid());
|
||||
qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp",
|
||||
g_get_tmp_dir(), getpid());
|
||||
|
||||
/* It's possible that if an earlier test run crashed it might
|
||||
* have left a stale unix socket lying around. Delete any
|
||||
|
@ -390,10 +392,12 @@ QTestState *qtest_initf(const char *fmt, ...)
|
|||
QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
|
||||
{
|
||||
int sock_fd_init;
|
||||
char *sock_path, sock_dir[] = "/tmp/qtest-serial-XXXXXX";
|
||||
g_autofree char *sock_dir = NULL;
|
||||
char *sock_path;
|
||||
QTestState *qts;
|
||||
|
||||
g_assert_true(g_mkdtemp(sock_dir) != NULL);
|
||||
sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL);
|
||||
g_assert_true(sock_dir != NULL);
|
||||
sock_path = g_strdup_printf("%s/sock", sock_dir);
|
||||
|
||||
sock_fd_init = init_socket(sock_path);
|
||||
|
@ -417,8 +421,8 @@ void qtest_quit(QTestState *s)
|
|||
qtest_remove_abrt_handler(s);
|
||||
|
||||
qtest_kill_qemu(s);
|
||||
close(s->fd);
|
||||
close(s->qmp_fd);
|
||||
closesocket(s->fd);
|
||||
closesocket(s->qmp_fd);
|
||||
g_string_free(s->rx, true);
|
||||
|
||||
for (GList *it = s->pending_events; it != NULL; it = it->next) {
|
||||
|
@ -588,17 +592,20 @@ int qtest_socket_server(const char *socket_path)
|
|||
return sock;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, va_list ap)
|
||||
{
|
||||
qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap);
|
||||
}
|
||||
#endif
|
||||
|
||||
void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap)
|
||||
{
|
||||
qmp_fd_vsend_fds(s->qmp_fd, NULL, 0, fmt, ap);
|
||||
qmp_fd_vsend(s->qmp_fd, fmt, ap);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, va_list ap)
|
||||
{
|
||||
|
@ -607,6 +614,7 @@ QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
|||
/* Receive reply */
|
||||
return qtest_qmp_receive(s);
|
||||
}
|
||||
#endif
|
||||
|
||||
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
||||
{
|
||||
|
@ -616,6 +624,7 @@ QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
|||
return qtest_qmp_receive(s);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
|
@ -627,6 +636,7 @@ QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
|||
va_end(ap);
|
||||
return response;
|
||||
}
|
||||
#endif
|
||||
|
||||
QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
|
||||
{
|
||||
|
@ -1323,6 +1333,7 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
|||
qobject_unref(args);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
||||
{
|
||||
QDict *resp;
|
||||
|
@ -1342,6 +1353,7 @@ void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
|||
g_assert(!qdict_haskey(resp, "error"));
|
||||
qobject_unref(resp);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generic hot-unplugging test via the device_del QMP command.
|
||||
|
|
|
@ -94,6 +94,7 @@ void qtest_kill_qemu(QTestState *s);
|
|||
*/
|
||||
void qtest_quit(QTestState *s);
|
||||
|
||||
#ifndef _WIN32
|
||||
/**
|
||||
* qtest_qmp_fds:
|
||||
* @s: #QTestState instance to operate on.
|
||||
|
@ -108,6 +109,7 @@ void qtest_quit(QTestState *s);
|
|||
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, ...)
|
||||
G_GNUC_PRINTF(4, 5);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/**
|
||||
* qtest_qmp:
|
||||
|
@ -152,6 +154,7 @@ void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
|
|||
*/
|
||||
int qtest_socket_server(const char *socket_path);
|
||||
|
||||
#ifndef _WIN32
|
||||
/**
|
||||
* qtest_vqmp_fds:
|
||||
* @s: #QTestState instance to operate on.
|
||||
|
@ -167,6 +170,7 @@ int qtest_socket_server(const char *socket_path);
|
|||
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, va_list ap)
|
||||
G_GNUC_PRINTF(4, 0);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/**
|
||||
* qtest_vqmp:
|
||||
|
@ -181,6 +185,7 @@ QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
|||
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
||||
G_GNUC_PRINTF(2, 0);
|
||||
|
||||
#ifndef _WIN32
|
||||
/**
|
||||
* qtest_qmp_vsend_fds:
|
||||
* @s: #QTestState instance to operate on.
|
||||
|
@ -196,6 +201,7 @@ QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
|||
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
|
||||
const char *fmt, va_list ap)
|
||||
G_GNUC_PRINTF(4, 0);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/**
|
||||
* qtest_qmp_vsend:
|
||||
|
@ -743,6 +749,7 @@ void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
|
|||
void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
||||
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
|
||||
|
||||
#ifndef _WIN32
|
||||
/**
|
||||
* qtest_qmp_add_client:
|
||||
* @qts: QTestState instance to operate on
|
||||
|
@ -752,6 +759,7 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
|||
* Call QMP ``getfd`` followed by ``add_client`` with the given @fd.
|
||||
*/
|
||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/**
|
||||
* qtest_qmp_device_del:
|
||||
|
|
|
@ -39,9 +39,14 @@ qtests_pci = \
|
|||
qtests_cxl = \
|
||||
(config_all_devices.has_key('CONFIG_CXL') ? ['cxl-test'] : [])
|
||||
|
||||
qtests_filter = \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
|
||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : [])
|
||||
|
||||
qtests_i386 = \
|
||||
(slirp.found() ? ['pxe-test', 'test-netfilter'] : []) + \
|
||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
|
||||
(slirp.found() ? ['pxe-test'] : []) + \
|
||||
qtests_filter + \
|
||||
(have_tools ? ['ahci-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
|
||||
|
@ -95,8 +100,7 @@ qtests_i386 = \
|
|||
'vmgenid-test',
|
||||
'migration-test',
|
||||
'test-x86-cpuid-compat',
|
||||
'numa-test',
|
||||
'test-filter-redirector'
|
||||
'numa-test'
|
||||
]
|
||||
|
||||
if dbus_display
|
||||
|
@ -120,30 +124,25 @@ endif
|
|||
qtests_x86_64 = qtests_i386
|
||||
|
||||
qtests_alpha = ['boot-serial-test'] + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
qtests_filter + \
|
||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||
|
||||
qtests_avr = [ 'boot-serial-test' ]
|
||||
|
||||
qtests_hppa = ['boot-serial-test'] + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
qtests_filter + \
|
||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||
|
||||
qtests_m68k = ['boot-serial-test'] + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : [])
|
||||
qtests_filter
|
||||
|
||||
qtests_microblaze = ['boot-serial-test'] + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : [])
|
||||
qtests_filter
|
||||
|
||||
qtests_microblazeel = qtests_microblaze
|
||||
|
||||
qtests_mips = \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
qtests_filter + \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||
|
||||
|
@ -152,8 +151,7 @@ qtests_mips64 = qtests_mips
|
|||
qtests_mips64el = qtests_mips
|
||||
|
||||
qtests_ppc = \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
qtests_filter + \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_TCG') ? ['prom-env-test'] : []) + \
|
||||
|
@ -174,13 +172,11 @@ qtests_sh4 = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-te
|
|||
qtests_sh4eb = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
|
||||
|
||||
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
(slirp.found() ? ['test-netfilter'] : [])
|
||||
qtests_filter
|
||||
|
||||
qtests_sparc64 = \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
||||
qtests_filter + \
|
||||
['prom-env-test', 'boot-serial-test']
|
||||
|
||||
qtests_npcm7xx = \
|
||||
|
|
|
@ -51,7 +51,7 @@ static void uart_rw_to_rxd(QTestState *qts, int sock_fd, const char *in,
|
|||
{
|
||||
int i, in_len = strlen(in);
|
||||
|
||||
g_assert_true(write(sock_fd, in, in_len) == in_len);
|
||||
g_assert_true(send(sock_fd, in, in_len, 0) == in_len);
|
||||
for (i = 0; i < in_len; i++) {
|
||||
g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
|
||||
A_UART_RXDRDY));
|
||||
|
@ -77,7 +77,7 @@ static void test_nrf51_uart(void)
|
|||
char s[10];
|
||||
QTestState *qts = qtest_init_with_serial("-M microbit", &sock_fd);
|
||||
|
||||
g_assert_true(write(sock_fd, "c", 1) == 1);
|
||||
g_assert_true(send(sock_fd, "c", 1, 0) == 1);
|
||||
g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD), ==, 0x00);
|
||||
|
||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_ENABLE, 0x04);
|
||||
|
@ -97,17 +97,17 @@ static void test_nrf51_uart(void)
|
|||
|
||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
|
||||
uart_w_to_txd(qts, "d");
|
||||
g_assert_true(read(sock_fd, s, 10) == 1);
|
||||
g_assert_true(recv(sock_fd, s, 10, 0) == 1);
|
||||
g_assert_cmphex(s[0], ==, 'd');
|
||||
|
||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_SUSPEND, 0x01);
|
||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_TXD, 'h');
|
||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
|
||||
uart_w_to_txd(qts, "world");
|
||||
g_assert_true(read(sock_fd, s, 10) == 5);
|
||||
g_assert_true(recv(sock_fd, s, 10, 0) == 5);
|
||||
g_assert_true(memcmp(s, "world", 5) == 0);
|
||||
|
||||
close(sock_fd);
|
||||
closesocket(sock_fd);
|
||||
|
||||
qtest_quit(qts);
|
||||
}
|
||||
|
|
|
@ -647,7 +647,16 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
|||
}
|
||||
|
||||
if (!getenv("QTEST_LOG") && args->hide_stderr) {
|
||||
#ifndef _WIN32
|
||||
ignore_stderr = "2>/dev/null";
|
||||
#else
|
||||
/*
|
||||
* On Windows the QEMU executable is created via CreateProcess() and
|
||||
* IO redirection does not work, so don't bother adding IO redirection
|
||||
* to the command line.
|
||||
*/
|
||||
ignore_stderr = "";
|
||||
#endif
|
||||
} else {
|
||||
ignore_stderr = "";
|
||||
}
|
||||
|
@ -1393,6 +1402,7 @@ static void test_precopy_unix_dirty_ring(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
static void test_precopy_unix_tls_psk(void)
|
||||
{
|
||||
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
||||
|
@ -1405,6 +1415,7 @@ static void test_precopy_unix_tls_psk(void)
|
|||
|
||||
test_precopy_common(&args);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifdef CONFIG_TASN1
|
||||
static void test_precopy_unix_tls_x509_default_host(void)
|
||||
|
@ -1513,6 +1524,7 @@ static void test_precopy_tcp_plain(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
static void test_precopy_tcp_tls_psk_match(void)
|
||||
{
|
||||
MigrateCommon args = {
|
||||
|
@ -1523,6 +1535,7 @@ static void test_precopy_tcp_tls_psk_match(void)
|
|||
|
||||
test_precopy_common(&args);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
static void test_precopy_tcp_tls_psk_mismatch(void)
|
||||
{
|
||||
|
@ -1920,6 +1933,7 @@ static void test_multifd_tcp_zstd(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
static void *
|
||||
test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
|
||||
QTestState *to)
|
||||
|
@ -1927,6 +1941,7 @@ test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
|
|||
test_migrate_precopy_tcp_multifd_start_common(from, to, "none");
|
||||
return test_migrate_tls_psk_start_match(from, to);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
static void *
|
||||
test_migrate_multifd_tcp_tls_psk_start_mismatch(QTestState *from,
|
||||
|
@ -1978,6 +1993,7 @@ test_migrate_multifd_tls_x509_start_reject_anon_client(QTestState *from,
|
|||
}
|
||||
#endif /* CONFIG_TASN1 */
|
||||
|
||||
#ifndef _WIN32
|
||||
static void test_multifd_tcp_tls_psk_match(void)
|
||||
{
|
||||
MigrateCommon args = {
|
||||
|
@ -1987,6 +2003,7 @@ static void test_multifd_tcp_tls_psk_match(void)
|
|||
};
|
||||
test_precopy_common(&args);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
static void test_multifd_tcp_tls_psk_mismatch(void)
|
||||
{
|
||||
|
@ -2483,8 +2500,10 @@ int main(int argc, char **argv)
|
|||
qtest_add_func("/migration/precopy/unix/plain", test_precopy_unix_plain);
|
||||
qtest_add_func("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle);
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
qtest_add_func("/migration/precopy/unix/tls/psk",
|
||||
test_precopy_unix_tls_psk);
|
||||
#endif
|
||||
|
||||
if (has_uffd) {
|
||||
/*
|
||||
|
@ -2510,8 +2529,10 @@ int main(int argc, char **argv)
|
|||
|
||||
qtest_add_func("/migration/precopy/tcp/plain", test_precopy_tcp_plain);
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
qtest_add_func("/migration/precopy/tcp/tls/psk/match",
|
||||
test_precopy_tcp_tls_psk_match);
|
||||
#endif
|
||||
qtest_add_func("/migration/precopy/tcp/tls/psk/mismatch",
|
||||
test_precopy_tcp_tls_psk_mismatch);
|
||||
#ifdef CONFIG_TASN1
|
||||
|
@ -2555,8 +2576,10 @@ int main(int argc, char **argv)
|
|||
test_multifd_tcp_zstd);
|
||||
#endif
|
||||
#ifdef CONFIG_GNUTLS
|
||||
#ifndef _WIN32
|
||||
qtest_add_func("/migration/multifd/tcp/tls/psk/match",
|
||||
test_multifd_tcp_tls_psk_match);
|
||||
#endif
|
||||
qtest_add_func("/migration/multifd/tcp/tls/psk/mismatch",
|
||||
test_multifd_tcp_tls_psk_mismatch);
|
||||
#ifdef CONFIG_TASN1
|
||||
|
|
|
@ -56,7 +56,7 @@ typedef struct {
|
|||
QTestState *qtest;
|
||||
} FlashConfig;
|
||||
|
||||
static char image_path[] = "/tmp/qtest.XXXXXX";
|
||||
static char *image_path;
|
||||
|
||||
/*
|
||||
* The pflash implementation allows some parameters to be unspecified. We want
|
||||
|
@ -608,6 +608,7 @@ static void test_cfi_in_autoselect(const void *opaque)
|
|||
static void cleanup(void *opaque)
|
||||
{
|
||||
unlink(image_path);
|
||||
g_free(image_path);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -635,16 +636,14 @@ static const FlashConfig configuration[] = {
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int fd = mkstemp(image_path);
|
||||
if (fd == -1) {
|
||||
g_printerr("Failed to create temporary file %s: %s\n", image_path,
|
||||
strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
GError *err = NULL;
|
||||
int fd = g_file_open_tmp("qtest.XXXXXX", &image_path, &err);
|
||||
g_assert_no_error(err);
|
||||
|
||||
if (ftruncate(fd, UNIFORM_FLASH_SIZE) < 0) {
|
||||
int error_code = errno;
|
||||
close(fd);
|
||||
unlink(image_path);
|
||||
cleanup(NULL);
|
||||
g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path,
|
||||
UNIFORM_FLASH_SIZE, strerror(error_code));
|
||||
exit(EXIT_FAILURE);
|
||||
|
|
|
@ -159,16 +159,19 @@ static void test_qmp_protocol(void)
|
|||
qtest_quit(qts);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
/* Out-of-band tests */
|
||||
|
||||
char tmpdir[] = "/tmp/qmp-test-XXXXXX";
|
||||
char *tmpdir;
|
||||
char *fifo_name;
|
||||
|
||||
static void setup_blocking_cmd(void)
|
||||
{
|
||||
if (!g_mkdtemp(tmpdir)) {
|
||||
g_error("g_mkdtemp: %s", strerror(errno));
|
||||
}
|
||||
GError *err = NULL;
|
||||
tmpdir = g_dir_make_tmp("qmp-test-XXXXXX", &err);
|
||||
g_assert_no_error(err);
|
||||
|
||||
fifo_name = g_strdup_printf("%s/fifo", tmpdir);
|
||||
if (mkfifo(fifo_name, 0666)) {
|
||||
g_error("mkfifo: %s", strerror(errno));
|
||||
|
@ -179,6 +182,7 @@ static void cleanup_blocking_cmd(void)
|
|||
{
|
||||
unlink(fifo_name);
|
||||
rmdir(tmpdir);
|
||||
g_free(tmpdir);
|
||||
}
|
||||
|
||||
static void send_cmd_that_blocks(QTestState *s, const char *id)
|
||||
|
@ -277,6 +281,8 @@ static void test_qmp_oob(void)
|
|||
qtest_quit(qts);
|
||||
}
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* Preconfig tests */
|
||||
|
||||
static void test_qmp_preconfig(void)
|
||||
|
@ -336,7 +342,10 @@ int main(int argc, char *argv[])
|
|||
g_test_init(&argc, &argv, NULL);
|
||||
|
||||
qtest_add_func("qmp/protocol", test_qmp_protocol);
|
||||
#ifndef _WIN32
|
||||
/* This case calls mkfifo() which does not exist on win32 */
|
||||
qtest_add_func("qmp/oob", test_qmp_oob);
|
||||
#endif
|
||||
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
|
||||
qtest_add_func("qmp/missing-any-arg", test_qmp_missing_any_arg);
|
||||
|
||||
|
|
|
@ -841,7 +841,8 @@ static char *create_listen_socket(int *fd)
|
|||
char *path;
|
||||
|
||||
/* No race because our pid makes the path unique */
|
||||
path = g_strdup_printf("/tmp/qtest-%d-sock.XXXXXX", getpid());
|
||||
path = g_strdup_printf("%s/qtest-%d-sock.XXXXXX",
|
||||
g_get_tmp_dir(), getpid());
|
||||
tmp_fd = mkstemp(path);
|
||||
g_assert_cmpint(tmp_fd, >=, 0);
|
||||
close(tmp_fd);
|
||||
|
|
|
@ -482,8 +482,8 @@ static TestServer *test_server_new(const gchar *name,
|
|||
struct vhost_user_ops *ops)
|
||||
{
|
||||
TestServer *server = g_new0(TestServer, 1);
|
||||
char template[] = "/tmp/vhost-test-XXXXXX";
|
||||
const char *tmpfs;
|
||||
g_autofree const char *tmpfs = NULL;
|
||||
GError *err = NULL;
|
||||
|
||||
server->context = g_main_context_new();
|
||||
server->loop = g_main_loop_new(server->context, FALSE);
|
||||
|
@ -491,9 +491,11 @@ static TestServer *test_server_new(const gchar *name,
|
|||
/* run the main loop thread so the chardev may operate */
|
||||
server->thread = g_thread_new(NULL, thread_function, server->loop);
|
||||
|
||||
tmpfs = g_mkdtemp(template);
|
||||
tmpfs = g_dir_make_tmp("vhost-test-XXXXXX", &err);
|
||||
if (!tmpfs) {
|
||||
g_test_message("g_mkdtemp on path (%s): %s", template, strerror(errno));
|
||||
g_test_message("g_dir_make_tmp on path (%s): %s", tmpfs,
|
||||
err->message);
|
||||
g_error_free(err);
|
||||
}
|
||||
g_assert(tmpfs);
|
||||
|
||||
|
|
|
@ -49,10 +49,10 @@ static void drive_destroy(void *path)
|
|||
static char *drive_create(void)
|
||||
{
|
||||
int fd, ret;
|
||||
char *t_path = g_strdup("/tmp/qtest.XXXXXX");
|
||||
char *t_path;
|
||||
|
||||
/* Create a temporary raw image */
|
||||
fd = mkstemp(t_path);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
|
||||
g_assert_cmpint(fd, >=, 0);
|
||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||
g_assert_cmpint(ret, ==, 0);
|
||||
|
|
|
@ -588,6 +588,7 @@ static void test_hotplug_2_reverse(void)
|
|||
machine_stop(qts);
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
static QDict *migrate_status(QTestState *qts)
|
||||
{
|
||||
QDict *resp, *ret;
|
||||
|
@ -1827,6 +1828,7 @@ static void test_multi_in(gconstpointer opaque)
|
|||
|
||||
machine_stop(qts);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
@ -1857,7 +1859,11 @@ int main(int argc, char **argv)
|
|||
qtest_add_func("failover-virtio-net/hotplug/2_reverse",
|
||||
test_hotplug_2_reverse);
|
||||
|
||||
/* migration tests */
|
||||
#ifndef _WIN32
|
||||
/*
|
||||
* These migration tests cases use the exec migration protocol,
|
||||
* which is unsupported on Windows.
|
||||
*/
|
||||
qtest_add_data_func("failover-virtio-net/migrate/on/out", tmpfile,
|
||||
test_migrate_out);
|
||||
qtest_add_data_func("failover-virtio-net/migrate/on/in", tmpfile,
|
||||
|
@ -1886,6 +1892,7 @@ int main(int argc, char **argv)
|
|||
tmpfile, test_multi_out);
|
||||
qtest_add_data_func("failover-virtio-net/migrate/multi/in",
|
||||
tmpfile, test_multi_in);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
ret = g_test_run();
|
||||
|
||||
|
|
|
@ -165,8 +165,6 @@ static void stop_cont_test(void *obj, void *data, QGuestAllocator *t_alloc)
|
|||
rx_stop_cont_test(dev, t_alloc, rx, sv[0]);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void hotplug(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||
{
|
||||
QVirtioPCIDevice *dev = obj;
|
||||
|
@ -286,6 +284,8 @@ static void *virtio_net_test_setup(GString *cmd_line, void *arg)
|
|||
return sv;
|
||||
}
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
static void large_tx(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||
{
|
||||
QVirtioNet *dev = obj;
|
||||
|
@ -319,16 +319,15 @@ static void *virtio_net_test_setup_nosocket(GString *cmd_line, void *arg)
|
|||
|
||||
static void register_virtio_net_test(void)
|
||||
{
|
||||
QOSGraphTestOptions opts = {
|
||||
.before = virtio_net_test_setup,
|
||||
};
|
||||
QOSGraphTestOptions opts = { 0 };
|
||||
|
||||
qos_add_test("hotplug", "virtio-net-pci", hotplug, &opts);
|
||||
#ifndef _WIN32
|
||||
opts.before = virtio_net_test_setup;
|
||||
qos_add_test("hotplug", "virtio-net-pci", hotplug, &opts);
|
||||
qos_add_test("basic", "virtio-net", send_recv_test, &opts);
|
||||
qos_add_test("rx_stop_cont", "virtio-net", stop_cont_test, &opts);
|
||||
#endif
|
||||
qos_add_test("announce-self", "virtio-net", announce_self, &opts);
|
||||
#endif
|
||||
|
||||
/* These tests do not need a loopback backend. */
|
||||
opts.before = virtio_net_test_setup_nosocket;
|
||||
|
|
|
@ -268,7 +268,7 @@ static void test_iothread_attach_node(void *obj, void *data,
|
|||
QVirtioSCSIPCI *scsi_pci = obj;
|
||||
QVirtioSCSI *scsi = &scsi_pci->scsi;
|
||||
QVirtioSCSIQueues *vs;
|
||||
char tmp_path[] = "/tmp/qtest.XXXXXX";
|
||||
g_autofree char *tmp_path = NULL;
|
||||
int fd;
|
||||
int ret;
|
||||
|
||||
|
@ -282,7 +282,7 @@ static void test_iothread_attach_node(void *obj, void *data,
|
|||
vs = qvirtio_scsi_init(scsi->vdev);
|
||||
|
||||
/* Create a temporary qcow2 overlay*/
|
||||
fd = mkstemp(tmp_path);
|
||||
fd = g_file_open_tmp("qtest.XXXXXX", &tmp_path, NULL);
|
||||
g_assert(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
|
|
|
@ -76,10 +76,10 @@ static void check_locked_bytes(int fd, uint64_t perm_locks,
|
|||
static void test_image_locking_basic(void)
|
||||
{
|
||||
BlockBackend *blk1, *blk2, *blk3;
|
||||
char img_path[] = "/tmp/qtest.XXXXXX";
|
||||
g_autofree char *img_path = NULL;
|
||||
uint64_t perm, shared_perm;
|
||||
|
||||
int fd = mkstemp(img_path);
|
||||
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
||||
assert(fd >= 0);
|
||||
|
||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
||||
|
@ -117,10 +117,10 @@ static void test_image_locking_basic(void)
|
|||
static void test_set_perm_abort(void)
|
||||
{
|
||||
BlockBackend *blk1, *blk2;
|
||||
char img_path[] = "/tmp/qtest.XXXXXX";
|
||||
g_autofree char *img_path = NULL;
|
||||
uint64_t perm, shared_perm;
|
||||
int r;
|
||||
int fd = mkstemp(img_path);
|
||||
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
||||
assert(fd >= 0);
|
||||
|
||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
||||
|
|
|
@ -60,7 +60,7 @@ fixture_setup(TestFixture *fixture, gconstpointer data, gchar **envp)
|
|||
|
||||
fixture->loop = g_main_loop_new(NULL, FALSE);
|
||||
|
||||
fixture->test_dir = g_strdup("/tmp/qgatest.XXXXXX");
|
||||
fixture->test_dir = g_strdup_printf("%s/qgatest.XXXXXX", g_get_tmp_dir());
|
||||
g_assert_nonnull(g_mkdtemp(fixture->test_dir));
|
||||
|
||||
path = g_build_filename(fixture->test_dir, "sock", NULL);
|
||||
|
|
|
@ -631,7 +631,6 @@ static void *notifier_thread(void *arg)
|
|||
static void
|
||||
vubr_host_notifier_setup(VubrDev *dev)
|
||||
{
|
||||
char template[] = "/tmp/vubr-XXXXXX";
|
||||
pthread_t thread;
|
||||
size_t length;
|
||||
void *addr;
|
||||
|
@ -639,7 +638,7 @@ vubr_host_notifier_setup(VubrDev *dev)
|
|||
|
||||
length = qemu_real_host_page_size() * VHOST_USER_BRIDGE_MAX_QUEUES;
|
||||
|
||||
fd = mkstemp(template);
|
||||
fd = g_file_open_tmp("vubr-XXXXXX", NULL, NULL);
|
||||
if (fd < 0) {
|
||||
vubr_die("mkstemp()");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue