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