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=bb1d26f71e358e0d4c369435bdd956fb97f4bdb3;hb=823a4f1c9ec99daf48228dff056d54db62c3a849;hpb=d906fbd72072c6953922e0627bbcf3d4c62ce7c0 diff --git a/backup/writebuffer.c b/backup/writebuffer.c index bb1d26f..013fa8a 100644 --- a/backup/writebuffer.c +++ b/backup/writebuffer.c @@ -34,78 +34,53 @@ #include #include -#define BUFFER 16*1024*1024 -#define WAITFILL ((BUFFER*3)/4) +#include "rwbuffer.h" -static inline int min(int a, int b) { return a<=b ? a : b; } +const char *progname= "readbuffer"; -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]; - - if (argv[1]) { - fputs("readbuffer: no arguments allowed\n", stderr); - exit(-1); - } + int r, writing; - unsigned char *wp, *rp; - int used,r,writing,seeneof; - fd_set readfds; - fd_set writefds; - - 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; } } }