X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e4ed195bb7d21e935e6f3e5150a45f7f4770ee52..575933e9d0c02626cea924187034b001bd5210f0:/fileio.c diff --git a/fileio.c b/fileio.c index b5b59823..d8ac0974 100644 --- a/fileio.c +++ b/fileio.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998 Andrew Tridgell * Copyright (C) 2002 Martin Pool - * Copyright (C) 2004-2008 Wayne Davison + * Copyright (C) 2004-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,24 +28,32 @@ extern int sparse_files; -static char last_byte; static OFF_T sparse_seek = 0; -int sparse_end(int f) +int sparse_end(int f, OFF_T size) { int ret; if (!sparse_seek) return 0; - do_lseek(f, sparse_seek-1, SEEK_CUR); - sparse_seek = 0; +#ifdef HAVE_FTRUNCATE + ret = do_ftruncate(f, size); +#else + if (do_lseek(f, sparse_seek-1, SEEK_CUR) != size-1) + ret = -1; + else { + do { + ret = write(f, "", 1); + } while (ret < 0 && errno == EINTR); + + ret = ret <= 0 ? -1 : 0; + } +#endif - do { - ret = write(f, "", 1); - } while (ret < 0 && errno == EINTR); + sparse_seek = 0; - return ret <= 0 ? -1 : 0; + return ret; } @@ -57,10 +65,6 @@ static int write_sparse(int f, char *buf, int len) for (l1 = 0; l1 < len && buf[l1] == 0; l1++) {} for (l2 = 0; l2 < len-l1 && buf[len-(l2+1)] == 0; l2++) {} - /* XXX Riddle me this: why does this function SLOW DOWN when I - * remove the following (unneeded) line?? Core Duo weirdness? */ - last_byte = buf[len-1]; - sparse_seek += l1; if (l1 == len)