Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}