Home | History | Annotate | Line # | Download | only in sldns
      1 /**
      2  * wire2str.h -  txt presentation of RRs
      3  *
      4  * (c) NLnet Labs, 2005-2006
      5  *
      6  * See the file LICENSE for the license
      7  */
      8 
      9 /**
     10  * \file
     11  *
     12  * Contains functions to translate the wireformat to text
     13  * representation, as well as functions to print them.
     14  */
     15 
     16 #ifndef LDNS_WIRE2STR_H
     17 #define LDNS_WIRE2STR_H
     18 
     19 #ifdef __cplusplus
     20 extern "C" {
     21 #endif
     22 struct sldns_struct_lookup_table;
     23 
     24 /* lookup tables for standard DNS stuff  */
     25 /** Taken from RFC 2535, section 7.  */
     26 extern struct sldns_struct_lookup_table* sldns_algorithms;
     27 /** DS record hash algorithms */
     28 extern struct sldns_struct_lookup_table* sldns_hashes;
     29 /** Taken from RFC 2538, section 2.1.  */
     30 extern struct sldns_struct_lookup_table* sldns_cert_algorithms;
     31 /** Response codes */
     32 extern struct sldns_struct_lookup_table* sldns_rcodes;
     33 /** Operation codes */
     34 extern struct sldns_struct_lookup_table* sldns_opcodes;
     35 /** EDNS flags */
     36 extern struct sldns_struct_lookup_table* sldns_edns_flags;
     37 /** EDNS option codes */
     38 extern struct sldns_struct_lookup_table* sldns_edns_options;
     39 /** EDNS EDE codes */
     40 extern struct sldns_struct_lookup_table* sldns_edns_ede_codes;
     41 /** error string from wireparse */
     42 extern struct sldns_struct_lookup_table* sldns_wireparse_errors;
     43 /** tsig errors are the rcodes with extra (higher) values */
     44 extern struct sldns_struct_lookup_table* sldns_tsig_errors;
     45 
     46 /**
     47  * Convert wireformat packet to a string representation
     48  * @param data: wireformat packet data (starting at ID bytes).
     49  * @param len: length of packet.
     50  * @return string(malloced) or NULL on failure.
     51  */
     52 char* sldns_wire2str_pkt(uint8_t* data, size_t len);
     53 
     54 /**
     55  * Convert wireformat RR to a string representation.
     56  * @param rr: the wireformat RR, in uncompressed form.  Starts at the domain
     57  * 	name start, ends with the rdata of the RR.
     58  * @param len: length of the rr wireformat.
     59  * @return string(malloced) or NULL on failure.
     60  */
     61 char* sldns_wire2str_rr(uint8_t* rr, size_t len);
     62 
     63 /**
     64  * Convert wire dname to a string.
     65  * @param dname: the dname in uncompressed wireformat.
     66  * @param dname_len: length of the dname.
     67  * @return string or NULL on failure.
     68  */
     69 char* sldns_wire2str_dname(uint8_t* dname, size_t dname_len);
     70 
     71 /**
     72  * Convert wire RR type to a string, 'MX', 'TYPE1234'...
     73  * @param rrtype: the RR type in host order.
     74  * @return malloced string with the RR type or NULL on malloc failure.
     75  */
     76 char* sldns_wire2str_type(uint16_t rrtype);
     77 
     78 /**
     79  * Convert wire RR class to a string, 'IN', 'CLASS1'.
     80  * @param rrclass: the RR class in host order.
     81  * @return malloced string with the RR class or NULL on malloc failure.
     82  */
     83 char* sldns_wire2str_class(uint16_t rrclass);
     84 
     85 /**
     86  * Convert wire packet rcode to a string, 'NOERROR', 'NXDOMAIN'...
     87  * @param rcode: as integer, host order
     88  * @return malloced string with the rcode or NULL on malloc failure.
     89  */
     90 char* sldns_wire2str_rcode(int rcode);
     91 
     92 /**
     93  * Print to string, move string along for next content. With va_list.
     94  * @param str: string buffer.  Adjusted at end to after the output.
     95  * @param slen: length of the string buffer.  Adjusted at end.
     96  * @param format: printf format string.
     97  * @param args: arguments for printf.
     98  * @return number of characters needed. Can be larger than slen.
     99  */
    100 int sldns_str_vprint(char** str, size_t* slen, const char* format, va_list args);
    101 
    102 /**
    103  * Print to string, move string along for next content.
    104  * @param str: string buffer.  Adjusted at end to after the output.
    105  * @param slen: length of the string buffer.  Adjusted at end.
    106  * @param format: printf format string and arguments for it.
    107  * @return number of characters needed. Can be larger than slen.
    108  */
    109 int sldns_str_print(char** str, size_t* slen, const char* format, ...)
    110 	ATTR_FORMAT(printf, 3, 4);
    111 
    112 /**
    113  * Convert wireformat packet to a string representation with user buffer
    114  * It appends every RR with default comments.
    115  * For more formatter options use the function: TBD(TODO)
    116  * @param data: wireformat packet data (starting at ID bytes).
    117  * @param data_len: length of packet.
    118  * @param str: the string buffer for the output.
    119  * 	If you pass NULL as the str the return value of the function is
    120  * 	the str_len you need for the entire packet.  It does not include
    121  * 	the 0 byte at the end.
    122  * @param str_len: the size of the string buffer.  If more is needed, it'll
    123  * 	silently truncate the output to fit in the buffer.
    124  * @return the number of characters for this element, excluding zerobyte.
    125  * 	Is larger or equal than str_len if output was truncated.
    126  */
    127 int sldns_wire2str_pkt_buf(uint8_t* data, size_t data_len, char* str,
    128 	size_t str_len);
    129 
    130 /**
    131  * Scan wireformat packet to a string representation with user buffer
    132  * It appends every RR with default comments.
    133  * For more formatter options use the function: TBD(TODO)
    134  * @param data: wireformat packet data (starting at ID bytes).
    135  * @param data_len: length of packet.
    136  * @param str: the string buffer for the output.
    137  * @param str_len: the size of the string buffer.
    138  * @return number of characters for string.
    139  * returns the number of characters that are needed (except terminating null),
    140  * so it may return a value larger than str_len.
    141  * On error you get less output (i.e. shorter output in str (null terminated))
    142  * On exit the data, data_len, str and str_len values are adjusted to move them
    143  * from their original position along the input and output for the content
    144  * that has been consumed (and produced) by this function.  If the end of the
    145  * output string is reached, *str_len is set to 0.  The output string is null
    146  * terminated (shortening the output if necessary).  If the end of the input
    147  * is reached *data_len is set to 0.
    148  */
    149 int sldns_wire2str_pkt_scan(uint8_t** data, size_t* data_len, char** str,
    150 	size_t* str_len);
    151 
    152 /**
    153  * Scan wireformat rr to string, with user buffers.  It shifts the arguments
    154  * to move along (see sldns_wire2str_pkt_scan).
    155  * @param data: wireformat data.
    156  * @param data_len: length of data buffer.
    157  * @param str: string buffer.
    158  * @param str_len: length of string buffer.
    159  * @param pkt: packet for decompression, if NULL no decompression.
    160  * @param pktlen: length of packet buffer.
    161  * @param comprloop: if pkt, bool detects compression loops.
    162  * @return number of characters (except null) needed to print.
    163  */
    164 int sldns_wire2str_rr_scan(uint8_t** data, size_t* data_len, char** str,
    165 	size_t* str_len, uint8_t* pkt, size_t pktlen, int* comprloop);
    166 
    167 /**
    168  * Scan wireformat question rr to string, with user buffers.
    169  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    170  * @param data: wireformat data.
    171  * @param data_len: length of data buffer.
    172  * @param str: string buffer.
    173  * @param str_len: length of string buffer.
    174  * @param pkt: packet for decompression, if NULL no decompression.
    175  * @param pktlen: length of packet buffer.
    176  * @param comprloop: if pkt, bool detects compression loops.
    177  * @return number of characters (except null) needed to print.
    178  */
    179 int sldns_wire2str_rrquestion_scan(uint8_t** data, size_t* data_len, char** str,
    180 	size_t* str_len, uint8_t* pkt, size_t pktlen, int* comprloop);
    181 
    182 /**
    183  * Scan wireformat RR to string in unknown RR format, with user buffers.
    184  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    185  * @param data: wireformat data.
    186  * @param data_len: length of data buffer.
    187  * @param str: string buffer.
    188  * @param str_len: length of string buffer.
    189  * @param pkt: packet for decompression, if NULL no decompression.
    190  * @param pktlen: length of packet buffer.
    191  * @param comprloop: if pkt, bool detects compression loops.
    192  * @return number of characters (except null) needed to print.
    193  */
    194 int sldns_wire2str_rr_unknown_scan(uint8_t** data, size_t* data_len, char** str,
    195 	size_t* str_len, uint8_t* pkt, size_t pktlen, int* comprloop);
    196 
    197 /**
    198  * Print to string the RR-information comment in default format,
    199  * with user buffers.  Moves string along.
    200  * @param str: string buffer.
    201  * @param str_len: length of string buffer.
    202  * @param rr: wireformat data.
    203  * @param rrlen: length of data buffer.
    204  * @param dname_off: offset in buffer behind owner dname, the compressed size
    205  * 	of the owner name.
    206  * @param rrtype: type of the RR, host format.
    207  * @return number of characters (except null) needed to print.
    208  */
    209 int sldns_wire2str_rr_comment_print(char** str, size_t* str_len, uint8_t* rr,
    210 	size_t rrlen, size_t dname_off, uint16_t rrtype);
    211 
    212 /**
    213  * Scan wireformat packet header to string, with user buffers.
    214  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    215  * @param data: wireformat data.
    216  * @param data_len: length of data buffer.
    217  * @param str: string buffer.
    218  * @param str_len: length of string buffer.
    219  * @return number of characters (except null) needed to print.
    220  */
    221 int sldns_wire2str_header_scan(uint8_t** data, size_t* data_len, char** str,
    222 	size_t* str_len);
    223 
    224 /**
    225  * Scan wireformat rdata to string, with user buffers.
    226  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    227  * @param data: wireformat data.
    228  * @param data_len: length of data buffer.  The length of the rdata in the
    229  * 	buffer.  The rdatalen itself has already been scanned, the data
    230  * 	points to the rdata after the rdatalen.
    231  * @param str: string buffer.
    232  * @param str_len: length of string buffer.
    233  * @param rrtype: RR type of Rdata, host format.
    234  * @param pkt: packet for decompression, if NULL no decompression.
    235  * @param pktlen: length of packet buffer.
    236  * @param comprloop: if pkt, bool detects compression loops.
    237  * @return number of characters (except null) needed to print.
    238  */
    239 int sldns_wire2str_rdata_scan(uint8_t** data, size_t* data_len, char** str,
    240 	size_t* str_len, uint16_t rrtype, uint8_t* pkt, size_t pktlen,
    241 	int* comprloop);
    242 
    243 /**
    244  * Scan wireformat rdata to string in unknown format, with user buffers.
    245  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    246  * @param data: wireformat data.
    247  * @param data_len: length of data buffer, the length of the rdata in buffer.
    248  * @param str: string buffer.
    249  * @param str_len: length of string buffer.
    250  * @return number of characters (except null) needed to print.
    251  */
    252 int sldns_wire2str_rdata_unknown_scan(uint8_t** data, size_t* data_len,
    253 	char** str, size_t* str_len);
    254 
    255 /**
    256  * Scan wireformat domain name to string, with user buffers.
    257  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    258  * @param data: wireformat data.
    259  * @param data_len: length of data buffer.
    260  * @param str: string buffer.
    261  * @param str_len: length of string buffer.
    262  * @param pkt: packet for decompression, if NULL no decompression.
    263  * @param pktlen: length of packet buffer.
    264  * @param comprloop: inout bool, that is set true if compression loop failure
    265  * 	happens.  Pass in 0, if passed in as true, a lower bound is set
    266  * 	on compression loops to stop arbitrary long packet parse times.
    267  * 	This is meant so you can set it to 0 at the start of a list of dnames,
    268  * 	and then scan all of them in sequence, if a loop happens, it becomes
    269  * 	true and then it becomes more strict for the next dnames in the list.
    270  * 	You can leave it at NULL if there is no pkt (pkt is NULL too).
    271  * @return number of characters (except null) needed to print.
    272  */
    273 int sldns_wire2str_dname_scan(uint8_t** data, size_t* data_len, char** str,
    274 	size_t* str_len, uint8_t* pkt, size_t pktlen, int* comprloop);
    275 
    276 /**
    277  * Scan wireformat rr type to string, with user buffers.
    278  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    279  * @param data: wireformat data.
    280  * @param data_len: length of data buffer.
    281  * @param str: string buffer.
    282  * @param str_len: length of string buffer.
    283  * @return number of characters (except null) needed to print.
    284  */
    285 int sldns_wire2str_type_scan(uint8_t** data, size_t* data_len, char** str,
    286         size_t* str_len);
    287 
    288 /**
    289  * Scan wireformat rr class to string, with user buffers.
    290  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    291  * @param data: wireformat data.
    292  * @param data_len: length of data buffer.
    293  * @param str: string buffer.
    294  * @param str_len: length of string buffer.
    295  * @return number of characters (except null) needed to print.
    296  */
    297 int sldns_wire2str_class_scan(uint8_t** data, size_t* data_len, char** str,
    298         size_t* str_len);
    299 
    300 /**
    301  * Scan wireformat rr ttl to string, with user buffers.
    302  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    303  * @param data: wireformat data.
    304  * @param data_len: length of data buffer.
    305  * @param str: string buffer.
    306  * @param str_len: length of string buffer.
    307  * @return number of characters (except null) needed to print.
    308  */
    309 int sldns_wire2str_ttl_scan(uint8_t** data, size_t* data_len, char** str,
    310         size_t* str_len);
    311 
    312 
    313 /**
    314  * Print host format rr type to string.  Moves string along, user buffers.
    315  * @param str: string buffer.
    316  * @param str_len: length of string buffer.
    317  * @param rrtype: host format rr type.
    318  * @return number of characters (except null) needed to print.
    319  */
    320 int sldns_wire2str_type_print(char** str, size_t* str_len, uint16_t rrtype);
    321 
    322 /**
    323  * Print host format rr class to string.  Moves string along, user buffers.
    324  * @param str: string buffer.
    325  * @param str_len: length of string buffer.
    326  * @param rrclass: host format rr class.
    327  * @return number of characters (except null) needed to print.
    328  */
    329 int sldns_wire2str_class_print(char** str, size_t* str_len, uint16_t rrclass);
    330 
    331 /**
    332  * Print host format rcode to string.  Moves string along, user buffers.
    333  * @param str: string buffer.
    334  * @param str_len: length of string buffer.
    335  * @param rcode: host format rcode number.
    336  * @return number of characters (except null) needed to print.
    337  */
    338 int sldns_wire2str_rcode_print(char** str, size_t* str_len, int rcode);
    339 
    340 /**
    341  * Print host format opcode to string.  Moves string along, user buffers.
    342  * @param str: string buffer.
    343  * @param str_len: length of string buffer.
    344  * @param opcode: host format opcode number.
    345  * @return number of characters (except null) needed to print.
    346  */
    347 int sldns_wire2str_opcode_print(char** str, size_t* str_len, int opcode);
    348 
    349 /**
    350  * Print host format EDNS0 option to string.  Moves string along, user buffers.
    351  * @param str: string buffer.
    352  * @param str_len: length of string buffer.
    353  * @param opcode: host format option number.
    354  * @return number of characters (except null) needed to print.
    355  */
    356 int sldns_wire2str_edns_option_code_print(char** str, size_t* str_len,
    357 	uint16_t opcode);
    358 
    359 /**
    360  * Convert RR to string presentation format, on one line.  User buffer.
    361  * @param rr: wireformat RR data
    362  * @param rr_len: length of the rr wire data.
    363  * @param str: the string buffer to write to.
    364  * 	If you pass NULL as the str, the return value of the function is
    365  * 	the str_len you need for the entire packet.  It does not include
    366  * 	the 0 byte at the end.
    367  * @param str_len: the size of the string buffer.  If more is needed, it'll
    368  * 	silently truncate the output to fit in the buffer.
    369  * @return the number of characters for this element, excluding zerobyte.
    370  * 	Is larger or equal than str_len if output was truncated.
    371  */
    372 int sldns_wire2str_rr_buf(uint8_t* rr, size_t rr_len, char* str,
    373 	size_t str_len);
    374 
    375 /**
    376  * Convert question RR to string presentation format, on one line.  User buffer.
    377  * @param rr: wireformat RR data
    378  * @param rr_len: length of the rr wire data.
    379  * @param str: the string buffer to write to.
    380  * 	If you pass NULL as the str, the return value of the function is
    381  * 	the str_len you need for the entire packet.  It does not include
    382  * 	the 0 byte at the end.
    383  * @param str_len: the size of the string buffer.  If more is needed, it'll
    384  * 	silently truncate the output to fit in the buffer.
    385  * @return the number of characters for this element, excluding zerobyte.
    386  * 	Is larger or equal than str_len if output was truncated.
    387  */
    388 int sldns_wire2str_rrquestion_buf(uint8_t* rr, size_t rr_len, char* str,
    389 	size_t str_len);
    390 
    391 /**
    392  * 3597 printout of an RR in unknown rr format.
    393  * There are more format and comment options available for printout
    394  * with the function: TBD(TODO)
    395  * @param rr: wireformat RR data
    396  * @param rr_len: length of the rr wire data.
    397  * @param str: the string buffer to write to.
    398  * 	If you pass NULL as the str, the return value of the function is
    399  * 	the str_len you need for the entire rr.  It does not include
    400  * 	the 0 byte at the end.
    401  * @param str_len: the size of the string buffer.  If more is needed, it'll
    402  * 	silently truncate the output to fit in the buffer.
    403  * @return the number of characters for this element, excluding zerobyte.
    404  * 	Is larger or equal than str_len if output was truncated.
    405  */
    406 int sldns_wire2str_rr_unknown_buf(uint8_t* rr, size_t rr_len, char* str,
    407 	size_t str_len);
    408 
    409 /**
    410  * This creates the comment to print after the RR. ; keytag=... , and other
    411  * basic comments for RRs.
    412  * There are more format and comment options available for printout
    413  * with the function: TBD(TODO)
    414  * @param rr: wireformat RR data
    415  * @param rr_len: length of the rr wire data.
    416  * @param dname_len: length of the dname in front of the RR.
    417  * @param str: the string buffer to write to.
    418  * 	If you pass NULL as the str, the return value of the function is
    419  * 	the str_len you need for the entire comment.  It does not include
    420  * 	the 0 byte at the end.
    421  * @param str_len: the size of the string buffer.  If more is needed, it'll
    422  * 	silently truncate the output to fit in the buffer.
    423  * @return the number of characters for this element, excluding zerobyte.
    424  * 	Is larger or equal than str_len if output was truncated.
    425  */
    426 int sldns_wire2str_rr_comment_buf(uint8_t* rr, size_t rr_len, size_t dname_len,
    427 	char* str, size_t str_len);
    428 
    429 /**
    430  * Convert RDATA to string presentation format, on one line.  User buffer.
    431  * @param rdata: wireformat rdata part of an RR.
    432  * @param rdata_len: length of the rr wire data.
    433  * @param str: the string buffer to write to.
    434  * 	If you pass NULL as the str, the return value of the function is
    435  * 	the str_len you need for the entire packet.  It does not include
    436  * 	the 0 byte at the end.
    437  * @param str_len: the size of the string buffer.  If more is needed, it'll
    438  * 	silently truncate the output to fit in the buffer.
    439  * @param rrtype: rr type of the data
    440  * @return the number of characters for this element, excluding zerobyte.
    441  * 	Is larger or equal than str_len if output was truncated.
    442  */
    443 int sldns_wire2str_rdata_buf(uint8_t* rdata, size_t rdata_len, char* str,
    444 	size_t str_len, uint16_t rrtype);
    445 
    446 /**
    447  * Convert wire RR type to a string, 'MX', 'TYPE12'.  With user buffer.
    448  * @param rrtype: the RR type in host order.
    449  * @param str: the string to write to.
    450  * @param len: length of str.
    451  * @return the number of characters for this element, excluding zerobyte.
    452  * 	Is larger or equal than str_len if output was truncated.
    453  */
    454 int sldns_wire2str_type_buf(uint16_t rrtype, char* str, size_t len);
    455 
    456 /**
    457  * Convert wire RR class to a string, 'IN', 'CLASS12'.  With user buffer.
    458  * @param rrclass: the RR class in host order.
    459  * @param str: the string to write to.
    460  * @param len: length of str.
    461  * @return the number of characters for this element, excluding zerobyte.
    462  * 	Is larger or equal than str_len if output was truncated.
    463  */
    464 int sldns_wire2str_class_buf(uint16_t rrclass, char* str, size_t len);
    465 
    466 /**
    467  * Convert wire RR rcode to a string, 'NOERROR', 'NXDOMAIN'.  With user buffer.
    468  * @param rcode: rcode as integer in host order
    469  * @param str: the string to write to.
    470  * @param len: length of str.
    471  * @return the number of characters for this element, excluding zerobyte.
    472  * 	Is larger or equal than str_len if output was truncated.
    473  */
    474 int sldns_wire2str_rcode_buf(int rcode, char* str, size_t len);
    475 
    476 /**
    477  * Convert host format opcode to a string. 'QUERY', 'NOTIFY', 'UPDATE'.
    478  * With user buffer.
    479  * @param opcode: opcode as integer in host order
    480  * @param str: the string to write to.
    481  * @param len: length of str.
    482  * @return the number of characters for this element, excluding zerobyte.
    483  * 	Is larger or equal than str_len if output was truncated.
    484  */
    485 int sldns_wire2str_opcode_buf(int opcode, char* str, size_t len);
    486 
    487 /**
    488  * Convert wire dname to a string, "example.com.".  With user buffer.
    489  * @param dname: the dname in uncompressed wireformat.
    490  * @param dname_len: length of the dname.
    491  * @param str: the string to write to.
    492  * @param len: length of string.
    493  * @return the number of characters for this element, excluding zerobyte.
    494  * 	Is larger or equal than str_len if output was truncated.
    495  */
    496 int sldns_wire2str_dname_buf(uint8_t* dname, size_t dname_len, char* str,
    497 	size_t len);
    498 
    499 /**
    500  * Convert wire SVCB to a string with user buffer.
    501  * @param d: the SVCB data in uncompressed wireformat.
    502  * @param dlen: length of the SVCB data.
    503  * @param s: the string to write to.
    504  * @param slen: length of string.
    505  * @return the number of characters for this element, excluding zerobyte.
    506  * 	Is larger or equal than str_len if output was truncated.
    507  */
    508 int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s,
    509 	size_t* slen);
    510 
    511 /**
    512  * Scan wireformat rdf field to string, with user buffers.
    513  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    514  * @param data: wireformat data.
    515  * @param data_len: length of data buffer.
    516  * @param str: string buffer.
    517  * @param str_len: length of string buffer.
    518  * @param rdftype: the type of the rdata field, enum sldns_rdf_type.
    519  * @param pkt: packet for decompression, if NULL no decompression.
    520  * @param pktlen: length of packet buffer.
    521  * @param comprloop: if pkt, bool detects compression loops.
    522  * @return number of characters (except null) needed to print.
    523  * 	Can return -1 on failure.
    524  */
    525 int sldns_wire2str_rdf_scan(uint8_t** data, size_t* data_len, char** str,
    526 	size_t* str_len, int rdftype, uint8_t* pkt, size_t pktlen,
    527 	int* comprloop);
    528 
    529 /**
    530  * Scan wireformat int8 field to string, with user buffers.
    531  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    532  * @param data: wireformat data.
    533  * @param data_len: length of data buffer.
    534  * @param str: string buffer.
    535  * @param str_len: length of string buffer.
    536  * @return number of characters (except null) needed to print.
    537  * 	Can return -1 on failure.
    538  */
    539 int sldns_wire2str_int8_scan(uint8_t** data, size_t* data_len, char** str,
    540 	size_t* str_len);
    541 
    542 /**
    543  * Scan wireformat int16 field to string, with user buffers.
    544  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    545  * @param data: wireformat data.
    546  * @param data_len: length of data buffer.
    547  * @param str: string buffer.
    548  * @param str_len: length of string buffer.
    549  * @return number of characters (except null) needed to print.
    550  * 	Can return -1 on failure.
    551  */
    552 int sldns_wire2str_int16_scan(uint8_t** data, size_t* data_len, char** str,
    553 	size_t* str_len);
    554 
    555 /**
    556  * Scan wireformat int32 field to string, with user buffers.
    557  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    558  * @param data: wireformat data.
    559  * @param data_len: length of data buffer.
    560  * @param str: string buffer.
    561  * @param str_len: length of string buffer.
    562  * @return number of characters (except null) needed to print.
    563  * 	Can return -1 on failure.
    564  */
    565 int sldns_wire2str_int32_scan(uint8_t** data, size_t* data_len, char** str,
    566 	size_t* str_len);
    567 
    568 /**
    569  * Scan wireformat period field to string, with user buffers.
    570  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    571  * @param data: wireformat data.
    572  * @param data_len: length of data buffer.
    573  * @param str: string buffer.
    574  * @param str_len: length of string buffer.
    575  * @return number of characters (except null) needed to print.
    576  * 	Can return -1 on failure.
    577  */
    578 int sldns_wire2str_period_scan(uint8_t** data, size_t* data_len, char** str,
    579 	size_t* str_len);
    580 
    581 /**
    582  * Scan wireformat tsigtime field to string, with user buffers.
    583  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    584  * @param data: wireformat data.
    585  * @param data_len: length of data buffer.
    586  * @param str: string buffer.
    587  * @param str_len: length of string buffer.
    588  * @return number of characters (except null) needed to print.
    589  * 	Can return -1 on failure.
    590  */
    591 int sldns_wire2str_tsigtime_scan(uint8_t** data, size_t* data_len, char** str,
    592 	size_t* str_len);
    593 
    594 /**
    595  * Scan wireformat ip4 A field to string, with user buffers.
    596  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    597  * @param data: wireformat data.
    598  * @param data_len: length of data buffer.
    599  * @param str: string buffer.
    600  * @param str_len: length of string buffer.
    601  * @return number of characters (except null) needed to print.
    602  * 	Can return -1 on failure.
    603  */
    604 int sldns_wire2str_a_scan(uint8_t** data, size_t* data_len, char** str,
    605 	size_t* str_len);
    606 
    607 /**
    608  * Scan wireformat ip6 AAAA field to string, with user buffers.
    609  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    610  * @param data: wireformat data.
    611  * @param data_len: length of data buffer.
    612  * @param str: string buffer.
    613  * @param str_len: length of string buffer.
    614  * @return number of characters (except null) needed to print.
    615  * 	Can return -1 on failure.
    616  */
    617 int sldns_wire2str_aaaa_scan(uint8_t** data, size_t* data_len, char** str,
    618 	size_t* str_len);
    619 
    620 /**
    621  * Scan wireformat str field to string, with user buffers.
    622  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    623  * @param data: wireformat data.
    624  * @param data_len: length of data buffer.
    625  * @param str: string buffer.
    626  * @param str_len: length of string buffer.
    627  * @return number of characters (except null) needed to print.
    628  * 	Can return -1 on failure.
    629  */
    630 int sldns_wire2str_str_scan(uint8_t** data, size_t* data_len, char** str,
    631 	size_t* str_len);
    632 
    633 /**
    634  * Scan wireformat apl field to string, with user buffers.
    635  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    636  * @param data: wireformat data.
    637  * @param data_len: length of data buffer.
    638  * @param str: string buffer.
    639  * @param str_len: length of string buffer.
    640  * @return number of characters (except null) needed to print.
    641  * 	Can return -1 on failure.
    642  */
    643 int sldns_wire2str_apl_scan(uint8_t** data, size_t* data_len, char** str,
    644 	size_t* str_len);
    645 
    646 /**
    647  * Scan wireformat b32_ext field to string, with user buffers.
    648  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    649  * @param data: wireformat data.
    650  * @param data_len: length of data buffer.
    651  * @param str: string buffer.
    652  * @param str_len: length of string buffer.
    653  * @return number of characters (except null) needed to print.
    654  * 	Can return -1 on failure.
    655  */
    656 int sldns_wire2str_b32_ext_scan(uint8_t** data, size_t* data_len, char** str,
    657 	size_t* str_len);
    658 
    659 /**
    660  * Scan wireformat b64 field to string, with user buffers.
    661  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    662  * @param data: wireformat data.
    663  * @param data_len: length of data buffer.
    664  * @param str: string buffer.
    665  * @param str_len: length of string buffer.
    666  * @return number of characters (except null) needed to print.
    667  * 	Can return -1 on failure.
    668  */
    669 int sldns_wire2str_b64_scan(uint8_t** data, size_t* data_len, char** str,
    670 	size_t* str_len);
    671 
    672 /**
    673  * Scan wireformat hex field to string, with user buffers.
    674  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    675  * @param data: wireformat data.
    676  * @param data_len: length of data buffer.
    677  * @param str: string buffer.
    678  * @param str_len: length of string buffer.
    679  * @return number of characters (except null) needed to print.
    680  * 	Can return -1 on failure.
    681  */
    682 int sldns_wire2str_hex_scan(uint8_t** data, size_t* data_len, char** str,
    683 	size_t* str_len);
    684 
    685 /**
    686  * Scan wireformat nsec bitmap field to string, with user buffers.
    687  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    688  * @param data: wireformat data.
    689  * @param data_len: length of data buffer.
    690  * @param str: string buffer.
    691  * @param str_len: length of string buffer.
    692  * @return number of characters (except null) needed to print.
    693  * 	Can return -1 on failure.
    694  */
    695 int sldns_wire2str_nsec_scan(uint8_t** data, size_t* data_len, char** str,
    696 	size_t* str_len);
    697 
    698 /**
    699  * Scan wireformat nsec3_salt field to string, with user buffers.
    700  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    701  * @param data: wireformat data.
    702  * @param data_len: length of data buffer.
    703  * @param str: string buffer.
    704  * @param str_len: length of string buffer.
    705  * @return number of characters (except null) needed to print.
    706  * 	Can return -1 on failure.
    707  */
    708 int sldns_wire2str_nsec3_salt_scan(uint8_t** data, size_t* data_len, char** str,
    709 	size_t* str_len);
    710 
    711 /**
    712  * Scan wireformat cert_alg field to string, with user buffers.
    713  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    714  * @param data: wireformat data.
    715  * @param data_len: length of data buffer.
    716  * @param str: string buffer.
    717  * @param str_len: length of string buffer.
    718  * @return number of characters (except null) needed to print.
    719  * 	Can return -1 on failure.
    720  */
    721 int sldns_wire2str_cert_alg_scan(uint8_t** data, size_t* data_len, char** str,
    722 	size_t* str_len);
    723 
    724 /**
    725  * Scan wireformat alg field to string, with user buffers.
    726  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    727  * @param data: wireformat data.
    728  * @param data_len: length of data buffer.
    729  * @param str: string buffer.
    730  * @param str_len: length of string buffer.
    731  * @return number of characters (except null) needed to print.
    732  * 	Can return -1 on failure.
    733  */
    734 int sldns_wire2str_alg_scan(uint8_t** data, size_t* data_len, char** str,
    735 	size_t* str_len);
    736 
    737 /**
    738  * Scan wireformat type unknown field to string, with user buffers.
    739  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    740  * @param data: wireformat data.
    741  * @param data_len: length of data buffer.
    742  * @param str: string buffer.
    743  * @param str_len: length of string buffer.
    744  * @return number of characters (except null) needed to print.
    745  * 	Can return -1 on failure.
    746  */
    747 int sldns_wire2str_unknown_scan(uint8_t** data, size_t* data_len, char** str,
    748 	size_t* str_len);
    749 
    750 /**
    751  * Scan wireformat time field to string, with user buffers.
    752  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    753  * @param data: wireformat data.
    754  * @param data_len: length of data buffer.
    755  * @param str: string buffer.
    756  * @param str_len: length of string buffer.
    757  * @return number of characters (except null) needed to print.
    758  * 	Can return -1 on failure.
    759  */
    760 int sldns_wire2str_time_scan(uint8_t** data, size_t* data_len, char** str,
    761 	size_t* str_len);
    762 
    763 /**
    764  * Scan wireformat LOC field to string, with user buffers.
    765  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    766  * @param data: wireformat data.
    767  * @param data_len: length of data buffer.
    768  * @param str: string buffer.
    769  * @param str_len: length of string buffer.
    770  * @return number of characters (except null) needed to print.
    771  * 	Can return -1 on failure.
    772  */
    773 int sldns_wire2str_loc_scan(uint8_t** data, size_t* data_len, char** str,
    774 	size_t* str_len);
    775 
    776 /**
    777  * Scan wireformat WKS field to string, with user buffers.
    778  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    779  * @param data: wireformat data.
    780  * @param data_len: length of data buffer.
    781  * @param str: string buffer.
    782  * @param str_len: length of string buffer.
    783  * @return number of characters (except null) needed to print.
    784  * 	Can return -1 on failure.
    785  */
    786 int sldns_wire2str_wks_scan(uint8_t** data, size_t* data_len, char** str,
    787 	size_t* str_len);
    788 
    789 /**
    790  * Scan wireformat NSAP field to string, with user buffers.
    791  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    792  * @param data: wireformat data.
    793  * @param data_len: length of data buffer.
    794  * @param str: string buffer.
    795  * @param str_len: length of string buffer.
    796  * @return number of characters (except null) needed to print.
    797  * 	Can return -1 on failure.
    798  */
    799 int sldns_wire2str_nsap_scan(uint8_t** data, size_t* data_len, char** str,
    800 	size_t* str_len);
    801 
    802 /**
    803  * Scan wireformat ATMA field to string, with user buffers.
    804  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    805  * @param data: wireformat data.
    806  * @param data_len: length of data buffer.
    807  * @param str: string buffer.
    808  * @param str_len: length of string buffer.
    809  * @return number of characters (except null) needed to print.
    810  * 	Can return -1 on failure.
    811  */
    812 int sldns_wire2str_atma_scan(uint8_t** data, size_t* data_len, char** str,
    813 	size_t* str_len);
    814 
    815 /**
    816  * Scan wireformat IPSECKEY field to string, with user buffers.
    817  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    818  * @param data: wireformat data.
    819  * @param data_len: length of data buffer.
    820  * @param str: string buffer.
    821  * @param str_len: length of string buffer.
    822  * @param pkt: packet for decompression, if NULL no decompression.
    823  * @param pktlen: length of packet buffer.
    824  * @param comprloop: if pkt, bool detects compression loops.
    825  * @return number of characters (except null) needed to print.
    826  * 	Can return -1 on failure.
    827  */
    828 int sldns_wire2str_ipseckey_scan(uint8_t** data, size_t* data_len, char** str,
    829 	size_t* str_len, uint8_t* pkt, size_t pktlen, int* comprloop);
    830 
    831 /**
    832  * Scan wireformat HIP (algo, HIT, pubkey) field to string, with user buffers.
    833  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    834  * @param data: wireformat data.
    835  * @param data_len: length of data buffer.
    836  * @param str: string buffer.
    837  * @param str_len: length of string buffer.
    838  * @return number of characters (except null) needed to print.
    839  * 	Can return -1 on failure.
    840  */
    841 int sldns_wire2str_hip_scan(uint8_t** data, size_t* data_len, char** str,
    842 	size_t* str_len);
    843 
    844 /**
    845  * Scan wireformat int16_data field to string, with user buffers.
    846  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    847  * @param data: wireformat data.
    848  * @param data_len: length of data buffer.
    849  * @param str: string buffer.
    850  * @param str_len: length of string buffer.
    851  * @return number of characters (except null) needed to print.
    852  * 	Can return -1 on failure.
    853  */
    854 int sldns_wire2str_int16_data_scan(uint8_t** data, size_t* data_len, char** str,
    855 	size_t* str_len);
    856 
    857 /**
    858  * Scan wireformat tsigerror field to string, with user buffers.
    859  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    860  * @param data: wireformat data.
    861  * @param data_len: length of data buffer.
    862  * @param str: string buffer.
    863  * @param str_len: length of string buffer.
    864  * @return number of characters (except null) needed to print.
    865  * 	Can return -1 on failure.
    866  */
    867 int sldns_wire2str_tsigerror_scan(uint8_t** data, size_t* data_len, char** str,
    868 	size_t* str_len);
    869 
    870 /**
    871  * Scan wireformat nsec3_next_owner field to string, with user buffers.
    872  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    873  * @param data: wireformat data.
    874  * @param data_len: length of data buffer.
    875  * @param str: string buffer.
    876  * @param str_len: length of string buffer.
    877  * @return number of characters (except null) needed to print.
    878  * 	Can return -1 on failure.
    879  */
    880 int sldns_wire2str_nsec3_next_owner_scan(uint8_t** data, size_t* data_len,
    881 	char** str, size_t* str_len);
    882 
    883 /**
    884  * Scan wireformat ILNP64 field to string, with user buffers.
    885  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    886  * @param data: wireformat data.
    887  * @param data_len: length of data buffer.
    888  * @param str: string buffer.
    889  * @param str_len: length of string buffer.
    890  * @return number of characters (except null) needed to print.
    891  * 	Can return -1 on failure.
    892  */
    893 int sldns_wire2str_ilnp64_scan(uint8_t** data, size_t* data_len, char** str,
    894 	size_t* str_len);
    895 
    896 /**
    897  * Scan wireformat EUI48 field to string, with user buffers.
    898  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    899  * @param data: wireformat data.
    900  * @param data_len: length of data buffer.
    901  * @param str: string buffer.
    902  * @param str_len: length of string buffer.
    903  * @return number of characters (except null) needed to print.
    904  * 	Can return -1 on failure.
    905  */
    906 int sldns_wire2str_eui48_scan(uint8_t** data, size_t* data_len, char** str,
    907 	size_t* str_len);
    908 
    909 /**
    910  * Scan wireformat EUI64 field to string, with user buffers.
    911  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    912  * @param data: wireformat data.
    913  * @param data_len: length of data buffer.
    914  * @param str: string buffer.
    915  * @param str_len: length of string buffer.
    916  * @return number of characters (except null) needed to print.
    917  * 	Can return -1 on failure.
    918  */
    919 int sldns_wire2str_eui64_scan(uint8_t** data, size_t* data_len, char** str,
    920 	size_t* str_len);
    921 
    922 /**
    923  * Scan wireformat UNQUOTED field to string, with user buffers.
    924  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    925  * @param data: wireformat data.
    926  * @param data_len: length of data buffer.
    927  * @param str: string buffer.
    928  * @param str_len: length of string buffer.
    929  * @return number of characters (except null) needed to print.
    930  * 	Can return -1 on failure.
    931  */
    932 int sldns_wire2str_unquoted_scan(uint8_t** data, size_t* data_len, char** str,
    933 	size_t* str_len);
    934 
    935 /**
    936  * Scan wireformat TAG field to string, with user buffers.
    937  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    938  * @param data: wireformat data.
    939  * @param data_len: length of data buffer.
    940  * @param str: string buffer.
    941  * @param str_len: length of string buffer.
    942  * @return number of characters (except null) needed to print.
    943  * 	Can return -1 on failure.
    944  */
    945 int sldns_wire2str_tag_scan(uint8_t** data, size_t* data_len, char** str,
    946 	size_t* str_len);
    947 
    948 /**
    949  * Scan wireformat long_str field to string, with user buffers.
    950  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
    951  * @param data: wireformat data.
    952  * @param data_len: length of data buffer.
    953  * @param str: string buffer.
    954  * @param str_len: length of string buffer.
    955  * @return number of characters (except null) needed to print.
    956  * 	Can return -1 on failure.
    957  */
    958 int sldns_wire2str_long_str_scan(uint8_t** data, size_t* data_len, char** str,
    959 	size_t* str_len);
    960 
    961 /**
    962  * Print EDNS LLQ option data to string.  User buffers, moves string pointers.
    963  * @param str: string buffer.
    964  * @param str_len: length of string buffer.
    965  * @param option_data: buffer with EDNS option code data.
    966  * @param option_len: length of the data for this option.
    967  * @return number of characters (except null) needed to print.
    968  */
    969 int sldns_wire2str_edns_llq_print(char** str, size_t* str_len,
    970 	uint8_t* option_data, size_t option_len);
    971 
    972 /**
    973  * Print EDNS UL option data to string.  User buffers, moves string pointers.
    974  * @param str: string buffer.
    975  * @param str_len: length of string buffer.
    976  * @param option_data: buffer with EDNS option code data.
    977  * @param option_len: length of the data for this option.
    978  * @return number of characters (except null) needed to print.
    979  */
    980 int sldns_wire2str_edns_ul_print(char** str, size_t* str_len,
    981 	uint8_t* option_data, size_t option_len);
    982 
    983 /**
    984  * Print EDNS NSID option data to string.  User buffers, moves string pointers.
    985  * @param str: string buffer.
    986  * @param str_len: length of string buffer.
    987  * @param option_data: buffer with EDNS option code data.
    988  * @param option_len: length of the data for this option.
    989  * @return number of characters (except null) needed to print.
    990  */
    991 int sldns_wire2str_edns_nsid_print(char** str, size_t* str_len,
    992 	uint8_t* option_data, size_t option_len);
    993 
    994 /**
    995  * Print EDNS DAU option data to string.  User buffers, moves string pointers.
    996  * @param str: string buffer.
    997  * @param str_len: length of string buffer.
    998  * @param option_data: buffer with EDNS option code data.
    999  * @param option_len: length of the data for this option.
   1000  * @return number of characters (except null) needed to print.
   1001  */
   1002 int sldns_wire2str_edns_dau_print(char** str, size_t* str_len,
   1003 	uint8_t* option_data, size_t option_len);
   1004 
   1005 /**
   1006  * Print EDNS DHU option data to string.  User buffers, moves string pointers.
   1007  * @param str: string buffer.
   1008  * @param str_len: length of string buffer.
   1009  * @param option_data: buffer with EDNS option code data.
   1010  * @param option_len: length of the data for this option.
   1011  * @return number of characters (except null) needed to print.
   1012  */
   1013 int sldns_wire2str_edns_dhu_print(char** str, size_t* str_len,
   1014 	uint8_t* option_data, size_t option_len);
   1015 
   1016 /**
   1017  * Print EDNS N3U option data to string.  User buffers, moves string pointers.
   1018  * @param str: string buffer.
   1019  * @param str_len: length of string buffer.
   1020  * @param option_data: buffer with EDNS option code data.
   1021  * @param option_len: length of the data for this option.
   1022  * @return number of characters (except null) needed to print.
   1023  */
   1024 int sldns_wire2str_edns_n3u_print(char** str, size_t* str_len,
   1025 	uint8_t* option_data, size_t option_len);
   1026 
   1027 /**
   1028  * Print EDNS SUBNET option data to string. User buffers, moves string pointers.
   1029  * @param str: string buffer.
   1030  * @param str_len: length of string buffer.
   1031  * @param option_data: buffer with EDNS option code data.
   1032  * @param option_len: length of the data for this option.
   1033  * @return number of characters (except null) needed to print.
   1034  */
   1035 int sldns_wire2str_edns_subnet_print(char** str, size_t* str_len,
   1036 	uint8_t* option_data, size_t option_len);
   1037 
   1038 /**
   1039  * Print EDNS EDE option data to string. User buffers, moves string pointers.
   1040  * @param str: string buffer.
   1041  * @param str_len: length of string buffer.
   1042  * @param option_data: buffer with EDNS option code data.
   1043  * @param option_len: length of the data for this option.
   1044  * @return number of characters (except null) needed to print.
   1045  */
   1046 int sldns_wire2str_edns_ede_print(char** str, size_t* str_len,
   1047 	uint8_t* option_data, size_t option_len);
   1048 
   1049 /**
   1050  * Print an EDNS option as OPT: VALUE.  User buffers, moves string pointers.
   1051  * @param str: string buffer.
   1052  * @param str_len: length of string buffer.
   1053  * @param option_code: host format EDNS option code.
   1054  * @param option_data: buffer with EDNS option code data.
   1055  * @param option_len: length of the data for this option.
   1056  * @return number of characters (except null) needed to print.
   1057  */
   1058 int sldns_wire2str_edns_option_print(char** str, size_t* str_len,
   1059 	uint16_t option_code, uint8_t* option_data, size_t option_len);
   1060 
   1061 /**
   1062  * Scan wireformat EDNS OPT to string, with user buffers.
   1063  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
   1064  * @param data: wireformat data.
   1065  * @param data_len: length of data buffer.
   1066  * @param str: string buffer.
   1067  * @param str_len: length of string buffer.
   1068  * @param pkt: packet with header and other info (may be NULL)
   1069  * @param pktlen: length of packet buffer.
   1070  * @return number of characters (except null) needed to print.
   1071  */
   1072 int sldns_wire2str_edns_scan(uint8_t** data, size_t* data_len, char** str,
   1073 	size_t* str_len, uint8_t* pkt, size_t pktlen);
   1074 
   1075 #ifdef __cplusplus
   1076 }
   1077 #endif
   1078 
   1079 #endif /* LDNS_WIRE2STR_H */
   1080