get_fat(&curEntry, fs->fat, i, fs);
if (!get_owner(fs, i) && curEntry.value &&
- !FAT_IS_BAD(fs, curEntry.value)) {
+ !FAT_IS_BAD(fs, curEntry.value) && rw) {
set_fat(fs, i, 0);
reclaimed++;
}
}
while (changed);
- /* Now we can start recovery */
- files = reclaimed = 0;
- for (i = 2; i < total_num_clusters; i++)
- /* If this cluster is the head of an orphan chain... */
- if (get_owner(fs, i) == &orphan && !num_refs[i]) {
- DIR_ENT de;
- off_t offset;
- files++;
- offset = alloc_rootdir_entry(fs, &de, "FSCK%04dREC");
- de.start = htole16(i & 0xffff);
- if (fs->fat_bits == 32)
- de.starthi = htole16(i >> 16);
- for (walk = i; walk > 0 && walk != -1;
- walk = next_cluster(fs, walk)) {
- de.size = htole32(le32toh(de.size) + fs->cluster_size);
- reclaimed++;
+ if (rw) {
+ /* Now we can start recovery */
+ files = reclaimed = 0;
+ for (i = 2; i < total_num_clusters; i++)
+ /* If this cluster is the head of an orphan chain... */
+ if (get_owner(fs, i) == &orphan && !num_refs[i]) {
+ DIR_ENT de;
+ off_t offset;
+ files++;
+ offset = alloc_rootdir_entry(fs, &de, "FSCK%04dREC");
+ de.start = htole16(i & 0xffff);
+ if (fs->fat_bits == 32)
+ de.starthi = htole16(i >> 16);
+ for (walk = i; walk > 0 && walk != -1;
+ walk = next_cluster(fs, walk)) {
+ de.size = htole32(le32toh(de.size) + fs->cluster_size);
+ reclaimed++;
+ }
+ fs_write(offset, sizeof(DIR_ENT), &de);
}
- fs_write(offset, sizeof(DIR_ENT), &de);
- }
- if (reclaimed)
- printf("Reclaimed %d unused cluster%s (%llu bytes) in %d chain%s.\n",
- reclaimed, reclaimed == 1 ? "" : "s",
- (unsigned long long)reclaimed * fs->cluster_size, files,
- files == 1 ? "" : "s");
+ if (reclaimed)
+ printf("Reclaimed %d unused cluster%s (%llu bytes) in %d chain%s.\n",
+ reclaimed, reclaimed == 1 ? "" : "s",
+ (unsigned long long)reclaimed * fs->cluster_size, files,
+ files == 1 ? "" : "s");
+ }
free(num_refs);
}
(long)fs->free_clusters, (long)free);
if (interactive)
printf("1) Correct\n2) Don't correct\n");
- else
+ else if (rw)
printf(" Auto-correcting.\n");
- if (!interactive || get_key("12", "?") == '1')
+ if ((!interactive && rw) || (interactive && get_key("12", "?") == '1'))
do_set = 1;
}
} else {