X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=lib%2Fdiskimage_mbr.ml;h=34e4061726ab87f181440cbc902526117b3310a6;hb=f5a7417793b3f0780b0dd49798ea27981f046d98;hp=bd02f65223402a8f5a177598c647975d70f7331e;hpb=9611aba66734efe3e2f1e0792a90003b657a89f5;p=virt-df.git diff --git a/lib/diskimage_mbr.ml b/lib/diskimage_mbr.ml index bd02f65..34e4061 100644 --- a/lib/diskimage_mbr.ml +++ b/lib/diskimage_mbr.ml @@ -26,8 +26,11 @@ open ExtList open Diskimage_utils -let sector_size = 512 -let sector_size64 = 512L +open Int63.Operators + +let plugin_id = "mbr" + +let sector_size = ~^512 (* Maximum number of extended partitions possible. *) let max_extended_partitions = 100 @@ -40,14 +43,15 @@ let max_extended_partitions = 100 * (2) 'partno' is the partition number, starting at 1 * (cf. /dev/hda1 is the first partition). * (3) 'dev' is the underlying block device. + * (4) natural blocksize to use is sector size. *) class partition_device partno start size dev = let devname = dev#name in let name = sprintf "%s%d" devname partno in - let start = start *^ sector_size64 in - let size = size *^ sector_size64 in + let start = start *^ sector_size in + let size = size *^ sector_size in object (self) - inherit offset_device name start size dev + inherit offset_device name start size sector_size dev end (** Probe the @@ -56,10 +60,10 @@ end @raise Not_found if it is not an MBR. *) -let rec probe_mbr dev = +let rec probe dev = (* Read the first sector. *) let bits = - try dev#read_bitstring 0L sector_size + try dev#read_bitstring ~^0 sector_size with exn -> raise Not_found in (* Does this match a likely-looking MBR? *) @@ -87,7 +91,7 @@ let rec probe_mbr dev = let extendeds = List.concat extendeds in primaries @ extendeds *) - { parts_name = "MBR"; parts = primaries } + { parts_plugin_id = plugin_id; parts_dev = dev; parts = primaries } | { _ } -> raise Not_found (* not an MBR *) @@ -113,11 +117,16 @@ and parse_mbr_entry dev i bits = part_dev = null_device; part_content = `Unknown } and make_mbr_entry part_status dev partno part_type first_lba part_size = - let first_lba = uint64_of_int32 first_lba in - let part_size = uint64_of_int32 part_size in + let first_lba = Int63.of_int32 first_lba in + let part_size = Int63.of_int32 part_size in + (* + XXX Used to be: + let first_lba = uint63_of_int32 first_lba in + let part_size = uint63_of_int32 part_size in + *) if !debug then - eprintf "make_mbr_entry: first_lba = %Lx part_size = %Lx\n%!" - first_lba part_size; + eprintf "make_mbr_entry: first_lba = %s part_size = %s\n%!" + (Int63.to_string first_lba) (Int63.to_string part_size); { part_status = part_status; part_type = part_type; part_dev = new partition_device partno first_lba part_size dev; @@ -166,6 +175,7 @@ and probe_extended_partition max fd epart sect = else [] *) +(* (* Ugh, fake a UInt32 -> UInt64 conversion without sign extension, until * we get working UInt32/UInt64 modules in extlib. *) @@ -173,3 +183,4 @@ and uint64_of_int32 u32 = let i64 = Int64.of_int32 u32 in if u32 >= 0l then i64 else Int64.add i64 0x1_0000_0000_L +*)