- 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
- : (DEV64_T)read_int(f);
+ if (!(flags & SAME_TIME))
+ modtime = (time_t)read_int(f);
+ file->modtime = modtime;
+ if (!(flags & SAME_MODE))
+ mode = from_wire_mode(read_int(f));
+ file->mode = mode;
+
+ if (preserve_uid) {
+ if (!(flags & SAME_UID))
+ uid = (uid_t)read_int(f);
+ file->uid = uid;
+ }
+ if (preserve_gid) {
+ if (!(flags & SAME_GID))
+ gid = (gid_t)read_int(f);
+ file->gid = gid;
+ }
+ if (preserve_devices) {
+ if (protocol_version < 28) {
+ if (IS_DEVICE(mode)) {
+ if (!(flags & SAME_RDEV_pre28))
+ rdev = (DEV64_T)read_int(f);
+ file->u.rdev = rdev;
+ } else
+ rdev = 0;
+ } else if (IS_DEVICE(mode)) {
+ if (!(flags & SAME_HIGH_RDEV)) {
+ file->u.rdev = (DEV64_T)read_int(f);
+ rdev = file->u.rdev & ~0xFF;
+ } else
+ file->u.rdev = rdev | (DEV64_T)read_byte(f);
+ }