blob: 044584fc50a4210df12a5d8a3653719605e70e1b [file] [log] [blame]
Brian Waters13d96012017-12-08 16:53:31 -06001/* This interface file is processed by SWIG to create a python wrapper interface to freeDiameter framework. */
2%module fDpy
3%begin %{
4/*********************************************************************************************************
5* Software License Agreement (BSD License) *
6* Author: Sebastien Decugis <sdecugis@freediameter.net> *
7* *
8* Copyright (c) 2013, WIDE Project and NICT *
9* All rights reserved. *
10* *
11* Redistribution and use of this software in source and binary forms, with or without modification, are *
12* permitted provided that the following conditions are met: *
13* *
14* * Redistributions of source code must retain the above *
15* copyright notice, this list of conditions and the *
16* following disclaimer. *
17* *
18* * Redistributions in binary form must reproduce the above *
19* copyright notice, this list of conditions and the *
20* following disclaimer in the documentation and/or other *
21* materials provided with the distribution. *
22* *
23* * Neither the name of the WIDE Project or NICT nor the *
24* names of its contributors may be used to endorse or *
25* promote products derived from this software without *
26* specific prior written permission of WIDE Project and *
27* NICT. *
28* *
29* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
30* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
32* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
33* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
34* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
35* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
36* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
37*********************************************************************************************************/
38%}
39
40%{
41/* This text is included in the generated wrapper verbatim */
42#define SWIG
43#include <freeDiameter/extension.h>
44%}
45
46
47/* Include standard types & functions used in freeDiameter headers */
48%include <stdint.i>
49//%include <cdata.i>
50%include <cstring.i>
51%include <typemaps.i>
52
53
54/* Inline functions seems to give problems to SWIG -- just remove the inline definition */
55%define __inline__
56%enddef
57
58
59/* Make some global-variables read-only (mainly to avoid warnings) */
60%immutable fd_g_config;
61%immutable peer_state_str;
62
63#pragma SWIG nowarn=451
64
65/*****************
66 * Exceptions *
67*****************/
68%{
69/* This is not thread-safe etc. but it should work /most of the time/. */
70static int wrapper_errno;
71static PyObject* wrapper_errno_py;
72static const char * wrapper_error_txt; /* if NULL, use strerror(errno) */
73#define DI_ERROR(code, pycode, str) { \
74 fd_log_debug("[dbg_interactive] ERROR: %s: %s", __PRETTY_FUNCTION__, str ? str : strerror(code)); \
75 wrapper_errno = code; \
76 wrapper_errno_py = pycode; \
77 wrapper_error_txt = str; \
78}
79
80#define DI_ERROR_MALLOC \
81 DI_ERROR(ENOMEM, PyExc_MemoryError, NULL)
82
83%}
84
85%exception {
86 /* reset the errno */
87 wrapper_errno = 0;
88 /* Call the function -- it will use DI_ERROR macro in case of error */
89 $action
90 /* Now, test for error */
91 if (wrapper_errno) {
92 const char * str = wrapper_error_txt ? wrapper_error_txt : strerror(wrapper_errno);
93 PyObject * exc = wrapper_errno_py;
94 if (!exc) {
95 switch (wrapper_errno) {
96 case ENOMEM: exc = PyExc_MemoryError; break;
97 case EINVAL: exc = PyExc_ValueError; break;
98 default: exc = PyExc_RuntimeError;
99 }
100 }
101 SWIG_PYTHON_THREAD_BEGIN_BLOCK;
102 PyErr_SetString(exc, str);
103 SWIG_fail;
104 SWIG_PYTHON_THREAD_END_BLOCK;
105 }
106}
107
108
109/***********************************
110 Some types & typemaps for usability
111 ***********************************/
112
113%apply (char *STRING, size_t LENGTH) { ( char * string, size_t len ) };
114%apply (char *STRING, size_t LENGTH) { ( uint8_t * string, size_t len ) };
115
116/* Generic typemap for functions that create something */
117%typemap(in, numinputs=0,noblock=1) SWIGTYPE ** OUTPUT (void *temp = NULL) {
118 $1 = (void *)&temp;
119}
120%typemap(argout,noblock=1) SWIGTYPE ** OUTPUT {
121 %append_output(SWIG_NewPointerObj(*$1, $*1_descriptor, 0));
122}
123
124/* Case of the fd_*_dump functions */
125%typemap(in,noblock=1,numinputs=0) (char ** buf, size_t *len, size_t *offset) ($*1_ltype temp = NULL, $*2_ltype tempn = 0) {
126 $1 = &temp; $2 = &tempn; $3 = NULL;
127}
128%typemap(freearg,match="in") (char ** buf, size_t *len, size_t *offset) "";
129%typemap(argout,noblock=1,fragment="SWIG_FromCharPtr")(char ** buf, size_t *len, size_t *offset) {
130 if (*$1) {
131 %append_output(SWIG_FromCharPtr(*$1));
132 free(*$1);
133 }
134}
135
136/* Typemap to return a boolean value as output parameter */
137%typemap(in, numinputs=0,noblock=1) int * BOOL_OUT (int temp) {
138 $1 = &temp;
139}
140%typemap(argout,noblock=1) int * BOOL_OUT {
141 PyObject * r;
142 if (*$1)
143 r = Py_True;
144 else
145 r = Py_False;
146 Py_XINCREF(r);
147 %append_output(r);
148}
149
150/* To allow passing callback functions defined in python */
151%typemap(in) PyObject *PyCb {
152 if (!$input || ($input == Py_None)) {
153 $1 = NULL;
154 } else {
155 if (!PyCallable_Check($input)) {
156 PyErr_SetString(PyExc_TypeError, "Need a callable object!");
157 SWIG_fail;
158 }
159 $1 = $input;
160 }
161}
162
163%{
164/* Forward declaration for the peers module */
165static void fd_add_cb(struct peer_info *peer, void *data);
166
167/* This one gives problems when included from the header file */
168void fd_log_va( int, const char *, va_list);
169void fd_log_deprecated( int level, const char *format, ... ) MARK_DEPRECATED
170{
171 va_list ap;
172 va_start(ap, format);
173 fd_log_va(level, format, ap);
174 va_end(ap);
175}
176
177%}
178
179/* Overwrite declaration to apply typemaps */
180int fd_sess_fromsid ( uint8_t * string, size_t len, struct session ** OUTPUT, int * BOOL_OUT);
181
182
183
184/*********************************************************
185 Now, create wrappers for (almost) all objects from fD API
186 *********************************************************/
187%include "freeDiameter/freeDiameter-host.h"
188%include "freeDiameter/libfdproto.h"
189%include "freeDiameter/libfdcore.h"
190
191/* Most of the functions from the API are not directly usable "as is".
192See the specific following files and the dbg_interactive.py.sample file
193for more usable python-style versions.
194*/
195
196%include "lists.i"
197%include "dictionary.i"
198%include "sessions.i"
199%include "routing.i"
200%include "messages.i"
201%include "dispatch.i"
202%include "queues.i"
203
204%include "peers.i"
205%include "events.i"
206%include "endpoints.i"
207%include "hooks.i"
208
209%include "posix.i"