Rather than passing passwords and cookies (which could contain
passwords) to nbdkit via commandline arguments, use the alternate format
that nbdkit supports where we can specify a file descriptor which nbdkit
will read to get the password or cookies.
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
build-aux/syntax-check.mk | 4 +-
src/qemu/qemu_nbdkit.c | 64 ++++++++++++-----
src/util/vircommand.c | 3 +-
src/util/virutil.h | 2 +-
.../disk-cdrom-network.args.disk0 | 7 ++
.../disk-cdrom-network.args.disk1 | 9 +++
.../disk-cdrom-network.args.disk1.pipe.1778 | 1 +
.../disk-cdrom-network.args.disk2 | 9 +++
.../disk-cdrom-network.args.disk2.pipe.1780 | 1 +
.../disk-network-http.args.disk0 | 7 ++
.../disk-network-http.args.disk1 | 6 ++
.../disk-network-http.args.disk2 | 7 ++
.../disk-network-http.args.disk2.pipe.1778 | 1 +
.../disk-network-http.args.disk3 | 8 +++
.../disk-network-http.args.disk3.pipe.1780 | 1 +
...work-source-curl-nbdkit-backing.args.disk0 | 8 +++
...e-curl-nbdkit-backing.args.disk0.pipe.1778 | 1 +
.../disk-network-source-curl.args.disk0 | 8 +++
...k-network-source-curl.args.disk0.pipe.1778 | 1 +
.../disk-network-source-curl.args.disk1 | 8 +++
...k-network-source-curl.args.disk1.pipe.1780 | 1 +
.../disk-network-source-curl.args.disk2 | 8 +++
...k-network-source-curl.args.disk2.pipe.1782 | 1 +
.../disk-network-source-curl.args.disk3 | 7 ++
.../disk-network-source-curl.args.disk4 | 7 ++
tests/qemunbdkittest.c | 69 +++++++++++++++++--
26 files changed, 219 insertions(+), 30 deletions(-)
create mode 100644 tests/qemunbdkitdata/disk-cdrom-network.args.disk0
create mode 100644 tests/qemunbdkitdata/disk-cdrom-network.args.disk1
create mode 100644 tests/qemunbdkitdata/disk-cdrom-network.args.disk1.pipe.1778
create mode 100644 tests/qemunbdkitdata/disk-cdrom-network.args.disk2
create mode 100644 tests/qemunbdkitdata/disk-cdrom-network.args.disk2.pipe.1780
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk0
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk1
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk2
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk2.pipe.1778
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk3
create mode 100644 tests/qemunbdkitdata/disk-network-http.args.disk3.pipe.1780
create mode 100644
tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0
create mode 100644
tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0.pipe.1778
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk0
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk0.pipe.1778
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk1
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk1.pipe.1780
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk2
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk2.pipe.1782
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk3
create mode 100644 tests/qemunbdkitdata/disk-network-source-curl.args.disk4
diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index 68cd9dff5f..d44b1e5b17 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -1355,10 +1355,10 @@ exclude_file_name_regexp--sc_prohibit_strdup = \
^(docs/|examples/|tests/virnetserverclientmock.c|tests/commandhelper.c|tools/nss/libvirt_nss_(leases|macs)\.c$$)
exclude_file_name_regexp--sc_prohibit_close = \
-
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
+
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c|qemunbdkittest\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
-
(^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
+
(^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest|qemunbdkit)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
(^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$)
diff --git a/src/qemu/qemu_nbdkit.c b/src/qemu/qemu_nbdkit.c
index 882a074211..0a0dc5d2a4 100644
--- a/src/qemu/qemu_nbdkit.c
+++ b/src/qemu/qemu_nbdkit.c
@@ -55,6 +55,7 @@ VIR_ENUM_IMPL(qemuNbdkitCaps,
"filter-readahead", /* QEMU_NBDKIT_CAPS_FILTER_READAHEAD */
);
+
struct _qemuNbdkitCaps {
GObject parent;
@@ -71,6 +72,12 @@ struct _qemuNbdkitCaps {
G_DEFINE_TYPE(qemuNbdkitCaps, qemu_nbdkit_caps, G_TYPE_OBJECT);
+enum {
+ PIPE_FD_READ = 0,
+ PIPE_FD_WRITE = 1
+};
+
+
static void
qemuNbdkitCheckCommandCap(qemuNbdkitCaps *nbdkit,
virCommand *cmd,
@@ -729,6 +736,29 @@ qemuNbdkitStopStorageSource(virStorageSource *src)
}
+static int
+qemuNbdkitCommandPassDataByPipe(virCommand *cmd,
+ const char *argName,
+ unsigned char *buf,
+ size_t buflen)
+{
+ g_autofree char *fdfmt = NULL;
+ int fd = virCommandSetSendBuffer(cmd, buf, buflen);
+
+ if (fd < 0)
+ return -1;
+
+ /* some nbdkit arguments accept a variation where nbdkit will read the data
+ * from a file descriptor, e.g. password=-FD */
+ fdfmt = g_strdup_printf("-%i", fd);
+ virCommandAddArgPair(cmd, argName, fdfmt);
+
+ virCommandDoAsyncIO(cmd);
+
+ return 0;
+}
+
+
static int
qemuNbdkitProcessBuildCommandCurl(qemuNbdkitProcess *proc,
virCommand *cmd)
@@ -744,10 +774,10 @@ qemuNbdkitProcessBuildCommandCurl(qemuNbdkitProcess *proc,
if (proc->source->auth) {
g_autoptr(virConnect) conn = virGetConnectSecret();
- g_autofree uint8_t *secret = NULL;
+ uint8_t *secret = NULL;
size_t secretlen = 0;
- g_autofree char *password = NULL;
int secrettype;
+ virStorageAuthDef *authdef = proc->source->auth;
virCommandAddArgPair(cmd, "user",
proc->source->auth->username);
@@ -760,7 +790,7 @@ qemuNbdkitProcessBuildCommandCurl(qemuNbdkitProcess *proc,
}
if (virSecretGetSecretString(conn,
- &proc->source->auth->seclookupdef,
+ &authdef->seclookupdef,
secrettype,
&secret,
&secretlen) < 0) {
@@ -769,24 +799,20 @@ qemuNbdkitProcessBuildCommandCurl(qemuNbdkitProcess *proc,
return -1;
}
- /* ensure that the secret is a NULL-terminated string */
- password = g_strndup((char*)secret, secretlen);
-
- /* for now, just report an error rather than passing the password in
- * cleartext on the commandline */
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s",
- "Password not yet supported for nbdkit sources");
- return -1;
+ if (qemuNbdkitCommandPassDataByPipe(cmd, "password",
+ secret, secretlen) < 0)
+ return -1;
}
- if (proc->source->ncookies > 0) {
- /* for now, just report an error rather than passing cookies in
- * cleartext on the commandline */
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s",
- "Cookies not yet supported for nbdkit sources");
- return -1;
+ /* Create a pipe to send the cookies to the nbdkit process. */
+ if (proc->source->ncookies) {
+ char *cookies =
+ qemuBlockStorageSourceGetCookieString(proc->source);
+
+ if (qemuNbdkitCommandPassDataByPipe(cmd, "cookie",
+ (unsigned char*)cookies,
+ strlen(cookies)) < 0)
+ return -1;
}
if (proc->source->sslverify == VIR_TRISTATE_BOOL_NO) {
diff --git a/src/util/vircommand.c b/src/util/vircommand.c
index 014bab9196..838eb6bd16 100644
--- a/src/util/vircommand.c
+++ b/src/util/vircommand.c
@@ -1703,7 +1703,8 @@ virCommandSetSendBuffer(virCommand *cmd,
return -1;
}
- if (fcntl(pipefd[1], F_SETFL, O_NONBLOCK) < 0) {
+ if (!(dryRunBuffer || dryRunCallback) &&
+ fcntl(pipefd[1], F_SETFL, O_NONBLOCK) < 0) {
cmd->has_error = errno;
VIR_FORCE_CLOSE(pipefd[0]);
VIR_FORCE_CLOSE(pipefd[1]);
diff --git a/src/util/virutil.h b/src/util/virutil.h
index ab8511bf8d..094b399859 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -186,7 +186,7 @@ char *virGetPassword(void);
*
* Returns: -1 on error, 0 on success
*/
-int virPipe(int fds[2]);
+int virPipe(int fds[2]) G_NO_INLINE;
/*
* virPipeQuiet:
diff --git a/tests/qemunbdkitdata/disk-cdrom-network.args.disk0
b/tests/qemunbdkitdata/disk-cdrom-network.args.disk0
new file mode 100644
index 0000000000..5f3a795ba0
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-cdrom-network.args.disk0
@@ -0,0 +1,7 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-0/nbdkit-test-disk-0.socket \
+--foreground \
+--readonly curl \
+protocols=ftp \
+url=ftp://host.name:21/url/path/file.iso
diff --git a/tests/qemunbdkitdata/disk-cdrom-network.args.disk1
b/tests/qemunbdkitdata/disk-cdrom-network.args.disk1
new file mode 100644
index 0000000000..12c0dcaf0e
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-cdrom-network.args.disk1
@@ -0,0 +1,9 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-1/nbdkit-test-disk-1.socket \
+--foreground \
+--readonly curl \
+protocols=ftps \
+url=ftps://host.name:990/url/path/file.iso \
+user=testuser \
+password=-1777
diff --git a/tests/qemunbdkitdata/disk-cdrom-network.args.disk1.pipe.1778
b/tests/qemunbdkitdata/disk-cdrom-network.args.disk1.pipe.1778
new file mode 100644
index 0000000000..ccdd4033fc
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-cdrom-network.args.disk1.pipe.1778
@@ -0,0 +1 @@
+iscsi-mycluster_myname-secret
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-cdrom-network.args.disk2
b/tests/qemunbdkitdata/disk-cdrom-network.args.disk2
new file mode 100644
index 0000000000..d41337a089
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-cdrom-network.args.disk2
@@ -0,0 +1,9 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-2/nbdkit-test-disk-2.socket \
+--foreground \
+--readonly curl \
+protocols=https \
+'url=https://host.name:443/url/path/file.iso?test=val' \
+user=testuser \
+password=-1779
diff --git a/tests/qemunbdkitdata/disk-cdrom-network.args.disk2.pipe.1780
b/tests/qemunbdkitdata/disk-cdrom-network.args.disk2.pipe.1780
new file mode 100644
index 0000000000..ccdd4033fc
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-cdrom-network.args.disk2.pipe.1780
@@ -0,0 +1 @@
+iscsi-mycluster_myname-secret
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk0
b/tests/qemunbdkitdata/disk-network-http.args.disk0
new file mode 100644
index 0000000000..fa8ef90cd1
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk0
@@ -0,0 +1,7 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-0/nbdkit-test-disk-0.socket \
+--foreground curl \
+protocols=http \
+url=http://example.org:80/test.img \
+timeout=1234
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk1
b/tests/qemunbdkitdata/disk-network-http.args.disk1
new file mode 100644
index 0000000000..9bac3fe229
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk1
@@ -0,0 +1,6 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-1/nbdkit-test-disk-1.socket \
+--foreground curl \
+protocols=https \
+url=https://example.org:443/test2.img
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk2
b/tests/qemunbdkitdata/disk-network-http.args.disk2
new file mode 100644
index 0000000000..2d39b6c259
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk2
@@ -0,0 +1,7 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-2/nbdkit-test-disk-2.socket \
+--foreground curl \
+protocols=http \
+url=http://example.org:1234/test3.img \
+cookie=-1777
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk2.pipe.1778
b/tests/qemunbdkitdata/disk-network-http.args.disk2.pipe.1778
new file mode 100644
index 0000000000..2c42c95930
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk2.pipe.1778
@@ -0,0 +1 @@
+test=testcookievalue; test2="blurb"
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk3
b/tests/qemunbdkitdata/disk-network-http.args.disk3
new file mode 100644
index 0000000000..54f12f5c9e
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk3
@@ -0,0 +1,8 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-3/nbdkit-test-disk-3.socket \
+--foreground curl \
+protocols=https \
+'url=https://example.org:1234/test4.img?par=val&other=ble' \
+cookie=-1779 \
+sslverify=false
diff --git a/tests/qemunbdkitdata/disk-network-http.args.disk3.pipe.1780
b/tests/qemunbdkitdata/disk-network-http.args.disk3.pipe.1780
new file mode 100644
index 0000000000..2c42c95930
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-http.args.disk3.pipe.1780
@@ -0,0 +1 @@
+test=testcookievalue; test2="blurb"
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0
b/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0
new file mode 100644
index 0000000000..eb479b996f
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0
@@ -0,0 +1,8 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-0/nbdkit-test-disk-0.socket \
+--foreground \
+--readonly curl \
+protocols=https \
+url=https://https.example.org:8443/path/to/disk1.qcow2 \
+cookie=-1777
diff --git
a/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0.pipe.1778
b/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0.pipe.1778
new file mode 100644
index 0000000000..20af4ae383
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl-nbdkit-backing.args.disk0.pipe.1778
@@ -0,0 +1 @@
+cookie1=cookievalue1; cookie2=cookievalue2
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk0
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk0
new file mode 100644
index 0000000000..cf2c0b7184
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk0
@@ -0,0 +1,8 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-0/nbdkit-test-disk-0.socket \
+--foreground \
+--readonly curl \
+protocols=https \
+url=https://https.example.org:8443/path/to/disk1.iso \
+cookie=-1777
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk0.pipe.1778
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk0.pipe.1778
new file mode 100644
index 0000000000..20af4ae383
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk0.pipe.1778
@@ -0,0 +1 @@
+cookie1=cookievalue1; cookie2=cookievalue2
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk1
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk1
new file mode 100644
index 0000000000..13f03c545e
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk1
@@ -0,0 +1,8 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-1/nbdkit-test-disk-1.socket \
+--foreground curl \
+protocols=https \
+'url=https://https.example.org:8443/path/to/disk5.iso?foo=bar' \
+cookie=-1779 \
+sslverify=false
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk1.pipe.1780
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk1.pipe.1780
new file mode 100644
index 0000000000..20af4ae383
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk1.pipe.1780
@@ -0,0 +1 @@
+cookie1=cookievalue1; cookie2=cookievalue2
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk2
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk2
new file mode 100644
index 0000000000..490aea3393
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk2
@@ -0,0 +1,8 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-2/nbdkit-test-disk-2.socket \
+--foreground \
+--readonly curl \
+protocols=http \
+url=http://http.example.org:8080/path/to/disk2.iso \
+cookie=-1781
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk2.pipe.1782
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk2.pipe.1782
new file mode 100644
index 0000000000..5c035e84c5
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk2.pipe.1782
@@ -0,0 +1 @@
+cookie1=cookievalue1; cookie2=cookievalue2; cookie3=cookievalue3
\ No newline at end of file
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk3
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk3
new file mode 100644
index 0000000000..bc28f04564
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk3
@@ -0,0 +1,7 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-3/nbdkit-test-disk-3.socket \
+--foreground \
+--readonly curl \
+protocols=ftp \
+url=ftp://ftp.example.org:20/path/to/disk3.iso
diff --git a/tests/qemunbdkitdata/disk-network-source-curl.args.disk4
b/tests/qemunbdkitdata/disk-network-source-curl.args.disk4
new file mode 100644
index 0000000000..7c3cc711ae
--- /dev/null
+++ b/tests/qemunbdkitdata/disk-network-source-curl.args.disk4
@@ -0,0 +1,7 @@
+nbdkit \
+--exit-with-parent \
+--unix /tmp/statedir-4/nbdkit-test-disk-4.socket \
+--foreground \
+--readonly curl \
+protocols=ftps \
+url=ftps://ftps.example.org:22/path/to/disk4.iso
diff --git a/tests/qemunbdkittest.c b/tests/qemunbdkittest.c
index c7fa80b9c5..49888ab8a1 100644
--- a/tests/qemunbdkittest.c
+++ b/tests/qemunbdkittest.c
@@ -1,5 +1,6 @@
#include <config.h>
+#include <fcntl.h>
#include "internal.h"
#include "testutils.h"
#include "testutilsqemu.h"
@@ -13,6 +14,7 @@
#include "virutil.h"
#include "virsecret.h"
#include "datatypes.h"
+#include "virmock.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -20,6 +22,45 @@ static virQEMUDriver driver;
/* Some mock implementations for testing */
+#define PIPE_FD_START 1777
+static int mockpipefd = PIPE_FD_START;
+int
+virPipeQuiet(int fds[2])
+{
+ fds[0] = mockpipefd++;
+ fds[1] = mockpipefd++;
+
+ if (fcntl(fds[0], F_GETFD) != -1 ||
+ fcntl(fds[1], F_GETFD) != -1)
+ abort();
+
+ return 0;
+}
+
+static int (*real_close)(int fd);
+static void
+init_syms(void)
+{
+ VIR_MOCK_REAL_INIT(close);
+}
+
+int
+close(int fd)
+{
+ int ret;
+
+ init_syms();
+
+ if (fd >= PIPE_FD_START)
+ ret = 0;
+ else
+ ret = real_close(fd);
+
+ return ret;
+}
+
+
+
int
virSecretGetSecretString(virConnectPtr conn G_GNUC_UNUSED,
virSecretLookupTypeDef *seclookupdef,
@@ -129,6 +170,9 @@ testNbdkit(const void *data)
size_t i;
int ret = 0;
+ /* restart mock pipe fds so tests are consistent */
+ mockpipefd = PIPE_FD_START;
+
if (!virFileExists(info->infile)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"Test input file '%s' is missing",
info->infile);
@@ -154,6 +198,9 @@ testNbdkit(const void *data)
g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
const char *actualCmdline = NULL;
+ virCommandSendBuffer *sendbuffers;
+ int nsendbuffers;
+ size_t j;
virCommandSetDryRun(dryRunToken, &buf, true, true, NULL, NULL);
cmd = qemuNbdkitProcessBuildCommand(srcPriv->nbdkitProcess);
@@ -162,15 +209,24 @@ testNbdkit(const void *data)
ret = -1;
continue;
}
+ virCommandPeekSendBuffers(cmd, &sendbuffers, &nsendbuffers);
if (!(actualCmdline = virBufferContentAndReset(&buf))) {
ret = -1;
continue;
}
- if (virTestCompareToFileFull(actualCmdline, cmdfile, false) < 0) {
+ if (virTestCompareToFileFull(actualCmdline, cmdfile, false) < 0)
ret = -1;
- continue;
+
+ for (j = 0; j < nsendbuffers; j++) {
+ virCommandSendBuffer *buffer = &sendbuffers[j];
+ g_autofree char *pipefile = g_strdup_printf("%s.pipe.%i",
+ cmdfile,
+ buffer->fd);
+
+ if (virTestCompareToFile((const char*)buffer->buffer, pipefile) <
0)
+ ret = -1;
}
} else {
if (virFileExists(cmdfile)) {
@@ -224,11 +280,10 @@ mymain(void)
#define DO_TEST_NOCAPS(_name) \
DO_TEST_FULL(_name, NBDKIT_ARG_END)
- /* disks with cookies / passwords are not yet supported */
- DO_TEST_FAILURE("disk-cdrom-network", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
- DO_TEST_FAILURE("disk-network-http", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
- DO_TEST_FAILURE("disk-network-source-curl-nbdkit-backing",
QEMU_NBDKIT_CAPS_PLUGIN_CURL);
- DO_TEST_FAILURE("disk-network-source-curl", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
+ DO_TEST("disk-cdrom-network", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
+ DO_TEST("disk-network-http", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
+ DO_TEST("disk-network-source-curl-nbdkit-backing",
QEMU_NBDKIT_CAPS_PLUGIN_CURL);
+ DO_TEST("disk-network-source-curl", QEMU_NBDKIT_CAPS_PLUGIN_CURL);
DO_TEST("disk-network-ssh", QEMU_NBDKIT_CAPS_PLUGIN_SSH);
qemuTestDriverFree(&driver);
--
2.37.3