pyutil.cc
76 lines
| 1.7 KiB
| text/x-c
|
CppLexer
Augie Fackler
|
r41049 | #include "pyutil.h" | ||
Augie Fackler
|
r44259 | #include <iostream> | ||
Augie Fackler
|
r41049 | #include <string> | ||
namespace contrib | ||||
{ | ||||
Augie Fackler
|
r44311 | #if PY_MAJOR_VERSION >= 3 | ||
#define HG_FUZZER_PY3 1 | ||||
PyMODINIT_FUNC PyInit_parsers(void); | ||||
#else | ||||
PyMODINIT_FUNC initparsers(void); | ||||
#endif | ||||
Augie Fackler
|
r41049 | static char cpypath[8192] = "\0"; | ||
static PyObject *mainmod; | ||||
static PyObject *globals; | ||||
void initpy(const char *cselfpath) | ||||
{ | ||||
Augie Fackler
|
r44311 | #ifdef HG_FUZZER_PY3 | ||
Augie Fackler
|
r45488 | const std::string subdir = "/sanpy/lib/python3.8"; | ||
Augie Fackler
|
r44311 | #else | ||
Augie Fackler
|
r41049 | const std::string subdir = "/sanpy/lib/python2.7"; | ||
Augie Fackler
|
r44311 | #endif | ||
Augie Fackler
|
r41049 | /* HACK ALERT: we need a full Python installation built without | ||
pymalloc and with ASAN, so we dump one in | ||||
$OUT/sanpy/lib/python2.7. This helps us wire that up. */ | ||||
std::string selfpath(cselfpath); | ||||
std::string pypath; | ||||
auto pos = selfpath.rfind("/"); | ||||
if (pos == std::string::npos) { | ||||
char wd[8192]; | ||||
Augie Fackler
|
r44259 | if (!getcwd(wd, 8192)) { | ||
std::cerr << "Failed to call getcwd: errno " << errno | ||||
<< std::endl; | ||||
exit(1); | ||||
} | ||||
Augie Fackler
|
r41049 | pypath = std::string(wd) + subdir; | ||
} else { | ||||
pypath = selfpath.substr(0, pos) + subdir; | ||||
} | ||||
strncpy(cpypath, pypath.c_str(), pypath.size()); | ||||
setenv("PYTHONPATH", cpypath, 1); | ||||
setenv("PYTHONNOUSERSITE", "1", 1); | ||||
/* prevent Python from looking up users in the fuzz environment */ | ||||
setenv("PYTHONUSERBASE", cpypath, 1); | ||||
Augie Fackler
|
r44311 | #ifdef HG_FUZZER_PY3 | ||
std::wstring wcpypath(pypath.begin(), pypath.end()); | ||||
Py_SetPythonHome(wcpypath.c_str()); | ||||
#else | ||||
Augie Fackler
|
r41049 | Py_SetPythonHome(cpypath); | ||
Augie Fackler
|
r44311 | #endif | ||
Augie Fackler
|
r41049 | Py_InitializeEx(0); | ||
mainmod = PyImport_AddModule("__main__"); | ||||
globals = PyModule_GetDict(mainmod); | ||||
Augie Fackler
|
r44311 | |||
#ifdef HG_FUZZER_PY3 | ||||
PyObject *mod = PyInit_parsers(); | ||||
#else | ||||
Augie Fackler
|
r41049 | initparsers(); | ||
Augie Fackler
|
r44311 | PyObject *mod = PyImport_ImportModule("parsers"); | ||
#endif | ||||
PyDict_SetItemString(globals, "parsers", mod); | ||||
Augie Fackler
|
r41049 | } | ||
PyObject *pyglobals() | ||||
{ | ||||
return globals; | ||||
} | ||||
} // namespace contrib | ||||