Data Structures | Enumerations | Functions
context.h File Reference

This file contains the validator context structure. More...

#include "util/locks.h"
#include "util/alloc.h"
#include "util/rbtree.h"
#include "services/modstack.h"
#include "libunbound/unbound.h"
#include "util/data/packed_rrset.h"

Data Structures

struct  ub_ctx
 The context structure. More...
 
struct  ctx_query
 The queries outstanding for the libunbound resolver. More...
 

Enumerations

enum  ub_ctx_err {
  UB_NOERROR = 0, UB_SOCKET = -1, UB_NOMEM = -2, UB_SYNTAX = -3,
  UB_SERVFAIL = -4, UB_FORKFAIL = -5, UB_AFTERFINAL = -6, UB_INITFAIL = -7,
  UB_PIPE = -8, UB_READFILE = -9, UB_NOID = -10
}
 The error constants. More...
 
enum  ub_ctx_cmd { UB_LIBCMD_QUIT = 0, UB_LIBCMD_NEWQUERY, UB_LIBCMD_CANCEL, UB_LIBCMD_ANSWER }
 Command codes for libunbound pipe. More...
 

Functions

int context_finalize (struct ub_ctx *ctx)
 finalize a context. More...
 
int context_query_cmp (const void *a, const void *b)
 compare two ctx_query elements
 
void context_query_delete (struct ctx_query *q)
 delete context query More...
 
struct ctx_querycontext_new (struct ub_ctx *ctx, const char *name, int rrtype, int rrclass, ub_callback_t cb, void *cbarg)
 Create new query in context, add to querynum list. More...
 
struct alloc_cachecontext_obtain_alloc (struct ub_ctx *ctx, int locking)
 Get a new alloc. More...
 
void context_release_alloc (struct ub_ctx *ctx, struct alloc_cache *alloc, int locking)
 Release an alloc. More...
 
uint8_t * context_serialize_new_query (struct ctx_query *q, uint32_t *len)
 Serialize a context query that questions data. More...
 
uint8_t * context_serialize_answer (struct ctx_query *q, int err, struct sldns_buffer *pkt, uint32_t *len)
 Serialize a context_query result to hand back to user. More...
 
uint8_t * context_serialize_cancel (struct ctx_query *q, uint32_t *len)
 Serialize a query cancellation. More...
 
uint8_t * context_serialize_quit (uint32_t *len)
 Serialize a 'quit' command. More...
 
enum ub_ctx_cmd context_serial_getcmd (uint8_t *p, uint32_t len)
 Obtain command code from serialized buffer. More...
 
struct ctx_querycontext_lookup_new_query (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Lookup query from new_query buffer. More...
 
struct ctx_querycontext_deserialize_new_query (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Deserialize a new_query buffer. More...
 
struct ctx_querycontext_deserialize_answer (struct ub_ctx *ctx, uint8_t *p, uint32_t len, int *err)
 Deserialize an answer buffer. More...
 
struct ctx_querycontext_deserialize_cancel (struct ub_ctx *ctx, uint8_t *p, uint32_t len)
 Deserialize a cancel buffer. More...
 

Detailed Description

This file contains the validator context structure.

Enumeration Type Documentation

enum ub_ctx_err

The error constants.

Enumerator
UB_NOERROR 

no error

UB_SOCKET 

socket operation.

Set to -1, so that if an error from _fd() is passed (-1) it gives a socket error.

UB_NOMEM 

alloc failure

UB_SYNTAX 

syntax error

UB_SERVFAIL 

DNS service failed.

UB_FORKFAIL 

fork() failed

UB_AFTERFINAL 

cfg change after finalize()

UB_INITFAIL 

initialization failed (bad settings)

UB_PIPE 

error in pipe communication with async bg worker

UB_READFILE 

error reading from file (resolv.conf)

UB_NOID 

error async_id does not exist or result already been delivered

enum ub_ctx_cmd

Command codes for libunbound pipe.

Serialization looks like this: o length (of remainder) uint32. o uint32 command code. o per command format.

Enumerator
UB_LIBCMD_QUIT 

QUIT.

UB_LIBCMD_NEWQUERY 

New query, sent to bg worker.

UB_LIBCMD_CANCEL 

Cancel query, sent to bg worker.

UB_LIBCMD_ANSWER 

Query result, originates from bg worker.

Function Documentation

int context_finalize ( struct ub_ctx ctx)
void context_query_delete ( struct ctx_query q)

delete context query

Parameters
qquery to delete, including message packet and prealloc result

References ctx_query::msg, ctx_query::res, and ub_resolve_free().

Referenced by add_bg_result(), delq(), libworker_bg_done_cb(), libworker_event_done_cb(), process_answer_detail(), ub_cancel(), ub_resolve(), and ub_resolve_async().

struct ctx_query* context_new ( struct ub_ctx ctx,
const char *  name,
int  rrtype,
int  rrclass,
ub_callback_t  cb,
void *  cbarg 
)

Create new query in context, add to querynum list.

Parameters
ctxcontext
namequery name
rrtypetype
rrclassclass
cbcallback for async, or NULL for sync.
cbarguser arg for async queries.
Returns
new ctx_query or NULL for malloc failure.

References ctx_query::async, ctx_query::cb, ctx_query::cb_arg, ub_ctx::cfglock, find_id(), rbnode_t::key, ctx_query::node, ub_ctx::num_async, ub_result::qclass, ub_result::qname, ub_result::qtype, ub_ctx::queries, ctx_query::querynum, rbtree_insert(), and ctx_query::res.

Referenced by ub_resolve(), ub_resolve_async(), and ub_resolve_event().

struct alloc_cache* context_obtain_alloc ( struct ub_ctx ctx,
int  locking 
)

Get a new alloc.

Creates a new one or uses a cached one.

Parameters
ctxcontext
lockingif true, cfglock is locked while getting alloc.
Returns
an alloc, or NULL on mem error.

References alloc_init(), ub_ctx::alloc_list, ub_ctx::cfglock, alloc_cache::super, ub_ctx::superalloc, and ub_ctx::thr_next_num.

Referenced by libworker_setup().

void context_release_alloc ( struct ub_ctx ctx,
struct alloc_cache alloc,
int  locking 
)

Release an alloc.

Puts it into the cache.

Parameters
ctxcontext
lockingif true, cfglock is locked while releasing alloc.
allocalloc to relinquish.

References ub_ctx::alloc_list, ub_ctx::cfglock, and alloc_cache::super.

Referenced by libworker_delete_env().

uint8_t* context_serialize_new_query ( struct ctx_query q,
uint32_t *  len 
)

Serialize a context query that questions data.

This serializes the query name, type, ... As well as command code 'new_query'.

Parameters
qcontext query
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References ub_result::qclass, ub_result::qname, ub_result::qtype, ctx_query::querynum, ctx_query::res, and UB_LIBCMD_NEWQUERY.

Referenced by ub_resolve_async().

uint8_t* context_serialize_answer ( struct ctx_query q,
int  err,
struct sldns_buffer pkt,
uint32_t *  len 
)

Serialize a context_query result to hand back to user.

This serializes the query name, type, ..., and result. As well as command code 'answer'.

Parameters
qcontext query
errerror code to pass to client.
pktthe packet to add, can be NULL.
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References ctx_query::msg_security, ctx_query::querynum, ctx_query::res, sldns_buffer_begin(), sldns_buffer_remaining(), UB_LIBCMD_ANSWER, and ub_result::why_bogus.

Referenced by add_bg_result().

uint8_t* context_serialize_cancel ( struct ctx_query q,
uint32_t *  len 
)

Serialize a query cancellation.

Serializes query async id as well as command code 'cancel'

Parameters
qcontext query
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References ctx_query::querynum, and UB_LIBCMD_CANCEL.

Referenced by ub_cancel().

uint8_t* context_serialize_quit ( uint32_t *  len)

Serialize a 'quit' command.

Parameters
lenthe length of the allocation is returned.
Returns
: an alloc, or NULL on mem error.

References UB_LIBCMD_QUIT.

enum ub_ctx_cmd context_serial_getcmd ( uint8_t *  p,
uint32_t  len 
)

Obtain command code from serialized buffer.

Parameters
pbuffer serialized.
lenlength of buffer.
Returns
command code or QUIT on error.

References UB_LIBCMD_QUIT.

Referenced by libworker_do_cmd(), process_answer_detail(), and ub_stop_bg().

struct ctx_query* context_lookup_new_query ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Lookup query from new_query buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
looked up ctx_query or NULL for malloc failure.

References ctx_query::async, log_assert, ub_ctx::queries, ctx_query::querynum, rbtree_search(), and UB_LIBCMD_NEWQUERY.

Referenced by handle_newq().

struct ctx_query* context_deserialize_new_query ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Deserialize a new_query buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
new ctx_query or NULL for malloc failure.

add to query list

References ctx_query::async, rbnode_t::key, log_assert, ctx_query::node, ub_ctx::num_async, ub_result::qclass, ub_result::qname, ub_result::qtype, ub_ctx::queries, ctx_query::querynum, rbtree_insert(), ctx_query::res, and UB_LIBCMD_NEWQUERY.

Referenced by handle_newq().

struct ctx_query* context_deserialize_answer ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len,
int *  err 
)

Deserialize an answer buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
errerror code to be returned to client is passed.
Returns
ctx_query with answer added or NULL for malloc failure.

References log_assert, memdup(), ctx_query::msg, ctx_query::msg_len, ctx_query::msg_security, ub_ctx::queries, rbtree_search(), ctx_query::res, UB_LIBCMD_ANSWER, UB_NOMEM, and ub_result::why_bogus.

Referenced by process_answer_detail().

struct ctx_query* context_deserialize_cancel ( struct ub_ctx ctx,
uint8_t *  p,
uint32_t  len 
)

Deserialize a cancel buffer.

Parameters
ctxcontext
pbuffer serialized.
lenlength of buffer.
Returns
ctx_query to cancel or NULL for failure.

References log_assert, ub_ctx::queries, rbtree_search(), and UB_LIBCMD_CANCEL.

Referenced by handle_cancel().