[libvirt] [libvirt-java] [PATCH 00/10] assorted fixes

This fixes a few memleaks and other errors. Note, that the memleak patches depend on the error refactoring patches I posted to this list[1] [1] https://www.redhat.com/archives/libvir-list/2014-January/msg00415.html Claudio Bley (10): Implement equals and hashCode methods for Connect and Domain Fix warnings using raw types Fix warnings about accessing static methods Remove unused fields of Error class Fix Domain.getSchedulerParameters / getSchedulerType Fix memleak in Domain.snapshotListNames Fix memleak in StoragePool.listVolumes Fix memleak in DomainSnapshot.getXMLDesc Fix memleak in StorageVol.getPath Fix memleak in StorageVol.getXMLDesc src/main/java/org/libvirt/Connect.java | 35 +++++++ src/main/java/org/libvirt/Domain.java | 103 +++++++++++++++------ src/main/java/org/libvirt/DomainSnapshot.java | 10 +- src/main/java/org/libvirt/Error.java | 12 +-- src/main/java/org/libvirt/StoragePool.java | 13 ++- src/main/java/org/libvirt/StorageVol.java | 18 +++- src/main/java/org/libvirt/jna/Libvirt.java | 10 +- src/main/java/org/libvirt/jna/virConnectAuth.java | 4 +- .../java/org/libvirt/jna/virConnectCredential.java | 4 +- .../java/org/libvirt/jna/virDomainBlockInfo.java | 4 +- .../java/org/libvirt/jna/virDomainBlockStats.java | 4 +- src/main/java/org/libvirt/jna/virDomainInfo.java | 4 +- .../org/libvirt/jna/virDomainInterfaceStats.java | 4 +- .../java/org/libvirt/jna/virDomainJobInfo.java | 4 +- .../java/org/libvirt/jna/virDomainMemoryStats.java | 4 +- src/main/java/org/libvirt/jna/virError.java | 4 +- src/main/java/org/libvirt/jna/virNodeInfo.java | 4 +- .../java/org/libvirt/jna/virSchedParameter.java | 4 +- .../java/org/libvirt/jna/virStoragePoolInfo.java | 4 +- .../java/org/libvirt/jna/virStorageVolInfo.java | 4 +- src/main/java/org/libvirt/jna/virVcpuInfo.java | 4 +- src/test/java/org/libvirt/TestJavaBindings.java | 4 + 22 files changed, 187 insertions(+), 74 deletions(-) -- 1.8.5.2.msysgit.0

--- src/main/java/org/libvirt/Connect.java | 35 +++++++++++++++++++ src/main/java/org/libvirt/Domain.java | 46 ++++++++++++++++++++++++- src/test/java/org/libvirt/TestJavaBindings.java | 4 +++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/libvirt/Connect.java b/src/main/java/org/libvirt/Connect.java index fedc60e..d92976e 100644 --- a/src/main/java/org/libvirt/Connect.java +++ b/src/main/java/org/libvirt/Connect.java @@ -89,6 +89,41 @@ public class Connect { */ protected ConnectionPointer VCP; + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((VCP == null) ? 0 : VCP.hashCode()); + return result; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof Connect)) + return false; + Connect other = (Connect) obj; + if (VCP == null) + return (other.VCP == null); + else if (VCP.equals(other.VCP)) + return true; + + try { + return getURI().equals(other.getURI()); + } catch (LibvirtException e) { + throw new RuntimeException("libvirt error testing connect equality", e); + } + } + /** * Protected constructor to return a Connection with ConnectionPointer */ diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 4860770..5184abc 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -134,10 +134,52 @@ public class Domain { */ DomainPointer VDP; + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((VDP == null) ? 0 : VDP.hashCode()); + result = prime * result + + ((virConnect == null) ? 0 : virConnect.hashCode()); + return result; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof Domain)) + return false; + Domain other = (Domain) obj; + + // return false when this domain belongs to + // a different hypervisor than the other + if (!this.virConnect.equals(other.virConnect)) + return false; + + if (VDP == null) return (other.VDP == null); + + if (VDP.equals(other.VDP)) return true; + + try { + return getUUID().equals(other.getUUID()); + } catch (LibvirtException e) { + throw new RuntimeException("libvirt error testing domain equality", e); + } + } + /** * The Connect Object that represents the Hypervisor of this Domain */ - private Connect virConnect; + private final Connect virConnect; /** * Constructs a Domain object from a known native DomainPointer, and a @@ -149,6 +191,8 @@ public class Domain { * the native virDomainPtr */ Domain(Connect virConnect, DomainPointer VDP) { + assert virConnect != null; + this.virConnect = virConnect; this.VDP = VDP; } diff --git a/src/test/java/org/libvirt/TestJavaBindings.java b/src/test/java/org/libvirt/TestJavaBindings.java index 3600844..fdd9c33 100644 --- a/src/test/java/org/libvirt/TestJavaBindings.java +++ b/src/test/java/org/libvirt/TestJavaBindings.java @@ -130,6 +130,7 @@ public final class TestJavaBindings extends TestCase { + " <uuid>004b96e1-2d78-c30f-5aa5-f03c87d21e67</uuid>" + " <memory>8388608</memory>" + " <vcpu>2</vcpu>" + " <os><type arch='i686'>hvm</type></os>" + " <on_reboot>restart</on_reboot>" + " <on_poweroff>destroy</on_poweroff>" + " <on_crash>restart</on_crash>" + "</domain>", 0); + UUID dom2UUID = UUID.fromString("004b96e1-2d78-c30f-5aa5-f03c87d21e67"); assertEquals("Number of domains", 2, conn.numOfDomains()); assertEquals("Number of listed domains", 2, conn.listDomains().length); @@ -143,6 +144,9 @@ public final class TestJavaBindings extends TestCase { this.validateDomainData(conn.domainLookupByUUID(UUIDArray)); this.validateDomainData(conn.domainLookupByUUIDString("004b96e1-2d78-c30f-5aa5-f03c87d21e67")); this.validateDomainData(conn.domainLookupByUUID(UUID.fromString("004b96e1-2d78-c30f-5aa5-f03c87d21e67"))); + assertEquals("Domain is not equal to Domain retrieved by lookup", + dom2, + conn.domainLookupByUUID(dom2.getUUID())); } private void validateDomainData(Domain dom) throws Exception { -- 1.8.5.2.msysgit.0

Eclipse generates this kind of warning: org/libvirt/jna/virConnectCredential.java:20: List is a raw type. References to generic type List<E> should be parameterized --- src/main/java/org/libvirt/jna/virConnectAuth.java | 4 ++-- src/main/java/org/libvirt/jna/virConnectCredential.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainBlockInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainBlockStats.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainInterfaceStats.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainJobInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virDomainMemoryStats.java | 4 ++-- src/main/java/org/libvirt/jna/virError.java | 4 ++-- src/main/java/org/libvirt/jna/virNodeInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virSchedParameter.java | 4 ++-- src/main/java/org/libvirt/jna/virStoragePoolInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virStorageVolInfo.java | 4 ++-- src/main/java/org/libvirt/jna/virVcpuInfo.java | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/libvirt/jna/virConnectAuth.java b/src/main/java/org/libvirt/jna/virConnectAuth.java index ece61f6..0451348 100644 --- a/src/main/java/org/libvirt/jna/virConnectAuth.java +++ b/src/main/java/org/libvirt/jna/virConnectAuth.java @@ -15,11 +15,11 @@ public class virConnectAuth extends Structure { public Libvirt.VirConnectAuthCallback cb; public Pointer cbdata; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "credtype", "ncredtype", "cb", "cbdata"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virConnectCredential.java b/src/main/java/org/libvirt/jna/virConnectCredential.java index 6dd4a75..316b1f4 100644 --- a/src/main/java/org/libvirt/jna/virConnectCredential.java +++ b/src/main/java/org/libvirt/jna/virConnectCredential.java @@ -17,12 +17,12 @@ public class virConnectCredential extends Structure implements Structure.ByRefer public String result; public int resultlen; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "type", "prompt", "challenge", "defresult", "result", "resultlen"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainBlockInfo.java b/src/main/java/org/libvirt/jna/virDomainBlockInfo.java index fb1b845..5a88ba3 100644 --- a/src/main/java/org/libvirt/jna/virDomainBlockInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainBlockInfo.java @@ -10,11 +10,11 @@ public class virDomainBlockInfo extends Structure { public long allocation; public long physical; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "capacity", "allocation", "physical"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainBlockStats.java b/src/main/java/org/libvirt/jna/virDomainBlockStats.java index a7331f6..e48629a 100644 --- a/src/main/java/org/libvirt/jna/virDomainBlockStats.java +++ b/src/main/java/org/libvirt/jna/virDomainBlockStats.java @@ -20,11 +20,11 @@ public class virDomainBlockStats extends Structure { public long errs; // this is a long long in the code, so a long mapping is // correct - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "rd_req", "rd_bytes", "wr_req", "wr_bytes", "errs"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainInfo.java b/src/main/java/org/libvirt/jna/virDomainInfo.java index 0b667f6..ff20d16 100644 --- a/src/main/java/org/libvirt/jna/virDomainInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainInfo.java @@ -16,11 +16,11 @@ public class virDomainInfo extends Structure { public short nrVirtCpu; public long cpuTime; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "state", "maxMem", "memory", "nrVirtCpu", "cpuTime"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java b/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java index eea6a49..9b98aa8 100644 --- a/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java +++ b/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java @@ -26,12 +26,12 @@ public class virDomainInterfaceStats extends Structure { public long tx_drop; // this is a long long in the code, so a long mapping // is correct - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "rx_bytes", "rx_packets", "rx_errs", "rx_drop", "tx_bytes", "tx_packets", "tx_errs", "tx_drop"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainJobInfo.java b/src/main/java/org/libvirt/jna/virDomainJobInfo.java index 0398901..1bab587 100644 --- a/src/main/java/org/libvirt/jna/virDomainJobInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainJobInfo.java @@ -19,13 +19,13 @@ public class virDomainJobInfo extends Structure { public long fileProcessed; public long fileRemaining; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "type", "timeElapsed", "timeRemaining", "dataTotal", "dataProcessed", "dataRemaining", "memTotal", "memProcessed", "memRemaining", "fileTotal", "fileProcessed", "fileRemaining"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainMemoryStats.java b/src/main/java/org/libvirt/jna/virDomainMemoryStats.java index b14fb95..dfbd3f9 100644 --- a/src/main/java/org/libvirt/jna/virDomainMemoryStats.java +++ b/src/main/java/org/libvirt/jna/virDomainMemoryStats.java @@ -9,10 +9,10 @@ public class virDomainMemoryStats extends Structure { public int tag ; public long val ; - private static final List fields = Arrays.asList( "tag", "val"); + private static final List<String> fields = Arrays.asList( "tag", "val"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virError.java b/src/main/java/org/libvirt/jna/virError.java index 36b9f69..e58f5f3 100644 --- a/src/main/java/org/libvirt/jna/virError.java +++ b/src/main/java/org/libvirt/jna/virError.java @@ -22,12 +22,12 @@ public class virError extends Structure { public int int2; public NetworkPointer net; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "code", "domain", "message", "level", "conn", "dom", "str1", "str2", "str3", "int1", "int2", "net"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virNodeInfo.java b/src/main/java/org/libvirt/jna/virNodeInfo.java index 9ff1251..7a7716e 100644 --- a/src/main/java/org/libvirt/jna/virNodeInfo.java +++ b/src/main/java/org/libvirt/jna/virNodeInfo.java @@ -25,12 +25,12 @@ public class virNodeInfo extends Structure { public int cores; public int threads; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "model", "memory", "cpus", "mhz", "nodes", "sockets", "cores", "threads"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virSchedParameter.java b/src/main/java/org/libvirt/jna/virSchedParameter.java index f579ef0..f3787a9 100644 --- a/src/main/java/org/libvirt/jna/virSchedParameter.java +++ b/src/main/java/org/libvirt/jna/virSchedParameter.java @@ -13,11 +13,11 @@ public class virSchedParameter extends Structure { public int type; public virSchedParameterValue value; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "field", "type", "value"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virStoragePoolInfo.java b/src/main/java/org/libvirt/jna/virStoragePoolInfo.java index fe20f0f..7077175 100644 --- a/src/main/java/org/libvirt/jna/virStoragePoolInfo.java +++ b/src/main/java/org/libvirt/jna/virStoragePoolInfo.java @@ -17,11 +17,11 @@ public class virStoragePoolInfo extends Structure { public long available; // this is a long long in the code, so a long mapping // is correct - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "state", "capacity", "allocation", "available"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virStorageVolInfo.java b/src/main/java/org/libvirt/jna/virStorageVolInfo.java index 93132ea..8bf2d5c 100644 --- a/src/main/java/org/libvirt/jna/virStorageVolInfo.java +++ b/src/main/java/org/libvirt/jna/virStorageVolInfo.java @@ -15,11 +15,11 @@ public class virStorageVolInfo extends Structure { public long allocation; // this is a long long in the code, so a long // mapping is correct - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "type", "capacity", "allocation"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virVcpuInfo.java b/src/main/java/org/libvirt/jna/virVcpuInfo.java index 96eca2f..bc1a539 100644 --- a/src/main/java/org/libvirt/jna/virVcpuInfo.java +++ b/src/main/java/org/libvirt/jna/virVcpuInfo.java @@ -15,11 +15,11 @@ public class virVcpuInfo extends Structure { // is correct public int cpu; - private static final List fields = Arrays.asList( + private static final List<String> fields = Arrays.asList( "number", "state", "cpuTime", "cpu"); @Override - protected List getFieldOrder() { + protected List<String> getFieldOrder() { return fields; } } -- 1.8.5.2.msysgit.0

java/org/libvirt/Error.java:217: The static method wrap(int) from the type Error.ErrorDomain should be accessed in a static way --- src/main/java/org/libvirt/Error.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/libvirt/Error.java b/src/main/java/org/libvirt/Error.java index 114e758..6f68f57 100644 --- a/src/main/java/org/libvirt/Error.java +++ b/src/main/java/org/libvirt/Error.java @@ -213,9 +213,9 @@ public class Error implements Serializable { private NetworkPointer VNP; /* Deprecated */ public Error(virError vError) { - code = code.wrap(vError.code); - domain = domain.wrap(vError.domain); - level = level.wrap(vError.level); + code = ErrorNumber.wrap(vError.code); + domain = ErrorDomain.wrap(vError.domain); + level = ErrorLevel.wrap(vError.level); message = vError.message; str1 = vError.str1; str2 = vError.str2; -- 1.8.5.2.msysgit.0

These fields of the Error class are no longer used, no need to keep them around. --- src/main/java/org/libvirt/Error.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/org/libvirt/Error.java b/src/main/java/org/libvirt/Error.java index 6f68f57..9da3a80 100644 --- a/src/main/java/org/libvirt/Error.java +++ b/src/main/java/org/libvirt/Error.java @@ -203,14 +203,11 @@ public class Error implements Serializable { private ErrorDomain domain; private String message; private ErrorLevel level; - private ConnectionPointer VCP; /* Deprecated */ - private DomainPointer VDP; /* Deprecated */ private String str1; private String str2; private String str3; private int int1; private int int2; - private NetworkPointer VNP; /* Deprecated */ public Error(virError vError) { code = ErrorNumber.wrap(vError.code); @@ -222,9 +219,6 @@ public class Error implements Serializable { str3 = vError.str3; int1 = vError.int1; int2 = vError.int2; - VCP = vError.conn; - VDP = vError.dom; - VNP = vError.net; } /** -- 1.8.5.2.msysgit.0

The getSchedulerType method returns a String (the name of the scheduler), not a String array containing a single element. It's OK to just pass null for the second argument to virDomainGetSchedulerType. Ensure to free the returned string. --- src/main/java/org/libvirt/Domain.java | 43 ++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 5184abc..4463a9b 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -525,18 +525,25 @@ public class Domain { */ public SchedParameter[] getSchedulerParameters() throws LibvirtException { IntByReference nParams = new IntByReference(); - SchedParameter[] returnValue = new SchedParameter[0]; - Pointer pScheduler = processError(libvirt.virDomainGetSchedulerType(VDP, nParams)); - String scheduler = Library.getString(pScheduler); - Library.free(pScheduler); - virSchedParameter[] nativeParams = new virSchedParameter[nParams.getValue()]; - returnValue = new SchedParameter[nParams.getValue()]; - processError(libvirt.virDomainGetSchedulerParameters(VDP, nativeParams, nParams)); - for (int x = 0; x < nParams.getValue(); x++) { - returnValue[x] = SchedParameter.create(nativeParams[x]); - } + Library.free(processError(libvirt.virDomainGetSchedulerType(VDP, nParams))); - return returnValue; + int n = nParams.getValue(); + + if (n > 0) { + virSchedParameter[] nativeParams = new virSchedParameter[n]; + + processError(libvirt.virDomainGetSchedulerParameters(VDP, nativeParams, nParams)); + n = nParams.getValue(); + + SchedParameter[] returnValue = new SchedParameter[n]; + + for (int x = 0; x < n; x++) { + returnValue[x] = SchedParameter.create(nativeParams[x]); + } + return returnValue; + } else { + return new SchedParameter[] {}; + } } // getSchedulerType @@ -549,13 +556,13 @@ public class Domain { * @return the type of the scheduler * @throws LibvirtException */ - public String[] getSchedulerType() throws LibvirtException { - IntByReference nParams = new IntByReference(); - Pointer pScheduler = processError(libvirt.virDomainGetSchedulerType(VDP, nParams)); - String[] array = new String[1]; - array[0] = Library.getString(pScheduler); - Library.free(pScheduler); - return array; + public String getSchedulerType() throws LibvirtException { + Pointer pScheduler = processError(libvirt.virDomainGetSchedulerType(VDP, null)); + try { + return Library.getString(pScheduler); + } finally { + Library.free(pScheduler); + } } /** -- 1.8.5.2.msysgit.0

We need to free the char* entries of the result array returned ourselves. --- src/main/java/org/libvirt/Domain.java | 14 +++++++------- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 4463a9b..fc5486b 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -1183,15 +1183,15 @@ public class Domain { * @throws LibvirtException */ public String[] snapshotListNames(int flags) throws LibvirtException { - String[] returnValue = null; int num = snapshotNum(); - if (num >= 0) { - returnValue = new String[num]; - if (num > 0) { - processError(libvirt.virDomainSnapshotListNames(VDP, returnValue, num, flags)); - } + if (num > 0) { + Pointer[] ptrs = new Pointer[num]; + int got = processError(libvirt.virDomainSnapshotListNames(VDP, ptrs, num, flags)); + + return Library.toStringArray(ptrs, got); + } else { + return Library.NO_STRINGS; } - return returnValue; } /** diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index a2bf42e..70e57d8 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -381,7 +381,7 @@ public interface Libvirt extends Library { int virDomainSnapshotDelete(DomainSnapshotPointer virDomainSnapshotPtr, int flags); String virDomainSnapshotGetXMLDesc(DomainSnapshotPointer virDomainSnapshotPtr, int flags); int virDomainSnapshotFree(DomainSnapshotPointer virDomainSnapshotPtr); - int virDomainSnapshotListNames(DomainPointer virDomainPtr, String[] names, int nameslen, int flags); + int virDomainSnapshotListNames(DomainPointer virDomainPtr, Pointer[] names, int nameslen, int flags); DomainSnapshotPointer virDomainSnapshotLookupByName(DomainPointer virDomainPtr, String name, int flags); int virDomainSnapshotNum(DomainPointer virDomainPtr, int flags); -- 1.8.5.2.msysgit.0

We need to free the char* entries of the result array returned ourselves. --- src/main/java/org/libvirt/StoragePool.java | 13 ++++++++++--- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/libvirt/StoragePool.java b/src/main/java/org/libvirt/StoragePool.java index bb608e3..14ecab8 100644 --- a/src/main/java/org/libvirt/StoragePool.java +++ b/src/main/java/org/libvirt/StoragePool.java @@ -8,6 +8,7 @@ import static org.libvirt.Library.libvirt; import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; +import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** @@ -245,9 +246,15 @@ public class StoragePool { */ public String[] listVolumes() throws LibvirtException { int num = numOfVolumes(); - String[] returnValue = new String[num]; - processError(libvirt.virStoragePoolListVolumes(VSPP, returnValue, num)); - return returnValue; + if (num > 0) { + Pointer[] ptrs = new Pointer[num]; + + int got = processError(libvirt.virStoragePoolListVolumes(VSPP, ptrs, num)); + + return Library.toStringArray(ptrs, got); + } else { + return Library.NO_STRINGS; + } } /** diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 70e57d8..e0096e3 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -304,7 +304,7 @@ public interface Libvirt extends Library { int virStoragePoolGetUUID(StoragePoolPointer storagePoolPtr, byte[] uuidString); int virStoragePoolGetUUIDString(StoragePoolPointer storagePoolPtr, byte[] uuidString); String virStoragePoolGetXMLDesc(StoragePoolPointer storagePoolPtr, int flags); - int virStoragePoolListVolumes(StoragePoolPointer storagePoolPtr, String[] names, int maxnames); + int virStoragePoolListVolumes(StoragePoolPointer storagePoolPtr, Pointer[] names, int maxnames); int virStoragePoolIsActive(StoragePoolPointer storagePoolPtr); int virStoragePoolIsPersistent(StoragePoolPointer storagePoolPtr); StoragePoolPointer virStoragePoolLookupByName(ConnectionPointer virConnectPtr, String name); -- 1.8.5.2.msysgit.0

--- src/main/java/org/libvirt/DomainSnapshot.java | 10 +++++++++- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/libvirt/DomainSnapshot.java b/src/main/java/org/libvirt/DomainSnapshot.java index 4736a71..3013117 100644 --- a/src/main/java/org/libvirt/DomainSnapshot.java +++ b/src/main/java/org/libvirt/DomainSnapshot.java @@ -4,6 +4,8 @@ import org.libvirt.jna.DomainSnapshotPointer; import static org.libvirt.Library.libvirt; import static org.libvirt.ErrorHandler.processError; +import com.sun.jna.Pointer; + public class DomainSnapshot { /** @@ -71,6 +73,12 @@ public class DomainSnapshot { * @return the XML document */ public String getXMLDesc() throws LibvirtException { - return processError(libvirt.virDomainSnapshotGetXMLDesc(VDSP, 0)); + Pointer p = processError(libvirt.virDomainSnapshotGetXMLDesc(VDSP, 0)); + + try { + return Library.getString(p); + } finally { + Library.free(p); + } } } diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index e0096e3..4017269 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -379,7 +379,7 @@ public interface Libvirt extends Library { DomainSnapshotPointer virDomainSnapshotCreateXML(DomainPointer virDomainPtr, String xmlDesc, int flags); DomainSnapshotPointer virDomainSnapshotCurrent(DomainPointer virDomainPtr, int flags); int virDomainSnapshotDelete(DomainSnapshotPointer virDomainSnapshotPtr, int flags); - String virDomainSnapshotGetXMLDesc(DomainSnapshotPointer virDomainSnapshotPtr, int flags); + Pointer virDomainSnapshotGetXMLDesc(DomainSnapshotPointer virDomainSnapshotPtr, int flags); int virDomainSnapshotFree(DomainSnapshotPointer virDomainSnapshotPtr); int virDomainSnapshotListNames(DomainPointer virDomainPtr, Pointer[] names, int nameslen, int flags); DomainSnapshotPointer virDomainSnapshotLookupByName(DomainPointer virDomainPtr, String name, int flags); -- 1.8.5.2.msysgit.0

--- src/main/java/org/libvirt/StorageVol.java | 10 +++++++++- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/libvirt/StorageVol.java b/src/main/java/org/libvirt/StorageVol.java index 1573070..7035c93 100644 --- a/src/main/java/org/libvirt/StorageVol.java +++ b/src/main/java/org/libvirt/StorageVol.java @@ -6,6 +6,8 @@ import org.libvirt.jna.virStorageVolInfo; import static org.libvirt.Library.libvirt; import static org.libvirt.ErrorHandler.processError; +import com.sun.jna.Pointer; + /** * An acutal storage bucket. */ @@ -161,7 +163,13 @@ public class StorageVol { * @throws LibvirtException */ public String getPath() throws LibvirtException { - return processError(libvirt.virStorageVolGetPath(VSVP)); + Pointer p = processError(libvirt.virStorageVolGetPath(VSVP)); + + try { + return Library.getString(p); + } finally { + Library.free(p); + } } /** diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 4017269..8033791 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -325,7 +325,7 @@ public interface Libvirt extends Library { int virStorageVolGetInfo(StorageVolPointer storageVolPtr, virStorageVolInfo info); String virStorageVolGetKey(StorageVolPointer storageVolPtr); String virStorageVolGetName(StorageVolPointer storageVolPtr); - String virStorageVolGetPath(StorageVolPointer storageVolPtr); + Pointer virStorageVolGetPath(StorageVolPointer storageVolPtr); String virStorageVolGetXMLDesc(StorageVolPointer storageVolPtr, int flags); StorageVolPointer virStorageVolLookupByKey(ConnectionPointer virConnectPtr, String name); StorageVolPointer virStorageVolLookupByName(StoragePoolPointer storagePoolPtr, String name); -- 1.8.5.2.msysgit.0

--- src/main/java/org/libvirt/StorageVol.java | 8 +++++++- src/main/java/org/libvirt/jna/Libvirt.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/libvirt/StorageVol.java b/src/main/java/org/libvirt/StorageVol.java index 7035c93..47b79f6 100644 --- a/src/main/java/org/libvirt/StorageVol.java +++ b/src/main/java/org/libvirt/StorageVol.java @@ -181,7 +181,13 @@ public class StorageVol { * @throws LibvirtException */ public String getXMLDesc(int flags) throws LibvirtException { - return processError(libvirt.virStorageVolGetXMLDesc(VSVP, flags)); + Pointer p = processError(libvirt.virStorageVolGetXMLDesc(VSVP, flags)); + + try { + return Library.getString(p); + } finally { + Library.free(p); + } } /** diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 8033791..eb29ec7 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -326,7 +326,7 @@ public interface Libvirt extends Library { String virStorageVolGetKey(StorageVolPointer storageVolPtr); String virStorageVolGetName(StorageVolPointer storageVolPtr); Pointer virStorageVolGetPath(StorageVolPointer storageVolPtr); - String virStorageVolGetXMLDesc(StorageVolPointer storageVolPtr, int flags); + Pointer virStorageVolGetXMLDesc(StorageVolPointer storageVolPtr, int flags); StorageVolPointer virStorageVolLookupByKey(ConnectionPointer virConnectPtr, String name); StorageVolPointer virStorageVolLookupByName(StoragePoolPointer storagePoolPtr, String name); StorageVolPointer virStorageVolLookupByPath(ConnectionPointer virConnectPtr, String path); -- 1.8.5.2.msysgit.0
participants (1)
-
Claudio Bley