sigar/bindings/java/src/jni/vmware/javavmware.c

749 lines
16 KiB
C
Raw Normal View History

/*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of SIGAR.
*
* SIGAR is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
#include <jni.h>
#include <stdlib.h>
#include "vmcontrol_wrapper.h"
#ifdef VMCONTROL_WRAPPER_SUPPORTED
#define JENV (*env)
#define VMWARE_PACKAGE "org/hyperic/sigar/vmware/"
#define VMWARE_JNI(m) JNICALL Java_org_hyperic_sigar_vmware_##m
#define VMWARE_FIND_CLASS(name) \
JENV->FindClass(env, VMWARE_PACKAGE name)
#define VMWARE_CLASS_SIG(name) \
"L" VMWARE_PACKAGE name ";"
#define VMWARE_EX_SERVER 1
#define VMWARE_EX_VM 2
static void vmware_throw_last_error(JNIEnv *env, void *ptr, int type)
{
jclass errorClass = VMWARE_FIND_CLASS("VMwareException");
char *msg;
int retval;
switch (type) {
case VMWARE_EX_SERVER:
retval = VMControl_ServerGetLastError((VMControlServer *)ptr,
&msg);
break;
case VMWARE_EX_VM:
retval = VMControl_VMGetLastError((VMControlVM *)ptr,
&msg);
break;
}
JENV->ThrowNew(env, errorClass, msg);
free(msg);
}
#define vmware_throw_last_vm_error() \
vmware_throw_last_error(env, vm, VMWARE_EX_VM);
#define vmware_throw_last_server_error() \
vmware_throw_last_error(env, server, VMWARE_EX_SERVER)
static jint vmware_get_pointer(JNIEnv *env, jobject obj)
{
jclass cls = JENV->GetObjectClass(env, obj);
jfieldID field = JENV->GetFieldID(env, cls, "ptr", "I");
return JENV->GetIntField(env, obj, field);
}
#define dVM(obj) \
VMControlVM *vm = \
(VMControlVM *)vmware_get_pointer(env, obj)
#define dSERVER(obj) \
VMControlServer *server = \
(VMControlServer *)vmware_get_pointer(env, obj)
#define dPARAMS(obj) \
VMControlConnectParams *params = \
(VMControlConnectParams *)vmware_get_pointer(env, obj)
JNIEXPORT jboolean VMWARE_JNI(VMwareObject_init)
(JNIEnv *env, jclass classinstance, jstring jlib)
{
const char *lib;
int retval;
if (jlib) {
lib = JENV->GetStringUTFChars(env, jlib, NULL);
}
else {
lib = getenv("VMCONTROL_SHLIB");
}
retval = vmcontrol_wrapper_api_init(lib);
if (jlib) {
JENV->ReleaseStringUTFChars(env, jlib, lib);
}
if (retval != 0) {
return JNI_FALSE;
}
return VMControl_Init() && VMControl_VMInit();
}
JNIEXPORT jint VMWARE_JNI(ConnectParams_create)
(JNIEnv *env, jclass classinstance,
jstring jhost, jint port, jstring juser, jstring jpass)
{
jint ptr;
const char *host=NULL;
const char *user=NULL;
const char *pass=NULL;
if (jhost) {
host = JENV->GetStringUTFChars(env, jhost, NULL);
}
if (juser) {
user = JENV->GetStringUTFChars(env, juser, NULL);
}
if (jpass) {
pass = JENV->GetStringUTFChars(env, jpass, NULL);
}
ptr = (jint)VMControl_ConnectParamsNew(host, port, user, pass);
if (host) {
JENV->ReleaseStringUTFChars(env, jhost, host);
}
if (user) {
JENV->ReleaseStringUTFChars(env, juser, user);
}
if (pass) {
JENV->ReleaseStringUTFChars(env, jpass, pass);
}
return ptr;
}
JNIEXPORT void VMWARE_JNI(ConnectParams_destroy)
(JNIEnv *env, jobject obj)
{
dPARAMS(obj);
VMControl_ConnectParamsDestroy(params);
}
JNIEXPORT jint VMWARE_JNI(VMwareServer_create)
(JNIEnv *env, jclass classinstance)
{
return (jint)VMControl_ServerNewEx();
}
JNIEXPORT void VMWARE_JNI(VMwareServer_destroy)
(JNIEnv *env, jclass obj)
{
dSERVER(obj);
VMControl_ServerDestroy(server);
}
JNIEXPORT void VMWARE_JNI(VMwareServer_disconnect)
(JNIEnv *env, jclass obj)
{
dSERVER(obj);
VMControl_ServerDisconnect(server);
}
JNIEXPORT jboolean VMWARE_JNI(VMwareServer_isConnected)
(JNIEnv *env, jclass obj)
{
dSERVER(obj);
return VMControl_ServerIsConnected(server);
}
JNIEXPORT void VMWARE_JNI(VMwareServer_connect)
(JNIEnv *env, jobject obj, jobject params_obj)
{
dSERVER(obj);
dPARAMS(params_obj);
if (!VMControl_ServerConnectEx(server, params)) {
vmware_throw_last_server_error();
}
}
JNIEXPORT jboolean VMWARE_JNI(VMwareServer_isRegistered)
(JNIEnv *env, jclass obj, jstring jconfig)
{
dSERVER(obj);
const char *config =
JENV->GetStringUTFChars(env, jconfig, NULL);
jboolean value;
jboolean retval =
VMControl_ServerIsRegistered(server, config, &value);
JENV->ReleaseStringUTFChars(env, jconfig, config);
if (!retval) {
vmware_throw_last_server_error();
return JNI_FALSE;
}
return value;
}
JNIEXPORT jobject VMWARE_JNI(VMwareServer_getRegisteredVmNames)
(JNIEnv *env, jclass obj)
{
dSERVER(obj);
char **ptr, **names;
jobject listobj;
jclass listclass =
JENV->FindClass(env, "java/util/ArrayList");
jmethodID listid =
JENV->GetMethodID(env, listclass, "<init>", "()V");
jmethodID addid =
JENV->GetMethodID(env, listclass, "add",
"(Ljava/lang/Object;)Z");
listobj = JENV->NewObject(env, listclass, listid);
ptr = names = VMControl_ServerEnumerate(server);
if (ptr) {
while (*ptr) {
JENV->CallBooleanMethod(env, listobj, addid,
JENV->NewStringUTF(env, *ptr));
if (JENV->ExceptionOccurred(env)) {
JENV->ExceptionDescribe(env);
}
free(*ptr);
ptr++;
}
free(names);
}
return listobj;
}
JNIEXPORT jstring VMWARE_JNI(VMwareServer_getResource)
(JNIEnv *env, jclass obj, jstring jkey)
{
dSERVER(obj);
jstring retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
char *value =
VMControl_ServerGetResource(server, (char *)key);
JENV->ReleaseStringUTFChars(env, jkey, key);
if (!value) {
vmware_throw_last_server_error();
return NULL;
}
retval = JENV->NewStringUTF(env, value);
free(value);
return retval;
}
JNIEXPORT jstring VMWARE_JNI(VMwareServer_exec)
(JNIEnv *env, jclass obj, jstring jxml)
{
dSERVER(obj);
jstring retval;
const char *xml =
JENV->GetStringUTFChars(env, jxml, NULL);
char *value =
VMControl_ServerExec(server, xml);
JENV->ReleaseStringUTFChars(env, jxml, xml);
if (!value) {
vmware_throw_last_server_error();
return NULL;
}
retval = JENV->NewStringUTF(env, value);
free(value);
return retval;
}
JNIEXPORT jint VMWARE_JNI(VM_create)
(JNIEnv *env, jclass classinstance)
{
return (jint)VMControl_VMNewEx();
}
JNIEXPORT void VMWARE_JNI(VM_destroy)
(JNIEnv *env, jclass obj)
{
dVM(obj);
VMControl_VMDestroy(vm);
}
JNIEXPORT void VMWARE_JNI(VM_disconnect)
(JNIEnv *env, jclass obj)
{
dVM(obj);
VMControl_VMDisconnect(vm);
}
JNIEXPORT jboolean VMWARE_JNI(VM_isConnected)
(JNIEnv *env, jclass obj)
{
dVM(obj);
return VMControl_VMIsConnected(vm);
}
JNIEXPORT void VMWARE_JNI(VM_connect)
(JNIEnv *env, jobject obj, jobject params_obj,
jstring jconfig, jint mks)
{
dVM(obj);
dPARAMS(params_obj);
const char *config =
JENV->GetStringUTFChars(env, jconfig, NULL);
jboolean retval =
VMControl_VMConnectEx(vm, params, config, mks);
JENV->ReleaseStringUTFChars(env, jconfig, config);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT jint VMWARE_JNI(VM_getExecutionState)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int state;
if (!VMControl_VMGetExecutionState(vm, &state)) {
vmware_throw_last_vm_error();
return -1;
}
return state;
}
JNIEXPORT jint VMWARE_JNI(VM_getRemoteConnections)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int num;
if (!VMControl_VMGetRemoteConnections(vm, &num)) {
vmware_throw_last_vm_error();
return -1;
}
return num;
}
JNIEXPORT jint VMWARE_JNI(VM_getUptime)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int uptime;
if (!VMControl_VMGetUptime(vm, &uptime)) {
vmware_throw_last_vm_error();
return -1;
}
return uptime;
}
JNIEXPORT jint VMWARE_JNI(VM_getHeartbeat)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int heartbeat;
if (!VMControl_VMGetHeartbeat(vm, &heartbeat)) {
vmware_throw_last_vm_error();
return -1;
}
return heartbeat;
}
JNIEXPORT jint VMWARE_JNI(VM_getToolsLastActive)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int seconds;
if (!VMControl_VMToolsLastActive(vm, &seconds)) {
vmware_throw_last_vm_error();
return -1;
}
return seconds;
}
JNIEXPORT jstring VMWARE_JNI(VM_getRunAsUser)
(JNIEnv *env, jclass obj)
{
dVM(obj);
char *user;
jstring juser;
if (!VMControl_VMGetRunAsUser(vm, &user)) {
vmware_throw_last_vm_error();
return NULL;
}
juser = JENV->NewStringUTF(env, user);
free(user);
return juser;
}
JNIEXPORT jint VMWARE_JNI(VM_getPermissions)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int permissions;
if (!VMControl_VMGetCapabilities(vm, &permissions)) {
vmware_throw_last_vm_error();
return -1;
}
return permissions;
}
JNIEXPORT jstring VMWARE_JNI(VM_getConfig)
(JNIEnv *env, jclass obj, jstring jkey)
{
dVM(obj);
jstring retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
char *value =
VMControl_VMGetConfig(vm, (char *)key);
JENV->ReleaseStringUTFChars(env, jkey, key);
if (!value) {
vmware_throw_last_vm_error();
return NULL;
}
retval = JENV->NewStringUTF(env, value);
free(value);
return retval;
}
JNIEXPORT void VMWARE_JNI(VM_setConfig)
(JNIEnv *env, jclass obj, jstring jkey, jstring jvalue)
{
dVM(obj);
jboolean retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
const char *value =
JENV->GetStringUTFChars(env, jvalue, NULL);
retval = VMControl_VMSetConfig(vm, (char *)key, (char *)value);
JENV->ReleaseStringUTFChars(env, jkey, key);
JENV->ReleaseStringUTFChars(env, jvalue, value);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT jstring VMWARE_JNI(VM_getResource)
(JNIEnv *env, jclass obj, jstring jkey)
{
dVM(obj);
jstring retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
char *value =
VMControl_VMGetResource(vm, (char *)key);
JENV->ReleaseStringUTFChars(env, jkey, key);
if (!value) {
vmware_throw_last_vm_error();
return NULL;
}
retval = JENV->NewStringUTF(env, value);
free(value);
return retval;
}
JNIEXPORT jstring VMWARE_JNI(VM_getGuestInfo)
(JNIEnv *env, jclass obj, jstring jkey)
{
dVM(obj);
jstring retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
char *value =
VMControl_VMGetGuestInfo(vm, (char *)key);
JENV->ReleaseStringUTFChars(env, jkey, key);
if (!value) {
vmware_throw_last_vm_error();
return NULL;
}
retval = JENV->NewStringUTF(env, value);
free(value);
return retval;
}
JNIEXPORT void VMWARE_JNI(VM_setGuestInfo)
(JNIEnv *env, jclass obj, jstring jkey, jstring jvalue)
{
dVM(obj);
jboolean retval;
const char *key =
JENV->GetStringUTFChars(env, jkey, NULL);
const char *value =
JENV->GetStringUTFChars(env, jvalue, NULL);
retval = VMControl_VMSetGuestInfo(vm, (char *)key, (char *)value);
JENV->ReleaseStringUTFChars(env, jkey, key);
JENV->ReleaseStringUTFChars(env, jvalue, value);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT jint VMWARE_JNI(VM_getProductInfo)
(JNIEnv *env, jclass obj, jint type)
{
dVM(obj);
unsigned int value;
if (!VMControl_VMGetProductInfo(vm, type, &value)) {
vmware_throw_last_vm_error();
return -1;
}
return value;
}
JNIEXPORT void VMWARE_JNI(VM_start)
(JNIEnv *env, jclass obj, jint mode)
{
dVM(obj);
if (!VMControl_VMStart(vm, mode)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_stop)
(JNIEnv *env, jclass obj, jint mode)
{
dVM(obj);
if (!VMControl_VMStopOrReset(vm, 1, mode)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_reset)
(JNIEnv *env, jclass obj, jint mode)
{
dVM(obj);
if (!VMControl_VMStopOrReset(vm, 0, mode)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_suspend)
(JNIEnv *env, jclass obj, jint mode)
{
dVM(obj);
if (!VMControl_VMSuspendToDisk(vm, mode)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_createSnapshot)
(JNIEnv *env, jclass obj,
jstring jname, jstring jdescr,
jboolean quiesce, jboolean memory)
{
dVM(obj);
const char *name =
JENV->GetStringUTFChars(env, jname, NULL);
const char *descr =
JENV->GetStringUTFChars(env, jdescr, NULL);
if (!VMControl_VMCreateSnapshot(vm, name, descr, quiesce, memory)) {
vmware_throw_last_vm_error();
}
JENV->ReleaseStringUTFChars(env, jname, name);
JENV->ReleaseStringUTFChars(env, jdescr, descr);
}
JNIEXPORT void VMWARE_JNI(VM_revertToSnapshot)
(JNIEnv *env, jclass obj)
{
dVM(obj);
if (!VMControl_VMRevertToSnapshot(vm)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_removeAllSnapshots)
(JNIEnv *env, jclass obj)
{
dVM(obj);
if (!VMControl_VMRemoveAllSnapshots(vm)) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT jboolean VMWARE_JNI(VM_hasSnapshot)
(JNIEnv *env, jclass obj)
{
dVM(obj);
jboolean value;
if (!VMControl_VMHasSnapshot(vm, &value)) {
vmware_throw_last_vm_error();
return JNI_FALSE;
}
return value;
}
JNIEXPORT jlong VMWARE_JNI(VM_getPid)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int pid;
if (!VMControl_VMGetPid(vm, &pid)) {
vmware_throw_last_vm_error();
return -1;
}
return (jlong)pid;
}
JNIEXPORT jint VMWARE_JNI(VM_getId)
(JNIEnv *env, jclass obj)
{
dVM(obj);
unsigned int id;
if (!VMControl_VMGetId(vm, &id)) {
vmware_throw_last_vm_error();
return -1;
}
return id;
}
JNIEXPORT void VMWARE_JNI(VM_saveScreenshot)
(JNIEnv *env, jclass obj, jstring jname)
{
dVM(obj);
jboolean retval;
const char *name =
JENV->GetStringUTFChars(env, jname, NULL);
retval = VMControl_MKSSaveScreenshot(vm, name, "PNG");
JENV->ReleaseStringUTFChars(env, jname, name);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_deviceConnect)
(JNIEnv *env, jclass obj, jstring jdevice)
{
dVM(obj);
const char *device =
JENV->GetStringUTFChars(env, jdevice, NULL);
jboolean retval =
VMControl_VMDeviceConnect(vm, device);
JENV->ReleaseStringUTFChars(env, jdevice, device);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT void VMWARE_JNI(VM_deviceDisconnect)
(JNIEnv *env, jclass obj, jstring jdevice)
{
dVM(obj);
const char *device =
JENV->GetStringUTFChars(env, jdevice, NULL);
jboolean retval =
VMControl_VMDeviceDisconnect(vm, device);
JENV->ReleaseStringUTFChars(env, jdevice, device);
if (!retval) {
vmware_throw_last_vm_error();
}
}
JNIEXPORT jboolean VMWARE_JNI(VM_deviceIsConnected)
(JNIEnv *env, jclass obj, jstring jdevice)
{
dVM(obj);
const char *device =
JENV->GetStringUTFChars(env, jdevice, NULL);
jboolean isConnected;
jboolean retval =
VMControl_VMDeviceIsConnected(vm, device,
&isConnected);
JENV->ReleaseStringUTFChars(env, jdevice, device);
if (!retval) {
vmware_throw_last_vm_error();
return JNI_FALSE;
}
return isConnected;
}
#endif /* VMCONTROL_WRAPPER_SUPPORTED */