X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=backup%2Fwritebuffer.c;h=013fa8a5909fa3586e63d49dee0908e709bf3dd2;hp=aaff8d7859d48a30899fa93d21a3cf3158591597;hb=6548c05b2f401d9d712acde8d0aff31388c0db70;hpb=460e29f1c9232dafbdc161bf67d3e956d23eeb6b diff --git a/backup/writebuffer.c b/backup/writebuffer.c index aaff8d7..013fa8a 100644 --- a/backup/writebuffer.c +++ b/backup/writebuffer.c @@ -34,82 +34,53 @@ #include #include -#ifndef RWBUFFER_SIZE_MB -#define RWBUFFER_SIZE_MB 16 -#endif +#include "rwbuffer.h" -#define BUFFER (RWBUFFER_SIZE_MB*1024*1024) -#define WAITFILL ((BUFFER*3)/4) +const char *progname= "readbuffer"; -static inline int min(int a, int b) { return a<=b ? a : b; } - -static void nonblock(int fd) { - int r; - r= fcntl(fd,F_GETFL,0); if (r == -1) { perror("fcntl getfl"); exit(1); } - r |= O_NDELAY; - if (fcntl(fd,F_SETFL,r) == -1) { perror("fcntl setfl"); exit(1); } -} +static size_t waitfill; int main(int argc, const char *const *argv) { - static unsigned char buf[BUFFER]; - - unsigned char *wp, *rp; - int used,r,writing,seeneof; - fd_set readfds; - fd_set writefds; - - if (argv[1]) { - fputs("readbuffer: no arguments allowed\n", stderr); - exit(-1); - } + int r, writing; - used=0; wp=rp=buf; writing=0; seeneof=0; - nonblock(0); nonblock(1); + startup(argv); + waitfill= (buffersize*3)/4; + writing=0; + while (!seeneof || used) { - FD_ZERO(&readfds); if (!seeneof && used+1 WAITFILL) writing=1; + if (used > waitfill) writing=1; } + if (FD_ISSET(1,&writefds) && used) { - r= write(1,wp,min(used,buf+BUFFER-wp)); + r= write(1,wp,min(used,buf+buffersize-wp)); if (r<=0) { if (!(errno == EAGAIN || errno == EINTR)) { perror("write"); exit(1); } -/*fprintf(stderr,"\t write transient error\n");*/ } else { -/*fprintf(stderr,"\t wrote %d\n",r);*/ used-= r; wp+= r; - if (wp == buf+BUFFER) wp=buf; + if (wp == buf+buffersize) wp=buf; } } }