static PyObject * run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals) { PyCodeObject *co; PyObject *v; long magic; long PyImport_GetMagicNumber(void); magic = PyMarshal_ReadLongFromFile(fp); if (magic != PyImport_GetMagicNumber()) { PyErr_SetString(PyExc_RuntimeError, "Bad magic number in .pyc file"); return NULL; } (void) PyMarshal_ReadLongFromFile(fp); v = PyMarshal_ReadObjectFromFile(fp); fclose(fp); if (v == NULL || !PyCode_Check(v)) { Py_XDECREF(v); PyErr_SetString(PyExc_RuntimeError, "Bad code object in .pyc file"); return NULL; } co = (PyCodeObject *)v; v = PyEval_EvalCode(co, globals, locals); Py_DECREF(co); return v; }
static PyObject *doRead(PyObject *s, PyObject *args) { char *filename; struct deltarpm d; PyObject *ret; int pid; int ipcpipe[2]; if (!PyArg_ParseTuple(args, "s", &filename)) { PyErr_SetFromErrno(PyExc_SystemError); return NULL; } /* The delta rpm code does not expect to be used in its way. Its error handling * conststs of 'printf' and 'exit'. So, dirty hacks abound. */ if (pipe(ipcpipe) == -1) { PyErr_SetFromErrno(PyExc_SystemError); return NULL; } if ((pid = fork())) { FILE *readend = fdopen(ipcpipe[0], "r"); int rc, status; rc = waitpid(pid, &status, 0); if (rc == -1 || (WIFEXITED(status) && WEXITSTATUS(status) != 0)) { PyErr_SetFromErrno(PyExc_SystemError); return NULL; } ret = PyMarshal_ReadObjectFromFile(readend); fclose(readend); } else { FILE *writend = fdopen(ipcpipe[1], "w"); readdeltarpm(filename, &d, NULL); PyMarshal_WriteObjectToFile(createDict(d), writend, Py_MARSHAL_VERSION); fclose(writend); _exit(0); } close(ipcpipe[1]); return ret; }