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);
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,
641 (&omapi_io_states.next,
MDL);
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);