xref: /freebsd/contrib/unbound/sldns/parseutil.h (revision ec0ea6efa1ad229d75c394c1a9b9cac33af2b1d3)
1 /*
2  * parseutil.h - parse utilities for string and wire conversion
3  *
4  * (c) NLnet Labs, 2004
5  *
6  * See the file LICENSE for the license
7  */
8 /**
9  * \file
10  *
11  * Utility functions for parsing, base32(DNS variant) and base64 encoding
12  * and decoding, Hex, Time units, Escape codes.
13  */
14 
15 #ifndef LDNS_PARSEUTIL_H
16 #define LDNS_PARSEUTIL_H
17 struct tm;
18 
19 /**
20  *  A general purpose lookup table
21  *
22  *  Lookup tables are arrays of (id, name) pairs,
23  *  So you can for instance lookup the RCODE 3, which is "NXDOMAIN",
24  *  and vice versa. The lookup tables themselves are defined wherever needed,
25  *  for instance in host2str.c
26  */
27 struct sldns_struct_lookup_table {
28         int id;
29         const char *name;
30 };
31 typedef struct sldns_struct_lookup_table sldns_lookup_table;
32 
33 /**
34  * Looks up the table entry by name, returns NULL if not found.
35  * \param[in] table the lookup table to search in
36  * \param[in] name what to search for
37  * \return the item found
38  */
39 sldns_lookup_table *sldns_lookup_by_name(sldns_lookup_table table[],
40                                        const char *name);
41 /**
42  * Looks up the table entry by id, returns NULL if not found.
43  * \param[in] table the lookup table to search in
44  * \param[in] id what to search for
45  * \return the item found
46  */
47 sldns_lookup_table *sldns_lookup_by_id(sldns_lookup_table table[], int id);
48 
49 /**
50  * Convert TM to seconds since epoch (midnight, January 1st, 1970).
51  * Like timegm(3), which is not always available.
52  * \param[in] tm a struct tm* with the date
53  * \return the seconds since epoch
54  */
55 time_t sldns_mktime_from_utc(const struct tm *tm);
56 
57 /**
58  * The function interprets time as the number of seconds since epoch
59  * with respect to now using serial arithmetics (rfc1982).
60  * That number of seconds is then converted to broken-out time information.
61  * This is especially useful when converting the inception and expiration
62  * fields of RRSIG records.
63  *
64  * \param[in] time number of seconds since epoch (midnight, January 1st, 1970)
65  *            to be interpreted as a serial arithmetics number relative to now.
66  * \param[in] now number of seconds since epoch (midnight, January 1st, 1970)
67  *            to which the time value is compared to determine the final value.
68  * \param[out] result the struct with the broken-out time information
69  * \return result on success or NULL on error
70  */
71 struct tm * sldns_serial_arithmetics_gmtime_r(int32_t time, time_t now, struct tm *result);
72 
73 /**
74  * converts a ttl value (like 5d2h) to a long.
75  * \param[in] nptr the start of the string
76  * \param[out] endptr points to the last char in case of error
77  * \return the convert duration value
78  */
79 uint32_t sldns_str2period(const char *nptr, const char **endptr);
80 
81 /**
82  * Returns the int value of the given (hex) digit
83  * \param[in] ch the hex char to convert
84  * \return the converted decimal value
85  */
86 int sldns_hexdigit_to_int(char ch);
87 
88 /**
89  * calculates the size needed to store the result of b64_ntop
90  */
91 size_t sldns_b64_ntop_calculate_size(size_t srcsize);
92 
93 int sldns_b64_ntop(uint8_t const *src, size_t srclength,
94 	char *target, size_t targsize);
95 int sldns_b64url_ntop(uint8_t const *src, size_t srclength, char *target,
96 	size_t targsize);
97 
98 /**
99  * calculates the size needed to store the result of sldns_b64_pton
100  */
101 size_t sldns_b64_pton_calculate_size(size_t srcsize);
102 int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize);
103 int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target,
104 	size_t targsize);
105 int sldns_b64_contains_nonurl(char const *src, size_t srcsize);
106 
107 /**
108  * calculates the size needed to store the result of b32_ntop
109  */
110 size_t sldns_b32_ntop_calculate_size(size_t src_data_length);
111 
112 size_t sldns_b32_ntop_calculate_size_no_padding(size_t src_data_length);
113 
114 int sldns_b32_ntop(const uint8_t* src_data, size_t src_data_length,
115 	char* target_text_buffer, size_t target_text_buffer_size);
116 
117 int sldns_b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length,
118 	char* target_text_buffer, size_t target_text_buffer_size);
119 
120 /**
121  * calculates the size needed to store the result of b32_pton
122  */
123 size_t sldns_b32_pton_calculate_size(size_t src_text_length);
124 
125 int sldns_b32_pton(const char* src_text, size_t src_text_length,
126 	uint8_t* target_data_buffer, size_t target_data_buffer_size);
127 
128 int sldns_b32_pton_extended_hex(const char* src_text, size_t src_text_length,
129 	uint8_t* target_data_buffer, size_t target_data_buffer_size);
130 
131 /*
132  * Checks whether the escaped value at **s is an octal value or
133  * a 'normally' escaped character (and not eos)
134  *
135  * @param ch_p: the parsed character
136  * @param str_p: the string. moved along for characters read.
137  * The string pointer at *s is increased by either 0 (on error), 1 (on
138  * normal escapes), or 3 (on octals)
139  *
140  * @return 0 on error
141  */
142 int sldns_parse_escape(uint8_t *ch_p, const char** str_p);
143 
144 /**
145  * Parse one character, with escape codes,
146  * @param ch_p: the parsed character
147  * @param str_p: the string. moved along for characters read.
148  * @return 0 on error
149  */
150 int sldns_parse_char(uint8_t *ch_p, const char** str_p);
151 
152 #endif /* LDNS_PARSEUTIL_H */
153