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