Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use a union for idlist's name/max_id value. Fixes bug 8137.
[rsync/rsync.git]
/
fileio.c
diff --git
a/fileio.c
b/fileio.c
index
38f9eb4
..
d8ac097
100644
(file)
--- a/
fileio.c
+++ b/
fileio.c
@@
-3,7
+3,7
@@
*
* Copyright (C) 1998 Andrew Tridgell
* Copyright (C) 2002 Martin Pool
*
* Copyright (C) 1998 Andrew Tridgell
* Copyright (C) 2002 Martin Pool
- * Copyright (C) 2004-200
8
Wayne Davison
+ * Copyright (C) 2004-200
9
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
*
* 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
@@
-20,7
+20,7
@@
*/
#include "rsync.h"
*/
#include "rsync.h"
-#include "i
func
s.h"
+#include "i
num
s.h"
#ifndef ENODATA
#define ENODATA EAGAIN
#ifndef ENODATA
#define ENODATA EAGAIN
@@
-28,39
+28,43
@@
extern int sparse_files;
extern int sparse_files;
-static char last_byte;
-static size_t sparse_seek = 0;
+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;
{
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;
}
}
-static int write_sparse(int f, char *buf,
size_
t len)
+static int write_sparse(int f, char *buf,
in
t len)
{
{
-
size_
t l1 = 0, l2 = 0;
+
in
t l1 = 0, l2 = 0;
int ret;
for (l1 = 0; l1 < len && buf[l1] == 0; l1++) {}
for (l2 = 0; l2 < len-l1 && buf[len-(l2+1)] == 0; l2++) {}
int ret;
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)
sparse_seek += l1;
if (l1 == len)
@@
-109,7
+113,7
@@
int flush_write_file(int f)
* write_file does not allow incomplete writes. It loops internally
* until len bytes are written or errno is set.
*/
* write_file does not allow incomplete writes. It loops internally
* until len bytes are written or errno is set.
*/
-int write_file(int f,
char *buf,size_
t len)
+int write_file(int f,
char *buf, in
t len)
{
int ret = 0;
{
int ret = 0;
@@
-126,7
+130,7
@@
int write_file(int f,char *buf,size_t len)
if (!wf_writeBuf)
out_of_memory("write_file");
}
if (!wf_writeBuf)
out_of_memory("write_file");
}
- r1 =
MIN(
len, wf_writeBufSize - wf_writeBufCnt);
+ r1 =
(int)MIN((size_t)
len, wf_writeBufSize - wf_writeBufCnt);
if (r1) {
memcpy(wf_writeBuf + wf_writeBufCnt, buf, r1);
wf_writeBufCnt += r1;
if (r1) {
memcpy(wf_writeBuf + wf_writeBufCnt, buf, r1);
wf_writeBufCnt += r1;