[lxc-devel] [PATCH 4/7] python3: Re-order all functions
Serge Hallyn
serge.hallyn at ubuntu.com
Wed Nov 27 22:35:17 UTC 2013
Quoting Stéphane Graber (stgraber at ubuntu.com):
> 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>
Acked-by: Serge E. Hallyn <serge.hallyn 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
>
>
> ------------------------------------------------------------------------------
> Rapidly troubleshoot problems before they affect your business. Most IT
> organizations don't have a clear picture of how application performance
> affects their revenue. With AppDynamics, you get 100% visibility into your
> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
> http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list