1*19c3b8c2SApple OSS Distributions#!/usr/bin/env python 2*19c3b8c2SApple OSS Distributions 3*19c3b8c2SApple OSS Distributionsfrom __future__ import absolute_import 4*19c3b8c2SApple OSS Distributionsimport sys 5*19c3b8c2SApple OSS Distributions 6*19c3b8c2SApple OSS Distributions 7*19c3b8c2SApple OSS Distributionsdef type_map(x): 8*19c3b8c2SApple OSS Distributions return "TYPE_" + x.upper() 9*19c3b8c2SApple OSS Distributions 10*19c3b8c2SApple OSS Distributions 11*19c3b8c2SApple OSS Distributionsdef print_preamble(): 12*19c3b8c2SApple OSS Distributions print(r'struct blacklist_entry blacklist[] = {') 13*19c3b8c2SApple OSS Distributions 14*19c3b8c2SApple OSS Distributions 15*19c3b8c2SApple OSS Distributionsdef print_entry(kext, func, type): 16*19c3b8c2SApple OSS Distributions strkext = '"' + kext + '"' if kext != "" else "NULL" 17*19c3b8c2SApple OSS Distributions strfunc = '"' + func + '"' if func != "" else "NULL" 18*19c3b8c2SApple OSS Distributions 19*19c3b8c2SApple OSS Distributions strtype = "0" 20*19c3b8c2SApple OSS Distributions if type: 21*19c3b8c2SApple OSS Distributions strtype = type_map(type) if type != "" else "normal" 22*19c3b8c2SApple OSS Distributions 23*19c3b8c2SApple OSS Distributions print(""" {{ 24*19c3b8c2SApple OSS Distributions .kext_name = {}, 25*19c3b8c2SApple OSS Distributions .func_name = {}, 26*19c3b8c2SApple OSS Distributions .type_mask = {}, 27*19c3b8c2SApple OSS Distributions }},""".format(strkext, strfunc, strtype)) 28*19c3b8c2SApple OSS Distributions 29*19c3b8c2SApple OSS Distributions 30*19c3b8c2SApple OSS Distributionsdef print_postamble(nentries, extra_entries): 31*19c3b8c2SApple OSS Distributions print('') # add space for new entries added at runtime 32*19c3b8c2SApple OSS Distributions print(r' /* Unused entries that can be populated at runtime */') 33*19c3b8c2SApple OSS Distributions 34*19c3b8c2SApple OSS Distributions for _ in range(extra_entries): 35*19c3b8c2SApple OSS Distributions print_entry("", "", None) 36*19c3b8c2SApple OSS Distributions 37*19c3b8c2SApple OSS Distributions print("};\n") 38*19c3b8c2SApple OSS Distributions 39*19c3b8c2SApple OSS Distributions print('static size_t blacklist_entries = {};'.format(nentries)) 40*19c3b8c2SApple OSS Distributions print('static const size_t blacklist_max_entries = {};'.format( 41*19c3b8c2SApple OSS Distributions nentries + extra_entries)) 42*19c3b8c2SApple OSS Distributions 43*19c3b8c2SApple OSS Distributions 44*19c3b8c2SApple OSS Distributionsdef extract_symbol(line): 45*19c3b8c2SApple OSS Distributions fields = line.split(":") 46*19c3b8c2SApple OSS Distributions if len(fields) == 3: 47*19c3b8c2SApple OSS Distributions return [field.strip() for field in fields] 48*19c3b8c2SApple OSS Distributions raise Exception("Invalid exclusion rule: {}".format(line)) 49*19c3b8c2SApple OSS Distributions 50*19c3b8c2SApple OSS Distributions 51*19c3b8c2SApple OSS Distributionswith open(sys.argv[1]) as fd: 52*19c3b8c2SApple OSS Distributions nentries = 0 53*19c3b8c2SApple OSS Distributions extra_entries = 5 54*19c3b8c2SApple OSS Distributions 55*19c3b8c2SApple OSS Distributions print_preamble() 56*19c3b8c2SApple OSS Distributions 57*19c3b8c2SApple OSS Distributions for line in fd.readlines(): 58*19c3b8c2SApple OSS Distributions line = line.strip() 59*19c3b8c2SApple OSS Distributions if line and not line.startswith("#"): 60*19c3b8c2SApple OSS Distributions kext, func, ty = extract_symbol(line) 61*19c3b8c2SApple OSS Distributions print_entry(kext, func, ty) 62*19c3b8c2SApple OSS Distributions nentries += 1 63*19c3b8c2SApple OSS Distributions 64*19c3b8c2SApple OSS Distributions print_postamble(nentries, extra_entries) 65