criu/scripts/magic-gen.py
Adrian Reber ad55bb4589 scripts: add magic-gen.py to ruff linting
And fix found complaints.

Signed-off-by: Adrian Reber <areber@redhat.com>
2026-07-09 10:32:19 +01:00

60 lines
1.7 KiB
Python
Executable file

#!/bin/env python3
import sys
# This program parses criu magic.h file and produces
# magic.py with all *_MAGIC constants except RAW and V1.
def main(argv):
if len(argv) != 3:
print("Usage: magic-gen.py path/to/image.h path/to/magic.py")
exit(1)
magic_c_header = argv[1]
magic_py = argv[2]
# all_magic is used to parse constructions like:
# #define PAGEMAP_MAGIC 0x56084025
# #define SHMEM_PAGEMAP_MAGIC PAGEMAP_MAGIC
all_magic = {}
# and magic is used to store only unique magic.
magic = {}
with open(magic_c_header, 'r') as f:
for line in f:
split = line.split()
if len(split) < 3:
continue
if '#define' not in split[0]:
continue
key = split[1]
value = split[2]
if value in all_magic:
value = all_magic[value]
else:
magic[key] = value
all_magic[key] = value
with open(magic_py, 'w+') as out:
out.write('#Autogenerated. Do not edit!\n')
out.write('by_name = {}\n')
out.write('by_val = {}\n')
for k, v in list(magic.items()):
# We don't need RAW or V1 magic, because
# they can't be used to identify images.
if v == '0x0' or v == '1' or k == '0x0' or v == '1':
continue
if k.endswith("_MAGIC"):
# Just cutting _MAGIC suffix
k = k[:-6]
v = int(v, 16)
out.write("by_name['" + k + "'] = " + str(v) + "\n")
out.write("by_val[" + str(v) + "] = '" + k + "'\n")
if __name__ == "__main__":
main(sys.argv)