コード例 #1
0
ファイル: adns.c プロジェクト: BackupTheBerlios/phoenixfn-svn
/* 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();
}
コード例 #2
0
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;
}