51 for (q = *queue ; q ; q = q->
next) {
59 log_fatal(
"register_eventhandler: no memory!");
60 memset(q, 0,
sizeof *q);
76 for (q = *queue ; q ; q = q->
next) {
95 for (q=*queue ; q ; q=q->
next) {
121 isc_socket_t *socket,
129 gettimeofday (&
cur_tv, (
struct timezone *)0);
137 for (obj = omapi_io_states.
next; obj != NULL; obj = obj->
next) {
148 log_fatal (
"Incorrect object type, must be of type io_object");
164 if ((flags == ISC_SOCKFDWATCH_READ) &&
166 (obj->inner != NULL)) {
167 status = obj->
reader(obj->inner);
173 if (status == ISC_R_SHUTTINGDOWN)
177 }
else if ((flags == ISC_SOCKFDWATCH_WRITE) &&
179 (obj->inner != NULL)) {
180 status = obj->
writer(obj->inner);
183 if (status == ISC_R_INPROGRESS) {
201 isc_result_t (*reader)
203 isc_result_t (*writer)
205 isc_result_t (*reaper)
210 int fd_flags = 0, fd = 0;
217 if (!omapi_io_states.refcnt) {
218 omapi_io_states.refcnt = 1;
223 status = omapi_io_allocate (&obj,
MDL);
230 omapi_io_dereference (&obj,
MDL);
237 omapi_io_dereference (&obj,
MDL);
249 fd_flags |= ISC_SOCKFDWATCH_READ;
254 fd_flags |= ISC_SOCKFDWATCH_WRITE;
266 log_error(
"Unable to register fd with library %s",
267 isc_result_totext(status));
272 omapi_io_dereference (&obj,
MDL);
279 for (p = omapi_io_states.
next;
283 omapi_io_reference (&p ->
next, obj,
MDL);
285 omapi_io_reference (&omapi_io_states.
next, obj,
MDL);
287 obj -> readfd = readfd;
288 obj -> writefd = writefd;
289 obj -> reader = reader;
290 obj -> writer = writer;
291 obj -> reaper = reaper;
293 omapi_io_dereference(&obj,
MDL);
308 isc_result_t (*reader)
310 isc_result_t (*writer)
312 isc_result_t (*reaper)
326 reader, writer, reaper));
343 fd_flags |= ISC_SOCKFDWATCH_READ;
347 fd_flags |= ISC_SOCKFDWATCH_WRITE;
350 isc_socket_fdwatchpoke(obj->
fd, fd_flags);
366 omapi_io_reference (&ph, obj,
MDL);
377 last = &omapi_io_states;
378 for (p = omapi_io_states.
next; p; p = p ->
next) {
380 omapi_io_dereference (&last ->
next,
MDL);
381 omapi_io_reference (&last ->
next, p ->
next,
MDL);
387 omapi_io_dereference (&obj ->
next,
MDL);
401 if (obj->
fd != NULL) {
404 isc_socket_detach(&obj->
fd);
410 omapi_io_dereference (&ph,
MDL);
429 log_debug (
"omapi_wait_for_completion(%u.%u secs)",
430 (
unsigned int)(t->tv_sec),
431 (
unsigned int)(t->tv_usec));
433 log_debug (
"omapi_wait_for_completion(no timeout)");
442 status = omapi_waiter_allocate (&waiter,
MDL);
448 for (inner =
object; inner -> inner; inner = inner -> inner)
453 omapi_waiter_dereference (&waiter,
MDL);
461 omapi_waiter_dereference (&waiter,
MDL);
471 log_debug (
"- call to omapi_one_dispatch failed: %s",
472 isc_result_totext (status));
477 }
while (!waiter || !waiter -> ready);
480 if (waiter -> outer) {
481 if (waiter -> outer -> inner) {
486 (&waiter -> outer -> inner,
487 waiter -> inner,
MDL);
497 status = waiter -> waitstatus;
500 omapi_waiter_dereference (&waiter,
MDL);
510 fd_set r, w, x, rr, ww, xx;
514 struct timeval now, to;
528 gettimeofday (&now, (
struct timezone *)0);
529 cur_tv.tv_sec = now.tv_sec;
530 cur_tv.tv_usec = now.tv_usec;
531 if (now.tv_sec > t -> tv_sec ||
532 (now.tv_sec == t -> tv_sec && now.tv_usec >= t -> tv_usec))
533 return ISC_R_TIMEDOUT;
537 to.tv_sec = t -> tv_sec - now.tv_sec;
538 to.tv_usec = t -> tv_usec - now.tv_usec;
539 if (to.tv_usec < 0) {
540 to.tv_usec += 1000000;
548 if (to.tv_sec > (60 * 60 * 24))
549 to.tv_sec = 60 * 60 * 24;
554 if (waiter && waiter -> ready)
559 if (!(io = omapi_io_states.
next))
566 for (; io; io = io -> next) {
570 if (io -> readfd && io -> inner &&
571 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
578 if (io -> writefd && io -> inner &&
579 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
592 log_debug (
"--- Connected, nothing to write, skip writefd\n");
613 count = select(max + 1, &r, &w, &x, &now);
624 log_debug (
" calling select with timout: %u.%u secs",
625 (
unsigned int)(to.tv_sec),
626 (
unsigned int)(to.tv_usec));
629 count = select(max + 1, &r, &w, &x, t ? &to : NULL);
633 gettimeofday (&
cur_tv, (
struct timezone *)0);
642 if (omapi_io_states.
next)
643 omapi_io_reference (&io, omapi_io_states.
next,
MDL);
649 t0.tv_sec = t0.tv_usec = 0;
651 if (io -> readfd && io -> inner &&
652 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
654 count = select (desc + 1, &r, &w, &x, &t0);
662 for (; obj; obj = obj -> inner) {
670 if (ov && ov ->
value &&
671 (ov ->
value -> type ==
674 ov ->
value -> u.buffer.value;
675 len = ov ->
value -> u.buffer.len;
688 (*(io -> reaper)) (io -> inner);
690 omapi_io_dereference (&prev -> next,
MDL);
692 omapi_io_reference (&prev -> next,
699 (&omapi_io_states.
next,
702 omapi_io_dereference (&io,
MDL);
709 t0.tv_sec = t0.tv_usec = 0;
712 if (io -> writefd && io -> inner &&
713 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
715 count = select (desc + 1, &r, &w, &x, &t0);
720 omapi_io_dereference (&prev,
MDL);
721 omapi_io_reference (&prev, io,
MDL);
722 omapi_io_dereference (&io,
MDL);
724 omapi_io_reference (&io, prev -> next,
MDL);
727 omapi_io_dereference (&prev,
MDL);
731 for (io = omapi_io_states.
next; io; io = io -> next) {
738 (desc = (*(io -> readfd)) (tmp)) >= 0) {
739 if (FD_ISSET (desc, &r)) {
740 ((*(io -> reader)) (tmp));
746 (desc = (*(io -> writefd)) (tmp)) >= 0)
748 if (FD_ISSET (desc, &w)) {
749 ((*(io -> writer)) (tmp));
759 if (omapi_io_states.
next != NULL) {
760 omapi_io_reference(&io, omapi_io_states.
next,
MDL);
763 if ((io->inner == NULL) ||
764 ((io->reaper != NULL) &&
771 if (io->next != NULL) {
772 omapi_io_reference(&tmp, io->
next,
MDL);
773 omapi_io_dereference(&io->next,
MDL);
776 omapi_io_dereference(&prev->next,
MDL);
778 omapi_io_reference(&prev->next,
781 omapi_io_dereference(&omapi_io_states.
next,
785 (&omapi_io_states.
next,
794 omapi_io_dereference(&tmp,
MDL);
799 omapi_io_dereference(&prev,
MDL);
801 omapi_io_reference(&prev, io,
MDL);
810 if (io->next != NULL) {
811 omapi_io_reference(&next, io->next,
MDL);
813 omapi_io_dereference(&io,
MDL);
815 omapi_io_reference(&io, next,
MDL);
816 omapi_io_dereference(&next,
MDL);
820 omapi_io_dereference(&prev,
MDL);
834 if (h -> inner && h -> inner -> type -> set_value)
835 return (*(h -> inner -> type -> set_value))
836 (h -> inner, id, name,
value);
837 return ISC_R_NOTFOUND;
848 if (h -> inner && h -> inner -> type -> get_value)
849 return (*(h -> inner -> type -> get_value))
850 (h -> inner, id, name,
value);
851 return ISC_R_NOTFOUND;
870 for (p = omapi_io_states.
next; p; p = p -> next) {
872 omapi_io_reference (&obj, p,
MDL);
875 holder = &last -> next;
877 holder = &omapi_io_states.
next;
879 omapi_io_dereference (holder,
MDL);
882 omapi_io_reference (holder, obj -> next,
MDL);
883 omapi_io_dereference (&obj -> next,
MDL);
886 return omapi_io_dereference (&obj,
MDL);
891 return ISC_R_NOTFOUND;
895 const char *name, va_list ap)
898 log_debug (
"omapi_io_signal_handler(%s)", name);
903 if (h -> inner && h -> inner -> type -> signal_handler)
904 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
906 return ISC_R_NOTFOUND;
916 if (i -> inner && i -> inner -> type -> stuff_values)
917 return (*(i -> inner -> type -> stuff_values)) (c, id,
923 const char *name, va_list ap)
928 log_debug (
"omapi_waiter_signal_handler(%s)", name);
933 if (!strcmp (name,
"ready")) {
940 if (!strcmp(name,
"status")) {
943 waiter->
waitstatus = va_arg(ap, isc_result_t);
947 if (!strcmp (name,
"disconnect")) {
954 if (h -> inner && h -> inner -> type -> signal_handler)
955 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
957 return ISC_R_NOTFOUND;
982 if (omapi_io_states.
next) {
995 status = (*func) (io->inner, p);
void register_eventhandler(struct eventqueue **, void(*handler)(void *))
dhcp_context_t dhcp_gbl_ctx
isc_result_t omapi_unregister_io_object(omapi_object_t *h)
void unregister_eventhandler(struct eventqueue **queue, void(*handler)(void *))
isc_result_t omapi_one_dispatch(omapi_object_t *wo, struct timeval *t)
isc_result_t omapi_register_io_object(omapi_object_t *h, int(*readfd)(omapi_object_t *), int(*writefd)(omapi_object_t *), isc_result_t(*reader)(omapi_object_t *), isc_result_t(*writer)(omapi_object_t *), isc_result_t(*reaper)(omapi_object_t *))
isc_result_t omapi_io_destroy(omapi_object_t *h, const char *file, int line)
isc_result_t omapi_waiter_signal_handler(omapi_object_t *h, const char *name, va_list ap)
isc_result_t omapi_io_signal_handler(omapi_object_t *h, const char *name, va_list ap)
struct eventqueue * rw_queue_empty
isc_result_t omapi_io_state_foreach(isc_result_t(*func)(omapi_object_t *, void *), void *p)
calls a given function on every object
int omapi_iscsock_cb(isc_task_t *task, isc_socket_t *socket, void *cbarg, int flags)
isc_result_t omapi_io_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *i)
isc_result_t omapi_io_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
isc_result_t omapi_io_set_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_typed_data_t *value)
isc_result_t omapi_reregister_io_object(omapi_object_t *h, int(*readfd)(omapi_object_t *), int(*writefd)(omapi_object_t *), isc_result_t(*reader)(omapi_object_t *), isc_result_t(*writer)(omapi_object_t *), isc_result_t(*reaper)(omapi_object_t *))
void trigger_event(struct eventqueue **queue)
isc_result_t omapi_wait_for_completion(omapi_object_t *object, struct timeval *t)
isc_result_t omapi_dispatch(struct timeval *t)
isc_result_t omapi_value_dereference(omapi_value_t **, const char *, int)
omapi_object_type_t * omapi_type_io_object
#define OMAPI_OBJECT_ALLOC(name, stype, type)
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
omapi_object_type_t * omapi_type_waiter
isc_result_t omapi_object_reference(omapi_object_t **, omapi_object_t *, const char *, int)
isc_result_t omapi_signal_in(omapi_object_t *, const char *,...)
omapi_object_type_t * omapi_type_connection
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
isc_result_t omapi_get_value_str(omapi_object_t *, omapi_object_t *, const char *, omapi_value_t **)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
@ omapi_connection_connected
#define DHCP_R_INVALIDARG
omapi_connection_state_t state
isc_result_t(* reaper)(omapi_object_t *)
struct __omapi_io_object * next
isc_result_t(* writer)(omapi_object_t *)
isc_result_t(* reader)(omapi_object_t *)
int(* readfd)(omapi_object_t *)
int(* writefd)(omapi_object_t *)
isc_socketmgr_t * socketmgr