fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Common Development and Distribution License, Version 1.0 only
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (the "License"). You may not use this file except in compliance
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_jni_util.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <strings.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Package-private functions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c8e9ed14d97e244b9753db14caf8481f181f5750talleyvoid
c8e9ed14d97e244b9753db14caf8481f181f5750talleyzjni_free_array(void **array, zjni_free_f freefunc)
c8e9ed14d97e244b9753db14caf8481f181f5750talley{
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (array != NULL) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (freefunc != NULL) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley int i;
c8e9ed14d97e244b9753db14caf8481f181f5750talley for (i = 0; array[i] != NULL; i++) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley freefunc(array[i]);
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley free(array);
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley}
c8e9ed14d97e244b9753db14caf8481f181f5750talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*PRINTFLIKE2*/
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_throw_exception(JNIEnv *env, const char *fmt, ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char error[1024];
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_list ap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_UnsupportedOperationException;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_start(ap, fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) vsnprintf(error, sizeof (error), fmt, ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_end(ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens class_UnsupportedOperationException =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->FindClass(env, "java/lang/UnsupportedOperationException");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->ThrowNew(env, class_UnsupportedOperationException, error);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjstring
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_get_matched_string(JNIEnv *env, char *name, regmatch_t *match)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring stringUTF = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (match->rm_so != -1 && match->rm_eo != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *end = name + match->rm_eo;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char tmp = *end;
fa9e4066f08beec538e775443c5be79dd423fcabahrens *end = '\0';
fa9e4066f08beec538e775443c5be79dd423fcabahrens stringUTF = (*env)->NewStringUTF(env, name + match->rm_so);
fa9e4066f08beec538e775443c5be79dd423fcabahrens *end = tmp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (stringUTF);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_get_dataset_from_snapshot(const char *snapshot, char *dataset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t len)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *at;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy(dataset, snapshot, len);
fa9e4066f08beec538e775443c5be79dd423fcabahrens at = strchr(dataset, '@');
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (at != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens *at = '\0';
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Convert a zjni_Collection to a (Java) array */
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobjectArray
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_Collection_to_array(JNIEnv *env, zjni_Collection_t *list, char *class)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Get size of zjni_Collection */
fa9e4066f08beec538e775443c5be79dd423fcabahrens jint length = (*env)->CallIntMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ((zjni_Object_t *)list)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)list)->method_size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create array to hold elements of list */
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobjectArray array = (*env)->NewObjectArray(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, length, (*env)->FindClass(env, class), NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Copy list elements to array */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (*env)->CallObjectMethod(env, ((zjni_Object_t *)list)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)list)->method_toArray, array);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Create a zjni_Collection */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensnew_Collection(JNIEnv *env, zjni_Collection_t *collection)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_Object_t *object = (zjni_Object_t *)collection;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens collection->method_add = (*env)->GetMethodID(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, object->class, "add", "(Ljava/lang/Object;)Z");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens collection->method_size =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, object->class, "size", "()I");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens collection->method_toArray =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, object->class, "toArray",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "([Ljava/lang/Object;)[Ljava/lang/Object;");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Create an zjni_ArrayList */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_new_ArrayList(JNIEnv *env, zjni_ArrayList_t *list)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_Object_t *object = (zjni_Object_t *)list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (object->object == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->class = (*env)->FindClass(env, "java/util/ArrayList");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->constructor =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->object = (*env)->NewObject(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, object->class, object->constructor);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_Collection(env, (zjni_Collection_t *)list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Create an zjni_DatasetSet */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_new_DatasetSet(JNIEnv *env, zjni_DatasetSet_t *list)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_Object_t *object = (zjni_Object_t *)list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (object->object == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->class = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, "com/sun/zfs/common/util/DatasetSet");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->constructor =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens object->object = (*env)->NewObject(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, object->class, object->constructor);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_Collection(env, (zjni_Collection_t *)list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_int_to_boolean(JNIEnv *env, uint64_t value)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_Boolean = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, "java/lang/Boolean");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jfieldID id = (*env)->GetStaticFieldID(env, class_Boolean,
fa9e4066f08beec538e775443c5be79dd423fcabahrens value ? "TRUE" : "FALSE", "Ljava/lang/Boolean;");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (*env)->GetStaticObjectField(env, class_Boolean, id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fbfd10ff571cfd0139aa5127460f1b8a53dac971talleyjobject
fbfd10ff571cfd0139aa5127460f1b8a53dac971talleyzjni_int_to_enum(JNIEnv *env, int value, char *class_name,
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley char *default_field_name, zjni_field_mapping_t *mapping)
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley{
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley int i;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley char *field_name;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley jclass class;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley jfieldID id;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley jobject field_value = NULL;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley int found = 0;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley for (i = 0; mapping[i].name != NULL; i++) {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley if (value == mapping[i].value) {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley field_name = mapping[i].name;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley found = 1;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley break;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley }
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley }
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley if (!found) {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley field_name = default_field_name;
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley }
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley if (field_name != NULL) {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley char signature[1024];
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley (void) snprintf(signature, sizeof (signature), "L%s;",
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley class_name);
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley class = (*env)->FindClass(env, class_name);
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley id = (*env)->GetStaticFieldID(
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley env, class, field_name, signature);
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley field_value = (*env)->GetStaticObjectField(env, class, id);
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley }
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley return (field_value);
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley}
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_str_to_long(JNIEnv *env, char *str)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject value = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_Long = (*env)->FindClass(env, "java/lang/Long");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID method_valueOf = (*env)->GetStaticMethodID(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens class_Long, "valueOf", "(Ljava/lang/String;)Ljava/lang/Long;");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring utf = (*env)->NewStringUTF(env, str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* May throw a NumberFormatException */
fa9e4066f08beec538e775443c5be79dd423fcabahrens value = (*env)->CallStaticObjectMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Long, method_valueOf, utf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_long_to_Long(JNIEnv *env, uint64_t value)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_Long = (*env)->FindClass(env, "java/lang/Long");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID constructor_Long = (*env)->GetMethodID(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Long, "<init>", "(J)V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject obj = (*env)->NewObject(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Long, constructor_Long, value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_str_to_date(JNIEnv *env, char *str)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject date = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_Long = (*env)->FindClass(env, "java/lang/Long");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID method_parseLong = (*env)->GetStaticMethodID(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens class_Long, "parseLong", "(Ljava/lang/String;)J");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring utf = (*env)->NewStringUTF(env, str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (utf != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* May throw a NumberFormatException */
fa9e4066f08beec538e775443c5be79dd423fcabahrens jlong time = (*env)->CallStaticLongMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Long, method_parseLong, utf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((*env)->ExceptionOccurred(env) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_Date = (*env)->FindClass(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "java/util/Date");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID constructor_Date = (*env)->GetMethodID(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Date, "<init>", "(J)V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Date constructor takes epoch milliseconds */
fa9e4066f08beec538e775443c5be79dd423fcabahrens time *= 1000;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens date = (*env)->NewObject(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_Date, constructor_Date, time);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (date);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobjectArray
c8e9ed14d97e244b9753db14caf8481f181f5750talleyzjni_c_string_array_to_java(JNIEnv *env, char **array, int n)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_String = (*env)->FindClass(env, "java/lang/String");
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobjectArray jarray =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->NewObjectArray(env, n, class_String, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < n; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring elementUTF = (*env)->NewStringUTF(env, array[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) (*env)->SetObjectArrayElement(env, jarray, i,
fa9e4066f08beec538e775443c5be79dd423fcabahrens elementUTF);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (jarray);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c8e9ed14d97e244b9753db14caf8481f181f5750talley/*
c8e9ed14d97e244b9753db14caf8481f181f5750talley * Converts the non-null elements of the given Java String array into
c8e9ed14d97e244b9753db14caf8481f181f5750talley * a NULL-terminated char* array. When done, each element and then
c8e9ed14d97e244b9753db14caf8481f181f5750talley * the array itself must be free()d. Returns NULL if memory could not
c8e9ed14d97e244b9753db14caf8481f181f5750talley * be allocated.
c8e9ed14d97e244b9753db14caf8481f181f5750talley */
c8e9ed14d97e244b9753db14caf8481f181f5750talleychar **
c8e9ed14d97e244b9753db14caf8481f181f5750talleyzjni_java_string_array_to_c(JNIEnv *env, jobjectArray array)
c8e9ed14d97e244b9753db14caf8481f181f5750talley{
c8e9ed14d97e244b9753db14caf8481f181f5750talley int i, n;
c8e9ed14d97e244b9753db14caf8481f181f5750talley jsize length = (*env)->GetArrayLength(env, array);
c8e9ed14d97e244b9753db14caf8481f181f5750talley char **result = (char **)calloc(length + 1, sizeof (char *));
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (result != NULL) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley for (i = 0, n = 0; i < length; i++) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley jboolean isCopy;
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley /* Retrive String from array */
c8e9ed14d97e244b9753db14caf8481f181f5750talley jstring string = (*env)->GetObjectArrayElement(
c8e9ed14d97e244b9753db14caf8481f181f5750talley env, array, i);
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (string != NULL) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley /* Convert to char* */
c8e9ed14d97e244b9753db14caf8481f181f5750talley const char *converted =
c8e9ed14d97e244b9753db14caf8481f181f5750talley (*env)->GetStringUTFChars(env, string,
c8e9ed14d97e244b9753db14caf8481f181f5750talley &isCopy);
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley result[n] = strdup(converted);
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (isCopy == JNI_TRUE) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley /* Free chars in Java space */
c8e9ed14d97e244b9753db14caf8481f181f5750talley (void) (*env)->ReleaseStringUTFChars(
c8e9ed14d97e244b9753db14caf8481f181f5750talley env, string, converted);
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley if (result[n++] == NULL) {
c8e9ed14d97e244b9753db14caf8481f181f5750talley /* strdup failed */
c8e9ed14d97e244b9753db14caf8481f181f5750talley zjni_free_array((void *)result, free);
c8e9ed14d97e244b9753db14caf8481f181f5750talley break;
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley /* Terminate array */
c8e9ed14d97e244b9753db14caf8481f181f5750talley result[n] = NULL;
c8e9ed14d97e244b9753db14caf8481f181f5750talley }
c8e9ed14d97e244b9753db14caf8481f181f5750talley
c8e9ed14d97e244b9753db14caf8481f181f5750talley return (result);
c8e9ed14d97e244b9753db14caf8481f181f5750talley}
c8e9ed14d97e244b9753db14caf8481f181f5750talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Counts the number of elements in the given NULL-terminated array.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Does not include the terminating NULL in the count.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_count_elements(void **array)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (array != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (; array[i] != NULL; i++);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (i);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Get a handle to the next nvpair with the specified name and data
fa9e4066f08beec538e775443c5be79dd423fcabahrens * type in the list following the given nvpair.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This function is needed because the nvlist_lookup_* routines can
fa9e4066f08beec538e775443c5be79dd423fcabahrens * only be used with nvlists allocated with NV_UNIQUE_NAME or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * NV_UNIQUE_NAME_TYPE, ie. lists of unique name/value pairs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Some variation of this function will likely appear in the libnvpair
fa9e4066f08beec538e775443c5be79dd423fcabahrens * library per 4981923.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * @param nvl
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the nvlist_t to search
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * @param name
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the string key for the pair to find in the list, or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * NULL to match any name
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * @param type
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the data type for the pair to find in the list, or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * DATA_TYPE_UNKNOWN to match any type
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * @param nvp
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the pair to search from in the list, or NULL to search
fa9e4066f08beec538e775443c5be79dd423fcabahrens * from the beginning of the list
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * @return the next nvpair in the list matching the given
fa9e4066f08beec538e775443c5be79dd423fcabahrens * criteria, or NULL if no matching nvpair is found
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensnvpair_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_nvlist_walk_nvpair(nvlist_t *nvl, const char *name, data_type_t type,
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *nvp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* For each nvpair in the list following nvp... */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Does this pair's name match the given name? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((name == NULL || strcmp(nvpair_name(nvp), name) == 0) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Does this pair's type match the given type? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (type == DATA_TYPE_UNKNOWN || type == nvpair_type(nvp))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (nvp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}