[lxc-devel] [PATCH 4/7] python3: Re-order all functions

Stéphane Graber stgraber at ubuntu.com
Wed Nov 27 22:04:53 UTC 2013


This properly regroups the module functions together and then sorts all
other functions alphabetically to match the function and property lists.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 src/python-lxc/lxc.c | 709 ++++++++++++++++++++++++++-------------------------
 1 file changed, 357 insertions(+), 352 deletions(-)

diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c
index 0604ec7..1ed8cbe 100644
--- a/src/python-lxc/lxc.c
+++ b/src/python-lxc/lxc.c
@@ -31,10 +31,7 @@
 #include <stdio.h>
 #include <sys/wait.h>
 
-typedef struct {
-    PyObject_HEAD
-    struct lxc_container *container;
-} Container;
+/* Helper functions */
 
 char**
 convert_tuple_to_char_pointer_array(PyObject *argv) {
@@ -113,50 +110,218 @@ error:
     return NULL;
 }
 
-static void
-Container_dealloc(Container* self)
+struct lxc_attach_python_payload {
+    PyObject *fn;
+    PyObject *arg;
+};
+
+static int lxc_attach_python_exec(void* _payload)
 {
-    lxc_container_put(self->container);
-    Py_TYPE(self)->tp_free((PyObject*)self);
+    struct lxc_attach_python_payload *payload =
+        (struct lxc_attach_python_payload *)_payload;
+    PyObject *result = PyObject_CallFunctionObjArgs(payload->fn,
+                                                    payload->arg, NULL);
+
+    if (!result) {
+        PyErr_Print();
+        return -1;
+    }
+    if (PyLong_Check(result))
+        return (int)PyLong_AsLong(result);
+    else
+        return -1;
 }
 
-static PyObject *
-Container_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+static void lxc_attach_free_options(lxc_attach_options_t *options);
+
+static lxc_attach_options_t *lxc_attach_parse_options(PyObject *kwds)
 {
-    Container *self;
+    static char *kwlist[] = {"attach_flags", "namespaces", "personality",
+                             "initial_cwd", "uid", "gid", "env_policy",
+                             "extra_env_vars", "extra_keep_env", "stdin",
+                             "stdout", "stderr", NULL};
+    long temp_uid, temp_gid;
+    int temp_env_policy;
+    PyObject *extra_env_vars_obj = NULL;
+    PyObject *extra_keep_env_obj = NULL;
+    PyObject *stdin_obj = NULL;
+    PyObject *stdout_obj = NULL;
+    PyObject *stderr_obj = NULL;
+    PyObject *initial_cwd_obj = NULL;
+    PyObject *dummy;
+    bool parse_result;
 
-    self = (Container *)type->tp_alloc(type, 0);
+    lxc_attach_options_t default_options = LXC_ATTACH_OPTIONS_DEFAULT;
+    lxc_attach_options_t *options = malloc(sizeof(*options));
 
-    return (PyObject *)self;
+    if (!options) {
+        PyErr_SetNone(PyExc_MemoryError);
+        return NULL;
+    }
+    memcpy(options, &default_options, sizeof(*options));
+
+    /* we need some dummy variables because we can't be sure
+     * the data types match completely */
+    temp_uid = -1;
+    temp_gid = -1;
+    temp_env_policy = options->env_policy;
+
+    /* we need a dummy tuple */
+    dummy = PyTuple_New(0);
+
+    parse_result = PyArg_ParseTupleAndKeywords(dummy, kwds, "|iilO&lliOOOOO",
+                                               kwlist, &options->attach_flags,
+                                               &options->namespaces,
+                                               &options->personality,
+                                               PyUnicode_FSConverter,
+                                               &initial_cwd_obj, &temp_uid,
+                                               &temp_gid, &temp_env_policy,
+                                               &extra_env_vars_obj,
+                                               &extra_keep_env_obj,
+                                               &stdin_obj, &stdout_obj,
+                                               &stderr_obj);
+
+    /* immediately get rid of the dummy tuple */
+    Py_DECREF(dummy);
+
+    if (!parse_result) {
+        lxc_attach_free_options(options);
+        return NULL;
+    }
+
+    /* duplicate the string, so we don't depend on some random Python object */
+    if (initial_cwd_obj != NULL) {
+        options->initial_cwd = strndup(PyBytes_AsString(initial_cwd_obj),
+                                       PyBytes_Size(initial_cwd_obj));
+        Py_DECREF(initial_cwd_obj);
+    }
+
+    /* do the type conversion from the types that match the parse string */
+    if (temp_uid != -1) options->uid = (uid_t)temp_uid;
+    if (temp_gid != -1) options->gid = (gid_t)temp_gid;
+    options->env_policy = (lxc_attach_env_policy_t)temp_env_policy;
+
+    if (extra_env_vars_obj)
+        options->extra_env_vars =
+            convert_tuple_to_char_pointer_array(extra_env_vars_obj);
+    if (extra_keep_env_obj)
+        options->extra_keep_env =
+            convert_tuple_to_char_pointer_array(extra_keep_env_obj);
+    if (stdin_obj) {
+        options->stdin_fd = PyObject_AsFileDescriptor(stdin_obj);
+        if (options->stdin_fd < 0) {
+            lxc_attach_free_options(options);
+            return NULL;
+        }
+    }
+    if (stdout_obj) {
+        options->stdout_fd = PyObject_AsFileDescriptor(stdout_obj);
+        if (options->stdout_fd < 0) {
+            lxc_attach_free_options(options);
+            return NULL;
+        }
+    }
+    if (stderr_obj) {
+        options->stderr_fd = PyObject_AsFileDescriptor(stderr_obj);
+        if (options->stderr_fd < 0) {
+            lxc_attach_free_options(options);
+            return NULL;
+        }
+    }
+
+    return options;
 }
 
-static int
-Container_init(Container *self, PyObject *args, PyObject *kwds)
+void lxc_attach_free_options(lxc_attach_options_t *options)
 {
-    static char *kwlist[] = {"name", "config_path", NULL};
-    char *name = NULL;
-    PyObject *fs_config_path = NULL;
-    char *config_path = NULL;
+    int i;
+    if (!options)
+        return;
+    if (options->initial_cwd)
+        free(options->initial_cwd);
+    if (options->extra_env_vars) {
+        for (i = 0; options->extra_env_vars[i]; i++)
+            free(options->extra_env_vars[i]);
+        free(options->extra_env_vars);
+    }
+    if (options->extra_keep_env) {
+        for (i = 0; options->extra_keep_env[i]; i++)
+            free(options->extra_keep_env[i]);
+        free(options->extra_keep_env);
+    }
+    free(options);
+}
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|O&", kwlist,
-                                      &name,
-                                      PyUnicode_FSConverter, &fs_config_path))
-        return -1;
+/* Module functions */
+static PyObject *
+LXC_arch_to_personality(PyObject *self, PyObject *arg)
+{
+    long rv = -1;
+    PyObject *pystr;
+    char *str;
 
-    if (fs_config_path != NULL) {
-        config_path = PyBytes_AS_STRING(fs_config_path);
-        assert(config_path != NULL);
+    if (!PyUnicode_Check(arg)) {
+        PyErr_SetString(PyExc_ValueError, "Expected a string");
+        return NULL;
     }
 
-    self->container = lxc_container_new(name, config_path);
-    if (!self->container) {
-        Py_XDECREF(fs_config_path);
-        fprintf(stderr, "%d: error creating container %s\n", __LINE__, name);
-        return -1;
+    pystr = PyUnicode_AsUTF8String(arg);
+    if (!pystr)
+        return NULL;
+
+    str = PyBytes_AsString(pystr);
+    if (!str)
+        goto out;
+
+    rv = lxc_config_parse_arch(str);
+    if (rv == -1)
+        PyErr_SetString(PyExc_KeyError, "Failed to lookup architecture.");
+
+out:
+    Py_DECREF(pystr);
+    return rv == -1 ? NULL : PyLong_FromLong(rv);
+}
+
+static PyObject *
+LXC_attach_run_command(PyObject *self, PyObject *arg)
+{
+    PyObject *args_obj = NULL;
+    int i, rv;
+    lxc_attach_command_t cmd = {
+        NULL,         /* program */
+        NULL          /* argv[] */
+    };
+
+    if (!PyArg_ParseTuple(arg, "sO", (const char**)&cmd.program, &args_obj))
+        return NULL;
+    if (args_obj && PyList_Check(args_obj)) {
+        cmd.argv = convert_tuple_to_char_pointer_array(args_obj);
+    } else {
+        PyErr_Format(PyExc_TypeError, "Second part of tuple passed to "
+                                      "attach_run_command must be a list.");
+        return NULL;
     }
 
-    Py_XDECREF(fs_config_path);
-    return 0;
+    if (!cmd.argv)
+        return NULL;
+
+    rv = lxc_attach_run_command(&cmd);
+
+    for (i = 0; cmd.argv[i]; i++)
+        free(cmd.argv[i]);
+    free(cmd.argv);
+
+    return PyLong_FromLong(rv);
+}
+
+static PyObject *
+LXC_attach_run_shell(PyObject *self, PyObject *arg)
+{
+    int rv;
+
+    rv = lxc_attach_run_shell(NULL);
+
+    return PyLong_FromLong(rv);
 }
 
 static PyObject *
@@ -230,29 +395,81 @@ LXC_list_containers(PyObject *self, PyObject *args, PyObject *kwds)
     return list;
 }
 
-// Container properties
-static PyObject *
-Container_config_file_name(Container *self, void *closure)
-{
-    return PyUnicode_FromString(
-                self->container->config_file_name(self->container));
-}
+/* Base type and functions for Container */
+typedef struct {
+    PyObject_HEAD
+    struct lxc_container *container;
+} Container;
 
-static PyObject *
-Container_defined(Container *self, void *closure)
+static void
+Container_dealloc(Container* self)
 {
-    if (self->container->is_defined(self->container)) {
-        Py_RETURN_TRUE;
-    }
-
-    Py_RETURN_FALSE;
+    lxc_container_put(self->container);
+    Py_TYPE(self)->tp_free((PyObject*)self);
 }
 
-static PyObject *
-Container_init_pid(Container *self, void *closure)
+static int
+Container_init(Container *self, PyObject *args, PyObject *kwds)
 {
-    return PyLong_FromLong(self->container->init_pid(self->container));
-}
+    static char *kwlist[] = {"name", "config_path", NULL};
+    char *name = NULL;
+    PyObject *fs_config_path = NULL;
+    char *config_path = NULL;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|O&", kwlist,
+                                      &name,
+                                      PyUnicode_FSConverter, &fs_config_path))
+        return -1;
+
+    if (fs_config_path != NULL) {
+        config_path = PyBytes_AS_STRING(fs_config_path);
+        assert(config_path != NULL);
+    }
+
+    self->container = lxc_container_new(name, config_path);
+    if (!self->container) {
+        Py_XDECREF(fs_config_path);
+        fprintf(stderr, "%d: error creating container %s\n", __LINE__, name);
+        return -1;
+    }
+
+    Py_XDECREF(fs_config_path);
+    return 0;
+}
+
+static PyObject *
+Container_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    Container *self;
+
+    self = (Container *)type->tp_alloc(type, 0);
+
+    return (PyObject *)self;
+}
+
+/* Container properties */
+static PyObject *
+Container_config_file_name(Container *self, void *closure)
+{
+    return PyUnicode_FromString(
+                self->container->config_file_name(self->container));
+}
+
+static PyObject *
+Container_defined(Container *self, void *closure)
+{
+    if (self->container->is_defined(self->container)) {
+        Py_RETURN_TRUE;
+    }
+
+    Py_RETURN_FALSE;
+}
+
+static PyObject *
+Container_init_pid(Container *self, void *closure)
+{
+    return PyLong_FromLong(self->container->init_pid(self->container));
+}
 
 static PyObject *
 Container_name(Container *self, void *closure)
@@ -276,7 +493,58 @@ Container_state(Container *self, void *closure)
     return PyUnicode_FromString(self->container->state(self->container));
 }
 
-// Container Functions
+/* Container Functions */
+static PyObject *
+Container_attach_and_possibly_wait(Container *self, PyObject *args,
+                                   PyObject *kwds, int wait)
+{
+    struct lxc_attach_python_payload payload = { NULL, NULL };
+    lxc_attach_options_t *options = NULL;
+    long ret;
+    pid_t pid;
+
+    if (!PyArg_ParseTuple(args, "O|O", &payload.fn, &payload.arg))
+        return NULL;
+    if (!PyCallable_Check(payload.fn)) {
+        PyErr_Format(PyExc_TypeError, "attach: object not callable");
+        return NULL;
+    }
+
+    options = lxc_attach_parse_options(kwds);
+    if (!options)
+        return NULL;
+
+    ret = self->container->attach(self->container, lxc_attach_python_exec,
+                                  &payload, options, &pid);
+    if (ret < 0)
+        goto out;
+
+    if (wait) {
+        ret = lxc_wait_for_pid_status(pid);
+        /* handle case where attach fails */
+        if (WIFEXITED(ret) && WEXITSTATUS(ret) == 255)
+            ret = -1;
+    } else {
+        ret = (long)pid;
+    }
+
+out:
+    lxc_attach_free_options(options);
+    return PyLong_FromLong(ret);
+}
+
+static PyObject *
+Container_attach(Container *self, PyObject *args, PyObject *kwds)
+{
+    return Container_attach_and_possibly_wait(self, args, kwds, 0);
+}
+
+static PyObject *
+Container_attach_wait(Container *self, PyObject *args, PyObject *kwds)
+{
+    return Container_attach_and_possibly_wait(self, args, kwds, 1);
+}
+
 static PyObject *
 Container_clear_config_item(Container *self, PyObject *args, PyObject *kwds)
 {
@@ -295,6 +563,42 @@ Container_clear_config_item(Container *self, PyObject *args, PyObject *kwds)
 }
 
 static PyObject *
+Container_console(Container *self, PyObject *args, PyObject *kwds)
+{
+    static char *kwlist[] = {"ttynum", "stdinfd", "stdoutfd", "stderrfd",
+                             "escape", NULL};
+    int ttynum = -1, stdinfd = 0, stdoutfd = 1, stderrfd = 2, escape = 1;
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiii", kwlist,
+                                      &ttynum, &stdinfd, &stdoutfd, &stderrfd,
+                                      &escape))
+        return NULL;
+
+    if (self->container->console(self->container, ttynum,
+            stdinfd, stdoutfd, stderrfd, escape) == 0) {
+        Py_RETURN_TRUE;
+    }
+    Py_RETURN_FALSE;
+}
+
+static PyObject *
+Container_console_getfd(Container *self, PyObject *args, PyObject *kwds)
+{
+    static char *kwlist[] = {"ttynum", NULL};
+    int ttynum = -1, masterfd;
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &ttynum))
+        return NULL;
+
+    if (self->container->console_getfd(self->container, &ttynum,
+                                       &masterfd) < 0) {
+        PyErr_SetString(PyExc_ValueError, "Unable to allocate tty");
+        return NULL;
+    }
+    return PyLong_FromLong(masterfd);
+}
+
+static PyObject *
 Container_create(Container *self, PyObject *args, PyObject *kwds)
 {
     char* template_name = NULL;
@@ -766,42 +1070,6 @@ Container_unfreeze(Container *self, PyObject *args, PyObject *kwds)
 }
 
 static PyObject *
-Container_console(Container *self, PyObject *args, PyObject *kwds)
-{
-    static char *kwlist[] = {"ttynum", "stdinfd", "stdoutfd", "stderrfd",
-                             "escape", NULL};
-    int ttynum = -1, stdinfd = 0, stdoutfd = 1, stderrfd = 2, escape = 1;
-
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiii", kwlist,
-                                      &ttynum, &stdinfd, &stdoutfd, &stderrfd,
-                                      &escape))
-        return NULL;
-
-    if (self->container->console(self->container, ttynum,
-            stdinfd, stdoutfd, stderrfd, escape) == 0) {
-        Py_RETURN_TRUE;
-    }
-    Py_RETURN_FALSE;
-}
-
-static PyObject *
-Container_console_getfd(Container *self, PyObject *args, PyObject *kwds)
-{
-    static char *kwlist[] = {"ttynum", NULL};
-    int ttynum = -1, masterfd;
-
-    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &ttynum))
-        return NULL;
-
-    if (self->container->console_getfd(self->container, &ttynum,
-                                       &masterfd) < 0) {
-        PyErr_SetString(PyExc_ValueError, "Unable to allocate tty");
-        return NULL;
-    }
-    return PyLong_FromLong(masterfd);
-}
-
-static PyObject *
 Container_wait(Container *self, PyObject *args, PyObject *kwds)
 {
     static char *kwlist[] = {"state", "timeout", NULL};
@@ -819,270 +1087,7 @@ Container_wait(Container *self, PyObject *args, PyObject *kwds)
     Py_RETURN_FALSE;
 }
 
-struct lxc_attach_python_payload {
-    PyObject *fn;
-    PyObject *arg;
-};
-
-static int lxc_attach_python_exec(void* _payload)
-{
-    struct lxc_attach_python_payload *payload =
-        (struct lxc_attach_python_payload *)_payload;
-    PyObject *result = PyObject_CallFunctionObjArgs(payload->fn,
-                                                    payload->arg, NULL);
-
-    if (!result) {
-        PyErr_Print();
-        return -1;
-    }
-    if (PyLong_Check(result))
-        return (int)PyLong_AsLong(result);
-    else
-        return -1;
-}
-
-static void lxc_attach_free_options(lxc_attach_options_t *options);
-
-static lxc_attach_options_t *lxc_attach_parse_options(PyObject *kwds)
-{
-    static char *kwlist[] = {"attach_flags", "namespaces", "personality",
-                             "initial_cwd", "uid", "gid", "env_policy",
-                             "extra_env_vars", "extra_keep_env", "stdin",
-                             "stdout", "stderr", NULL};
-    long temp_uid, temp_gid;
-    int temp_env_policy;
-    PyObject *extra_env_vars_obj = NULL;
-    PyObject *extra_keep_env_obj = NULL;
-    PyObject *stdin_obj = NULL;
-    PyObject *stdout_obj = NULL;
-    PyObject *stderr_obj = NULL;
-    PyObject *initial_cwd_obj = NULL;
-    PyObject *dummy;
-    bool parse_result;
-
-    lxc_attach_options_t default_options = LXC_ATTACH_OPTIONS_DEFAULT;
-    lxc_attach_options_t *options = malloc(sizeof(*options));
-
-    if (!options) {
-        PyErr_SetNone(PyExc_MemoryError);
-        return NULL;
-    }
-    memcpy(options, &default_options, sizeof(*options));
-
-    /* we need some dummy variables because we can't be sure
-     * the data types match completely */
-    temp_uid = -1;
-    temp_gid = -1;
-    temp_env_policy = options->env_policy;
-
-    /* we need a dummy tuple */
-    dummy = PyTuple_New(0);
-
-    parse_result = PyArg_ParseTupleAndKeywords(dummy, kwds, "|iilO&lliOOOOO",
-                                               kwlist, &options->attach_flags,
-                                               &options->namespaces,
-                                               &options->personality,
-                                               PyUnicode_FSConverter,
-                                               &initial_cwd_obj, &temp_uid,
-                                               &temp_gid, &temp_env_policy,
-                                               &extra_env_vars_obj,
-                                               &extra_keep_env_obj,
-                                               &stdin_obj, &stdout_obj,
-                                               &stderr_obj);
-
-    /* immediately get rid of the dummy tuple */
-    Py_DECREF(dummy);
-
-    if (!parse_result) {
-        lxc_attach_free_options(options);
-        return NULL;
-    }
-
-    /* duplicate the string, so we don't depend on some random Python object */
-    if (initial_cwd_obj != NULL) {
-        options->initial_cwd = strndup(PyBytes_AsString(initial_cwd_obj),
-                                       PyBytes_Size(initial_cwd_obj));
-        Py_DECREF(initial_cwd_obj);
-    }
-
-    /* do the type conversion from the types that match the parse string */
-    if (temp_uid != -1) options->uid = (uid_t)temp_uid;
-    if (temp_gid != -1) options->gid = (gid_t)temp_gid;
-    options->env_policy = (lxc_attach_env_policy_t)temp_env_policy;
-
-    if (extra_env_vars_obj)
-        options->extra_env_vars =
-            convert_tuple_to_char_pointer_array(extra_env_vars_obj);
-    if (extra_keep_env_obj)
-        options->extra_keep_env =
-            convert_tuple_to_char_pointer_array(extra_keep_env_obj);
-    if (stdin_obj) {
-        options->stdin_fd = PyObject_AsFileDescriptor(stdin_obj);
-        if (options->stdin_fd < 0) {
-            lxc_attach_free_options(options);
-            return NULL;
-        }
-    }
-    if (stdout_obj) {
-        options->stdout_fd = PyObject_AsFileDescriptor(stdout_obj);
-        if (options->stdout_fd < 0) {
-            lxc_attach_free_options(options);
-            return NULL;
-        }
-    }
-    if (stderr_obj) {
-        options->stderr_fd = PyObject_AsFileDescriptor(stderr_obj);
-        if (options->stderr_fd < 0) {
-            lxc_attach_free_options(options);
-            return NULL;
-        }
-    }
-
-    return options;
-}
-
-void lxc_attach_free_options(lxc_attach_options_t *options)
-{
-    int i;
-    if (!options)
-        return;
-    if (options->initial_cwd)
-        free(options->initial_cwd);
-    if (options->extra_env_vars) {
-        for (i = 0; options->extra_env_vars[i]; i++)
-            free(options->extra_env_vars[i]);
-        free(options->extra_env_vars);
-    }
-    if (options->extra_keep_env) {
-        for (i = 0; options->extra_keep_env[i]; i++)
-            free(options->extra_keep_env[i]);
-        free(options->extra_keep_env);
-    }
-    free(options);
-}
-
-static PyObject *
-Container_attach_and_possibly_wait(Container *self, PyObject *args,
-                                   PyObject *kwds, int wait)
-{
-    struct lxc_attach_python_payload payload = { NULL, NULL };
-    lxc_attach_options_t *options = NULL;
-    long ret;
-    pid_t pid;
-
-    if (!PyArg_ParseTuple(args, "O|O", &payload.fn, &payload.arg))
-        return NULL;
-    if (!PyCallable_Check(payload.fn)) {
-        PyErr_Format(PyExc_TypeError, "attach: object not callable");
-        return NULL;
-    }
-
-    options = lxc_attach_parse_options(kwds);
-    if (!options)
-        return NULL;
-
-    ret = self->container->attach(self->container, lxc_attach_python_exec,
-                                  &payload, options, &pid);
-    if (ret < 0)
-        goto out;
-
-    if (wait) {
-        ret = lxc_wait_for_pid_status(pid);
-        /* handle case where attach fails */
-        if (WIFEXITED(ret) && WEXITSTATUS(ret) == 255)
-            ret = -1;
-    } else {
-        ret = (long)pid;
-    }
-
-out:
-    lxc_attach_free_options(options);
-    return PyLong_FromLong(ret);
-}
-
-static PyObject *
-Container_attach(Container *self, PyObject *args, PyObject *kwds)
-{
-    return Container_attach_and_possibly_wait(self, args, kwds, 0);
-}
-
-static PyObject *
-Container_attach_wait(Container *self, PyObject *args, PyObject *kwds)
-{
-    return Container_attach_and_possibly_wait(self, args, kwds, 1);
-}
-
-static PyObject *
-LXC_attach_run_shell(PyObject *self, PyObject *arg)
-{
-    int rv;
-
-    rv = lxc_attach_run_shell(NULL);
-
-    return PyLong_FromLong(rv);
-}
-
-static PyObject *
-LXC_arch_to_personality(PyObject *self, PyObject *arg)
-{
-    long rv = -1;
-    PyObject *pystr;
-    char *str;
-
-    if (!PyUnicode_Check(arg)) {
-        PyErr_SetString(PyExc_ValueError, "Expected a string");
-        return NULL;
-    }
-
-    pystr = PyUnicode_AsUTF8String(arg);
-    if (!pystr)
-        return NULL;
-
-    str = PyBytes_AsString(pystr);
-    if (!str)
-        goto out;
-
-    rv = lxc_config_parse_arch(str);
-    if (rv == -1)
-        PyErr_SetString(PyExc_KeyError, "Failed to lookup architecture.");
-
-out:
-    Py_DECREF(pystr);
-    return rv == -1 ? NULL : PyLong_FromLong(rv);
-}
-
-static PyObject *
-LXC_attach_run_command(PyObject *self, PyObject *arg)
-{
-    PyObject *args_obj = NULL;
-    int i, rv;
-    lxc_attach_command_t cmd = {
-        NULL,         /* program */
-        NULL          /* argv[] */
-    };
-
-    if (!PyArg_ParseTuple(arg, "sO", (const char**)&cmd.program, &args_obj))
-        return NULL;
-    if (args_obj && PyList_Check(args_obj)) {
-        cmd.argv = convert_tuple_to_char_pointer_array(args_obj);
-    } else {
-        PyErr_Format(PyExc_TypeError, "Second part of tuple passed to "
-                                      "attach_run_command must be a list.");
-        return NULL;
-    }
-
-    if (!cmd.argv)
-        return NULL;
-
-    rv = lxc_attach_run_command(&cmd);
-
-    for (i = 0; cmd.argv[i]; i++)
-        free(cmd.argv[i]);
-    free(cmd.argv);
-
-    return PyLong_FromLong(rv);
-}
-
+/* Function/Properties list */
 static PyGetSetDef Container_getseters[] = {
     {"config_file_name",
      (getter)Container_config_file_name, NULL,
-- 
1.8.4.4





More information about the lxc-devel mailing list