3 Definitions for the object management API and protocol... */
6 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
7 * Copyright (c) 1996-2003 by Internet Software Consortium
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.
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.
21 * Internet Systems Consortium, Inc.
23 * Redwood City, CA 94063
27 * This software has been written for Internet Systems Consortium
28 * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
29 * To learn more about Internet Systems Consortium, see
30 * ``http://www.isc.org/''. To learn more about Vixie Enterprises,
31 * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
32 * ``http://www.nominum.com''.
37 #include <isc-dhcp/result.h>
39 typedef unsigned int omapi_handle_t;
41 struct __omapi_object;
42 typedef struct __omapi_object omapi_object_t;
46 omapi_datatype_string,
53 omapi_datatype_t type;
57 #define OMAPI_TYPED_DATA_NOBUFFER_LEN (sizeof (int) + \
58 sizeof (omapi_datatype_t) + \
60 unsigned char value [1];
62 #define OMAPI_TYPED_DATA_OBJECT_LEN (sizeof (int) + \
63 sizeof (omapi_datatype_t) + \
64 sizeof (omapi_object_t *))
65 omapi_object_t *object;
66 #define OMAPI_TYPED_DATA_REF_LEN (sizeof (int) + \
67 sizeof (omapi_datatype_t) + \
71 isc_result_t (*reference) (void *,
72 void *, const char *, int);
73 isc_result_t (*dereference) (void *,
76 #define OMAPI_TYPED_DATA_INT_LEN (sizeof (int) + \
77 sizeof (omapi_datatype_t) + \
86 #define OMAPI_DATA_STRING_EMPTY_SIZE (2 * sizeof (int))
87 unsigned char value [1];
88 } omapi_data_string_t;
92 omapi_data_string_t *name;
93 omapi_typed_data_t *value;
96 typedef struct __omapi_object_type_t {
98 struct __omapi_object_type_t *next;
100 isc_result_t (*set_value) (omapi_object_t *, omapi_object_t *,
101 omapi_data_string_t *,
102 omapi_typed_data_t *);
103 isc_result_t (*get_value) (omapi_object_t *,
105 omapi_data_string_t *, omapi_value_t **);
106 isc_result_t (*destroy) (omapi_object_t *, const char *, int);
107 isc_result_t (*signal_handler) (omapi_object_t *,
108 const char *, va_list);
109 isc_result_t (*stuff_values) (omapi_object_t *,
110 omapi_object_t *, omapi_object_t *);
111 isc_result_t (*lookup) (omapi_object_t **, omapi_object_t *,
113 isc_result_t (*create) (omapi_object_t **, omapi_object_t *);
114 isc_result_t (*remove) (omapi_object_t *, omapi_object_t *);
115 isc_result_t (*freer) (omapi_object_t *, const char *, int);
116 isc_result_t (*allocator) (omapi_object_t **, const char *, int);
117 isc_result_t (*sizer) (size_t);
120 isc_result_t (*initialize) (omapi_object_t *, const char *, int);
121 } omapi_object_type_t;
123 #define OMAPI_OBJECT_PREAMBLE \
124 omapi_object_type_t *type; \
126 omapi_handle_t handle; \
127 omapi_object_t *outer, *inner
129 /* The omapi handle structure. */
130 struct __omapi_object {
131 OMAPI_OBJECT_PREAMBLE;
134 /* The port on which applications should listen for OMAPI connections. */
135 #define OMAPI_PROTOCOL_PORT 7911
140 unsigned char address [16];
147 omapi_addr_t *addresses;
150 typedef struct auth_key {
151 OMAPI_OBJECT_PREAMBLE;
154 omapi_data_string_t *key;
157 #define OMAPI_CREATE 1
158 #define OMAPI_UPDATE 2
160 #define OMAPI_NOTIFY_PROTOCOL 8
162 #define OMAPI_OBJECT_ALLOC(name, stype, type) \
163 isc_result_t name##_allocate (stype **p, const char *file, int line) \
165 return omapi_object_allocate ((omapi_object_t **)p, \
166 type, 0, file, line); \
169 isc_result_t name##_reference (stype **pptr, stype *ptr, \
170 const char *file, int line) \
172 return omapi_object_reference ((omapi_object_t **)pptr, \
173 (omapi_object_t *)ptr, file, line); \
176 isc_result_t name##_dereference (stype **ptr, const char *file, int line) \
178 return omapi_object_dereference ((omapi_object_t **)ptr, file, line); \
181 #define OMAPI_OBJECT_ALLOC_DECL(name, stype, type) \
182 isc_result_t name##_allocate (stype **p, const char *file, int line); \
183 isc_result_t name##_reference (stype **pptr, stype *ptr, \
184 const char *file, int line); \
185 isc_result_t name##_dereference (stype **ptr, const char *file, int line);
187 typedef isc_result_t (*omapi_array_ref_t) (char **, char *, const char *, int);
188 typedef isc_result_t (*omapi_array_deref_t) (char **, const char *, int);
190 /* An extensible array type. */
193 omapi_array_ref_t ref;
194 omapi_array_deref_t deref;
199 #define OMAPI_ARRAY_TYPE(name, stype) \
200 isc_result_t name##_array_allocate (omapi_array_t **p, \
201 const char *file, int line) \
203 return (omapi_array_allocate \
205 (omapi_array_ref_t)name##_reference, \
206 (omapi_array_deref_t)name##_dereference, \
210 isc_result_t name##_array_free (omapi_array_t **p, \
211 const char *file, int line) \
213 return omapi_array_free (p, file, line); \
216 isc_result_t name##_array_extend (omapi_array_t *pptr, stype *ptr, int *index,\
217 const char *file, int line) \
219 return omapi_array_extend (pptr, (char *)ptr, index, file, line); \
222 isc_result_t name##_array_set (omapi_array_t *pptr, stype *ptr, int index, \
223 const char *file, int line) \
225 return omapi_array_set (pptr, (char *)ptr, index, file, line); \
228 isc_result_t name##_array_lookup (stype **ptr, omapi_array_t *pptr, \
229 int index, const char *file, int line) \
231 return omapi_array_lookup ((char **)ptr, pptr, index, file, line); \
234 #define OMAPI_ARRAY_TYPE_DECL(name, stype) \
235 isc_result_t name##_array_allocate (omapi_array_t **, const char *, int); \
236 isc_result_t name##_array_free (omapi_array_t **, const char *, int); \
237 isc_result_t name##_array_extend (omapi_array_t *, stype *, int *, \
238 const char *, int); \
239 isc_result_t name##_array_set (omapi_array_t *, \
240 stype *, int, const char *, int); \
241 isc_result_t name##_array_lookup (stype **, \
242 omapi_array_t *, int, const char *, int)
244 #define omapi_array_foreach_begin(array, stype, var) \
246 int omapi_array_foreach_index; \
247 stype *var = (stype *)0; \
248 for (omapi_array_foreach_index = 0; \
250 omapi_array_foreach_index < (array) -> count; \
251 omapi_array_foreach_index++) { \
252 if ((array) -> data [omapi_array_foreach_index]) { \
255 (array) -> data [omapi_array_foreach_index],\
258 #define omapi_array_foreach_end(array, stype, var) \
259 (*(array) -> deref) ((char **)&var, MDL); \
264 isc_result_t omapi_protocol_connect (omapi_object_t *,
265 const char *, unsigned, omapi_object_t *);
266 isc_result_t omapi_connect_list (omapi_object_t *, omapi_addr_list_t *,
268 isc_result_t omapi_protocol_listen (omapi_object_t *, unsigned, int);
269 isc_boolean_t omapi_protocol_authenticated (omapi_object_t *);
270 isc_result_t omapi_protocol_configure_security (omapi_object_t *,
276 omapi_auth_key_t *));
277 isc_result_t omapi_protocol_accept (omapi_object_t *);
278 isc_result_t omapi_protocol_send_intro (omapi_object_t *, unsigned, unsigned);
279 isc_result_t omapi_protocol_ready (omapi_object_t *);
280 isc_result_t omapi_protocol_add_auth (omapi_object_t *, omapi_object_t *,
282 isc_result_t omapi_protocol_lookup_auth (omapi_object_t **, omapi_object_t *,
284 isc_result_t omapi_protocol_set_value (omapi_object_t *, omapi_object_t *,
285 omapi_data_string_t *,
286 omapi_typed_data_t *);
287 isc_result_t omapi_protocol_get_value (omapi_object_t *, omapi_object_t *,
288 omapi_data_string_t *,
290 isc_result_t omapi_protocol_stuff_values (omapi_object_t *,
294 isc_result_t omapi_protocol_destroy (omapi_object_t *, const char *, int);
295 isc_result_t omapi_protocol_send_message (omapi_object_t *,
299 isc_result_t omapi_protocol_signal_handler (omapi_object_t *,
300 const char *, va_list);
301 isc_result_t omapi_protocol_listener_set_value (omapi_object_t *,
303 omapi_data_string_t *,
304 omapi_typed_data_t *);
305 isc_result_t omapi_protocol_listener_get_value (omapi_object_t *,
307 omapi_data_string_t *,
309 isc_result_t omapi_protocol_listener_destroy (omapi_object_t *,
311 isc_result_t omapi_protocol_listener_signal (omapi_object_t *,
312 const char *, va_list);
313 isc_result_t omapi_protocol_listener_stuff (omapi_object_t *,
316 isc_result_t omapi_protocol_send_status (omapi_object_t *, omapi_object_t *,
317 isc_result_t, unsigned, const char *);
318 isc_result_t omapi_protocol_send_open (omapi_object_t *, omapi_object_t *,
319 const char *, omapi_object_t *,
321 isc_result_t omapi_protocol_send_update (omapi_object_t *, omapi_object_t *,
322 unsigned, omapi_object_t *);
324 isc_result_t omapi_connect (omapi_object_t *, const char *, unsigned);
325 isc_result_t omapi_disconnect (omapi_object_t *, int);
326 int omapi_connection_readfd (omapi_object_t *);
327 int omapi_connection_writefd (omapi_object_t *);
328 isc_result_t omapi_connection_connect (omapi_object_t *);
329 isc_result_t omapi_connection_reader (omapi_object_t *);
330 isc_result_t omapi_connection_writer (omapi_object_t *);
331 isc_result_t omapi_connection_reaper (omapi_object_t *);
332 isc_result_t omapi_connection_output_auth_length (omapi_object_t *,
334 isc_result_t omapi_connection_set_value (omapi_object_t *, omapi_object_t *,
335 omapi_data_string_t *,
336 omapi_typed_data_t *);
337 isc_result_t omapi_connection_get_value (omapi_object_t *, omapi_object_t *,
338 omapi_data_string_t *,
340 isc_result_t omapi_connection_destroy (omapi_object_t *, const char *, int);
341 isc_result_t omapi_connection_signal_handler (omapi_object_t *,
342 const char *, va_list);
343 isc_result_t omapi_connection_stuff_values (omapi_object_t *,
346 isc_result_t omapi_connection_write_typed_data (omapi_object_t *,
347 omapi_typed_data_t *);
348 isc_result_t omapi_connection_put_name (omapi_object_t *, const char *);
349 isc_result_t omapi_connection_put_string (omapi_object_t *, const char *);
350 isc_result_t omapi_connection_put_handle (omapi_object_t *c,
353 isc_result_t omapi_listen (omapi_object_t *, unsigned, int);
354 isc_result_t omapi_listen_addr (omapi_object_t *,
355 omapi_addr_t *, int);
356 isc_result_t omapi_listener_accept (omapi_object_t *);
357 int omapi_listener_readfd (omapi_object_t *);
358 isc_result_t omapi_accept (omapi_object_t *);
359 isc_result_t omapi_listener_configure_security (omapi_object_t *,
363 isc_result_t omapi_listener_set_value (omapi_object_t *, omapi_object_t *,
364 omapi_data_string_t *,
365 omapi_typed_data_t *);
366 isc_result_t omapi_listener_get_value (omapi_object_t *, omapi_object_t *,
367 omapi_data_string_t *,
369 isc_result_t omapi_listener_destroy (omapi_object_t *, const char *, int);
370 isc_result_t omapi_listener_signal_handler (omapi_object_t *,
371 const char *, va_list);
372 isc_result_t omapi_listener_stuff_values (omapi_object_t *,
376 isc_result_t omapi_register_io_object (omapi_object_t *,
377 int (*)(omapi_object_t *),
378 int (*)(omapi_object_t *),
379 isc_result_t (*)(omapi_object_t *),
380 isc_result_t (*)(omapi_object_t *),
381 isc_result_t (*)(omapi_object_t *));
382 isc_result_t omapi_unregister_io_object (omapi_object_t *);
383 isc_result_t omapi_dispatch (struct timeval *);
384 isc_result_t omapi_wait_for_completion (omapi_object_t *, struct timeval *);
385 isc_result_t omapi_one_dispatch (omapi_object_t *, struct timeval *);
386 isc_result_t omapi_io_set_value (omapi_object_t *, omapi_object_t *,
387 omapi_data_string_t *,
388 omapi_typed_data_t *);
389 isc_result_t omapi_io_get_value (omapi_object_t *, omapi_object_t *,
390 omapi_data_string_t *, omapi_value_t **);
391 isc_result_t omapi_io_destroy (omapi_object_t *, const char *, int);
392 isc_result_t omapi_io_signal_handler (omapi_object_t *, const char *, va_list);
393 isc_result_t omapi_io_stuff_values (omapi_object_t *,
396 isc_result_t omapi_waiter_signal_handler (omapi_object_t *,
397 const char *, va_list);
398 isc_result_t omapi_io_state_foreach (isc_result_t (*func) (omapi_object_t *,
402 isc_result_t omapi_generic_new (omapi_object_t **, const char *, int);
403 isc_result_t omapi_generic_set_value (omapi_object_t *, omapi_object_t *,
404 omapi_data_string_t *,
405 omapi_typed_data_t *);
406 isc_result_t omapi_generic_get_value (omapi_object_t *, omapi_object_t *,
407 omapi_data_string_t *,
409 isc_result_t omapi_generic_destroy (omapi_object_t *, const char *, int);
410 isc_result_t omapi_generic_signal_handler (omapi_object_t *,
411 const char *, va_list);
412 isc_result_t omapi_generic_stuff_values (omapi_object_t *,
415 isc_result_t omapi_generic_clear_flags (omapi_object_t *);
417 isc_result_t omapi_message_new (omapi_object_t **, const char *, int);
418 isc_result_t omapi_message_set_value (omapi_object_t *, omapi_object_t *,
419 omapi_data_string_t *,
420 omapi_typed_data_t *);
421 isc_result_t omapi_message_get_value (omapi_object_t *, omapi_object_t *,
422 omapi_data_string_t *,
424 isc_result_t omapi_message_destroy (omapi_object_t *, const char *, int);
425 isc_result_t omapi_message_signal_handler (omapi_object_t *,
426 const char *, va_list);
427 isc_result_t omapi_message_stuff_values (omapi_object_t *,
430 isc_result_t omapi_message_register (omapi_object_t *);
431 isc_result_t omapi_message_unregister (omapi_object_t *);
432 isc_result_t omapi_message_process (omapi_object_t *, omapi_object_t *);
434 OMAPI_OBJECT_ALLOC_DECL (omapi_auth_key,
435 omapi_auth_key_t, omapi_type_auth_key)
436 isc_result_t omapi_auth_key_new (omapi_auth_key_t **, const char *, int);
437 isc_result_t omapi_auth_key_destroy (omapi_object_t *, const char *, int);
438 isc_result_t omapi_auth_key_enter (omapi_auth_key_t *);
439 isc_result_t omapi_auth_key_lookup_name (omapi_auth_key_t **, const char *);
440 isc_result_t omapi_auth_key_lookup (omapi_object_t **,
443 isc_result_t omapi_auth_key_get_value (omapi_object_t *, omapi_object_t *,
444 omapi_data_string_t *,
446 isc_result_t omapi_auth_key_stuff_values (omapi_object_t *,
450 extern omapi_object_type_t *omapi_type_connection;
451 extern omapi_object_type_t *omapi_type_listener;
452 extern omapi_object_type_t *omapi_type_io_object;
453 extern omapi_object_type_t *omapi_type_generic;
454 extern omapi_object_type_t *omapi_type_protocol;
455 extern omapi_object_type_t *omapi_type_protocol_listener;
456 extern omapi_object_type_t *omapi_type_waiter;
457 extern omapi_object_type_t *omapi_type_remote;
458 extern omapi_object_type_t *omapi_type_message;
459 extern omapi_object_type_t *omapi_type_auth_key;
461 extern omapi_object_type_t *omapi_object_types;
463 void omapi_type_relinquish (void);
464 isc_result_t omapi_init (void);
465 isc_result_t omapi_object_type_register (omapi_object_type_t **,
470 omapi_data_string_t *,
471 omapi_typed_data_t *),
475 omapi_data_string_t *,
477 isc_result_t (*) (omapi_object_t *,
479 isc_result_t (*) (omapi_object_t *,
482 isc_result_t (*) (omapi_object_t *,
485 isc_result_t (*) (omapi_object_t **,
488 isc_result_t (*) (omapi_object_t **,
490 isc_result_t (*) (omapi_object_t *,
492 isc_result_t (*) (omapi_object_t *,
494 isc_result_t (*) (omapi_object_t **,
496 isc_result_t (*) (size_t), size_t,
497 isc_result_t (*) (omapi_object_t *,
500 isc_result_t omapi_signal (omapi_object_t *, const char *, ...);
501 isc_result_t omapi_signal_in (omapi_object_t *, const char *, ...);
502 isc_result_t omapi_set_value (omapi_object_t *, omapi_object_t *,
503 omapi_data_string_t *,
504 omapi_typed_data_t *);
505 isc_result_t omapi_set_value_str (omapi_object_t *, omapi_object_t *,
506 const char *, omapi_typed_data_t *);
507 isc_result_t omapi_set_boolean_value (omapi_object_t *, omapi_object_t *,
509 isc_result_t omapi_set_int_value (omapi_object_t *, omapi_object_t *,
511 isc_result_t omapi_set_object_value (omapi_object_t *, omapi_object_t *,
512 const char *, omapi_object_t *);
513 isc_result_t omapi_set_string_value (omapi_object_t *, omapi_object_t *,
514 const char *, const char *);
515 isc_result_t omapi_get_value (omapi_object_t *, omapi_object_t *,
516 omapi_data_string_t *,
518 isc_result_t omapi_get_value_str (omapi_object_t *, omapi_object_t *,
519 const char *, omapi_value_t **);
520 isc_result_t omapi_stuff_values (omapi_object_t *,
523 isc_result_t omapi_object_create (omapi_object_t **, omapi_object_t *,
524 omapi_object_type_t *);
525 isc_result_t omapi_object_update (omapi_object_t *, omapi_object_t *,
526 omapi_object_t *, omapi_handle_t);
527 int omapi_data_string_cmp (omapi_data_string_t *, omapi_data_string_t *);
528 int omapi_ds_strcmp (omapi_data_string_t *, const char *);
529 int omapi_td_strcmp (omapi_typed_data_t *, const char *);
530 int omapi_td_strcasecmp (omapi_typed_data_t *, const char *);
531 isc_result_t omapi_make_value (omapi_value_t **, omapi_data_string_t *,
532 omapi_typed_data_t *, const char *, int);
533 isc_result_t omapi_make_const_value (omapi_value_t **, omapi_data_string_t *,
534 const unsigned char *,
535 unsigned, const char *, int);
536 isc_result_t omapi_make_int_value (omapi_value_t **, omapi_data_string_t *,
537 int, const char *, int);
538 isc_result_t omapi_make_uint_value (omapi_value_t **, omapi_data_string_t *,
539 unsigned int, const char *, int);
540 isc_result_t omapi_make_object_value (omapi_value_t **, omapi_data_string_t *,
541 omapi_object_t *, const char *, int);
542 isc_result_t omapi_make_handle_value (omapi_value_t **, omapi_data_string_t *,
543 omapi_object_t *, const char *, int);
544 isc_result_t omapi_make_string_value (omapi_value_t **, omapi_data_string_t *,
545 const char *, const char *, int);
546 isc_result_t omapi_get_int_value (unsigned long *, omapi_typed_data_t *);
548 isc_result_t omapi_object_handle (omapi_handle_t *, omapi_object_t *);
549 isc_result_t omapi_handle_lookup (omapi_object_t **, omapi_handle_t);
550 isc_result_t omapi_handle_td_lookup (omapi_object_t **, omapi_typed_data_t *);
552 void * dmalloc (unsigned, const char *, int);
553 void dfree (void *, const char *, int);
554 #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \
555 defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
556 void dmalloc_reuse (void *, const char *, int, int);
557 void dmalloc_dump_outstanding (void);
559 #define dmalloc_reuse(x,y,l,z)
561 #define MDL __FILE__, __LINE__
562 #if defined (DEBUG_RC_HISTORY)
563 void dump_rc_history (void *);
564 void rc_history_next (int);
566 void omapi_print_dmalloc_usage_by_caller (void);
567 isc_result_t omapi_object_allocate (omapi_object_t **,
568 omapi_object_type_t *,
569 size_t, const char *, int);
570 isc_result_t omapi_object_initialize (omapi_object_t *,
571 omapi_object_type_t *,
572 size_t, size_t, const char *, int);
573 isc_result_t omapi_object_reference (omapi_object_t **,
574 omapi_object_t *, const char *, int);
575 isc_result_t omapi_object_dereference (omapi_object_t **, const char *, int);
576 isc_result_t omapi_typed_data_new (const char *, int, omapi_typed_data_t **,
577 omapi_datatype_t, ...);
578 isc_result_t omapi_typed_data_reference (omapi_typed_data_t **,
579 omapi_typed_data_t *,
581 isc_result_t omapi_typed_data_dereference (omapi_typed_data_t **,
583 isc_result_t omapi_data_string_new (omapi_data_string_t **,
584 unsigned, const char *, int);
585 isc_result_t omapi_data_string_reference (omapi_data_string_t **,
586 omapi_data_string_t *,
588 isc_result_t omapi_data_string_dereference (omapi_data_string_t **,
590 isc_result_t omapi_value_new (omapi_value_t **, const char *, int);
591 isc_result_t omapi_value_reference (omapi_value_t **,
592 omapi_value_t *, const char *, int);
593 isc_result_t omapi_value_dereference (omapi_value_t **, const char *, int);
594 isc_result_t omapi_addr_list_new (omapi_addr_list_t **, unsigned,
596 isc_result_t omapi_addr_list_reference (omapi_addr_list_t **,
599 isc_result_t omapi_addr_list_dereference (omapi_addr_list_t **,
602 isc_result_t omapi_array_allocate (omapi_array_t **, omapi_array_ref_t,
603 omapi_array_deref_t, const char *, int);
604 isc_result_t omapi_array_free (omapi_array_t **, const char *, int);
605 isc_result_t omapi_array_extend (omapi_array_t *, char *, int *,
607 isc_result_t omapi_array_set (omapi_array_t *, void *, int, const char *, int);
608 isc_result_t omapi_array_lookup (char **,
609 omapi_array_t *, int, const char *, int);
610 OMAPI_ARRAY_TYPE_DECL(omapi_object, omapi_object_t);
611 #endif /* _OMAPIP_H_ */