Newer
Older
# Run with "ninja kres-gen" to re-generate kres-gen.lua
set -o pipefail -o errexit -o nounset
cd "$(dirname ${0})"
CDEFS="../../scripts/gen-cdefs.sh"
LIBKRES="${MESON_BUILD_ROOT}/lib/libkres.so"
KRESD="${MESON_BUILD_ROOT}/daemon/kresd"
if [ ! -e "$LIBKRES" ]; then
# We probably use static libkres.
LIBKRES="$KRESD"
fi
for REQFILE in "$CDEFS" "$LIBKRES" "$KRESD"
do
test '!' -s "$REQFILE" -a -r "$REQFILE" \
&& echo "Required file $REQFILE cannot be read, did you build binaries and shared libraries?" \
&& exit 1
done
# Write to kres-gen.lua instead of stdout
mv kres-gen.lua{,.bak} ||:
exec 5<&1- # move stdout into FD 5
exec 1<>kres-gen.lua # replace stdout with file
exec 1>&- # close stdout redirected into kres-gen.lua
exec 1<&5- # restore original stdout
mv -v kres-gen.lua{,.fail} ||:
mv -v kres-gen.lua{.bak,} ||:
(>&2 echo "Failed to re-generate kres-gen.lua! Missing debugsymbols? Missing shared library?")
trap restore ERR INT TERM
### Dev's guide
#
# C declarations for lua are (mostly) generated to simplify maintenance.
# (Avoid typos, accidental mismatches, etc.)
#
# To regenerate the C definitions for lua:
# - you need to have debugging symbols for knot-dns and knot-resolver;
# you get those by compiling with -g; for knot-dns it might be enough
# to just install it with debugging symbols included (in your distro way)
# - the knot-dns libraries are found via pkg-config
# - you also need gdb on $PATH
printf -- "local ffi = require('ffi')\n"
printf -- "--[[ This file is generated by ./kres-gen.sh ]] ffi.cdef[[\n"
## Various types (mainly), from libknot and libkres
typedef struct knot_dump_style knot_dump_style_t;
extern const knot_dump_style_t KNOT_DUMP_STYLE_DEFAULT;
typedef void knot_db_t;
struct kr_cdb_api {};
"
# The generator doesn't work well with typedefs of functions.
typedef struct knot_mm {
void *ctx, *alloc, *free;
} knot_mm_t;
typedef void *(*map_alloc_f)(void *, size_t);
typedef void (*map_free_f)(void *baton, void *ptr);
typedef void (*trace_log_f) (const struct kr_query *, const char *, const char *);
typedef void (*trace_callback_f)(struct kr_request *);
${CDEFS} ${LIBKRES} types <<-EOF
knot_section_t
knot_rrinfo_t
knot_dname_t
#knot_rdata_t
#knot_rdataset_t
echo "$1" | ${CDEFS} ${LIBKRES} types
}
# No simple way to fixup this rename in ./kres.lua AFAIK.
genResType "knot_rrset_t" | sed 's/\<owner\>/_owner/; s/\<ttl\>/_ttl/'
printf "
struct kr_module;
typedef char *(kr_prop_cb)(void *, struct kr_module *, const char *);
"
${CDEFS} ${LIBKRES} types <<-EOF
struct ranked_rr_array_entry
ranked_rr_array_entry_t
ranked_rr_array_t
struct kr_zonecut
kr_qarray_t
struct kr_rplan
struct kr_request_qsource_flags
kr_layer_t
struct kr_layer_api
kr_layer_api_t
# lib/module.h
struct kr_prop
struct kr_module
printf "
typedef int32_t (*kr_stale_cb)(int32_t ttl, const knot_dname_t *owner, uint16_t type,
const struct kr_query *qry);
void kr_rrset_init(knot_rrset_t *rrset, knot_dname_t *owner,
uint16_t type, uint16_t rclass, uint32_t ttl);
"
## Some definitions would need too many deps, so shorten them.
genResType "struct kr_nsrep" | sed '/union/,$ d'
printf "\t/* beware: hidden stub, to avoid hardcoding sockaddr lengths */\n};\n"
genResType "struct kr_context" | sed '/kr_nsrep_rtt_lru_t/,$ d'
${CDEFS} libknot functions <<-EOF
knot_dname_copy
knot_dname_is_equal
knot_dname_labels
knot_dname_size
knot_dname_to_str
# Resource records
knot_rdataset_at
knot_rrset_size
# Packet
knot_pkt_begin
knot_pkt_put_question
knot_pkt_new
knot_pkt_free
knot_pkt_parse
${CDEFS} ${LIBKRES} functions <<-EOF
# Resolution request
kr_resolve_plan
kr_resolve_pool
# Resolution plan
kr_rplan_push
kr_rplan_pop
kr_rplan_resolved
# Nameservers
kr_nsrep_set
# Utils
kr_log_qverbose_impl
kr_make_query
kr_rrsig_sig_inception
kr_rrsig_sig_expiration
kr_inaddr
kr_inaddr_family
kr_inaddr_len
kr_sockaddr_len
kr_straddr_family
kr_straddr_subnet
kr_bitcmp
kr_family_len
kr_straddr_split
kr_ranked_rrarray_add
kr_qflags_set
kr_qflags_clear
kr_zonecut_is_empty
lru_free_items_impl
lru_create_impl
lru_get_impl
# Trust anchors
kr_ta_get
kr_ta_add
kr_ta_del
kr_ta_clear
# DNSSEC
kr_dnssec_key_ksk
kr_dnssec_key_revoked
kr_dnssec_key_tag
kr_dnssec_key_match
kr_cache_insert_rr
kr_cache_remove
kr_cache_remove_subtree
# FIXME: perhaps rename this exported symbol
packet_ttl
## kresd itself: worker stuff
${CDEFS} ${KRESD} types <<-EOF
endpoint_flags_t
EOF
echo "struct endpoint" | ${CDEFS} ${KRESD} types | sed 's/uv_handle_t \*/void */'
echo "struct request_ctx" | ${CDEFS} ${KRESD} types | sed '/struct {/,$ d'
printf "\t/* beware: hidden stub, to avoid hardcoding sockaddr lengths */\n};\n"
echo "struct qr_task" | ${CDEFS} ${KRESD} types | sed '/pktbuf/,$ d'
printf "\t/* beware: hidden stub, to avoid qr_tasklist_t */\n};\n"
${CDEFS} ${KRESD} functions <<-EOF
worker_resolve_exec
worker_resolve_mk_pkt
worker_resolve_start
EOF
## libzscanner API for ./zonefile.lua
${CDEFS} libzscanner types <<-EOF
zs_win_t
zs_apl_t
zs_loc_t
zs_state_t
zs_scanner_t
struct zs_scanner
EOF
${CDEFS} libzscanner functions <<-EOF
zs_deinit
zs_init
zs_parse_record
zs_set_input_file
zs_set_input_string
zs_strerror
EOF
rm kres-gen.lua.bak ||:
(>&2 echo "Successfully re-generated ${PWD}/kres-gen.lua")