xref: /minix3/external/bsd/dhcp/dist/omapip/support.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: support.c,v 1.1.1.3 2014/07/12 11:58:00 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* support.c
3*83ee113eSDavid van Moolenbroek 
4*83ee113eSDavid van Moolenbroek    Subroutines providing general support for objects. */
5*83ee113eSDavid van Moolenbroek 
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek  * Copyright (c) 2009,2012,2014 by Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek  * Copyright (c) 2004-2007 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: support.c,v 1.1.1.3 2014/07/12 11:58:00 spz Exp $");
33*83ee113eSDavid van Moolenbroek 
34*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
35*83ee113eSDavid van Moolenbroek 
36*83ee113eSDavid van Moolenbroek #include <omapip/omapip_p.h>
37*83ee113eSDavid van Moolenbroek 
38*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_connection;
39*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_listener;
40*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_io_object;
41*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_datagram;
42*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_generic;
43*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_protocol;
44*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_protocol_listener;
45*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_waiter;
46*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_remote;
47*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_message;
48*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_type_auth_key;
49*83ee113eSDavid van Moolenbroek 
50*83ee113eSDavid van Moolenbroek omapi_object_type_t *omapi_object_types;
51*83ee113eSDavid van Moolenbroek int omapi_object_type_count;
52*83ee113eSDavid van Moolenbroek 
53*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
omapi_type_relinquish()54*83ee113eSDavid van Moolenbroek void omapi_type_relinquish ()
55*83ee113eSDavid van Moolenbroek {
56*83ee113eSDavid van Moolenbroek 	omapi_object_type_t *t, *n;
57*83ee113eSDavid van Moolenbroek 
58*83ee113eSDavid van Moolenbroek 	for (t = omapi_object_types; t; t = n) {
59*83ee113eSDavid van Moolenbroek 		n = t -> next;
60*83ee113eSDavid van Moolenbroek 		dfree (t, MDL);
61*83ee113eSDavid van Moolenbroek 	}
62*83ee113eSDavid van Moolenbroek 	omapi_object_types = (omapi_object_type_t *)0;
63*83ee113eSDavid van Moolenbroek }
64*83ee113eSDavid van Moolenbroek #endif
65*83ee113eSDavid van Moolenbroek 
omapi_init(void)66*83ee113eSDavid van Moolenbroek isc_result_t omapi_init (void)
67*83ee113eSDavid van Moolenbroek {
68*83ee113eSDavid van Moolenbroek 	isc_result_t status;
69*83ee113eSDavid van Moolenbroek 
70*83ee113eSDavid van Moolenbroek 	/* Register all the standard object types... */
71*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_connection,
72*83ee113eSDavid van Moolenbroek 					     "connection",
73*83ee113eSDavid van Moolenbroek 					     omapi_connection_set_value,
74*83ee113eSDavid van Moolenbroek 					     omapi_connection_get_value,
75*83ee113eSDavid van Moolenbroek 					     omapi_connection_destroy,
76*83ee113eSDavid van Moolenbroek 					     omapi_connection_signal_handler,
77*83ee113eSDavid van Moolenbroek 					     omapi_connection_stuff_values,
78*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
79*83ee113eSDavid van Moolenbroek 					     sizeof
80*83ee113eSDavid van Moolenbroek 					     (omapi_connection_object_t), 0,
81*83ee113eSDavid van Moolenbroek 					     RC_MISC);
82*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
83*83ee113eSDavid van Moolenbroek 		return status;
84*83ee113eSDavid van Moolenbroek 
85*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_listener,
86*83ee113eSDavid van Moolenbroek 					     "listener",
87*83ee113eSDavid van Moolenbroek 					     omapi_listener_set_value,
88*83ee113eSDavid van Moolenbroek 					     omapi_listener_get_value,
89*83ee113eSDavid van Moolenbroek 					     omapi_listener_destroy,
90*83ee113eSDavid van Moolenbroek 					     omapi_listener_signal_handler,
91*83ee113eSDavid van Moolenbroek 					     omapi_listener_stuff_values,
92*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
93*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_listener_object_t),
94*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
95*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
96*83ee113eSDavid van Moolenbroek 		return status;
97*83ee113eSDavid van Moolenbroek 
98*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_io_object,
99*83ee113eSDavid van Moolenbroek 					     "io",
100*83ee113eSDavid van Moolenbroek 					     omapi_io_set_value,
101*83ee113eSDavid van Moolenbroek 					     omapi_io_get_value,
102*83ee113eSDavid van Moolenbroek 					     omapi_io_destroy,
103*83ee113eSDavid van Moolenbroek 					     omapi_io_signal_handler,
104*83ee113eSDavid van Moolenbroek 					     omapi_io_stuff_values,
105*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
106*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_io_object_t),
107*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
108*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
109*83ee113eSDavid van Moolenbroek 		return status;
110*83ee113eSDavid van Moolenbroek 
111*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_generic,
112*83ee113eSDavid van Moolenbroek 					     "generic",
113*83ee113eSDavid van Moolenbroek 					     omapi_generic_set_value,
114*83ee113eSDavid van Moolenbroek 					     omapi_generic_get_value,
115*83ee113eSDavid van Moolenbroek 					     omapi_generic_destroy,
116*83ee113eSDavid van Moolenbroek 					     omapi_generic_signal_handler,
117*83ee113eSDavid van Moolenbroek 					     omapi_generic_stuff_values,
118*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
119*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_generic_object_t),
120*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
121*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
122*83ee113eSDavid van Moolenbroek 		return status;
123*83ee113eSDavid van Moolenbroek 
124*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_protocol,
125*83ee113eSDavid van Moolenbroek 					     "protocol",
126*83ee113eSDavid van Moolenbroek 					     omapi_protocol_set_value,
127*83ee113eSDavid van Moolenbroek 					     omapi_protocol_get_value,
128*83ee113eSDavid van Moolenbroek 					     omapi_protocol_destroy,
129*83ee113eSDavid van Moolenbroek 					     omapi_protocol_signal_handler,
130*83ee113eSDavid van Moolenbroek 					     omapi_protocol_stuff_values,
131*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
132*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_protocol_object_t),
133*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
134*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
135*83ee113eSDavid van Moolenbroek 		return status;
136*83ee113eSDavid van Moolenbroek 
137*83ee113eSDavid van Moolenbroek 	status = (omapi_object_type_register
138*83ee113eSDavid van Moolenbroek 		  (&omapi_type_protocol_listener, "protocol-listener",
139*83ee113eSDavid van Moolenbroek 		   omapi_protocol_listener_set_value,
140*83ee113eSDavid van Moolenbroek 		   omapi_protocol_listener_get_value,
141*83ee113eSDavid van Moolenbroek 		   omapi_protocol_listener_destroy,
142*83ee113eSDavid van Moolenbroek 		   omapi_protocol_listener_signal,
143*83ee113eSDavid van Moolenbroek 		   omapi_protocol_listener_stuff,
144*83ee113eSDavid van Moolenbroek 		   0, 0, 0, 0, 0, 0,
145*83ee113eSDavid van Moolenbroek 		   sizeof (omapi_protocol_listener_object_t), 0, RC_MISC));
146*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
147*83ee113eSDavid van Moolenbroek 		return status;
148*83ee113eSDavid van Moolenbroek 
149*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_message,
150*83ee113eSDavid van Moolenbroek 					     "message",
151*83ee113eSDavid van Moolenbroek 					     omapi_message_set_value,
152*83ee113eSDavid van Moolenbroek 					     omapi_message_get_value,
153*83ee113eSDavid van Moolenbroek 					     omapi_message_destroy,
154*83ee113eSDavid van Moolenbroek 					     omapi_message_signal_handler,
155*83ee113eSDavid van Moolenbroek 					     omapi_message_stuff_values,
156*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
157*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_message_object_t),
158*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
159*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
160*83ee113eSDavid van Moolenbroek 		return status;
161*83ee113eSDavid van Moolenbroek 
162*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_waiter,
163*83ee113eSDavid van Moolenbroek 					     "waiter",
164*83ee113eSDavid van Moolenbroek 					     0,
165*83ee113eSDavid van Moolenbroek 					     0,
166*83ee113eSDavid van Moolenbroek 					     0,
167*83ee113eSDavid van Moolenbroek 					     omapi_waiter_signal_handler, 0,
168*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0, 0,
169*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_waiter_object_t),
170*83ee113eSDavid van Moolenbroek 					     0, RC_MISC);
171*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
172*83ee113eSDavid van Moolenbroek 		return status;
173*83ee113eSDavid van Moolenbroek 
174*83ee113eSDavid van Moolenbroek 	status = omapi_object_type_register (&omapi_type_auth_key,
175*83ee113eSDavid van Moolenbroek 					     "authenticator",
176*83ee113eSDavid van Moolenbroek 					     0,
177*83ee113eSDavid van Moolenbroek 					     omapi_auth_key_get_value,
178*83ee113eSDavid van Moolenbroek 					     omapi_auth_key_destroy,
179*83ee113eSDavid van Moolenbroek 					     0,
180*83ee113eSDavid van Moolenbroek 					     omapi_auth_key_stuff_values,
181*83ee113eSDavid van Moolenbroek 					     omapi_auth_key_lookup,
182*83ee113eSDavid van Moolenbroek 					     0, 0, 0, 0, 0,
183*83ee113eSDavid van Moolenbroek 					     sizeof (omapi_auth_key_t), 0,
184*83ee113eSDavid van Moolenbroek 					     RC_MISC);
185*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
186*83ee113eSDavid van Moolenbroek 		return status;
187*83ee113eSDavid van Moolenbroek 
188*83ee113eSDavid van Moolenbroek #if defined (TRACING)
189*83ee113eSDavid van Moolenbroek 	omapi_listener_trace_setup ();
190*83ee113eSDavid van Moolenbroek 	omapi_connection_trace_setup ();
191*83ee113eSDavid van Moolenbroek 	omapi_buffer_trace_setup ();
192*83ee113eSDavid van Moolenbroek #endif
193*83ee113eSDavid van Moolenbroek 
194*83ee113eSDavid van Moolenbroek 	/* This seems silly, but leave it. */
195*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
196*83ee113eSDavid van Moolenbroek }
197*83ee113eSDavid van Moolenbroek 
omapi_object_type_register(omapi_object_type_t ** type,const char * name,isc_result_t (* set_value)(omapi_object_t *,omapi_object_t *,omapi_data_string_t *,omapi_typed_data_t *),isc_result_t (* get_value)(omapi_object_t *,omapi_object_t *,omapi_data_string_t *,omapi_value_t **),isc_result_t (* destroy)(omapi_object_t *,const char *,int),isc_result_t (* signal_handler)(omapi_object_t *,const char *,va_list),isc_result_t (* stuff_values)(omapi_object_t *,omapi_object_t *,omapi_object_t *),isc_result_t (* lookup)(omapi_object_t **,omapi_object_t *,omapi_object_t *),isc_result_t (* create)(omapi_object_t **,omapi_object_t *),isc_result_t (* remove)(omapi_object_t *,omapi_object_t *),isc_result_t (* freer)(omapi_object_t *,const char *,int),isc_result_t (* allocator)(omapi_object_t **,const char *,int),isc_result_t (* sizer)(size_t),size_t size,isc_result_t (* initialize)(omapi_object_t *,const char *,int),int rc_flag)198*83ee113eSDavid van Moolenbroek isc_result_t omapi_object_type_register (omapi_object_type_t **type,
199*83ee113eSDavid van Moolenbroek 					 const char *name,
200*83ee113eSDavid van Moolenbroek 					 isc_result_t (*set_value)
201*83ee113eSDavid van Moolenbroek 						 (omapi_object_t *,
202*83ee113eSDavid van Moolenbroek 						  omapi_object_t *,
203*83ee113eSDavid van Moolenbroek 						  omapi_data_string_t *,
204*83ee113eSDavid van Moolenbroek 						  omapi_typed_data_t *),
205*83ee113eSDavid van Moolenbroek 					 isc_result_t (*get_value)
206*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
207*83ee113eSDavid van Moolenbroek 						 omapi_object_t *,
208*83ee113eSDavid van Moolenbroek 						 omapi_data_string_t *,
209*83ee113eSDavid van Moolenbroek 						 omapi_value_t **),
210*83ee113eSDavid van Moolenbroek 					 isc_result_t (*destroy)
211*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
212*83ee113eSDavid van Moolenbroek 						 const char *, int),
213*83ee113eSDavid van Moolenbroek 					 isc_result_t (*signal_handler)
214*83ee113eSDavid van Moolenbroek 						 (omapi_object_t *,
215*83ee113eSDavid van Moolenbroek 						  const char *, va_list),
216*83ee113eSDavid van Moolenbroek 					 isc_result_t (*stuff_values)
217*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
218*83ee113eSDavid van Moolenbroek 						 omapi_object_t *,
219*83ee113eSDavid van Moolenbroek 						 omapi_object_t *),
220*83ee113eSDavid van Moolenbroek 					 isc_result_t (*lookup)
221*83ee113eSDavid van Moolenbroek 						(omapi_object_t **,
222*83ee113eSDavid van Moolenbroek 						 omapi_object_t *,
223*83ee113eSDavid van Moolenbroek 						 omapi_object_t *),
224*83ee113eSDavid van Moolenbroek 					 isc_result_t (*create)
225*83ee113eSDavid van Moolenbroek 						(omapi_object_t **,
226*83ee113eSDavid van Moolenbroek 						 omapi_object_t *),
227*83ee113eSDavid van Moolenbroek 					 isc_result_t (*remove)
228*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
229*83ee113eSDavid van Moolenbroek 						 omapi_object_t *),
230*83ee113eSDavid van Moolenbroek 					 isc_result_t (*freer)
231*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
232*83ee113eSDavid van Moolenbroek 						 const char *, int),
233*83ee113eSDavid van Moolenbroek 					 isc_result_t (*allocator)
234*83ee113eSDavid van Moolenbroek 						(omapi_object_t **,
235*83ee113eSDavid van Moolenbroek 						 const char *, int),
236*83ee113eSDavid van Moolenbroek 					 isc_result_t (*sizer) (size_t),
237*83ee113eSDavid van Moolenbroek 					 size_t size,
238*83ee113eSDavid van Moolenbroek 					 isc_result_t (*initialize)
239*83ee113eSDavid van Moolenbroek 						(omapi_object_t *,
240*83ee113eSDavid van Moolenbroek 						 const char *, int),
241*83ee113eSDavid van Moolenbroek 					 int rc_flag)
242*83ee113eSDavid van Moolenbroek {
243*83ee113eSDavid van Moolenbroek 	omapi_object_type_t *t;
244*83ee113eSDavid van Moolenbroek 
245*83ee113eSDavid van Moolenbroek 	t = dmalloc (sizeof *t, MDL);
246*83ee113eSDavid van Moolenbroek 	if (!t)
247*83ee113eSDavid van Moolenbroek 		return ISC_R_NOMEMORY;
248*83ee113eSDavid van Moolenbroek 	memset (t, 0, sizeof *t);
249*83ee113eSDavid van Moolenbroek 
250*83ee113eSDavid van Moolenbroek 	t -> name = name;
251*83ee113eSDavid van Moolenbroek 	t -> set_value = set_value;
252*83ee113eSDavid van Moolenbroek 	t -> get_value = get_value;
253*83ee113eSDavid van Moolenbroek 	t -> destroy = destroy;
254*83ee113eSDavid van Moolenbroek 	t -> signal_handler = signal_handler;
255*83ee113eSDavid van Moolenbroek 	t -> stuff_values = stuff_values;
256*83ee113eSDavid van Moolenbroek 	t -> lookup = lookup;
257*83ee113eSDavid van Moolenbroek 	t -> create = create;
258*83ee113eSDavid van Moolenbroek 	t -> remove = remove;
259*83ee113eSDavid van Moolenbroek 	t -> next = omapi_object_types;
260*83ee113eSDavid van Moolenbroek 	t -> sizer = sizer;
261*83ee113eSDavid van Moolenbroek 	t -> size = size;
262*83ee113eSDavid van Moolenbroek 	t -> freer = freer;
263*83ee113eSDavid van Moolenbroek 	t -> allocator = allocator;
264*83ee113eSDavid van Moolenbroek 	t -> initialize = initialize;
265*83ee113eSDavid van Moolenbroek 	t -> rc_flag = rc_flag;
266*83ee113eSDavid van Moolenbroek 	omapi_object_types = t;
267*83ee113eSDavid van Moolenbroek 	if (type)
268*83ee113eSDavid van Moolenbroek 		*type = t;
269*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
270*83ee113eSDavid van Moolenbroek }
271*83ee113eSDavid van Moolenbroek 
omapi_signal(omapi_object_t * handle,const char * name,...)272*83ee113eSDavid van Moolenbroek isc_result_t omapi_signal (omapi_object_t *handle, const char *name, ...)
273*83ee113eSDavid van Moolenbroek {
274*83ee113eSDavid van Moolenbroek 	va_list ap;
275*83ee113eSDavid van Moolenbroek 	omapi_object_t *outer;
276*83ee113eSDavid van Moolenbroek 	isc_result_t status;
277*83ee113eSDavid van Moolenbroek 
278*83ee113eSDavid van Moolenbroek 	va_start (ap, name);
279*83ee113eSDavid van Moolenbroek 	for (outer = handle; outer -> outer; outer = outer -> outer)
280*83ee113eSDavid van Moolenbroek 		;
281*83ee113eSDavid van Moolenbroek 	if (outer -> type -> signal_handler)
282*83ee113eSDavid van Moolenbroek 		status = (*(outer -> type -> signal_handler)) (outer,
283*83ee113eSDavid van Moolenbroek 							       name, ap);
284*83ee113eSDavid van Moolenbroek 	else
285*83ee113eSDavid van Moolenbroek 		status = ISC_R_NOTFOUND;
286*83ee113eSDavid van Moolenbroek 	va_end (ap);
287*83ee113eSDavid van Moolenbroek 	return status;
288*83ee113eSDavid van Moolenbroek }
289*83ee113eSDavid van Moolenbroek 
omapi_signal_in(omapi_object_t * handle,const char * name,...)290*83ee113eSDavid van Moolenbroek isc_result_t omapi_signal_in (omapi_object_t *handle, const char *name, ...)
291*83ee113eSDavid van Moolenbroek {
292*83ee113eSDavid van Moolenbroek 	va_list ap;
293*83ee113eSDavid van Moolenbroek 	isc_result_t status;
294*83ee113eSDavid van Moolenbroek 
295*83ee113eSDavid van Moolenbroek 	if (!handle)
296*83ee113eSDavid van Moolenbroek 		return ISC_R_NOTFOUND;
297*83ee113eSDavid van Moolenbroek 	va_start (ap, name);
298*83ee113eSDavid van Moolenbroek 
299*83ee113eSDavid van Moolenbroek 	if (handle -> type -> signal_handler)
300*83ee113eSDavid van Moolenbroek 		status = (*(handle -> type -> signal_handler)) (handle,
301*83ee113eSDavid van Moolenbroek 								name, ap);
302*83ee113eSDavid van Moolenbroek 	else
303*83ee113eSDavid van Moolenbroek 		status = ISC_R_NOTFOUND;
304*83ee113eSDavid van Moolenbroek 	va_end (ap);
305*83ee113eSDavid van Moolenbroek 	return status;
306*83ee113eSDavid van Moolenbroek }
307*83ee113eSDavid van Moolenbroek 
omapi_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)308*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_value (omapi_object_t *h,
309*83ee113eSDavid van Moolenbroek 			      omapi_object_t *id,
310*83ee113eSDavid van Moolenbroek 			      omapi_data_string_t *name,
311*83ee113eSDavid van Moolenbroek 			      omapi_typed_data_t *value)
312*83ee113eSDavid van Moolenbroek {
313*83ee113eSDavid van Moolenbroek 	omapi_object_t *outer;
314*83ee113eSDavid van Moolenbroek 	isc_result_t status;
315*83ee113eSDavid van Moolenbroek 
316*83ee113eSDavid van Moolenbroek #if defined (DEBUG)
317*83ee113eSDavid van Moolenbroek 	if (!value) {
318*83ee113eSDavid van Moolenbroek 		log_info ("omapi_set_value (%.*s, NULL)",
319*83ee113eSDavid van Moolenbroek 			  (int)name -> len, name -> value);
320*83ee113eSDavid van Moolenbroek 	} else if (value -> type == omapi_datatype_int) {
321*83ee113eSDavid van Moolenbroek 		log_info ("omapi_set_value (%.*s, %ld)",
322*83ee113eSDavid van Moolenbroek 			  (int)name -> len, name -> value,
323*83ee113eSDavid van Moolenbroek 			  (long)value -> u.integer);
324*83ee113eSDavid van Moolenbroek 	} else if (value -> type == omapi_datatype_string) {
325*83ee113eSDavid van Moolenbroek 		log_info ("omapi_set_value (%.*s, %.*s)",
326*83ee113eSDavid van Moolenbroek 			  (int)name -> len, name -> value,
327*83ee113eSDavid van Moolenbroek 			  (int)value -> u.buffer.len, value -> u.buffer.value);
328*83ee113eSDavid van Moolenbroek 	} else if (value -> type == omapi_datatype_data) {
329*83ee113eSDavid van Moolenbroek 		log_info ("omapi_set_value (%.*s, %ld %lx)",
330*83ee113eSDavid van Moolenbroek 			  (int)name -> len, name -> value,
331*83ee113eSDavid van Moolenbroek 			  (long)value -> u.buffer.len,
332*83ee113eSDavid van Moolenbroek 			  (unsigned long)value -> u.buffer.value);
333*83ee113eSDavid van Moolenbroek 	} else if (value -> type == omapi_datatype_object) {
334*83ee113eSDavid van Moolenbroek 		log_info ("omapi_set_value (%.*s, %s)",
335*83ee113eSDavid van Moolenbroek 			  (int)name -> len, name -> value,
336*83ee113eSDavid van Moolenbroek 			  value -> u.object
337*83ee113eSDavid van Moolenbroek 			  ? (value -> u.object -> type
338*83ee113eSDavid van Moolenbroek 			     ? value -> u.object -> type -> name
339*83ee113eSDavid van Moolenbroek 			     : "(unknown object)")
340*83ee113eSDavid van Moolenbroek 			  : "(unknown object)");
341*83ee113eSDavid van Moolenbroek 	}
342*83ee113eSDavid van Moolenbroek #endif
343*83ee113eSDavid van Moolenbroek 
344*83ee113eSDavid van Moolenbroek 	for (outer = h; outer -> outer; outer = outer -> outer)
345*83ee113eSDavid van Moolenbroek 		;
346*83ee113eSDavid van Moolenbroek 	if (outer -> type -> set_value)
347*83ee113eSDavid van Moolenbroek 		status = (*(outer -> type -> set_value)) (outer,
348*83ee113eSDavid van Moolenbroek 							  id, name, value);
349*83ee113eSDavid van Moolenbroek 	else
350*83ee113eSDavid van Moolenbroek 		status = ISC_R_NOTFOUND;
351*83ee113eSDavid van Moolenbroek #if defined (DEBUG)
352*83ee113eSDavid van Moolenbroek 	log_info (" ==> %s", isc_result_totext (status));
353*83ee113eSDavid van Moolenbroek #endif
354*83ee113eSDavid van Moolenbroek 	return status;
355*83ee113eSDavid van Moolenbroek }
356*83ee113eSDavid van Moolenbroek 
omapi_set_value_str(omapi_object_t * h,omapi_object_t * id,const char * name,omapi_typed_data_t * value)357*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_value_str (omapi_object_t *h,
358*83ee113eSDavid van Moolenbroek 				  omapi_object_t *id,
359*83ee113eSDavid van Moolenbroek 				  const char *name,
360*83ee113eSDavid van Moolenbroek 				  omapi_typed_data_t *value)
361*83ee113eSDavid van Moolenbroek {
362*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *nds;
363*83ee113eSDavid van Moolenbroek 	isc_result_t status;
364*83ee113eSDavid van Moolenbroek 
365*83ee113eSDavid van Moolenbroek 	nds = (omapi_data_string_t *)0;
366*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&nds, strlen (name), MDL);
367*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
368*83ee113eSDavid van Moolenbroek 		return status;
369*83ee113eSDavid van Moolenbroek 	memcpy (nds -> value, name, strlen (name));
370*83ee113eSDavid van Moolenbroek 
371*83ee113eSDavid van Moolenbroek 	status = omapi_set_value (h, id, nds, value);
372*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&nds, MDL);
373*83ee113eSDavid van Moolenbroek 	return status;
374*83ee113eSDavid van Moolenbroek }
375*83ee113eSDavid van Moolenbroek 
omapi_set_boolean_value(omapi_object_t * h,omapi_object_t * id,const char * name,int value)376*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_boolean_value (omapi_object_t *h, omapi_object_t *id,
377*83ee113eSDavid van Moolenbroek 				      const char *name, int value)
378*83ee113eSDavid van Moolenbroek {
379*83ee113eSDavid van Moolenbroek 	isc_result_t status;
380*83ee113eSDavid van Moolenbroek 	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
381*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *n = (omapi_data_string_t *)0;
382*83ee113eSDavid van Moolenbroek 
383*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&n, strlen (name), MDL);
384*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
385*83ee113eSDavid van Moolenbroek 		return status;
386*83ee113eSDavid van Moolenbroek 	memcpy (n -> value, name, strlen (name));
387*83ee113eSDavid van Moolenbroek 
388*83ee113eSDavid van Moolenbroek 	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
389*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
390*83ee113eSDavid van Moolenbroek 		omapi_data_string_dereference (&n, MDL);
391*83ee113eSDavid van Moolenbroek 		return status;
392*83ee113eSDavid van Moolenbroek 	}
393*83ee113eSDavid van Moolenbroek 
394*83ee113eSDavid van Moolenbroek 	status = omapi_set_value (h, id, n, tv);
395*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&n, MDL);
396*83ee113eSDavid van Moolenbroek 	omapi_typed_data_dereference (&tv, MDL);
397*83ee113eSDavid van Moolenbroek 	return status;
398*83ee113eSDavid van Moolenbroek }
399*83ee113eSDavid van Moolenbroek 
omapi_set_int_value(omapi_object_t * h,omapi_object_t * id,const char * name,int value)400*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_int_value (omapi_object_t *h, omapi_object_t *id,
401*83ee113eSDavid van Moolenbroek 				  const char *name, int value)
402*83ee113eSDavid van Moolenbroek {
403*83ee113eSDavid van Moolenbroek 	isc_result_t status;
404*83ee113eSDavid van Moolenbroek 	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
405*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *n = (omapi_data_string_t *)0;
406*83ee113eSDavid van Moolenbroek 
407*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&n, strlen (name), MDL);
408*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
409*83ee113eSDavid van Moolenbroek 		return status;
410*83ee113eSDavid van Moolenbroek 	memcpy (n -> value, name, strlen (name));
411*83ee113eSDavid van Moolenbroek 
412*83ee113eSDavid van Moolenbroek 	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
413*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
414*83ee113eSDavid van Moolenbroek 		omapi_data_string_dereference (&n, MDL);
415*83ee113eSDavid van Moolenbroek 		return status;
416*83ee113eSDavid van Moolenbroek 	}
417*83ee113eSDavid van Moolenbroek 
418*83ee113eSDavid van Moolenbroek 	status = omapi_set_value (h, id, n, tv);
419*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&n, MDL);
420*83ee113eSDavid van Moolenbroek 	omapi_typed_data_dereference (&tv, MDL);
421*83ee113eSDavid van Moolenbroek 	return status;
422*83ee113eSDavid van Moolenbroek }
423*83ee113eSDavid van Moolenbroek 
omapi_set_object_value(omapi_object_t * h,omapi_object_t * id,const char * name,omapi_object_t * value)424*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_object_value (omapi_object_t *h, omapi_object_t *id,
425*83ee113eSDavid van Moolenbroek 				     const char *name, omapi_object_t *value)
426*83ee113eSDavid van Moolenbroek {
427*83ee113eSDavid van Moolenbroek 	isc_result_t status;
428*83ee113eSDavid van Moolenbroek 	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
429*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *n = (omapi_data_string_t *)0;
430*83ee113eSDavid van Moolenbroek 
431*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&n, strlen (name), MDL);
432*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
433*83ee113eSDavid van Moolenbroek 		return status;
434*83ee113eSDavid van Moolenbroek 	memcpy (n -> value, name, strlen (name));
435*83ee113eSDavid van Moolenbroek 
436*83ee113eSDavid van Moolenbroek 	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_object, value);
437*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
438*83ee113eSDavid van Moolenbroek 		omapi_data_string_dereference (&n, MDL);
439*83ee113eSDavid van Moolenbroek 		return status;
440*83ee113eSDavid van Moolenbroek 	}
441*83ee113eSDavid van Moolenbroek 
442*83ee113eSDavid van Moolenbroek 	status = omapi_set_value (h, id, n, tv);
443*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&n, MDL);
444*83ee113eSDavid van Moolenbroek 	omapi_typed_data_dereference (&tv, MDL);
445*83ee113eSDavid van Moolenbroek 	return status;
446*83ee113eSDavid van Moolenbroek }
447*83ee113eSDavid van Moolenbroek 
omapi_set_string_value(omapi_object_t * h,omapi_object_t * id,const char * name,const char * value)448*83ee113eSDavid van Moolenbroek isc_result_t omapi_set_string_value (omapi_object_t *h, omapi_object_t *id,
449*83ee113eSDavid van Moolenbroek 				     const char *name, const char *value)
450*83ee113eSDavid van Moolenbroek {
451*83ee113eSDavid van Moolenbroek 	isc_result_t status;
452*83ee113eSDavid van Moolenbroek 	omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
453*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *n = (omapi_data_string_t *)0;
454*83ee113eSDavid van Moolenbroek 
455*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&n, strlen (name), MDL);
456*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
457*83ee113eSDavid van Moolenbroek 		return status;
458*83ee113eSDavid van Moolenbroek 	memcpy (n -> value, name, strlen (name));
459*83ee113eSDavid van Moolenbroek 
460*83ee113eSDavid van Moolenbroek 	status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value);
461*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
462*83ee113eSDavid van Moolenbroek 		omapi_data_string_dereference (&n, MDL);
463*83ee113eSDavid van Moolenbroek 		return status;
464*83ee113eSDavid van Moolenbroek 	}
465*83ee113eSDavid van Moolenbroek 
466*83ee113eSDavid van Moolenbroek 	status = omapi_set_value (h, id, n, tv);
467*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&n, MDL);
468*83ee113eSDavid van Moolenbroek 	omapi_typed_data_dereference (&tv, MDL);
469*83ee113eSDavid van Moolenbroek 	return status;
470*83ee113eSDavid van Moolenbroek }
471*83ee113eSDavid van Moolenbroek 
omapi_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)472*83ee113eSDavid van Moolenbroek isc_result_t omapi_get_value (omapi_object_t *h,
473*83ee113eSDavid van Moolenbroek 			      omapi_object_t *id,
474*83ee113eSDavid van Moolenbroek 			      omapi_data_string_t *name,
475*83ee113eSDavid van Moolenbroek 			      omapi_value_t **value)
476*83ee113eSDavid van Moolenbroek {
477*83ee113eSDavid van Moolenbroek 	omapi_object_t *outer;
478*83ee113eSDavid van Moolenbroek 
479*83ee113eSDavid van Moolenbroek 	for (outer = h; outer -> outer; outer = outer -> outer)
480*83ee113eSDavid van Moolenbroek 		;
481*83ee113eSDavid van Moolenbroek 	if (outer -> type -> get_value)
482*83ee113eSDavid van Moolenbroek 		return (*(outer -> type -> get_value)) (outer,
483*83ee113eSDavid van Moolenbroek 							id, name, value);
484*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
485*83ee113eSDavid van Moolenbroek }
486*83ee113eSDavid van Moolenbroek 
omapi_get_value_str(omapi_object_t * h,omapi_object_t * id,const char * name,omapi_value_t ** value)487*83ee113eSDavid van Moolenbroek isc_result_t omapi_get_value_str (omapi_object_t *h,
488*83ee113eSDavid van Moolenbroek 				  omapi_object_t *id,
489*83ee113eSDavid van Moolenbroek 				  const char *name,
490*83ee113eSDavid van Moolenbroek 				  omapi_value_t **value)
491*83ee113eSDavid van Moolenbroek {
492*83ee113eSDavid van Moolenbroek 	omapi_object_t *outer;
493*83ee113eSDavid van Moolenbroek 	omapi_data_string_t *nds;
494*83ee113eSDavid van Moolenbroek 	isc_result_t status;
495*83ee113eSDavid van Moolenbroek 
496*83ee113eSDavid van Moolenbroek 	nds = (omapi_data_string_t *)0;
497*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_new (&nds, strlen (name), MDL);
498*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
499*83ee113eSDavid van Moolenbroek 		return status;
500*83ee113eSDavid van Moolenbroek 	memcpy (nds -> value, name, strlen (name));
501*83ee113eSDavid van Moolenbroek 
502*83ee113eSDavid van Moolenbroek 	for (outer = h; outer -> outer; outer = outer -> outer)
503*83ee113eSDavid van Moolenbroek 		;
504*83ee113eSDavid van Moolenbroek 	if (outer -> type -> get_value)
505*83ee113eSDavid van Moolenbroek 		status = (*(outer -> type -> get_value)) (outer,
506*83ee113eSDavid van Moolenbroek 							  id, nds, value);
507*83ee113eSDavid van Moolenbroek 	else
508*83ee113eSDavid van Moolenbroek 		status = ISC_R_NOTFOUND;
509*83ee113eSDavid van Moolenbroek 	omapi_data_string_dereference (&nds, MDL);
510*83ee113eSDavid van Moolenbroek 	return status;
511*83ee113eSDavid van Moolenbroek }
512*83ee113eSDavid van Moolenbroek 
omapi_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * o)513*83ee113eSDavid van Moolenbroek isc_result_t omapi_stuff_values (omapi_object_t *c,
514*83ee113eSDavid van Moolenbroek 				 omapi_object_t *id,
515*83ee113eSDavid van Moolenbroek 				 omapi_object_t *o)
516*83ee113eSDavid van Moolenbroek {
517*83ee113eSDavid van Moolenbroek 	omapi_object_t *outer;
518*83ee113eSDavid van Moolenbroek 
519*83ee113eSDavid van Moolenbroek 	for (outer = o; outer -> outer; outer = outer -> outer)
520*83ee113eSDavid van Moolenbroek 		;
521*83ee113eSDavid van Moolenbroek 	if (outer -> type -> stuff_values)
522*83ee113eSDavid van Moolenbroek 		return (*(outer -> type -> stuff_values)) (c, id, outer);
523*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
524*83ee113eSDavid van Moolenbroek }
525*83ee113eSDavid van Moolenbroek 
omapi_object_create(omapi_object_t ** obj,omapi_object_t * id,omapi_object_type_t * type)526*83ee113eSDavid van Moolenbroek isc_result_t omapi_object_create (omapi_object_t **obj, omapi_object_t *id,
527*83ee113eSDavid van Moolenbroek 				  omapi_object_type_t *type)
528*83ee113eSDavid van Moolenbroek {
529*83ee113eSDavid van Moolenbroek 	if (!type -> create)
530*83ee113eSDavid van Moolenbroek 		return ISC_R_NOTIMPLEMENTED;
531*83ee113eSDavid van Moolenbroek 	return (*(type -> create)) (obj, id);
532*83ee113eSDavid van Moolenbroek }
533*83ee113eSDavid van Moolenbroek 
omapi_object_update(omapi_object_t * obj,omapi_object_t * id,omapi_object_t * src,omapi_handle_t handle)534*83ee113eSDavid van Moolenbroek isc_result_t omapi_object_update (omapi_object_t *obj, omapi_object_t *id,
535*83ee113eSDavid van Moolenbroek 				  omapi_object_t *src, omapi_handle_t handle)
536*83ee113eSDavid van Moolenbroek {
537*83ee113eSDavid van Moolenbroek 	omapi_generic_object_t *gsrc;
538*83ee113eSDavid van Moolenbroek 	isc_result_t status;
539*83ee113eSDavid van Moolenbroek 	int i;
540*83ee113eSDavid van Moolenbroek 
541*83ee113eSDavid van Moolenbroek 	if (!src)
542*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
543*83ee113eSDavid van Moolenbroek 	if (src -> type != omapi_type_generic)
544*83ee113eSDavid van Moolenbroek 		return ISC_R_NOTIMPLEMENTED;
545*83ee113eSDavid van Moolenbroek 	gsrc = (omapi_generic_object_t *)src;
546*83ee113eSDavid van Moolenbroek 	for (i = 0; i < gsrc -> nvalues; i++) {
547*83ee113eSDavid van Moolenbroek 		status = omapi_set_value (obj, id,
548*83ee113eSDavid van Moolenbroek 					  gsrc -> values [i] -> name,
549*83ee113eSDavid van Moolenbroek 					  gsrc -> values [i] -> value);
550*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS && status != DHCP_R_UNCHANGED)
551*83ee113eSDavid van Moolenbroek 			return status;
552*83ee113eSDavid van Moolenbroek 	}
553*83ee113eSDavid van Moolenbroek 
554*83ee113eSDavid van Moolenbroek 	/*
555*83ee113eSDavid van Moolenbroek 	 * For now ignore the return value.  I'm not sure if we want to
556*83ee113eSDavid van Moolenbroek 	 * generate an error if we can't set the handle value.  If we
557*83ee113eSDavid van Moolenbroek 	 * do add a check we probably should allow unchanged and notfound
558*83ee113eSDavid van Moolenbroek 	 */
559*83ee113eSDavid van Moolenbroek 	if (handle)
560*83ee113eSDavid van Moolenbroek 		(void) omapi_set_int_value (obj, id, "remote-handle", (int)handle);
561*83ee113eSDavid van Moolenbroek 	status = omapi_signal (obj, "updated");
562*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_NOTFOUND)
563*83ee113eSDavid van Moolenbroek 		return status;
564*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
565*83ee113eSDavid van Moolenbroek }
566*83ee113eSDavid van Moolenbroek 
omapi_data_string_cmp(omapi_data_string_t * s1,omapi_data_string_t * s2)567*83ee113eSDavid van Moolenbroek int omapi_data_string_cmp (omapi_data_string_t *s1, omapi_data_string_t *s2)
568*83ee113eSDavid van Moolenbroek {
569*83ee113eSDavid van Moolenbroek 	unsigned len;
570*83ee113eSDavid van Moolenbroek 	int rv;
571*83ee113eSDavid van Moolenbroek 
572*83ee113eSDavid van Moolenbroek 	if (s1 -> len > s2 -> len)
573*83ee113eSDavid van Moolenbroek 		len = s2 -> len;
574*83ee113eSDavid van Moolenbroek 	else
575*83ee113eSDavid van Moolenbroek 		len = s1 -> len;
576*83ee113eSDavid van Moolenbroek 	rv = memcmp (s1 -> value, s2 -> value, len);
577*83ee113eSDavid van Moolenbroek 	if (rv)
578*83ee113eSDavid van Moolenbroek 		return rv;
579*83ee113eSDavid van Moolenbroek 	if (s1 -> len > s2 -> len)
580*83ee113eSDavid van Moolenbroek 		return 1;
581*83ee113eSDavid van Moolenbroek 	else if (s1 -> len < s2 -> len)
582*83ee113eSDavid van Moolenbroek 		return -1;
583*83ee113eSDavid van Moolenbroek 	return 0;
584*83ee113eSDavid van Moolenbroek }
585*83ee113eSDavid van Moolenbroek 
omapi_ds_strcmp(omapi_data_string_t * s1,const char * s2)586*83ee113eSDavid van Moolenbroek int omapi_ds_strcmp (omapi_data_string_t *s1, const char *s2)
587*83ee113eSDavid van Moolenbroek {
588*83ee113eSDavid van Moolenbroek 	unsigned len, slen;
589*83ee113eSDavid van Moolenbroek 	int rv;
590*83ee113eSDavid van Moolenbroek 
591*83ee113eSDavid van Moolenbroek 	slen = strlen (s2);
592*83ee113eSDavid van Moolenbroek 	if (slen > s1 -> len)
593*83ee113eSDavid van Moolenbroek 		len = s1 -> len;
594*83ee113eSDavid van Moolenbroek 	else
595*83ee113eSDavid van Moolenbroek 		len = slen;
596*83ee113eSDavid van Moolenbroek 	rv = memcmp (s1 -> value, s2, len);
597*83ee113eSDavid van Moolenbroek 	if (rv)
598*83ee113eSDavid van Moolenbroek 		return rv;
599*83ee113eSDavid van Moolenbroek 	if (s1 -> len > slen)
600*83ee113eSDavid van Moolenbroek 		return 1;
601*83ee113eSDavid van Moolenbroek 	else if (s1 -> len < slen)
602*83ee113eSDavid van Moolenbroek 		return -1;
603*83ee113eSDavid van Moolenbroek 	return 0;
604*83ee113eSDavid van Moolenbroek }
605*83ee113eSDavid van Moolenbroek 
omapi_td_strcmp(omapi_typed_data_t * s1,const char * s2)606*83ee113eSDavid van Moolenbroek int omapi_td_strcmp (omapi_typed_data_t *s1, const char *s2)
607*83ee113eSDavid van Moolenbroek {
608*83ee113eSDavid van Moolenbroek 	unsigned len, slen;
609*83ee113eSDavid van Moolenbroek 	int rv;
610*83ee113eSDavid van Moolenbroek 
611*83ee113eSDavid van Moolenbroek 	/* If the data type is not compatible, never equal. */
612*83ee113eSDavid van Moolenbroek 	if (s1 -> type != omapi_datatype_data &&
613*83ee113eSDavid van Moolenbroek 	    s1 -> type != omapi_datatype_string)
614*83ee113eSDavid van Moolenbroek 		return -1;
615*83ee113eSDavid van Moolenbroek 
616*83ee113eSDavid van Moolenbroek 	slen = strlen (s2);
617*83ee113eSDavid van Moolenbroek 	if (slen > s1 -> u.buffer.len)
618*83ee113eSDavid van Moolenbroek 		len = s1 -> u.buffer.len;
619*83ee113eSDavid van Moolenbroek 	else
620*83ee113eSDavid van Moolenbroek 		len = slen;
621*83ee113eSDavid van Moolenbroek 	rv = memcmp (s1 -> u.buffer.value, s2, len);
622*83ee113eSDavid van Moolenbroek 	if (rv)
623*83ee113eSDavid van Moolenbroek 		return rv;
624*83ee113eSDavid van Moolenbroek 	if (s1 -> u.buffer.len > slen)
625*83ee113eSDavid van Moolenbroek 		return 1;
626*83ee113eSDavid van Moolenbroek 	else if (s1 -> u.buffer.len < slen)
627*83ee113eSDavid van Moolenbroek 		return -1;
628*83ee113eSDavid van Moolenbroek 	return 0;
629*83ee113eSDavid van Moolenbroek }
630*83ee113eSDavid van Moolenbroek 
omapi_td_strcasecmp(omapi_typed_data_t * s1,const char * s2)631*83ee113eSDavid van Moolenbroek int omapi_td_strcasecmp (omapi_typed_data_t *s1, const char *s2)
632*83ee113eSDavid van Moolenbroek {
633*83ee113eSDavid van Moolenbroek 	unsigned len, slen;
634*83ee113eSDavid van Moolenbroek 	int rv;
635*83ee113eSDavid van Moolenbroek 
636*83ee113eSDavid van Moolenbroek 	/* If the data type is not compatible, never equal. */
637*83ee113eSDavid van Moolenbroek 	if (s1 -> type != omapi_datatype_data &&
638*83ee113eSDavid van Moolenbroek 	    s1 -> type != omapi_datatype_string)
639*83ee113eSDavid van Moolenbroek 		return -1;
640*83ee113eSDavid van Moolenbroek 
641*83ee113eSDavid van Moolenbroek 	slen = strlen (s2);
642*83ee113eSDavid van Moolenbroek 	if (slen > s1 -> u.buffer.len)
643*83ee113eSDavid van Moolenbroek 		len = s1 -> u.buffer.len;
644*83ee113eSDavid van Moolenbroek 	else
645*83ee113eSDavid van Moolenbroek 		len = slen;
646*83ee113eSDavid van Moolenbroek 	rv = casecmp (s1 -> u.buffer.value, s2, len);
647*83ee113eSDavid van Moolenbroek 	if (rv)
648*83ee113eSDavid van Moolenbroek 		return rv;
649*83ee113eSDavid van Moolenbroek 	if (s1 -> u.buffer.len > slen)
650*83ee113eSDavid van Moolenbroek 		return 1;
651*83ee113eSDavid van Moolenbroek 	else if (s1 -> u.buffer.len < slen)
652*83ee113eSDavid van Moolenbroek 		return -1;
653*83ee113eSDavid van Moolenbroek 	return 0;
654*83ee113eSDavid van Moolenbroek }
655*83ee113eSDavid van Moolenbroek 
omapi_make_value(omapi_value_t ** vp,omapi_data_string_t * name,omapi_typed_data_t * value,const char * file,int line)656*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_value (omapi_value_t **vp,
657*83ee113eSDavid van Moolenbroek 			       omapi_data_string_t *name,
658*83ee113eSDavid van Moolenbroek 			       omapi_typed_data_t *value,
659*83ee113eSDavid van Moolenbroek 			       const char *file, int line)
660*83ee113eSDavid van Moolenbroek {
661*83ee113eSDavid van Moolenbroek 	isc_result_t status;
662*83ee113eSDavid van Moolenbroek 
663*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
664*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
665*83ee113eSDavid van Moolenbroek 		return status;
666*83ee113eSDavid van Moolenbroek 
667*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
668*83ee113eSDavid van Moolenbroek 					      name, file, line);
669*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
670*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
671*83ee113eSDavid van Moolenbroek 		return status;
672*83ee113eSDavid van Moolenbroek 	}
673*83ee113eSDavid van Moolenbroek 	if (value) {
674*83ee113eSDavid van Moolenbroek 		status = omapi_typed_data_reference (&(*vp) -> value,
675*83ee113eSDavid van Moolenbroek 						     value, file, line);
676*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
677*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
678*83ee113eSDavid van Moolenbroek 			return status;
679*83ee113eSDavid van Moolenbroek 		}
680*83ee113eSDavid van Moolenbroek 	}
681*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
682*83ee113eSDavid van Moolenbroek }
683*83ee113eSDavid van Moolenbroek 
omapi_make_const_value(omapi_value_t ** vp,omapi_data_string_t * name,const unsigned char * value,unsigned len,const char * file,int line)684*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_const_value (omapi_value_t **vp,
685*83ee113eSDavid van Moolenbroek 				     omapi_data_string_t *name,
686*83ee113eSDavid van Moolenbroek 				     const unsigned char *value,
687*83ee113eSDavid van Moolenbroek 				     unsigned len,
688*83ee113eSDavid van Moolenbroek 				     const char *file, int line)
689*83ee113eSDavid van Moolenbroek {
690*83ee113eSDavid van Moolenbroek 	isc_result_t status;
691*83ee113eSDavid van Moolenbroek 
692*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
693*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
694*83ee113eSDavid van Moolenbroek 		return status;
695*83ee113eSDavid van Moolenbroek 
696*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
697*83ee113eSDavid van Moolenbroek 					      name, file, line);
698*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
699*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
700*83ee113eSDavid van Moolenbroek 		return status;
701*83ee113eSDavid van Moolenbroek 	}
702*83ee113eSDavid van Moolenbroek 	if (value) {
703*83ee113eSDavid van Moolenbroek 		status = omapi_typed_data_new (file, line, &(*vp) -> value,
704*83ee113eSDavid van Moolenbroek 					       omapi_datatype_data, len);
705*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
706*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
707*83ee113eSDavid van Moolenbroek 			return status;
708*83ee113eSDavid van Moolenbroek 		}
709*83ee113eSDavid van Moolenbroek 		memcpy ((*vp) -> value -> u.buffer.value, value, len);
710*83ee113eSDavid van Moolenbroek 	}
711*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
712*83ee113eSDavid van Moolenbroek }
713*83ee113eSDavid van Moolenbroek 
omapi_make_int_value(omapi_value_t ** vp,omapi_data_string_t * name,int value,const char * file,int line)714*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_int_value (omapi_value_t **vp,
715*83ee113eSDavid van Moolenbroek 				   omapi_data_string_t *name,
716*83ee113eSDavid van Moolenbroek 				   int value, const char *file, int line)
717*83ee113eSDavid van Moolenbroek {
718*83ee113eSDavid van Moolenbroek 	isc_result_t status;
719*83ee113eSDavid van Moolenbroek 
720*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
721*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
722*83ee113eSDavid van Moolenbroek 		return status;
723*83ee113eSDavid van Moolenbroek 
724*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
725*83ee113eSDavid van Moolenbroek 					      name, file, line);
726*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
727*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
728*83ee113eSDavid van Moolenbroek 		return status;
729*83ee113eSDavid van Moolenbroek 	}
730*83ee113eSDavid van Moolenbroek 	status = omapi_typed_data_new (file, line, &(*vp) -> value,
731*83ee113eSDavid van Moolenbroek 				       omapi_datatype_int, value);
732*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
733*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
734*83ee113eSDavid van Moolenbroek 		return status;
735*83ee113eSDavid van Moolenbroek 	}
736*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
737*83ee113eSDavid van Moolenbroek }
738*83ee113eSDavid van Moolenbroek 
omapi_make_uint_value(omapi_value_t ** vp,omapi_data_string_t * name,unsigned int value,const char * file,int line)739*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_uint_value (omapi_value_t **vp,
740*83ee113eSDavid van Moolenbroek 				    omapi_data_string_t *name,
741*83ee113eSDavid van Moolenbroek 				    unsigned int value,
742*83ee113eSDavid van Moolenbroek 				    const char *file, int line)
743*83ee113eSDavid van Moolenbroek {
744*83ee113eSDavid van Moolenbroek 	return omapi_make_int_value (vp, name, (int)value, file, line);
745*83ee113eSDavid van Moolenbroek }
746*83ee113eSDavid van Moolenbroek 
omapi_make_object_value(omapi_value_t ** vp,omapi_data_string_t * name,omapi_object_t * value,const char * file,int line)747*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_object_value (omapi_value_t **vp,
748*83ee113eSDavid van Moolenbroek 				      omapi_data_string_t *name,
749*83ee113eSDavid van Moolenbroek 				      omapi_object_t *value,
750*83ee113eSDavid van Moolenbroek 				      const char *file, int line)
751*83ee113eSDavid van Moolenbroek {
752*83ee113eSDavid van Moolenbroek 	isc_result_t status;
753*83ee113eSDavid van Moolenbroek 
754*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
755*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
756*83ee113eSDavid van Moolenbroek 		return status;
757*83ee113eSDavid van Moolenbroek 
758*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
759*83ee113eSDavid van Moolenbroek                                               name, file, line);
760*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
761*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
762*83ee113eSDavid van Moolenbroek 		return status;
763*83ee113eSDavid van Moolenbroek 	}
764*83ee113eSDavid van Moolenbroek 
765*83ee113eSDavid van Moolenbroek 	if (value) {
766*83ee113eSDavid van Moolenbroek 		status = omapi_typed_data_new (file, line, &(*vp) -> value,
767*83ee113eSDavid van Moolenbroek 					       omapi_datatype_object, value);
768*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
769*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
770*83ee113eSDavid van Moolenbroek 			return status;
771*83ee113eSDavid van Moolenbroek 		}
772*83ee113eSDavid van Moolenbroek 	}
773*83ee113eSDavid van Moolenbroek 
774*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
775*83ee113eSDavid van Moolenbroek }
776*83ee113eSDavid van Moolenbroek 
omapi_make_handle_value(omapi_value_t ** vp,omapi_data_string_t * name,omapi_object_t * value,const char * file,int line)777*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_handle_value (omapi_value_t **vp,
778*83ee113eSDavid van Moolenbroek 				      omapi_data_string_t *name,
779*83ee113eSDavid van Moolenbroek 				      omapi_object_t *value,
780*83ee113eSDavid van Moolenbroek 				      const char *file, int line)
781*83ee113eSDavid van Moolenbroek {
782*83ee113eSDavid van Moolenbroek 	isc_result_t status;
783*83ee113eSDavid van Moolenbroek 
784*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
785*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
786*83ee113eSDavid van Moolenbroek 		return status;
787*83ee113eSDavid van Moolenbroek 
788*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
789*83ee113eSDavid van Moolenbroek 					      name, file, line);
790*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
791*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
792*83ee113eSDavid van Moolenbroek 		return status;
793*83ee113eSDavid van Moolenbroek 	}
794*83ee113eSDavid van Moolenbroek 	if (value) {
795*83ee113eSDavid van Moolenbroek 		status = omapi_typed_data_new (file, line, &(*vp) -> value,
796*83ee113eSDavid van Moolenbroek 					       omapi_datatype_int);
797*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
798*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
799*83ee113eSDavid van Moolenbroek 			return status;
800*83ee113eSDavid van Moolenbroek 		}
801*83ee113eSDavid van Moolenbroek 		status = (omapi_object_handle
802*83ee113eSDavid van Moolenbroek 			  ((omapi_handle_t *)&(*vp) -> value -> u.integer,
803*83ee113eSDavid van Moolenbroek 			   value));
804*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
805*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
806*83ee113eSDavid van Moolenbroek 			return status;
807*83ee113eSDavid van Moolenbroek 		}
808*83ee113eSDavid van Moolenbroek 	}
809*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
810*83ee113eSDavid van Moolenbroek }
811*83ee113eSDavid van Moolenbroek 
omapi_make_string_value(omapi_value_t ** vp,omapi_data_string_t * name,const char * value,const char * file,int line)812*83ee113eSDavid van Moolenbroek isc_result_t omapi_make_string_value (omapi_value_t **vp,
813*83ee113eSDavid van Moolenbroek 				      omapi_data_string_t *name,
814*83ee113eSDavid van Moolenbroek 				      const char *value,
815*83ee113eSDavid van Moolenbroek 				      const char *file, int line)
816*83ee113eSDavid van Moolenbroek {
817*83ee113eSDavid van Moolenbroek 	isc_result_t status;
818*83ee113eSDavid van Moolenbroek 
819*83ee113eSDavid van Moolenbroek 	status = omapi_value_new (vp, file, line);
820*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS)
821*83ee113eSDavid van Moolenbroek 		return status;
822*83ee113eSDavid van Moolenbroek 
823*83ee113eSDavid van Moolenbroek 	status = omapi_data_string_reference (&(*vp) -> name,
824*83ee113eSDavid van Moolenbroek 					      name, file, line);
825*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
826*83ee113eSDavid van Moolenbroek 		omapi_value_dereference (vp, file, line);
827*83ee113eSDavid van Moolenbroek 		return status;
828*83ee113eSDavid van Moolenbroek 	}
829*83ee113eSDavid van Moolenbroek 	if (value) {
830*83ee113eSDavid van Moolenbroek 		status = omapi_typed_data_new (file, line, &(*vp) -> value,
831*83ee113eSDavid van Moolenbroek 					       omapi_datatype_string, value);
832*83ee113eSDavid van Moolenbroek 		if (status != ISC_R_SUCCESS) {
833*83ee113eSDavid van Moolenbroek 			omapi_value_dereference (vp, file, line);
834*83ee113eSDavid van Moolenbroek 			return status;
835*83ee113eSDavid van Moolenbroek 		}
836*83ee113eSDavid van Moolenbroek 	}
837*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
838*83ee113eSDavid van Moolenbroek }
839*83ee113eSDavid van Moolenbroek 
omapi_get_int_value(unsigned long * v,omapi_typed_data_t * t)840*83ee113eSDavid van Moolenbroek isc_result_t omapi_get_int_value (unsigned long *v, omapi_typed_data_t *t)
841*83ee113eSDavid van Moolenbroek {
842*83ee113eSDavid van Moolenbroek 	u_int32_t rv;
843*83ee113eSDavid van Moolenbroek 
844*83ee113eSDavid van Moolenbroek 	if (t -> type == omapi_datatype_int) {
845*83ee113eSDavid van Moolenbroek 		*v = t -> u.integer;
846*83ee113eSDavid van Moolenbroek 		return ISC_R_SUCCESS;
847*83ee113eSDavid van Moolenbroek 	} else if (t -> type == omapi_datatype_string ||
848*83ee113eSDavid van Moolenbroek 		   t -> type == omapi_datatype_data) {
849*83ee113eSDavid van Moolenbroek 		if (t -> u.buffer.len != sizeof (rv))
850*83ee113eSDavid van Moolenbroek 			return DHCP_R_INVALIDARG;
851*83ee113eSDavid van Moolenbroek 		memcpy (&rv, t -> u.buffer.value, sizeof rv);
852*83ee113eSDavid van Moolenbroek 		*v = ntohl (rv);
853*83ee113eSDavid van Moolenbroek 		return ISC_R_SUCCESS;
854*83ee113eSDavid van Moolenbroek 	}
855*83ee113eSDavid van Moolenbroek 	return DHCP_R_INVALIDARG;
856*83ee113eSDavid van Moolenbroek }
857