From 8daa83a594a2e98f39d764422bfbdbc62c9efd44 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 19:20:00 +0200 Subject: Adding upstream version 2:4.20.0+dfsg. Signed-off-by: Daniel Baumann --- python/modules.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 python/modules.c (limited to 'python/modules.c') diff --git a/python/modules.c b/python/modules.c new file mode 100644 index 0000000..7934f3e --- /dev/null +++ b/python/modules.c @@ -0,0 +1,114 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Jelmer Vernooij 2007 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "lib/replace/system/python.h" +#include "py3compat.h" +#include "includes.h" +#include "python/modules.h" +#include "dynconfig/dynconfig.h" + +static bool PySys_PathPrepend(PyObject *list, const char *path) +{ + bool ok; + PyObject *py_path = PyUnicode_FromString(path); + if (py_path == NULL) { + return false; + } + ok = PyList_Insert(list, 0, py_path) == 0; + Py_XDECREF(py_path); + return ok; +} + +bool py_update_path(void) +{ + PyObject *mod_sys = NULL; + PyObject *py_path = NULL; + + mod_sys = PyImport_ImportModule("sys"); + if (mod_sys == NULL) { + return false; + } + + py_path = PyObject_GetAttrString(mod_sys, "path"); + if (py_path == NULL) { + goto error; + } + + if (!PyList_Check(py_path)) { + goto error; + } + + if (!PySys_PathPrepend(py_path, dyn_PYTHONDIR)) { + goto error; + } + + if (strcmp(dyn_PYTHONARCHDIR, dyn_PYTHONDIR) != 0) { + if (!PySys_PathPrepend(py_path, dyn_PYTHONARCHDIR)) { + goto error; + } + } + Py_XDECREF(py_path); + Py_XDECREF(mod_sys); + return true; +error: + Py_XDECREF(py_path); + Py_XDECREF(mod_sys); + return false; +} + +char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list, + const char *paramname) +{ + char **ret; + Py_ssize_t i; + if (!PyList_Check(list)) { + PyErr_Format(PyExc_TypeError, "%s is not a list", paramname); + return NULL; + } + ret = talloc_array(NULL, char *, PyList_Size(list)+1); + if (ret == NULL) { + PyErr_NoMemory(); + return NULL; + } + + for (i = 0; i < PyList_Size(list); i++) { + const char *value; + Py_ssize_t size; + PyObject *item = PyList_GetItem(list, i); + if (!PyUnicode_Check(item)) { + PyErr_Format(PyExc_TypeError, "%s should be strings", paramname); + talloc_free(ret); + return NULL; + } + value = PyUnicode_AsUTF8AndSize(item, &size); + if (value == NULL) { + talloc_free(ret); + return NULL; + } + ret[i] = talloc_strndup(ret, value, size); + if (ret[i] == NULL) { + PyErr_NoMemory(); + talloc_free(ret); + return NULL; + } + } + ret[i] = NULL; + return ret; +} + -- cgit v1.2.3