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=c4fa9e72e45081f5d320c6b5fb1242c933f39240;hb=6548c05b2f401d9d712acde8d0aff31388c0db70;hpb=3f7f507605d77ece782e847a5a1606197268f220 diff --git a/backup/writebuffer.c b/backup/writebuffer.c index c4fa9e7..013fa8a 100644 --- a/backup/writebuffer.c +++ b/backup/writebuffer.c @@ -1,4 +1,31 @@ -/**/ +/* + * writebuffer.c + * + * A program for writing output to devices which don't like constant + * stopping and starting, such as tape drives. writebuffer is: + * Copyright (C) 1997-1998,2000-2001 Ian Jackson + * + * writebuffer is part of chiark backup, a system for backing up GNU/Linux + * and other UN*X-compatible machines, as used on chiark.greenend.org.uk. + * chiark backup is: + * Copyright (C) 1997-1998,2000-2001 Ian Jackson + * Copyright (C) 1999 Peter Maydell + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this file; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ #include #include @@ -7,73 +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(void) { - static unsigned char buf[BUFFER]; - - unsigned char *wp, *rp; - int used,r,writing,seeneof; - fd_set readfds; - fd_set writefds; +int main(int argc, const char *const *argv) { + 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; } } }