xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.sadm/dhcpmgr/lib/inittab.c (revision 0:68f95e015346)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 2001 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <stdlib.h>
30 #include <jni.h>
31 #include <dhcp_inittab.h>
32 #include <dhcp_symbol.h>
33 #include <exception.h>
34 #include <com_sun_dhcpmgr_bridge_Bridge.h>
35 #include <dhcp_svc_private.h>
36 
37 #include "class_cache.h"
38 
39 /*
40  * Retrieve a list of DHCP options from the dhcp inittab.
41  */
42 /*ARGSUSED*/
43 JNIEXPORT jobjectArray JNICALL
Java_com_sun_dhcpmgr_bridge_Bridge_getInittabOptions(JNIEnv * env,jobject obj,jbyte jcategory)44 Java_com_sun_dhcpmgr_bridge_Bridge_getInittabOptions(
45     JNIEnv *env,
46     jobject obj,
47     jbyte jcategory) {
48 
49 	jclass opt_class;
50 	jmethodID opt_cons;
51 	jobjectArray jlist = NULL;
52 	jobject jobj;
53 	jstring jname;
54 	jshort jcode;
55 	jbyte jtype;
56 	jint jgran;
57 	jint jmax;
58 
59 	uchar_t category;
60 	dhcp_symbol_t *entryptr;
61 	dhcp_symbol_t *list;
62 	dhcp_symbol_t internal;
63 	size_t num;
64 	int i;
65 
66 	/* Make sure we have the classes & methods we need */
67 	opt_class = find_class(env, OPT_CLASS);
68 	if (opt_class == NULL) {
69 		/* exception thrown */
70 		return (NULL);
71 	}
72 	opt_cons = get_methodID(env, opt_class, OPT_CONS);
73 	if (opt_cons == NULL) {
74 		/* exception thrown */
75 		return (NULL);
76 	}
77 
78 	/* Translate the dhcpmgr category to the inittab category */
79 	if (jcategory == DSYM_STANDARD) {
80 		category = ITAB_CAT_STANDARD | ITAB_CAT_INTERNAL |
81 		    ITAB_CAT_FIELD;
82 	} else {
83 		category = jcategory;
84 	}
85 
86 	/* Get the list of options */
87 	list = inittab_load(category, ITAB_CONS_MANAGER, &num);
88 	if (list == NULL) {
89 		return (NULL);
90 	}
91 
92 	/* Construct the array */
93 	jlist = (*env)->NewObjectArray(env, num, opt_class, NULL);
94 	if (jlist == NULL) {
95 		/* exception thrown */
96 		free(list);
97 		return (NULL);
98 	}
99 
100 	/* For each option, create an object and add it to the array */
101 	for (i = 0; i < num; ++i) {
102 
103 		/* Verify the entry. Use the internal if necessary. */
104 		if (inittab_verify(&list[i], &internal) == ITAB_FAILURE) {
105 			entryptr = &internal;
106 		} else {
107 			entryptr = &list[i];
108 		}
109 
110 		jtype = entryptr->ds_type;
111 		jname = (*env)->NewStringUTF(env, entryptr->ds_name);
112 		if (jname == NULL) {
113 			/* exception thrown */
114 			break;
115 		}
116 
117 		/* HACK. Since the codes for fields can overlap the	*/
118 		/* codes for STANDARD options, we will just set the	*/
119 		/* code to zero and ignore the need for these codes to	*/
120 		/* be unique. We do the same for internal but not	*/
121 		/* for the same reason. For internal we have no need	*/
122 		/* for the actual code and since we expect them to	*/
123 		/* change in the future, we'll just go ahead and	*/
124 		/* set them to zero too.				*/
125 		if (entryptr->ds_category == DSYM_INTERNAL ||
126 		    entryptr->ds_category == DSYM_FIELD) {
127 			jcode = (jshort)0;
128 		} else {
129 			jcode = entryptr->ds_code;
130 		}
131 
132 		jmax = entryptr->ds_max;
133 		jgran = entryptr->ds_gran;
134 
135 		/* Create an 'Option' */
136 		jobj = (*env)->NewObject(env, opt_class, opt_cons, jname,
137 		    jcategory, NULL, jcode, jtype, jgran, jmax, NULL,
138 		    JNI_TRUE);
139 		if (jobj == NULL) {
140 			/* exception thrown */
141 			break;
142 		}
143 
144 		(*env)->SetObjectArrayElement(env, jlist, i, jobj);
145 		if ((*env)->ExceptionOccurred(env) != NULL) {
146 			break;
147 		}
148 	}
149 
150 	free(list);
151 
152 	return (jlist);
153 }
154