2018-04-10 18:18:18 +03:00
#!/usr/bin/env python
import samba_utils
def generate_winexesvc_c_from_exe(t):
2019-07-05 01:30:44 +03:00
'''generate a C source file with the contents of the given binary'''
2018-04-10 18:18:18 +03:00
src = t.inputs[0].bldpath(t.env)
tgt = t.outputs[0].bldpath(t.env)
fn = t.env.SAMBA_GENERATOR_VARS['WINEXE_FN']
2019-07-05 01:30:44 +03:00
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
2018-04-10 18:18:18 +03:00
def c_array(src):
N = 0
result = ''
while src:
l = src[:8]
src = src[8:]
2019-07-05 01:30:44 +03:00
# 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])
2018-04-10 18:18:18 +03:00
result += "\t\t%s\n" % (h)
return result
src_array = c_array(src_blob)
2019-07-05 01:30:44 +03:00
if len(src_array) <= 0:
print('Failed to convert %s to C array' % (src))
return -1
2018-04-10 18:18:18 +03:00
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)
2019-07-05 01:30:44 +03:00
if not samba_utils.save_file(tgt, contents):
print('Failed to write C source file %s' % (tgt))
return -1
return 0
2018-04-10 18:18:18 +03:00
winexesvc_binaries = ''
if bld.env.WINEXE_CC_WIN32:
bld.SAMBA_GENERATOR(
'winexesvc32_exe',
source='winexesvc.c',
target='winexesvc32.exe',
rule='${WINEXE_CC_WIN32} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}')
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)
winexesvc_binaries += ' winexesvc32_exe_binary.c'
if bld.env.WINEXE_CC_WIN64:
bld.SAMBA_GENERATOR(
'winexesvc64_exe',
source='winexesvc.c',
target='winexesvc64.exe',
rule='${WINEXE_CC_WIN64} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}')
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)
winexesvc_binaries += ' winexesvc64_exe_binary.c'
if winexesvc_binaries != '':
bld.SAMBA3_BINARY('winexe',
source='winexe.c ' + winexesvc_binaries,
deps='''
popt
samba-credentials
LOADPARM_CTX
libsmb
msrpc3
''')