/* void dns_readable(int fd, void *ptr) * Input: An fd which has become readable, ptr not used. * Output: None. * Side effects: Read DNS responses from DNS servers. * Note: Called by the fd system. */ void dns_readable(int fd, void *ptr) { adns_processreadable(dns_state, fd, &SystemTime); dns_do_callbacks(); dns_select(); }
int engine_read_message (time_t delay) { fd_set read_set, write_set; struct timeval wt; int nfds, length, i; unsigned int fdflags; int fdtype; void *fdvalue; aClient *client_p; engine_get_fdsets (&read_set, &write_set); wt.tv_sec = delay; wt.tv_usec = 0; nfds = select (MAXCONNECTIONS, &read_set, &write_set, NULL, &wt); if (nfds == -1) { if (((errno == EINTR) || (errno == EAGAIN))) return -1; report_error ("select %s:%s", &me); sleep (5); return -1; } else if (nfds == 0) return 0; if (delay) NOW = timeofday = time (NULL); for (i = 0; i < MAXCONNECTIONS; i++) { get_fd_info (i, &fdtype, &fdflags, &fdvalue); client_p = NULL; length = -1; if (nfds) { int rr = FD_ISSET (i, &read_set); int rw = FD_ISSET (i, &write_set); if (rr || rw) nfds--; else continue; fdfprintf (stderr, "fd %d: %s%s\n", i, rr ? "read " : "", rw ? "write" : ""); switch (fdtype) { case FDT_NONE: break; case FDT_AUTH: client_p = (aClient *) fdvalue; if (rr) read_authports (client_p); if (rw && client_p->authfd >= 0) send_authports (client_p); check_client_fd (client_p); break; case FDT_LISTENER: client_p = (aClient *) fdvalue; if (rr) accept_connection (client_p); break; case FDT_RESOLVER: #ifdef USE_ADNS dns_do_callbacks (); #else do_dns_async (); #endif break; case FDT_CLIENT: client_p = (aClient *) fdvalue; readwrite_client (client_p, rr, rw); break; default: abort (); /* unknown client type? bail! */ } } else break; /* no more fds? break out of the loop */ } /* end of for() loop for testing selected sockets */ return 0; }