const char *progname= "writebuffer";
-static size_t waitfill;
-
int main(int argc, const char *const *argv) {
int r, writing;
startup(argv);
- waitfill= (buffersize*3)/4;
- writing=0;
-
- while (!seeneof || used) {
-
- FD_ZERO(&readfds); if (!seeneof && used+1<buffersize) FD_SET(0,&readfds);
- FD_ZERO(&writefds); if (writing) FD_SET(1,&writefds);
-
- callselect();
-
- if (FD_ISSET(1,&writefds) && !FD_ISSET(0,&readfds) && !used) {
- writing= 0;
- FD_CLR(1,&writefds);
- }
-
- if (FD_ISSET(0,&readfds)) {
- r= read(0,rp,min(buffersize-1-used,buf+buffersize-rp));
- if (!r) {
- seeneof=1; writing=1;
- } else if (r<0) {
- if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); }
- } else {
- used+= r;
- rp+= r;
- if (rp == buf+buffersize) rp=buf;
- }
- if (used > waitfill) writing=1;
- }
-
- if (FD_ISSET(1,&writefds) && used) {
- r= write(1,wp,min(used,buf+buffersize-wp));
- if (r<=0) {
- if (!(errno == EAGAIN || errno == EINTR)) { perror("write"); exit(1); }
- } else {
- used-= r;
- wp+= r;
- if (wp == buf+buffersize) wp=buf;
- }
- }
- }
+ writebuf_startup();
+ writebuf_mainloop();
exit(0);
}