- for (;;) {
- int max_fileno = -1, check_write = 0;
- ssize_t len;
- fd_set rfd, wfd;
- FD_ZERO(&rfd);
- FD_ZERO(&wfd);
- if (loaded && loaded > 10000)
- fprintf(stderr, "loaded: %d\n", loaded);
- if (loaded < conf.bufsize_arg) {
- FD_SET(fd, &rfd);
- max_fileno = MAX(max_fileno, fd);
- }
- if (loaded > 0) {
- FD_SET(STDOUT_FILENO, &wfd);
- max_fileno = MAX(max_fileno, STDOUT_FILENO);
- check_write = 1;
- }
- ret = -E_OVERRUN;
- if (max_fileno < 0)
- goto out;
- ret = select(max_fileno + 1, &rfd, &wfd, NULL, NULL);
- if (ret < 0) {
- ret = -E_SELECT;
- goto out;
- }
- if (loaded < conf.bufsize_arg && FD_ISSET(fd, &rfd)) {
- len = recv_bin_buffer(fd, buf + loaded,
- conf.bufsize_arg - loaded);
- if (len <= 0) {
- ret = len < 0? -E_READ : 0;
- goto out;
- }
- loaded += len;
- }
- if (check_write && FD_ISSET(STDOUT_FILENO, &wfd)) {
- ret = write(STDOUT_FILENO, buf, loaded);
- if (ret < 0) {
- ret = -E_WRITE;
- goto out;
- }
- loaded -= ret;
- }