| #!/usr/bin/env python |
| # Copyright 2017 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from __future__ import print_function |
| |
| import os |
| import sys |
| |
| """Pack MacOS sandbox seatbelt .sb files as C-style strings, escaping |
| quotes and backslashes as needed. |
| """ |
| |
| header = '// Generated by package_sb_file.py. Do not edit !!!\n\n' |
| namespace = 'namespace sandbox {\nnamespace policy{\n\n' |
| namespace_end = '\n} // namespace policy\n} // namespace sandbox\n' |
| h_include = '#include "sandbox/policy/export.h"\n' |
| h_definition = ('SANDBOX_POLICY_EXPORT\n' + |
| 'extern const char kSeatbeltPolicyString_%s[];\n\n') |
| cc_include = '#include "sandbox/policy/mac/%s.sb.h"\n' |
| cc_definition = 'const char kSeatbeltPolicyString_%s[] = \n' |
| cc_definition_end = '"";\n' # Add "" so the definition has some content |
| # (the empty string) if the sb file is empty. |
| |
| def escape_for_c(line): |
| if line and line[0] == ';': |
| return '' |
| return line.replace('\\', '\\\\').replace('\"', '\\\"') |
| |
| def pack_file(argv): |
| if len(argv) != 2: |
| print >> sys.stderr, 'usage: package_sb_file.py input_filename output_dir' |
| return 1 |
| input_filename = argv[0] |
| output_directory = argv[1] |
| input_basename = os.path.basename(input_filename) |
| (module_name, module_ext) = os.path.splitext(input_basename) |
| output_h_file = output_directory + '/' + input_basename + '.h' |
| output_cc_file = output_directory + '/' + input_basename + '.cc' |
| try: |
| with open(input_filename, 'r') as infile: |
| with open(output_h_file, 'w') as outfile: |
| outfile.write(header) |
| outfile.write(h_include) |
| outfile.write(namespace) |
| outfile.write(h_definition % module_name) |
| outfile.write(namespace_end) |
| with open(output_cc_file, 'w') as outfile: |
| outfile.write(header) |
| outfile.write(cc_include % module_name) |
| outfile.write(namespace) |
| outfile.write(cc_definition % module_name) |
| for line in infile: |
| escaped_line = escape_for_c(line.rstrip()) |
| if escaped_line: |
| outfile.write(' "' + escaped_line + '\\n"\n') |
| outfile.write(cc_definition_end) |
| outfile.write(namespace_end) |
| except IOError: |
| print('Failed to process %s' % input_filename, file=sys.stderr) |
| return 1 |
| return 0 |
| |
| if __name__ == '__main__': |
| sys.exit(pack_file(sys.argv[1:])) |