extern int io_error;
extern int dry_run;
extern int am_server;
+extern int am_daemon;
+extern int protocol_version;
/**
* and transmits them to the receiver. The sender process runs on the
* machine holding the source files.
**/
-
-
void read_sum_head(int f, struct sum_struct *sum)
{
- extern int protocol_version;
-
sum->count = read_int(f);
sum->blength = read_int(f);
if (protocol_version < 27) {
{
int fd = -1;
struct sum_struct *s;
- struct map_struct *buf = NULL;
+ struct map_struct *mbuf = NULL;
STRUCT_STAT st;
char fname[MAXPATHLEN];
int i;
rprintf(FINFO, "send_files starting\n");
while (1) {
- int offset = 0;
+ unsigned int offset;
i = read_int(f_in);
if (i == -1) {
file = flist->files[i];
+ stats.current_file_index = i;
stats.num_transferred_files++;
stats.total_transferred_size += file->length;
- fname[0] = 0;
if (file->basedir) {
- strlcpy(fname, file->basedir, MAXPATHLEN);
- if (strlen(fname) == MAXPATHLEN-1) {
- io_error |= IOERR_GENERAL;
- rprintf(FERROR, "send_files failed on long-named directory %s\n",
- full_fname(fname));
- return;
- }
- strlcat(fname, "/", MAXPATHLEN);
- offset = strlen(file->basedir)+1;
- }
- f_name_to(file, fname + offset, MAXPATHLEN - offset);
+ /* N.B. We're sure that this fits, so offset is OK. */
+ offset = strlcpy(fname, file->basedir, sizeof fname);
+ if (!offset || fname[offset-1] != '/')
+ fname[offset++] = '/';
+ } else
+ offset = 0;
+ f_name_to(file, fname + offset);
if (verbose > 2)
rprintf(FINFO, "send_files(%d, %s)\n", i, fname);
if (dry_run) {
- if (!am_server && verbose) { /* log transfer */
+ if (!am_server && verbose) {
rprintf(FINFO, "%s\n", fname+offset);
}
write_int(f_out, i);
}
if (write_batch)
- write_batch_csum_info(&i, flist->count, s);
+ write_batch_csum_info(&i, s);
if (!read_batch) {
fd = do_open(fname, O_RDONLY, 0);
if (fd == -1) {
if (errno == ENOENT) {
+ enum logcode c = am_daemon
+ && protocol_version < 28 ? FERROR
+ : FINFO;
io_error |= IOERR_VANISHED;
- rprintf(FINFO, "file has vanished: %s\n",
+ rprintf(c, "file has vanished: %s\n",
full_fname(fname));
} else {
io_error |= IOERR_GENERAL;
- rprintf(FERROR, "send_files failed to open %s: %s\n",
- full_fname(fname), strerror(errno));
+ rsyserr(FERROR, errno,
+ "send_files failed to open %s",
+ full_fname(fname));
}
free_sums(s);
continue;
/* map the local file */
if (do_fstat(fd, &st) != 0) {
io_error |= IOERR_GENERAL;
- rprintf(FERROR, "fstat failed: %s\n", strerror(errno));
+ rsyserr(FERROR, errno, "fstat failed");
free_sums(s);
close(fd);
return;
}
- if (st.st_size > 0) {
- buf = map_file(fd, st.st_size);
- } else {
- buf = NULL;
- }
+ mbuf = st.st_size ? map_file(fd, st.st_size) : NULL;
- if (verbose > 2)
+ if (verbose > 2) {
rprintf(FINFO, "send_files mapped %s of size %.0f\n",
fname, (double)st.st_size);
+ }
write_int(f_out, i);
if (write_batch)
- write_batch_delta_file((char *)&i, sizeof(i));
+ write_batch_delta_file((char *)&i, sizeof i);
write_sum_head(f_out, s);
}
if (verbose > 2 && !read_batch)
rprintf(FINFO, "calling match_sums %s\n", fname);
- if (!am_server && verbose) { /* log transfer */
+ if (!am_server && verbose) {
rprintf(FINFO, "%s\n", fname+offset);
}
write_buf(f_out, buff, buff_len);
}
}
- } /* end while */
- read_batch_delta_file( buff, MD4_SUM_LENGTH);
+ }
+ read_batch_delta_file(buff, MD4_SUM_LENGTH);
write_buf(f_out, buff, MD4_SUM_LENGTH);
- } /* j=i */
+ }
} else { /* not checksum match */
rprintf (FINFO, "readbatch & checksums don't match\n");
rprintf (FINFO, "filename=%s is being skipped\n", fname);
continue;
}
- } else {
- match_sums(f_out, s, buf, st.st_size);
+ } else { /* not read_batch */
+ match_sums(f_out, s, mbuf, st.st_size);
log_send(file, &initial_stats);
}
if (!read_batch) {
- if (buf) {
- j = unmap_file(buf);
+ if (mbuf) {
+ j = unmap_file(mbuf);
if (j) {
io_error |= IOERR_GENERAL;
- rprintf(FERROR,
- "read errors mapping %s: (%d) %s\n",
- full_fname(fname), j, strerror(j));
+ rsyserr(FERROR, j,
+ "read errors mapping %s",
+ full_fname(fname));
}
}
close(fd);