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