diff options
author | Wayne Davison <wayned@samba.org> | 2006-12-02 16:08:59 +0000 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2006-12-02 16:08:59 +0000 |
commit | d1c178dd53c716979ea603c83a83955684b3cb64 (patch) | |
tree | ab6c737bae6b93083f7fc5cf8398d869be1a9e53 /rsync.c | |
parent | d619ff1376cf0a55ff2fa0a6baa776f22cac5139 (diff) | |
download | rsync-d1c178dd53c716979ea603c83a83955684b3cb64.tar.gz rsync-d1c178dd53c716979ea603c83a83955684b3cb64.tar.bz2 rsync-d1c178dd53c716979ea603c83a83955684b3cb64.zip |
Moved read_item_attrs() from sender.c to rsync.c since the function
is used by both the sender and the receiver.
Diffstat (limited to 'rsync.c')
-rw-r--r-- | rsync.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -89,6 +89,57 @@ void setup_iconv() } #endif +/* This is used by sender.c with a valid f_out, and by receive.c with + * f_out = -1. */ +int read_item_attrs(int f_in, int f_out, int ndx, uchar *type_ptr, + char *buf, int *len_ptr) +{ + int len; + uchar fnamecmp_type = FNAMECMP_FNAME; + int iflags = protocol_version >= 29 ? read_shortint(f_in) + : ITEM_TRANSFER | ITEM_MISSING_DATA; + + /* Handle the new keep-alive (no-op) packet. */ + if (ndx == the_file_list->count && iflags == ITEM_IS_NEW) + ; + else if (ndx < 0 || ndx >= the_file_list->count) { + rprintf(FERROR, "Invalid file index: %d (count=%d) [%s]\n", + ndx, the_file_list->count, who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } else if (iflags == ITEM_IS_NEW) { + rprintf(FERROR, "Invalid itemized flag word: %x [%s]\n", + iflags, who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } + + if (iflags & ITEM_BASIS_TYPE_FOLLOWS) + fnamecmp_type = read_byte(f_in); + *type_ptr = fnamecmp_type; + + if (iflags & ITEM_XNAME_FOLLOWS) { + if ((len = read_vstring(f_in, buf, MAXPATHLEN)) < 0) + exit_cleanup(RERR_PROTOCOL); + } else { + *buf = '\0'; + len = -1; + } + *len_ptr = len; + + if (iflags & ITEM_TRANSFER) { + if (!S_ISREG(the_file_list->files[ndx]->mode)) { + rprintf(FERROR, + "received request to transfer non-regular file: %d [%s]\n", + ndx, who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } + } else if (f_out >= 0) { + write_ndx_and_attrs(f_out, ndx, iflags, + fnamecmp_type, buf, len); + } + + return iflags; +} + /* free a sums struct */ |