2 Samba Unix SMB/CIFS implementation.
4 C utilities for the pytalloc test suite.
5 Provides the "_test_pytalloc" Python module.
7 NOTE: Please read talloc_guide.txt for full documentation
9 Copyright (C) Petr Viktorin 2015
11 ** NOTE! The following LGPL license applies to the talloc
12 ** library. This does NOT imply that all of Samba is released
15 This library is free software; you can redistribute it and/or
16 modify it under the terms of the GNU Lesser General Public
17 License as published by the Free Software Foundation; either
18 version 3 of the License, or (at your option) any later version.
20 This library is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 Lesser General Public License for more details.
25 You should have received a copy of the GNU Lesser General Public
26 License along with this library; if not, see <http://www.gnu.org/licenses/>.
33 static PyObject
*testpytalloc_new(PyTypeObject
*mod
)
35 char *obj
= talloc_strdup(NULL
, "This is a test string");;
36 return pytalloc_steal(pytalloc_GetObjectType(), obj
);
39 static PyObject
*testpytalloc_get_object_type(PyObject
*mod
) {
40 PyObject
*type
= (PyObject
*)pytalloc_GetObjectType();
45 static PyObject
*testpytalloc_base_new(PyTypeObject
*mod
)
47 char *obj
= talloc_strdup(NULL
, "This is a test string for a BaseObject");;
48 return pytalloc_steal(pytalloc_GetBaseObjectType(), obj
);
51 static PyObject
*testpytalloc_base_get_object_type(PyObject
*mod
) {
52 PyObject
*type
= (PyObject
*)pytalloc_GetBaseObjectType();
57 static PyObject
*testpytalloc_reference(PyObject
*mod
, PyObject
*args
) {
58 PyObject
*source
= NULL
;
61 if (!PyArg_ParseTuple(args
, "O!", pytalloc_GetObjectType(), &source
))
64 ptr
= pytalloc_get_ptr(source
);
65 return pytalloc_reference_ex(pytalloc_GetObjectType(), ptr
, ptr
);
68 static PyObject
*testpytalloc_base_reference(PyObject
*mod
, PyObject
*args
) {
69 PyObject
*source
= NULL
;
72 if (!PyArg_ParseTuple(args
, "O!", pytalloc_GetBaseObjectType(), &source
)) {
75 mem_ctx
= pytalloc_get_mem_ctx(source
);
76 return pytalloc_reference_ex(pytalloc_GetBaseObjectType(), mem_ctx
, mem_ctx
);
79 static PyMethodDef test_talloc_methods
[] = {
80 { "new", (PyCFunction
)testpytalloc_new
, METH_NOARGS
,
81 "create a talloc Object with a testing string"},
82 { "get_object_type", (PyCFunction
)testpytalloc_get_object_type
, METH_NOARGS
,
83 "call pytalloc_GetObjectType"},
84 { "base_new", (PyCFunction
)testpytalloc_base_new
, METH_NOARGS
,
85 "create a talloc BaseObject with a testing string"},
86 { "base_get_object_type", (PyCFunction
)testpytalloc_base_get_object_type
, METH_NOARGS
,
87 "call pytalloc_GetBaseObjectType"},
88 { "reference", (PyCFunction
)testpytalloc_reference
, METH_VARARGS
,
89 "call pytalloc_reference_ex"},
90 { "base_reference", (PyCFunction
)testpytalloc_base_reference
, METH_VARARGS
,
91 "call pytalloc_reference_ex"},
95 static PyTypeObject DObject_Type
;
97 static int dobject_destructor(void *ptr
)
99 PyObject
*destructor_func
= *talloc_get_type(ptr
, PyObject
*);
101 ret
= PyObject_CallObject(destructor_func
, NULL
);
102 Py_DECREF(destructor_func
);
111 static PyObject
*dobject_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwargs
)
113 PyObject
*destructor_func
= NULL
;
116 if (!PyArg_ParseTuple(args
, "O", &destructor_func
))
118 Py_INCREF(destructor_func
);
120 obj
= talloc(NULL
, PyObject
*);
121 *obj
= destructor_func
;
123 talloc_set_destructor((void*)obj
, dobject_destructor
);
124 return pytalloc_steal(&DObject_Type
, obj
);
127 static PyTypeObject DObject_Type
= {
128 .tp_name
= "_test_pytalloc.DObject",
129 .tp_basicsize
= sizeof(pytalloc_Object
),
131 .tp_new
= dobject_new
,
132 .tp_flags
= Py_TPFLAGS_DEFAULT
,
133 .tp_doc
= "test talloc object that calls a function when underlying data is freed\n",
136 static PyTypeObject DBaseObject_Type
;
138 static int d_base_object_destructor(void *ptr
)
140 PyObject
*destructor_func
= *talloc_get_type(ptr
, PyObject
*);
142 ret
= PyObject_CallObject(destructor_func
, NULL
);
143 Py_DECREF(destructor_func
);
152 static PyObject
*d_base_object_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwargs
)
154 PyObject
*destructor_func
= NULL
;
157 if (!PyArg_ParseTuple(args
, "O", &destructor_func
))
159 Py_INCREF(destructor_func
);
161 obj
= talloc(NULL
, PyObject
*);
162 *obj
= destructor_func
;
164 talloc_set_destructor((void*)obj
, d_base_object_destructor
);
165 return pytalloc_steal(&DBaseObject_Type
, obj
);
168 static PyTypeObject DBaseObject_Type
= {
169 .tp_name
= "_test_pytalloc.DBaseObject",
171 .tp_new
= d_base_object_new
,
172 .tp_flags
= Py_TPFLAGS_DEFAULT
,
173 .tp_doc
= "test talloc object that calls a function when underlying data is freed\n",
176 #define MODULE_DOC PyDoc_STR("Test utility module for pytalloc")
178 #if PY_MAJOR_VERSION >= 3
179 static struct PyModuleDef moduledef
= {
180 PyModuleDef_HEAD_INIT
,
181 .m_name
= "_test_pytalloc",
182 .m_doc
= PyDoc_STR("Test utility module for pytalloc"),
184 .m_methods
= test_talloc_methods
,
188 static PyObject
*module_init(void);
189 static PyObject
*module_init(void)
193 DObject_Type
.tp_base
= pytalloc_GetObjectType();
194 if (PyType_Ready(&DObject_Type
) < 0) {
198 DBaseObject_Type
.tp_basicsize
= pytalloc_BaseObject_size();
199 DBaseObject_Type
.tp_base
= pytalloc_GetBaseObjectType();
200 if (PyType_Ready(&DBaseObject_Type
) < 0) {
204 #if PY_MAJOR_VERSION >= 3
205 m
= PyModule_Create(&moduledef
);
207 m
= Py_InitModule3("_test_pytalloc", test_talloc_methods
, MODULE_DOC
);
214 Py_INCREF(&DObject_Type
);
215 Py_INCREF(DObject_Type
.tp_base
);
216 PyModule_AddObject(m
, "DObject", (PyObject
*)&DObject_Type
);
218 Py_INCREF(&DBaseObject_Type
);
219 Py_INCREF(DBaseObject_Type
.tp_base
);
220 PyModule_AddObject(m
, "DBaseObject", (PyObject
*)&DBaseObject_Type
);
226 #if PY_MAJOR_VERSION >= 3
227 PyMODINIT_FUNC
PyInit__test_pytalloc(void);
228 PyMODINIT_FUNC
PyInit__test_pytalloc(void)
230 return module_init();
233 void init_test_pytalloc(void);
234 void init_test_pytalloc(void)