quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

ares_dns_private.h (9783B)


      1 /* MIT License
      2  *
      3  * Copyright (c) 2023 Brad House
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a copy
      6  * of this software and associated documentation files (the "Software"), to deal
      7  * in the Software without restriction, including without limitation the rights
      8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9  * copies of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  *
     24  * SPDX-License-Identifier: MIT
     25  */
     26 #ifndef __ARES_DNS_PRIVATE_H
     27 #define __ARES_DNS_PRIVATE_H
     28 
     29 ares_status_t        ares_dns_record_duplicate_ex(ares_dns_record_t      **dest,
     30                                                   const ares_dns_record_t *src);
     31 ares_bool_t          ares_dns_rec_allow_name_comp(ares_dns_rec_type_t type);
     32 ares_bool_t          ares_dns_opcode_isvalid(ares_dns_opcode_t opcode);
     33 ares_bool_t          ares_dns_rcode_isvalid(ares_dns_rcode_t rcode);
     34 ares_bool_t          ares_dns_flags_arevalid(unsigned short flags);
     35 ares_bool_t          ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
     36                                                ares_bool_t         is_query);
     37 ares_bool_t          ares_dns_class_isvalid(ares_dns_class_t    qclass,
     38                                             ares_dns_rec_type_t type,
     39                                             ares_bool_t         is_query);
     40 ares_bool_t          ares_dns_section_isvalid(ares_dns_section_t sect);
     41 ares_status_t        ares_dns_rr_set_str_own(ares_dns_rr_t    *dns_rr,
     42                                              ares_dns_rr_key_t key, char *val);
     43 ares_status_t        ares_dns_rr_set_bin_own(ares_dns_rr_t    *dns_rr,
     44                                              ares_dns_rr_key_t key, unsigned char *val,
     45                                              size_t len);
     46 ares_status_t        ares_dns_rr_set_abin_own(ares_dns_rr_t          *dns_rr,
     47                                               ares_dns_rr_key_t       key,
     48                                               ares_dns_multistring_t *strs);
     49 ares_status_t        ares_dns_rr_set_opt_own(ares_dns_rr_t    *dns_rr,
     50                                              ares_dns_rr_key_t key, unsigned short opt,
     51                                              unsigned char *val, size_t val_len);
     52 ares_status_t        ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec,
     53                                                  ares_dns_section_t sect, size_t cnt);
     54 ares_dns_rr_t       *ares_dns_get_opt_rr(ares_dns_record_t *rec);
     55 const ares_dns_rr_t *ares_dns_get_opt_rr_const(const ares_dns_record_t *rec);
     56 void                 ares_dns_record_ttl_decrement(ares_dns_record_t *dnsrec,
     57                                                    unsigned int       ttl_decrement);
     58 
     59 /* Same as ares_dns_write() but appends to an existing buffer object */
     60 ares_status_t        ares_dns_write_buf(const ares_dns_record_t *dnsrec,
     61                                         ares_buf_t              *buf);
     62 
     63 /* Same as ares_dns_write_buf(), but prepends a 16bit length */
     64 ares_status_t        ares_dns_write_buf_tcp(const ares_dns_record_t *dnsrec,
     65                                             ares_buf_t              *buf);
     66 
     67 /*! Create a DNS record object for a query. The arguments are the same as
     68  *  those for ares_create_query().
     69  *
     70  *  \param[out] dnsrec       DNS record object to create.
     71  *  \param[in]  name         NUL-terminated name for the query.
     72  *  \param[in]  dnsclass     Class for the query.
     73  *  \param[in]  type         Type for the query.
     74  *  \param[in]  id           Identifier for the query.
     75  *  \param[in]  flags        Flags for the query.
     76  *  \param[in]  max_udp_size Maximum size of a UDP packet for EDNS.
     77  *  \return ARES_SUCCESS on success, otherwise an error code.
     78  */
     79 ares_status_t
     80   ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
     81                                ares_dns_class_t    dnsclass,
     82                                ares_dns_rec_type_t type, unsigned short id,
     83                                ares_dns_flags_t flags, size_t max_udp_size);
     84 
     85 /*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code.
     86  *
     87  *  \param[in] rcode   The RCODE from the reply.
     88  *  \param[in] ancount The ANCOUNT from the reply.
     89  *  \return An appropriate status code.
     90  */
     91 ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
     92                                             size_t           ancount);
     93 
     94 struct ares_dns_qd {
     95   char               *name;
     96   ares_dns_rec_type_t qtype;
     97   ares_dns_class_t    qclass;
     98 };
     99 
    100 typedef struct {
    101   struct in_addr addr;
    102 } ares_dns_a_t;
    103 
    104 typedef struct {
    105   char *nsdname;
    106 } ares_dns_ns_t;
    107 
    108 typedef struct {
    109   char *cname;
    110 } ares_dns_cname_t;
    111 
    112 typedef struct {
    113   char        *mname;
    114   char        *rname;
    115   unsigned int serial;
    116   unsigned int refresh;
    117   unsigned int retry;
    118   unsigned int expire;
    119   unsigned int minimum;
    120 } ares_dns_soa_t;
    121 
    122 typedef struct {
    123   char *dname;
    124 } ares_dns_ptr_t;
    125 
    126 typedef struct {
    127   char *cpu;
    128   char *os;
    129 } ares_dns_hinfo_t;
    130 
    131 typedef struct {
    132   unsigned short preference;
    133   char          *exchange;
    134 } ares_dns_mx_t;
    135 
    136 typedef struct {
    137   ares_dns_multistring_t *strs;
    138 } ares_dns_txt_t;
    139 
    140 typedef struct {
    141   unsigned short type_covered;
    142   unsigned char  algorithm;
    143   unsigned char  labels;
    144   unsigned int   original_ttl;
    145   unsigned int   expiration;
    146   unsigned int   inception;
    147   unsigned short key_tag;
    148   char          *signers_name;
    149   unsigned char *signature;
    150   size_t         signature_len;
    151 } ares_dns_sig_t;
    152 
    153 typedef struct {
    154   struct ares_in6_addr addr;
    155 } ares_dns_aaaa_t;
    156 
    157 typedef struct {
    158   unsigned short priority;
    159   unsigned short weight;
    160   unsigned short port;
    161   char          *target;
    162 } ares_dns_srv_t;
    163 
    164 typedef struct {
    165   unsigned short order;
    166   unsigned short preference;
    167   char          *flags;
    168   char          *services;
    169   char          *regexp;
    170   char          *replacement;
    171 } ares_dns_naptr_t;
    172 
    173 typedef struct {
    174   unsigned short opt;
    175   unsigned char *val;
    176   size_t         val_len;
    177 } ares_dns_optval_t;
    178 
    179 typedef struct {
    180   unsigned short udp_size; /*!< taken from class */
    181   unsigned char  version;  /*!< taken from bits 8-16 of ttl */
    182   unsigned short flags;    /*!< Flags, remaining 16 bits, though only
    183                             *   1 currently defined */
    184   ares_array_t  *options;  /*!< Type is ares_dns_optval_t */
    185 } ares_dns_opt_t;
    186 
    187 typedef struct {
    188   unsigned char  cert_usage;
    189   unsigned char  selector;
    190   unsigned char  match;
    191   unsigned char *data;
    192   size_t         data_len;
    193 } ares_dns_tlsa_t;
    194 
    195 typedef struct {
    196   unsigned short priority;
    197   char          *target;
    198   ares_array_t  *params; /*!< Type is ares_dns_optval_t */
    199 } ares_dns_svcb_t;
    200 
    201 typedef struct {
    202   unsigned short priority;
    203   unsigned short weight;
    204   char          *target;
    205 } ares_dns_uri_t;
    206 
    207 typedef struct {
    208   unsigned char  critical;
    209   char          *tag;
    210   unsigned char *value;
    211   size_t         value_len;
    212 } ares_dns_caa_t;
    213 
    214 /*! Raw, unparsed RR data */
    215 typedef struct {
    216   unsigned short type;   /*!< Not ares_rec_type_t because it likely isn't one
    217                           *   of those values since it wasn't parsed */
    218   unsigned char *data;   /*!< Raw RR data */
    219   size_t         length; /*!< Length of raw RR data */
    220 } ares_dns_raw_rr_t;
    221 
    222 /*! DNS RR data structure */
    223 struct ares_dns_rr {
    224   ares_dns_record_t  *parent;
    225   char               *name;
    226   ares_dns_rec_type_t type;
    227   ares_dns_class_t    rclass;
    228   unsigned int        ttl;
    229 
    230   union {
    231     ares_dns_a_t      a;
    232     ares_dns_ns_t     ns;
    233     ares_dns_cname_t  cname;
    234     ares_dns_soa_t    soa;
    235     ares_dns_ptr_t    ptr;
    236     ares_dns_hinfo_t  hinfo;
    237     ares_dns_mx_t     mx;
    238     ares_dns_txt_t    txt;
    239     ares_dns_sig_t    sig;
    240     ares_dns_aaaa_t   aaaa;
    241     ares_dns_srv_t    srv;
    242     ares_dns_naptr_t  naptr;
    243     ares_dns_opt_t    opt;
    244     ares_dns_tlsa_t   tlsa;
    245     ares_dns_svcb_t   svcb;
    246     ares_dns_svcb_t   https; /*!< https is a type of svcb, so this is right */
    247     ares_dns_uri_t    uri;
    248     ares_dns_caa_t    caa;
    249     ares_dns_raw_rr_t raw_rr;
    250   } r;
    251 };
    252 
    253 /*! DNS data structure */
    254 struct ares_dns_record {
    255   unsigned short    id;            /*!< DNS query id */
    256   unsigned short    flags;         /*!< One or more ares_dns_flags_t */
    257   ares_dns_opcode_t opcode;        /*!< DNS Opcode */
    258   ares_dns_rcode_t  rcode;         /*!< DNS RCODE */
    259   unsigned short    raw_rcode;     /*!< Raw rcode, used to ultimately form real
    260                                     *   rcode after reading OPT record if it
    261                                     *   exists */
    262   unsigned int      ttl_decrement; /*!< Special case to apply to writing out
    263                                     *   this record, where it will decrement
    264                                     *   the ttl of any resource records by
    265                                     *   this amount.  Used for cache */
    266 
    267   ares_array_t     *qd;            /*!< Type is ares_dns_qd_t */
    268   ares_array_t     *an;            /*!< Type is ares_dns_rr_t */
    269   ares_array_t     *ns;            /*!< Type is ares_dns_rr_t */
    270   ares_array_t     *ar;            /*!< Type is ares_dns_rr_t */
    271 };
    272 
    273 #endif