fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
66e2aacc02a4625d105fb249ad16c27e79604ff2gw * Common Development and Distribution License (the "License").
66e2aacc02a4625d105fb249ad16c27e79604ff2gw * You may not use this file except in compliance 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/*
27dd1e87cd3d939264769dd4af7e6a529cde001fMark Shellenbaum * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens * Copyright (c) 2015 by Delphix. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_jni_property.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_jni_util.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <strings.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley/*
dc307942eac821bc70a7a69cbb1ddec4184607c1talley * Types
dc307942eac821bc70a7a69cbb1ddec4184607c1talley */
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley/* Signature for function to convert string to a specific Java object */
dc307942eac821bc70a7a69cbb1ddec4184607c1talleytypedef jobject (*str_to_obj_f)(JNIEnv *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley/* Signature for function to convert uint64_t to a specific Java object */
dc307942eac821bc70a7a69cbb1ddec4184607c1talleytypedef jobject (*uint64_to_obj_f)(JNIEnv *, uint64_t);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley/*
dc307942eac821bc70a7a69cbb1ddec4184607c1talley * Describes a property and the parameters needed to create a Java
dc307942eac821bc70a7a69cbb1ddec4184607c1talley * Property object for it
dc307942eac821bc70a7a69cbb1ddec4184607c1talley */
dc307942eac821bc70a7a69cbb1ddec4184607c1talleytypedef struct custom_prop_desct {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zfs_prop_t prop;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f convert_str;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley uint64_to_obj_f convert_uint64;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *propClass;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *valueClass;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley} custom_prop_desct_t;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Function prototypes
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject create_BasicProperty(JNIEnv *, zfs_handle_t *,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_BooleanProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_LongProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_StringProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject create_ObjectProperty(JNIEnv *, zfs_handle_t *,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject create_default_BasicProperty(JNIEnv *, zfs_prop_t,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f, uint64_to_obj_f, char *, char *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_default_BooleanProperty(JNIEnv *, zfs_prop_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_default_LongProperty(JNIEnv *, zfs_prop_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_default_StringProperty(JNIEnv *, zfs_prop_t);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject create_default_ObjectProperty(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley JNIEnv *, zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_enum_element(JNIEnv *, char *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_aclinherit(JNIEnv *, char *);
a3c49ce110f325a563c245bedc4d533adddb7211Albert Leestatic jobject str_to_aclmode(JNIEnv *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_checksum(JNIEnv *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_compression(JNIEnv *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_snapdir(JNIEnv *, char *);
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject str_to_string(JNIEnv *, char *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Static data
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenszfs_prop_t props_boolean[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_ATIME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_DEVICES,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_EXEC,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_MOUNTED,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_READONLY,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_SETUID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_ZONED,
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby ZFS_PROP_DEFER_DESTROY,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPROP_INVAL
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenszfs_prop_t props_long[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_AVAILABLE,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFS_PROP_CREATETXG,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_QUOTA,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_REFERENCED,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_RESERVATION,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_USED,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_VOLSIZE,
a9799022bd90b13722204e80112efaa5bf573099ck ZFS_PROP_REFQUOTA,
a9799022bd90b13722204e80112efaa5bf573099ck ZFS_PROP_REFRESERVATION,
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby ZFS_PROP_USERREFS,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPROP_INVAL
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenszfs_prop_t props_string[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_ORIGIN,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley /* ZFS_PROP_TYPE, */
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPROP_INVAL
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycustom_prop_desct_t props_custom[] = {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_ACLINHERIT, str_to_aclinherit, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "AclInheritProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee { ZFS_PROP_ACLMODE, str_to_aclmode, NULL,
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee ZFSJNI_PACKAGE_DATA "AclModeProperty",
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee ZFSJNI_PACKAGE_DATA "AclModeProperty$AclMode" },
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_CHECKSUM, str_to_checksum, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "ChecksumProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_COMPRESSION, str_to_compression, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "CompressionProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_COMPRESSRATIO, NULL, zjni_long_to_Long,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "CompressRatioProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/Long" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_CREATION, zjni_str_to_date, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "CreationProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/util/Date" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_MOUNTPOINT, str_to_string, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "MountPointProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/String" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_RECORDSIZE, NULL, zjni_long_to_Long,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "RecordSizeProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/Long" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_SHARENFS, str_to_string, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "ShareNFSProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/String" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_SNAPDIR, str_to_snapdir, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "SnapDirProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley { ZFS_PROP_VOLBLOCKSIZE, NULL, zjni_long_to_Long,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "VolBlockSizeProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/Long" },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_INVAL, NULL, NULL, NULL, NULL },
dc307942eac821bc70a7a69cbb1ddec4184607c1talley};
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Static functions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_BasicProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *propClass, char *valueClass)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject propertyObject = NULL;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char source[ZFS_MAX_DATASET_NAME_LEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_source_t srctype;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject propValue = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (convert_str != NULL) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char propbuf[ZFS_MAXPROPLEN];
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int result = zfs_prop_get(zhp, prop, propbuf,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens sizeof (propbuf), &srctype, source, sizeof (source), 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (result == 0)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens propValue = convert_str(env, propbuf);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens uint64_t value;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int result = zfs_prop_get_numeric(
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens zhp, prop, &value, &srctype, source, sizeof (source));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (result == 0)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens propValue = convert_uint64(env, value);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley }
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (propValue != NULL) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jmethodID constructor;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char signature[1024];
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jclass class = (*env)->FindClass(env, propClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring propName = (*env)->NewStringUTF(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, zfs_prop_to_name(prop));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens jboolean readOnly = zfs_prop_readonly(prop) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens JNI_TRUE : JNI_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling if (srctype == ZPROP_SRC_INHERITED) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring propSource = (*env)->NewStringUTF(env, source);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(Ljava/lang/String;L%s;ZLjava/lang/String;)V",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley valueClass);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens propertyObject = (*env)->NewObject(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, constructor, propName, propValue,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley readOnly, propSource);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley jobject lineage = zjni_int_to_Lineage(env, srctype);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(Ljava/lang/String;L%s;ZL"
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley valueClass);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens propertyObject = (*env)->NewObject(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, constructor, propName, propValue,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley readOnly, lineage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (propertyObject);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_BooleanProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_BasicProperty(env, zhp, prop, NULL, zjni_int_to_boolean,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "BooleanProperty", "java/lang/Boolean"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_LongProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_BasicProperty(env, zhp, prop, NULL, zjni_long_to_Long,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "LongProperty", "java/lang/Long"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_StringProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_BasicProperty(env, zhp, prop, str_to_string, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_ObjectProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *propClass, char *valueClass)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject propertyObject = NULL;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char source[ZFS_MAX_DATASET_NAME_LEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_source_t srctype;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject propValue = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (convert_str != NULL) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens char propbuf[ZFS_MAXPROPLEN];
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int result = zfs_prop_get(zhp, prop, propbuf,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens sizeof (propbuf), &srctype, source, sizeof (source), 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (result == 0)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens propValue = convert_str(env, propbuf);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens uint64_t value;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int result = zfs_prop_get_numeric(
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens zhp, prop, &value, &srctype, source, sizeof (source));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (result == 0)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens propValue = convert_uint64(env, value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (propValue != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jmethodID constructor;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char signature[1024];
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jclass class = (*env)->FindClass(env, propClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling if (srctype == ZPROP_SRC_INHERITED) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jstring propSource = (*env)->NewStringUTF(env, source);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(L%s;Ljava/lang/String;)V", valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propertyObject = (*env)->NewObject(env,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley class, constructor, propValue, propSource);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley jobject lineage = zjni_int_to_Lineage(env, srctype);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propertyObject = (*env)->NewObject(env,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley class, constructor, propValue, lineage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (propertyObject);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_default_BasicProperty(JNIEnv *env, zfs_prop_t prop,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *propClass, char *valueClass)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject propertyObject = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (!zfs_prop_readonly(prop)) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject propValue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (convert_str != NULL) {
7f7322febbcfe774b7270abc3b191c094bfcc517eschrock char *propbuf = (char *)zfs_prop_default_string(prop);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propValue = convert_str(env, propbuf);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley uint64_t value = zfs_prop_default_numeric(prop);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propValue = convert_uint64(env, value);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (propValue != NULL) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char signature[1024];
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jmethodID constructor;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jstring propName =
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jboolean readOnly = zfs_prop_readonly(prop) ?
dc307942eac821bc70a7a69cbb1ddec4184607c1talley JNI_TRUE : JNI_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jclass class = (*env)->FindClass(env, propClass);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject lineage =
990b4856d0eaada6f8140335733a1b1771ed2746lling zjni_int_to_Lineage(env, ZPROP_SRC_DEFAULT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(Ljava/lang/String;L%s;ZL" ZFSJNI_PACKAGE_DATA
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "Property$Lineage;)V", valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens propertyObject = (*env)->NewObject(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, constructor,
fa9e4066f08beec538e775443c5be79dd423fcabahrens propName, propValue, readOnly, lineage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (propertyObject);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_default_BooleanProperty(JNIEnv *env, zfs_prop_t prop)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_default_BasicProperty(env, prop, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zjni_int_to_boolean, ZFSJNI_PACKAGE_DATA "BooleanProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/Boolean"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_default_LongProperty(JNIEnv *env, zfs_prop_t prop)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_default_BasicProperty(env, prop, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zjni_long_to_Long, ZFSJNI_PACKAGE_DATA "LongProperty",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "java/lang/Long"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_default_StringProperty(JNIEnv *env, zfs_prop_t prop)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (create_default_BasicProperty(env, prop, str_to_string, NULL,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleycreate_default_ObjectProperty(JNIEnv *env, zfs_prop_t prop,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char *propClass, char *valueClass)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject propertyObject = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (!zfs_prop_readonly(prop)) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject propValue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (convert_str != NULL) {
7f7322febbcfe774b7270abc3b191c094bfcc517eschrock char *propbuf = (char *)zfs_prop_default_string(prop);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propValue = convert_str(env, propbuf);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley uint64_t value = zfs_prop_default_numeric(prop);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propValue = convert_uint64(env, value);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (propValue != NULL) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char signature[1024];
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jmethodID constructor;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jclass class = (*env)->FindClass(env, propClass);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jobject lineage =
990b4856d0eaada6f8140335733a1b1771ed2746lling zjni_int_to_Lineage(env, ZPROP_SRC_DEFAULT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
dc307942eac821bc70a7a69cbb1ddec4184607c1talley valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor = (*env)->GetMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "<init>", signature);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
dc307942eac821bc70a7a69cbb1ddec4184607c1talley propertyObject = (*env)->NewObject(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, constructor, propValue, lineage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (propertyObject);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystr_to_enum_element(JNIEnv *env, char *str, char *valueClass)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley char signature[1024];
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jmethodID method_valueOf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jstring utf = (*env)->NewStringUTF(env, str);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jclass class = (*env)->FindClass(env, valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) snprintf(signature, sizeof (signature),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "(Ljava/lang/String;)L%s;", valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley method_valueOf = (*env)->GetStaticMethodID(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, class, "valueOf", signature);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (*env)->CallStaticObjectMethod(env, class, method_valueOf, utf);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystr_to_aclinherit(JNIEnv *env, char *str)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (str_to_enum_element(env, str,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
a3c49ce110f325a563c245bedc4d533adddb7211Albert Leestatic jobject
a3c49ce110f325a563c245bedc4d533adddb7211Albert Leestr_to_aclmode(JNIEnv *env, char *str)
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee{
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee return (str_to_enum_element(env, str,
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee ZFSJNI_PACKAGE_DATA "AclModeProperty$AclMode"));
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee}
a3c49ce110f325a563c245bedc4d533adddb7211Albert Lee
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrensstr_to_checksum(JNIEnv *env, char *str)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (str_to_enum_element(env, str,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrensstr_to_compression(JNIEnv *env, char *str)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (str_to_enum_element(env, str,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystr_to_snapdir(JNIEnv *env, char *str)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (str_to_enum_element(env, str,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir"));
dc307942eac821bc70a7a69cbb1ddec4184607c1talley}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystatic jobject
dc307942eac821bc70a7a69cbb1ddec4184607c1talleystr_to_string(JNIEnv *env, char *str)
dc307942eac821bc70a7a69cbb1ddec4184607c1talley{
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (*env)->NewStringUTF(env, str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Package-private functions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_get_default_property(JNIEnv *env, zfs_prop_t prop)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_boolean[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop == props_boolean[i]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (create_default_BooleanProperty(env, prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_long[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop == props_long[i]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (create_default_LongProperty(env, prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_string[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop == props_string[i]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (create_default_StringProperty(env, prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_custom[i].prop != ZPROP_INVAL; i++) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (prop == props_custom[i].prop) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return create_default_ObjectProperty(env,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens props_custom[i].prop,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens props_custom[i].convert_str,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens props_custom[i].convert_uint64,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens props_custom[i].propClass,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens props_custom[i].valueClass);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic int
990b4856d0eaada6f8140335733a1b1771ed2746llingzjni_get_property_from_name_cb(int prop, void *cb)
66e2aacc02a4625d105fb249ad16c27e79604ff2gw{
66e2aacc02a4625d105fb249ad16c27e79604ff2gw const char *name = cb;
66e2aacc02a4625d105fb249ad16c27e79604ff2gw
66e2aacc02a4625d105fb249ad16c27e79604ff2gw if (strcasecmp(name, zfs_prop_to_name(prop)) == 0)
66e2aacc02a4625d105fb249ad16c27e79604ff2gw return (prop);
66e2aacc02a4625d105fb249ad16c27e79604ff2gw
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ZPROP_CONT);
66e2aacc02a4625d105fb249ad16c27e79604ff2gw}
66e2aacc02a4625d105fb249ad16c27e79604ff2gw
fa9e4066f08beec538e775443c5be79dd423fcabahrenszfs_prop_t
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_get_property_from_name(const char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_prop_t prop;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling prop = zprop_iter(zjni_get_property_from_name_cb, (void *)name,
990b4856d0eaada6f8140335733a1b1771ed2746lling B_FALSE, B_FALSE, ZFS_TYPE_DATASET);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (prop == ZPROP_CONT ? ZPROP_INVAL : prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobject
990b4856d0eaada6f8140335733a1b1771ed2746llingzjni_int_to_Lineage(JNIEnv *env, zprop_source_t srctype)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
990b4856d0eaada6f8140335733a1b1771ed2746lling /* zprop_source_t to Property$Lineage map */
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley static zjni_field_mapping_t lineage_map[] = {
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_SRC_NONE, "ZFS_PROP_LINEAGE_NOTINHERITABLE" },
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_SRC_DEFAULT, "ZFS_PROP_LINEAGE_DEFAULT" },
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_SRC_LOCAL, "ZFS_PROP_LINEAGE_LOCAL" },
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_SRC_TEMPORARY, "ZFS_PROP_LINEAGE_TEMPORARY" },
990b4856d0eaada6f8140335733a1b1771ed2746lling { ZPROP_SRC_INHERITED, "ZFS_PROP_LINEAGE_INHERITED" }
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley };
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley return (zjni_int_to_enum(env, srctype,
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley ZFSJNI_PACKAGE_DATA "Property$Lineage",
fbfd10ff571cfd0139aa5127460f1b8a53dac971talley "ZFS_PROP_LINEAGE_INHERITED", lineage_map));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensjobjectArray
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_get_Dataset_properties(JNIEnv *env, zfs_handle_t *zhp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject prop;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create an array list for the properties */
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_ArrayList_t proplist_obj = {0};
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_ArrayList_t *proplist = &proplist_obj;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_new_ArrayList(env, proplist);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_boolean[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create property and add to list */
fa9e4066f08beec538e775443c5be79dd423fcabahrens prop = create_BooleanProperty(env, zhp, props_boolean[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Does this property apply to this object? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->CallBooleanMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ((zjni_Object_t *)proplist)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)proplist)->method_add, prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((*env)->ExceptionOccurred(env) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, "Property %s is not appropriate "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "for %s\n", zfs_prop_to_name(props_boolean[i]),
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_long[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create property and add to list */
fa9e4066f08beec538e775443c5be79dd423fcabahrens prop = create_LongProperty(env, zhp, props_long[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Does this property apply to this object? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->CallBooleanMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ((zjni_Object_t *)proplist)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)proplist)->method_add, prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((*env)->ExceptionOccurred(env) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, "Property %s is not appropriate "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "for %s\n", zfs_prop_to_name(props_long[i]),
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_string[i] != ZPROP_INVAL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create property and add to list */
fa9e4066f08beec538e775443c5be79dd423fcabahrens prop = create_StringProperty(env, zhp, props_string[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Does this property apply to this object? */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (prop != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->CallBooleanMethod(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ((zjni_Object_t *)proplist)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)proplist)->method_add, prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((*env)->ExceptionOccurred(env) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, "Property %s is not appropriate "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "for %s\n", zfs_prop_to_name(props_string[i]),
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; props_custom[i].prop != ZPROP_INVAL; i++) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley /* Create property and add to list */
dc307942eac821bc70a7a69cbb1ddec4184607c1talley prop = create_ObjectProperty(env, zhp, props_custom[i].prop,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley props_custom[i].convert_str, props_custom[i].convert_uint64,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley props_custom[i].propClass, props_custom[i].valueClass);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley /* Does this property apply to this object? */
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if (prop != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (*env)->CallBooleanMethod(
dc307942eac821bc70a7a69cbb1ddec4184607c1talley env, ((zjni_Object_t *)proplist)->object,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ((zjni_Collection_t *)proplist)->method_add, prop);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley } else {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley if ((*env)->ExceptionOccurred(env) != NULL) {
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (NULL);
dc307942eac821bc70a7a69cbb1ddec4184607c1talley }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (void) fprintf(stderr, "Property %s is not appropriate "
dc307942eac821bc70a7a69cbb1ddec4184607c1talley "for %s\n", zfs_prop_to_name(props_custom[i].prop),
dc307942eac821bc70a7a69cbb1ddec4184607c1talley zfs_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley return (zjni_Collection_to_array(env,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley (zjni_Collection_t *)proplist, ZFSJNI_PACKAGE_DATA "Property"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}