/** * Set up the array of fd descriptors for the poll(2) call. * */ PUBLIC void r_io_prepare_poll_fds(struct ccnr_handle *h) { int i, j, nfds; for (i = 1, nfds = 0; i < h->face_limit; i++) if (r_io_fdholder_from_fd(h, i) != NULL) nfds++; if (nfds != h->nfds) { h->nfds = nfds; h->fds = realloc(h->fds, h->nfds * sizeof(h->fds[0])); memset(h->fds, 0, h->nfds * sizeof(h->fds[0])); } for (i = 1, j = 0; i < h->face_limit; i++) { struct fdholder *fdholder = r_io_fdholder_from_fd(h, i); if (fdholder != NULL) { h->fds[j].fd = fdholder->filedesc; h->fds[j].events = 0; if ((fdholder->flags & (CCNR_FACE_NORECV|CCNR_FACE_REPODATA)) == 0) h->fds[j].events |= POLLIN; if (fdholder->filedesc == h->active_in_fd) h->fds[j].events |= POLLIN; if (((fdholder->flags & CCNR_FACE_REPODATA) == 0) && ((fdholder->outbuf != NULL || (fdholder->flags & CCNR_FACE_CLOSING) != 0))) h->fds[j].events |= POLLOUT; if ((fdholder->flags & CCNR_FACE_CCND) != 0) { if (ccn_output_is_pending(h->direct_client)) { if (CCNSHOULDLOG(h, xxx, CCNL_FINEST)) ccnr_msg(h, "including direct client in poll set"); h->fds[j].events |= POLLOUT; } } j++; } } }
void CcnH_pollPrepare(struct ccn* ccnh, struct pollfd* fd) { fd->events = POLLIN; if (ccn_output_is_pending(ccnh)) fd->events |= POLLOUT; }