Home | History | Annotate | Line # | Download | only in sldns
      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