mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 15:45:25 +00:00
Implement name, rdata, rdatalist, rdataset loanout from message resources
This commit is contained in:
@@ -476,6 +476,144 @@ dns_message_addname(dns_message_t *msg, dns_name_t *name,
|
|||||||
* 'section' be a named section.
|
* 'section' be a named section.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LOANOUT FUNCTIONS
|
||||||
|
*
|
||||||
|
* Each of these functions loan a particular type of data to the caller.
|
||||||
|
* The storage for these will vanish when the message is destroyed or
|
||||||
|
* reset, and must NOT be used after these operations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettempname(dns_message_t *msg, dns_name_t **item);
|
||||||
|
/*
|
||||||
|
* Return a name that can be used for any temporary purpose, including
|
||||||
|
* inserting into the message's linked lists. The storage associated with
|
||||||
|
* this name will be destroyed when the message is destroyed or reset.
|
||||||
|
*
|
||||||
|
* It is the caller's responsibility to initialize this name.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item == NULL
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* DNS_R_SUCCESS -- All is well.
|
||||||
|
* DNS_R_NOMEMORY -- No item can be allocated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdata(dns_message_t *msg, dns_rdata_t **item);
|
||||||
|
/*
|
||||||
|
* Return a rdata that can be used for any temporary purpose, including
|
||||||
|
* inserting into the message's linked lists. The storage associated with
|
||||||
|
* this rdata will be destroyed when the message is destroyed or reset.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item == NULL
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* DNS_R_SUCCESS -- All is well.
|
||||||
|
* DNS_R_NOMEMORY -- No item can be allocated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdataset(dns_message_t *msg, dns_rdataset_t **item);
|
||||||
|
/*
|
||||||
|
* Return a rdataset that can be used for any temporary purpose, including
|
||||||
|
* inserting into the message's linked lists. The storage associated with
|
||||||
|
* this rdataset will be destroyed when the message is destroyed or reset.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item == NULL
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* DNS_R_SUCCESS -- All is well.
|
||||||
|
* DNS_R_NOMEMORY -- No item can be allocated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdatalist(dns_message_t *msg, dns_rdatalist_t **item);
|
||||||
|
/*
|
||||||
|
* Return a rdatalist that can be used for any temporary purpose, including
|
||||||
|
* inserting into the message's linked lists. The storage associated with
|
||||||
|
* this rdatalist will be destroyed when the message is destroyed or reset.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item == NULL
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* DNS_R_SUCCESS -- All is well.
|
||||||
|
* DNS_R_NOMEMORY -- No item can be allocated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttempname(dns_message_t *msg, dns_name_t **item);
|
||||||
|
/*
|
||||||
|
* Return a borrowed name to the message's name free list.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item point to a name returned by
|
||||||
|
* dns_message_gettempname()
|
||||||
|
*
|
||||||
|
* Ensures:
|
||||||
|
* *item == NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdata(dns_message_t *msg, dns_rdata_t **item);
|
||||||
|
/*
|
||||||
|
* Return a borrowed rdata to the message's rdata free list.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item point to a rdata returned by
|
||||||
|
* dns_message_gettemprdata()
|
||||||
|
*
|
||||||
|
* Ensures:
|
||||||
|
* *item == NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdataset(dns_message_t *msg, dns_rdataset_t **item);
|
||||||
|
/*
|
||||||
|
* Return a borrowed rdataset to the message's rdataset free list.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item point to a rdataset returned by
|
||||||
|
* dns_message_gettemprdataset()
|
||||||
|
*
|
||||||
|
* Ensures:
|
||||||
|
* *item == NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdatalist(dns_message_t *msg, dns_rdatalist_t **item);
|
||||||
|
/*
|
||||||
|
* Return a borrowed rdatalist to the message's rdatalist free list.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* msg be a valid message
|
||||||
|
*
|
||||||
|
* item != NULL && *item point to a rdatalist returned by
|
||||||
|
* dns_message_gettemprdatalist()
|
||||||
|
*
|
||||||
|
* Ensures:
|
||||||
|
* *item == NULL
|
||||||
|
*/
|
||||||
|
|
||||||
ISC_LANG_ENDDECLS
|
ISC_LANG_ENDDECLS
|
||||||
|
|
||||||
#endif /* DNS_DNS_H */
|
#endif /* DNS_DNS_H */
|
||||||
|
@@ -470,7 +470,7 @@ msgreset(dns_message_t *msg, isc_boolean_t everything)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dns_result_t
|
dns_result_t
|
||||||
dns_message_create(isc_mem_t *mctx, dns_message_t **msg, unsigned int intent)
|
dns_message_create(isc_mem_t *mctx, dns_message_t **msgp, unsigned int intent)
|
||||||
{
|
{
|
||||||
dns_message_t *m;
|
dns_message_t *m;
|
||||||
isc_result_t iresult;
|
isc_result_t iresult;
|
||||||
@@ -479,8 +479,8 @@ dns_message_create(isc_mem_t *mctx, dns_message_t **msg, unsigned int intent)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
REQUIRE(mctx != NULL);
|
REQUIRE(mctx != NULL);
|
||||||
REQUIRE(msg != NULL);
|
REQUIRE(msgp != NULL);
|
||||||
REQUIRE(*msg == NULL);
|
REQUIRE(*msgp == NULL);
|
||||||
REQUIRE(intent == DNS_MESSAGE_INTENTPARSE
|
REQUIRE(intent == DNS_MESSAGE_INTENTPARSE
|
||||||
|| intent == DNS_MESSAGE_INTENTRENDER);
|
|| intent == DNS_MESSAGE_INTENTRENDER);
|
||||||
|
|
||||||
@@ -532,7 +532,7 @@ dns_message_create(isc_mem_t *mctx, dns_message_t **msg, unsigned int intent)
|
|||||||
ISC_LIST_APPEND(m->rdatalists, msgblock, link);
|
ISC_LIST_APPEND(m->rdatalists, msgblock, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
*msg = m;
|
*msgp = m;
|
||||||
return (DNS_R_SUCCESS);
|
return (DNS_R_SUCCESS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -564,15 +564,15 @@ dns_message_reset(dns_message_t *msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dns_message_destroy(dns_message_t **xmsg)
|
dns_message_destroy(dns_message_t **msgp)
|
||||||
{
|
{
|
||||||
dns_message_t *msg;
|
dns_message_t *msg;
|
||||||
|
|
||||||
REQUIRE(xmsg != NULL);
|
REQUIRE(msgp != NULL);
|
||||||
REQUIRE(VALID_MESSAGE(*xmsg));
|
REQUIRE(VALID_MESSAGE(*msgp));
|
||||||
|
|
||||||
msg = *xmsg;
|
msg = *msgp;
|
||||||
*xmsg = NULL;
|
*msgp = NULL;
|
||||||
|
|
||||||
msgreset(msg, ISC_TRUE);
|
msgreset(msg, ISC_TRUE);
|
||||||
msg->magic = 0;
|
msg->magic = 0;
|
||||||
@@ -1150,7 +1150,7 @@ dns_message_renderreserve(dns_message_t *msg, unsigned int space)
|
|||||||
|
|
||||||
dns_result_t
|
dns_result_t
|
||||||
dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
|
dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
|
||||||
unsigned int priority, unsigned int flags)
|
unsigned int priority, unsigned int options)
|
||||||
{
|
{
|
||||||
unsigned int used;
|
unsigned int used;
|
||||||
dns_namelist_t *section;
|
dns_namelist_t *section;
|
||||||
@@ -1380,3 +1380,95 @@ dns_message_addname(dns_message_t *msg, dns_name_t *name,
|
|||||||
|
|
||||||
ISC_LIST_APPEND(msg->sections[section], name, link);
|
ISC_LIST_APPEND(msg->sections[section], name, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettempname(dns_message_t *msg, dns_name_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item == NULL);
|
||||||
|
|
||||||
|
*item = newname(msg);
|
||||||
|
if (*item == NULL)
|
||||||
|
return (DNS_R_NOMEMORY);
|
||||||
|
|
||||||
|
return (DNS_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdata(dns_message_t *msg, dns_rdata_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item == NULL);
|
||||||
|
|
||||||
|
*item = newrdata(msg);
|
||||||
|
if (*item == NULL)
|
||||||
|
return (DNS_R_NOMEMORY);
|
||||||
|
|
||||||
|
return (DNS_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdataset(dns_message_t *msg, dns_rdataset_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item == NULL);
|
||||||
|
|
||||||
|
*item = newrdataset(msg);
|
||||||
|
if (*item == NULL)
|
||||||
|
return (DNS_R_NOMEMORY);
|
||||||
|
|
||||||
|
return (DNS_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
dns_result_t
|
||||||
|
dns_message_gettemprdatalist(dns_message_t *msg, dns_rdatalist_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item == NULL);
|
||||||
|
|
||||||
|
*item = newrdatalist(msg);
|
||||||
|
if (*item == NULL)
|
||||||
|
return (DNS_R_NOMEMORY);
|
||||||
|
|
||||||
|
return (DNS_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttempname(dns_message_t *msg, dns_name_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item != NULL);
|
||||||
|
|
||||||
|
releasename(msg, *item);
|
||||||
|
*item = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdata(dns_message_t *msg, dns_rdata_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item != NULL);
|
||||||
|
|
||||||
|
releaserdata(msg, *item);
|
||||||
|
*item = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdataset(dns_message_t *msg, dns_rdataset_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item != NULL);
|
||||||
|
|
||||||
|
releaserdataset(msg, *item);
|
||||||
|
*item = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_message_puttemprdatalist(dns_message_t *msg, dns_rdatalist_t **item)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_MESSAGE(msg));
|
||||||
|
REQUIRE(item != NULL && *item != NULL);
|
||||||
|
|
||||||
|
releaserdatalist(msg, *item);
|
||||||
|
*item = NULL;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user