3 Subroutines providing general support for objects. */
6 * Copyright (c) 1999-2000 Internet Software Consortium.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of The Internet Software Consortium nor the names
19 * of its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
23 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
24 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
30 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
33 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * This software has been written for the Internet Software Consortium
37 * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
38 * To learn more about the Internet Software Consortium, see
39 * ``http://www.isc.org/''. To learn more about Vixie Enterprises,
40 * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
41 * ``http://www.nominum.com''.
44 #include <omapip/omapip_p.h>
46 omapi_object_type_t
*omapi_type_connection
;
47 omapi_object_type_t
*omapi_type_listener
;
48 omapi_object_type_t
*omapi_type_io_object
;
49 omapi_object_type_t
*omapi_type_datagram
;
50 omapi_object_type_t
*omapi_type_generic
;
51 omapi_object_type_t
*omapi_type_protocol
;
52 omapi_object_type_t
*omapi_type_protocol_listener
;
53 omapi_object_type_t
*omapi_type_waiter
;
54 omapi_object_type_t
*omapi_type_remote
;
55 omapi_object_type_t
*omapi_type_message
;
57 omapi_object_type_t
*omapi_object_types
;
58 int omapi_object_type_count
;
61 isc_result_t
omapi_init (void)
65 /* Register all the standard object types... */
66 status
= omapi_object_type_register (&omapi_type_connection
,
68 omapi_connection_set_value
,
69 omapi_connection_get_value
,
70 omapi_connection_destroy
,
71 omapi_connection_signal_handler
,
72 omapi_connection_stuff_values
,
74 if (status
!= ISC_R_SUCCESS
)
77 status
= omapi_object_type_register (&omapi_type_listener
,
79 omapi_listener_set_value
,
80 omapi_listener_get_value
,
81 omapi_listener_destroy
,
82 omapi_listener_signal_handler
,
83 omapi_listener_stuff_values
,
85 if (status
!= ISC_R_SUCCESS
)
88 status
= omapi_object_type_register (&omapi_type_io_object
,
93 omapi_io_signal_handler
,
94 omapi_io_stuff_values
,
96 if (status
!= ISC_R_SUCCESS
)
99 status
= omapi_object_type_register (&omapi_type_generic
,
101 omapi_generic_set_value
,
102 omapi_generic_get_value
,
103 omapi_generic_destroy
,
104 omapi_generic_signal_handler
,
105 omapi_generic_stuff_values
,
107 if (status
!= ISC_R_SUCCESS
)
110 status
= omapi_object_type_register (&omapi_type_protocol
,
112 omapi_protocol_set_value
,
113 omapi_protocol_get_value
,
114 omapi_protocol_destroy
,
115 omapi_protocol_signal_handler
,
116 omapi_protocol_stuff_values
,
118 if (status
!= ISC_R_SUCCESS
)
121 status
= omapi_object_type_register (&omapi_type_protocol_listener
,
123 omapi_protocol_listener_set_value
,
124 omapi_protocol_listener_get_value
,
125 omapi_protocol_listener_destroy
,
126 omapi_protocol_listener_signal
,
127 omapi_protocol_listener_stuff
,
129 if (status
!= ISC_R_SUCCESS
)
132 status
= omapi_object_type_register (&omapi_type_message
,
134 omapi_message_set_value
,
135 omapi_message_get_value
,
136 omapi_message_destroy
,
137 omapi_message_signal_handler
,
138 omapi_message_stuff_values
,
140 if (status
!= ISC_R_SUCCESS
)
143 status
= omapi_object_type_register (&omapi_type_waiter
,
148 omapi_waiter_signal_handler
, 0,
150 if (status
!= ISC_R_SUCCESS
)
153 /* This seems silly, but leave it. */
154 return ISC_R_SUCCESS
;
157 isc_result_t
omapi_object_type_register (omapi_object_type_t
**type
,
159 isc_result_t (*set_value
)
162 omapi_data_string_t
*,
163 omapi_typed_data_t
*),
164 isc_result_t (*get_value
)
167 omapi_data_string_t
*,
169 isc_result_t (*destroy
)
172 isc_result_t (*signal_handler
)
174 const char *, va_list),
175 isc_result_t (*stuff_values
)
179 isc_result_t (*lookup
)
183 isc_result_t (*create
)
186 isc_result_t (*remove
)
190 omapi_object_type_t
*t
;
192 t
= dmalloc (sizeof *t
, MDL
);
194 return ISC_R_NOMEMORY
;
195 memset (t
, 0, sizeof *t
);
198 t
-> set_value
= set_value
;
199 t
-> get_value
= get_value
;
200 t
-> destroy
= destroy
;
201 t
-> signal_handler
= signal_handler
;
202 t
-> stuff_values
= stuff_values
;
203 t
-> lookup
= lookup
;
204 t
-> create
= create
;
205 t
-> remove
= remove
;
206 t
-> next
= omapi_object_types
;
207 omapi_object_types
= t
;
210 return ISC_R_SUCCESS
;
213 isc_result_t
omapi_signal (omapi_object_t
*handle
, const char *name
, ...)
216 omapi_object_t
*outer
;
220 for (outer
= handle
; outer
-> outer
; outer
= outer
-> outer
)
222 if (outer
-> type
-> signal_handler
)
223 status
= (*(outer
-> type
-> signal_handler
)) (outer
,
226 status
= ISC_R_NOTFOUND
;
231 isc_result_t
omapi_signal_in (omapi_object_t
*handle
, const char *name
, ...)
234 omapi_object_t
*outer
;
238 return ISC_R_NOTFOUND
;
241 if (handle
-> type
-> signal_handler
)
242 status
= (*(handle
-> type
-> signal_handler
)) (handle
,
245 status
= ISC_R_NOTFOUND
;
250 isc_result_t
omapi_set_value (omapi_object_t
*h
,
252 omapi_data_string_t
*name
,
253 omapi_typed_data_t
*value
)
255 omapi_object_t
*outer
;
257 for (outer
= h
; outer
-> outer
; outer
= outer
-> outer
)
259 if (outer
-> type
-> set_value
)
260 return (*(outer
-> type
-> set_value
)) (outer
,
262 return ISC_R_NOTFOUND
;
265 isc_result_t
omapi_set_value_str (omapi_object_t
*h
,
268 omapi_typed_data_t
*value
)
270 omapi_object_t
*outer
;
271 omapi_data_string_t
*nds
;
274 nds
= (omapi_data_string_t
*)0;
275 status
= omapi_data_string_new (&nds
, strlen (name
), MDL
);
276 if (status
!= ISC_R_SUCCESS
)
278 memcpy (nds
-> value
, name
, strlen (name
));
280 return omapi_set_value (h
, id
, nds
, value
);
283 isc_result_t
omapi_set_boolean_value (omapi_object_t
*h
, omapi_object_t
*id
,
284 const char *name
, int value
)
287 omapi_typed_data_t
*tv
= (omapi_typed_data_t
*)0;
288 omapi_data_string_t
*n
= (omapi_data_string_t
*)0;
292 status
= omapi_data_string_new (&n
, strlen (name
), MDL
);
293 if (status
!= ISC_R_SUCCESS
)
295 memcpy (n
-> value
, name
, strlen (name
));
297 status
= omapi_typed_data_new (MDL
, &tv
, omapi_datatype_int
, value
);
298 if (status
!= ISC_R_SUCCESS
) {
299 omapi_data_string_dereference (&n
, MDL
);
303 status
= omapi_set_value (h
, id
, n
, tv
);
304 omapi_data_string_dereference (&n
, MDL
);
305 omapi_typed_data_dereference (&tv
, MDL
);
309 isc_result_t
omapi_set_int_value (omapi_object_t
*h
, omapi_object_t
*id
,
310 const char *name
, int value
)
313 omapi_typed_data_t
*tv
= (omapi_typed_data_t
*)0;
314 omapi_data_string_t
*n
= (omapi_data_string_t
*)0;
318 status
= omapi_data_string_new (&n
, strlen (name
), MDL
);
319 if (status
!= ISC_R_SUCCESS
)
321 memcpy (n
-> value
, name
, strlen (name
));
323 status
= omapi_typed_data_new (MDL
, &tv
, omapi_datatype_int
, value
);
324 if (status
!= ISC_R_SUCCESS
) {
325 omapi_data_string_dereference (&n
, MDL
);
329 status
= omapi_set_value (h
, id
, n
, tv
);
330 omapi_data_string_dereference (&n
, MDL
);
331 omapi_typed_data_dereference (&tv
, MDL
);
335 isc_result_t
omapi_set_object_value (omapi_object_t
*h
, omapi_object_t
*id
,
336 const char *name
, omapi_object_t
*value
)
339 omapi_typed_data_t
*tv
= (omapi_typed_data_t
*)0;
340 omapi_data_string_t
*n
= (omapi_data_string_t
*)0;
344 status
= omapi_data_string_new (&n
, strlen (name
), MDL
);
345 if (status
!= ISC_R_SUCCESS
)
347 memcpy (n
-> value
, name
, strlen (name
));
349 status
= omapi_typed_data_new (MDL
, &tv
, omapi_datatype_object
, value
);
350 if (status
!= ISC_R_SUCCESS
) {
351 omapi_data_string_dereference (&n
, MDL
);
355 status
= omapi_set_value (h
, id
, n
, tv
);
356 omapi_data_string_dereference (&n
, MDL
);
357 omapi_typed_data_dereference (&tv
, MDL
);
361 isc_result_t
omapi_set_string_value (omapi_object_t
*h
, omapi_object_t
*id
,
362 const char *name
, const char *value
)
365 omapi_typed_data_t
*tv
= (omapi_typed_data_t
*)0;
366 omapi_data_string_t
*n
= (omapi_data_string_t
*)0;
370 status
= omapi_data_string_new (&n
, strlen (name
), MDL
);
371 if (status
!= ISC_R_SUCCESS
)
373 memcpy (n
-> value
, name
, strlen (name
));
375 status
= omapi_typed_data_new (MDL
, &tv
, omapi_datatype_string
, value
);
376 if (status
!= ISC_R_SUCCESS
) {
377 omapi_data_string_dereference (&n
, MDL
);
381 status
= omapi_set_value (h
, id
, n
, tv
);
382 omapi_data_string_dereference (&n
, MDL
);
383 omapi_typed_data_dereference (&tv
, MDL
);
387 isc_result_t
omapi_get_value (omapi_object_t
*h
,
389 omapi_data_string_t
*name
,
390 omapi_value_t
**value
)
392 omapi_object_t
*outer
;
394 for (outer
= h
; outer
-> outer
; outer
= outer
-> outer
)
396 if (outer
-> type
-> get_value
)
397 return (*(outer
-> type
-> get_value
)) (outer
,
399 return ISC_R_NOTFOUND
;
402 isc_result_t
omapi_get_value_str (omapi_object_t
*h
,
405 omapi_value_t
**value
)
407 omapi_object_t
*outer
;
408 omapi_data_string_t
*nds
;
411 nds
= (omapi_data_string_t
*)0;
412 status
= omapi_data_string_new (&nds
, strlen (name
), MDL
);
413 if (status
!= ISC_R_SUCCESS
)
415 memcpy (nds
-> value
, name
, strlen (name
));
417 for (outer
= h
; outer
-> outer
; outer
= outer
-> outer
)
419 if (outer
-> type
-> get_value
)
420 return (*(outer
-> type
-> get_value
)) (outer
,
422 return ISC_R_NOTFOUND
;
425 isc_result_t
omapi_stuff_values (omapi_object_t
*c
,
429 omapi_object_t
*outer
;
431 for (outer
= o
; outer
-> outer
; outer
= outer
-> outer
)
433 if (outer
-> type
-> stuff_values
)
434 return (*(outer
-> type
-> stuff_values
)) (c
, id
, outer
);
435 return ISC_R_NOTFOUND
;
438 isc_result_t
omapi_object_create (omapi_object_t
**obj
, omapi_object_t
*id
,
439 omapi_object_type_t
*type
)
442 return ISC_R_NOTIMPLEMENTED
;
443 return (*(type
-> create
)) (obj
, id
);
446 isc_result_t
omapi_object_update (omapi_object_t
*obj
, omapi_object_t
*id
,
447 omapi_object_t
*src
, omapi_handle_t handle
)
449 omapi_generic_object_t
*gsrc
;
454 return ISC_R_INVALIDARG
;
455 if (src
-> type
!= omapi_type_generic
)
456 return ISC_R_NOTIMPLEMENTED
;
457 gsrc
= (omapi_generic_object_t
*)src
;
458 for (i
= 0; i
< gsrc
-> nvalues
; i
++) {
459 status
= omapi_set_value (obj
, id
,
460 gsrc
-> values
[i
] -> name
,
461 gsrc
-> values
[i
] -> value
);
462 if (status
!= ISC_R_SUCCESS
)
466 omapi_set_int_value (obj
, id
, "remote-handle", (int)handle
);
467 status
= omapi_signal (obj
, "updated");
468 if (status
!= ISC_R_NOTFOUND
)
470 return ISC_R_SUCCESS
;
473 int omapi_data_string_cmp (omapi_data_string_t
*s1
, omapi_data_string_t
*s2
)
478 if (s1
-> len
> s2
-> len
)
482 rv
= memcmp (s1
-> value
, s2
-> value
, len
);
485 if (s1
-> len
> s2
-> len
)
487 else if (s1
-> len
< s2
-> len
)
492 int omapi_ds_strcmp (omapi_data_string_t
*s1
, const char *s2
)
498 if (slen
> s1
-> len
)
502 rv
= memcmp (s1
-> value
, s2
, len
);
505 if (s1
-> len
> slen
)
507 else if (s1
-> len
< slen
)
512 int omapi_td_strcmp (omapi_typed_data_t
*s1
, const char *s2
)
517 /* If the data type is not compatible, never equal. */
518 if (s1
-> type
!= omapi_datatype_data
&&
519 s1
-> type
!= omapi_datatype_string
)
523 if (slen
> s1
-> u
.buffer
.len
)
524 len
= s1
-> u
.buffer
.len
;
527 rv
= memcmp (s1
-> u
.buffer
.value
, s2
, len
);
530 if (s1
-> u
.buffer
.len
> slen
)
532 else if (s1
-> u
.buffer
.len
< slen
)
537 isc_result_t
omapi_make_value (omapi_value_t
**vp
,
538 omapi_data_string_t
*name
,
539 omapi_typed_data_t
*value
,
540 const char *file
, int line
)
544 status
= omapi_value_new (vp
, file
, line
);
545 if (status
!= ISC_R_SUCCESS
)
548 status
= omapi_data_string_reference (&(*vp
) -> name
,
550 if (status
!= ISC_R_SUCCESS
) {
551 omapi_value_dereference (vp
, file
, line
);
555 status
= omapi_typed_data_reference (&(*vp
) -> value
,
557 if (status
!= ISC_R_SUCCESS
) {
558 omapi_value_dereference (vp
, file
, line
);
562 return ISC_R_SUCCESS
;
565 isc_result_t
omapi_make_const_value (omapi_value_t
**vp
,
566 omapi_data_string_t
*name
,
567 const unsigned char *value
,
569 const char *file
, int line
)
573 status
= omapi_value_new (vp
, file
, line
);
574 if (status
!= ISC_R_SUCCESS
)
577 status
= omapi_data_string_reference (&(*vp
) -> name
,
579 if (status
!= ISC_R_SUCCESS
) {
580 omapi_value_dereference (vp
, file
, line
);
584 status
= omapi_typed_data_new (file
, line
, &(*vp
) -> value
,
585 omapi_datatype_data
, len
);
586 if (status
!= ISC_R_SUCCESS
) {
587 omapi_value_dereference (vp
, file
, line
);
590 memcpy ((*vp
) -> value
-> u
.buffer
.value
, value
, len
);
592 return ISC_R_SUCCESS
;
595 isc_result_t
omapi_make_int_value (omapi_value_t
**vp
,
596 omapi_data_string_t
*name
,
597 int value
, const char *file
, int line
)
601 status
= omapi_value_new (vp
, file
, line
);
602 if (status
!= ISC_R_SUCCESS
)
605 status
= omapi_data_string_reference (&(*vp
) -> name
,
607 if (status
!= ISC_R_SUCCESS
) {
608 omapi_value_dereference (vp
, file
, line
);
612 status
= omapi_typed_data_new (file
, line
, &(*vp
) -> value
,
614 if (status
!= ISC_R_SUCCESS
) {
615 omapi_value_dereference (vp
, file
, line
);
618 (*vp
) -> value
-> u
.integer
= value
;
620 return ISC_R_SUCCESS
;
623 isc_result_t
omapi_make_handle_value (omapi_value_t
**vp
,
624 omapi_data_string_t
*name
,
625 omapi_object_t
*value
,
626 const char *file
, int line
)
630 status
= omapi_value_new (vp
, file
, line
);
631 if (status
!= ISC_R_SUCCESS
)
634 status
= omapi_data_string_reference (&(*vp
) -> name
,
636 if (status
!= ISC_R_SUCCESS
) {
637 omapi_value_dereference (vp
, file
, line
);
641 status
= omapi_typed_data_new (file
, line
, &(*vp
) -> value
,
643 if (status
!= ISC_R_SUCCESS
) {
644 omapi_value_dereference (vp
, file
, line
);
647 status
= (omapi_object_handle
648 ((omapi_handle_t
*)&(*vp
) -> value
-> u
.integer
,
650 if (status
!= ISC_R_SUCCESS
) {
651 omapi_value_dereference (vp
, file
, line
);
655 return ISC_R_SUCCESS
;
658 isc_result_t
omapi_make_string_value (omapi_value_t
**vp
,
659 omapi_data_string_t
*name
,
661 const char *file
, int line
)
665 status
= omapi_value_new (vp
, file
, line
);
666 if (status
!= ISC_R_SUCCESS
)
669 status
= omapi_data_string_reference (&(*vp
) -> name
,
671 if (status
!= ISC_R_SUCCESS
) {
672 omapi_value_dereference (vp
, file
, line
);
676 status
= omapi_typed_data_new (file
, line
, &(*vp
) -> value
,
677 omapi_datatype_string
, value
);
678 if (status
!= ISC_R_SUCCESS
) {
679 omapi_value_dereference (vp
, file
, line
);
683 return ISC_R_SUCCESS
;
686 isc_result_t
omapi_get_int_value (unsigned long *v
, omapi_typed_data_t
*t
)
690 if (t
-> type
== omapi_datatype_int
) {
692 return ISC_R_SUCCESS
;
693 } else if (t
-> type
== omapi_datatype_string
||
694 t
-> type
== omapi_datatype_data
) {
695 if (t
-> u
.buffer
.len
!= sizeof (rv
))
696 return ISC_R_INVALIDARG
;
697 memcpy (&rv
, t
-> u
.buffer
.value
, sizeof rv
);
699 return ISC_R_SUCCESS
;
701 return ISC_R_INVALIDARG
;