X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/da9d12f5d93724cb07a4107aa7aff92be9fb2ddb..c7b1a56b3d70fb91b20702f169ae1af9b68de8e9:/sender.c diff --git a/sender.c b/sender.c index b7ebbe1f..3c14ddf5 100644 --- a/sender.c +++ b/sender.c @@ -25,6 +25,8 @@ extern struct stats stats; extern int io_error; extern int dry_run; extern int am_server; +extern int am_daemon; +extern int protocol_version; /** @@ -34,12 +36,8 @@ extern int am_server; * 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) { @@ -112,7 +110,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) { 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; @@ -132,7 +130,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) rprintf(FINFO, "send_files starting\n"); while (1) { - int offset = 0; + unsigned int offset; i = read_int(f_in); if (i == -1) { @@ -155,28 +153,24 @@ void send_files(struct file_list *flist, int f_out, int f_in) 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); @@ -193,19 +187,23 @@ void send_files(struct file_list *flist, int f_out, int f_in) } 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; @@ -214,26 +212,23 @@ void send_files(struct file_list *flist, int f_out, int f_in) /* 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); } @@ -241,7 +236,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) 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); } @@ -273,29 +268,29 @@ void send_files(struct file_list *flist, int f_out, int f_in) 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);