ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
'''
+
+import os
+
#Try:
# - dig @localhost nlnetlabs.nl +ednsopt=65002:
# This query *could* be answered from cache. If so, unbound will reply
return True
+def inplace_query_response_callback(qstate, response, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
+ It will be called after receiving a reply from a backend server.
+
+ :param qstate: module qstate. opt_lists are available here;
+ :param response: struct dns_msg. The reply received from the backend server;
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release.
+ """
+ log_dns_msg(
+ "python: incoming reply from {}{}".format(qstate.reply.addr, os.linesep),
+ response.qinfo, response.rep
+ )
+ return True
+
+
+def inplace_edns_back_parsed_call(qstate, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
+ It will be called after EDNS is parsed on a reply from a backend server..
+
+ :param qstate: module qstate. opt_lists are available here;
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release.
+ """
+ log_info("python: edns parsed")
+ return True
+
+
def init_standard(id, env):
"""
New version of the init function.
if not register_inplace_cb_query(inplace_query_callback, env, id):
return False
+ # Register the inplace_edns_back_parsed_call function as an inplace callback
+ # for when a reply is received from a backend server.
+ if not register_inplace_cb_query_response(inplace_query_response_callback, env, id):
+ return False
+
+ # Register the inplace_edns_back_parsed_call function as an inplace callback
+ # for when EDNS is parsed on a reply from a backend server.
+ if not register_inplace_cb_edns_back_parsed_call(inplace_edns_back_parsed_call, env, id):
+ return False
+
return True
if (ret) Py_INCREF(py_cb);
return ret;
}
+
+ int python_inplace_cb_query_response(struct module_qstate* qstate,
+ struct dns_msg* response, int id, void* python_callback)
+ {
+ int res = 0;
+ PyObject *func = python_callback;
+
+ PyGILState_STATE gstate = PyGILState_Ensure();
+
+ PyObject *py_qstate = SWIG_NewPointerObj((void*) qstate, SWIGTYPE_p_module_qstate, 0);
+ PyObject *py_response = SWIG_NewPointerObj((void*) response, SWIGTYPE_p_dns_msg, 0);
+
+ PyObject *py_args = Py_BuildValue("(OO)", py_qstate, py_response);
+ PyObject *py_kwargs = Py_BuildValue("{}");
+ PyObject *result = PyObject_Call(func, py_args, py_kwargs);
+ if (result) {
+ res = PyInt_AsLong(result);
+ }
+
+ Py_XDECREF(py_qstate);
+ Py_XDECREF(py_response);
+
+ Py_XDECREF(py_args);
+ Py_XDECREF(py_kwargs);
+ Py_XDECREF(result);
+
+ PyGILState_Release(gstate);
+
+ return res;
+ }
+
+ static int register_inplace_cb_query_response(PyObject* py_cb,
+ struct module_env* env, int id)
+ {
+ int ret = inplace_cb_register(python_inplace_cb_query_response,
+ inplace_cb_query_response, (void*) py_cb, env, id);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
+
+ int python_inplace_cb_edns_back_parsed_call(struct module_qstate* qstate,
+ int id, void* python_callback)
+ {
+ int res = 0;
+ PyObject *func = python_callback;
+
+ PyGILState_STATE gstate = PyGILState_Ensure();
+
+ PyObject *py_qstate = SWIG_NewPointerObj((void*) qstate, SWIGTYPE_p_module_qstate, 0);
+
+ PyObject *py_args = Py_BuildValue("(O)", py_qstate);
+ PyObject *py_kwargs = Py_BuildValue("{}");
+ PyObject *result = PyObject_Call(func, py_args, py_kwargs);
+ if (result) {
+ res = PyInt_AsLong(result);
+ }
+
+ Py_XDECREF(py_qstate);
+
+ Py_XDECREF(py_args);
+ Py_XDECREF(py_kwargs);
+ Py_XDECREF(result);
+
+ PyGILState_Release(gstate);
+
+ return res;
+ }
+
+ static int register_inplace_cb_edns_back_parsed_call(PyObject* py_cb,
+ struct module_env* env, int id)
+ {
+ int ret = inplace_cb_register(python_inplace_cb_edns_back_parsed_call,
+ inplace_cb_edns_back_parsed, (void*) py_cb, env, id);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
%}
/* C declarations */
int inplace_cb_register(void* cb, enum inplace_cb_list_type type, void* cbarg,
struct module_env* env, int id);
static int register_inplace_cb_query(PyObject *py_cb,
struct module_env* env, int id);
+static int register_inplace_cb_query_response(PyObject *py_cb,
+ struct module_env* env, int id);
+static int register_inplace_cb_edns_back_parsed_call(PyObject *py_cb,
+ struct module_env* env, int id);
uint8_t* zone, size_t zonelen, struct regional* region, int id,
void* python_callback);
+/** Declared here for fptr_wlist access. The definition is in interface.i. */
+int python_inplace_cb_query_response(struct module_qstate* qstate,
+ struct dns_msg* response, int id, void* python_callback);
+
+/** Declared here for fptr_wlist access. The definition is in interface.i. */
+int python_inplace_cb_edns_back_parsed_call(struct module_qstate* qstate,
+ int id, void* python_callback);
+
#endif /* PYTHONMOD_H */