aboutsummaryrefslogtreecommitdiffstats
path: root/tools/syz-headerparser/headerparser.py
diff options
context:
space:
mode:
authorZubin Mithra <zsm@google.com>2017-08-23 14:01:57 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-08-25 17:23:52 +0200
commitc3631fc789181c23aa51396f0ff66cd488e4b4f7 (patch)
tree7ffbc3082b6f8cac56de418bd51ee54d98eb3df7 /tools/syz-headerparser/headerparser.py
parent3f1aca4826c84d52da6047a8a5c9325727525c8d (diff)
tools: add headerparser as a tool to assist in writing system call descriptions
The tool can be found inside tools/syz-headerparser. Details on how to use headerparser can be found inside docs/headerparser_usage.md.
Diffstat (limited to 'tools/syz-headerparser/headerparser.py')
-rw-r--r--tools/syz-headerparser/headerparser.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/tools/syz-headerparser/headerparser.py b/tools/syz-headerparser/headerparser.py
new file mode 100644
index 000000000..e9f64f2f6
--- /dev/null
+++ b/tools/syz-headerparser/headerparser.py
@@ -0,0 +1,61 @@
+# Copyright 2017 syzkaller project authors. All rights reserved.
+# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+'''
+This scripts takes as input a list of header files and generates metadata
+files to make syzkaller device descriptions.
+'''
+
+import argparse
+import logging
+import sys
+import traceback
+
+from headerlib.header_preprocessor import HeaderFilePreprocessorException
+from headerlib.container import GlobalHierarchy
+
+
+def main():
+ """
+ python parser.py --filename=A.h,B.h
+ """
+
+ parser = argparse.ArgumentParser(description='Parse header files to output fuzzer'
+ 'struct metadata.')
+ parser.add_argument('--filenames',
+ help='comma-separated header filenames',
+ dest='filenames',
+ required=True)
+ parser.add_argument('--debug',
+ help='print debug-information at every level of parsing',
+ action='store_true')
+ parser.add_argument('--include',
+ help='include the specified file as the first line of the processed header files',
+ required=False,
+ const='',
+ nargs='?')
+
+ args = parser.parse_args()
+
+ loglvl = logging.INFO
+
+ if args.debug:
+ loglvl = logging.DEBUG
+
+ include_lines = ''
+ if args.include:
+ include_lines = open(args.include, 'r').read()
+
+ try:
+ gh = GlobalHierarchy(filenames=args.filenames.split(','),
+ loglvl=loglvl, include_lines=include_lines)
+ except HeaderFilePreprocessorException as e:
+ excdata = traceback.format_exc().splitlines()
+ logging.error(excdata[-1])
+ sys.exit(-1)
+
+
+ print gh.get_metadata_structs()
+
+if __name__ == '__main__':
+ main()