summaryrefslogtreecommitdiff
path: root/rsync.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2006-12-02 16:08:59 +0000
committerWayne Davison <wayned@samba.org>2006-12-02 16:08:59 +0000
commitd1c178dd53c716979ea603c83a83955684b3cb64 (patch)
treeab6c737bae6b93083f7fc5cf8398d869be1a9e53 /rsync.c
parentd619ff1376cf0a55ff2fa0a6baa776f22cac5139 (diff)
downloadrsync-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.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/rsync.c b/rsync.c
index 25b06295..178d9ddd 100644
--- a/rsync.c
+++ b/rsync.c
@@ -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
*/