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