diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2009-12-28 13:53:18 +0100 |
---|---|---|
committer | Jelmer Vernooij <jelmer@ganieda.vernstok.nl> | 2009-12-29 16:26:19 +0100 |
commit | 9e603dfb95f61a7daf2acc80c9c3120ae9ecf98e (patch) | |
tree | ff5752e5a7e5ffb7704ee5a61a588e5ae6d410d7 /source4/utils | |
parent | 9b1a21031187e83de61d999b70a6d1cda7b68444 (diff) | |
download | samba-9e603dfb95f61a7daf2acc80c9c3120ae9ecf98e.tar.gz samba-9e603dfb95f61a7daf2acc80c9c3120ae9ecf98e.tar.xz samba-9e603dfb95f61a7daf2acc80c9c3120ae9ecf98e.zip |
s4/net: Support parsing arguments in Python commands.
Diffstat (limited to 'source4/utils')
-rw-r--r-- | source4/utils/net/net.c | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/source4/utils/net/net.c b/source4/utils/net/net.c index 298204b01f..31bade32a5 100644 --- a/source4/utils/net/net.c +++ b/source4/utils/net/net.c @@ -52,6 +52,51 @@ #include <Python.h> #include "scripting/python/modules.h" +static PyObject *py_tuple_from_argv(int argc, const char *argv[]) +{ + PyObject *l; + Py_ssize_t i; + + l = PyTuple_New(argc); + if (l == NULL) { + return NULL; + } + + for (i = 0; i < argc; i++) { + PyTuple_SetItem(l, i, PyString_FromString(argv[i])); + } + + return l; +} + +static int py_call_with_string_args(PyObject *self, const char *method, int argc, const char *argv[]) +{ + PyObject *ret, *args, *py_method; + + args = py_tuple_from_argv(argc, argv); + if (args == NULL) { + PyErr_Print(); + return 1; + } + + py_method = PyObject_GetAttrString(self, method); + if (py_method == NULL) { + PyErr_Print(); + return 1; + } + + ret = PyObject_CallObject(py_method, args); + + Py_DECREF(args); + + if (ret == NULL) { + PyErr_Print(); + return 1; + } + + return PyInt_AsLong(ret); +} + static PyObject *py_commands(void) { PyObject *netcmd_module, *py_cmds; @@ -106,12 +151,8 @@ int net_run_function(struct net_context *ctx, py_cmd = PyDict_GetItemString(py_cmds, argv[0]); if (py_cmd != NULL) { - PyObject *ret = PyObject_CallMethod(py_cmd, "run", ""); - if (ret == NULL) { - PyErr_Print(); - return 1; - } - return PyInt_AsLong(ret); + return py_call_with_string_args(py_cmd, "_run", + argc-1, argv+1); } d_printf("No command: %s\n", argv[0]); @@ -142,12 +183,8 @@ int net_run_usage(struct net_context *ctx, py_cmd = PyDict_GetItemString(py_cmds, argv[0]); if (py_cmd != NULL) { - PyObject *ret = PyObject_CallMethod(py_cmd, "usage", ""); - if (ret == NULL) { - PyErr_Print(); - return 1; - } - return PyInt_AsLong(ret); + return py_call_with_string_args(py_cmd, "usage", argc-1, + argv+1); } d_printf("No usage information for command: %s\n", argv[0]); @@ -218,9 +255,9 @@ static int net_help_python(void) } desc = PyString_AsString(py_desc); if (strlen(name) > 7) { - d_printf("\t%s\t%s", name, desc); + d_printf("\t%s\t%s\n", name, desc); } else { - d_printf("\t%s\t\t%s", name, desc); + d_printf("\t%s\t\t%s\n", name, desc); } } return 0; |