X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=cprogs%2Fwrbufcore.c;h=417cb01ac0cef44f7cc03c80f04f0120152fc857;hp=260f6d2c75f37a5e9031ba34d31c8f0f5e8db891;hb=e483a046db5ff0972702a0dc29ba4e00b698d997;hpb=737b84851cd8b3dd1d9f1920201127eac693dffb diff --git a/cprogs/wrbufcore.c b/cprogs/wrbufcore.c index 260f6d2..417cb01 100644 --- a/cprogs/wrbufcore.c +++ b/cprogs/wrbufcore.c @@ -27,6 +27,8 @@ * */ +#include "rwbuffer.h" + static size_t waitfill; static int writing; @@ -35,44 +37,46 @@ void wrbufcore_startup(void) { writing=0; } -void wrbufcore_mainloop(void) { - int r; +void wrbufcore_prepselect(int rdfd, int wrfd) { + FD_ZERO(&readfds); + if (rdfd>=0 && !seeneof && used+1=0 && FD_ISSET(rdfd,&readfds)) && + !used) { + writing= 0; + FD_CLR(wrfd,&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 (rdfd>=0 && FD_ISSET(rdfd,&readfds)) { + r= read(rdfd,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; - } + if (FD_ISSET(wrfd,&writefds) && used) { + r= write(wrfd,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; } } }