mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Fix bug#537: compile python plugin without ldns library.
git-svn-id: file:///svn/unbound/trunk@3016 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
b9efb261da
commit
3102a66ece
2 changed files with 85 additions and 55 deletions
|
|
@ -1,3 +1,6 @@
|
|||
13 Nov 2013: Wouter
|
||||
- Fix bug#537: compile python plugin without ldns library.
|
||||
|
||||
12 Nov 2013: Wouter
|
||||
- Fix bug#536: acl_deny_non_local and refuse_non_local added.
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,9 @@
|
|||
#include "util/storage/lruhash.h"
|
||||
#include "services/cache/dns.h"
|
||||
#include "services/mesh.h"
|
||||
#include "ldns/wire2str.h"
|
||||
#include "ldns/str2wire.h"
|
||||
#include "ldns/pkthdr.h"
|
||||
%}
|
||||
|
||||
%include "stdint.i" // uint_16_t can be known type now
|
||||
|
|
@ -164,11 +167,11 @@ struct query_info {
|
|||
|
||||
%extend query_info {
|
||||
%pythoncode %{
|
||||
def _get_qtype_str(self): return ldns_rr_type2str(self.qtype)
|
||||
def _get_qtype_str(self): return ldns_wire2str_type(self.qtype)
|
||||
__swig_getmethods__["qtype_str"] = _get_qtype_str
|
||||
if _newclass:qtype_str = _swig_property(_get_qtype_str)
|
||||
|
||||
def _get_qclass_str(self): return ldns_rr_class2str(self.qclass)
|
||||
def _get_qclass_str(self): return ldns_wire2str_class(self.qclass)
|
||||
__swig_getmethods__["qclass_str"] = _get_qclass_str
|
||||
if _newclass:qclass_str = _swig_property(_get_qclass_str)
|
||||
|
||||
|
|
@ -216,11 +219,11 @@ uint16_t ntohs(uint16_t netshort);
|
|||
|
||||
%extend packed_rrset_key {
|
||||
%pythoncode %{
|
||||
def _get_type_str(self): return ldns_rr_type2str(_unboundmodule.ntohs(self.type))
|
||||
def _get_type_str(self): return ldns_wire2str_type(_unboundmodule.ntohs(self.type))
|
||||
__swig_getmethods__["type_str"] = _get_type_str
|
||||
if _newclass:type_str = _swig_property(_get_type_str)
|
||||
|
||||
def _get_class_str(self): return ldns_rr_class2str(_unboundmodule.ntohs(self.rrset_class))
|
||||
def _get_class_str(self): return ldns_wire2str_class(_unboundmodule.ntohs(self.rrset_class))
|
||||
__swig_getmethods__["rrset_class_str"] = _get_class_str
|
||||
if _newclass:rrset_class_str = _swig_property(_get_class_str)
|
||||
|
||||
|
|
@ -721,6 +724,14 @@ enum verbosity_value {
|
|||
VERB_ALGO
|
||||
};
|
||||
|
||||
%constant uint16_t PKT_QR = 1; /* QueRy - query flag */
|
||||
%constant uint16_t PKT_AA = 2; /* Authoritative Answer - server flag */
|
||||
%constant uint16_t PKT_TC = 4; /* TrunCated - server flag */
|
||||
%constant uint16_t PKT_RD = 8; /* Recursion Desired - query flag */
|
||||
%constant uint16_t PKT_CD = 16; /* Checking Disabled - query flag */
|
||||
%constant uint16_t PKT_RA = 32; /* Recursion Available - server flag */
|
||||
%constant uint16_t PKT_AD = 64; /* Authenticated Data - server flag */
|
||||
|
||||
%{
|
||||
int checkList(PyObject *l)
|
||||
{
|
||||
|
|
@ -744,84 +755,100 @@ int checkList(PyObject *l)
|
|||
return 0;
|
||||
}
|
||||
|
||||
ldns_rr_list* createRRList(PyObject *l, uint32_t default_ttl)
|
||||
int pushRRList(ldns_buffer* qb, PyObject *l, uint32_t default_ttl, int qsec,
|
||||
size_t count_offset)
|
||||
{
|
||||
PyObject* item;
|
||||
ldns_status status;
|
||||
ldns_rr_list* rr_list;
|
||||
ldns_rr* rr;
|
||||
int i;
|
||||
|
||||
if (PyList_Size(l) == 0)
|
||||
return NULL;
|
||||
|
||||
rr_list = ldns_rr_list_new();
|
||||
size_t len;
|
||||
|
||||
for (i=0; i < PyList_Size(l); i++)
|
||||
{
|
||||
item = PyList_GetItem(l, i);
|
||||
|
||||
status = ldns_rr_new_frm_str(&rr, PyString_AsString(item), default_ttl, 0, 0);
|
||||
if (status != LDNS_STATUS_OK)
|
||||
continue;
|
||||
|
||||
if (!ldns_rr_list_push_rr(rr_list, rr))
|
||||
continue;
|
||||
|
||||
len = ldns_buffer_remaining(qb);
|
||||
if(qsec) {
|
||||
if(ldns_str2wire_rr_question_buf(PyString_AsString(item),
|
||||
ldns_buffer_current(qb), &len, NULL, NULL, 0, NULL, 0)
|
||||
!= 0)
|
||||
return 0;
|
||||
} else {
|
||||
if(ldns_str2wire_rr_buf(PyString_AsString(item),
|
||||
ldns_buffer_current(qb), &len, NULL, default_ttl,
|
||||
NULL, 0, NULL, 0) != 0)
|
||||
return 0;
|
||||
}
|
||||
return rr_list;
|
||||
ldns_buffer_skip(qb, len);
|
||||
|
||||
ldns_buffer_write_u16_at(qb, count_offset,
|
||||
ldns_buffer_read_u16_at(qb, count_offset)+1);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int set_return_msg(struct module_qstate* qstate,
|
||||
const char* rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class , uint16_t flags, uint32_t default_ttl,
|
||||
PyObject* question, PyObject* answer, PyObject* authority, PyObject* additional)
|
||||
{
|
||||
ldns_pkt* pkt = 0;
|
||||
ldns_status status;
|
||||
ldns_rr_list* rr_list = 0;
|
||||
ldns_buffer *qb = 0;
|
||||
int res = 1;
|
||||
size_t l;
|
||||
uint16_t PKT_QR = 1;
|
||||
uint16_t PKT_AA = 2;
|
||||
uint16_t PKT_TC = 4;
|
||||
uint16_t PKT_RD = 8;
|
||||
uint16_t PKT_CD = 16;
|
||||
uint16_t PKT_RA = 32;
|
||||
uint16_t PKT_AD = 64;
|
||||
|
||||
if ((!checkList(question)) || (!checkList(answer)) || (!checkList(authority)) || (!checkList(additional)))
|
||||
return 0;
|
||||
if ((qb = ldns_buffer_new(LDNS_RR_BUF_SIZE)) == 0) return 0;
|
||||
|
||||
status = ldns_pkt_query_new_frm_str(&pkt, rr_name, rr_type, rr_class, flags);
|
||||
if ((status != LDNS_STATUS_OK) || (pkt == 0))
|
||||
/* write header */
|
||||
ldns_buffer_write_u16(qb, 0); /* ID */
|
||||
ldns_buffer_write_u16(qb, 0); /* flags */
|
||||
ldns_buffer_write_u16(qb, 1); /* qdcount */
|
||||
ldns_buffer_write_u16(qb, 0); /* ancount */
|
||||
ldns_buffer_write_u16(qb, 0); /* nscount */
|
||||
ldns_buffer_write_u16(qb, 0); /* arcount */
|
||||
if ((flags&PKT_QR)) LDNS_QR_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_AA)) LDNS_AA_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_TC)) LDNS_TC_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_RD)) LDNS_RD_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_CD)) LDNS_CD_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_RA)) LDNS_RA_SET(ldns_buffer_begin(qb));
|
||||
if ((flags&PKT_AD)) LDNS_AD_SET(ldns_buffer_begin(qb));
|
||||
|
||||
/* write the query */
|
||||
l = ldns_buffer_remaining(qb);
|
||||
if(ldns_str2wire_dname_buf(rr_name, ldns_buffer_current(qb), &l) != 0) {
|
||||
ldns_buffer_free(qb);
|
||||
return 0;
|
||||
}
|
||||
ldns_buffer_skip(qb, l);
|
||||
if (rr_type == 0) { rr_type = LDNS_RR_TYPE_A; }
|
||||
if (rr_class == 0) { rr_class = LDNS_RR_CLASS_IN; }
|
||||
ldns_buffer_write_u16(qb, rr_type);
|
||||
ldns_buffer_write_u16(qb, rr_class);
|
||||
|
||||
rr_list = createRRList(question, default_ttl);
|
||||
if ((rr_list) && (res)) res = ldns_pkt_push_rr_list(pkt, LDNS_SECTION_QUESTION, rr_list);
|
||||
ldns_rr_list_free(rr_list);
|
||||
rr_list = createRRList(answer, default_ttl);
|
||||
if ((rr_list) && (res)) res = ldns_pkt_push_rr_list(pkt, LDNS_SECTION_ANSWER, rr_list);
|
||||
ldns_rr_list_free(rr_list);
|
||||
rr_list = createRRList(authority, default_ttl);
|
||||
if ((rr_list) && (res)) res = ldns_pkt_push_rr_list(pkt, LDNS_SECTION_AUTHORITY, rr_list);
|
||||
ldns_rr_list_free(rr_list);
|
||||
rr_list = createRRList(additional, default_ttl);
|
||||
if ((rr_list) && (res)) res = ldns_pkt_push_rr_list(pkt, LDNS_SECTION_ADDITIONAL, rr_list);
|
||||
ldns_rr_list_free(rr_list);
|
||||
|
||||
if ((res) && ((qb = ldns_buffer_new(LDNS_MIN_BUFLEN)) == 0)) res = 0;
|
||||
if ((res) && (ldns_pkt2buffer_wire(qb, pkt) != LDNS_STATUS_OK)) res = 0;
|
||||
/* write RR sections */
|
||||
if(res && !pushRRList(qb, question, default_ttl, 1, LDNS_QDCOUNT_OFF))
|
||||
res = 0;
|
||||
if(res && !pushRRList(qb, answer, default_ttl, 0, LDNS_ANCOUNT_OFF))
|
||||
res = 0;
|
||||
if(res && !pushRRList(qb, authority, default_ttl, 0, LDNS_NSCOUNT_OFF))
|
||||
res = 0;
|
||||
if(res && !pushRRList(qb, additional, default_ttl, 0, LDNS_ARCOUNT_OFF))
|
||||
res = 0;
|
||||
|
||||
if (res) res = createResponse(qstate, qb);
|
||||
|
||||
if (qb) ldns_buffer_free(qb);
|
||||
|
||||
ldns_pkt_free(pkt); //this function dealocates pkt as well as rrs
|
||||
return res;
|
||||
}
|
||||
%}
|
||||
|
||||
%constant uint16_t PKT_QR = 1; /* QueRy - query flag */
|
||||
%constant uint16_t PKT_AA = 2; /* Authoritative Answer - server flag */
|
||||
%constant uint16_t PKT_TC = 4; /* TrunCated - server flag */
|
||||
%constant uint16_t PKT_RD = 8; /* Recursion Desired - query flag */
|
||||
%constant uint16_t PKT_CD = 16; /* Checking Disabled - query flag */
|
||||
%constant uint16_t PKT_RA = 32; /* Recursion Available - server flag */
|
||||
%constant uint16_t PKT_AD = 64; /* Authenticated Data - server flag */
|
||||
|
||||
int set_return_msg(struct module_qstate* qstate,
|
||||
const char* rr_name, int rr_type, int rr_class , uint16_t flags, uint32_t default_ttl,
|
||||
PyObject* question, PyObject* answer, PyObject* authority, PyObject* additional);
|
||||
|
|
@ -872,12 +899,12 @@ void regional_log_stats(struct regional *r);
|
|||
}
|
||||
|
||||
// Mark as source returning newly allocated memory
|
||||
%newobject ldns_rr_type2str;
|
||||
%newobject ldns_rr_class2str;
|
||||
%newobject ldns_wire2str_type;
|
||||
%newobject ldns_wire2str_class;
|
||||
|
||||
// LDNS functions
|
||||
char *ldns_rr_type2str(const uint16_t atype);
|
||||
char *ldns_rr_class2str(const uint16_t aclass);
|
||||
char *ldns_wire2str_type(const uint16_t atype);
|
||||
char *ldns_wire2str_class(const uint16_t aclass);
|
||||
|
||||
// Functions from pythonmod_utils
|
||||
int storeQueryInCache(struct module_qstate* qstate, struct query_info* qinfo, struct reply_info* msgrep, int is_referral);
|
||||
|
|
|
|||
Loading…
Reference in a new issue