[libvirt] [PATCH 0/4] Fix problems in test suite on Win32

Since we enable the test suite by default now for all git checkouts, we need to make sure it actually builds on Win32. This series fixes it

From: "Daniel P. Berrange" <berrange@redhat.com> A handful of places used %zd for format specifiers even though the args was size_t, not ssize_t. * src/remote/remote_driver.c, src/util/xml.c: s/%zd/%zu/ Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/remote/remote_driver.c | 6 +++--- src/util/xml.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 8df690b..30ca6a5 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1839,7 +1839,7 @@ remoteDomainGetSecurityLabel (virDomainPtr domain, virSecurityLabelPtr seclabel) if (ret.label.label_val != NULL) { if (strlen (ret.label.label_val) >= sizeof seclabel->label) { - remoteError(VIR_ERR_RPC, _("security label exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security label exceeds maximum: %zu"), sizeof seclabel->label - 1); goto cleanup; } @@ -1910,7 +1910,7 @@ remoteNodeGetSecurityModel (virConnectPtr conn, virSecurityModelPtr secmodel) if (ret.model.model_val != NULL) { if (strlen (ret.model.model_val) >= sizeof secmodel->model) { - remoteError(VIR_ERR_RPC, _("security model exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security model exceeds maximum: %zu"), sizeof secmodel->model - 1); goto cleanup; } @@ -1919,7 +1919,7 @@ remoteNodeGetSecurityModel (virConnectPtr conn, virSecurityModelPtr secmodel) if (ret.doi.doi_val != NULL) { if (strlen (ret.doi.doi_val) >= sizeof secmodel->doi) { - remoteError(VIR_ERR_RPC, _("security doi exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security doi exceeds maximum: %zu"), sizeof secmodel->doi - 1); goto cleanup; } diff --git a/src/util/xml.c b/src/util/xml.c index 1e0a48a..79a9d27 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -107,7 +107,7 @@ virXPathStringLimit(const char *xpath, if (tmp != NULL && strlen(tmp) >= maxlen) { virXMLError(VIR_ERR_INTERNAL_ERROR, - _("\'%s\' value longer than %zd bytes"), + _("\'%s\' value longer than %zu bytes"), xpath, maxlen); VIR_FREE(tmp); return NULL; -- 1.7.7.6

On 03/29/2012 05:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
A handful of places used %zd for format specifiers even though the args was size_t, not ssize_t.
* src/remote/remote_driver.c, src/util/xml.c: s/%zd/%zu/
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/remote/remote_driver.c | 6 +++--- src/util/xml.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
ACK
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 8df690b..30ca6a5 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1839,7 +1839,7 @@ remoteDomainGetSecurityLabel (virDomainPtr domain, virSecurityLabelPtr seclabel)
if (ret.label.label_val != NULL) { if (strlen (ret.label.label_val) >= sizeof seclabel->label) { - remoteError(VIR_ERR_RPC, _("security label exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security label exceeds maximum: %zu"), sizeof seclabel->label - 1); goto cleanup; } @@ -1910,7 +1910,7 @@ remoteNodeGetSecurityModel (virConnectPtr conn, virSecurityModelPtr secmodel)
if (ret.model.model_val != NULL) { if (strlen (ret.model.model_val) >= sizeof secmodel->model) { - remoteError(VIR_ERR_RPC, _("security model exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security model exceeds maximum: %zu"), sizeof secmodel->model - 1); goto cleanup; } @@ -1919,7 +1919,7 @@ remoteNodeGetSecurityModel (virConnectPtr conn, virSecurityModelPtr secmodel)
if (ret.doi.doi_val != NULL) { if (strlen (ret.doi.doi_val) >= sizeof secmodel->doi) { - remoteError(VIR_ERR_RPC, _("security doi exceeds maximum: %zd"), + remoteError(VIR_ERR_RPC, _("security doi exceeds maximum: %zu"), sizeof secmodel->doi - 1); goto cleanup; } diff --git a/src/util/xml.c b/src/util/xml.c index 1e0a48a..79a9d27 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -107,7 +107,7 @@ virXPathStringLimit(const char *xpath,
if (tmp != NULL && strlen(tmp) >= maxlen) { virXMLError(VIR_ERR_INTERNAL_ERROR, - _("\'%s\' value longer than %zd bytes"), + _("\'%s\' value longer than %zu bytes"), xpath, maxlen); VIR_FREE(tmp); return NULL;

From: "Daniel P. Berrange" <berrange@redhat.com> Some of the test suites use fprintf with format specifiers that are not supported on Win32 and are not fixed by gnulib. The mingw32 compiler also has trouble detecting ssize_t correctly, complaining that 'ssize_t' does not match 'signed size_t' (which it expects for %zd). Force the cast to size_t to avoid this problem * tests/testutils.c, tests/testutils.h: Fix printf annotation on virTestResult. Use virVasprintf instead of vfprintf * tests/virhashtest.c: Use VIR_WARN instead of fprintf(stderr). Cast to size_t to avoid mingw32 compiler bug Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/testutils.c | 8 ++++++-- tests/testutils.h | 3 ++- tests/virhashtest.c | 24 +++++++++++++++--------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/tests/testutils.c b/tests/testutils.c index 4b224ee..4e8484f 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -72,7 +72,7 @@ virtTestCountAverage(double *items, int nitems) return (double) (sum / nitems); } -ATTRIBUTE_FMT_PRINTF(3,4) + void virtTestResult(const char *name, int ret, const char *msg, ...) { va_list vargs; @@ -89,7 +89,11 @@ void virtTestResult(const char *name, int ret, const char *msg, ...) else { fprintf(stderr, "FAILED\n"); if (msg) { - vfprintf(stderr, msg, vargs); + char *str; + if (virVasprintf(&str, msg, vargs) == 0) { + fprintf(stderr, "%s", str); + VIR_FREE(str); + } } } } else { diff --git a/tests/testutils.h b/tests/testutils.h index 2fde1b5..f8c7567 100644 --- a/tests/testutils.h +++ b/tests/testutils.h @@ -23,7 +23,8 @@ extern char *abs_srcdir; double virtTestCountAverage(double *items, int nitems); -void virtTestResult(const char *name, int ret, const char *msg, ...); +void virtTestResult(const char *name, int ret, const char *msg, ...) + ATTRIBUTE_FMT_PRINTF(3,4); int virtTestRun(const char *title, int nloops, int (*body)(const void *data), diff --git a/tests/virhashtest.c b/tests/virhashtest.c index ba0cf02..be82281 100644 --- a/tests/virhashtest.c +++ b/tests/virhashtest.c @@ -10,11 +10,17 @@ #include "virhashdata.h" #include "testutils.h" #include "memory.h" +#include "util.h" +#include "logging.h" #define testError(...) \ do { \ - fprintf(stderr, __VA_ARGS__); \ + char *str; \ + if (virAsprintf(&str, __VA_ARGS__) == 0) { \ + fprintf(stderr, "%s", str); \ + VIR_FREE(str); \ + } \ /* Pad to line up with test name ... in virTestRun */ \ fprintf(stderr, "%74s", "... "); \ } while (0) @@ -40,16 +46,16 @@ testHashInit(int size) } if (virHashTableSize(hash) != oldsize && virTestGetDebug()) { - fprintf(stderr, "\nhash grown from %zd to %zd", - oldsize, virHashTableSize(hash)); + VIR_WARN("hash grown from %zd to %zd", + (size_t)oldsize, (size_t)virHashTableSize(hash)); } } for (i = 0; i < ARRAY_CARDINALITY(uuids); i++) { if (!virHashLookup(hash, uuids[i])) { if (virTestGetVerbose()) { - fprintf(stderr, "\nentry \"%s\" could not be found\n", - uuids[i]); + VIR_WARN("\nentry \"%s\" could not be found\n", + uuids[i]); } virHashFree(hash); return NULL; @@ -75,15 +81,15 @@ testHashCheckCount(virHashTablePtr hash, size_t count) ssize_t iter_count = 0; if (virHashSize(hash) != count) { - testError("\nhash contains %zd instead of %zu elements\n", - virHashSize(hash), count); + testError("\nhash contains %zu instead of %zu elements\n", + (size_t)virHashSize(hash), count); return -1; } iter_count = virHashForEach(hash, testHashCheckForEachCount, NULL); if (count != iter_count) { - testError("\nhash claims to have %zu elements but iteration finds %zd\n", - count, iter_count); + testError("\nhash claims to have %zu elements but iteration finds %zu\n", + count, (size_t)iter_count); return -1; } -- 1.7.7.6

On 03/29/2012 05:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Some of the test suites use fprintf with format specifiers that are not supported on Win32 and are not fixed by gnulib.
The mingw32 compiler also has trouble detecting ssize_t correctly, complaining that 'ssize_t' does not match 'signed size_t' (which it expects for %zd). Force the cast to size_t to avoid this problem
* tests/testutils.c, tests/testutils.h: Fix printf annotation on virTestResult. Use virVasprintf instead of vfprintf * tests/virhashtest.c: Use VIR_WARN instead of fprintf(stderr). Cast to size_t to avoid mingw32 compiler bug
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/testutils.c | 8 ++++++-- tests/testutils.h | 3 ++- tests/virhashtest.c | 24 +++++++++++++++--------- 3 files changed, 23 insertions(+), 12 deletions(-)
ACK

On 03/29/2012 03:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Some of the test suites use fprintf with format specifiers that are not supported on Win32 and are not fixed by gnulib.
The mingw32 compiler also has trouble detecting ssize_t correctly, complaining that 'ssize_t' does not match 'signed size_t' (which it expects for %zd). Force the cast to size_t to avoid this problem
Nothing wrong with your libvirt patch, but I can't help wonder if this is a bug in the gnulib replacement headers, where mingw lacks ssize_t but gnulib defines it to the wrong type in comparison to size_t (that is, since mingw64 has sizeof(size_t)==4, it is not obvious whether size_t is 'unsigned long' or 'unsigned int', and if gnulib picked 'int' for ssize_t but size_t is 'unsigned long', that would explain the compiler warnings. Gnulib may need to be tweaked to help work around this mingw situation. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Thu, Mar 29, 2012 at 06:45:03AM -0600, Eric Blake wrote:
On 03/29/2012 03:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Some of the test suites use fprintf with format specifiers that are not supported on Win32 and are not fixed by gnulib.
The mingw32 compiler also has trouble detecting ssize_t correctly, complaining that 'ssize_t' does not match 'signed size_t' (which it expects for %zd). Force the cast to size_t to avoid this problem
Nothing wrong with your libvirt patch, but I can't help wonder if this is a bug in the gnulib replacement headers, where mingw lacks ssize_t but gnulib defines it to the wrong type in comparison to size_t (that is, since mingw64 has sizeof(size_t)==4, it is not obvious whether size_t is 'unsigned long' or 'unsigned int', and if gnulib picked 'int' for ssize_t but size_t is 'unsigned long', that would explain the compiler warnings. Gnulib may need to be tweaked to help work around this mingw situation.
Ah, if it turns out to be a gnulib bug, then that'd be preferrable to fix. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

From: "Daniel P. Berrange" <berrange@redhat.com> Defining an enum with names like "ERROR" causes a world of hurt on Win32 whose headers have such symbol names already * tests/cputest.c: Remove redefinition of CPU constants Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/cputest.c | 75 +++++++++++++++++++++++++------------------------------ 1 files changed, 34 insertions(+), 41 deletions(-) diff --git a/tests/cputest.c b/tests/cputest.c index 6c1efe6..9928e5d 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -43,13 +43,6 @@ static const char *abs_top_srcdir; #define VIR_FROM_THIS VIR_FROM_CPU -enum compResultShadow { - ERROR = VIR_CPU_COMPARE_ERROR, - INCOMPATIBLE = VIR_CPU_COMPARE_INCOMPATIBLE, - IDENTICAL = VIR_CPU_COMPARE_IDENTICAL, - SUPERSET = VIR_CPU_COMPARE_SUPERSET -}; - enum cpuTestBoolWithError { FAIL = -1, NO = 0, @@ -558,45 +551,45 @@ mymain(void) preferred, result) /* host to host comparison */ - DO_TEST_COMPARE("x86", "host", "host", IDENTICAL); - DO_TEST_COMPARE("x86", "host", "host-better", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "host-worse", SUPERSET); - DO_TEST_COMPARE("x86", "host", "host-amd-fake", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "host-incomp-arch", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "host-no-vendor", IDENTICAL); - DO_TEST_COMPARE("x86", "host-no-vendor", "host", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host", "host-better", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-worse", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "host-amd-fake", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-incomp-arch", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-no-vendor", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host-no-vendor", "host", VIR_CPU_COMPARE_INCOMPATIBLE); /* guest to host comparison */ - DO_TEST_COMPARE("x86", "host", "bogus-model", ERROR); - DO_TEST_COMPARE("x86", "host", "bogus-feature", ERROR); - DO_TEST_COMPARE("x86", "host", "min", SUPERSET); - DO_TEST_COMPARE("x86", "host", "pentium3", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-forbid", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "exact-forbid-extra", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-disable", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-disable2", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-disable-extra", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-require", SUPERSET); - DO_TEST_COMPARE("x86", "host", "exact-require-extra", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "exact-force", SUPERSET); - DO_TEST_COMPARE("x86", "host", "strict", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host", "strict-full", IDENTICAL); - DO_TEST_COMPARE("x86", "host", "strict-disable", IDENTICAL); - DO_TEST_COMPARE("x86", "host", "strict-force-extra", IDENTICAL); - DO_TEST_COMPARE("x86", "host", "guest", SUPERSET); - DO_TEST_COMPARE("x86", "host", "pentium3-amd", INCOMPATIBLE); - DO_TEST_COMPARE("x86", "host-amd", "pentium3-amd", SUPERSET); - DO_TEST_COMPARE("x86", "host-worse", "nehalem-force", IDENTICAL); + DO_TEST_COMPARE("x86", "host", "bogus-model", VIR_CPU_COMPARE_ERROR); + DO_TEST_COMPARE("x86", "host", "bogus-feature", VIR_CPU_COMPARE_ERROR); + DO_TEST_COMPARE("x86", "host", "min", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "pentium3", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-forbid", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "exact-forbid-extra", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable2", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable-extra", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-require", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-require-extra", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "exact-force", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "strict", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "strict-full", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host", "strict-disable", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host", "strict-force-extra", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host", "guest", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host", "pentium3-amd", VIR_CPU_COMPARE_INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host-amd", "pentium3-amd", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_COMPARE("x86", "host-worse", "nehalem-force", VIR_CPU_COMPARE_IDENTICAL); /* guest updates for migration * automatically compares host CPU with the result */ - DO_TEST_UPDATE("x86", "host", "min", IDENTICAL); - DO_TEST_UPDATE("x86", "host", "pentium3", IDENTICAL); - DO_TEST_UPDATE("x86", "host", "guest", SUPERSET); - DO_TEST_UPDATE("x86", "host", "host-model", IDENTICAL); - DO_TEST_UPDATE("x86", "host", "host-model-nofallback", IDENTICAL); - DO_TEST_UPDATE("x86", "host", "host-passthrough", IDENTICAL); + DO_TEST_UPDATE("x86", "host", "min", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_UPDATE("x86", "host", "pentium3", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_UPDATE("x86", "host", "guest", VIR_CPU_COMPARE_SUPERSET); + DO_TEST_UPDATE("x86", "host", "host-model", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_UPDATE("x86", "host", "host-model-nofallback", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_UPDATE("x86", "host", "host-passthrough", VIR_CPU_COMPARE_IDENTICAL); /* computing baseline CPUs */ DO_TEST_BASELINE("x86", "incompatible-vendors", -1); -- 1.7.7.6

On 03/29/2012 05:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Defining an enum with names like "ERROR" causes a world of hurt on Win32 whose headers have such symbol names already
* tests/cputest.c: Remove redefinition of CPU constants
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/cputest.c | 75 +++++++++++++++++++++++++------------------------------ 1 files changed, 34 insertions(+), 41 deletions(-)
diff --git a/tests/cputest.c b/tests/cputest.c index 6c1efe6..9928e5d 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -43,13 +43,6 @@ static const char *abs_top_srcdir;
#define VIR_FROM_THIS VIR_FROM_CPU
-enum compResultShadow { - ERROR = VIR_CPU_COMPARE_ERROR, - INCOMPATIBLE = VIR_CPU_COMPARE_INCOMPATIBLE, - IDENTICAL = VIR_CPU_COMPARE_IDENTICAL, - SUPERSET = VIR_CPU_COMPARE_SUPERSET -}; -
Why was this done to begin with? To save typing/columns? At any rate, ACK.

From: "Daniel P. Berrange" <berrange@redhat.com> The commandhelper.c & ssh.c programs rely on various APIs not present on Win32. Disable them, since the tests that uses these helpers are already disabled * tests/commandhelper.c, tests/ssh.c: Disable on WIN32 Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/commandhelper.c | 13 +++++++++++++ tests/ssh.c | 13 +++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-) diff --git a/tests/commandhelper.c b/tests/commandhelper.c index 71d93be..a80d191 100644 --- a/tests/commandhelper.c +++ b/tests/commandhelper.c @@ -30,6 +30,9 @@ #include "util.h" #include "memory.h" #include "virfile.h" +#include "testutils.h" + +#ifndef WIN32 static int envsort(const void *a, const void *b) { @@ -140,3 +143,13 @@ int main(int argc, char **argv) { error: return EXIT_FAILURE; } + +#else + +int +main(void) +{ + return EXIT_AM_SKIP; +} + +#endif diff --git a/tests/ssh.c b/tests/ssh.c index 08bb63d..49b6bce 100644 --- a/tests/ssh.c +++ b/tests/ssh.c @@ -22,6 +22,9 @@ #include <stdio.h> #include "internal.h" +#include "testutils.h" + +#ifndef WIN32 int main(int argc, char **argv) { @@ -52,3 +55,13 @@ int main(int argc, char **argv) return 0; } + +#else + +int +main(void) +{ + return EXIT_AM_SKIP; +} + +#endif -- 1.7.7.6

On 03/29/2012 05:53 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The commandhelper.c & ssh.c programs rely on various APIs not present on Win32. Disable them, since the tests that uses these helpers are already disabled
* tests/commandhelper.c, tests/ssh.c: Disable on WIN32
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/commandhelper.c | 13 +++++++++++++ tests/ssh.c | 13 +++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-)
ACK.
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Laine Stump