This patch (for libvirt-java) implements Java bindings for the node
device enumeration functions.
Dave
diff --git a/src/Makefile.am b/src/Makefile.am
index 5200c1d..466a0eb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -14,6 +14,7 @@ java_libvirt_source_files = \
org/libvirt/Error.java \
org/libvirt/Network.java \
org/libvirt/NodeInfo.java \
+ org/libvirt/NodeDevice.java \
org/libvirt/SchedBooleanParameter.java \
org/libvirt/SchedDoubleParameter.java \
org/libvirt/SchedIntParameter.java \
diff --git a/src/jni/Makefile.am b/src/jni/Makefile.am
index 6e19384..8feed24 100644
--- a/src/jni/Makefile.am
+++ b/src/jni/Makefile.am
@@ -10,7 +10,8 @@ GENERATED = \
org_libvirt_StoragePool.h \
org_libvirt_StorageVol_Type.h \
org_libvirt_StorageVol_DeleteFlags.h \
- org_libvirt_StorageVol.h
+ org_libvirt_StorageVol.h \
+ org_libvirt_NodeDevice.h
BUILT_SOURCES = $(GENERATED)
@@ -31,6 +32,9 @@ org_libvirt_StoragePool.h org_libvirt_StoragePool_BuildFlags.h org_libvirt_Stora
org_libvirt_StorageVol.h org_libvirt_StorageVol_Type.h org_libvirt_StorageVol_DeleteFlags.h : $(JAVA_CLASS_ROOT)/org/libvirt/StorageVol.class
$(JAVAH) -classpath $(JAVA_CLASS_ROOT) org.libvirt.StorageVol
+org_libvirt_NodeDevice.h : $(JAVA_CLASS_ROOT)/org/libvirt/NodeDevice.class
+ $(JAVAH) -classpath $(JAVA_CLASS_ROOT) org.libvirt.NodeDevice
+
lib_LTLIBRARIES = libvirt_jni.la
libvirt_jni_la_SOURCES = \
org_libvirt_Network.c \
@@ -38,6 +42,7 @@ libvirt_jni_la_SOURCES = \
org_libvirt_Domain.c \
org_libvirt_StoragePool.c \
org_libvirt_StorageVol.c \
+ org_libvirt_NodeDevice.c \
generic.h \
ErrorHandler.c \
ErrorHandler.h \
diff --git a/src/jni/generic.h b/src/jni/generic.h
index 347c076..e1da179 100644
--- a/src/jni/generic.h
+++ b/src/jni/generic.h
@@ -70,6 +70,16 @@
return retval;
/*
+ * Generic macro with a VIROBJ and a String and an int arguments
+ * returning an int
+ */
+#define GENERIC_VIROBJ_STRING_INT__INT(ENV, OBJ, VIROBJ, J_STR, ARG1, VIRFUNC1) \
+ const char *str=(*ENV)->GetStringUTFChars(ENV, J_STR, NULL); \
+ jint retval = (jlong)VIRFUNC1(VIROBJ, str, ARG1); \
+ (*ENV)->ReleaseStringUTFChars(ENV, J_STR, str); \
+ return retval;
+
+/*
* Generic macro with a VIROBJ and an String arguments returning a virObject
* (for functions like *CreateXML* that take no flags)
*/
@@ -81,15 +91,14 @@
/*
* Generic macro with a VIROBJ and String and int arguments returning a
- * virObject (for functions like *CreateXML* that take a flags)
+ * virObject
*/
-#define GENERIC_VIROBJ_STRING_INT__VIROBJ(ENV, OBJ, VIROBJ, J_XMLDESC, FLAGS, VIRFUNC1) \
- const char *xmlDesc=(*ENV)->GetStringUTFChars(ENV, J_XMLDESC, NULL); \
- jlong retval = (jlong)VIRFUNC1(VIROBJ, xmlDesc, FLAGS); \
- (*ENV)->ReleaseStringUTFChars(ENV, J_XMLDESC, xmlDesc); \
+#define GENERIC_VIROBJ_STRING_INT__VIROBJ(ENV, OBJ, VIROBJ, J_STR, ARG1, VIRFUNC1) \
+ const char *str=(*ENV)->GetStringUTFChars(ENV, J_STR, NULL); \
+ jlong retval = (jlong)VIRFUNC1(VIROBJ, str, ARG1); \
+ (*ENV)->ReleaseStringUTFChars(ENV, J_STR, str); \
return retval;
-
/*
* Generic macro for the *getAutoStart functions
*/
@@ -150,6 +159,61 @@
return j_names;
/*
+ * Generic macro for the *List* functions that return an array of strings
+ * and take a single int arg.
+ * VIRFUNC1 is the *List* function
+ * VIRFUNC2 is the corresponding *NumOf* function
+ */
+#define GENERIC_INT__LIST_STRINGARRAY(ENV, OBJ, VIROBJ, JINT, VF1, VF2) \
+ int maxnames; \
+ char **names; \
+ int c; \
+ jobjectArray j_names=NULL; \
+ if((maxnames = VF2(VIROBJ, JINT))<0) \
+ return NULL; \
+ names= (char**)calloc(maxnames, sizeof(char*)); \
+ if(VF1(VIROBJ, names, maxnames, JINT)>=0){ \
+ j_names= (jobjectArray)(*ENV)->NewObjectArray(ENV, maxnames, \
+ (*ENV)->FindClass(ENV,"java/lang/String"), \
+ (*ENV)->NewStringUTF(ENV,"")); \
+ for(c=0; c<maxnames; c++){ \
+ (*ENV)->SetObjectArrayElement(ENV, j_names, c, \
+ (*ENV)->NewStringUTF(ENV, names[c])); \
+ } \
+ } \
+ free(names); \
+ return j_names;
+
+/*
+ * Generic macro for the *List* functions that return an array of strings
+ * and take a single string arg and an int arg.
+ * VIRFUNC1 is the *List* function
+ * VIRFUNC2 is the corresponding *NumOf* function
+ */
+#define GENERIC_STRING_INT__LIST_STRINGARRAY(ENV, OBJ, VIROBJ, J_STR, JINT, VF1, VF2) \
+ int maxnames; \
+ char **names; \
+ int c; \
+ jobjectArray j_names=NULL; \
+ const char *str = (*ENV)->GetStringUTFChars(ENV, J_STR, NULL); \
+ if((maxnames = VF2(VIROBJ, str, JINT))<0) \
+ goto cleanup; \
+ names= (char**)calloc(maxnames, sizeof(char*)); \
+ if(VF1(VIROBJ, str, names, maxnames, JINT)>=0){ \
+ j_names= (jobjectArray)(*ENV)->NewObjectArray(ENV, maxnames, \
+ (*ENV)->FindClass(ENV,"java/lang/String"), \
+ (*ENV)->NewStringUTF(ENV,"")); \
+ for(c=0; c<maxnames; c++){ \
+ (*ENV)->SetObjectArrayElement(ENV, j_names, c, \
+ (*ENV)->NewStringUTF(ENV, names[c])); \
+ } \
+ } \
+ free(names); \
+ cleanup: \
+ (*ENV)->ReleaseStringUTFChars(ENV, J_STR, str); \
+ return j_names;
+
+/*
* Generic macro for the *LookupBy* functions that take a string and return a VirObject
*/
#define GENERIC_LOOKUPBY_STRING(ENV, OBJ, VIROBJ, J_STRINGID, VIRFUNC1) \
diff --git a/src/jni/org_libvirt_Connect.c b/src/jni/org_libvirt_Connect.c
index cbf437c..e9e69f0 100644
--- a/src/jni/org_libvirt_Connect.c
+++ b/src/jni/org_libvirt_Connect.c
@@ -361,3 +361,33 @@ JNIEXPORT jlong JNICALL Java_org_libvirt_Connect__1virStoragePoolLookupByName
GENERIC_LOOKUPBY_STRING(env, obj, (virConnectPtr)VCP, j_name, virStoragePoolLookupByName)
}
+JNIEXPORT jobjectArray JNICALL Java_org_libvirt_Connect__1nodeListDevices
+(JNIEnv *env, jobject obj, jlong VCP, jint flags){
+ GENERIC_INT__LIST_STRINGARRAY(env, obj, (virConnectPtr)VCP, flags, virNodeListDevices, virNodeNumOfDevices)
+}
+
+JNIEXPORT jobjectArray JNICALL Java_org_libvirt_Connect__1nodeListDevicesByCap
+(JNIEnv *env, jobject obj, jlong VCP, jstring j_cap, jint flags){
+ GENERIC_STRING_INT__LIST_STRINGARRAY(env, obj, (virConnectPtr)VCP, j_cap, flags, virNodeListDevicesByCap, virNodeNumOfDevicesByCap)
+}
+
+JNIEXPORT jint JNICALL Java_org_libvirt_Connect__1nodeNumOfDevices
+(JNIEnv *env, jobject obj, jlong VCP, jint flags){
+ GENERIC__VIROBJ_INT__INT(env, obj, (virConnectPtr)VCP, flags, virNodeNumOfDevices);
+}
+
+JNIEXPORT jint JNICALL Java_org_libvirt_Connect__1nodeNumOfDevicesByCap
+(JNIEnv *env, jobject obj, jlong VCP, jstring j_cap, jint flags){
+ GENERIC__VIROBJ_STRING_INT__INT(env, obj, (virConnectPtr)VCP, j_cap, flags, virNodeNumOfDevicesByCap);
+}
+
+JNIEXPORT jlong JNICALL Java_org_libvirt_Connect__1nodeDeviceLookupByName
+(JNIEnv *env, jobject obj, jlong VCP, jstring j_name){
+ GENERIC_LOOKUPBY_STRING(env, obj, (virConnectPtr)VCP, j_name, virNodeDeviceLookupByName)
+}
+
+JNIEXPORT jlong JNICALL Java_org_libvirt_Connect__1nodeDeviceCreate
+(JNIEnv *env, jobject obj, jlong VCP, jstring j_xml, jint flags){
+ GENERIC_VIROBJ_STRING_INT__VIROBJ(env, obj, (virConnectPtr)VCP, j_xml, flags, virNodeDeviceCreate)
+}
+
diff --git a/src/jni/org_libvirt_NodeDevice.c b/src/jni/org_libvirt_NodeDevice.c
new file mode 100644
index 0000000..1d8d4d0
--- /dev/null
+++ b/src/jni/org_libvirt_NodeDevice.c
@@ -0,0 +1,35 @@
+#include <libvirt/libvirt.h>
+#include "org_libvirt_NodeDevice.h"
+#include "generic.h"
+
+
+JNIEXPORT jstring JNICALL Java_org_libvirt_NodeDevice__1getName
+(JNIEnv *env, jobject obj, jlong VNDP){
+ GENERIC__VIROBJ__CONSTSTRING(env, obj, (virNodeDevicePtr)VNDP, virNodeDeviceGetName)
+ }
+
+JNIEXPORT jstring JNICALL Java_org_libvirt_NodeDevice__1getParent
+(JNIEnv *env, jobject obj, jlong VNDP){
+ GENERIC__VIROBJ__CONSTSTRING(env, obj, (virNodeDevicePtr)VNDP, virNodeDeviceGetParent)
+ }
+
+JNIEXPORT jobjectArray JNICALL Java_org_libvirt_NodeDevice__1listCapabilities
+(JNIEnv *env, jobject obj, jlong VNDP){
+ GENERIC_LIST_STRINGARRAY(env, obj, (virNodeDevicePtr)VNDP, virNodeDeviceListCaps, virNodeDeviceNumOfCaps)
+ }
+
+JNIEXPORT jint JNICALL Java_org_libvirt_NodeDevice__1numOfCapabilities
+(JNIEnv *env, jobject obj, jlong VNDP){
+ return (jint)virNodeDeviceNumOfCaps((virNodeDevicePtr)VNDP);
+ }
+
+JNIEXPORT jstring JNICALL Java_org_libvirt_NodeDevice__1getXMLDesc
+(JNIEnv *env, jobject obj, jlong VNDP, jint flags){
+ GENERIC_VIROBJ_INT__STRING(env, obj, (virNodeDevicePtr)VNDP, flags, virNodeDeviceGetXMLDesc)
+ }
+
+JNIEXPORT void JNICALL Java_org_libvirt_NodeDevice__1destroy
+(JNIEnv *env, jobject obj, jlong VNDP, jint flags){
+ virNodeDeviceDestroy((virNodeDevicePtr)VNDP, flags);
+ }
+
diff --git a/src/org/libvirt/Connect.java b/src/org/libvirt/Connect.java
index 4271937..7f0a7b3 100644
--- a/src/org/libvirt/Connect.java
+++ b/src/org/libvirt/Connect.java
@@ -698,4 +698,89 @@ public class Connect {
private native long _virStorageVolLookupByPath(long VCP, String path);
+ /**
+ * Lists the names of currently-known node devices
+ *
+ * @param flags flags future flags, use 0 for now
+ * @return an Array of Strings containing the names of all known node devices
+ * @throws LibvirtException
+ */
+ public String[] nodeListDevices(int flags) throws LibvirtException {
+ return _nodeListDevices(VCP, flags);
+ }
+
+ private native String[] _nodeListDevices(long VCP, int flags)
+ throws LibvirtException;
+
+ /**
+ * Lists the names of currently-known node devices with the given capability
+ *
+ * @param cap the capability name
+ * @param flags future flags, use 0 for now
+ * @return an Array of Strings containing the names of devices with that cap
+ * @throws LibvirtException
+ */
+ public String[] nodeListDevicesByCap(String cap, int flags) throws LibvirtException {
+ return _nodeListDevicesByCap(VCP, cap, flags);
+ }
+ private native String[] _nodeListDevicesByCap(long VCP, String cap, int flags)
+ throws LibvirtException;
+
+ /**
+ * Gets the number of currently-known node devices
+ *
+ * @param flags future flags, use 0 for now
+ * @return the count of all known node devices
+ * @throws LibvirtException
+ */
+ public int nodeNumOfDevices(int flags) throws LibvirtException {
+ return _nodeNumOfDevices(VCP, flags);
+ }
+
+ private native int _nodeNumOfDevices(long VCP, int flags)
+ throws LibvirtException;
+
+ /**
+ * Gets the number of currently-known node devices with the given capability
+ *
+ * @param cap the capability name
+ * @param flags future flags, use 0 for now
+ * @return the count of devices with that cap
+ * @throws LibvirtException
+ */
+ public int nodeNumOfDevicesByCap(String cap, int flags) throws LibvirtException {
+ return _nodeNumOfDevicesByCap(VCP, cap, flags);
+ }
+ private native int _nodeNumOfDevicesByCap(long VCP, String cap, int flags)
+ throws LibvirtException;
+
+ /**
+ * Looks up a NodeDevice from its name
+ *
+ * @param name the node device name
+ * @return the NodeDevice with that name, or NULL if not found
+ * @throws LibvirtException
+ */
+ public NodeDevice nodeDeviceLookupByName(String name) throws LibvirtException {
+ return new NodeDevice(this, _nodeDeviceLookupByName(VCP, name));
+ }
+
+ private native long _nodeDeviceLookupByName(long VCP, String name)
+ throws LibvirtException;
+
+ /**
+ * Creates a new node device from an XML description; works only
+ * for certain kinds of devices.
+ *
+ * @param xml XML description of the new device
+ * @param flags future flags, use 0 for now
+ * @return the new node device
+ * @throws LibvirtException
+ */
+ public NodeDevice nodeDeviceCreate(String xml, int flags) throws LibvirtException {
+ return new NodeDevice(this, _nodeDeviceCreate(VCP, xml, flags));
+ }
+
+ private native long _nodeDeviceCreate(long VCP, String xml, int flags)
+ throws LibvirtException;
}
diff --git a/src/org/libvirt/NodeDevice.java b/src/org/libvirt/NodeDevice.java
new file mode 100644
index 0000000..861ab4c
--- /dev/null
+++ b/src/org/libvirt/NodeDevice.java
@@ -0,0 +1,115 @@
+package org.libvirt;
+
+
+/**
+ * The NodeDevice object represents a device on the host machine (node).
+ *
+ * @author dlively
+ *
+ */
+public class NodeDevice {
+
+ /**
+ * the native virNodeDevicePtr.
+ */
+ private long VNDP;
+
+ /**
+ * The VirConnect Object
+ */
+ private Connect virConnect;
+
+
+ /**
+ * Constructs a VirNodeDevice object from a known native virNodeDevicePtr, and
+ * a VirConnect object. For use when native libvirt returns a virNodeDevicePtr,
+ * i.e. error handling.
+ *
+ * @param virConnect the Domain's hypervisor
+ * @param VNDP the native virNodeDevicePtr
+ */
+ NodeDevice(Connect virConnect, long VNDP){
+ this.virConnect = virConnect;
+ this.VNDP = VNDP;
+ }
+
+
+ /**
+ * Get device name
+ *
+ * @return the node device name
+ * @throws LibvirtException
+ */
+ public String getName() throws LibvirtException {
+ return _getName(VNDP);
+ }
+
+ private native String _getName(long VNDP) throws LibvirtException;
+
+
+ /**
+ * Get the name of device parent (if any)
+ *
+ * @return the parent's name, or NULL if no parent
+ * @throws LibvirtException
+ */
+ public String getParent() throws LibvirtException {
+ return _getParent(VNDP);
+ }
+
+ private native String _getParent(long VNDP) throws LibvirtException;
+
+
+ /**
+ * Lists capabilities supported by device
+ *
+ * @return an array of the capability names
+ * @throws LibvirtException
+ */
+ public String[] listCapabilities() throws LibvirtException {
+ return _listCapabilities(VNDP);
+ }
+
+ private native String[] _listCapabilities(long VNDP) throws LibvirtException;
+
+
+ /**
+ * Get number of capabilities supported by device
+ *
+ * @return the number of capabilities the device supports
+ * @throws LibvirtException
+ */
+ public int numOfCapabilities() throws LibvirtException {
+ return _numOfCapabilities(VNDP);
+ }
+
+ private native int _numOfCapabilities(long VNDP) throws LibvirtException;
+
+
+ /**
+ * Get XML describing device details
+ *
+ * @param flags future flags, use 0 for now
+ * @return an XML string describing the device details
+ * @throws LibvirtException
+ */
+ public String getXMLDesc(int flags) throws LibvirtException {
+ return _getXMLDesc(VNDP, flags);
+ }
+
+ private native String _getXMLDesc(long VNDP, int flags)
+ throws LibvirtException;
+
+
+ /**
+ * Tear down device created with Connect.nodeDeviceCreate()
+ *
+ * @param flags future flags, use 0 for now
+ * @throws LibvirtException
+ */
+ public void destroy(int flags) throws LibvirtException {
+ _destroy(VNDP, flags);
+ }
+
+ private native void _destroy(long VNDP, int flags) throws LibvirtException;
+}
--
Libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list