mirror of https://github.com/borgbackup/borg.git
parent
02f3daebbe
commit
2910d13055
|
@ -1395,18 +1395,22 @@ class LoggedIO:
|
|||
with open(backup_filename, 'rb') as backup_fd:
|
||||
# note: file must not be 0 size (windows can't create 0 size mapping)
|
||||
with mmap.mmap(backup_fd.fileno(), 0, access=mmap.ACCESS_READ) as mm:
|
||||
with memoryview(mm) as data, open(filename, 'wb') as fd:
|
||||
fd.write(MAGIC)
|
||||
while len(data) >= self.header_fmt.size:
|
||||
crc, size, tag = self.header_fmt.unpack(data[:self.header_fmt.size])
|
||||
if size < self.header_fmt.size or size > len(data):
|
||||
data = data[1:]
|
||||
continue
|
||||
if crc32(data[4:size]) & 0xffffffff != crc:
|
||||
data = data[1:]
|
||||
continue
|
||||
fd.write(data[:size])
|
||||
data = data[size:]
|
||||
data = memoryview(mm) # didn't use memoryview context manager, it does not work correctly.
|
||||
try:
|
||||
with open(filename, 'wb') as fd:
|
||||
fd.write(MAGIC)
|
||||
while len(data) >= self.header_fmt.size:
|
||||
crc, size, tag = self.header_fmt.unpack(data[:self.header_fmt.size])
|
||||
if size < self.header_fmt.size or size > len(data):
|
||||
data = data[1:]
|
||||
continue
|
||||
if crc32(data[4:size]) & 0xffffffff != crc:
|
||||
data = data[1:]
|
||||
continue
|
||||
fd.write(data[:size])
|
||||
data = data[size:]
|
||||
finally:
|
||||
data.release()
|
||||
|
||||
def read(self, segment, offset, id, read_data=True):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue