r = select(maxfd+1, &readfds, &writefds, &exceptfds, NULL);
if (r < 0 || FD_ISSET(pushfd, &exceptfds)) {
+ close(pushfd);
+ close(pullfd);
pushfd = pullfd = -1;
return;
}
if (pullfd >= 0 && FD_ISSET(pullfd, &exceptfds)) {
+ close(pullfd);
pullfd = -1;
}
r = ring_buffer_pull(&ring, pullfd);
if (r == 0) {
/* eof */
+ close(pullfd);
pullfd = -1;
} else if (r < 0) {
case EPIPE:
/* TODO catch SIGPIPE? */
+ close(pushfd);
+ close(pullfd);
pushfd = pullfd = -1;
return;
}
}
+ close(pushfd);
+ close(pullfd);
return;
error:
+ close(pushfd);
+ close(pullfd);
perror("(coupling) pump");
}