xref: /minix3/external/bsd/dhcp/dist/common/comapi.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: comapi.c,v 1.1.1.3 2014/07/12 11:57:39 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* omapi.c
3*83ee113eSDavid van Moolenbroek 
4*83ee113eSDavid van Moolenbroek    OMAPI object interfaces for the DHCP server. */
5*83ee113eSDavid van Moolenbroek 
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek  * Copyright (c) 2012,2014 Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek  * Copyright (c) 2004-2007,2009 by Internet Systems Consortium, Inc. ("ISC")
9*83ee113eSDavid van Moolenbroek  * Copyright (c) 1999-2003 by Internet Software Consortium
10*83ee113eSDavid van Moolenbroek  *
11*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
12*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
13*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
14*83ee113eSDavid van Moolenbroek  *
15*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
16*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
18*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22*83ee113eSDavid van Moolenbroek  *
23*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
24*83ee113eSDavid van Moolenbroek  *   950 Charter Street
25*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
26*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
27*83ee113eSDavid van Moolenbroek  *   https://www.isc.org/
28*83ee113eSDavid van Moolenbroek  *
29*83ee113eSDavid van Moolenbroek  */
30*83ee113eSDavid van Moolenbroek 
31*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
32*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: comapi.c,v 1.1.1.3 2014/07/12 11:57:39 spz Exp $");
33*83ee113eSDavid van Moolenbroek 
34*83ee113eSDavid van Moolenbroek /* Many, many thanks to Brian Murrell and BCtel for this code - BCtel
35*83ee113eSDavid van Moolenbroek    provided the funding that resulted in this code and the entire
36*83ee113eSDavid van Moolenbroek    OMAPI support library being written, and Brian helped brainstorm
37*83ee113eSDavid van Moolenbroek    and refine the requirements.  To the extent that this code is
38*83ee113eSDavid van Moolenbroek    useful, you have Brian and BCtel to thank.  Any limitations in the
39*83ee113eSDavid van Moolenbroek    code are a result of mistakes on my part.  -- Ted Lemon */
40*83ee113eSDavid van Moolenbroek 
41*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
42*83ee113eSDavid van Moolenbroek #include <omapip/omapip_p.h>
43*83ee113eSDavid van Moolenbroek 
44*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC (subnet, struct subnet, dhcp_type_subnet)
45*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC (shared_network, struct shared_network,
46*83ee113eSDavid van Moolenbroek 		    dhcp_type_shared_network)
47*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC (group_object, struct group_object, dhcp_type_group)
48*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC (dhcp_control, dhcp_control_object_t, dhcp_type_control)
49*83ee113eSDavid van Moolenbroek 
50*83ee113eSDavid van Moolenbroek omapi_object_type_t *dhcp_type_interface;
51*83ee113eSDavid van Moolenbroek omapi_object_type_t *dhcp_type_group;
52*83ee113eSDavid van Moolenbroek omapi_object_type_t *dhcp_type_shared_network;
53*83ee113eSDavid van Moolenbroek omapi_object_type_t *dhcp_type_subnet;
54*83ee113eSDavid van Moolenbroek omapi_object_type_t *dhcp_type_control;
55*83ee113eSDavid van Moolenbroek dhcp_control_object_t *dhcp_control_object;
56*83ee113eSDavid van Moolenbroek 
dhcp_common_objects_setup()57*83ee113eSDavid van Moolenbroek void dhcp_common_objects_setup ()
58*83ee113eSDavid van Moolenbroek {
59*83ee113eSDavid van Moolenbroek 	isc_result_t status;
60*83ee113eSDavid van Moolenbroek 
61*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&dhcp_type_control,
62*83ee113eSDavid van Moolenbroek 					     "control",
63*83ee113eSDavid van Moolenbroek 					     dhcp_control_set_value,
64*83ee113eSDavid van Moolenbroek 					     dhcp_control_get_value,
65*83ee113eSDavid van Moolenbroek 					     dhcp_control_destroy,
66*83ee113eSDavid van Moolenbroek 					     dhcp_control_signal_handler,
67*83ee113eSDavid van Moolenbroek 					     dhcp_control_stuff_values,
68*83ee113eSDavid van Moolenbroek 					     dhcp_control_lookup,
69*83ee113eSDavid van Moolenbroek 					     dhcp_control_create,
70*83ee113eSDavid van Moolenbroek 					     dhcp_control_remove, 0, 0, 0,
71*83ee113eSDavid van Moolenbroek 					     sizeof (dhcp_control_object_t),
72*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
73*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
74*83ee113eSDavid van Moolenbroek 		log_fatal ("Can't register control object type: %s",
75*83ee113eSDavid van Moolenbroek 			   isc_result_totext (status));
76*83ee113eSDavid van Moolenbroek 	status = dhcp_control_allocate (&dhcp_control_object, MDL);
77*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
78*83ee113eSDavid van Moolenbroek 		log_fatal ("Can't make initial control object: %s",
79*83ee113eSDavid van Moolenbroek 			   isc_result_totext (status));
80*83ee113eSDavid van Moolenbroek 	dhcp_control_object -> state = server_startup;
81*83ee113eSDavid van Moolenbroek 
82*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&dhcp_type_group,
83*83ee113eSDavid van Moolenbroek 					     "group",
84*83ee113eSDavid van Moolenbroek 					     dhcp_group_set_value,
85*83ee113eSDavid van Moolenbroek 					     dhcp_group_get_value,
86*83ee113eSDavid van Moolenbroek 					     dhcp_group_destroy,
87*83ee113eSDavid van Moolenbroek 					     dhcp_group_signal_handler,
88*83ee113eSDavid van Moolenbroek 					     dhcp_group_stuff_values,
89*83ee113eSDavid van Moolenbroek 					     dhcp_group_lookup,
90*83ee113eSDavid van Moolenbroek 					     dhcp_group_create,
91*83ee113eSDavid van Moolenbroek 					     dhcp_group_remove, 0, 0, 0,
92*83ee113eSDavid van Moolenbroek 					     sizeof (struct group_object), 0,
93*83ee113eSDavid van Moolenbroek 					     RC_MISC);
94*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
95*83ee113eSDavid van Moolenbroek 		log_fatal ("Can't register group object type: %s",
96*83ee113eSDavid van Moolenbroek 			   isc_result_totext (status));
97*83ee113eSDavid van Moolenbroek 
98*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&dhcp_type_subnet,
99*83ee113eSDavid van Moolenbroek 					     "subnet",
100*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_set_value,
101*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_get_value,
102*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_destroy,
103*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_signal_handler,
104*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_stuff_values,
105*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_lookup,
106*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_create,
107*83ee113eSDavid van Moolenbroek 					     dhcp_subnet_remove, 0, 0, 0,
108*83ee113eSDavid van Moolenbroek 					     sizeof (struct subnet), 0,
109*83ee113eSDavid van Moolenbroek 					     RC_MISC);
110*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
111*83ee113eSDavid van Moolenbroek 		log_fatal ("Can't register subnet object type: %s",
112*83ee113eSDavid van Moolenbroek 			   isc_result_totext (status));
113*83ee113eSDavid van Moolenbroek 
114*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register
115*83ee113eSDavid van Moolenbroek 		(&dhcp_type_shared_network,
116*83ee113eSDavid van Moolenbroek 		 "shared-network",
117*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_set_value,
118*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_get_value,
119*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_destroy,
120*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_signal_handler,
121*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_stuff_values,
122*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_lookup,
123*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_create,
124*83ee113eSDavid van Moolenbroek 		 dhcp_shared_network_remove, 0, 0, 0,
125*83ee113eSDavid van Moolenbroek 		 sizeof (struct shared_network), 0, RC_MISC);
126*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
127*83ee113eSDavid van Moolenbroek 		log_fatal ("Can't register shared network object type: %s",
128*83ee113eSDavid van Moolenbroek 			   isc_result_totext (status));
129*83ee113eSDavid van Moolenbroek 
130*83ee113eSDavid van Moolenbroek 	interface_setup ();
131*83ee113eSDavid van Moolenbroek }
132*83ee113eSDavid van Moolenbroek 
dhcp_group_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)133*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_set_value  (omapi_object_t *h,
134*83ee113eSDavid van Moolenbroek 				    omapi_object_t *id,
135*83ee113eSDavid van Moolenbroek 				    omapi_data_string_t *name,
136*83ee113eSDavid van Moolenbroek 				    omapi_typed_data_t *value)
137*83ee113eSDavid van Moolenbroek {
138*83ee113eSDavid van Moolenbroek 	struct group_object *group;
139*83ee113eSDavid van Moolenbroek 	isc_result_t status;
140*83ee113eSDavid van Moolenbroek 
141*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_group)
142*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
143*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)h;
144*83ee113eSDavid van Moolenbroek 
145*83ee113eSDavid van Moolenbroek 	/* XXX For now, we can only set these values on new group objects.
146*83ee113eSDavid van Moolenbroek 	   XXX Soon, we need to be able to update group objects. */
147*83ee113eSDavid van Moolenbroek 	if (!omapi_ds_strcmp (name, "name")) {
148*83ee113eSDavid van Moolenbroek 		if (group -> name)
149*83ee113eSDavid van Moolenbroek 			return ISC_R_EXISTS;
150*83ee113eSDavid van Moolenbroek 		if (value -> type == omapi_datatype_data ||
151*83ee113eSDavid van Moolenbroek 		    value -> type == omapi_datatype_string) {
152*83ee113eSDavid van Moolenbroek 			group -> name = dmalloc (value -> u.buffer.len + 1,
153*83ee113eSDavid van Moolenbroek 						 MDL);
154*83ee113eSDavid van Moolenbroek 			if (!group -> name)
155*83ee113eSDavid van Moolenbroek 				return ISC_R_NOMEMORY;
156*83ee113eSDavid van Moolenbroek 			memcpy (group -> name,
157*83ee113eSDavid van Moolenbroek 				value -> u.buffer.value,
158*83ee113eSDavid van Moolenbroek 				value -> u.buffer.len);
159*83ee113eSDavid van Moolenbroek 			group -> name [value -> u.buffer.len] = 0;
160*83ee113eSDavid van Moolenbroek 		} else
161*83ee113eSDavid van Moolenbroek 			return DHCP_R_INVALIDARG;
162*83ee113eSDavid van Moolenbroek 		return ISC_R_SUCCESS;
163*83ee113eSDavid van Moolenbroek 	}
164*83ee113eSDavid van Moolenbroek 
165*83ee113eSDavid van Moolenbroek 	if (!omapi_ds_strcmp (name, "statements")) {
166*83ee113eSDavid van Moolenbroek 		if (group -> group && group -> group -> statements)
167*83ee113eSDavid van Moolenbroek 			return ISC_R_EXISTS;
168*83ee113eSDavid van Moolenbroek 		if (!group -> group) {
169*83ee113eSDavid van Moolenbroek 			if (!clone_group (&group -> group, root_group, MDL))
170*83ee113eSDavid van Moolenbroek 				return ISC_R_NOMEMORY;
171*83ee113eSDavid van Moolenbroek 		}
172*83ee113eSDavid van Moolenbroek 		if (value -> type == omapi_datatype_data ||
173*83ee113eSDavid van Moolenbroek 		    value -> type == omapi_datatype_string) {
174*83ee113eSDavid van Moolenbroek 			struct parse *parse;
175*83ee113eSDavid van Moolenbroek 			int lose = 0;
176*83ee113eSDavid van Moolenbroek 			parse = NULL;
177*83ee113eSDavid van Moolenbroek 			status = new_parse(&parse, -1,
178*83ee113eSDavid van Moolenbroek 					    (char *) value->u.buffer.value,
179*83ee113eSDavid van Moolenbroek 					    value->u.buffer.len,
180*83ee113eSDavid van Moolenbroek 					    "network client", 0);
181*83ee113eSDavid van Moolenbroek 			if (status != ISC_R_SUCCESS || parse == NULL)
182*83ee113eSDavid van Moolenbroek 				return status;
183*83ee113eSDavid van Moolenbroek 			if (!(parse_executable_statements
184*83ee113eSDavid van Moolenbroek 			      (&group -> group -> statements, parse, &lose,
185*83ee113eSDavid van Moolenbroek 			       context_any))) {
186*83ee113eSDavid van Moolenbroek 				end_parse (&parse);
187*83ee113eSDavid van Moolenbroek 				return DHCP_R_BADPARSE;
188*83ee113eSDavid van Moolenbroek 			}
189*83ee113eSDavid van Moolenbroek 			end_parse (&parse);
190*83ee113eSDavid van Moolenbroek 			return ISC_R_SUCCESS;
191*83ee113eSDavid van Moolenbroek 		} else
192*83ee113eSDavid van Moolenbroek 			return DHCP_R_INVALIDARG;
193*83ee113eSDavid van Moolenbroek 	}
194*83ee113eSDavid van Moolenbroek 
195*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
196*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> set_value) {
197*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> set_value))
198*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
199*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
200*83ee113eSDavid van Moolenbroek 			return status;
201*83ee113eSDavid van Moolenbroek 	}
202*83ee113eSDavid van Moolenbroek 
203*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
204*83ee113eSDavid van Moolenbroek }
205*83ee113eSDavid van Moolenbroek 
206*83ee113eSDavid van Moolenbroek 
dhcp_group_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)207*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_get_value (omapi_object_t *h, omapi_object_t *id,
208*83ee113eSDavid van Moolenbroek 				   omapi_data_string_t *name,
209*83ee113eSDavid van Moolenbroek 				   omapi_value_t **value)
210*83ee113eSDavid van Moolenbroek {
211*83ee113eSDavid van Moolenbroek 	struct group_object *group;
212*83ee113eSDavid van Moolenbroek 	isc_result_t status;
213*83ee113eSDavid van Moolenbroek 
214*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_group)
215*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
216*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)h;
217*83ee113eSDavid van Moolenbroek 
218*83ee113eSDavid van Moolenbroek 	if (!omapi_ds_strcmp (name, "name"))
219*83ee113eSDavid van Moolenbroek 		return omapi_make_string_value (value,
220*83ee113eSDavid van Moolenbroek 						name, group -> name, MDL);
221*83ee113eSDavid van Moolenbroek 
222*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
223*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
224*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> get_value))
225*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
226*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
227*83ee113eSDavid van Moolenbroek 			return status;
228*83ee113eSDavid van Moolenbroek 	}
229*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
230*83ee113eSDavid van Moolenbroek }
231*83ee113eSDavid van Moolenbroek 
dhcp_group_destroy(omapi_object_t * h,const char * file,int line)232*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_destroy (omapi_object_t *h, const char *file, int line)
233*83ee113eSDavid van Moolenbroek {
234*83ee113eSDavid van Moolenbroek 	struct group_object *group, *t;
235*83ee113eSDavid van Moolenbroek 
236*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_group)
237*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
238*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)h;
239*83ee113eSDavid van Moolenbroek 
240*83ee113eSDavid van Moolenbroek 	if (group -> name) {
241*83ee113eSDavid van Moolenbroek 		if (group_name_hash) {
242*83ee113eSDavid van Moolenbroek 			t = (struct group_object *)0;
243*83ee113eSDavid van Moolenbroek 			if (group_hash_lookup (&t, group_name_hash,
244*83ee113eSDavid van Moolenbroek 					       group -> name,
245*83ee113eSDavid van Moolenbroek 					       strlen (group -> name), MDL)) {
246*83ee113eSDavid van Moolenbroek 				group_hash_delete (group_name_hash,
247*83ee113eSDavid van Moolenbroek 						   group -> name,
248*83ee113eSDavid van Moolenbroek 						   strlen (group -> name),
249*83ee113eSDavid van Moolenbroek 						   MDL);
250*83ee113eSDavid van Moolenbroek 				group_object_dereference (&t, MDL);
251*83ee113eSDavid van Moolenbroek 			}
252*83ee113eSDavid van Moolenbroek 		}
253*83ee113eSDavid van Moolenbroek 		dfree (group -> name, file, line);
254*83ee113eSDavid van Moolenbroek 		group -> name = (char *)0;
255*83ee113eSDavid van Moolenbroek 	}
256*83ee113eSDavid van Moolenbroek 	if (group -> group)
257*83ee113eSDavid van Moolenbroek 		group_dereference (&group -> group, MDL);
258*83ee113eSDavid van Moolenbroek 
259*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
260*83ee113eSDavid van Moolenbroek }
261*83ee113eSDavid van Moolenbroek 
dhcp_group_signal_handler(omapi_object_t * h,const char * name,va_list ap)262*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_signal_handler (omapi_object_t *h,
263*83ee113eSDavid van Moolenbroek 					const char *name, va_list ap)
264*83ee113eSDavid van Moolenbroek {
265*83ee113eSDavid van Moolenbroek 	struct group_object *group;
266*83ee113eSDavid van Moolenbroek 	isc_result_t status;
267*83ee113eSDavid van Moolenbroek 	int updatep = 0;
268*83ee113eSDavid van Moolenbroek 
269*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_group)
270*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
271*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)h;
272*83ee113eSDavid van Moolenbroek 
273*83ee113eSDavid van Moolenbroek 	if (!strcmp (name, "updated")) {
274*83ee113eSDavid van Moolenbroek 		/* A group object isn't valid if a subgroup hasn't yet been
275*83ee113eSDavid van Moolenbroek 		   associated with it. */
276*83ee113eSDavid van Moolenbroek 		if (!group -> group)
277*83ee113eSDavid van Moolenbroek 			return DHCP_R_INVALIDARG;
278*83ee113eSDavid van Moolenbroek 
279*83ee113eSDavid van Moolenbroek 		/* Group objects always have to have names. */
280*83ee113eSDavid van Moolenbroek 		if (!group -> name) {
281*83ee113eSDavid van Moolenbroek 			char hnbuf [64];
282*83ee113eSDavid van Moolenbroek 			sprintf (hnbuf, "ng%08lx%08lx",
283*83ee113eSDavid van Moolenbroek 				 (unsigned long)cur_time,
284*83ee113eSDavid van Moolenbroek 				 (unsigned long)group);
285*83ee113eSDavid van Moolenbroek 			group -> name = dmalloc (strlen (hnbuf) + 1, MDL);
286*83ee113eSDavid van Moolenbroek 			if (!group -> name)
287*83ee113eSDavid van Moolenbroek 				return ISC_R_NOMEMORY;
288*83ee113eSDavid van Moolenbroek 			strcpy (group -> name, hnbuf);
289*83ee113eSDavid van Moolenbroek 		}
290*83ee113eSDavid van Moolenbroek 
291*83ee113eSDavid van Moolenbroek 		supersede_group (group, 1);
292*83ee113eSDavid van Moolenbroek 		updatep = 1;
293*83ee113eSDavid van Moolenbroek 	}
294*83ee113eSDavid van Moolenbroek 
295*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
296*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
297*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> signal_handler))
298*83ee113eSDavid van Moolenbroek 			  (h -> inner, name, ap));
299*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
300*83ee113eSDavid van Moolenbroek 			return status;
301*83ee113eSDavid van Moolenbroek 	}
302*83ee113eSDavid van Moolenbroek 	if (updatep)
303*83ee113eSDavid van Moolenbroek 		return ISC_R_SUCCESS;
304*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
305*83ee113eSDavid van Moolenbroek }
306*83ee113eSDavid van Moolenbroek 
dhcp_group_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * h)307*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_stuff_values (omapi_object_t *c,
308*83ee113eSDavid van Moolenbroek 				      omapi_object_t *id,
309*83ee113eSDavid van Moolenbroek 				      omapi_object_t *h)
310*83ee113eSDavid van Moolenbroek {
311*83ee113eSDavid van Moolenbroek 	struct group_object *group;
312*83ee113eSDavid van Moolenbroek 	isc_result_t status;
313*83ee113eSDavid van Moolenbroek 
314*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_group)
315*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
316*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)h;
317*83ee113eSDavid van Moolenbroek 
318*83ee113eSDavid van Moolenbroek 	/* Write out all the values. */
319*83ee113eSDavid van Moolenbroek 	if (group -> name) {
320*83ee113eSDavid van Moolenbroek 		status = omapi_connection_put_name (c, "name");
321*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS)
322*83ee113eSDavid van Moolenbroek 			return status;
323*83ee113eSDavid van Moolenbroek 		status = omapi_connection_put_string (c, group -> name);
324*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS)
325*83ee113eSDavid van Moolenbroek 			return status;
326*83ee113eSDavid van Moolenbroek 	}
327*83ee113eSDavid van Moolenbroek 
328*83ee113eSDavid van Moolenbroek 	/* Write out the inner object, if any. */
329*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> stuff_values) {
330*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> stuff_values))
331*83ee113eSDavid van Moolenbroek 			  (c, id, h -> inner));
332*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
333*83ee113eSDavid van Moolenbroek 			return status;
334*83ee113eSDavid van Moolenbroek 	}
335*83ee113eSDavid van Moolenbroek 
336*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
337*83ee113eSDavid van Moolenbroek }
338*83ee113eSDavid van Moolenbroek 
dhcp_group_lookup(omapi_object_t ** lp,omapi_object_t * id,omapi_object_t * ref)339*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_lookup (omapi_object_t **lp,
340*83ee113eSDavid van Moolenbroek 				omapi_object_t *id, omapi_object_t *ref)
341*83ee113eSDavid van Moolenbroek {
342*83ee113eSDavid van Moolenbroek 	omapi_value_t *tv = (omapi_value_t *)0;
343*83ee113eSDavid van Moolenbroek 	isc_result_t status;
344*83ee113eSDavid van Moolenbroek 	struct group_object *group;
345*83ee113eSDavid van Moolenbroek 
346*83ee113eSDavid van Moolenbroek 	if (!ref)
347*83ee113eSDavid van Moolenbroek 		return DHCP_R_NOKEYS;
348*83ee113eSDavid van Moolenbroek 
349*83ee113eSDavid van Moolenbroek 	/* First see if we were sent a handle. */
350*83ee113eSDavid van Moolenbroek 	status = omapi_get_value_str (ref, id, "handle", &tv);
351*83ee113eSDavid van Moolenbroek 	if (status == ISC_R_SUCCESS) {
352*83ee113eSDavid van Moolenbroek 		status = omapi_handle_td_lookup (lp, tv -> value);
353*83ee113eSDavid van Moolenbroek 
354*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (&tv, MDL);
355*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS)
356*83ee113eSDavid van Moolenbroek 			return status;
357*83ee113eSDavid van Moolenbroek 
358*83ee113eSDavid van Moolenbroek 		/* Don't return the object if the type is wrong. */
359*83ee113eSDavid van Moolenbroek 		if ((*lp) -> type != dhcp_type_group) {
360*83ee113eSDavid van Moolenbroek 			omapi_object_dereference (lp, MDL);
361*83ee113eSDavid van Moolenbroek 			return DHCP_R_INVALIDARG;
362*83ee113eSDavid van Moolenbroek 		}
363*83ee113eSDavid van Moolenbroek 	}
364*83ee113eSDavid van Moolenbroek 
365*83ee113eSDavid van Moolenbroek 	/* Now look for a name. */
366*83ee113eSDavid van Moolenbroek 	status = omapi_get_value_str (ref, id, "name", &tv);
367*83ee113eSDavid van Moolenbroek 	if (status == ISC_R_SUCCESS) {
368*83ee113eSDavid van Moolenbroek 		group = (struct group_object *)0;
369*83ee113eSDavid van Moolenbroek 		if (group_name_hash &&
370*83ee113eSDavid van Moolenbroek 		    group_hash_lookup (&group, group_name_hash,
371*83ee113eSDavid van Moolenbroek 				       (const char *)
372*83ee113eSDavid van Moolenbroek 				       tv -> value -> u.buffer.value,
373*83ee113eSDavid van Moolenbroek 				       tv -> value -> u.buffer.len, MDL)) {
374*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (&tv, MDL);
375*83ee113eSDavid van Moolenbroek 
376*83ee113eSDavid van Moolenbroek 			if (*lp && *lp != (omapi_object_t *)group) {
377*83ee113eSDavid van Moolenbroek 			    group_object_dereference (&group, MDL);
378*83ee113eSDavid van Moolenbroek 			    omapi_object_dereference (lp, MDL);
379*83ee113eSDavid van Moolenbroek 			    return DHCP_R_KEYCONFLICT;
380*83ee113eSDavid van Moolenbroek 			} else if (!*lp) {
381*83ee113eSDavid van Moolenbroek 			    /* XXX fix so that hash lookup itself creates
382*83ee113eSDavid van Moolenbroek 			       XXX the reference. */
383*83ee113eSDavid van Moolenbroek 			    omapi_object_reference (lp,
384*83ee113eSDavid van Moolenbroek 						    (omapi_object_t *)group,
385*83ee113eSDavid van Moolenbroek 						    MDL);
386*83ee113eSDavid van Moolenbroek 			    group_object_dereference (&group, MDL);
387*83ee113eSDavid van Moolenbroek 			}
388*83ee113eSDavid van Moolenbroek 		} else if (!*lp)
389*83ee113eSDavid van Moolenbroek 			return ISC_R_NOTFOUND;
390*83ee113eSDavid van Moolenbroek 	}
391*83ee113eSDavid van Moolenbroek 
392*83ee113eSDavid van Moolenbroek 	/* If we get to here without finding a group, no valid key was
393*83ee113eSDavid van Moolenbroek 	   specified. */
394*83ee113eSDavid van Moolenbroek 	if (!*lp)
395*83ee113eSDavid van Moolenbroek 		return DHCP_R_NOKEYS;
396*83ee113eSDavid van Moolenbroek 
397*83ee113eSDavid van Moolenbroek 	if (((struct group_object *)(*lp)) -> flags & GROUP_OBJECT_DELETED) {
398*83ee113eSDavid van Moolenbroek 		omapi_object_dereference (lp, MDL);
399*83ee113eSDavid van Moolenbroek 		return ISC_R_NOTFOUND;
400*83ee113eSDavid van Moolenbroek 	}
401*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
402*83ee113eSDavid van Moolenbroek }
403*83ee113eSDavid van Moolenbroek 
dhcp_group_create(omapi_object_t ** lp,omapi_object_t * id)404*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_create (omapi_object_t **lp,
405*83ee113eSDavid van Moolenbroek 			       omapi_object_t *id)
406*83ee113eSDavid van Moolenbroek {
407*83ee113eSDavid van Moolenbroek 	struct group_object *group;
408*83ee113eSDavid van Moolenbroek 	isc_result_t status;
409*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)0;
410*83ee113eSDavid van Moolenbroek 
411*83ee113eSDavid van Moolenbroek 	status = group_object_allocate (&group, MDL);
412*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
413*83ee113eSDavid van Moolenbroek 		return status;
414*83ee113eSDavid van Moolenbroek 	group -> flags = GROUP_OBJECT_DYNAMIC;
415*83ee113eSDavid van Moolenbroek 	status = omapi_object_reference (lp, (omapi_object_t *)group, MDL);
416*83ee113eSDavid van Moolenbroek 	group_object_dereference (&group, MDL);
417*83ee113eSDavid van Moolenbroek 	return status;
418*83ee113eSDavid van Moolenbroek }
419*83ee113eSDavid van Moolenbroek 
dhcp_group_remove(omapi_object_t * lp,omapi_object_t * id)420*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_remove (omapi_object_t *lp,
421*83ee113eSDavid van Moolenbroek 				omapi_object_t *id)
422*83ee113eSDavid van Moolenbroek {
423*83ee113eSDavid van Moolenbroek 	struct group_object *group;
424*83ee113eSDavid van Moolenbroek 	isc_result_t status;
425*83ee113eSDavid van Moolenbroek 	if (lp -> type != dhcp_type_group)
426*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
427*83ee113eSDavid van Moolenbroek 	group = (struct group_object *)lp;
428*83ee113eSDavid van Moolenbroek 
429*83ee113eSDavid van Moolenbroek 	group -> flags |= GROUP_OBJECT_DELETED;
430*83ee113eSDavid van Moolenbroek 	if (group_write_hook) {
431*83ee113eSDavid van Moolenbroek 		if (!(*group_write_hook) (group))
432*83ee113eSDavid van Moolenbroek 			return ISC_R_IOERROR;
433*83ee113eSDavid van Moolenbroek 	}
434*83ee113eSDavid van Moolenbroek 
435*83ee113eSDavid van Moolenbroek 	status = dhcp_group_destroy ((omapi_object_t *)group, MDL);
436*83ee113eSDavid van Moolenbroek 
437*83ee113eSDavid van Moolenbroek 	return status;
438*83ee113eSDavid van Moolenbroek }
439*83ee113eSDavid van Moolenbroek 
dhcp_control_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)440*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_set_value  (omapi_object_t *h,
441*83ee113eSDavid van Moolenbroek 				      omapi_object_t *id,
442*83ee113eSDavid van Moolenbroek 				      omapi_data_string_t *name,
443*83ee113eSDavid van Moolenbroek 				      omapi_typed_data_t *value)
444*83ee113eSDavid van Moolenbroek {
445*83ee113eSDavid van Moolenbroek 	dhcp_control_object_t *control;
446*83ee113eSDavid van Moolenbroek 	isc_result_t status;
447*83ee113eSDavid van Moolenbroek 	unsigned long newstate;
448*83ee113eSDavid van Moolenbroek 
449*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_control)
450*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
451*83ee113eSDavid van Moolenbroek 	control = (dhcp_control_object_t *)h;
452*83ee113eSDavid van Moolenbroek 
453*83ee113eSDavid van Moolenbroek 	if (!omapi_ds_strcmp (name, "state")) {
454*83ee113eSDavid van Moolenbroek 		status = omapi_get_int_value (&newstate, value);
455*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS)
456*83ee113eSDavid van Moolenbroek 			return status;
457*83ee113eSDavid van Moolenbroek 		status = dhcp_set_control_state (control -> state, newstate);
458*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
459*83ee113eSDavid van Moolenbroek 			control -> state = value -> u.integer;
460*83ee113eSDavid van Moolenbroek 		return status;
461*83ee113eSDavid van Moolenbroek 	}
462*83ee113eSDavid van Moolenbroek 
463*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
464*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> set_value) {
465*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> set_value))
466*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
467*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
468*83ee113eSDavid van Moolenbroek 			return status;
469*83ee113eSDavid van Moolenbroek 	}
470*83ee113eSDavid van Moolenbroek 
471*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
472*83ee113eSDavid van Moolenbroek }
473*83ee113eSDavid van Moolenbroek 
474*83ee113eSDavid van Moolenbroek 
dhcp_control_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)475*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_get_value (omapi_object_t *h, omapi_object_t *id,
476*83ee113eSDavid van Moolenbroek 				   omapi_data_string_t *name,
477*83ee113eSDavid van Moolenbroek 				   omapi_value_t **value)
478*83ee113eSDavid van Moolenbroek {
479*83ee113eSDavid van Moolenbroek 	dhcp_control_object_t *control;
480*83ee113eSDavid van Moolenbroek 	isc_result_t status;
481*83ee113eSDavid van Moolenbroek 
482*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_control)
483*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
484*83ee113eSDavid van Moolenbroek 	control = (dhcp_control_object_t *)h;
485*83ee113eSDavid van Moolenbroek 
486*83ee113eSDavid van Moolenbroek 	if (!omapi_ds_strcmp (name, "state"))
487*83ee113eSDavid van Moolenbroek 		return omapi_make_int_value (value,
488*83ee113eSDavid van Moolenbroek 					     name, (int)control -> state, MDL);
489*83ee113eSDavid van Moolenbroek 
490*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
491*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
492*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> get_value))
493*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
494*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
495*83ee113eSDavid van Moolenbroek 			return status;
496*83ee113eSDavid van Moolenbroek 	}
497*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
498*83ee113eSDavid van Moolenbroek }
499*83ee113eSDavid van Moolenbroek 
dhcp_control_destroy(omapi_object_t * h,const char * file,int line)500*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_destroy (omapi_object_t *h,
501*83ee113eSDavid van Moolenbroek 				   const char *file, int line)
502*83ee113eSDavid van Moolenbroek {
503*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_control)
504*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
505*83ee113eSDavid van Moolenbroek 
506*83ee113eSDavid van Moolenbroek 	/* Can't destroy the control object. */
507*83ee113eSDavid van Moolenbroek 	return ISC_R_NOPERM;
508*83ee113eSDavid van Moolenbroek }
509*83ee113eSDavid van Moolenbroek 
dhcp_control_signal_handler(omapi_object_t * h,const char * name,va_list ap)510*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_signal_handler (omapi_object_t *h,
511*83ee113eSDavid van Moolenbroek 					const char *name, va_list ap)
512*83ee113eSDavid van Moolenbroek {
513*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (dhcp_control_object_t *) */
514*83ee113eSDavid van Moolenbroek 
515*83ee113eSDavid van Moolenbroek 	isc_result_t status;
516*83ee113eSDavid van Moolenbroek 
517*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_control)
518*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
519*83ee113eSDavid van Moolenbroek 
520*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
521*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
522*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> signal_handler))
523*83ee113eSDavid van Moolenbroek 			  (h -> inner, name, ap));
524*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
525*83ee113eSDavid van Moolenbroek 			return status;
526*83ee113eSDavid van Moolenbroek 	}
527*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
528*83ee113eSDavid van Moolenbroek }
529*83ee113eSDavid van Moolenbroek 
dhcp_control_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * h)530*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_stuff_values (omapi_object_t *c,
531*83ee113eSDavid van Moolenbroek 					omapi_object_t *id,
532*83ee113eSDavid van Moolenbroek 					omapi_object_t *h)
533*83ee113eSDavid van Moolenbroek {
534*83ee113eSDavid van Moolenbroek 	dhcp_control_object_t *control;
535*83ee113eSDavid van Moolenbroek 	isc_result_t status;
536*83ee113eSDavid van Moolenbroek 
537*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_control)
538*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
539*83ee113eSDavid van Moolenbroek 	control = (dhcp_control_object_t *)h;
540*83ee113eSDavid van Moolenbroek 
541*83ee113eSDavid van Moolenbroek 	/* Write out all the values. */
542*83ee113eSDavid van Moolenbroek 	status = omapi_connection_put_name (c, "state");
543*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
544*83ee113eSDavid van Moolenbroek 		return status;
545*83ee113eSDavid van Moolenbroek 	status = omapi_connection_put_uint32 (c, sizeof (u_int32_t));
546*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
547*83ee113eSDavid van Moolenbroek 		return status;
548*83ee113eSDavid van Moolenbroek 	status = omapi_connection_put_uint32 (c, control -> state);
549*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
550*83ee113eSDavid van Moolenbroek 		return status;
551*83ee113eSDavid van Moolenbroek 
552*83ee113eSDavid van Moolenbroek 	/* Write out the inner object, if any. */
553*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> stuff_values) {
554*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> stuff_values))
555*83ee113eSDavid van Moolenbroek 			  (c, id, h -> inner));
556*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
557*83ee113eSDavid van Moolenbroek 			return status;
558*83ee113eSDavid van Moolenbroek 	}
559*83ee113eSDavid van Moolenbroek 
560*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
561*83ee113eSDavid van Moolenbroek }
562*83ee113eSDavid van Moolenbroek 
dhcp_control_lookup(omapi_object_t ** lp,omapi_object_t * id,omapi_object_t * ref)563*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_lookup (omapi_object_t **lp,
564*83ee113eSDavid van Moolenbroek 				  omapi_object_t *id, omapi_object_t *ref)
565*83ee113eSDavid van Moolenbroek {
566*83ee113eSDavid van Moolenbroek 	omapi_value_t *tv = (omapi_value_t *)0;
567*83ee113eSDavid van Moolenbroek 	isc_result_t status;
568*83ee113eSDavid van Moolenbroek 
569*83ee113eSDavid van Moolenbroek 	/* First see if we were sent a handle. */
570*83ee113eSDavid van Moolenbroek 	if (ref) {
571*83ee113eSDavid van Moolenbroek 		status = omapi_get_value_str (ref, id, "handle", &tv);
572*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS) {
573*83ee113eSDavid van Moolenbroek 			status = omapi_handle_td_lookup (lp, tv -> value);
574*83ee113eSDavid van Moolenbroek 
575*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (&tv, MDL);
576*83ee113eSDavid van Moolenbroek 			if (status != ISC_R_SUCCESS)
577*83ee113eSDavid van Moolenbroek 				return status;
578*83ee113eSDavid van Moolenbroek 
579*83ee113eSDavid van Moolenbroek 			/* Don't return the object if the type is wrong. */
580*83ee113eSDavid van Moolenbroek 			if ((*lp) -> type != dhcp_type_control) {
581*83ee113eSDavid van Moolenbroek 				omapi_object_dereference (lp, MDL);
582*83ee113eSDavid van Moolenbroek 				return DHCP_R_INVALIDARG;
583*83ee113eSDavid van Moolenbroek 			}
584*83ee113eSDavid van Moolenbroek 		}
585*83ee113eSDavid van Moolenbroek 	}
586*83ee113eSDavid van Moolenbroek 
587*83ee113eSDavid van Moolenbroek 	/* Otherwise, stop playing coy - there's only one control object,
588*83ee113eSDavid van Moolenbroek 	   so we can just return it. */
589*83ee113eSDavid van Moolenbroek 	dhcp_control_reference ((dhcp_control_object_t **)lp,
590*83ee113eSDavid van Moolenbroek 				dhcp_control_object, MDL);
591*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
592*83ee113eSDavid van Moolenbroek }
593*83ee113eSDavid van Moolenbroek 
dhcp_control_create(omapi_object_t ** lp,omapi_object_t * id)594*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_create (omapi_object_t **lp,
595*83ee113eSDavid van Moolenbroek 				  omapi_object_t *id)
596*83ee113eSDavid van Moolenbroek {
597*83ee113eSDavid van Moolenbroek 	/* Can't create a control object - there can be only one. */
598*83ee113eSDavid van Moolenbroek 	return ISC_R_NOPERM;
599*83ee113eSDavid van Moolenbroek }
600*83ee113eSDavid van Moolenbroek 
dhcp_control_remove(omapi_object_t * lp,omapi_object_t * id)601*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_remove (omapi_object_t *lp,
602*83ee113eSDavid van Moolenbroek 				omapi_object_t *id)
603*83ee113eSDavid van Moolenbroek {
604*83ee113eSDavid van Moolenbroek 	/* Form is emptiness; emptiness form.   The control object
605*83ee113eSDavid van Moolenbroek 	   cannot go out of existance. */
606*83ee113eSDavid van Moolenbroek 	return ISC_R_NOPERM;
607*83ee113eSDavid van Moolenbroek }
608*83ee113eSDavid van Moolenbroek 
dhcp_subnet_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)609*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_set_value  (omapi_object_t *h,
610*83ee113eSDavid van Moolenbroek 				     omapi_object_t *id,
611*83ee113eSDavid van Moolenbroek 				     omapi_data_string_t *name,
612*83ee113eSDavid van Moolenbroek 				     omapi_typed_data_t *value)
613*83ee113eSDavid van Moolenbroek {
614*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct subnet *) */
615*83ee113eSDavid van Moolenbroek 
616*83ee113eSDavid van Moolenbroek 	isc_result_t status;
617*83ee113eSDavid van Moolenbroek 
618*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_subnet)
619*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
620*83ee113eSDavid van Moolenbroek 
621*83ee113eSDavid van Moolenbroek 	/* No values to set yet. */
622*83ee113eSDavid van Moolenbroek 
623*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
624*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> set_value) {
625*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> set_value))
626*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
627*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
628*83ee113eSDavid van Moolenbroek 			return status;
629*83ee113eSDavid van Moolenbroek 	}
630*83ee113eSDavid van Moolenbroek 
631*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
632*83ee113eSDavid van Moolenbroek }
633*83ee113eSDavid van Moolenbroek 
634*83ee113eSDavid van Moolenbroek 
dhcp_subnet_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)635*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_get_value (omapi_object_t *h, omapi_object_t *id,
636*83ee113eSDavid van Moolenbroek 				    omapi_data_string_t *name,
637*83ee113eSDavid van Moolenbroek 				    omapi_value_t **value)
638*83ee113eSDavid van Moolenbroek {
639*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct subnet *) */
640*83ee113eSDavid van Moolenbroek 
641*83ee113eSDavid van Moolenbroek 	isc_result_t status;
642*83ee113eSDavid van Moolenbroek 
643*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_subnet)
644*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
645*83ee113eSDavid van Moolenbroek 
646*83ee113eSDavid van Moolenbroek 	/* No values to get yet. */
647*83ee113eSDavid van Moolenbroek 
648*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can provide the value. */
649*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
650*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> get_value))
651*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
652*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
653*83ee113eSDavid van Moolenbroek 			return status;
654*83ee113eSDavid van Moolenbroek 	}
655*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
656*83ee113eSDavid van Moolenbroek }
657*83ee113eSDavid van Moolenbroek 
dhcp_subnet_destroy(omapi_object_t * h,const char * file,int line)658*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_destroy (omapi_object_t *h, const char *file, int line)
659*83ee113eSDavid van Moolenbroek {
660*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \
661*83ee113eSDavid van Moolenbroek 		defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
662*83ee113eSDavid van Moolenbroek 	struct subnet *subnet;
663*83ee113eSDavid van Moolenbroek #endif
664*83ee113eSDavid van Moolenbroek 
665*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_subnet)
666*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
667*83ee113eSDavid van Moolenbroek 
668*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \
669*83ee113eSDavid van Moolenbroek 		defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
670*83ee113eSDavid van Moolenbroek 	subnet = (struct subnet *)h;
671*83ee113eSDavid van Moolenbroek 	if (subnet -> next_subnet)
672*83ee113eSDavid van Moolenbroek 		subnet_dereference (&subnet -> next_subnet, file, line);
673*83ee113eSDavid van Moolenbroek 	if (subnet -> next_sibling)
674*83ee113eSDavid van Moolenbroek 		subnet_dereference (&subnet -> next_sibling, file, line);
675*83ee113eSDavid van Moolenbroek 	if (subnet -> shared_network)
676*83ee113eSDavid van Moolenbroek 		shared_network_dereference (&subnet -> shared_network,
677*83ee113eSDavid van Moolenbroek 					    file, line);
678*83ee113eSDavid van Moolenbroek 	if (subnet -> interface)
679*83ee113eSDavid van Moolenbroek 		interface_dereference (&subnet -> interface, file, line);
680*83ee113eSDavid van Moolenbroek 	if (subnet -> group)
681*83ee113eSDavid van Moolenbroek 		group_dereference (&subnet -> group, file, line);
682*83ee113eSDavid van Moolenbroek #endif
683*83ee113eSDavid van Moolenbroek 
684*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
685*83ee113eSDavid van Moolenbroek }
686*83ee113eSDavid van Moolenbroek 
dhcp_subnet_signal_handler(omapi_object_t * h,const char * name,va_list ap)687*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_signal_handler (omapi_object_t *h,
688*83ee113eSDavid van Moolenbroek 					 const char *name, va_list ap)
689*83ee113eSDavid van Moolenbroek {
690*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct subnet *) */
691*83ee113eSDavid van Moolenbroek 
692*83ee113eSDavid van Moolenbroek 	isc_result_t status;
693*83ee113eSDavid van Moolenbroek 
694*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_subnet)
695*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
696*83ee113eSDavid van Moolenbroek 
697*83ee113eSDavid van Moolenbroek 	/* Can't write subnets yet. */
698*83ee113eSDavid van Moolenbroek 
699*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
700*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
701*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> signal_handler))
702*83ee113eSDavid van Moolenbroek 			  (h -> inner, name, ap));
703*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
704*83ee113eSDavid van Moolenbroek 			return status;
705*83ee113eSDavid van Moolenbroek 	}
706*83ee113eSDavid van Moolenbroek 
707*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
708*83ee113eSDavid van Moolenbroek }
709*83ee113eSDavid van Moolenbroek 
dhcp_subnet_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * h)710*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_stuff_values (omapi_object_t *c,
711*83ee113eSDavid van Moolenbroek 				       omapi_object_t *id,
712*83ee113eSDavid van Moolenbroek 				       omapi_object_t *h)
713*83ee113eSDavid van Moolenbroek {
714*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct subnet *) */
715*83ee113eSDavid van Moolenbroek 
716*83ee113eSDavid van Moolenbroek 	isc_result_t status;
717*83ee113eSDavid van Moolenbroek 
718*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_subnet)
719*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
720*83ee113eSDavid van Moolenbroek 
721*83ee113eSDavid van Moolenbroek 	/* Can't stuff subnet values yet. */
722*83ee113eSDavid van Moolenbroek 
723*83ee113eSDavid van Moolenbroek 	/* Write out the inner object, if any. */
724*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> stuff_values) {
725*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> stuff_values))
726*83ee113eSDavid van Moolenbroek 			  (c, id, h -> inner));
727*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
728*83ee113eSDavid van Moolenbroek 			return status;
729*83ee113eSDavid van Moolenbroek 	}
730*83ee113eSDavid van Moolenbroek 
731*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
732*83ee113eSDavid van Moolenbroek }
733*83ee113eSDavid van Moolenbroek 
dhcp_subnet_lookup(omapi_object_t ** lp,omapi_object_t * id,omapi_object_t * ref)734*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_lookup (omapi_object_t **lp,
735*83ee113eSDavid van Moolenbroek 				 omapi_object_t *id,
736*83ee113eSDavid van Moolenbroek 				 omapi_object_t *ref)
737*83ee113eSDavid van Moolenbroek {
738*83ee113eSDavid van Moolenbroek 	/* Can't look up subnets yet. */
739*83ee113eSDavid van Moolenbroek 
740*83ee113eSDavid van Moolenbroek 	/* If we get to here without finding a subnet, no valid key was
741*83ee113eSDavid van Moolenbroek 	   specified. */
742*83ee113eSDavid van Moolenbroek 	if (!*lp)
743*83ee113eSDavid van Moolenbroek 		return DHCP_R_NOKEYS;
744*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
745*83ee113eSDavid van Moolenbroek }
746*83ee113eSDavid van Moolenbroek 
dhcp_subnet_create(omapi_object_t ** lp,omapi_object_t * id)747*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_create (omapi_object_t **lp,
748*83ee113eSDavid van Moolenbroek 				 omapi_object_t *id)
749*83ee113eSDavid van Moolenbroek {
750*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTIMPLEMENTED;
751*83ee113eSDavid van Moolenbroek }
752*83ee113eSDavid van Moolenbroek 
dhcp_subnet_remove(omapi_object_t * lp,omapi_object_t * id)753*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_remove (omapi_object_t *lp,
754*83ee113eSDavid van Moolenbroek 			       omapi_object_t *id)
755*83ee113eSDavid van Moolenbroek {
756*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTIMPLEMENTED;
757*83ee113eSDavid van Moolenbroek }
758*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)759*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_set_value  (omapi_object_t *h,
760*83ee113eSDavid van Moolenbroek 					     omapi_object_t *id,
761*83ee113eSDavid van Moolenbroek 					     omapi_data_string_t *name,
762*83ee113eSDavid van Moolenbroek 					     omapi_typed_data_t *value)
763*83ee113eSDavid van Moolenbroek {
764*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct shared_network *) */
765*83ee113eSDavid van Moolenbroek 
766*83ee113eSDavid van Moolenbroek 	isc_result_t status;
767*83ee113eSDavid van Moolenbroek 
768*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_shared_network)
769*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
770*83ee113eSDavid van Moolenbroek 
771*83ee113eSDavid van Moolenbroek 	/* No values to set yet. */
772*83ee113eSDavid van Moolenbroek 
773*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
774*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> set_value) {
775*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> set_value))
776*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
777*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS || status == DHCP_R_UNCHANGED)
778*83ee113eSDavid van Moolenbroek 			return status;
779*83ee113eSDavid van Moolenbroek 	}
780*83ee113eSDavid van Moolenbroek 
781*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
782*83ee113eSDavid van Moolenbroek }
783*83ee113eSDavid van Moolenbroek 
784*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)785*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_get_value (omapi_object_t *h,
786*83ee113eSDavid van Moolenbroek 					    omapi_object_t *id,
787*83ee113eSDavid van Moolenbroek 					    omapi_data_string_t *name,
788*83ee113eSDavid van Moolenbroek 					    omapi_value_t **value)
789*83ee113eSDavid van Moolenbroek {
790*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct shared_network *) */
791*83ee113eSDavid van Moolenbroek 
792*83ee113eSDavid van Moolenbroek 	isc_result_t status;
793*83ee113eSDavid van Moolenbroek 
794*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_shared_network)
795*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
796*83ee113eSDavid van Moolenbroek 
797*83ee113eSDavid van Moolenbroek 	/* No values to get yet. */
798*83ee113eSDavid van Moolenbroek 
799*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can provide the value. */
800*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
801*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> get_value))
802*83ee113eSDavid van Moolenbroek 			  (h -> inner, id, name, value));
803*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
804*83ee113eSDavid van Moolenbroek 			return status;
805*83ee113eSDavid van Moolenbroek 	}
806*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
807*83ee113eSDavid van Moolenbroek }
808*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_destroy(omapi_object_t * h,const char * file,int line)809*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_destroy (omapi_object_t *h,
810*83ee113eSDavid van Moolenbroek 					  const char *file, int line)
811*83ee113eSDavid van Moolenbroek {
812*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct shared_network *) */
813*83ee113eSDavid van Moolenbroek 
814*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \
815*83ee113eSDavid van Moolenbroek     defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
816*83ee113eSDavid van Moolenbroek 	struct shared_network *shared_network;
817*83ee113eSDavid van Moolenbroek #endif
818*83ee113eSDavid van Moolenbroek 
819*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_shared_network)
820*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
821*83ee113eSDavid van Moolenbroek 
822*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \
823*83ee113eSDavid van Moolenbroek 		defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
824*83ee113eSDavid van Moolenbroek 	shared_network = (struct shared_network *)h;
825*83ee113eSDavid van Moolenbroek 	if (shared_network -> next)
826*83ee113eSDavid van Moolenbroek 		shared_network_dereference (&shared_network -> next,
827*83ee113eSDavid van Moolenbroek 					    file, line);
828*83ee113eSDavid van Moolenbroek 	if (shared_network -> name) {
829*83ee113eSDavid van Moolenbroek 		dfree (shared_network -> name, file, line);
830*83ee113eSDavid van Moolenbroek 		shared_network -> name = 0;
831*83ee113eSDavid van Moolenbroek 	}
832*83ee113eSDavid van Moolenbroek 	if (shared_network -> subnets)
833*83ee113eSDavid van Moolenbroek 		subnet_dereference (&shared_network -> subnets, file, line);
834*83ee113eSDavid van Moolenbroek 	if (shared_network -> interface)
835*83ee113eSDavid van Moolenbroek 		interface_dereference (&shared_network -> interface,
836*83ee113eSDavid van Moolenbroek 				       file, line);
837*83ee113eSDavid van Moolenbroek 	if (shared_network -> pools)
838*83ee113eSDavid van Moolenbroek 	    omapi_object_dereference ((omapi_object_t **)
839*83ee113eSDavid van Moolenbroek 				      &shared_network -> pools, file, line);
840*83ee113eSDavid van Moolenbroek 	if (shared_network -> group)
841*83ee113eSDavid van Moolenbroek 		group_dereference (&shared_network -> group, file, line);
842*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL)
843*83ee113eSDavid van Moolenbroek 	if (shared_network -> failover_peer)
844*83ee113eSDavid van Moolenbroek 	    omapi_object_dereference ((omapi_object_t **)
845*83ee113eSDavid van Moolenbroek 				      &shared_network -> failover_peer,
846*83ee113eSDavid van Moolenbroek 				      file, line);
847*83ee113eSDavid van Moolenbroek #endif
848*83ee113eSDavid van Moolenbroek #endif /* DEBUG_MEMORY_LEAKAGE */
849*83ee113eSDavid van Moolenbroek 
850*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
851*83ee113eSDavid van Moolenbroek }
852*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_signal_handler(omapi_object_t * h,const char * name,va_list ap)853*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_signal_handler (omapi_object_t *h,
854*83ee113eSDavid van Moolenbroek 						 const char *name,
855*83ee113eSDavid van Moolenbroek 						 va_list ap)
856*83ee113eSDavid van Moolenbroek {
857*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct shared_network *) */
858*83ee113eSDavid van Moolenbroek 
859*83ee113eSDavid van Moolenbroek 	isc_result_t status;
860*83ee113eSDavid van Moolenbroek 
861*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_shared_network)
862*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
863*83ee113eSDavid van Moolenbroek 
864*83ee113eSDavid van Moolenbroek 	/* Can't write shared_networks yet. */
865*83ee113eSDavid van Moolenbroek 
866*83ee113eSDavid van Moolenbroek 	/* Try to find some inner object that can take the value. */
867*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value) {
868*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> signal_handler))
869*83ee113eSDavid van Moolenbroek 			  (h -> inner, name, ap));
870*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
871*83ee113eSDavid van Moolenbroek 			return status;
872*83ee113eSDavid van Moolenbroek 	}
873*83ee113eSDavid van Moolenbroek 
874*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
875*83ee113eSDavid van Moolenbroek }
876*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * h)877*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_stuff_values (omapi_object_t *c,
878*83ee113eSDavid van Moolenbroek 					       omapi_object_t *id,
879*83ee113eSDavid van Moolenbroek 					       omapi_object_t *h)
880*83ee113eSDavid van Moolenbroek {
881*83ee113eSDavid van Moolenbroek 	/* In this function h should be a (struct shared_network *) */
882*83ee113eSDavid van Moolenbroek 
883*83ee113eSDavid van Moolenbroek 	isc_result_t status;
884*83ee113eSDavid van Moolenbroek 
885*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcp_type_shared_network)
886*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
887*83ee113eSDavid van Moolenbroek 
888*83ee113eSDavid van Moolenbroek 	/* Can't stuff shared_network values yet. */
889*83ee113eSDavid van Moolenbroek 
890*83ee113eSDavid van Moolenbroek 	/* Write out the inner object, if any. */
891*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> stuff_values) {
892*83ee113eSDavid van Moolenbroek 		status = ((*(h -> inner -> type -> stuff_values))
893*83ee113eSDavid van Moolenbroek 			  (c, id, h -> inner));
894*83ee113eSDavid van Moolenbroek 		if (status == ISC_R_SUCCESS)
895*83ee113eSDavid van Moolenbroek 			return status;
896*83ee113eSDavid van Moolenbroek 	}
897*83ee113eSDavid van Moolenbroek 
898*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
899*83ee113eSDavid van Moolenbroek }
900*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_lookup(omapi_object_t ** lp,omapi_object_t * id,omapi_object_t * ref)901*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_lookup (omapi_object_t **lp,
902*83ee113eSDavid van Moolenbroek 					 omapi_object_t *id,
903*83ee113eSDavid van Moolenbroek 					 omapi_object_t *ref)
904*83ee113eSDavid van Moolenbroek {
905*83ee113eSDavid van Moolenbroek 	/* Can't look up shared_networks yet. */
906*83ee113eSDavid van Moolenbroek 
907*83ee113eSDavid van Moolenbroek 	/* If we get to here without finding a shared_network, no valid key was
908*83ee113eSDavid van Moolenbroek 	   specified. */
909*83ee113eSDavid van Moolenbroek 	if (!*lp)
910*83ee113eSDavid van Moolenbroek 		return DHCP_R_NOKEYS;
911*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
912*83ee113eSDavid van Moolenbroek }
913*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_create(omapi_object_t ** lp,omapi_object_t * id)914*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_create (omapi_object_t **lp,
915*83ee113eSDavid van Moolenbroek 					 omapi_object_t *id)
916*83ee113eSDavid van Moolenbroek {
917*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTIMPLEMENTED;
918*83ee113eSDavid van Moolenbroek }
919*83ee113eSDavid van Moolenbroek 
dhcp_shared_network_remove(omapi_object_t * lp,omapi_object_t * id)920*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_remove (omapi_object_t *lp,
921*83ee113eSDavid van Moolenbroek 					 omapi_object_t *id)
922*83ee113eSDavid van Moolenbroek {
923*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTIMPLEMENTED;
924*83ee113eSDavid van Moolenbroek }
925*83ee113eSDavid van Moolenbroek 
926