From 09e45e8a9be2f004242452f23180d580700142d8 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 14 Aug 2018 14:17:52 +0200 Subject: [PATCH] qemu: command: Extract opening of TPM backend FDs for mocking purposes Allow mocking of the file descriptor numbers used for the TPM passthrough mode by extracting the relevant code into an exported function. Signed-off-by: Peter Krempa Reviewed-by: John Ferlan --- src/qemu/qemu_command.c | 45 +++++++++++++++++++++++++---------------- src/qemu/qemu_command.h | 9 +++++++++ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 88d698e262..5bbc43be43 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9688,6 +9688,31 @@ qemuBuildTPMDevStr(const virDomainDef *def, } +/* this function is exported so that tests can mock the FDs */ +int +qemuBuildTPMOpenBackendFDs(const char *tpmdev, + const char *cancel_path, + int *tpmfd, + int *cancelfd) +{ + if ((*tpmfd = open(tpmdev, O_RDWR)) < 0) { + virReportSystemError(errno, _("Could not open TPM device %s"), + tpmdev); + return -1; + } + + if ((*cancelfd = open(cancel_path, O_WRONLY)) < 0) { + virReportSystemError(errno, + _("Could not open TPM device's cancel " + "path %s"), cancel_path); + VIR_FORCE_CLOSE(*tpmfd); + return -1; + } + + return 0; +} + + static char * qemuBuildTPMBackendStr(const virDomainDef *def, virCommandPtr cmd, @@ -9726,30 +9751,16 @@ qemuBuildTPMBackendStr(const virDomainDef *def, goto error; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ADD_FD)) { - *tpmfd = open(tpmdev, O_RDWR); - if (*tpmfd < 0) { - virReportSystemError(errno, _("Could not open TPM device %s"), - tpmdev); + if (qemuBuildTPMOpenBackendFDs(tpmdev, cancel_path, tpmfd, cancelfd) < 0) goto error; - } - virCommandPassFD(cmd, *tpmfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT); + virCommandPassFD(cmd, *tpmfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + virCommandPassFD(cmd, *cancelfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); devset = qemuVirCommandGetDevSet(cmd, *tpmfd); if (devset == NULL) goto error; - *cancelfd = open(cancel_path, O_WRONLY); - if (*cancelfd < 0) { - virReportSystemError(errno, - _("Could not open TPM device's cancel " - "path %s"), cancel_path); - goto error; - } VIR_FREE(cancel_path); - - virCommandPassFD(cmd, *cancelfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT); cancel_path = qemuVirCommandGetDevSet(cmd, *cancelfd); if (cancel_path == NULL) goto error; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 13c5508ae8..98d4ac90b5 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -219,4 +219,13 @@ qemuBuildVsockDevStr(virDomainDefPtr def, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); +/* this function is exported so that tests can mock the FDs */ +int +qemuBuildTPMOpenBackendFDs(const char *tpmdev, + const char *cancel_path, + int *tpmfd, + int *cancelfd) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) + ATTRIBUTE_NONNULL(4); + #endif /* __QEMU_COMMAND_H__*/ -- GitLab