1*b7579f77SDag-Erling Smørgrav /* 2*b7579f77SDag-Erling Smørgrav * util/config_file.h - reads and stores the config file for unbound. 3*b7579f77SDag-Erling Smørgrav * 4*b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5*b7579f77SDag-Erling Smørgrav * 6*b7579f77SDag-Erling Smørgrav * This software is open source. 7*b7579f77SDag-Erling Smørgrav * 8*b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9*b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10*b7579f77SDag-Erling Smørgrav * are met: 11*b7579f77SDag-Erling Smørgrav * 12*b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13*b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14*b7579f77SDag-Erling Smørgrav * 15*b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16*b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17*b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18*b7579f77SDag-Erling Smørgrav * 19*b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20*b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21*b7579f77SDag-Erling Smørgrav * specific prior written permission. 22*b7579f77SDag-Erling Smørgrav * 23*b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24*b7579f77SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 25*b7579f77SDag-Erling Smørgrav * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26*b7579f77SDag-Erling Smørgrav * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 27*b7579f77SDag-Erling Smørgrav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28*b7579f77SDag-Erling Smørgrav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29*b7579f77SDag-Erling Smørgrav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30*b7579f77SDag-Erling Smørgrav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31*b7579f77SDag-Erling Smørgrav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32*b7579f77SDag-Erling Smørgrav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33*b7579f77SDag-Erling Smørgrav * POSSIBILITY OF SUCH DAMAGE. 34*b7579f77SDag-Erling Smørgrav */ 35*b7579f77SDag-Erling Smørgrav 36*b7579f77SDag-Erling Smørgrav /** 37*b7579f77SDag-Erling Smørgrav * \file 38*b7579f77SDag-Erling Smørgrav * 39*b7579f77SDag-Erling Smørgrav * This file contains functions for the config file. 40*b7579f77SDag-Erling Smørgrav */ 41*b7579f77SDag-Erling Smørgrav 42*b7579f77SDag-Erling Smørgrav #ifndef UTIL_CONFIG_FILE_H 43*b7579f77SDag-Erling Smørgrav #define UTIL_CONFIG_FILE_H 44*b7579f77SDag-Erling Smørgrav struct config_stub; 45*b7579f77SDag-Erling Smørgrav struct config_strlist; 46*b7579f77SDag-Erling Smørgrav struct config_str2list; 47*b7579f77SDag-Erling Smørgrav struct module_qstate; 48*b7579f77SDag-Erling Smørgrav struct sock_list; 49*b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key; 50*b7579f77SDag-Erling Smørgrav 51*b7579f77SDag-Erling Smørgrav /** 52*b7579f77SDag-Erling Smørgrav * The configuration options. 53*b7579f77SDag-Erling Smørgrav * Strings are malloced. 54*b7579f77SDag-Erling Smørgrav */ 55*b7579f77SDag-Erling Smørgrav struct config_file { 56*b7579f77SDag-Erling Smørgrav /** verbosity level as specified in the config file */ 57*b7579f77SDag-Erling Smørgrav int verbosity; 58*b7579f77SDag-Erling Smørgrav 59*b7579f77SDag-Erling Smørgrav /** statistics interval (in seconds) */ 60*b7579f77SDag-Erling Smørgrav int stat_interval; 61*b7579f77SDag-Erling Smørgrav /** if false, statistics values are reset after printing them */ 62*b7579f77SDag-Erling Smørgrav int stat_cumulative; 63*b7579f77SDag-Erling Smørgrav /** if true, the statistics are kept in greater detail */ 64*b7579f77SDag-Erling Smørgrav int stat_extended; 65*b7579f77SDag-Erling Smørgrav 66*b7579f77SDag-Erling Smørgrav /** number of threads to create */ 67*b7579f77SDag-Erling Smørgrav int num_threads; 68*b7579f77SDag-Erling Smørgrav 69*b7579f77SDag-Erling Smørgrav /** port on which queries are answered. */ 70*b7579f77SDag-Erling Smørgrav int port; 71*b7579f77SDag-Erling Smørgrav /** do ip4 query support. */ 72*b7579f77SDag-Erling Smørgrav int do_ip4; 73*b7579f77SDag-Erling Smørgrav /** do ip6 query support. */ 74*b7579f77SDag-Erling Smørgrav int do_ip6; 75*b7579f77SDag-Erling Smørgrav /** do udp query support. */ 76*b7579f77SDag-Erling Smørgrav int do_udp; 77*b7579f77SDag-Erling Smørgrav /** do tcp query support. */ 78*b7579f77SDag-Erling Smørgrav int do_tcp; 79*b7579f77SDag-Erling Smørgrav /** tcp upstream queries (no UDP upstream queries) */ 80*b7579f77SDag-Erling Smørgrav int tcp_upstream; 81*b7579f77SDag-Erling Smørgrav 82*b7579f77SDag-Erling Smørgrav /** private key file for dnstcp-ssl service (enabled if not NULL) */ 83*b7579f77SDag-Erling Smørgrav char* ssl_service_key; 84*b7579f77SDag-Erling Smørgrav /** public key file for dnstcp-ssl service */ 85*b7579f77SDag-Erling Smørgrav char* ssl_service_pem; 86*b7579f77SDag-Erling Smørgrav /** port on which to provide ssl service */ 87*b7579f77SDag-Erling Smørgrav int ssl_port; 88*b7579f77SDag-Erling Smørgrav /** if outgoing tcp connections use SSL */ 89*b7579f77SDag-Erling Smørgrav int ssl_upstream; 90*b7579f77SDag-Erling Smørgrav 91*b7579f77SDag-Erling Smørgrav /** outgoing port range number of ports (per thread) */ 92*b7579f77SDag-Erling Smørgrav int outgoing_num_ports; 93*b7579f77SDag-Erling Smørgrav /** number of outgoing tcp buffers per (per thread) */ 94*b7579f77SDag-Erling Smørgrav size_t outgoing_num_tcp; 95*b7579f77SDag-Erling Smørgrav /** number of incoming tcp buffers per (per thread) */ 96*b7579f77SDag-Erling Smørgrav size_t incoming_num_tcp; 97*b7579f77SDag-Erling Smørgrav /** allowed udp port numbers, array with 0 if not allowed */ 98*b7579f77SDag-Erling Smørgrav int* outgoing_avail_ports; 99*b7579f77SDag-Erling Smørgrav 100*b7579f77SDag-Erling Smørgrav /** EDNS buffer size to use */ 101*b7579f77SDag-Erling Smørgrav size_t edns_buffer_size; 102*b7579f77SDag-Erling Smørgrav /** number of bytes buffer size for DNS messages */ 103*b7579f77SDag-Erling Smørgrav size_t msg_buffer_size; 104*b7579f77SDag-Erling Smørgrav /** size of the message cache */ 105*b7579f77SDag-Erling Smørgrav size_t msg_cache_size; 106*b7579f77SDag-Erling Smørgrav /** slabs in the message cache. */ 107*b7579f77SDag-Erling Smørgrav size_t msg_cache_slabs; 108*b7579f77SDag-Erling Smørgrav /** number of queries every thread can service */ 109*b7579f77SDag-Erling Smørgrav size_t num_queries_per_thread; 110*b7579f77SDag-Erling Smørgrav /** number of msec to wait before items can be jostled out */ 111*b7579f77SDag-Erling Smørgrav size_t jostle_time; 112*b7579f77SDag-Erling Smørgrav /** size of the rrset cache */ 113*b7579f77SDag-Erling Smørgrav size_t rrset_cache_size; 114*b7579f77SDag-Erling Smørgrav /** slabs in the rrset cache */ 115*b7579f77SDag-Erling Smørgrav size_t rrset_cache_slabs; 116*b7579f77SDag-Erling Smørgrav /** host cache ttl in seconds */ 117*b7579f77SDag-Erling Smørgrav int host_ttl; 118*b7579f77SDag-Erling Smørgrav /** number of slabs in the infra host cache */ 119*b7579f77SDag-Erling Smørgrav size_t infra_cache_slabs; 120*b7579f77SDag-Erling Smørgrav /** max number of hosts in the infra cache */ 121*b7579f77SDag-Erling Smørgrav size_t infra_cache_numhosts; 122*b7579f77SDag-Erling Smørgrav 123*b7579f77SDag-Erling Smørgrav /** the target fetch policy for the iterator */ 124*b7579f77SDag-Erling Smørgrav char* target_fetch_policy; 125*b7579f77SDag-Erling Smørgrav 126*b7579f77SDag-Erling Smørgrav /** automatic interface for incoming messages. Uses ipv6 remapping, 127*b7579f77SDag-Erling Smørgrav * and recvmsg/sendmsg ancillary data to detect interfaces, boolean */ 128*b7579f77SDag-Erling Smørgrav int if_automatic; 129*b7579f77SDag-Erling Smørgrav /** SO_RCVBUF size to set on port 53 UDP socket */ 130*b7579f77SDag-Erling Smørgrav size_t so_rcvbuf; 131*b7579f77SDag-Erling Smørgrav /** SO_SNDBUF size to set on port 53 UDP socket */ 132*b7579f77SDag-Erling Smørgrav size_t so_sndbuf; 133*b7579f77SDag-Erling Smørgrav 134*b7579f77SDag-Erling Smørgrav /** number of interfaces to open. If 0 default all interfaces. */ 135*b7579f77SDag-Erling Smørgrav int num_ifs; 136*b7579f77SDag-Erling Smørgrav /** interface description strings (IP addresses) */ 137*b7579f77SDag-Erling Smørgrav char **ifs; 138*b7579f77SDag-Erling Smørgrav 139*b7579f77SDag-Erling Smørgrav /** number of outgoing interfaces to open. 140*b7579f77SDag-Erling Smørgrav * If 0 default all interfaces. */ 141*b7579f77SDag-Erling Smørgrav int num_out_ifs; 142*b7579f77SDag-Erling Smørgrav /** outgoing interface description strings (IP addresses) */ 143*b7579f77SDag-Erling Smørgrav char **out_ifs; 144*b7579f77SDag-Erling Smørgrav 145*b7579f77SDag-Erling Smørgrav /** the root hints */ 146*b7579f77SDag-Erling Smørgrav struct config_strlist* root_hints; 147*b7579f77SDag-Erling Smørgrav /** the stub definitions, linked list */ 148*b7579f77SDag-Erling Smørgrav struct config_stub* stubs; 149*b7579f77SDag-Erling Smørgrav /** the forward zone definitions, linked list */ 150*b7579f77SDag-Erling Smørgrav struct config_stub* forwards; 151*b7579f77SDag-Erling Smørgrav /** list of donotquery addresses, linked list */ 152*b7579f77SDag-Erling Smørgrav struct config_strlist* donotqueryaddrs; 153*b7579f77SDag-Erling Smørgrav /** list of access control entries, linked list */ 154*b7579f77SDag-Erling Smørgrav struct config_str2list* acls; 155*b7579f77SDag-Erling Smørgrav /** use default localhost donotqueryaddr entries */ 156*b7579f77SDag-Erling Smørgrav int donotquery_localhost; 157*b7579f77SDag-Erling Smørgrav 158*b7579f77SDag-Erling Smørgrav /** harden against very small edns buffer sizes */ 159*b7579f77SDag-Erling Smørgrav int harden_short_bufsize; 160*b7579f77SDag-Erling Smørgrav /** harden against very large query sizes */ 161*b7579f77SDag-Erling Smørgrav int harden_large_queries; 162*b7579f77SDag-Erling Smørgrav /** harden against spoofed glue (out of zone data) */ 163*b7579f77SDag-Erling Smørgrav int harden_glue; 164*b7579f77SDag-Erling Smørgrav /** harden against receiving no DNSSEC data for trust anchor */ 165*b7579f77SDag-Erling Smørgrav int harden_dnssec_stripped; 166*b7579f77SDag-Erling Smørgrav /** harden against queries that fall under known nxdomain names */ 167*b7579f77SDag-Erling Smørgrav int harden_below_nxdomain; 168*b7579f77SDag-Erling Smørgrav /** harden the referral path, query for NS,A,AAAA and validate */ 169*b7579f77SDag-Erling Smørgrav int harden_referral_path; 170*b7579f77SDag-Erling Smørgrav /** use 0x20 bits in query as random ID bits */ 171*b7579f77SDag-Erling Smørgrav int use_caps_bits_for_id; 172*b7579f77SDag-Erling Smørgrav /** strip away these private addrs from answers, no DNS Rebinding */ 173*b7579f77SDag-Erling Smørgrav struct config_strlist* private_address; 174*b7579f77SDag-Erling Smørgrav /** allow domain (and subdomains) to use private address space */ 175*b7579f77SDag-Erling Smørgrav struct config_strlist* private_domain; 176*b7579f77SDag-Erling Smørgrav /** what threshold for unwanted action. */ 177*b7579f77SDag-Erling Smørgrav size_t unwanted_threshold; 178*b7579f77SDag-Erling Smørgrav /** the number of seconds maximal TTL used for RRsets and messages */ 179*b7579f77SDag-Erling Smørgrav int max_ttl; 180*b7579f77SDag-Erling Smørgrav /** the number of seconds minimum TTL used for RRsets and messages */ 181*b7579f77SDag-Erling Smørgrav int min_ttl; 182*b7579f77SDag-Erling Smørgrav /** if prefetching of messages should be performed. */ 183*b7579f77SDag-Erling Smørgrav int prefetch; 184*b7579f77SDag-Erling Smørgrav /** if prefetching of DNSKEYs should be performed. */ 185*b7579f77SDag-Erling Smørgrav int prefetch_key; 186*b7579f77SDag-Erling Smørgrav 187*b7579f77SDag-Erling Smørgrav /** chrootdir, if not "" or chroot will be done */ 188*b7579f77SDag-Erling Smørgrav char* chrootdir; 189*b7579f77SDag-Erling Smørgrav /** username to change to, if not "". */ 190*b7579f77SDag-Erling Smørgrav char* username; 191*b7579f77SDag-Erling Smørgrav /** working directory */ 192*b7579f77SDag-Erling Smørgrav char* directory; 193*b7579f77SDag-Erling Smørgrav /** filename to log to. */ 194*b7579f77SDag-Erling Smørgrav char* logfile; 195*b7579f77SDag-Erling Smørgrav /** pidfile to write pid to. */ 196*b7579f77SDag-Erling Smørgrav char* pidfile; 197*b7579f77SDag-Erling Smørgrav 198*b7579f77SDag-Erling Smørgrav /** should log messages be sent to syslogd */ 199*b7579f77SDag-Erling Smørgrav int use_syslog; 200*b7579f77SDag-Erling Smørgrav /** log timestamp in ascii UTC */ 201*b7579f77SDag-Erling Smørgrav int log_time_ascii; 202*b7579f77SDag-Erling Smørgrav /** log queries with one line per query */ 203*b7579f77SDag-Erling Smørgrav int log_queries; 204*b7579f77SDag-Erling Smørgrav 205*b7579f77SDag-Erling Smørgrav /** do not report identity (id.server, hostname.bind) */ 206*b7579f77SDag-Erling Smørgrav int hide_identity; 207*b7579f77SDag-Erling Smørgrav /** do not report version (version.server, version.bind) */ 208*b7579f77SDag-Erling Smørgrav int hide_version; 209*b7579f77SDag-Erling Smørgrav /** identity, hostname is returned if "". */ 210*b7579f77SDag-Erling Smørgrav char* identity; 211*b7579f77SDag-Erling Smørgrav /** version, package version returned if "". */ 212*b7579f77SDag-Erling Smørgrav char* version; 213*b7579f77SDag-Erling Smørgrav 214*b7579f77SDag-Erling Smørgrav /** the module configuration string */ 215*b7579f77SDag-Erling Smørgrav char* module_conf; 216*b7579f77SDag-Erling Smørgrav 217*b7579f77SDag-Erling Smørgrav /** files with trusted DS and DNSKEYs in zonefile format, list */ 218*b7579f77SDag-Erling Smørgrav struct config_strlist* trust_anchor_file_list; 219*b7579f77SDag-Erling Smørgrav /** list of trustanchor keys, linked list */ 220*b7579f77SDag-Erling Smørgrav struct config_strlist* trust_anchor_list; 221*b7579f77SDag-Erling Smørgrav /** files with 5011 autotrust tracked keys */ 222*b7579f77SDag-Erling Smørgrav struct config_strlist* auto_trust_anchor_file_list; 223*b7579f77SDag-Erling Smørgrav /** files with trusted DNSKEYs in named.conf format, list */ 224*b7579f77SDag-Erling Smørgrav struct config_strlist* trusted_keys_file_list; 225*b7579f77SDag-Erling Smørgrav /** DLV anchor file */ 226*b7579f77SDag-Erling Smørgrav char* dlv_anchor_file; 227*b7579f77SDag-Erling Smørgrav /** DLV anchor inline */ 228*b7579f77SDag-Erling Smørgrav struct config_strlist* dlv_anchor_list; 229*b7579f77SDag-Erling Smørgrav /** insecure domain list */ 230*b7579f77SDag-Erling Smørgrav struct config_strlist* domain_insecure; 231*b7579f77SDag-Erling Smørgrav 232*b7579f77SDag-Erling Smørgrav /** if not 0, this value is the validation date for RRSIGs */ 233*b7579f77SDag-Erling Smørgrav int32_t val_date_override; 234*b7579f77SDag-Erling Smørgrav /** the minimum for signature clock skew */ 235*b7579f77SDag-Erling Smørgrav int32_t val_sig_skew_min; 236*b7579f77SDag-Erling Smørgrav /** the maximum for signature clock skew */ 237*b7579f77SDag-Erling Smørgrav int32_t val_sig_skew_max; 238*b7579f77SDag-Erling Smørgrav /** this value sets the number of seconds before revalidating bogus */ 239*b7579f77SDag-Erling Smørgrav int bogus_ttl; 240*b7579f77SDag-Erling Smørgrav /** should validator clean additional section for secure msgs */ 241*b7579f77SDag-Erling Smørgrav int val_clean_additional; 242*b7579f77SDag-Erling Smørgrav /** log bogus messages by the validator */ 243*b7579f77SDag-Erling Smørgrav int val_log_level; 244*b7579f77SDag-Erling Smørgrav /** squelch val_log_level to log - this is library goes to callback */ 245*b7579f77SDag-Erling Smørgrav int val_log_squelch; 246*b7579f77SDag-Erling Smørgrav /** should validator allow bogus messages to go through */ 247*b7579f77SDag-Erling Smørgrav int val_permissive_mode; 248*b7579f77SDag-Erling Smørgrav /** ignore the CD flag in incoming queries and refuse them bogus data */ 249*b7579f77SDag-Erling Smørgrav int ignore_cd; 250*b7579f77SDag-Erling Smørgrav /** nsec3 maximum iterations per key size, string */ 251*b7579f77SDag-Erling Smørgrav char* val_nsec3_key_iterations; 252*b7579f77SDag-Erling Smørgrav /** autotrust add holddown time, in seconds */ 253*b7579f77SDag-Erling Smørgrav unsigned int add_holddown; 254*b7579f77SDag-Erling Smørgrav /** autotrust del holddown time, in seconds */ 255*b7579f77SDag-Erling Smørgrav unsigned int del_holddown; 256*b7579f77SDag-Erling Smørgrav /** autotrust keep_missing time, in seconds. 0 is forever. */ 257*b7579f77SDag-Erling Smørgrav unsigned int keep_missing; 258*b7579f77SDag-Erling Smørgrav 259*b7579f77SDag-Erling Smørgrav /** size of the key cache */ 260*b7579f77SDag-Erling Smørgrav size_t key_cache_size; 261*b7579f77SDag-Erling Smørgrav /** slabs in the key cache. */ 262*b7579f77SDag-Erling Smørgrav size_t key_cache_slabs; 263*b7579f77SDag-Erling Smørgrav /** size of the neg cache */ 264*b7579f77SDag-Erling Smørgrav size_t neg_cache_size; 265*b7579f77SDag-Erling Smørgrav 266*b7579f77SDag-Erling Smørgrav /** local zones config */ 267*b7579f77SDag-Erling Smørgrav struct config_str2list* local_zones; 268*b7579f77SDag-Erling Smørgrav /** local zones nodefault list */ 269*b7579f77SDag-Erling Smørgrav struct config_strlist* local_zones_nodefault; 270*b7579f77SDag-Erling Smørgrav /** local data RRs configged */ 271*b7579f77SDag-Erling Smørgrav struct config_strlist* local_data; 272*b7579f77SDag-Erling Smørgrav 273*b7579f77SDag-Erling Smørgrav /** remote control section. enable toggle. */ 274*b7579f77SDag-Erling Smørgrav int remote_control_enable; 275*b7579f77SDag-Erling Smørgrav /** the interfaces the remote control should listen on */ 276*b7579f77SDag-Erling Smørgrav struct config_strlist* control_ifs; 277*b7579f77SDag-Erling Smørgrav /** port number for the control port */ 278*b7579f77SDag-Erling Smørgrav int control_port; 279*b7579f77SDag-Erling Smørgrav /** private key file for server */ 280*b7579f77SDag-Erling Smørgrav char* server_key_file; 281*b7579f77SDag-Erling Smørgrav /** certificate file for server */ 282*b7579f77SDag-Erling Smørgrav char* server_cert_file; 283*b7579f77SDag-Erling Smørgrav /** private key file for unbound-control */ 284*b7579f77SDag-Erling Smørgrav char* control_key_file; 285*b7579f77SDag-Erling Smørgrav /** certificate file for unbound-control */ 286*b7579f77SDag-Erling Smørgrav char* control_cert_file; 287*b7579f77SDag-Erling Smørgrav 288*b7579f77SDag-Erling Smørgrav /** Python script file */ 289*b7579f77SDag-Erling Smørgrav char* python_script; 290*b7579f77SDag-Erling Smørgrav 291*b7579f77SDag-Erling Smørgrav /** daemonize, i.e. fork into the background. */ 292*b7579f77SDag-Erling Smørgrav int do_daemonize; 293*b7579f77SDag-Erling Smørgrav 294*b7579f77SDag-Erling Smørgrav /* minimal response when positive answer */ 295*b7579f77SDag-Erling Smørgrav int minimal_responses; 296*b7579f77SDag-Erling Smørgrav 297*b7579f77SDag-Erling Smørgrav /* RRSet roundrobin */ 298*b7579f77SDag-Erling Smørgrav int rrset_roundrobin; 299*b7579f77SDag-Erling Smørgrav }; 300*b7579f77SDag-Erling Smørgrav 301*b7579f77SDag-Erling Smørgrav /** 302*b7579f77SDag-Erling Smørgrav * Stub config options 303*b7579f77SDag-Erling Smørgrav */ 304*b7579f77SDag-Erling Smørgrav struct config_stub { 305*b7579f77SDag-Erling Smørgrav /** next in list */ 306*b7579f77SDag-Erling Smørgrav struct config_stub* next; 307*b7579f77SDag-Erling Smørgrav /** domain name (in text) of the stub apex domain */ 308*b7579f77SDag-Erling Smørgrav char* name; 309*b7579f77SDag-Erling Smørgrav /** list of stub nameserver hosts (domain name) */ 310*b7579f77SDag-Erling Smørgrav struct config_strlist* hosts; 311*b7579f77SDag-Erling Smørgrav /** list of stub nameserver addresses (IP address) */ 312*b7579f77SDag-Erling Smørgrav struct config_strlist* addrs; 313*b7579f77SDag-Erling Smørgrav /** if stub-prime is set */ 314*b7579f77SDag-Erling Smørgrav int isprime; 315*b7579f77SDag-Erling Smørgrav /** if forward-first is set (failover to without if fails) */ 316*b7579f77SDag-Erling Smørgrav int isfirst; 317*b7579f77SDag-Erling Smørgrav }; 318*b7579f77SDag-Erling Smørgrav 319*b7579f77SDag-Erling Smørgrav /** 320*b7579f77SDag-Erling Smørgrav * List of strings for config options 321*b7579f77SDag-Erling Smørgrav */ 322*b7579f77SDag-Erling Smørgrav struct config_strlist { 323*b7579f77SDag-Erling Smørgrav /** next item in list */ 324*b7579f77SDag-Erling Smørgrav struct config_strlist* next; 325*b7579f77SDag-Erling Smørgrav /** config option string */ 326*b7579f77SDag-Erling Smørgrav char* str; 327*b7579f77SDag-Erling Smørgrav }; 328*b7579f77SDag-Erling Smørgrav 329*b7579f77SDag-Erling Smørgrav /** 330*b7579f77SDag-Erling Smørgrav * List of two strings for config options 331*b7579f77SDag-Erling Smørgrav */ 332*b7579f77SDag-Erling Smørgrav struct config_str2list { 333*b7579f77SDag-Erling Smørgrav /** next item in list */ 334*b7579f77SDag-Erling Smørgrav struct config_str2list* next; 335*b7579f77SDag-Erling Smørgrav /** first string */ 336*b7579f77SDag-Erling Smørgrav char* str; 337*b7579f77SDag-Erling Smørgrav /** second string */ 338*b7579f77SDag-Erling Smørgrav char* str2; 339*b7579f77SDag-Erling Smørgrav }; 340*b7579f77SDag-Erling Smørgrav 341*b7579f77SDag-Erling Smørgrav /** List head for strlist processing, used for append operation. */ 342*b7579f77SDag-Erling Smørgrav struct config_strlist_head { 343*b7579f77SDag-Erling Smørgrav /** first in list of text items */ 344*b7579f77SDag-Erling Smørgrav struct config_strlist* first; 345*b7579f77SDag-Erling Smørgrav /** last in list of text items */ 346*b7579f77SDag-Erling Smørgrav struct config_strlist* last; 347*b7579f77SDag-Erling Smørgrav }; 348*b7579f77SDag-Erling Smørgrav 349*b7579f77SDag-Erling Smørgrav /** 350*b7579f77SDag-Erling Smørgrav * Create config file structure. Filled with default values. 351*b7579f77SDag-Erling Smørgrav * @return: the new structure or NULL on memory error. 352*b7579f77SDag-Erling Smørgrav */ 353*b7579f77SDag-Erling Smørgrav struct config_file* config_create(void); 354*b7579f77SDag-Erling Smørgrav 355*b7579f77SDag-Erling Smørgrav /** 356*b7579f77SDag-Erling Smørgrav * Create config file structure for library use. Filled with default values. 357*b7579f77SDag-Erling Smørgrav * @return: the new structure or NULL on memory error. 358*b7579f77SDag-Erling Smørgrav */ 359*b7579f77SDag-Erling Smørgrav struct config_file* config_create_forlib(void); 360*b7579f77SDag-Erling Smørgrav 361*b7579f77SDag-Erling Smørgrav /** 362*b7579f77SDag-Erling Smørgrav * Read the config file from the specified filename. 363*b7579f77SDag-Erling Smørgrav * @param config: where options are stored into, must be freshly created. 364*b7579f77SDag-Erling Smørgrav * @param filename: name of configfile. If NULL nothing is done. 365*b7579f77SDag-Erling Smørgrav * @param chroot: if not NULL, the chroot dir currently in use (for include). 366*b7579f77SDag-Erling Smørgrav * @return: false on error. In that case errno is set, ENOENT means 367*b7579f77SDag-Erling Smørgrav * file not found. 368*b7579f77SDag-Erling Smørgrav */ 369*b7579f77SDag-Erling Smørgrav int config_read(struct config_file* config, const char* filename, 370*b7579f77SDag-Erling Smørgrav const char* chroot); 371*b7579f77SDag-Erling Smørgrav 372*b7579f77SDag-Erling Smørgrav /** 373*b7579f77SDag-Erling Smørgrav * Destroy the config file structure. 374*b7579f77SDag-Erling Smørgrav * @param config: to delete. 375*b7579f77SDag-Erling Smørgrav */ 376*b7579f77SDag-Erling Smørgrav void config_delete(struct config_file* config); 377*b7579f77SDag-Erling Smørgrav 378*b7579f77SDag-Erling Smørgrav /** 379*b7579f77SDag-Erling Smørgrav * Apply config to global constants; this routine is called in single thread. 380*b7579f77SDag-Erling Smørgrav * @param config: to apply. Side effect: global constants change. 381*b7579f77SDag-Erling Smørgrav */ 382*b7579f77SDag-Erling Smørgrav void config_apply(struct config_file* config); 383*b7579f77SDag-Erling Smørgrav 384*b7579f77SDag-Erling Smørgrav /** 385*b7579f77SDag-Erling Smørgrav * Set the given keyword to the given value. 386*b7579f77SDag-Erling Smørgrav * @param config: where to store config 387*b7579f77SDag-Erling Smørgrav * @param option: option name, including the ':' character. 388*b7579f77SDag-Erling Smørgrav * @param value: value, this string is copied if needed, or parsed. 389*b7579f77SDag-Erling Smørgrav * The caller owns the value string. 390*b7579f77SDag-Erling Smørgrav * @return 0 on error (malloc or syntax error). 391*b7579f77SDag-Erling Smørgrav */ 392*b7579f77SDag-Erling Smørgrav int config_set_option(struct config_file* config, const char* option, 393*b7579f77SDag-Erling Smørgrav const char* value); 394*b7579f77SDag-Erling Smørgrav 395*b7579f77SDag-Erling Smørgrav /** 396*b7579f77SDag-Erling Smørgrav * Call print routine for the given option. 397*b7579f77SDag-Erling Smørgrav * @param cfg: config. 398*b7579f77SDag-Erling Smørgrav * @param opt: option name without trailing :. 399*b7579f77SDag-Erling Smørgrav * This is different from config_set_option. 400*b7579f77SDag-Erling Smørgrav * @param func: print func, called as (str, arg) for every data element. 401*b7579f77SDag-Erling Smørgrav * @param arg: user argument for print func. 402*b7579f77SDag-Erling Smørgrav * @return false if the option name is not supported (syntax error). 403*b7579f77SDag-Erling Smørgrav */ 404*b7579f77SDag-Erling Smørgrav int config_get_option(struct config_file* cfg, const char* opt, 405*b7579f77SDag-Erling Smørgrav void (*func)(char*,void*), void* arg); 406*b7579f77SDag-Erling Smørgrav 407*b7579f77SDag-Erling Smørgrav /** 408*b7579f77SDag-Erling Smørgrav * Get an option and return strlist 409*b7579f77SDag-Erling Smørgrav * @param cfg: config file 410*b7579f77SDag-Erling Smørgrav * @param opt: option name. 411*b7579f77SDag-Erling Smørgrav * @param list: list is returned here. malloced, caller must free it. 412*b7579f77SDag-Erling Smørgrav * @return 0=OK, 1=syntax error, 2=malloc failed. 413*b7579f77SDag-Erling Smørgrav */ 414*b7579f77SDag-Erling Smørgrav int config_get_option_list(struct config_file* cfg, const char* opt, 415*b7579f77SDag-Erling Smørgrav struct config_strlist** list); 416*b7579f77SDag-Erling Smørgrav 417*b7579f77SDag-Erling Smørgrav /** 418*b7579f77SDag-Erling Smørgrav * Get an option and collate results into string 419*b7579f77SDag-Erling Smørgrav * @param cfg: config file 420*b7579f77SDag-Erling Smørgrav * @param opt: option name. 421*b7579f77SDag-Erling Smørgrav * @param str: string. malloced, caller must free it. 422*b7579f77SDag-Erling Smørgrav * @return 0=OK, 1=syntax error, 2=malloc failed. 423*b7579f77SDag-Erling Smørgrav */ 424*b7579f77SDag-Erling Smørgrav int config_get_option_collate(struct config_file* cfg, const char* opt, 425*b7579f77SDag-Erling Smørgrav char** str); 426*b7579f77SDag-Erling Smørgrav 427*b7579f77SDag-Erling Smørgrav /** 428*b7579f77SDag-Erling Smørgrav * function to print to a file, use as func with config_get_option. 429*b7579f77SDag-Erling Smørgrav * @param line: text to print. \n appended. 430*b7579f77SDag-Erling Smørgrav * @param arg: pass a FILE*, like stdout. 431*b7579f77SDag-Erling Smørgrav */ 432*b7579f77SDag-Erling Smørgrav void config_print_func(char* line, void* arg); 433*b7579f77SDag-Erling Smørgrav 434*b7579f77SDag-Erling Smørgrav /** 435*b7579f77SDag-Erling Smørgrav * function to collate the text strings into a strlist_head. 436*b7579f77SDag-Erling Smørgrav * @param line: text to append. 437*b7579f77SDag-Erling Smørgrav * @param arg: pass a strlist_head structure. zeroed on start. 438*b7579f77SDag-Erling Smørgrav */ 439*b7579f77SDag-Erling Smørgrav void config_collate_func(char* line, void* arg); 440*b7579f77SDag-Erling Smørgrav 441*b7579f77SDag-Erling Smørgrav /** 442*b7579f77SDag-Erling Smørgrav * take a strlist_head list and return a malloc string. separated with newline. 443*b7579f77SDag-Erling Smørgrav * @param list: strlist first to collate. zeroes return "". 444*b7579f77SDag-Erling Smørgrav * @return NULL on malloc failure. Or if malloc failure happened in strlist. 445*b7579f77SDag-Erling Smørgrav */ 446*b7579f77SDag-Erling Smørgrav char* config_collate_cat(struct config_strlist* list); 447*b7579f77SDag-Erling Smørgrav 448*b7579f77SDag-Erling Smørgrav /** 449*b7579f77SDag-Erling Smørgrav * Append text at end of list. 450*b7579f77SDag-Erling Smørgrav * @param list: list head. zeroed at start. 451*b7579f77SDag-Erling Smørgrav * @param item: new item. malloced by caller. if NULL the insertion fails. 452*b7579f77SDag-Erling Smørgrav * @return true on success. 453*b7579f77SDag-Erling Smørgrav */ 454*b7579f77SDag-Erling Smørgrav int cfg_strlist_append(struct config_strlist_head* list, char* item); 455*b7579f77SDag-Erling Smørgrav 456*b7579f77SDag-Erling Smørgrav /** 457*b7579f77SDag-Erling Smørgrav * Insert string into strlist. 458*b7579f77SDag-Erling Smørgrav * @param head: pointer to strlist head variable. 459*b7579f77SDag-Erling Smørgrav * @param item: new item. malloced by caller. If NULL the insertion fails. 460*b7579f77SDag-Erling Smørgrav * @return: true on success. 461*b7579f77SDag-Erling Smørgrav */ 462*b7579f77SDag-Erling Smørgrav int cfg_strlist_insert(struct config_strlist** head, char* item); 463*b7579f77SDag-Erling Smørgrav 464*b7579f77SDag-Erling Smørgrav /** 465*b7579f77SDag-Erling Smørgrav * Insert string into str2list. 466*b7579f77SDag-Erling Smørgrav * @param head: pointer to str2list head variable. 467*b7579f77SDag-Erling Smørgrav * @param item: new item. malloced by caller. If NULL the insertion fails. 468*b7579f77SDag-Erling Smørgrav * @param i2: 2nd string, malloced by caller. If NULL the insertion fails. 469*b7579f77SDag-Erling Smørgrav * @return: true on success. 470*b7579f77SDag-Erling Smørgrav */ 471*b7579f77SDag-Erling Smørgrav int cfg_str2list_insert(struct config_str2list** head, char* item, char* i2); 472*b7579f77SDag-Erling Smørgrav 473*b7579f77SDag-Erling Smørgrav /** 474*b7579f77SDag-Erling Smørgrav * Delete items in config string list. 475*b7579f77SDag-Erling Smørgrav * @param list: list. 476*b7579f77SDag-Erling Smørgrav */ 477*b7579f77SDag-Erling Smørgrav void config_delstrlist(struct config_strlist* list); 478*b7579f77SDag-Erling Smørgrav 479*b7579f77SDag-Erling Smørgrav /** 480*b7579f77SDag-Erling Smørgrav * Delete items in config double string list. 481*b7579f77SDag-Erling Smørgrav * @param list: list. 482*b7579f77SDag-Erling Smørgrav */ 483*b7579f77SDag-Erling Smørgrav void config_deldblstrlist(struct config_str2list* list); 484*b7579f77SDag-Erling Smørgrav 485*b7579f77SDag-Erling Smørgrav /** 486*b7579f77SDag-Erling Smørgrav * Delete items in config stub list. 487*b7579f77SDag-Erling Smørgrav * @param list: list. 488*b7579f77SDag-Erling Smørgrav */ 489*b7579f77SDag-Erling Smørgrav void config_delstubs(struct config_stub* list); 490*b7579f77SDag-Erling Smørgrav 491*b7579f77SDag-Erling Smørgrav /** 492*b7579f77SDag-Erling Smørgrav * Convert 14digit to time value 493*b7579f77SDag-Erling Smørgrav * @param str: string of 14 digits 494*b7579f77SDag-Erling Smørgrav * @return time value or 0 for error. 495*b7579f77SDag-Erling Smørgrav */ 496*b7579f77SDag-Erling Smørgrav uint32_t cfg_convert_timeval(const char* str); 497*b7579f77SDag-Erling Smørgrav 498*b7579f77SDag-Erling Smørgrav /** 499*b7579f77SDag-Erling Smørgrav * Count number of values in the string. 500*b7579f77SDag-Erling Smørgrav * format ::= (sp num)+ sp 501*b7579f77SDag-Erling Smørgrav * num ::= [-](0-9)+ 502*b7579f77SDag-Erling Smørgrav * sp ::= (space|tab)* 503*b7579f77SDag-Erling Smørgrav * 504*b7579f77SDag-Erling Smørgrav * @param str: string 505*b7579f77SDag-Erling Smørgrav * @return: 0 on parse error, or empty string, else 506*b7579f77SDag-Erling Smørgrav * number of integer values in the string. 507*b7579f77SDag-Erling Smørgrav */ 508*b7579f77SDag-Erling Smørgrav int cfg_count_numbers(const char* str); 509*b7579f77SDag-Erling Smørgrav 510*b7579f77SDag-Erling Smørgrav /** 511*b7579f77SDag-Erling Smørgrav * Convert a 'nice' memory or file size into a bytecount 512*b7579f77SDag-Erling Smørgrav * From '100k' to 102400. and so on. Understands kKmMgG. 513*b7579f77SDag-Erling Smørgrav * k=1024, m=1024*1024, g=1024*1024*1024. 514*b7579f77SDag-Erling Smørgrav * @param str: string 515*b7579f77SDag-Erling Smørgrav * @param res: result is stored here, size in bytes. 516*b7579f77SDag-Erling Smørgrav * @return: true if parsed correctly, or 0 on a parse error (and an error 517*b7579f77SDag-Erling Smørgrav * is logged). 518*b7579f77SDag-Erling Smørgrav */ 519*b7579f77SDag-Erling Smørgrav int cfg_parse_memsize(const char* str, size_t* res); 520*b7579f77SDag-Erling Smørgrav 521*b7579f77SDag-Erling Smørgrav /** 522*b7579f77SDag-Erling Smørgrav * Parse local-zone directive into two strings and register it in the config. 523*b7579f77SDag-Erling Smørgrav * @param cfg: to put it in. 524*b7579f77SDag-Erling Smørgrav * @param val: argument strings to local-zone, "example.com nodefault". 525*b7579f77SDag-Erling Smørgrav * @return: false on failure 526*b7579f77SDag-Erling Smørgrav */ 527*b7579f77SDag-Erling Smørgrav int cfg_parse_local_zone(struct config_file* cfg, const char* val); 528*b7579f77SDag-Erling Smørgrav 529*b7579f77SDag-Erling Smørgrav /** 530*b7579f77SDag-Erling Smørgrav * Mark "number" or "low-high" as available or not in ports array. 531*b7579f77SDag-Erling Smørgrav * @param str: string in input 532*b7579f77SDag-Erling Smørgrav * @param allow: give true if this range is permitted. 533*b7579f77SDag-Erling Smørgrav * @param avail: the array from cfg. 534*b7579f77SDag-Erling Smørgrav * @param num: size of the array (65536). 535*b7579f77SDag-Erling Smørgrav * @return: true if parsed correctly, or 0 on a parse error (and an error 536*b7579f77SDag-Erling Smørgrav * is logged). 537*b7579f77SDag-Erling Smørgrav */ 538*b7579f77SDag-Erling Smørgrav int cfg_mark_ports(const char* str, int allow, int* avail, int num); 539*b7579f77SDag-Erling Smørgrav 540*b7579f77SDag-Erling Smørgrav /** 541*b7579f77SDag-Erling Smørgrav * Get a condensed list of ports returned. allocated. 542*b7579f77SDag-Erling Smørgrav * @param cfg: config file. 543*b7579f77SDag-Erling Smørgrav * @param avail: the available ports array is returned here. 544*b7579f77SDag-Erling Smørgrav * @return: number of ports in array or 0 on error. 545*b7579f77SDag-Erling Smørgrav */ 546*b7579f77SDag-Erling Smørgrav int cfg_condense_ports(struct config_file* cfg, int** avail); 547*b7579f77SDag-Erling Smørgrav 548*b7579f77SDag-Erling Smørgrav /** 549*b7579f77SDag-Erling Smørgrav * Scan ports available 550*b7579f77SDag-Erling Smørgrav * @param avail: the array from cfg. 551*b7579f77SDag-Erling Smørgrav * @param num: size of the array (65536). 552*b7579f77SDag-Erling Smørgrav * @return the number of ports available for use. 553*b7579f77SDag-Erling Smørgrav */ 554*b7579f77SDag-Erling Smørgrav int cfg_scan_ports(int* avail, int num); 555*b7579f77SDag-Erling Smørgrav 556*b7579f77SDag-Erling Smørgrav /** 557*b7579f77SDag-Erling Smørgrav * Convert a filename to full pathname in original filesys 558*b7579f77SDag-Erling Smørgrav * @param fname: the path name to convert. 559*b7579f77SDag-Erling Smørgrav * Must not be null or empty. 560*b7579f77SDag-Erling Smørgrav * @param cfg: config struct for chroot and chdir (if set). 561*b7579f77SDag-Erling Smørgrav * @param use_chdir: if false, only chroot is applied. 562*b7579f77SDag-Erling Smørgrav * @return pointer to malloced buffer which is: [chroot][chdir]fname 563*b7579f77SDag-Erling Smørgrav * or NULL on malloc failure. 564*b7579f77SDag-Erling Smørgrav */ 565*b7579f77SDag-Erling Smørgrav char* fname_after_chroot(const char* fname, struct config_file* cfg, 566*b7579f77SDag-Erling Smørgrav int use_chdir); 567*b7579f77SDag-Erling Smørgrav 568*b7579f77SDag-Erling Smørgrav /** 569*b7579f77SDag-Erling Smørgrav * Convert a ptr shorthand into a full reverse-notation PTR record. 570*b7579f77SDag-Erling Smørgrav * @param str: input string, "IP name" 571*b7579f77SDag-Erling Smørgrav * @return: malloced string "reversed-ip-name PTR name" 572*b7579f77SDag-Erling Smørgrav */ 573*b7579f77SDag-Erling Smørgrav char* cfg_ptr_reverse(char* str); 574*b7579f77SDag-Erling Smørgrav 575*b7579f77SDag-Erling Smørgrav /** 576*b7579f77SDag-Erling Smørgrav * Append text to the error info for validation. 577*b7579f77SDag-Erling Smørgrav * @param qstate: query state. 578*b7579f77SDag-Erling Smørgrav * @param str: copied into query region and appended. 579*b7579f77SDag-Erling Smørgrav * Failures to allocate are logged. 580*b7579f77SDag-Erling Smørgrav */ 581*b7579f77SDag-Erling Smørgrav void errinf(struct module_qstate* qstate, const char* str); 582*b7579f77SDag-Erling Smørgrav 583*b7579f77SDag-Erling Smørgrav /** 584*b7579f77SDag-Erling Smørgrav * Append text to error info: from 1.2.3.4 585*b7579f77SDag-Erling Smørgrav * @param qstate: query state. 586*b7579f77SDag-Erling Smørgrav * @param origin: sock list with origin of trouble. 587*b7579f77SDag-Erling Smørgrav * Every element added. 588*b7579f77SDag-Erling Smørgrav * If NULL: nothing is added. 589*b7579f77SDag-Erling Smørgrav * if 0len element: 'from cache' is added. 590*b7579f77SDag-Erling Smørgrav */ 591*b7579f77SDag-Erling Smørgrav void errinf_origin(struct module_qstate* qstate, struct sock_list *origin); 592*b7579f77SDag-Erling Smørgrav 593*b7579f77SDag-Erling Smørgrav /** 594*b7579f77SDag-Erling Smørgrav * Append text to error info: for RRset name type class 595*b7579f77SDag-Erling Smørgrav * @param qstate: query state. 596*b7579f77SDag-Erling Smørgrav * @param rr: rrset_key. 597*b7579f77SDag-Erling Smørgrav */ 598*b7579f77SDag-Erling Smørgrav void errinf_rrset(struct module_qstate* qstate, struct ub_packed_rrset_key *rr); 599*b7579f77SDag-Erling Smørgrav 600*b7579f77SDag-Erling Smørgrav /** 601*b7579f77SDag-Erling Smørgrav * Append text to error info: str dname 602*b7579f77SDag-Erling Smørgrav * @param qstate: query state. 603*b7579f77SDag-Erling Smørgrav * @param str: explanation string 604*b7579f77SDag-Erling Smørgrav * @param dname: the dname. 605*b7579f77SDag-Erling Smørgrav */ 606*b7579f77SDag-Erling Smørgrav void errinf_dname(struct module_qstate* qstate, const char* str, 607*b7579f77SDag-Erling Smørgrav uint8_t* dname); 608*b7579f77SDag-Erling Smørgrav 609*b7579f77SDag-Erling Smørgrav /** 610*b7579f77SDag-Erling Smørgrav * Create error info in string 611*b7579f77SDag-Erling Smørgrav * @param qstate: query state. 612*b7579f77SDag-Erling Smørgrav * @return string or NULL on malloc failure (already logged). 613*b7579f77SDag-Erling Smørgrav * This string is malloced and has to be freed by caller. 614*b7579f77SDag-Erling Smørgrav */ 615*b7579f77SDag-Erling Smørgrav char* errinf_to_str(struct module_qstate* qstate); 616*b7579f77SDag-Erling Smørgrav 617*b7579f77SDag-Erling Smørgrav /** 618*b7579f77SDag-Erling Smørgrav * Used during options parsing 619*b7579f77SDag-Erling Smørgrav */ 620*b7579f77SDag-Erling Smørgrav struct config_parser_state { 621*b7579f77SDag-Erling Smørgrav /** name of file being parser */ 622*b7579f77SDag-Erling Smørgrav char* filename; 623*b7579f77SDag-Erling Smørgrav /** line number in the file, starts at 1 */ 624*b7579f77SDag-Erling Smørgrav int line; 625*b7579f77SDag-Erling Smørgrav /** number of errors encountered */ 626*b7579f77SDag-Erling Smørgrav int errors; 627*b7579f77SDag-Erling Smørgrav /** the result of parsing is stored here. */ 628*b7579f77SDag-Erling Smørgrav struct config_file* cfg; 629*b7579f77SDag-Erling Smørgrav /** the current chroot dir (or NULL if none) */ 630*b7579f77SDag-Erling Smørgrav const char* chroot; 631*b7579f77SDag-Erling Smørgrav }; 632*b7579f77SDag-Erling Smørgrav 633*b7579f77SDag-Erling Smørgrav /** global config parser object used during config parsing */ 634*b7579f77SDag-Erling Smørgrav extern struct config_parser_state* cfg_parser; 635*b7579f77SDag-Erling Smørgrav /** parsing helpers: print error with file and line numbers */ 636*b7579f77SDag-Erling Smørgrav void ub_c_error(const char* msg); 637*b7579f77SDag-Erling Smørgrav /** parsing helpers: print error with file and line numbers */ 638*b7579f77SDag-Erling Smørgrav void ub_c_error_msg(const char* fmt, ...) ATTR_FORMAT(printf, 1, 2); 639*b7579f77SDag-Erling Smørgrav 640*b7579f77SDag-Erling Smørgrav #ifdef UB_ON_WINDOWS 641*b7579f77SDag-Erling Smørgrav /** 642*b7579f77SDag-Erling Smørgrav * Obtain registry string (if it exists). 643*b7579f77SDag-Erling Smørgrav * @param key: key string 644*b7579f77SDag-Erling Smørgrav * @param name: name of value to fetch. 645*b7579f77SDag-Erling Smørgrav * @return malloced string with the result or NULL if it did not 646*b7579f77SDag-Erling Smørgrav * exist on an error (logged with log_err) was encountered. 647*b7579f77SDag-Erling Smørgrav */ 648*b7579f77SDag-Erling Smørgrav char* w_lookup_reg_str(const char* key, const char* name); 649*b7579f77SDag-Erling Smørgrav #endif /* UB_ON_WINDOWS */ 650*b7579f77SDag-Erling Smørgrav 651*b7579f77SDag-Erling Smørgrav #endif /* UTIL_CONFIG_FILE_H */ 652