+/** @brief Log a report of file descriptor state */
+void ev_report(ev_source *ev) {
+ int n, fd;
+ ev_fdmode mode;
+ struct dynstr d[1];
+ char b[4096];
+
+ dynstr_init(d);
+ for(mode = 0; mode < ev_nmodes; ++mode) {
+ info("mode %s maxfd %d", modenames[mode], ev->mode[mode].maxfd);
+ for(n = 0; n < ev->mode[mode].nfds; ++n) {
+ fd = ev->mode[mode].fds[n].fd;
+ info("fd %s %d%s%s (%s)", modenames[mode], fd,
+ FD_ISSET(fd, &ev->mode[mode].enabled) ? " enabled" : "",
+ FD_ISSET(fd, &ev->mode[mode].tripped) ? " tripped" : "",
+ ev->mode[mode].fds[n].what);
+ }
+ d->nvec = 0;
+ for(fd = 0; fd <= ev->mode[mode].maxfd; ++fd) {
+ if(!FD_ISSET(fd, &ev->mode[mode].enabled))
+ continue;
+ for(n = 0; n < ev->mode[mode].nfds; ++n) {
+ if(ev->mode[mode].fds[n].fd == fd)
+ break;
+ }
+ if(n < ev->mode[mode].nfds)
+ snprintf(b, sizeof b, "%d(%s)", fd, ev->mode[mode].fds[n].what);
+ else
+ snprintf(b, sizeof b, "%d", fd);
+ dynstr_append(d, ' ');
+ dynstr_append_string(d, b);
+ }
+ dynstr_terminate(d);
+ info("%s enabled:%s", modenames[mode], d->vec);
+ }
+}
+