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