X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7f28dbee65cef6e1990552c3eb3eb450ef9e98f2..41ba6938a478beadb9f1baf4f330d15e07132f68:/io.c diff --git a/io.c b/io.c index 38868751..c903fa6f 100644 --- a/io.c +++ b/io.c @@ -130,7 +130,7 @@ int read_int(int f) if (verbose > 1) fprintf(stderr,"Error reading %d bytes : %s\n", 4,ret==-1?strerror(errno):"EOF"); - exit(1); + exit_cleanup(1); } total_read += 4; return IVAL(b,0); @@ -143,7 +143,7 @@ void read_buf(int f,char *buf,int len) if (verbose > 1) fprintf(stderr,"Error reading %d bytes : %s\n", len,ret==-1?strerror(errno):"EOF"); - exit(1); + exit_cleanup(1); } total_read += len; } @@ -155,10 +155,48 @@ unsigned char read_byte(int f) return (unsigned char)c; } + +static char last_byte=0; +static int last_sparse = 0; + +int sparse_end(int f) +{ +#if SPARSE_FILES + if (last_sparse) { + lseek(f,-1,SEEK_CUR); + return (write(f,&last_byte,1) == 1 ? 0 : -1); + } +#endif + return 0; +} + +int write_sparse(int f,char *buf,int len) +{ + int l=0; + +#if SPARSE_FILES + for (l=0;l 0) + lseek(f,l,SEEK_CUR); + + last_byte = buf[len-1]; +#endif + + if (l == len) { + last_sparse = 1; + return len; + } + + last_sparse = 0; + + return (l + write(f,buf+l,len-l)); +} + int read_write(int fd_in,int fd_out,int size) { static char *buf=NULL; - static int bufsize = WRITE_BLOCK_SIZE; + static int bufsize = CHUNK_SIZE; int total=0; if (!buf) { @@ -169,7 +207,7 @@ int read_write(int fd_in,int fd_out,int size) while (total < size) { int n = MIN(size-total,bufsize); read_buf(fd_in,buf,n); - if (write(fd_out,buf,n) != n) + if (write_sparse(fd_out,buf,n) != n) return total; total += n; } @@ -220,7 +258,7 @@ void write_int(int f,int x) if ((ret=writefd(f,b,4)) != 4) { fprintf(stderr,"write_int failed : %s\n", ret==-1?strerror(errno):"EOF"); - exit(1); + exit_cleanup(1); } total_written += 4; } @@ -231,7 +269,7 @@ void write_buf(int f,char *buf,int len) if ((ret=writefd(f,buf,len)) != len) { fprintf(stderr,"write_buf failed : %s\n", ret==-1?strerror(errno):"EOF"); - exit(1); + exit_cleanup(1); } total_written += len; }