mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-05 00:35:23 +00:00
scripts: add magic-gen.py
This script is needed to generate python module from include/magic.h file, that contains dicts with magic numbers that we put into our criu *.img files. Signed-off-by: Ruslan Kuprieiev <kupruser@gmail.com> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
feda34319a
commit
e7640ad635
62
scripts/magic-gen.py
Executable file
62
scripts/magic-gen.py
Executable file
@@ -0,0 +1,62 @@
|
||||
#!/bin/env python
|
||||
import os, sys
|
||||
import struct
|
||||
|
||||
# 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]
|
||||
|
||||
out = open(magic_py, 'w+')
|
||||
|
||||
# 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 = {}
|
||||
|
||||
f = open(magic_c_header, 'r')
|
||||
for line in f:
|
||||
split = line.split()
|
||||
|
||||
if len(split) < 3:
|
||||
continue
|
||||
|
||||
if not '#define' 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
|
||||
|
||||
out.write('#Autogenerated. Do not edit!\n')
|
||||
out.write('by_name = {}\n')
|
||||
out.write('by_val = {}\n')
|
||||
for k,v in 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")
|
||||
f.close()
|
||||
out.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
Reference in New Issue
Block a user