xref: /onnv-gate/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c (revision 5582:c4c30e76a747)
1789Sahrens /*
2789Sahrens  * CDDL HEADER START
3789Sahrens  *
4789Sahrens  * The contents of this file are subject to the terms of the
51499Stalley  * Common Development and Distribution License (the "License").
61499Stalley  * You may not use this file except in compliance with the License.
7789Sahrens  *
8789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9789Sahrens  * or http://www.opensolaris.org/os/licensing.
10789Sahrens  * See the License for the specific language governing permissions
11789Sahrens  * and limitations under the License.
12789Sahrens  *
13789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
14789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
16789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
17789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
18789Sahrens  *
19789Sahrens  * CDDL HEADER END
20789Sahrens  */
211499Stalley 
22789Sahrens /*
233654Sgw25295  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24789Sahrens  * Use is subject to license terms.
25789Sahrens  */
26789Sahrens 
27789Sahrens #pragma ident	"%Z%%M%	%I%	%E% SMI"
28789Sahrens 
29894Stalley #include <priv.h>
30789Sahrens #include "libzfs_jni_main.h"
31789Sahrens #include "libzfs_jni_util.h"
32789Sahrens #include "libzfs_jni_dataset.h"
33789Sahrens #include "libzfs_jni_property.h"
34789Sahrens #include "libzfs_jni_pool.h"
35789Sahrens #include "libzfs_jni_diskmgt.h"
36789Sahrens #include "libzfs_jni_disk.h"
37789Sahrens 
382082Seschrock libzfs_handle_t *g_zfs;
392082Seschrock 
40789Sahrens /*
41789Sahrens  * Function prototypes
42789Sahrens  */
43789Sahrens 
44789Sahrens static void handle_error(const char *, va_list);
45789Sahrens static void init();
46789Sahrens 
47789Sahrens /*
48789Sahrens  * Static functions
49789Sahrens  */
50789Sahrens 
512082Seschrock char libdskmgt_err[1024];
52789Sahrens static void
handle_error(const char * fmt,va_list ap)53789Sahrens handle_error(const char *fmt, va_list ap)
54789Sahrens {
55789Sahrens 	/* Save the error message in case it's needed */
562082Seschrock 	(void) vsnprintf(libdskmgt_err, sizeof (libdskmgt_err), fmt, ap);
57789Sahrens #ifdef	DEBUG
582082Seschrock 	(void) fprintf(stderr, "caught error: %s\n", libdskmgt_err);
59789Sahrens #endif
60789Sahrens }
61789Sahrens 
62789Sahrens /*
63789Sahrens  * Initialize the library.  Sets the error handler.
64789Sahrens  */
65789Sahrens #pragma init(init)
66789Sahrens static void
init()67789Sahrens init()
68789Sahrens {
692082Seschrock 	if ((g_zfs = libzfs_init()) == NULL)
702082Seschrock 		abort();
71789Sahrens 
72789Sahrens 	/* diskmgt.o error handler */
73789Sahrens 	dmgt_set_error_handler(handle_error);
74789Sahrens }
75789Sahrens 
76789Sahrens /*
77789Sahrens  * JNI functions
78789Sahrens  */
79789Sahrens 
80789Sahrens /*
81789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
82894Stalley  * Method:    getImportablePools
83894Stalley  * Signature: ([Ljava/lang/String;)[Ljava/lang/String;
84894Stalley  */
85894Stalley /* ARGSUSED */
86894Stalley JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getImportablePools(JNIEnv * env,jobject obj,jobjectArray dirs)87894Stalley Java_com_sun_zfs_common_model_SystemDataModel_getImportablePools(
88894Stalley     JNIEnv *env, jobject obj, jobjectArray dirs) {
89894Stalley 
90894Stalley 	int error;
91894Stalley 	int argc = 0;
92894Stalley 	char **argv = NULL;
93894Stalley 	zjni_ArrayCallbackData_t data = {0};
94894Stalley 	zjni_ArrayList_t list_obj = {0};
95894Stalley 	zjni_ArrayList_t *list = &list_obj;
96894Stalley 
97894Stalley 	if (!priv_ineffect(PRIV_SYS_CONFIG)) {
98894Stalley 		zjni_throw_exception(env,
99894Stalley 		    "cannot discover pools: permission denied\n");
100894Stalley 		return (NULL);
101894Stalley 	}
102894Stalley 
103894Stalley 	if (dirs != NULL) {
104894Stalley 		argv = zjni_java_string_array_to_c(env, dirs);
105894Stalley 		if (argv == NULL) {
106894Stalley 			zjni_throw_exception(env, "out of memory");
107894Stalley 			return (NULL);
108894Stalley 		}
109894Stalley 
110894Stalley 		/* Count elements */
111894Stalley 		for (argc = 0; argv[argc] != NULL; argc++);
112894Stalley 	}
113894Stalley 
114894Stalley 	/* Create an array list to hold each ImportablePoolBean */
115894Stalley 	zjni_new_ArrayList(env, list);
116894Stalley 
117894Stalley 	data.env = env;
118894Stalley 	data.list = (zjni_Collection_t *)list;
119894Stalley 
120894Stalley 	/* Iterate through all importable pools, building list */
121894Stalley 	error = zjni_ipool_iter(
122894Stalley 	    argc, argv, zjni_create_add_ImportablePool, &data);
123894Stalley 
124894Stalley 	zjni_free_array((void **)argv, free);
125894Stalley 
126894Stalley 	if (error) {
127894Stalley 		return (NULL);
128894Stalley 	}
129894Stalley 
130894Stalley 	return (zjni_Collection_to_array(env, (zjni_Collection_t *)list,
131894Stalley 	    ZFSJNI_PACKAGE_DATA "ImportablePool"));
132894Stalley }
133894Stalley 
134894Stalley /*
135894Stalley  * Class:     com_sun_zfs_common_model_SystemDataModel
136789Sahrens  * Method:    getPools
137789Sahrens  * Signature: ()[Lcom/sun/zfs/common/model/Pool;
138789Sahrens  */
139789Sahrens /* ARGSUSED */
140789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getPools(JNIEnv * env,jobject obj)141789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getPools(JNIEnv *env, jobject obj)
142789Sahrens {
1431643Stalley 	zjni_ArrayCallbackData_t data = {0};
144789Sahrens 	int result;
145789Sahrens 
146789Sahrens 	/* Create an array list */
147789Sahrens 	zjni_ArrayList_t list_obj = {0};
148789Sahrens 	zjni_ArrayList_t *list = &list_obj;
149789Sahrens 	zjni_new_ArrayList(env, list);
150789Sahrens 
1511643Stalley 	data.env = env;
1521643Stalley 	data.list = (zjni_Collection_t *)list;
153789Sahrens 
1542082Seschrock 	result = zpool_iter(g_zfs, zjni_create_add_Pool, &data);
155789Sahrens 	if (result && (*env)->ExceptionOccurred(env) != NULL) {
156789Sahrens 		/* Must not call any more Java methods to preserve exception */
157789Sahrens 		return (NULL);
158789Sahrens 	}
159789Sahrens 
160789Sahrens 	return (zjni_Collection_to_array(env, (zjni_Collection_t *)list,
161789Sahrens 	    ZFSJNI_PACKAGE_DATA "Pool"));
162789Sahrens }
163789Sahrens 
164789Sahrens /*
165789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
166789Sahrens  * Method:    getPool
167789Sahrens  * Signature: (Ljava/lang/String;)
168789Sahrens  *            Lcom/sun/zfs/common/model/Pool;
169789Sahrens  */
170789Sahrens /* ARGSUSED */
171789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getPool(JNIEnv * env,jobject obj,jstring poolUTF)172789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getPool(JNIEnv *env,
173789Sahrens     jobject obj, jstring poolUTF)
174789Sahrens {
1751066Stalley 	jobject pool = zjni_get_Dataset(env, poolUTF, ZFS_TYPE_FILESYSTEM);
1761066Stalley 
1771066Stalley 	/* Verify that object is Pool, not some other Dataset */
1781066Stalley 	if (pool != NULL) {
1794787Sahrens 		jclass class = (*env)->FindClass(
1804787Sahrens 		    env, ZFSJNI_PACKAGE_DATA "Pool");
1811066Stalley 
1824787Sahrens 		jboolean is_pool = (*env)->IsInstanceOf(env, pool, class);
1831066Stalley 
1844787Sahrens 		if (is_pool != JNI_TRUE)
1854787Sahrens 			pool = NULL;
1861066Stalley 	}
1871066Stalley 
1881066Stalley 	return (pool);
189789Sahrens }
190789Sahrens 
191789Sahrens /*
192789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
193789Sahrens  * Method:    getFileSystems
194789Sahrens  * Signature: (Ljava/lang/String;)
195789Sahrens  *            [Lcom/sun/zfs/common/model/FileSystem;
196789Sahrens  */
197789Sahrens /* ARGSUSED */
198789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getFileSystems(JNIEnv * env,jobject obj,jstring containerUTF)199789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getFileSystems(JNIEnv *env,
200789Sahrens     jobject obj, jstring containerUTF)
201789Sahrens {
2021066Stalley 	if (containerUTF == NULL) {
2031066Stalley 		return (Java_com_sun_zfs_common_model_SystemDataModel_getPools(
2041066Stalley 		    env, obj));
2051066Stalley 	}
2061066Stalley 
207789Sahrens 	return (zjni_get_Datasets_below(env, containerUTF,
208789Sahrens 	    ZFS_TYPE_FILESYSTEM, ZFS_TYPE_FILESYSTEM,
209789Sahrens 	    ZFSJNI_PACKAGE_DATA "FileSystem"));
210789Sahrens }
211789Sahrens 
212789Sahrens /*
213789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
214789Sahrens  * Method:    getFileSystem
215789Sahrens  * Signature: (Ljava/lang/String;)
216789Sahrens  *            Lcom/sun/zfs/common/model/FileSystem;
217789Sahrens  */
218789Sahrens /* ARGSUSED */
219789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getFileSystem(JNIEnv * env,jobject obj,jstring nameUTF)220789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getFileSystem(JNIEnv *env,
221789Sahrens     jobject obj, jstring nameUTF)
222789Sahrens {
223789Sahrens 	return (zjni_get_Dataset(env, nameUTF, ZFS_TYPE_FILESYSTEM));
224789Sahrens }
225789Sahrens 
226789Sahrens /*
227789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
228789Sahrens  * Method:    getVolumes
229789Sahrens  * Signature: (Ljava/lang/String;)
230789Sahrens  *            [Lcom/sun/zfs/common/model/Volume;
231789Sahrens  */
232789Sahrens /* ARGSUSED */
233789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getVolumes(JNIEnv * env,jobject obj,jstring containerUTF)234789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getVolumes(JNIEnv *env,
235789Sahrens     jobject obj, jstring containerUTF)
236789Sahrens {
237789Sahrens 	return (zjni_get_Datasets_below(env, containerUTF,
238789Sahrens 	    ZFS_TYPE_FILESYSTEM, ZFS_TYPE_VOLUME,
239789Sahrens 	    ZFSJNI_PACKAGE_DATA "Volume"));
240789Sahrens }
241789Sahrens 
242789Sahrens /*
243789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
244789Sahrens  * Method:    getVolume
245789Sahrens  * Signature: (Ljava/lang/String;)
246789Sahrens  *            Lcom/sun/zfs/common/model/Volume;
247789Sahrens  */
248789Sahrens /* ARGSUSED */
249789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getVolume(JNIEnv * env,jobject obj,jstring nameUTF)250789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getVolume(JNIEnv *env,
251789Sahrens     jobject obj, jstring nameUTF)
252789Sahrens {
253789Sahrens 	return (zjni_get_Dataset(env, nameUTF, ZFS_TYPE_VOLUME));
254789Sahrens }
255789Sahrens 
256789Sahrens /*
257789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
258789Sahrens  * Method:    getSnapshots
259789Sahrens  * Signature: (Ljava/lang/String;)
260789Sahrens  *            [Lcom/sun/zfs/common/model/Snapshot;
261789Sahrens  */
262789Sahrens /* ARGSUSED */
263789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getSnapshots(JNIEnv * env,jobject obj,jstring datasetUTF)264789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getSnapshots(JNIEnv *env,
265789Sahrens     jobject obj, jstring datasetUTF)
266789Sahrens {
267789Sahrens 	return (zjni_get_Datasets_below(env, datasetUTF,
268789Sahrens 	    ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, ZFS_TYPE_SNAPSHOT,
269789Sahrens 	    ZFSJNI_PACKAGE_DATA "Snapshot"));
270789Sahrens }
271789Sahrens 
272789Sahrens /*
273789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
274789Sahrens  * Method:    getSnapshot
275789Sahrens  * Signature: (Ljava/lang/String;)
276789Sahrens  *            Lcom/sun/zfs/common/model/Snapshot;
277789Sahrens  */
278789Sahrens /* ARGSUSED */
279789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getSnapshot(JNIEnv * env,jobject obj,jstring nameUTF)280789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getSnapshot(JNIEnv *env,
281789Sahrens     jobject obj, jstring nameUTF)
282789Sahrens {
283789Sahrens 	return (zjni_get_Dataset(env, nameUTF, ZFS_TYPE_SNAPSHOT));
284789Sahrens }
285789Sahrens 
286789Sahrens /*
287789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
288789Sahrens  * Method:    getDatasets
289789Sahrens  * Signature: (Ljava/lang/String;)
290789Sahrens  *            [Lcom/sun/zfs/common/model/Dataset;
291789Sahrens  */
292789Sahrens /* ARGSUSED */
293789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getDatasets(JNIEnv * env,jobject obj,jstring containerUTF)294789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getDatasets(JNIEnv *env,
295789Sahrens     jobject obj, jstring containerUTF)
296789Sahrens {
297789Sahrens 	if (containerUTF == NULL) {
298789Sahrens 		return (Java_com_sun_zfs_common_model_SystemDataModel_getPools(
299789Sahrens 		    env, obj));
300789Sahrens 	}
301789Sahrens 
302789Sahrens 	return (zjni_get_Datasets_below(env, containerUTF,
3035094Slling 	    ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, ZFS_TYPE_DATASET,
3041206Stalley 	    ZFSJNI_PACKAGE_DATA "Dataset"));
305789Sahrens }
306789Sahrens 
307789Sahrens /*
308789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
309789Sahrens  * Method:    getDataset
310789Sahrens  * Signature: (Ljava/lang/String;)
311789Sahrens  *            Lcom/sun/zfs/common/model/Dataset;
312789Sahrens  */
313789Sahrens /* ARGSUSED */
314789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getDataset(JNIEnv * env,jobject obj,jstring nameUTF)315789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getDataset(JNIEnv *env,
316789Sahrens     jobject obj, jstring nameUTF)
317789Sahrens {
3185094Slling 	return (zjni_get_Dataset(env, nameUTF, ZFS_TYPE_DATASET));
319789Sahrens }
320789Sahrens 
321789Sahrens /*
322789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
323789Sahrens  * Method:    getVirtualDevice
324789Sahrens  * Signature: (Ljava/lang/String;J)Lcom/sun/zfs/common/model/VirtualDevice;
325789Sahrens  */
326789Sahrens /* ARGSUSED */
327789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevice(JNIEnv * env,jobject obj,jstring poolUTF,jlong index)328789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevice(JNIEnv *env,
329789Sahrens     jobject obj, jstring poolUTF, jlong index)
330789Sahrens {
331789Sahrens 	jobject vdev = NULL;
332789Sahrens 
333789Sahrens 	if (poolUTF != NULL) {
334789Sahrens 		const char *pool = (*env)->GetStringUTFChars(env, poolUTF,
335789Sahrens 		    NULL);
3362082Seschrock 		zpool_handle_t *zhp = zpool_open_canfail(g_zfs, pool);
337789Sahrens 		(*env)->ReleaseStringUTFChars(env, poolUTF, pool);
338789Sahrens 
339789Sahrens 		if (zhp != NULL) {
3401499Stalley 			uint64_t p_vdev_id;
3411499Stalley 			nvlist_t *vdev_cfg = zjni_get_vdev(
3421499Stalley 			    zhp, NULL, index, &p_vdev_id);
3431499Stalley 
344789Sahrens 			if (vdev_cfg != NULL) {
3451499Stalley 				vdev = zjni_get_VirtualDevice_from_vdev(
3461499Stalley 				    env, zhp, vdev_cfg,
3471499Stalley 				    p_vdev_id == index ? NULL : &p_vdev_id);
348789Sahrens 			}
349789Sahrens 			zpool_close(zhp);
350789Sahrens 		}
351789Sahrens 	}
352789Sahrens 
353789Sahrens 	return (vdev);
354789Sahrens }
355789Sahrens 
356789Sahrens /*
357789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
358789Sahrens  * Method:    getVirtualDevices
359789Sahrens  * Signature: (Ljava/lang/String;J)
360789Sahrens  *            [Lcom/sun/zfs/common/model/VirtualDevice;
361789Sahrens  */
362789Sahrens /* ARGSUSED */
363789Sahrens JNIEXPORT jobjectArray JNICALL
364789Sahrens /* CSTYLED */
Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevices__Ljava_lang_String_2J(JNIEnv * env,jobject obj,jstring poolUTF,jlong index)365789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevices__Ljava_lang_String_2J(
366789Sahrens     JNIEnv *env, jobject obj, jstring poolUTF, jlong index)
367789Sahrens {
368789Sahrens 	jobjectArray vdevs = NULL;
369789Sahrens 
370789Sahrens 	if (poolUTF != NULL) {
371789Sahrens 		const char *pool = (*env)->GetStringUTFChars(env, poolUTF,
372789Sahrens 		    NULL);
3732082Seschrock 		zpool_handle_t *zhp = zpool_open_canfail(g_zfs, pool);
374789Sahrens 		(*env)->ReleaseStringUTFChars(env, poolUTF, pool);
375789Sahrens 
376789Sahrens 		/* Is the pool valid? */
377789Sahrens 		if (zhp != NULL) {
3781499Stalley 			uint64_t p_vdev_id = index;
3791499Stalley 			nvlist_t *vdev_cfg = zjni_get_vdev(
3801499Stalley 			    zhp, NULL, index, NULL);
3811499Stalley 
382789Sahrens 			if (vdev_cfg != NULL) {
383789Sahrens 				vdevs = zjni_get_VirtualDevices_from_vdev(
3841499Stalley 				    env, zhp, vdev_cfg, &p_vdev_id);
385789Sahrens 			}
386789Sahrens 			zpool_close(zhp);
387789Sahrens 		}
388789Sahrens 	}
389789Sahrens 
390789Sahrens 	return (vdevs);
391789Sahrens }
392789Sahrens 
393789Sahrens /*
394789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
395789Sahrens  * Method:    getVirtualDevices
396789Sahrens  * Signature: (Ljava/lang/String;)
397789Sahrens  *            [Lcom/sun/zfs/common/model/VirtualDevice;
398789Sahrens  */
399789Sahrens /* ARGSUSED */
400789Sahrens JNIEXPORT jobjectArray JNICALL
401789Sahrens /* CSTYLED */
Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevices__Ljava_lang_String_2(JNIEnv * env,jobject obj,jstring poolUTF)402789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getVirtualDevices__Ljava_lang_String_2(
403789Sahrens     JNIEnv *env, jobject obj, jstring poolUTF)
404789Sahrens {
405789Sahrens 	jobjectArray vdevs = NULL;
406789Sahrens 
407789Sahrens 	if (poolUTF != NULL) {
408789Sahrens 		const char *pool = (*env)->GetStringUTFChars(env,
409789Sahrens 		    poolUTF, NULL);
4102082Seschrock 		zpool_handle_t *zhp = zpool_open_canfail(g_zfs, pool);
411789Sahrens 		(*env)->ReleaseStringUTFChars(env, poolUTF, pool);
412789Sahrens 
413789Sahrens 		/* Is the pool valid? */
414789Sahrens 		if (zhp != NULL) {
415789Sahrens 			vdevs = zjni_get_VirtualDevices_from_vdev(env,
4161499Stalley 			    zhp, NULL, NULL);
417789Sahrens 			zpool_close(zhp);
418789Sahrens 		}
419789Sahrens 	}
420789Sahrens 
421789Sahrens 	return (vdevs);
422789Sahrens }
423789Sahrens 
424789Sahrens /*
425789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
426789Sahrens  * Method:    getAvailableDisks
427789Sahrens  * Signature: ()[Lcom/sun/zfs/common/model/DiskDevice;
428789Sahrens  */
429789Sahrens /* ARGSUSED */
430789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getAvailableDisks(JNIEnv * env,jobject obj)431789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getAvailableDisks(JNIEnv *env,
432789Sahrens     jobject obj)
433789Sahrens {
434789Sahrens 	int error;
435789Sahrens 	zjni_ArrayCallbackData_t data = {0};
436789Sahrens 	jobjectArray array = NULL;
437789Sahrens 
438789Sahrens 	/* Create an array list */
439789Sahrens 	zjni_ArrayList_t list_obj = {0};
440789Sahrens 	zjni_ArrayList_t *list = &list_obj;
441789Sahrens 	zjni_new_ArrayList(env, list);
442789Sahrens 
443789Sahrens 	data.env = env;
444789Sahrens 	data.list = (zjni_Collection_t *)list;
445789Sahrens 	error = dmgt_avail_disk_iter(zjni_create_add_DiskDevice, &data);
446789Sahrens 
447789Sahrens 	if (error) {
4482082Seschrock 		zjni_throw_exception(env, "%s", libdskmgt_err);
449789Sahrens 	} else {
450789Sahrens 		array = zjni_Collection_to_array(
451789Sahrens 		    env, (zjni_Collection_t *)list,
452789Sahrens 		    ZFSJNI_PACKAGE_DATA "DiskDevice");
453789Sahrens 	}
454789Sahrens 
455789Sahrens 	return (array);
456789Sahrens }
457789Sahrens 
458789Sahrens /*
459789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
460789Sahrens  * Method:    getDependents
461789Sahrens  * Signature: ([Ljava/lang/String;)
462789Sahrens  *            [Lcom/sun/zfs/common/model/Dataset;
463789Sahrens  */
464789Sahrens /* ARGSUSED */
465789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getDependents(JNIEnv * env,jobject obj,jobjectArray paths)466789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getDependents(JNIEnv *env,
467789Sahrens     jobject obj, jobjectArray paths)
468789Sahrens {
469789Sahrens 	return (zjni_get_Datasets_dependents(env, paths));
470789Sahrens }
471789Sahrens 
472789Sahrens /*
473789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
474789Sahrens  * Method:    getPropertyDefault
475789Sahrens  * Signature: (Ljava/lang/String;)
476789Sahrens  *            Lcom/sun/zfs/common/model/Property;
477789Sahrens  */
478789Sahrens /* ARGSUSED */
479789Sahrens JNIEXPORT jobject JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getPropertyDefault(JNIEnv * env,jobject obj,jstring nameUTF)480789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getPropertyDefault(JNIEnv *env,
481789Sahrens     jobject obj, jstring nameUTF)
482789Sahrens {
483789Sahrens 	jobject defProperty = NULL;
484789Sahrens 
485789Sahrens 	const char *name = (*env)->GetStringUTFChars(env, nameUTF, NULL);
486789Sahrens 	zfs_prop_t prop = zjni_get_property_from_name(name);
487789Sahrens 	(*env)->ReleaseStringUTFChars(env, nameUTF, name);
488789Sahrens 
4895094Slling 	if (prop != ZPROP_INVAL) {
490789Sahrens 		defProperty = zjni_get_default_property(env, prop);
491789Sahrens 	}
492789Sahrens 
493789Sahrens 	return (defProperty);
494789Sahrens }
495789Sahrens 
496789Sahrens typedef struct zjni_class_type_map {
497789Sahrens 	char *class;
498789Sahrens 	zfs_type_t type;
499789Sahrens } zjni_class_type_map_t;
500789Sahrens 
5013654Sgw25295 typedef struct mapping_data {
5023654Sgw25295 	JNIEnv			*env;
5033654Sgw25295 	zfs_type_t		type;
5043654Sgw25295 	zjni_ArrayList_t	*list;
5053654Sgw25295 } mapping_data_t;
5063654Sgw25295 
5075094Slling static int
mapping_cb(int prop,void * cb)5085094Slling mapping_cb(int prop, void *cb)
5093654Sgw25295 {
5103654Sgw25295 	mapping_data_t *map = cb;
5113654Sgw25295 	JNIEnv *env = map->env;
5123654Sgw25295 	zjni_ArrayList_t *list = map->list;
5133654Sgw25295 
5143654Sgw25295 	if (zfs_prop_valid_for_type(prop, map->type)) {
5153654Sgw25295 		/* Add name of property to list */
5163654Sgw25295 		jstring propName = (*env)->NewStringUTF(env,
5173654Sgw25295 		    zfs_prop_to_name(prop));
5183654Sgw25295 		(*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
5193654Sgw25295 		    ((zjni_Collection_t *)list)->method_add, propName);
5203654Sgw25295 	}
5213654Sgw25295 
5225094Slling 	return (ZPROP_CONT);
5233654Sgw25295 }
5243654Sgw25295 
525789Sahrens /*
526789Sahrens  * Class:     com_sun_zfs_common_model_SystemDataModel
527789Sahrens  * Method:    getValidPropertyNames
528789Sahrens  * Signature: (Ljava/lang/Class;)
529789Sahrens  *            [Ljava/lang/String;
530789Sahrens  */
531789Sahrens /* ARGSUSED */
532789Sahrens JNIEXPORT jobjectArray JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getValidPropertyNames(JNIEnv * env,jobject obj,jclass class)533789Sahrens Java_com_sun_zfs_common_model_SystemDataModel_getValidPropertyNames(JNIEnv *env,
534789Sahrens     jobject obj, jclass class)
535789Sahrens {
536789Sahrens 	int i;
537789Sahrens 
538789Sahrens 	/* Mappings of class names to zfs_type_t */
539789Sahrens 	static zjni_class_type_map_t mappings[] = {
540789Sahrens 		{ ZFSJNI_PACKAGE_DATA "FileSystem", ZFS_TYPE_FILESYSTEM },
541789Sahrens 		{ ZFSJNI_PACKAGE_DATA "Volume", ZFS_TYPE_VOLUME },
542789Sahrens 		{ ZFSJNI_PACKAGE_DATA "Snapshot", ZFS_TYPE_SNAPSHOT },
543789Sahrens 	};
544789Sahrens 	int nmappings = sizeof (mappings) / sizeof (zjni_class_type_map_t);
545789Sahrens 
546789Sahrens 	jclass class_Class = (*env)->FindClass(env, "java/lang/Class");
547789Sahrens 
548789Sahrens 	jmethodID isAssignableFrom = (*env)->GetMethodID(
549789Sahrens 	    env, class_Class, "isAssignableFrom", "(Ljava/lang/Class;)Z");
550789Sahrens 
551789Sahrens 	/* Create an array list for the property names */
552789Sahrens 	zjni_ArrayList_t list_obj = {0};
553789Sahrens 	zjni_ArrayList_t *list = &list_obj;
554789Sahrens 	zjni_new_ArrayList(env, list);
555789Sahrens 
556789Sahrens 	/* For each mapping... */
557789Sahrens 	for (i = 0; i < nmappings; i++) {
558789Sahrens 		/*
559789Sahrens 		 * Is the given class an instance of the class in the mapping?
560789Sahrens 		 */
561789Sahrens 		jclass typeClass = (*env)->FindClass(env, mappings[i].class);
562789Sahrens 
563789Sahrens 		jboolean isInstance = (*env)->CallBooleanMethod(
564789Sahrens 		    env, typeClass, isAssignableFrom, class);
565789Sahrens 
566789Sahrens 		if (isInstance == JNI_TRUE) {
5673654Sgw25295 			mapping_data_t map_data;
5683654Sgw25295 
5693654Sgw25295 			map_data.env = env;
5703654Sgw25295 			map_data.type = mappings[i].type;
5713654Sgw25295 			map_data.list = list;
5725094Slling 			(void) zprop_iter(mapping_cb, &map_data, B_FALSE,
5735094Slling 			    B_FALSE, ZFS_TYPE_DATASET);
574789Sahrens 			break;
575789Sahrens 		}
576789Sahrens 	}
577789Sahrens 
578789Sahrens 	return (zjni_Collection_to_array(
579789Sahrens 	    env, (zjni_Collection_t *)list, "java/lang/String"));
580789Sahrens }
581*5582Scristian 
582*5582Scristian /*
583*5582Scristian  * Class:     com_sun_zfs_common_model_SystemDataModel
584*5582Scristian  * Method:    getPoolCurrentVersion
585*5582Scristian  * Signature: ()J;
586*5582Scristian  */
587*5582Scristian /* ARGSUSED */
588*5582Scristian JNIEXPORT jlong JNICALL
Java_com_sun_zfs_common_model_SystemDataModel_getPoolCurrentVersion(JNIEnv * env,jobject obj)589*5582Scristian Java_com_sun_zfs_common_model_SystemDataModel_getPoolCurrentVersion(
590*5582Scristian     JNIEnv *env, jobject obj)
591*5582Scristian {
592*5582Scristian 	jlong pool_current_version = SPA_VERSION;
593*5582Scristian 
594*5582Scristian 	return (pool_current_version);
595*5582Scristian }
596