1/* Author: Spencer Shimko <sshimko@tresys.com>
2 *
3 * Copyright (C) 2004-2005 Tresys Technology, LLC
4 * Copyright (C) 2006 Red Hat, Inc
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU Lesser General Public
8 *  License as published by the Free Software Foundation; either
9 *  version 2.1 of the License, or (at your option) any later version.
10 *
11 *  This library 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 GNU
14 *  Lesser General Public License for more details.
15 *
16 *  You should have received a copy of the GNU Lesser General Public
17 *  License along with this library; if not, write to the Free Software
18 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20
21/** standard typemaps **/
22
23%header %{
24	#include <stdlib.h>
25	#include <semanage/semanage.h>
26	#include <sys/mman.h>
27
28	#define STATUS_SUCCESS 0
29	#define STATUS_ERR -1
30%}
31
32%include "stdint.i"
33%ignore semanage_module_install_pp;
34%ignore semanage_module_install_hll;
35
36%wrapper %{
37
38
39	/* There are two ways to call this function:
40	 * One is with a valid swig_type and destructor.
41	 * Two is with a NULL swig_type and NULL destructor.
42	 *
43	 * In the first mode, the function converts
44	 * an array of *cloned* objects [of the given pointer swig type]
45	 * into a PyList, and destroys the array in the process
46	 * (the objects pointers are preserved).
47	 *
48	 * In the second mode, the function converts
49	 * an array of *constant* strings into a PyList, and destroys
50	 * the array in the process
51	 * (the strings are copied, originals not freed). */
52
53	static int semanage_array2plist(
54		semanage_handle_t* handle,
55		void** arr,
56		unsigned int asize,
57		swig_type_info* swig_type,
58		void (*destructor) (void*),
59		PyObject** result) {
60
61		PyObject* plist = PyList_New(0);
62		unsigned int i;
63
64		if (!plist)
65			goto err;
66
67		for (i = 0; i < asize; i++)  {
68
69			PyObject* obj = NULL;
70
71			/* NULL indicates string conversion,
72			 * otherwise create an opaque pointer */
73			if (!swig_type)
74				obj = SWIG_FromCharPtr(arr[i]);
75			else
76				obj = SWIG_NewPointerObj(arr[i], swig_type, 0);
77
78			if (!obj)
79				goto err;
80
81			if (PyList_Append(plist, obj) < 0)
82				goto err;
83		}
84
85		free(arr);
86
87		*result = plist;
88		return STATUS_SUCCESS;
89
90		err:
91		for (i = 0; i < asize; i++)
92			if (destructor)
93				destructor(arr[i]);
94		free(arr);
95		return STATUS_ERR;
96	}
97%}
98/* a few helpful typemaps are available in this library */
99%include <typemaps.i>
100/* wrap all int*'s so they can be used for results
101   if it becomes necessary to send in data this should be changed to INOUT */
102%apply int *OUTPUT { int * };
103%apply int *OUTPUT { size_t * };
104%apply int *OUTPUT { unsigned int * };
105%apply int *OUTPUT { uint16_t * };
106
107%include <cstring.i>
108/* This is needed to properly mmaped binary data in SWIG */
109%cstring_output_allocate_size(void **mapped_data, size_t *data_len, munmap(*$1, *$2));
110
111%typemap(in, numinputs=0) char **(char *temp=NULL) {
112	$1 = &temp;
113}
114
115%typemap(argout) char** {
116	$result = SWIG_Python_AppendOutput($result, SWIG_FromCharPtr(*$1));
117	free(*$1);
118}
119
120%typemap(in, numinputs=0) char ***(char **temp=NULL) {
121	$1 = &temp;
122}
123
124%typemap(argout) (
125 	semanage_handle_t* handle,
126	const semanage_user_t* user,
127	const char*** roles_arr,
128	unsigned int* num_roles) {
129
130	if ($result) {
131		int value;
132		SWIG_AsVal_int($result, &value);
133		if (value >= 0) {
134			PyObject* plist = NULL;
135			if (semanage_array2plist($1, (void**) *$3, *$4,
136                        	NULL, NULL, &plist) < 0)
137				$result = SWIG_From_int(STATUS_ERR);
138			else
139				$result = SWIG_Python_AppendOutput($result, plist);
140		}
141	}
142}
143
144/** module typemaps**/
145
146/* the wrapper will setup this parameter for passing... the resulting python functions
147   will not take the semanage_module_info_t ** parameter */
148%typemap(in, numinputs=0) semanage_module_info_t **(semanage_module_info_t *temp=NULL) {
149	$1 = &temp;
150}
151
152%typemap(argout) semanage_module_info_t ** {
153	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
154}
155
156/** module key typemaps **/
157
158/* the wrapper will setup this parameter for passing... the resulting python functions
159   will not take the semanage_module_key_t ** parameter */
160%typemap(in, numinputs=0) semanage_module_key_t **(semanage_module_key_t *temp=NULL) {
161	$1 = &temp;
162}
163
164%typemap(argout) semanage_module_key_t ** {
165	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
166}
167
168/** context typemaps **/
169
170/* the wrapper will setup this parameter for passing... the resulting python functions
171   will not take the semanage_context_t ** parameter */
172%typemap(in, numinputs=0) semanage_context_t **(semanage_context_t *temp=NULL) {
173	$1 = &temp;
174}
175
176%typemap(argout) semanage_context_t** {
177	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
178}
179
180/** boolean typemaps **/
181
182/* the wrapper will setup this parameter for passing... the resulting python functions
183   will not take the semanage_bool_t *** parameter */
184%typemap(in, numinputs=0) semanage_bool_t ***(semanage_bool_t **temp=NULL) {
185	$1 = &temp;
186}
187
188%typemap(argout) (
189 	semanage_handle_t* handle,
190	semanage_bool_t*** records,
191	unsigned int* count) {
192
193	if ($result) {
194		int value;
195		SWIG_AsVal_int($result, &value);
196		if (value >= 0) {
197			PyObject* plist = NULL;
198			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_bool,
199				(void (*) (void*)) &semanage_bool_free, &plist) < 0)
200				$result = SWIG_From_int(STATUS_ERR);
201			else
202		   	        $result = SWIG_Python_AppendOutput($result, plist);
203		}
204	}
205}
206
207%typemap(in, numinputs=0) semanage_bool_t **(semanage_bool_t *temp=NULL) {
208	$1 = &temp;
209}
210
211%typemap(argout) semanage_bool_t ** {
212	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
213}
214
215%typemap(argout) semanage_bool_key_t ** {
216	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
217}
218
219%typemap(in, numinputs=0) semanage_bool_key_t **(semanage_bool_key_t *temp=NULL) {
220	$1 = &temp;
221}
222
223/** fcontext typemaps **/
224
225/* the wrapper will setup this parameter for passing... the resulting python functions
226   will not take the semanage_fcontext_t *** parameter */
227%typemap(in, numinputs=0) semanage_fcontext_t ***(semanage_fcontext_t **temp=NULL) {
228        $1 = &temp;
229}
230
231%typemap(argout) (
232 	semanage_handle_t* handle,
233	semanage_fcontext_t*** records,
234	unsigned int* count) {
235
236	if ($result) {
237		int value;
238		SWIG_AsVal_int($result, &value);
239		if (value >= 0) {
240			PyObject* plist = NULL;
241			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_fcontext,
242				(void (*) (void*)) &semanage_fcontext_free, &plist) < 0)
243				$result = SWIG_From_int(STATUS_ERR);
244			else
245				$result = SWIG_Python_AppendOutput($result, plist);
246		}
247	}
248}
249
250%typemap(in, numinputs=0) semanage_fcontext_t **(semanage_fcontext_t *temp=NULL) {
251        $1 = &temp;
252}
253
254%typemap(argout) semanage_fcontext_t ** {
255	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
256}
257
258%typemap(argout) semanage_fcontext_key_t ** {
259        $result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
260}
261
262%typemap(in, numinputs=0) semanage_fcontext_key_t **(semanage_fcontext_key_t *temp=NULL) {
263        $1 = &temp;
264}
265
266/** interface typemaps **/
267
268/* the wrapper will setup this parameter for passing... the resulting python functions
269   will not take the semanage_iface_t *** parameter */
270%typemap(in, numinputs=0) semanage_iface_t ***(semanage_iface_t **temp=NULL) {
271	$1 = &temp;
272}
273
274
275%typemap(argout) (
276 	semanage_handle_t* handle,
277	semanage_iface_t*** records,
278	unsigned int* count) {
279
280	if ($result) {
281		int value;
282		SWIG_AsVal_int($result, &value);
283		if (value >= 0) {
284			PyObject* plist = NULL;
285			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_iface,
286				(void (*) (void*)) &semanage_iface_free, &plist) < 0)
287				$result = SWIG_From_int(STATUS_ERR);
288			else
289				$result = SWIG_Python_AppendOutput($result, plist);
290		}
291	}
292}
293
294%typemap(in, numinputs=0) semanage_iface_t **(semanage_iface_t *temp=NULL) {
295	$1 = &temp;
296}
297
298%typemap(argout) semanage_iface_t ** {
299	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
300}
301
302%typemap(argout) semanage_iface_key_t ** {
303	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
304}
305
306%typemap(in, numinputs=0) semanage_iface_key_t **(semanage_iface_key_t *temp=NULL) {
307	$1 = &temp;
308}
309
310/** seuser typemaps **/
311
312/* the wrapper will setup this parameter for passing... the resulting python functions
313   will not take the semanage_seuser_t *** parameter */
314%typemap(in, numinputs=0) semanage_seuser_t ***(semanage_seuser_t **temp=NULL) {
315	$1 = &temp;
316}
317
318
319%typemap(argout) (
320 	semanage_handle_t* handle,
321	semanage_seuser_t*** records,
322	unsigned int* count) {
323
324	if ($result) {
325		int value;
326		SWIG_AsVal_int($result, &value);
327		if (value >= 0) {
328			PyObject* plist = NULL;
329			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_seuser,
330				(void (*) (void*)) &semanage_seuser_free, &plist) < 0)
331				$result = SWIG_From_int(STATUS_ERR);
332			else
333				$result = SWIG_Python_AppendOutput($result, plist);
334		}
335	}
336}
337
338%typemap(in, numinputs=0) semanage_seuser_t **(semanage_seuser_t *temp=NULL) {
339	$1 = &temp;
340}
341
342%typemap(argout) semanage_seuser_t ** {
343	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
344}
345
346%typemap(argout) semanage_seuser_key_t ** {
347	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
348}
349
350%typemap(in, numinputs=0) semanage_seuser_key_t **(semanage_seuser_key_t *temp=NULL) {
351	$1 = &temp;
352}
353
354/** user typemaps **/
355
356/* the wrapper will setup this parameter for passing... the resulting python functions
357   will not take the semanage_user_t *** parameter */
358%typemap(in, numinputs=0) semanage_user_t ***(semanage_user_t **temp=NULL) {
359	$1 = &temp;
360}
361
362%typemap(argout) (
363 	semanage_handle_t* handle,
364	semanage_user_t*** records,
365	unsigned int* count) {
366
367	if ($result) {
368		int value;
369		SWIG_AsVal_int($result, &value);
370		if (value >= 0) {
371			PyObject* plist = NULL;
372			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_user,
373				(void (*) (void*)) &semanage_user_free, &plist) < 0)
374				$result = SWIG_From_int(STATUS_ERR);
375			else
376				$result = SWIG_Python_AppendOutput($result, plist);
377		}
378	}
379}
380
381%typemap(in, numinputs=0) semanage_user_t **(semanage_user_t *temp=NULL) {
382	$1 = &temp;
383}
384
385%typemap(argout) semanage_user_t ** {
386	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
387}
388
389%typemap(argout) semanage_user_key_t ** {
390	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
391}
392
393%typemap(in, numinputs=0) semanage_user_key_t **(semanage_user_key_t *temp=NULL) {
394	$1 = &temp;
395}
396
397/** port typemaps **/
398
399/* the wrapper will setup this parameter for passing... the resulting python functions
400   will not take the semanage_port_t *** parameter */
401%typemap(in, numinputs=0) semanage_port_t ***(semanage_port_t **temp=NULL) {
402	$1 = &temp;
403}
404
405%typemap(argout) (
406 	semanage_handle_t* handle,
407	semanage_port_t*** records,
408	unsigned int* count) {
409
410	if ($result) {
411		int value;
412		SWIG_AsVal_int($result, &value);
413		if (value >= 0) {
414			PyObject* plist = NULL;
415			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_port,
416				(void (*) (void*)) &semanage_port_free, &plist) < 0)
417				$result = SWIG_From_int(STATUS_ERR);
418			else
419				$result = SWIG_Python_AppendOutput($result, plist);
420		}
421	}
422}
423
424%typemap(in, numinputs=0) semanage_port_t **(semanage_port_t *temp=NULL) {
425	$1 = &temp;
426}
427
428%typemap(argout) semanage_port_t ** {
429	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
430}
431
432%typemap(argout) semanage_port_key_t ** {
433	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
434}
435
436%typemap(in, numinputs=0) semanage_port_key_t **(semanage_port_key_t *temp=NULL) {
437	$1 = &temp;
438}
439
440/** node typemaps **/
441
442/* the wrapper will setup this parameter for passing... the resulting python functions
443   will not take the semanage_node_t *** parameter */
444%typemap(in, numinputs=0) semanage_node_t ***(semanage_node_t **temp=NULL) {
445	$1 = &temp;
446}
447
448%typemap(argout) (
449 	semanage_handle_t* handle,
450	semanage_node_t*** records,
451	unsigned int* count) {
452
453	if ($result) {
454		int value;
455		SWIG_AsVal_int($result, &value);
456		if (value >= 0) {
457			PyObject* plist = NULL;
458			if (semanage_array2plist($1, (void**) *$2, *$3, SWIGTYPE_p_semanage_node,
459				(void (*) (void*)) &semanage_node_free, &plist) < 0)
460				$result = SWIG_From_int(STATUS_ERR);
461			else
462				$result = SWIG_Python_AppendOutput($result, plist);
463		}
464	}
465}
466
467%typemap(in, numinputs=0) semanage_node_t **(semanage_node_t *temp=NULL) {
468	$1 = &temp;
469}
470
471%typemap(argout) semanage_node_t ** {
472	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
473}
474
475
476%typemap(argout) semanage_node_key_t ** {
477	$result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
478}
479
480%typemap(in, numinputs=0) semanage_node_key_t **(semanage_node_key_t *temp=NULL) {
481	$1 = &temp;
482}
483
484%include "semanageswig_python_exception.i"
485%include "semanageswig.i"
486