int io_error;
static struct file_struct null_file;
+static char empty_sum[MD4_SUM_LENGTH];
static void clean_flist(struct file_list *flist, int strip_root, int no_dups);
unsigned short flags;
static time_t modtime;
static mode_t mode;
- static DEV64_T rdev; /* just high bytes after p28 */
+ static DEV64_T rdev; /* just high bytes in p28 onward */
static uid_t uid;
static gid_t gid;
static DEV64_T dev;
}
#endif
- if (always_checksum) {
- if (protocol_version < 21)
- write_buf(f, file->sum, 2);
- else
- write_buf(f, file->sum, MD4_SUM_LENGTH);
+ if (always_checksum && (protocol_version < 28 || S_ISREG(mode))) {
+ char *sum = file->sum? file->sum : empty_sum;
+ write_buf(f, sum, protocol_version < 21? 2
+ : MD4_SUM_LENGTH);
}
strlcpy(lastname, fname, MAXPATHLEN);
{
static time_t modtime;
static mode_t mode;
- static DEV64_T rdev; /* just high bytes after p28 */
+ static DEV64_T rdev; /* just high bytes in p28 onward */
static uid_t uid;
static gid_t gid;
static DEV64_T dev;
#endif
if (always_checksum) {
- file->sum = new_array(char, MD4_SUM_LENGTH);
- if (!file->sum)
- out_of_memory("md4 sum");
- if (protocol_version < 21)
- read_buf(f, file->sum, 2);
- else
- read_buf(f, file->sum, MD4_SUM_LENGTH);
+ char tmpsum[MD4_SUM_LENGTH], *sum;
+ if (S_ISREG(mode)) {
+ sum = file->sum = new_array(char, MD4_SUM_LENGTH);
+ if (!sum)
+ out_of_memory("md4 sum");
+ } else if (protocol_version < 28) {
+ /* Prior to 28, we get a useless set of nulls. */
+ sum = tmpsum;
+ } else
+ sum = NULL;
+ if (sum) {
+ read_buf(f, sum, protocol_version < 21? 2
+ : MD4_SUM_LENGTH);
+ }
}
if (!preserve_perms) {
extern int orig_umask;
/* set an appropriate set of permissions based on original
- permissions and umask. This emulates what GNU cp does */
+ * permissions and umask. This emulates what GNU cp does */
file->mode &= ~orig_umask;
}
}
file->link = STRDUP(ap, linkbuf);
#endif
- if (always_checksum) {
- file->sum = (char *) MALLOC(ap, MD4_SUM_LENGTH);
+ if (always_checksum && S_ISREG(st.st_mode)) {
+ file->sum = (char*)MALLOC(ap, MD4_SUM_LENGTH);
if (!file->sum)
out_of_memory("md4 sum");
- /* drat. we have to provide a null checksum for non-regular
- files in order to be compatible with earlier versions
- of rsync */
- if (S_ISREG(st.st_mode)) {
- file_checksum(fname, file->sum, st.st_size);
- } else {
- memset(file->sum, 0, MD4_SUM_LENGTH);
- }
+ file_checksum(fname, file->sum, st.st_size);
}
if (flist_dir) {