| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 Unix SMB/CIFS implementation. | |
| 3 Python/Talloc glue | |
| 4 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 | |
| 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 "replace.h" | |
| 21 #include <talloc.h> | |
| 22 #include <pytalloc.h> | |
| 23 | |
| 24 /** | |
| 25 * Simple dealloc for talloc-wrapping PyObjects | |
| 26 */ | |
| 27 void py_talloc_dealloc(PyObject* self) | |
| 28 { | |
| 29 py_talloc_Object *obj = (py_talloc_Object *)self; | |
| 30 talloc_free(obj->talloc_ctx); | |
| 31 obj->talloc_ctx = NULL; | |
| 32 self->ob_type->tp_free(self); | |
| 33 } | |
| 34 | |
| 35 /** | |
| 36 * Import an existing talloc pointer into a Python object. | |
| 37 */ | |
| 38 PyObject *py_talloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, | |
| 39 void *ptr) | |
| 40 { | |
| 41 py_talloc_Object *ret = (py_talloc_Object *)py_type->tp_alloc(py_type, 0
); | |
| 42 ret->talloc_ctx = talloc_new(NULL); | |
| 43 if (ret->talloc_ctx == NULL) { | |
| 44 return NULL; | |
| 45 } | |
| 46 if (talloc_steal(ret->talloc_ctx, mem_ctx) == NULL) { | |
| 47 return NULL; | |
| 48 } | |
| 49 ret->ptr = ptr; | |
| 50 return (PyObject *)ret; | |
| 51 } | |
| 52 | |
| 53 | |
| 54 /** | |
| 55 * Import an existing talloc pointer into a Python object, leaving the | |
| 56 * original parent, and creating a reference to the object in the python | |
| 57 * object | |
| 58 */ | |
| 59 PyObject *py_talloc_reference_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, voi
d *ptr) | |
| 60 { | |
| 61 py_talloc_Object *ret = (py_talloc_Object *)py_type->tp_alloc(py_type, 0
); | |
| 62 ret->talloc_ctx = talloc_new(NULL); | |
| 63 if (ret->talloc_ctx == NULL) { | |
| 64 return NULL; | |
| 65 } | |
| 66 if (talloc_reference(ret->talloc_ctx, mem_ctx) == NULL) { | |
| 67 return NULL; | |
| 68 } | |
| 69 ret->ptr = ptr; | |
| 70 return (PyObject *)ret; | |
| 71 } | |
| 72 | |
| 73 /** | |
| 74 * Default (but slightly more useful than the default) implementation of Repr(). | |
| 75 */ | |
| 76 PyObject *py_talloc_default_repr(PyObject *obj) | |
| 77 { | |
| 78 py_talloc_Object *talloc_obj = (py_talloc_Object *)obj; | |
| 79 PyTypeObject *type = (PyTypeObject*)PyObject_Type(obj); | |
| 80 | |
| 81 return PyString_FromFormat("<%s talloc object at 0x%p>", | |
| 82 type->tp_name, talloc_obj->ptr); | |
| 83 } | |
| 84 | |
| 85 static void py_cobject_talloc_free(void *ptr) | |
| 86 { | |
| 87 talloc_free(ptr); | |
| 88 } | |
| 89 | |
| 90 PyObject *PyCObject_FromTallocPtr(void *ptr) | |
| 91 { | |
| 92 return PyCObject_FromVoidPtr(ptr, py_cobject_talloc_free); | |
| 93 } | |
| OLD | NEW |