| #!/usr/bin/env python | 
 |  | 
 | import argparse | 
 | import collections | 
 | import logging | 
 | import os | 
 | import re | 
 | import subprocess | 
 | import textwrap | 
 |  | 
 | from gensyscalls import SupportedArchitectures, SysCallsTxtParser | 
 | from genseccomp import parse_syscall_NRs | 
 |  | 
 | def load_syscall_names_from_file(file_path, architecture): | 
 |   parser = SysCallsTxtParser() | 
 |   parser.parse_open_file(open(file_path)) | 
 |   arch_map = {} | 
 |   for syscall in parser.syscalls: | 
 |     if syscall.get(architecture): | 
 |       arch_map[syscall["func"]] = syscall["name"]; | 
 |  | 
 |   return arch_map | 
 |  | 
 | def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs): | 
 |   for arch in SupportedArchitectures: | 
 |     base_names = load_syscall_names_from_file(base_syscall_file, arch) | 
 |  | 
 |     for func,syscall in base_names.iteritems(): | 
 |       out_file.write("#define __" + arch + "_" + func + " " + str(syscall_NRs[arch][syscall]) + ";\n") | 
 |  | 
 | def main(): | 
 |   parser = argparse.ArgumentParser( | 
 |       description="Generates a mapping of bionic functions to system call numbers per architecture.") | 
 |   parser.add_argument("--verbose", "-v", help="Enables verbose logging.") | 
 |   parser.add_argument("--out-dir", | 
 |                       help="The output directory for the output files") | 
 |   parser.add_argument("base_file", metavar="base-file", type=str, | 
 |                       help="The path of the base syscall list (SYSCALLS.TXT).") | 
 |   parser.add_argument("files", metavar="FILE", type=str, nargs="+", | 
 |                       help=("A syscall name-number mapping file for an architecture.\n")) | 
 |   args = parser.parse_args() | 
 |  | 
 |   if args.verbose: | 
 |     logging.basicConfig(level=logging.DEBUG) | 
 |   else: | 
 |     logging.basicConfig(level=logging.INFO) | 
 |  | 
 |   syscall_files = [] | 
 |   syscall_NRs = {} | 
 |   for filename in args.files: | 
 |     m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename) | 
 |     syscall_NRs[m.group(1)] = parse_syscall_NRs(filename) | 
 |  | 
 |   output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h") | 
 |   with open(output_path, "w") as output_file: | 
 |     gen_syscall_nrs(out_file=output_file, | 
 |              syscall_NRs=syscall_NRs, base_syscall_file=args.base_file) | 
 |  | 
 | if __name__ == "__main__": | 
 |   main() |