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;
259 status = isc_socket_fdwatchcreate(
dhcp_gbl_ctx.socketmgr,
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);
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,
696 (&omapi_io_states.next,
MDL);
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);