line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
/* |
2
|
|
|
|
|
|
|
* util.h |
3
|
|
|
|
|
|
|
* |
4
|
|
|
|
|
|
|
* helper function header file |
5
|
|
|
|
|
|
|
* |
6
|
|
|
|
|
|
|
* a Net::DNS like library for C |
7
|
|
|
|
|
|
|
* |
8
|
|
|
|
|
|
|
* (c) NLnet Labs, 2004 |
9
|
|
|
|
|
|
|
* |
10
|
|
|
|
|
|
|
* See the file LICENSE for the license |
11
|
|
|
|
|
|
|
*/ |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
#ifndef _UTIL_H |
14
|
|
|
|
|
|
|
#define _UTIL_H |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
#include "EXTERN.h" |
17
|
|
|
|
|
|
|
#include "perl.h" |
18
|
|
|
|
|
|
|
#include |
19
|
|
|
|
|
|
|
#include |
20
|
|
|
|
|
|
|
#include |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
#ifdef __cplusplus |
23
|
|
|
|
|
|
|
extern "C" { |
24
|
|
|
|
|
|
|
#endif |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
#define dprintf(X,Y) fprintf(stderr, (X), (Y)) |
27
|
|
|
|
|
|
|
/* #define dprintf(X, Y) */ |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
#define LDNS_VERSION "1.6.18" |
30
|
|
|
|
|
|
|
#define LDNS_REVISION ((1<<16)|(6<<8)|(18)) |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
/** |
33
|
|
|
|
|
|
|
* splint static inline workaround |
34
|
|
|
|
|
|
|
*/ |
35
|
|
|
|
|
|
|
#ifdef S_SPLINT_S |
36
|
|
|
|
|
|
|
# define INLINE |
37
|
|
|
|
|
|
|
#else |
38
|
|
|
|
|
|
|
# ifdef SWIG |
39
|
|
|
|
|
|
|
# define INLINE static |
40
|
|
|
|
|
|
|
# else |
41
|
|
|
|
|
|
|
# define INLINE static inline |
42
|
|
|
|
|
|
|
# endif |
43
|
|
|
|
|
|
|
#endif |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
/** |
46
|
|
|
|
|
|
|
* Memory management macros |
47
|
|
|
|
|
|
|
*/ |
48
|
|
|
|
|
|
|
#define LDNS_MALLOC(type) LDNS_XMALLOC(type, 1) |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
#define LDNS_XMALLOC(type, count) ((type *) malloc((count) * sizeof(type))) |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
#define LDNS_CALLOC(type, count) ((type *) calloc((count), sizeof(type))) |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
#define LDNS_REALLOC(ptr, type) LDNS_XREALLOC((ptr), type, 1) |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
#define LDNS_XREALLOC(ptr, type, count) \ |
57
|
|
|
|
|
|
|
((type *) realloc((ptr), (count) * sizeof(type))) |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
#define LDNS_FREE(ptr) \ |
60
|
|
|
|
|
|
|
do { free((ptr)); (ptr) = NULL; } while (0) |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
#define LDNS_DEP printf("DEPRECATED FUNCTION!\n"); |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
/* |
65
|
|
|
|
|
|
|
* Copy data allowing for unaligned accesses in network byte order |
66
|
|
|
|
|
|
|
* (big endian). |
67
|
|
|
|
|
|
|
*/ |
68
|
|
|
|
|
|
|
INLINE uint16_t |
69
|
|
|
|
|
|
|
ldns_read_uint16(const void *src) |
70
|
|
|
|
|
|
|
{ |
71
|
|
|
|
|
|
|
#ifdef ALLOW_UNALIGNED_ACCESSES |
72
|
|
|
|
|
|
|
return ntohs(*(const uint16_t *) src); |
73
|
|
|
|
|
|
|
#else |
74
|
|
|
|
|
|
|
const uint8_t *p = (const uint8_t *) src; |
75
|
|
|
|
|
|
|
return ((uint16_t) p[0] << 8) | (uint16_t) p[1]; |
76
|
|
|
|
|
|
|
#endif |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
INLINE uint32_t |
80
|
|
|
|
|
|
|
ldns_read_uint32(const void *src) |
81
|
|
|
|
|
|
|
{ |
82
|
|
|
|
|
|
|
#ifdef ALLOW_UNALIGNED_ACCESSES |
83
|
|
|
|
|
|
|
return ntohl(*(const uint32_t *) src); |
84
|
|
|
|
|
|
|
#else |
85
|
|
|
|
|
|
|
const uint8_t *p = (const uint8_t *) src; |
86
|
|
|
|
|
|
|
return ( ((uint32_t) p[0] << 24) |
87
|
|
|
|
|
|
|
| ((uint32_t) p[1] << 16) |
88
|
|
|
|
|
|
|
| ((uint32_t) p[2] << 8) |
89
|
|
|
|
|
|
|
| (uint32_t) p[3]); |
90
|
|
|
|
|
|
|
#endif |
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
/* |
94
|
|
|
|
|
|
|
* Copy data allowing for unaligned accesses in network byte order |
95
|
|
|
|
|
|
|
* (big endian). |
96
|
|
|
|
|
|
|
*/ |
97
|
|
|
|
|
|
|
INLINE void |
98
|
0
|
|
|
|
|
|
ldns_write_uint16(void *dst, uint16_t data) |
99
|
|
|
|
|
|
|
{ |
100
|
|
|
|
|
|
|
#ifdef ALLOW_UNALIGNED_ACCESSES |
101
|
|
|
|
|
|
|
* (uint16_t *) dst = htons(data); |
102
|
|
|
|
|
|
|
#else |
103
|
0
|
|
|
|
|
|
uint8_t *p = (uint8_t *) dst; |
104
|
0
|
|
|
|
|
|
p[0] = (uint8_t) ((data >> 8) & 0xff); |
105
|
0
|
|
|
|
|
|
p[1] = (uint8_t) (data & 0xff); |
106
|
|
|
|
|
|
|
#endif |
107
|
0
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
INLINE void |
110
|
0
|
|
|
|
|
|
ldns_write_uint32(void *dst, uint32_t data) |
111
|
|
|
|
|
|
|
{ |
112
|
|
|
|
|
|
|
#ifdef ALLOW_UNALIGNED_ACCESSES |
113
|
|
|
|
|
|
|
* (uint32_t *) dst = htonl(data); |
114
|
|
|
|
|
|
|
#else |
115
|
0
|
|
|
|
|
|
uint8_t *p = (uint8_t *) dst; |
116
|
0
|
|
|
|
|
|
p[0] = (uint8_t) ((data >> 24) & 0xff); |
117
|
0
|
|
|
|
|
|
p[1] = (uint8_t) ((data >> 16) & 0xff); |
118
|
0
|
|
|
|
|
|
p[2] = (uint8_t) ((data >> 8) & 0xff); |
119
|
0
|
|
|
|
|
|
p[3] = (uint8_t) (data & 0xff); |
120
|
|
|
|
|
|
|
#endif |
121
|
0
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
/* warning. */ |
124
|
|
|
|
|
|
|
INLINE void |
125
|
|
|
|
|
|
|
ldns_write_uint64_as_uint48(void *dst, uint64_t data) |
126
|
|
|
|
|
|
|
{ |
127
|
|
|
|
|
|
|
uint8_t *p = (uint8_t *) dst; |
128
|
|
|
|
|
|
|
p[0] = (uint8_t) ((data >> 40) & 0xff); |
129
|
|
|
|
|
|
|
p[1] = (uint8_t) ((data >> 32) & 0xff); |
130
|
|
|
|
|
|
|
p[2] = (uint8_t) ((data >> 24) & 0xff); |
131
|
|
|
|
|
|
|
p[3] = (uint8_t) ((data >> 16) & 0xff); |
132
|
|
|
|
|
|
|
p[4] = (uint8_t) ((data >> 8) & 0xff); |
133
|
|
|
|
|
|
|
p[5] = (uint8_t) (data & 0xff); |
134
|
|
|
|
|
|
|
} |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
/** |
138
|
|
|
|
|
|
|
* Structure to do a Schwartzian-like transformation, for instance when |
139
|
|
|
|
|
|
|
* sorting. If you need a transformation on the objects that are sorted, |
140
|
|
|
|
|
|
|
* you can sue this to store the transformed values, so you do not |
141
|
|
|
|
|
|
|
* need to do the transformation again for each comparison |
142
|
|
|
|
|
|
|
*/ |
143
|
|
|
|
|
|
|
struct ldns_schwartzian_compare_struct { |
144
|
|
|
|
|
|
|
void *original_object; |
145
|
|
|
|
|
|
|
void *transformed_object; |
146
|
|
|
|
|
|
|
}; |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
/** A general purpose lookup table |
149
|
|
|
|
|
|
|
* |
150
|
|
|
|
|
|
|
* Lookup tables are arrays of (id, name) pairs, |
151
|
|
|
|
|
|
|
* So you can for instance lookup the RCODE 3, which is "NXDOMAIN", |
152
|
|
|
|
|
|
|
* and vice versa. The lookup tables themselves are defined wherever needed, |
153
|
|
|
|
|
|
|
* for instance in \ref host2str.c |
154
|
|
|
|
|
|
|
*/ |
155
|
|
|
|
|
|
|
struct ldns_struct_lookup_table { |
156
|
|
|
|
|
|
|
int id; |
157
|
|
|
|
|
|
|
const char *name; |
158
|
|
|
|
|
|
|
}; |
159
|
|
|
|
|
|
|
typedef struct ldns_struct_lookup_table ldns_lookup_table; |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
/** |
162
|
|
|
|
|
|
|
* Looks up the table entry by name, returns NULL if not found. |
163
|
|
|
|
|
|
|
* \param[in] table the lookup table to search in |
164
|
|
|
|
|
|
|
* \param[in] name what to search for |
165
|
|
|
|
|
|
|
* \return the item found |
166
|
|
|
|
|
|
|
*/ |
167
|
|
|
|
|
|
|
ldns_lookup_table *ldns_lookup_by_name(ldns_lookup_table table[], |
168
|
|
|
|
|
|
|
const char *name); |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
/** |
171
|
|
|
|
|
|
|
* Looks up the table entry by id, returns NULL if not found. |
172
|
|
|
|
|
|
|
* \param[in] table the lookup table to search in |
173
|
|
|
|
|
|
|
* \param[in] id what to search for |
174
|
|
|
|
|
|
|
* \return the item found |
175
|
|
|
|
|
|
|
*/ |
176
|
|
|
|
|
|
|
ldns_lookup_table *ldns_lookup_by_id(ldns_lookup_table table[], int id); |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
/** |
179
|
|
|
|
|
|
|
* Returns the value of the specified bit |
180
|
|
|
|
|
|
|
* The bits are counted from left to right, so bit #0 is the |
181
|
|
|
|
|
|
|
* left most bit. |
182
|
|
|
|
|
|
|
* \param[in] bits array holding the bits |
183
|
|
|
|
|
|
|
* \param[in] index to the wanted bit |
184
|
|
|
|
|
|
|
* \return |
185
|
|
|
|
|
|
|
*/ |
186
|
|
|
|
|
|
|
int ldns_get_bit(uint8_t bits[], size_t index); |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
/** |
190
|
|
|
|
|
|
|
* Returns the value of the specified bit |
191
|
|
|
|
|
|
|
* The bits are counted from right to left, so bit #0 is the |
192
|
|
|
|
|
|
|
* right most bit. |
193
|
|
|
|
|
|
|
* \param[in] bits array holding the bits |
194
|
|
|
|
|
|
|
* \param[in] index to the wanted bit |
195
|
|
|
|
|
|
|
* \return 1 or 0 depending no the bit state |
196
|
|
|
|
|
|
|
*/ |
197
|
|
|
|
|
|
|
int ldns_get_bit_r(uint8_t bits[], size_t index); |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
/** |
200
|
|
|
|
|
|
|
* sets the specified bit in the specified byte to |
201
|
|
|
|
|
|
|
* 1 if value is true, 0 if false |
202
|
|
|
|
|
|
|
* The bits are counted from right to left, so bit #0 is the |
203
|
|
|
|
|
|
|
* right most bit. |
204
|
|
|
|
|
|
|
* \param[in] byte the bit to set the bit in |
205
|
|
|
|
|
|
|
* \param[in] bit_nr the bit to set (0 <= n <= 7) |
206
|
|
|
|
|
|
|
* \param[in] value whether to set the bit to 1 or 0 |
207
|
|
|
|
|
|
|
* \return 1 or 0 depending no the bit state |
208
|
|
|
|
|
|
|
*/ |
209
|
|
|
|
|
|
|
void ldns_set_bit(uint8_t *byte, int bit_nr, bool value); |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
/** |
212
|
|
|
|
|
|
|
* Returns the value of a to the power of b |
213
|
|
|
|
|
|
|
* (or 1 of b < 1) |
214
|
|
|
|
|
|
|
*/ |
215
|
|
|
|
|
|
|
/*@unused@*/ |
216
|
|
|
|
|
|
|
INLINE long |
217
|
0
|
|
|
|
|
|
ldns_power(long a, long b) { |
218
|
0
|
|
|
|
|
|
long result = 1; |
219
|
0
|
0
|
|
|
|
|
while (b > 0) { |
220
|
0
|
0
|
|
|
|
|
if (b & 1) { |
221
|
0
|
|
|
|
|
|
result *= a; |
222
|
0
|
0
|
|
|
|
|
if (b == 1) { |
223
|
0
|
|
|
|
|
|
return result; |
224
|
|
|
|
|
|
|
} |
225
|
|
|
|
|
|
|
} |
226
|
0
|
|
|
|
|
|
a *= a; |
227
|
0
|
|
|
|
|
|
b /= 2; |
228
|
|
|
|
|
|
|
} |
229
|
0
|
|
|
|
|
|
return result; |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
/** |
233
|
|
|
|
|
|
|
* Returns the int value of the given (hex) digit |
234
|
|
|
|
|
|
|
* \param[in] ch the hex char to convert |
235
|
|
|
|
|
|
|
* \return the converted decimal value |
236
|
|
|
|
|
|
|
*/ |
237
|
|
|
|
|
|
|
int ldns_hexdigit_to_int(char ch); |
238
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
/** |
240
|
|
|
|
|
|
|
* Returns the char (hex) representation of the given int |
241
|
|
|
|
|
|
|
* \param[in] ch the int to convert |
242
|
|
|
|
|
|
|
* \return the converted hex char |
243
|
|
|
|
|
|
|
*/ |
244
|
|
|
|
|
|
|
char ldns_int_to_hexdigit(int ch); |
245
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
/** |
247
|
|
|
|
|
|
|
* Converts a hex string to binary data |
248
|
|
|
|
|
|
|
* |
249
|
|
|
|
|
|
|
* \param[out] data The binary result is placed here. |
250
|
|
|
|
|
|
|
* At least strlen(str)/2 bytes should be allocated |
251
|
|
|
|
|
|
|
* \param[in] str The hex string to convert. |
252
|
|
|
|
|
|
|
* This string should not contain spaces |
253
|
|
|
|
|
|
|
* \return The number of bytes of converted data, or -1 if one of the arguments * is NULL, or -2 if the string length is not an even number |
254
|
|
|
|
|
|
|
*/ |
255
|
|
|
|
|
|
|
int |
256
|
|
|
|
|
|
|
ldns_hexstring_to_data(uint8_t *data, const char *str); |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
/** |
259
|
|
|
|
|
|
|
* Show the internal library version |
260
|
|
|
|
|
|
|
* \return a string with the version in it |
261
|
|
|
|
|
|
|
*/ |
262
|
|
|
|
|
|
|
const char * ldns_version(void); |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
/** |
265
|
|
|
|
|
|
|
* Convert TM to seconds since epoch (midnight, January 1st, 1970). |
266
|
|
|
|
|
|
|
* Like timegm(3), which is not always available. |
267
|
|
|
|
|
|
|
* \param[in] tm a struct tm* with the date |
268
|
|
|
|
|
|
|
* \return the seconds since epoch |
269
|
|
|
|
|
|
|
*/ |
270
|
|
|
|
|
|
|
time_t ldns_mktime_from_utc(const struct tm *tm); |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
time_t mktime_from_utc(const struct tm *tm); |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
/** |
275
|
|
|
|
|
|
|
* The function interprets time as the number of seconds since epoch |
276
|
|
|
|
|
|
|
* with respect to now using serial arithmitics (rfc1982). |
277
|
|
|
|
|
|
|
* That number of seconds is then converted to broken-out time information. |
278
|
|
|
|
|
|
|
* This is especially usefull when converting the inception and expiration |
279
|
|
|
|
|
|
|
* fields of RRSIG records. |
280
|
|
|
|
|
|
|
* |
281
|
|
|
|
|
|
|
* \param[in] time number of seconds since epoch (midnight, January 1st, 1970) |
282
|
|
|
|
|
|
|
* to be intepreted as a serial arithmitics number relative to now. |
283
|
|
|
|
|
|
|
* \param[in] now number of seconds since epoch (midnight, January 1st, 1970) |
284
|
|
|
|
|
|
|
* to which the time value is compared to determine the final value. |
285
|
|
|
|
|
|
|
* \param[out] result the struct with the broken-out time information |
286
|
|
|
|
|
|
|
* \return result on success or NULL on error |
287
|
|
|
|
|
|
|
*/ |
288
|
|
|
|
|
|
|
struct tm * ldns_serial_arithmitics_gmtime_r(int32_t time, time_t now, struct tm *result); |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
/** |
291
|
|
|
|
|
|
|
* Seed the random function. |
292
|
|
|
|
|
|
|
* If the file descriptor is specified, the random generator is seeded with |
293
|
|
|
|
|
|
|
* data from that file. If not, /dev/urandom is used. |
294
|
|
|
|
|
|
|
* |
295
|
|
|
|
|
|
|
* applications should call this if they need entropy data within ldns |
296
|
|
|
|
|
|
|
* If openSSL is available, it is automatically seeded from /dev/urandom |
297
|
|
|
|
|
|
|
* or /dev/random. |
298
|
|
|
|
|
|
|
* |
299
|
|
|
|
|
|
|
* If you need more entropy, or have no openssl available, this function |
300
|
|
|
|
|
|
|
* MUST be called at the start of the program |
301
|
|
|
|
|
|
|
* |
302
|
|
|
|
|
|
|
* If openssl *is* available, this function just adds more entropy |
303
|
|
|
|
|
|
|
* |
304
|
|
|
|
|
|
|
* \param[in] fd a file providing entropy data for the seed |
305
|
|
|
|
|
|
|
* \param[in] size the number of bytes to use as entropy data. If this is 0, |
306
|
|
|
|
|
|
|
* only the minimal amount is taken (usually 4 bytes) |
307
|
|
|
|
|
|
|
* \return 0 if seeding succeeds, 1 if it fails |
308
|
|
|
|
|
|
|
*/ |
309
|
|
|
|
|
|
|
int ldns_init_random(FILE *fd, unsigned int size); |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
/** |
312
|
|
|
|
|
|
|
* Get random number. |
313
|
|
|
|
|
|
|
* \return random number. |
314
|
|
|
|
|
|
|
* |
315
|
|
|
|
|
|
|
*/ |
316
|
|
|
|
|
|
|
uint16_t ldns_get_random(void); |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
/** |
319
|
|
|
|
|
|
|
* Encode data as BubbleBabble |
320
|
|
|
|
|
|
|
* |
321
|
|
|
|
|
|
|
* \param[in] data a pointer to data to be encoded |
322
|
|
|
|
|
|
|
* \param[in] len size the number of bytes of data |
323
|
|
|
|
|
|
|
* \return a string of BubbleBabble |
324
|
|
|
|
|
|
|
*/ |
325
|
|
|
|
|
|
|
char *ldns_bubblebabble(uint8_t *data, size_t len); |
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
INLINE time_t ldns_time(time_t *t) { return time(t); } |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
/** |
332
|
|
|
|
|
|
|
* calculates the size needed to store the result of b32_ntop |
333
|
|
|
|
|
|
|
*/ |
334
|
|
|
|
|
|
|
/*@unused@*/ |
335
|
2
|
|
|
|
|
|
INLINE size_t ldns_b32_ntop_calculate_size(size_t src_data_length) |
336
|
|
|
|
|
|
|
{ |
337
|
2
|
50
|
|
|
|
|
return src_data_length == 0 ? 0 : ((src_data_length - 1) / 5 + 1) * 8; |
338
|
|
|
|
|
|
|
} |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
INLINE size_t ldns_b32_ntop_calculate_size_no_padding(size_t src_data_length) |
341
|
|
|
|
|
|
|
{ |
342
|
|
|
|
|
|
|
return ((src_data_length + 3) * 8 / 5) - 4; |
343
|
|
|
|
|
|
|
} |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
int ldns_b32_ntop(const uint8_t* src_data, size_t src_data_length, |
346
|
|
|
|
|
|
|
char* target_text_buffer, size_t target_text_buffer_size); |
347
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
int ldns_b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length, |
349
|
|
|
|
|
|
|
char* target_text_buffer, size_t target_text_buffer_size); |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
#if ! LDNS_BUILD_CONFIG_HAVE_B32_NTOP |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
int b32_ntop(const uint8_t* src_data, size_t src_data_length, |
354
|
|
|
|
|
|
|
char* target_text_buffer, size_t target_text_buffer_size); |
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
int b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length, |
357
|
|
|
|
|
|
|
char* target_text_buffer, size_t target_text_buffer_size); |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
#endif /* ! LDNS_BUILD_CONFIG_HAVE_B32_NTOP */ |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
/** |
363
|
|
|
|
|
|
|
* calculates the size needed to store the result of b32_pton |
364
|
|
|
|
|
|
|
*/ |
365
|
|
|
|
|
|
|
/*@unused@*/ |
366
|
2
|
|
|
|
|
|
INLINE size_t ldns_b32_pton_calculate_size(size_t src_text_length) |
367
|
|
|
|
|
|
|
{ |
368
|
2
|
|
|
|
|
|
return src_text_length * 5 / 8; |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
int ldns_b32_pton(const char* src_text, size_t src_text_length, |
372
|
|
|
|
|
|
|
uint8_t* target_data_buffer, size_t target_data_buffer_size); |
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
int ldns_b32_pton_extended_hex(const char* src_text, size_t src_text_length, |
375
|
|
|
|
|
|
|
uint8_t* target_data_buffer, size_t target_data_buffer_size); |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
#if ! LDNS_BUILD_CONFIG_HAVE_B32_PTON |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
int b32_pton(const char* src_text, size_t src_text_length, |
380
|
|
|
|
|
|
|
uint8_t* target_data_buffer, size_t target_data_buffer_size); |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
int b32_pton_extended_hex(const char* src_text, size_t src_text_length, |
383
|
|
|
|
|
|
|
uint8_t* target_data_buffer, size_t target_data_buffer_size); |
384
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
#endif /* ! LDNS_BUILD_CONFIG_HAVE_B32_PTON */ |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
#ifdef __cplusplus |
389
|
|
|
|
|
|
|
} |
390
|
|
|
|
|
|
|
#endif |
391
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
#endif /* !_UTIL_H */ |