Guest User

Untitled

a guest
Jul 30th, 2020
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.33 KB | None | 0 0
  1. import struct
  2. import sys
  3.  
  4.  
  5. class InfoWrapper(object):
  6.     def __init__(self, source):
  7.         self._source = source
  8.         self._count = 0
  9.         self._header_buffer = b''
  10.  
  11.     def read(self, size):
  12.         chunk = self._source.read(size)
  13.         if len(self._header_buffer) < 512 * 4:
  14.             self._header_buffer += chunk
  15.         self._count += len(chunk)
  16.         return chunk
  17.  
  18.     def _qcow_header_data(self):
  19.         magic, version, bf_offset, bf_sz, cluster_bits, size = (
  20.             struct.unpack('>IIQIIQ', self._header_buffer[:32]))
  21.         return magic, size
  22.  
  23.     @property
  24.     def is_qcow(self):
  25.         if len(self._header_buffer) < 512:
  26.             return False
  27.         magic, size = self._qcow_header_data()
  28.         return magic == 0x514649FB
  29.  
  30.     @property
  31.     def qcow_size(self):
  32.         magic, size = self._qcow_header_data()
  33.         return size
  34.  
  35.     @property
  36.     def raw_size(self):
  37.         return self._count
  38.  
  39.  
  40. if __name__ == '__main__':
  41.     stream = InfoWrapper(sys.stdin)
  42.     while True:
  43.         chunk = stream.read(65536)
  44.         # Pretend this writes to some destination
  45.         if not chunk:
  46.             break
  47.  
  48.     if stream.is_qcow:
  49.         print('Source was qcow file, virtual size %i' % stream.qcow_size)
  50.     else:
  51.         print('Source was raw file, size %i' % stream.raw_size)
  52.  
Advertisement
Add Comment
Please, Sign In to add comment