- file->modtime =
- (flags & SAME_TIME) ? last_time : (time_t) read_int(f);
- file->mode =
- (flags & SAME_MODE) ? last_mode : from_wire_mode(read_int(f));
- if (preserve_uid)
- file->uid =
- (flags & SAME_UID) ? last_uid : (uid_t) read_int(f);
- if (preserve_gid)
- file->gid =
- (flags & SAME_GID) ? last_gid : (gid_t) read_int(f);
- if (preserve_devices && IS_DEVICE(file->mode))
- file->rdev =
- (flags & SAME_RDEV) ? last_rdev : (dev_t) read_int(f);
-
- if (preserve_links && S_ISLNK(file->mode)) {
+ if (!(flags & SAME_TIME))
+ last_time = (time_t)read_int(f);
+ file->modtime = last_time;
+ if (!(flags & SAME_MODE))
+ last_mode = from_wire_mode(read_int(f));
+ file->mode = last_mode;
+
+ if (preserve_uid) {
+ if (!(flags & SAME_UID))
+ last_uid = (uid_t)read_int(f);
+ file->uid = last_uid;
+ }
+ if (preserve_gid) {
+ if (!(flags & SAME_GID))
+ last_gid = (gid_t)read_int(f);
+ file->gid = last_gid;
+ }
+ if (preserve_devices) {
+ if (protocol_version < 28) {
+ if (IS_DEVICE(last_mode)) {
+ if (!(flags & OLD_SAME_RDEV))
+ last_rdev = (DEV64_T)read_int(f);
+ file->rdev = last_rdev;
+ } else
+ last_rdev = 0;
+ } else if (IS_DEVICE(last_mode)) {
+ if (!(flags & SAME_HIGH_RDEV))
+ last_rdev = (DEV64_T)read_int(f);
+ else {
+ last_rdev = (DEV64_T)((last_rdev & ~0xFF)
+ | read_byte(f));
+ }
+ file->rdev = last_rdev;
+ }
+ }
+
+ if (preserve_links && S_ISLNK(last_mode)) {