Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Samba utility functions 4 : Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 5 : 6 : This program is free software; you can redistribute it and/or modify 7 : it under the terms of the GNU General Public License as published by 8 : the Free Software Foundation; either version 3 of the License, or 9 : (at your option) any later version. 10 : 11 : This program is distributed in the hope that it will be useful, 12 : but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : GNU General Public License for more details. 15 : 16 : You should have received a copy of the GNU General Public License 17 : along with this program. If not, see <http://www.gnu.org/licenses/>. 18 : */ 19 : 20 : #include <Python.h> 21 : #include "py3compat.h" 22 : #include "includes.h" 23 : #include "python/modules.h" 24 : #include "dynconfig/dynconfig.h" 25 : 26 83 : static bool PySys_PathPrepend(PyObject *list, const char *path) 27 : { 28 : bool ok; 29 83 : PyObject *py_path = PyUnicode_FromString(path); 30 83 : if (py_path == NULL) { 31 0 : return false; 32 : } 33 83 : ok = PyList_Insert(list, 0, py_path) == 0; 34 83 : Py_XDECREF(py_path); 35 83 : return ok; 36 : } 37 : 38 83 : bool py_update_path(void) 39 : { 40 83 : PyObject *mod_sys = NULL; 41 83 : PyObject *py_path = NULL; 42 : 43 83 : mod_sys = PyImport_ImportModule("sys"); 44 83 : if (mod_sys == NULL) { 45 0 : return false; 46 : } 47 : 48 83 : py_path = PyObject_GetAttrString(mod_sys, "path"); 49 83 : if (py_path == NULL) { 50 0 : goto error; 51 : } 52 : 53 83 : if (!PyList_Check(py_path)) { 54 0 : goto error; 55 : } 56 : 57 83 : if (!PySys_PathPrepend(py_path, dyn_PYTHONDIR)) { 58 0 : goto error; 59 : } 60 : 61 83 : if (strcmp(dyn_PYTHONARCHDIR, dyn_PYTHONDIR) != 0) { 62 0 : if (!PySys_PathPrepend(py_path, dyn_PYTHONARCHDIR)) { 63 0 : goto error; 64 : } 65 : } 66 83 : Py_XDECREF(py_path); 67 83 : Py_XDECREF(mod_sys); 68 83 : return true; 69 0 : error: 70 0 : Py_XDECREF(py_path); 71 0 : Py_XDECREF(mod_sys); 72 0 : return false; 73 : } 74 : 75 11303 : char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list, 76 : const char *paramname) 77 : { 78 : char **ret; 79 : Py_ssize_t i; 80 11303 : if (!PyList_Check(list)) { 81 0 : PyErr_Format(PyExc_TypeError, "%s is not a list", paramname); 82 0 : return NULL; 83 : } 84 11303 : ret = talloc_array(NULL, char *, PyList_Size(list)+1); 85 11303 : if (ret == NULL) { 86 0 : PyErr_NoMemory(); 87 0 : return NULL; 88 : } 89 : 90 61289 : for (i = 0; i < PyList_Size(list); i++) { 91 : const char *value; 92 : Py_ssize_t size; 93 49986 : PyObject *item = PyList_GetItem(list, i); 94 49986 : if (!PyUnicode_Check(item)) { 95 0 : PyErr_Format(PyExc_TypeError, "%s should be strings", paramname); 96 0 : return NULL; 97 : } 98 49986 : value = PyUnicode_AsUTF8AndSize(item, &size); 99 49986 : if (value == NULL) { 100 0 : talloc_free(ret); 101 0 : return NULL; 102 : } 103 49986 : ret[i] = talloc_strndup(ret, value, size); 104 : } 105 11303 : ret[i] = NULL; 106 11303 : return ret; 107 : } 108 :