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;
138 (obj != NULL) && (obj->
next != NULL);
149 log_fatal (
"Incorrect object type, must be of type io_object");
160 if (obj->
closed == ISC_TRUE) {
165 if ((flags == ISC_SOCKFDWATCH_READ) &&
167 (obj->inner != NULL)) {
168 status = obj->
reader(obj->inner);
174 if (status == ISC_R_SHUTTINGDOWN)
178 }
else if ((flags == ISC_SOCKFDWATCH_WRITE) &&
180 (obj->inner != NULL)) {
181 status = obj->
writer(obj->inner);
184 if (status == ISC_R_INPROGRESS) {
202 isc_result_t (*reader)
204 isc_result_t (*writer)
206 isc_result_t (*reaper)
211 int fd_flags = 0, fd = 0;
218 if (!omapi_io_states.refcnt) {
219 omapi_io_states.refcnt = 1;
224 status = omapi_io_allocate (&obj,
MDL);
225 if (status != ISC_R_SUCCESS)
230 if (status != ISC_R_SUCCESS) {
231 omapi_io_dereference (&obj,
MDL);
237 if (status != ISC_R_SUCCESS) {
238 omapi_io_dereference (&obj,
MDL);
250 fd_flags |= ISC_SOCKFDWATCH_READ;
255 fd_flags |= ISC_SOCKFDWATCH_WRITE;
266 if (status != ISC_R_SUCCESS) {
267 log_error(
"Unable to register fd with library %s",
268 isc_result_totext(status));
273 omapi_io_dereference (&obj,
MDL);
280 for (p = omapi_io_states.
next;
284 omapi_io_reference (&p ->
next, obj,
MDL);
286 omapi_io_reference (&omapi_io_states.
next, obj,
MDL);
288 obj -> readfd = readfd;
289 obj -> writefd = writefd;
290 obj -> reader = reader;
291 obj -> writer = writer;
292 obj -> reaper = reaper;
294 omapi_io_dereference(&obj,
MDL);
295 return ISC_R_SUCCESS;
309 isc_result_t (*reader)
311 isc_result_t (*writer)
313 isc_result_t (*reaper)
327 reader, writer, reaper));
344 fd_flags |= ISC_SOCKFDWATCH_READ;
348 fd_flags |= ISC_SOCKFDWATCH_WRITE;
351 isc_socket_fdwatchpoke(obj->
fd, fd_flags);
353 return (ISC_R_SUCCESS);
367 omapi_io_reference (&ph, obj,
MDL);
378 last = &omapi_io_states;
379 for (p = omapi_io_states.
next; p; p = p ->
next) {
381 omapi_io_dereference (&last ->
next,
MDL);
382 omapi_io_reference (&last ->
next, p ->
next,
MDL);
388 omapi_io_dereference (&obj ->
next,
MDL);
402 if (obj->
fd != NULL) {
405 isc_socket_detach(&obj->
fd);
411 omapi_io_dereference (&ph,
MDL);
412 return ISC_R_SUCCESS;
430 status = omapi_waiter_allocate (&waiter,
MDL);
431 if (status != ISC_R_SUCCESS)
436 for (inner =
object; inner -> inner; inner = inner -> inner)
440 if (status != ISC_R_SUCCESS) {
441 omapi_waiter_dereference (&waiter,
MDL);
448 if (status != ISC_R_SUCCESS) {
449 omapi_waiter_dereference (&waiter,
MDL);
457 if (status != ISC_R_SUCCESS)
459 }
while (!waiter || !waiter -> ready);
461 if (waiter -> outer) {
462 if (waiter -> outer -> inner) {
467 (&waiter -> outer -> inner,
468 waiter -> inner,
MDL);
475 status = waiter -> waitstatus;
476 omapi_waiter_dereference (&waiter,
MDL);
483 fd_set r, w, x, rr, ww, xx;
487 struct timeval now, to;
501 gettimeofday (&now, (
struct timezone *)0);
502 cur_tv.tv_sec = now.tv_sec;
503 cur_tv.tv_usec = now.tv_usec;
504 if (now.tv_sec > t -> tv_sec ||
505 (now.tv_sec == t -> tv_sec && now.tv_usec >= t -> tv_usec))
506 return ISC_R_TIMEDOUT;
510 to.tv_sec = t -> tv_sec - now.tv_sec;
511 to.tv_usec = t -> tv_usec - now.tv_usec;
512 if (to.tv_usec < 0) {
513 to.tv_usec += 1000000;
521 if (to.tv_sec > (60 * 60 * 24))
522 to.tv_sec = 60 * 60 * 24;
527 if (waiter && waiter -> ready)
528 return ISC_R_SUCCESS;
532 if (!(io = omapi_io_states.
next))
539 for (; io; io = io -> next) {
543 if (io -> readfd && io -> inner &&
544 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
551 if (io -> writefd && io -> inner &&
552 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
567 count = select(max + 1, &r, &w, &x, &now);
575 count = select(max + 1, &r, &w, &x, t ? &to : NULL);
579 gettimeofday (&
cur_tv, (
struct timezone *)0);
588 if (omapi_io_states.
next)
589 omapi_io_reference (&io, omapi_io_states.
next,
MDL);
595 t0.tv_sec = t0.tv_usec = 0;
597 if (io -> readfd && io -> inner &&
598 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
600 count = select (desc + 1, &r, &w, &x, &t0);
608 for (; obj; obj = obj -> inner) {
616 if (ov && ov -> value &&
617 (ov -> value -> type ==
620 ov -> value -> u.buffer.
value;
621 len = ov -> value -> u.buffer.len;
634 (*(io -> reaper)) (io -> inner);
636 omapi_io_dereference (&prev -> next,
MDL);
638 omapi_io_reference (&prev -> next,
645 (&omapi_io_states.
next,
648 omapi_io_dereference (&io,
MDL);
655 t0.tv_sec = t0.tv_usec = 0;
658 if (io -> writefd && io -> inner &&
659 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
661 count = select (desc + 1, &r, &w, &x, &t0);
666 omapi_io_dereference (&prev,
MDL);
667 omapi_io_reference (&prev, io,
MDL);
668 omapi_io_dereference (&io,
MDL);
670 omapi_io_reference (&io, prev -> next,
MDL);
673 omapi_io_dereference (&prev,
MDL);
677 for (io = omapi_io_states.
next; io; io = io -> next) {
684 (desc = (*(io -> readfd)) (tmp)) >= 0) {
685 if (FD_ISSET (desc, &r))
686 ((*(io -> reader)) (tmp));
691 (desc = (*(io -> writefd)) (tmp)) >= 0)
693 if (FD_ISSET (desc, &w))
694 ((*(io -> writer)) (tmp));
703 if (omapi_io_states.
next != NULL) {
704 omapi_io_reference(&io, omapi_io_states.
next,
MDL);
707 if ((io->inner == NULL) ||
708 ((io->reaper != NULL) &&
709 ((io->reaper)(io->inner) != ISC_R_SUCCESS)))
715 if (io->next != NULL) {
716 omapi_io_reference(&tmp, io->
next,
MDL);
717 omapi_io_dereference(&io->next,
MDL);
720 omapi_io_dereference(&prev->next,
MDL);
722 omapi_io_reference(&prev->next,
725 omapi_io_dereference(&omapi_io_states.
next,
729 (&omapi_io_states.
next,
738 omapi_io_dereference(&tmp,
MDL);
743 omapi_io_dereference(&prev,
MDL);
745 omapi_io_reference(&prev, io,
MDL);
754 if (io->next != NULL) {
755 omapi_io_reference(&next, io->next,
MDL);
757 omapi_io_dereference(&io,
MDL);
759 omapi_io_reference(&io, next,
MDL);
760 omapi_io_dereference(&next,
MDL);
764 omapi_io_dereference(&prev,
MDL);
767 return ISC_R_SUCCESS;
778 if (h -> inner && h -> inner -> type -> set_value)
779 return (*(h -> inner -> type -> set_value))
780 (h -> inner, id, name, value);
781 return ISC_R_NOTFOUND;
792 if (h -> inner && h -> inner -> type -> get_value)
793 return (*(h -> inner -> type -> get_value))
794 (h -> inner, id, name, value);
795 return ISC_R_NOTFOUND;
814 for (p = omapi_io_states.
next; p; p = p -> next) {
816 omapi_io_reference (&obj, p,
MDL);
819 holder = &last -> next;
821 holder = &omapi_io_states.
next;
823 omapi_io_dereference (holder,
MDL);
826 omapi_io_reference (holder, obj -> next,
MDL);
827 omapi_io_dereference (&obj -> next,
MDL);
830 return omapi_io_dereference (&obj,
MDL);
835 return ISC_R_NOTFOUND;
839 const char *name, va_list ap)
844 if (h -> inner && h -> inner -> type -> signal_handler)
845 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
847 return ISC_R_NOTFOUND;
857 if (i -> inner && i -> inner -> type -> stuff_values)
858 return (*(i -> inner -> type -> stuff_values)) (c, id,
860 return ISC_R_SUCCESS;
864 const char *name, va_list ap)
871 if (!strcmp (name,
"ready")) {
874 waiter -> waitstatus = ISC_R_SUCCESS;
875 return ISC_R_SUCCESS;
878 if (!strcmp(name,
"status")) {
881 waiter->
waitstatus = va_arg(ap, isc_result_t);
882 return ISC_R_SUCCESS;
885 if (!strcmp (name,
"disconnect")) {
889 return ISC_R_SUCCESS;
892 if (h -> inner && h -> inner -> type -> signal_handler)
893 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
895 return ISC_R_NOTFOUND;
920 if (omapi_io_states.
next) {
933 status = (*func) (io->inner, p);
934 if (status != ISC_R_SUCCESS) {
958 return ISC_R_SUCCESS;
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_object_reference(omapi_object_t **, omapi_object_t *, const char *, int)
int(* readfd)(omapi_object_t *)
void * dmalloc(unsigned, const char *, int)
dhcp_context_t dhcp_gbl_ctx
#define DHCP_R_INVALIDARG
omapi_typed_data_t * value
isc_result_t omapi_signal_in(omapi_object_t *, const char *,...)
void unregister_eventhandler(struct eventqueue **queue, void(*handler)(void *))
int log_error(const char *,...) __attribute__((__format__(__printf__
isc_result_t(* writer)(omapi_object_t *)
isc_result_t(* reader)(omapi_object_t *)
isc_socketmgr_t * socketmgr
int(* writefd)(omapi_object_t *)
void log_fatal(const char *,...) __attribute__((__format__(__printf__
isc_result_t omapi_io_get_value(omapi_object_t *h, omapi_object_t *id, omapi_data_string_t *name, omapi_value_t **value)
struct __omapi_io_object * next
isc_result_t omapi_dispatch(struct timeval *t)
isc_result_t omapi_get_value_str(omapi_object_t *, omapi_object_t *, const char *, omapi_value_t **)
isc_result_t omapi_object_dereference(omapi_object_t **, const char *, int)
void trigger_event(struct eventqueue **queue)
void dfree(void *, const char *, int)
isc_result_t omapi_unregister_io_object(omapi_object_t *h)
isc_result_t omapi_io_stuff_values(omapi_object_t *c, omapi_object_t *id, omapi_object_t *i)
isc_result_t omapi_wait_for_completion(omapi_object_t *object, struct timeval *t)
isc_result_t omapi_value_dereference(omapi_value_t **, const char *, int)
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 register_eventhandler(struct eventqueue **, void(*handler)(void *))
omapi_object_type_t * omapi_type_io_object
isc_result_t omapi_io_state_foreach(isc_result_t(*func)(omapi_object_t *, void *), void *p)
calls a given function on every object
isc_result_t omapi_io_destroy(omapi_object_t *h, const char *file, int line)
int omapi_iscsock_cb(isc_task_t *task, isc_socket_t *socket, void *cbarg, int flags)
struct eventqueue * rw_queue_empty
isc_result_t omapi_io_signal_handler(omapi_object_t *h, const char *name, va_list ap)
isc_result_t omapi_waiter_signal_handler(omapi_object_t *h, const char *name, va_list ap)
omapi_object_type_t * omapi_type_waiter
isc_result_t omapi_one_dispatch(omapi_object_t *wo, struct timeval *t)
OMAPI_OBJECT_ALLOC(omapi_io, omapi_io_object_t, omapi_type_io_object)
isc_result_t(* reaper)(omapi_object_t *)