Copied the alternate boot sector when cloning

edge.strict_endians
Jean-Pierre André 2011-02-16 12:18:56 +01:00
parent 309ca32e52
commit f68259e0c2
1 changed files with 21 additions and 10 deletions

View File

@ -182,9 +182,11 @@ static BOOL image_is_host_endian = FALSE;
* NOTE: Only bump the minor version if the image format and header are still
* backwards compatible. Otherwise always bump the major version. If in
* doubt, bump the major version.
*
* Moved to 10.1 : Alternate boot sector now saved. Still compatible.
*/
#define NTFSCLONE_IMG_VER_MAJOR 10
#define NTFSCLONE_IMG_VER_MINOR 0
#define NTFSCLONE_IMG_VER_MINOR 1
/* All values are in little endian. */
static struct image_hdr {
@ -702,7 +704,8 @@ static void clone_ntfs(u64 nr_clusters)
perr_exit("write_all");
}
for (last_cl = cl = 0; cl < (u64)vol->nr_clusters; cl++) {
/* Examine up to the alternate boot sector */
for (last_cl = cl = 0; cl <= (u64)vol->nr_clusters; cl++) {
if (ntfs_bit_get(lcn_bitmap.bm, cl)) {
progress_update(&progress, ++p_counter);
@ -750,13 +753,21 @@ static void restore_image(void)
Printf("Restoring NTFS from image ...\n");
progress_init(&progress, p_counter, opt.std_out ?
sle64_to_cpu(image_hdr.nr_clusters) :
sle64_to_cpu(image_hdr.inuse),
sle64_to_cpu(image_hdr.nr_clusters) + 1 :
sle64_to_cpu(image_hdr.inuse) + 1,
100);
while (pos < sle64_to_cpu(image_hdr.nr_clusters)) {
if (read_all(&fd_in, &cmd, sizeof(cmd)) == -1)
perr_exit("read_all");
/* Restore up to the alternate boot sector */
while (pos <= sle64_to_cpu(image_hdr.nr_clusters)) {
if (read_all(&fd_in, &cmd, sizeof(cmd)) == -1) {
if (pos == sle64_to_cpu(image_hdr.nr_clusters)) {
/* alternate boot sector no present in old images */
Printf("Warning : no alternate boot"
" sector in image\n");
break;
} else
perr_exit("read_all");
}
if (cmd == 0) {
if (!image_is_host_endian) {
@ -1346,7 +1357,8 @@ static void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm)
static void setup_lcn_bitmap(void)
{
/* Determine lcn bitmap byte size and allocate it. */
lcn_bitmap.size = rounded_up_division(vol->nr_clusters, 8);
/* include the alternate boot sector in the bitmap count */
lcn_bitmap.size = rounded_up_division(vol->nr_clusters + 1, 8);
lcn_bitmap.bm = ntfs_calloc(lcn_bitmap.size);
if (!lcn_bitmap.bm)
@ -1893,12 +1905,11 @@ int main(int argc, char **argv)
if (opt.save_image)
initialise_image_hdr(device_size, image.inuse);
/* FIXME: save backup boot sector */
if (opt.std_out || !opt.metadata) {
s64 nr_clusters_to_save = image.inuse;
if (opt.std_out && !opt.save_image)
nr_clusters_to_save = vol->nr_clusters;
nr_clusters_to_save++; /* account for the backup boot sector */
clone_ntfs(nr_clusters_to_save);
fsync_clone(fd_out);