1.6.14
+ * Make buffer_export comply to documentation and fix buffer2str
* Various improvements and fixes of pyldns from Katel Slany
* bugfix: Make ldns_resolver_pop_nameserver clear the array when
there was only one.
return;
}
- LDNS_FREE(buffer->_data);
+ if (!buffer->_fixed)
+ LDNS_FREE(buffer->_data);
LDNS_FREE(buffer);
}
uint8_t *hexbuf;
int hexbufpos = 0;
size_t wirelen;
- uint8_t *data_wire = (uint8_t *) ldns_buffer_export(data_buffer);
+ uint8_t *data_wire = (uint8_t *) ldns_buffer_begin(data_buffer);
uint8_t *wire = LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN);
hexbuf = LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN);
/* still try to adjust ID */
answer_size = ldns_buffer_capacity(p->reply_from_hex);
outbuf = LDNS_XMALLOC(uint8_t, answer_size);
- memcpy(outbuf, ldns_buffer_export(p->reply_from_hex), answer_size);
+ memcpy(outbuf, ldns_buffer_begin(p->reply_from_hex), answer_size);
if(entry->copy_id) {
ldns_write_uint16(outbuf,
ldns_pkt_id(query_pkt));
str = NULL;
if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
str = NULL;
if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
str = NULL;
if (ldns_algorithm2buffer_str(buf, algorithm)
== LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
str = NULL;
if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
== LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
str = NULL;
if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
str = NULL;
if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
- str = ldns_buffer2str(buf);
+ str = ldns_buffer_export2str(buf);
}
ldns_buffer_free(buf);
return str;
}
/*
- * Zero terminate the buffer and fix it to the size of the string.
+ * Zero terminate the buffer and copy data.
*/
char *
ldns_buffer2str(ldns_buffer *buffer)
{
- char *tmp_str;
char *str;
/* check if buffer ends with \0, if not, and
}
}
- tmp_str = ldns_buffer_export(buffer);
- str = LDNS_XMALLOC(char, strlen(tmp_str) + 1);
+ str = strdup((const char *)ldns_buffer_begin(buffer));
if(!str) {
return NULL;
}
- memcpy(str, tmp_str, strlen(tmp_str) + 1);
-
return str;
}
+/*
+ * Zero terminate the buffer and export data.
+ */
+char *
+ldns_buffer_export2str(ldns_buffer *buffer)
+{
+ /* check if buffer ends with \0, if not, and
+ if there is space, add it */
+ if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
+ if (!ldns_buffer_reserve(buffer, 1)) {
+ return NULL;
+ }
+ ldns_buffer_write_u8(buffer, (uint8_t) '\0');
+ if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
+ return NULL;
+ }
+ }
+
+ return ldns_buffer_export(buffer);
+}
+
char *
ldns_rdf2str(const ldns_rdf *rdf)
{
}
if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
/* export and return string, destroy rest */
- result = ldns_buffer2str(tmp_buffer);
+ result = ldns_buffer_export2str(tmp_buffer);
}
ldns_buffer_free(tmp_buffer);
return result;
if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
== LDNS_STATUS_OK) {
/* export and return string, destroy rest */
- result = ldns_buffer2str(tmp_buffer);
+ result = ldns_buffer_export2str(tmp_buffer);
}
ldns_buffer_free(tmp_buffer);
return result;
if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
== LDNS_STATUS_OK) {
/* export and return string, destroy rest */
- result = ldns_buffer2str(tmp_buffer);
+ result = ldns_buffer_export2str(tmp_buffer);
}
ldns_buffer_free(tmp_buffer);
}
if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
/* export and return string, destroy rest */
- result = ldns_buffer2str(tmp_buffer);
+ result = ldns_buffer_export2str(tmp_buffer);
}
ldns_buffer_free(tmp_buffer);
return result;
}
/* export and return string, destroy rest */
- result = ldns_buffer2str(tmp_buffer);
+ result = ldns_buffer_export2str(tmp_buffer);
ldns_buffer_free(tmp_buffer);
return result;
}
ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size)
{
ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
- uint8_t *result = NULL;
ldns_status status;
*result_size = 0;
*dest = NULL;
status = ldns_rdf2buffer_wire(buffer, rdf);
if (status == LDNS_STATUS_OK) {
*result_size = ldns_buffer_position(buffer);
- result = (uint8_t *) ldns_buffer_export(buffer);
- } else {
- ldns_buffer_free(buffer);
- return status;
- }
-
- if (result) {
- *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
- if(!*dest) {
- ldns_buffer_free(buffer);
- return LDNS_STATUS_MEM_ERR;
- }
- memcpy(*dest, result, ldns_buffer_position(buffer));
+ *dest = (uint8_t *) ldns_buffer_export(buffer);
}
-
ldns_buffer_free(buffer);
return status;
}
ldns_rr2wire(uint8_t **dest, const ldns_rr *rr, int section, size_t *result_size)
{
ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
- uint8_t *result = NULL;
ldns_status status;
*result_size = 0;
*dest = NULL;
status = ldns_rr2buffer_wire(buffer, rr, section);
if (status == LDNS_STATUS_OK) {
*result_size = ldns_buffer_position(buffer);
- result = (uint8_t *) ldns_buffer_export(buffer);
- } else {
- ldns_buffer_free(buffer);
- return status;
+ *dest = (uint8_t *) ldns_buffer_export(buffer);
}
-
- if (result) {
- *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
- if(!*dest) {
- ldns_buffer_free(buffer);
- return LDNS_STATUS_MEM_ERR;
- }
- memcpy(*dest, result, ldns_buffer_position(buffer));
- }
-
ldns_buffer_free(buffer);
return status;
}
ldns_pkt2wire(uint8_t **dest, const ldns_pkt *packet, size_t *result_size)
{
ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
- uint8_t *result = NULL;
ldns_status status;
*result_size = 0;
*dest = NULL;
status = ldns_pkt2buffer_wire(buffer, packet);
if (status == LDNS_STATUS_OK) {
*result_size = ldns_buffer_position(buffer);
- result = (uint8_t *) ldns_buffer_export(buffer);
- } else {
- ldns_buffer_free(buffer);
- return status;
+ *dest = (uint8_t *) ldns_buffer_export(buffer);
}
-
- if (result) {
- *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
- if(!*dest) {
- ldns_buffer_free(buffer);
- return LDNS_STATUS_MEM_ERR;
- }
- memcpy(*dest, result, ldns_buffer_position(buffer));
- }
-
ldns_buffer_free(buffer);
return status;
}
"+%03u+%05u",
ldns_key_algorithm(key),
ldns_key_keytag(key));
- file_base_name = strdup(ldns_buffer_export(buffer));
+ file_base_name = ldns_buffer_export(buffer);
ldns_buffer_free(buffer);
return file_base_name;
}
void *ldns_buffer_export(ldns_buffer *buffer);
/**
- * Copy contents of the other buffer to this buffer. Silently truncated
- * if this buffer is too small.
+ * Copy contents of the from buffer to the result buffer and then flips
+ * the result buffer. Data will be silently truncated if the result buffer is
+ * too small.
* \param[out] *result resulting buffer which is copied to.
* \param[in] *from what to copy to result.
*/
const ldns_output_format *fmt, const ldns_rr_list *rr_list);
/**
- * Returns the data in the buffer as a null terminated char * string
- * Buffer data must be char * type, and must be freed by the caller
+ * Returns a copy of the data in the buffer as a null terminated
+ * char * string. The returned string must be freed by the caller.
+ * The buffer must be in write modus and may thus not have been flipped.
*
* \param[in] buffer buffer containing char * data
* \return null terminated char * data, or NULL on error
*/
char *ldns_buffer2str(ldns_buffer *buffer);
+/**
+ * Exports and returns the data in the buffer as a null terminated
+ * char * string. The returned string must be freed by the caller.
+ * The buffer must be in write modus and may thus not have been flipped.
+ * The buffer is fixed after this function returns.
+ *
+ * \param[in] buffer buffer containing char * data
+ * \return null terminated char * data, or NULL on error
+ */
+char *ldns_buffer_export2str(ldns_buffer *buffer);
+
/**
* Prints the data in the rdata field to the given file stream
* (in presentation format)
ldns_buffer2str
ldns_buffer_copy
ldns_buffer_export
+ldns_buffer_export2str
ldns_buffer_free
ldns_buffer_new
ldns_buffer_new_frm_data
sendbuf = LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
if(!sendbuf) return 0;
ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
- memcpy(sendbuf + 2, ldns_buffer_export(qbin), ldns_buffer_position(qbin));
+ memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
bytes = sendto(sockfd, (void*)sendbuf,
ldns_buffer_position(qbin) + 2, 0, (struct sockaddr *)to, tolen);