]> git.ipfire.org Git - pakfire.git/commitdiff
Better personlity function.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Oct 2011 12:21:41 +0000 (14:21 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Oct 2011 12:21:41 +0000 (14:21 +0200)
Replace including libc by the ctypes module and rather use a
proper Python <--> C function for that.

po/pakfire.pot
python/pakfire/chroot.py
python/pakfire/util.py
python/src/_pakfiremodule.c
python/src/util.c
python/src/util.h

index 7a55bcb92151614161911c67f124d82e49b90b13..3907b616ec8b874e5fd2fb126a55c8f9ec2086ae 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-10-16 12:45+0200\n"
+"POT-Creation-Date: 2011-10-16 14:09+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 78543d1f6e5a00ff201a2b908ddd36e870c514a0..6001f2ea43bee11270dd5037cb6b4612749f253c 100644 (file)
 #                                                                             #
 ###############################################################################
 
-import ctypes
 import fcntl
 import os
 import select
 import subprocess
 import time
 
-from errors import *
+from _pakfire import PERSONALITY_LINUX, PERSONALITY_LINUX32
 
-_libc = ctypes.cdll.LoadLibrary(None)
-_libc.personality.argtypes = [ctypes.c_ulong]
-_libc.personality.restype = ctypes.c_int
+import pakfire.util as util
+from errors import *
 
 def logOutput(fds, logger, returnOutput=1, start=0, timeout=0):
        output=""
@@ -151,10 +149,9 @@ class ChildPreExec(object):
                        Return personality value if supported.
                        Otherwise return None.
                """
-               # taken from sys/personality.h
                personality_defs = {
-                       "linux64": 0x0000,
-                       "linux32": 0x0008,
+                       "linux64": PERSONALITY_LINUX,
+                       "linux32": PERSONALITY_LINUX32,
                }
 
                try:
@@ -168,9 +165,7 @@ class ChildPreExec(object):
 
                # Set new personality if we got one.
                if self.personality:
-                       res = _libc.personality(self.personality)
-                       if res == -1:
-                               raise OSError, "Could not set personality"
+                       util.personality(self.personality)
 
                # Change into new root.
                if self.chrootPath:
index 58c34a2abc9177c18103d0e8610d6f641de83a55..638b72e3a41bd55ee5e438c3dd5f4b387a53439b 100644 (file)
@@ -40,7 +40,7 @@ from constants import *
 from i18n import _
 
 # Import binary version of version_compare and capability functions
-from _pakfire import version_compare, get_capabilities, set_capabilities
+from _pakfire import version_compare, get_capabilities, set_capabilities, personality
 
 def cli_is_interactive():
        """
index d5e63db4de1a86d9521c101568845ccb60feed0d..b5c22128fcc91d24084c0d247f9281b5b5fd577a 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <Python.h>
 
+#include <sys/personality.h>
+
 #include "capabilities.h"
 #include "config.h"
 #include "pool.h"
@@ -38,6 +40,7 @@ static PyMethodDef pakfireModuleMethods[] = {
        {"version_compare", (PyCFunction)version_compare, METH_VARARGS, NULL},
        {"get_capabilities", (PyCFunction)get_capabilities, METH_VARARGS, NULL},
        {"set_capabilities", (PyCFunction)set_capabilities, METH_VARARGS, NULL},
+       {"personality", (PyCFunction)_personality, METH_VARARGS, NULL},
        { NULL, NULL, 0, NULL }
 };
 
@@ -261,6 +264,10 @@ void init_pakfire(void) {
        // Add constants
        d = PyModule_GetDict(m);
 
+       // Personalities
+       PyDict_SetItemString(d, "PERSONALITY_LINUX",   Py_BuildValue("i", PER_LINUX));
+       PyDict_SetItemString(d, "PERSONALITY_LINUX32", Py_BuildValue("i", PER_LINUX32));
+
        // Add constants for relations
        PyDict_SetItemString(d, "REL_EQ", Py_BuildValue("i", REL_EQ));
        PyDict_SetItemString(d, "REL_LT", Py_BuildValue("i", REL_LT));
index f6e0757ad6908177b0081e496cfe21589ecda528..d3ee3a2247dfe513721767748112cacb6c1792e5 100644 (file)
 
 #include <Python.h>
 
+#include <sys/personality.h>
+
 #include "util.h"
 
+PyObject *_personality(PyObject *self, PyObject *args) {
+       unsigned long persona;
+       int ret = 0;
+
+       if (!PyArg_ParseTuple(args, "l", &persona)) {
+               /* XXX raise exception */
+               return NULL;
+       }
+
+       /* Change personality here. */
+       ret = personality(persona);
+
+       if (ret < 0) {
+               PyErr_SetString(PyExc_RuntimeError, "Could not set personality.");
+               return NULL;
+       }
+
+       return Py_BuildValue("i", ret);
+}
+
 PyObject *version_compare(PyObject *self, PyObject *args) {
        Pool *pool;
        const char *evr1, *evr2;
index e97b56b03f5c000c45174be58328d6decaed243b..d0a7e098545614851bf2afb8e11f3366883d3e64 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <solv/evr.h>
 
+extern PyObject *_personality(PyObject *self, PyObject *args);
 extern PyObject *version_compare(PyObject *self, PyObject *args);
 
 #endif