# 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()
|