From: Peter Krempa Date: Tue, 14 Aug 2018 12:17:52 +0000 (+0200) Subject: qemu: command: Extract opening of TPM backend FDs for mocking purposes X-Git-Tag: v4.7.0-rc1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09e45e8a9be2f004242452f23180d580700142d8;p=thirdparty%2Flibvirt.git 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 --- 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__*/