#!/usr/bin/env python import samba_utils def generate_winexesvc_c_from_exe(t): '''generate a C source file with the contents of the given binary''' src = t.inputs[0].bldpath(t.env) tgt = t.outputs[0].bldpath(t.env) fn = t.env.SAMBA_GENERATOR_VARS['WINEXE_FN'] try: with open(src, 'rb') as f: src_blob = f.read() f.close() except: print('Failed to read %s to convert to C array' % (src)) return -1 def c_array(src): N = 0 result = '' while src: l = src[:8] src = src[8:] # Even files opened in binary mode are read as type "str" in # Python 2, so we need to get the integer ordinal of each # character in the string before we try to convert it to hex. if isinstance(l, str): h = ' '.join(["0x%02X," % ord(x) for x in l]) # Files opened in binary mode are read as type "bytes" in # Python 3, so we can convert each individual integer in the # array of bytes to hex directly. else: h = ' '.join(["0x%02X," % x for x in l]) result += "\t\t%s\n" % (h) return result src_array = c_array(src_blob) if len(src_array) <= 0: print('Failed to convert %s to C array' % (src)) return -1 contents = ''' #include "replace.h" #include "lib/util/data_blob.h" const DATA_BLOB *%s(void); const DATA_BLOB *%s(void) { \tstatic const uint8_t array[] = { %s \t}; \tstatic const DATA_BLOB blob = { \t\t.data = discard_const_p(uint8_t, array), \t\t.length = ARRAY_SIZE(array), \t}; \treturn &blob; } ''' % (fn, fn, src_array) if not samba_utils.save_file(tgt, contents): print('Failed to write C source file %s' % (tgt)) return -1 return 0 winexesvc_binaries = '' bld.SAMBA_GENERATOR( 'winexesvc32_exe', source='winexesvc.c', target='winexesvc32.exe', rule='${WINEXE_CC_WIN32} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}', enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN32) vars = {"WINEXE_FN": "winexesvc32_exe_binary"} bld.SAMBA_GENERATOR( 'winexesvc32_exe_binary', source='winexesvc32.exe', target='winexesvc32_exe_binary.c', group='build_source', vars=vars, rule=generate_winexesvc_c_from_exe, enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN32) if bld.env.WINEXE_CC_WIN32: winexesvc_binaries += ' winexesvc32_exe_binary.c' bld.SAMBA_GENERATOR( 'winexesvc64_exe', source='winexesvc.c', target='winexesvc64.exe', rule='${WINEXE_CC_WIN64} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}', enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN64) vars = {"WINEXE_FN": "winexesvc64_exe_binary"} bld.SAMBA_GENERATOR( 'winexesvc64_exe_binary', source='winexesvc64.exe', target='winexesvc64_exe_binary.c', group='build_source', vars=vars, rule=generate_winexesvc_c_from_exe, enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN64) if bld.env.WINEXE_CC_WIN64: winexesvc_binaries += ' winexesvc64_exe_binary.c' if winexesvc_binaries != '': bld.SAMBA3_BINARY('winexe', source='winexe.c ' + winexesvc_binaries, deps=''' CMDLINE_S3 samba-credentials LOADPARM_CTX libsmb msrpc3 ''', enabled=bld.env.build_winexe)