X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/728d09220143d6aa088cb080eb754af57aa62f3a..fb6e0ea120672aad1ecd2aebb8535d95be49ff8c:/flist.c diff --git a/flist.c b/flist.c index 8b80b16d..55107a71 100644 --- a/flist.c +++ b/flist.c @@ -37,6 +37,8 @@ extern int verbose; extern int do_progress; extern int am_server; extern int always_checksum; +extern int module_id; +extern int ignore_errors; extern int cvs_exclude; @@ -416,12 +418,12 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags) flags |= SAME_TIME; else modtime = file->modtime; - if (file->flags & HAS_INODE_DATA) { - if (file->dev == dev) { + if (file->link_u.idev) { + if (file->F_DEV == dev) { if (protocol_version >= 28) flags |= SAME_DEV; } else - dev = file->dev; + dev = file->F_DEV; flags |= HAS_INODE_DATA; } @@ -493,12 +495,12 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags) if (protocol_version < 26) { /* 32-bit dev_t and ino_t */ write_int(f, dev); - write_int(f, file->inode); + write_int(f, file->F_INODE); } else { /* 64-bit dev_t and ino_t */ if (!(flags & SAME_DEV)) write_longint(f, dev); - write_longint(f, file->inode); + write_longint(f, file->F_INODE); } } #endif @@ -649,19 +651,20 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, int f) sanitize_path(file->u.link, file->dirname); } #if SUPPORT_HARD_LINKS - if (preserve_hard_links && protocol_version < 28 - && S_ISREG(mode)) - file->flags |= HAS_INODE_DATA; - if (file->flags & HAS_INODE_DATA) { + if (preserve_hard_links && protocol_version < 28 && S_ISREG(mode)) + flags |= HAS_INODE_DATA; + if (flags & HAS_INODE_DATA) { + if (!(file->link_u.idev = new(struct idev))) + out_of_memory("file inode data"); if (protocol_version < 26) { dev = read_int(f); - file->inode = read_int(f); + file->F_INODE = read_int(f); } else { if (!(flags & SAME_DEV)) dev = read_longint(f); - file->inode = read_longint(f); + file->F_INODE = read_longint(f); } - file->dev = dev; + file->F_DEV = dev; } #endif @@ -745,7 +748,6 @@ struct file_struct *make_file(char *fname, struct string_area **ap, char *p; char cleaned_name[MAXPATHLEN]; char linkbuf[MAXPATHLEN]; - extern int module_id; strlcpy(cleaned_name, fname, MAXPATHLEN); cleaned_name[MAXPATHLEN - 1] = 0; @@ -825,11 +827,12 @@ struct file_struct *make_file(char *fname, struct string_area **ap, file->uid = st.st_uid; file->gid = st.st_gid; if (preserve_hard_links) { - if (protocol_version < 28? S_ISREG(st.st_mode) + if (protocol_version < 28 ? S_ISREG(st.st_mode) : !S_ISDIR(st.st_mode) && st.st_nlink > 1) { - file->dev = st.st_dev; - file->inode = st.st_ino; - file->flags |= HAS_INODE_DATA; + if (!(file->link_u.idev = new(struct idev))) + out_of_memory("file inode data"); + file->F_DEV = st.st_dev; + file->F_INODE = st.st_ino; } } #ifdef HAVE_STRUCT_STAT_ST_RDEV @@ -1123,26 +1126,23 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } } - if (f != -1) + if (f != -1) { send_file_entry(NULL, f, 0); - if (show_filelist_p() && f != -1) - finish_filelist_progress(flist); + if (show_filelist_p()) + finish_filelist_progress(flist); + } clean_flist(flist, 0, 0); - /* now send the uid/gid list. This was introduced in protocol - version 15 */ - if (f != -1) + if (f != -1) { + /* Now send the uid/gid list. This was introduced in + * protocol version 15 */ send_uid_list(f); - /* send the io_error flag */ - if (f != -1) { - extern int module_id; + /* send the io_error flag */ write_int(f, lp_ignore_errors(module_id) ? 0 : io_error); - } - if (f != -1) { io_end_buffering(); stats.flist_size = stats.total_written - start_write; stats.num_files = flist->count; @@ -1206,23 +1206,23 @@ struct file_list *recv_file_list(int f) if (verbose > 2) rprintf(FINFO, "received %d names\n", flist->count); - clean_flist(flist, relative_paths, 1); - if (show_filelist_p()) finish_filelist_progress(flist); - /* now recv the uid/gid list. This was introduced in protocol version 15 */ - if (f != -1) + clean_flist(flist, relative_paths, 1); + + if (f != -1) { + /* Now send the uid/gid list. This was introduced in + * protocol version 15 */ recv_uid_list(f, flist); - /* recv the io_error flag */ - if (f != -1 && !read_batch) { /* dw-added readbatch */ - extern int module_id; - extern int ignore_errors; - if (lp_ignore_errors(module_id) || ignore_errors) - read_int(f); - else - io_error |= read_int(f); + if (!read_batch) { + /* Recv the io_error flag */ + if (lp_ignore_errors(module_id) || ignore_errors) + read_int(f); + else + io_error |= read_int(f); + } } if (list_only) { @@ -1231,7 +1231,6 @@ struct file_list *recv_file_list(int f) list_file_entry(flist->files[i]); } - if (verbose > 2) rprintf(FINFO, "recv_file_list done\n"); @@ -1300,6 +1299,8 @@ void free_file(struct file_struct *file) free(file->basename); if (!IS_DEVICE(file->mode) && file->u.link) free(file->u.link); /* Handles u.sum too. */ + if (file->link_u.idev) + free((char*)file->link_u.idev); /* Handles link_u.links too. */ *file = null_file; }