From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57776) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X86AN-0005UH-U7 for qemu-devel@nongnu.org; Fri, 18 Jul 2014 07:17:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X86AG-0003Yv-9E for qemu-devel@nongnu.org; Fri, 18 Jul 2014 07:17:31 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12723) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X86AG-0003Yk-0Y for qemu-devel@nongnu.org; Fri, 18 Jul 2014 07:17:24 -0400 Date: Fri, 18 Jul 2014 12:17:18 +0100 From: "Dr. David Alan Gilbert" Message-ID: <20140718111717.GH2384@work-vm> References: <1405596081-29701-1-git-send-email-sanidhya.iiith@gmail.com> <1405596081-29701-9-git-send-email-sanidhya.iiith@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1405596081-29701-9-git-send-email-sanidhya.iiith@gmail.com> Subject: Re: [Qemu-devel] [PATCH v4 8/8] BitmapLog: python script for extracting bitmap from a binary file List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sanidhya Kashyap Cc: Amit Shah , qemu list , Juan Quintela * Sanidhya Kashyap (sanidhya.iiith@gmail.com) wrote: > Signed-off-by: Sanidhya Kashyap I'm not really a python-person, but one observation: > +def get_string(value, length): > + name = struct.unpack('<'+str(length)+'s', value)[0] > + for i in range(len(name)): > + if name[i] == '\x00': > + return name[:i] Would it have been easier for you to format the strings in the stream the same way the migration does it; i.e. a length byte followed by the text of the string? Dave > + > +def dump_ram_block_info(infile): > + total_blocks = get_integer(infile.read(int_bytes)) > + for i in range(total_blocks): > + block_name = get_string(infile.read(string_bytes), string_bytes) > + block_offset = get_unsigned_long_integer(infile.read(long_bytes)) > + block_length = get_unsigned_long_integer(infile.read(long_bytes)) > + block_list.append(dict(name=block_name, offset=block_offset, length=block_length)) > + print block_list > + > +def dump_bitmap(infile, bitmap_length): > + marker = 'M' > + count = 0 > + value = ' ' > + while True: > + if len(value) == 0 or marker != 'M': > + print len(complete_bitmap_list) > + print "issue with the dump" > + return > + bitmap_list = [] > + bitmap_raw_value = infile.read(long_bytes * bitmap_length) > + if not bitmap_raw_value: > + print len(bitmap_raw_value) > + break > + count+=1 > + for i in range(bitmap_length): > + mark = i * long_bytes > + bitmap_list.append(hex(get_unsigned_long_integer(bitmap_raw_value[mark:mark+long_bytes]))) > + complete_bitmap_list.append(bitmap_list) > + value = infile.read(1) > + marker = get_char(value) > + print complete_bitmap_list > + > +def main(): > + extracter = argparse.ArgumentParser(description='Extract dirty bitmap from binary file.') > + extracter.add_argument('infile', help='Input file to extract the bitmap') > + args = extracter.parse_args() > + print 'The filename is {}'.format(args.infile) > + > + infile = open(format(args.infile), 'rb') > + > + ram_bitmap_pages = get_long_integer(infile.read(long_bytes)) > + print ram_bitmap_pages > + dump_ram_block_info(infile) > + bitmap_length = ram_bitmap_pages / (long_bytes * byte_size) > + if ram_bitmap_pages % (long_bytes * byte_size) != 0: > + bitmap_length += 1 > + print bitmap_length > + > + dump_bitmap(infile, bitmap_length); > + > + infile.close() > + > +if __name__ == '__main__': > + main() > -- > 1.9.3 > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK