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
q,:query 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 
)
read

Create new query in context, add to querynum list.

Parameters
ctx,:context
name,:query name
rrtype,:type
rrclass,:class
cb,:callback for async, or NULL for sync.
cbarg,:user 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 
)
read

Get a new alloc.

Creates a new one or uses a cached one.

Parameters
ctx,:context
locking,:if 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
ctx,:context
locking,:if true, cfglock is locked while releasing alloc.
alloc,:alloc 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
q,:context query
len,:the 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
q,:context query
err,:error code to pass to client.
pkt,:the packet to add, can be NULL.
len,:the 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
q,:context query
len,:the 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
len,:the 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
p,:buffer serialized.
len,:length 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 
)
read

Lookup query from new_query buffer.

Parameters
ctx,:context
p,:buffer serialized.
len,:length 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 
)
read

Deserialize a new_query buffer.

Parameters
ctx,:context
p,:buffer serialized.
len,:length 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 
)
read

Deserialize an answer buffer.

Parameters
ctx,:context
p,:buffer serialized.
len,:length of buffer.
err,:error 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 
)
read

Deserialize a cancel buffer.

Parameters
ctx,:context
p,:buffer serialized.
len,:length 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().