mirror of
https://github.com/Lekensteyn/lglaf.git
synced 2024-11-27 01:25:38 -05:00
dump-file.py: allow skipping part of a file
Reading a file (or partition like /dev/block/mmcblk0p1) from an offset was requested in #26.
This commit is contained in:
parent
39c9872ca0
commit
05564d5ffe
1 changed files with 10 additions and 3 deletions
13
dump-file.py
13
dump-file.py
|
@ -60,9 +60,8 @@ def laf_read(comm, fd_num, offset, size):
|
||||||
MAX_BLOCK_SIZE = (16 * 1024 - 512) // 512
|
MAX_BLOCK_SIZE = (16 * 1024 - 512) // 512
|
||||||
BLOCK_SIZE = 512
|
BLOCK_SIZE = 512
|
||||||
|
|
||||||
def dump_file(comm, file_fd, output_file, size):
|
def dump_file(comm, file_fd, output_file, size, offset=0):
|
||||||
with open_local_writable(output_file) as f:
|
with open_local_writable(output_file) as f:
|
||||||
offset = 0
|
|
||||||
while offset < size:
|
while offset < size:
|
||||||
chunksize = min(size - offset, BLOCK_SIZE * MAX_BLOCK_SIZE)
|
chunksize = min(size - offset, BLOCK_SIZE * MAX_BLOCK_SIZE)
|
||||||
data = laf_read(comm, file_fd, offset // BLOCK_SIZE, chunksize)
|
data = laf_read(comm, file_fd, offset // BLOCK_SIZE, chunksize)
|
||||||
|
@ -79,6 +78,8 @@ def open_local_writable(path):
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--debug", action='store_true', help="Enable debug messages")
|
parser.add_argument("--debug", action='store_true', help="Enable debug messages")
|
||||||
|
parser.add_argument("--offset", type=int, default=0,
|
||||||
|
help="Start reading the file from an offset")
|
||||||
parser.add_argument("--size", type=int,
|
parser.add_argument("--size", type=int,
|
||||||
help="Override file size (useful for files in /proc)")
|
help="Override file size (useful for files in /proc)")
|
||||||
parser.add_argument("file", help="File path on the device")
|
parser.add_argument("file", help="File path on the device")
|
||||||
|
@ -97,14 +98,20 @@ def main():
|
||||||
# Be careful: a too large read size will result in a hang while LAF
|
# Be careful: a too large read size will result in a hang while LAF
|
||||||
# tries to read more data, requiring a reset.
|
# tries to read more data, requiring a reset.
|
||||||
if args.size:
|
if args.size:
|
||||||
|
offset = args.offset
|
||||||
size = args.size
|
size = args.size
|
||||||
else:
|
else:
|
||||||
|
offset = args.offset
|
||||||
size = get_file_size(comm, args.file)
|
size = get_file_size(comm, args.file)
|
||||||
|
if offset > size:
|
||||||
|
_logger.warning("Offset %d is larger than the detected size %d",
|
||||||
|
offset, size)
|
||||||
|
size -= offset
|
||||||
if size > 0:
|
if size > 0:
|
||||||
_logger.debug("File size is %d", size)
|
_logger.debug("File size is %d", size)
|
||||||
with laf_open_ro(comm, args.file) as file_fd:
|
with laf_open_ro(comm, args.file) as file_fd:
|
||||||
_logger.debug("Opened fd %d for file %s", file_fd, args.file)
|
_logger.debug("Opened fd %d for file %s", file_fd, args.file)
|
||||||
dump_file(comm, file_fd, args.output_file, size)
|
dump_file(comm, file_fd, args.output_file, size, offset)
|
||||||
else:
|
else:
|
||||||
_logger.warning("Not a file or zero size, not writing file")
|
_logger.warning("Not a file or zero size, not writing file")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue