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 status = omapi_waiter_allocate (&waiter,
MDL);
435 for (inner =
object; inner -> inner; inner = inner -> inner)
440 omapi_waiter_dereference (&waiter,
MDL);
448 omapi_waiter_dereference (&waiter,
MDL);
458 }
while (!waiter || !waiter -> ready);
460 if (waiter -> outer) {
461 if (waiter -> outer -> inner) {
466 (&waiter -> outer -> inner,
467 waiter -> inner,
MDL);
474 status = waiter -> waitstatus;
475 omapi_waiter_dereference (&waiter,
MDL);
482 fd_set r, w, x, rr, ww, xx;
486 struct timeval now, to;
500 gettimeofday (&now, (
struct timezone *)0);
501 cur_tv.tv_sec = now.tv_sec;
502 cur_tv.tv_usec = now.tv_usec;
503 if (now.tv_sec > t -> tv_sec ||
504 (now.tv_sec == t -> tv_sec && now.tv_usec >= t -> tv_usec))
505 return ISC_R_TIMEDOUT;
509 to.tv_sec = t -> tv_sec - now.tv_sec;
510 to.tv_usec = t -> tv_usec - now.tv_usec;
511 if (to.tv_usec < 0) {
512 to.tv_usec += 1000000;
520 if (to.tv_sec > (60 * 60 * 24))
521 to.tv_sec = 60 * 60 * 24;
526 if (waiter && waiter -> ready)
531 if (!(io = omapi_io_states.
next))
538 for (; io; io = io -> next) {
542 if (io -> readfd && io -> inner &&
543 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
550 if (io -> writefd && io -> inner &&
551 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
566 count = select(max + 1, &r, &w, &x, &now);
574 count = select(max + 1, &r, &w, &x, t ? &to : NULL);
578 gettimeofday (&
cur_tv, (
struct timezone *)0);
587 if (omapi_io_states.
next)
588 omapi_io_reference (&io, omapi_io_states.
next,
MDL);
594 t0.tv_sec = t0.tv_usec = 0;
596 if (io -> readfd && io -> inner &&
597 (desc = (*(io -> readfd)) (io -> inner)) >= 0) {
599 count = select (desc + 1, &r, &w, &x, &t0);
607 for (; obj; obj = obj -> inner) {
615 if (ov && ov ->
value &&
616 (ov ->
value -> type ==
619 ov ->
value -> u.buffer.value;
620 len = ov ->
value -> u.buffer.len;
633 (*(io -> reaper)) (io -> inner);
635 omapi_io_dereference (&prev -> next,
MDL);
637 omapi_io_reference (&prev -> next,
644 (&omapi_io_states.
next,
647 omapi_io_dereference (&io,
MDL);
654 t0.tv_sec = t0.tv_usec = 0;
657 if (io -> writefd && io -> inner &&
658 (desc = (*(io -> writefd)) (io -> inner)) >= 0) {
660 count = select (desc + 1, &r, &w, &x, &t0);
665 omapi_io_dereference (&prev,
MDL);
666 omapi_io_reference (&prev, io,
MDL);
667 omapi_io_dereference (&io,
MDL);
669 omapi_io_reference (&io, prev -> next,
MDL);
672 omapi_io_dereference (&prev,
MDL);
676 for (io = omapi_io_states.
next; io; io = io -> next) {
683 (desc = (*(io -> readfd)) (tmp)) >= 0) {
684 if (FD_ISSET (desc, &r))
685 ((*(io -> reader)) (tmp));
690 (desc = (*(io -> writefd)) (tmp)) >= 0)
692 if (FD_ISSET (desc, &w))
693 ((*(io -> writer)) (tmp));
702 if (omapi_io_states.
next != NULL) {
703 omapi_io_reference(&io, omapi_io_states.
next,
MDL);
706 if ((io->inner == NULL) ||
707 ((io->reaper != NULL) &&
714 if (io->next != NULL) {
715 omapi_io_reference(&tmp, io->
next,
MDL);
716 omapi_io_dereference(&io->next,
MDL);
719 omapi_io_dereference(&prev->next,
MDL);
721 omapi_io_reference(&prev->next,
724 omapi_io_dereference(&omapi_io_states.
next,
728 (&omapi_io_states.
next,
737 omapi_io_dereference(&tmp,
MDL);
742 omapi_io_dereference(&prev,
MDL);
744 omapi_io_reference(&prev, io,
MDL);
753 if (io->next != NULL) {
754 omapi_io_reference(&next, io->next,
MDL);
756 omapi_io_dereference(&io,
MDL);
758 omapi_io_reference(&io, next,
MDL);
759 omapi_io_dereference(&next,
MDL);
763 omapi_io_dereference(&prev,
MDL);
777 if (h -> inner && h -> inner -> type -> set_value)
778 return (*(h -> inner -> type -> set_value))
779 (h -> inner, id, name,
value);
780 return ISC_R_NOTFOUND;
791 if (h -> inner && h -> inner -> type -> get_value)
792 return (*(h -> inner -> type -> get_value))
793 (h -> inner, id, name,
value);
794 return ISC_R_NOTFOUND;
813 for (p = omapi_io_states.
next; p; p = p -> next) {
815 omapi_io_reference (&obj, p,
MDL);
818 holder = &last -> next;
820 holder = &omapi_io_states.
next;
822 omapi_io_dereference (holder,
MDL);
825 omapi_io_reference (holder, obj -> next,
MDL);
826 omapi_io_dereference (&obj -> next,
MDL);
829 return omapi_io_dereference (&obj,
MDL);
834 return ISC_R_NOTFOUND;
838 const char *name, va_list ap)
843 if (h -> inner && h -> inner -> type -> signal_handler)
844 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
846 return ISC_R_NOTFOUND;
856 if (i -> inner && i -> inner -> type -> stuff_values)
857 return (*(i -> inner -> type -> stuff_values)) (c, id,
863 const char *name, va_list ap)
870 if (!strcmp (name,
"ready")) {
877 if (!strcmp(name,
"status")) {
880 waiter->
waitstatus = va_arg(ap, isc_result_t);
884 if (!strcmp (name,
"disconnect")) {
891 if (h -> inner && h -> inner -> type -> signal_handler)
892 return (*(h -> inner -> type -> signal_handler)) (h -> inner,
894 return ISC_R_NOTFOUND;
919 if (omapi_io_states.
next) {
932 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
OMAPI_OBJECT_ALLOC(omapi_io, omapi_io_object_t, omapi_type_io_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
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)
void * dmalloc(size_t, const char *, int)
isc_result_t omapi_signal_in(omapi_object_t *, const char *,...)
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__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
#define DHCP_R_INVALIDARG
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