- fname = f_name(file);
-
- flags = FILE_VALID;
-
- if (file->mode == last_mode) flags |= SAME_MODE;
- if (file->rdev == last_rdev) flags |= SAME_RDEV;
- if (file->uid == last_uid) flags |= SAME_UID;
- if (file->gid == last_gid) flags |= SAME_GID;
- if (file->modtime == last_time) flags |= SAME_TIME;
-
- for (l1=0;lastname[l1] && fname[l1] == lastname[l1];l1++) ;
- l2 = strlen(fname) - l1;
-
- if (l1 > 0) flags |= SAME_NAME;
- if (l2 > 255) flags |= LONG_NAME;
-
- write_byte(f,flags);
- if (flags & SAME_NAME)
- write_byte(f,l1);
- if (flags & LONG_NAME)
- write_int(f,l2);
- else
- write_byte(f,l2);
- write_buf(f,fname+l1,l2);
-
- write_longint(f,file->length);
- if (!(flags & SAME_TIME))
- write_int(f,(int)file->modtime);
- if (!(flags & SAME_MODE))
- write_int(f,(int)file->mode);
- if (preserve_uid && !(flags & SAME_UID)) {
- add_uid(file->uid);
- write_int(f,(int)file->uid);
- }
- if (preserve_gid && !(flags & SAME_GID)) {
- add_gid(file->gid);
- write_int(f,(int)file->gid);
- }
- if (preserve_devices && IS_DEVICE(file->mode) && !(flags & SAME_RDEV))
- write_int(f,(int)file->rdev);
+ fname = f_name(file);
+
+ flags = base_flags;
+
+ if (file->mode == last_mode) flags |= SAME_MODE;
+ if (file->rdev == last_rdev) flags |= SAME_RDEV;
+ if (file->uid == last_uid) flags |= SAME_UID;
+ if (file->gid == last_gid) flags |= SAME_GID;
+ if (file->modtime == last_time) flags |= SAME_TIME;
+
+ for (l1=0;lastname[l1] && (fname[l1] == lastname[l1]) && (l1 < 255);l1++) ;
+ l2 = strlen(fname) - l1;
+
+ if (l1 > 0) flags |= SAME_NAME;
+ if (l2 > 255) flags |= LONG_NAME;
+
+ /* we must make sure we don't send a zero flags byte or the other
+ end will terminate the flist transfer */
+ if (flags == 0 && !S_ISDIR(file->mode)) flags |= FLAG_DELETE;
+ if (flags == 0) flags |= LONG_NAME;
+
+ write_byte(f,flags);
+ if (flags & SAME_NAME)
+ write_byte(f,l1);
+ if (flags & LONG_NAME)
+ write_int(f,l2);
+ else
+ write_byte(f,l2);
+ write_buf(f,fname+l1,l2);
+
+ write_longint(f,file->length);
+ if (!(flags & SAME_TIME))
+ write_int(f,(int)file->modtime);
+ if (!(flags & SAME_MODE))
+ write_int(f,(int)file->mode);
+ if (preserve_uid && !(flags & SAME_UID)) {
+ add_uid(file->uid);
+ write_int(f,(int)file->uid);
+ }
+ if (preserve_gid && !(flags & SAME_GID)) {
+ add_gid(file->gid);
+ write_int(f,(int)file->gid);
+ }
+ if (preserve_devices && IS_DEVICE(file->mode) && !(flags & SAME_RDEV))
+ write_int(f,(int)file->rdev);