mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 15:05:23 +00:00
checkpoint
This commit is contained in:
@@ -76,10 +76,14 @@ main(int argc, char *argv[])
|
|||||||
lwres_noopresponse_t noopresponse, *noopresponse2;
|
lwres_noopresponse_t noopresponse, *noopresponse2;
|
||||||
lwres_buffer_t b;
|
lwres_buffer_t b;
|
||||||
|
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
ctx = NULL;
|
ctx = NULL;
|
||||||
ret = lwres_context_create(&ctx, NULL, NULL, NULL);
|
ret = lwres_context_create(&ctx, NULL, NULL, NULL);
|
||||||
CHECK(ret, "lwres_context_create");
|
CHECK(ret, "lwres_context_create");
|
||||||
|
|
||||||
|
pkt.flags = 0;
|
||||||
pkt.serial = 0x11223344;
|
pkt.serial = 0x11223344;
|
||||||
pkt.recvlength = 0x55667788;
|
pkt.recvlength = 0x55667788;
|
||||||
pkt.result = 0;
|
pkt.result = 0;
|
||||||
@@ -114,6 +118,41 @@ main(int argc, char *argv[])
|
|||||||
b.base = NULL;
|
b.base = NULL;
|
||||||
b.length = 0;
|
b.length = 0;
|
||||||
|
|
||||||
|
pkt.flags = 0;
|
||||||
|
pkt.serial = 0x11223344;
|
||||||
|
pkt.recvlength = 0x55667788;
|
||||||
|
pkt.result = 0xdeadbeef;
|
||||||
|
|
||||||
|
noopresponse.datalength = strlen(TESTSTRING);
|
||||||
|
noopresponse.data = TESTSTRING;
|
||||||
|
ret = lwres_noopresponse_render(ctx, &noopresponse, &pkt, &b);
|
||||||
|
CHECK(ret, "lwres_noopresponse_render");
|
||||||
|
|
||||||
|
hexdump("rendered noop response", b.base, b.used);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now, parse it into a new structure.
|
||||||
|
*/
|
||||||
|
lwres_buffer_first(&b);
|
||||||
|
ret = lwres_lwpacket_parseheader(&b, &pkt2);
|
||||||
|
CHECK(ret, "lwres_lwpacket_parseheader");
|
||||||
|
|
||||||
|
hexdump("parsed pkt2", &pkt2, sizeof(pkt2));
|
||||||
|
|
||||||
|
noopresponse2 = NULL;
|
||||||
|
ret = lwres_noopresponse_parse(ctx, &b, &pkt2, &noopresponse2);
|
||||||
|
CHECK(ret, "lwres_noopresponse_parse");
|
||||||
|
|
||||||
|
assert(noopresponse.datalength == noopresponse2->datalength);
|
||||||
|
assert(memcmp(noopresponse.data, noopresponse2->data,
|
||||||
|
noopresponse.datalength) == 0);
|
||||||
|
|
||||||
|
lwres_noopresponse_free(ctx, &noopresponse2);
|
||||||
|
|
||||||
|
lwres_context_freemem(ctx, b.base, b.length);
|
||||||
|
b.base = NULL;
|
||||||
|
b.length = 0;
|
||||||
|
|
||||||
lwres_context_destroy(&ctx);
|
lwres_context_destroy(&ctx);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
@@ -39,6 +39,8 @@ struct lwres_lwpacket {
|
|||||||
isc_uint16_t authlength;
|
isc_uint16_t authlength;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define LWRES_LWPACKET_LENGTH (4 * 5 + 2 * 4)
|
||||||
|
|
||||||
#define LWRES_LWPACKETFLAG_RESPONSE 0x0001U /* if set, pkt is a response */
|
#define LWRES_LWPACKETFLAG_RESPONSE 0x0001U /* if set, pkt is a response */
|
||||||
|
|
||||||
#define LWRES_LWPACKETVERSION_0 0
|
#define LWRES_LWPACKETVERSION_0 0
|
||||||
|
@@ -175,17 +175,19 @@ ISC_LANG_BEGINDECLS
|
|||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b);
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b);
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b);
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b);
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_gabnrequest_t **structp);
|
lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gabnrequest_t **structp);
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_gabnresponse_t **structp);
|
lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gabnresponse_t **structp);
|
||||||
|
|
||||||
void
|
void
|
||||||
lwres_gabnrequest_free(lwres_context_t *ctx, lwres_gabnrequest_t **structp);
|
lwres_gabnrequest_free(lwres_context_t *ctx, lwres_gabnrequest_t **structp);
|
||||||
@@ -227,20 +229,20 @@ lwres_gabnresponse_free(lwres_context_t *ctx, lwres_gabnresponse_t **structp);
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbarequest_render(lwres_context_t *ctx,
|
lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req,
|
||||||
lwres_gnbarequest_t *req,
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b);
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbaresponse_render(lwres_context_t *ctx,
|
lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req,
|
||||||
lwres_gnbaresponse_t *req,
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b);
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_gnbarequest_t **structp);
|
lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gnbarequest_t **structp);
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_gnbaresponse_t **structp);
|
lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gnbaresponse_t **structp);
|
||||||
|
|
||||||
void
|
void
|
||||||
lwres_gnbarequest_free(lwres_context_t *ctx, lwres_gnbarequest_t **structp);
|
lwres_gnbarequest_free(lwres_context_t *ctx, lwres_gnbarequest_t **structp);
|
||||||
|
@@ -31,9 +31,8 @@
|
|||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b)
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b)
|
||||||
{
|
{
|
||||||
lwres_lwpacket_t pkt;
|
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
size_t buflen;
|
size_t buflen;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -43,13 +42,14 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
|||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
REQUIRE(req != NULL);
|
REQUIRE(req != NULL);
|
||||||
REQUIRE(req->name != NULL);
|
REQUIRE(req->name != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(b != NULL);
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
datalen = strlen(req->name);
|
datalen = strlen(req->name);
|
||||||
|
|
||||||
payload_length = LWRES_STRING_LENGTH(req->name);
|
payload_length = LWRES_STRING_LENGTH(req->name);
|
||||||
|
|
||||||
buflen = sizeof(lwres_lwpacket_t) + payload_length;
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
buf = CTXMALLOC(buflen);
|
buf = CTXMALLOC(buflen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@@ -57,17 +57,15 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
|||||||
}
|
}
|
||||||
lwres_buffer_init(b, buf, buflen);
|
lwres_buffer_init(b, buf, buflen);
|
||||||
|
|
||||||
pkt.length = buflen;
|
pkt->length = buflen;
|
||||||
pkt.version = LWRES_LWPACKETVERSION_0;
|
pkt->version = LWRES_LWPACKETVERSION_0;
|
||||||
pkt.flags = 0;
|
pkt->flags &= ~LWRES_LWPACKETFLAG_RESPONSE;
|
||||||
pkt.serial = req->serial;
|
pkt->opcode = LWRES_OPCODE_GETADDRSBYNAME;
|
||||||
pkt.opcode = LWRES_OPCODE_GETADDRSBYNAME;
|
pkt->result = 0;
|
||||||
pkt.result = 0;
|
pkt->authtype = 0;
|
||||||
pkt.recvlength = maxrecv;
|
pkt->authlength = 0;
|
||||||
pkt.authtype = 0;
|
|
||||||
pkt.authlength = 0;
|
|
||||||
|
|
||||||
ret = lwres_lwpacket_renderheader(b, &pkt);
|
ret = lwres_lwpacket_renderheader(b, pkt);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
lwres_buffer_invalidate(b);
|
lwres_buffer_invalidate(b);
|
||||||
CTXFREE(buf, buflen);
|
CTXFREE(buf, buflen);
|
||||||
@@ -90,9 +88,8 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
|
|||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b)
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b)
|
||||||
{
|
{
|
||||||
lwres_lwpacket_t pkt;
|
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
size_t buflen;
|
size_t buflen;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -102,6 +99,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
|||||||
|
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
REQUIRE(req != NULL);
|
REQUIRE(req != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(b != NULL);
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
/* naliases, naddrs */
|
/* naliases, naddrs */
|
||||||
@@ -117,7 +115,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
|||||||
payload_length += req->addrs[x]->length;
|
payload_length += req->addrs[x]->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
buflen = sizeof(lwres_lwpacket_t) + payload_length;
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
buf = CTXMALLOC(buflen);
|
buf = CTXMALLOC(buflen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@@ -125,17 +123,14 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
|||||||
}
|
}
|
||||||
lwres_buffer_init(b, buf, buflen);
|
lwres_buffer_init(b, buf, buflen);
|
||||||
|
|
||||||
pkt.length = buflen;
|
pkt->length = buflen;
|
||||||
pkt.version = LWRES_LWPACKETVERSION_0;
|
pkt->version = LWRES_LWPACKETVERSION_0;
|
||||||
pkt.flags = LWRES_LWPACKETFLAG_RESPONSE;
|
pkt->flags |= LWRES_LWPACKETFLAG_RESPONSE;
|
||||||
pkt.serial = req->serial;
|
pkt->opcode = LWRES_OPCODE_GETADDRSBYNAME;
|
||||||
pkt.opcode = LWRES_OPCODE_GETADDRSBYNAME;
|
pkt->authtype = 0;
|
||||||
pkt.result = req->result;
|
pkt->authlength = 0;
|
||||||
pkt.recvlength = maxrecv;
|
|
||||||
pkt.authtype = 0;
|
|
||||||
pkt.authlength = 0;
|
|
||||||
|
|
||||||
ret = lwres_lwpacket_renderheader(b, &pkt);
|
ret = lwres_lwpacket_renderheader(b, pkt);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
lwres_buffer_invalidate(b);
|
lwres_buffer_invalidate(b);
|
||||||
CTXFREE(buf, buflen);
|
CTXFREE(buf, buflen);
|
||||||
@@ -179,17 +174,23 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_gabnrequest_t **structp)
|
lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gabnrequest_t **structp)
|
||||||
{
|
{
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(structp != NULL && *structp == NULL);
|
REQUIRE(structp != NULL && *structp == NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_gabnresponse_t **structp)
|
lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gabnresponse_t **structp)
|
||||||
{
|
{
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(structp != NULL && *structp == NULL);
|
REQUIRE(structp != NULL && *structp == NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -205,8 +206,6 @@ lwres_gabnrequest_free(lwres_context_t *ctx, lwres_gabnrequest_t **structp)
|
|||||||
gabn = *structp;
|
gabn = *structp;
|
||||||
*structp = NULL;
|
*structp = NULL;
|
||||||
|
|
||||||
if (gabn->buffer != NULL)
|
|
||||||
CTXFREE(gabn->buffer, gabn->buflen);
|
|
||||||
CTXFREE(gabn, sizeof(lwres_gabnrequest_t));
|
CTXFREE(gabn, sizeof(lwres_gabnrequest_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +220,5 @@ lwres_gabnresponse_free(lwres_context_t *ctx, lwres_gabnresponse_t **structp)
|
|||||||
gabn = *structp;
|
gabn = *structp;
|
||||||
*structp = NULL;
|
*structp = NULL;
|
||||||
|
|
||||||
if (gabn->buffer != NULL)
|
|
||||||
CTXFREE(gabn->buffer, gabn->buflen);
|
|
||||||
CTXFREE(gabn, sizeof(lwres_gabnresponse_t));
|
CTXFREE(gabn, sizeof(lwres_gabnresponse_t));
|
||||||
}
|
}
|
||||||
|
@@ -30,35 +30,179 @@
|
|||||||
#include "assert_p.h"
|
#include "assert_p.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbarequest_render(lwres_context_t *ctx,
|
lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req,
|
||||||
lwres_gnbarequest_t *req,
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b)
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b)
|
|
||||||
{
|
{
|
||||||
|
unsigned char *buf;
|
||||||
|
size_t buflen;
|
||||||
|
int ret;
|
||||||
|
size_t payload_length;
|
||||||
|
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(req != NULL);
|
||||||
|
REQUIRE(req->addr.family != 0);
|
||||||
|
REQUIRE(req->addr.length != 0);
|
||||||
|
REQUIRE(req->addr.address != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
|
payload_length = sizeof(isc_uint32_t) + sizeof(isc_uint16_t)
|
||||||
|
+ req->addr.length;
|
||||||
|
|
||||||
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
|
buf = CTXMALLOC(buflen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
lwres_buffer_init(b, buf, buflen);
|
||||||
|
|
||||||
|
pkt->length = buflen;
|
||||||
|
pkt->version = LWRES_LWPACKETVERSION_0;
|
||||||
|
pkt->flags &= ~LWRES_LWPACKETFLAG_RESPONSE;
|
||||||
|
pkt->opcode = LWRES_OPCODE_GETNAMEBYADDR;
|
||||||
|
pkt->result = 0;
|
||||||
|
pkt->authtype = 0;
|
||||||
|
pkt->authlength = 0;
|
||||||
|
|
||||||
|
ret = lwres_lwpacket_renderheader(b, pkt);
|
||||||
|
if (ret != 0) {
|
||||||
|
lwres_buffer_invalidate(b);
|
||||||
|
CTXFREE(buf, buflen);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSIST(SPACE_OK(b, payload_length));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Put the length and the data. We know this will fit because we
|
||||||
|
* just checked for it.
|
||||||
|
*/
|
||||||
|
lwres_buffer_putuint32(b, req->addr.family);
|
||||||
|
lwres_buffer_putuint16(b, req->addr.length);
|
||||||
|
lwres_buffer_putmem(b, req->addr.address, req->addr.length);
|
||||||
|
|
||||||
|
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
|
||||||
|
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbaresponse_render(lwres_context_t *ctx,
|
lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req,
|
||||||
lwres_gnbaresponse_t *req,
|
lwres_lwpacket_t *pkt, lwres_buffer_t *b)
|
||||||
isc_uint32_t maxrecv, lwres_buffer_t *b)
|
|
||||||
{
|
{
|
||||||
|
unsigned char *buf;
|
||||||
|
size_t buflen;
|
||||||
|
int ret;
|
||||||
|
size_t payload_length;
|
||||||
|
isc_uint16_t datalen;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(req != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
|
/* naliases */
|
||||||
|
payload_length = sizeof(isc_uint16_t);
|
||||||
|
/* real name encoding */
|
||||||
|
payload_length += LWRES_STRING_LENGTH(req->real_name);
|
||||||
|
/* each alias */
|
||||||
|
for (x = 0 ; x < req->naliases ; x++)
|
||||||
|
payload_length += LWRES_STRING_LENGTH(req->aliases[x]);
|
||||||
|
|
||||||
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
|
buf = CTXMALLOC(buflen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
lwres_buffer_init(b, buf, buflen);
|
||||||
|
|
||||||
|
pkt->length = buflen;
|
||||||
|
pkt->version = LWRES_LWPACKETVERSION_0;
|
||||||
|
pkt->flags |= LWRES_LWPACKETFLAG_RESPONSE;
|
||||||
|
pkt->opcode = LWRES_OPCODE_GETNAMEBYADDR;
|
||||||
|
pkt->authtype = 0;
|
||||||
|
pkt->authlength = 0;
|
||||||
|
|
||||||
|
ret = lwres_lwpacket_renderheader(b, pkt);
|
||||||
|
if (ret != 0) {
|
||||||
|
lwres_buffer_invalidate(b);
|
||||||
|
CTXFREE(buf, buflen);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* encode naliases */
|
||||||
|
|
||||||
|
INSIST(SPACE_OK(b, sizeof(isc_uint16_t) * 2));
|
||||||
|
lwres_buffer_putuint16(b, req->naliases);
|
||||||
|
|
||||||
|
/* encode the real name */
|
||||||
|
datalen = strlen(req->real_name);
|
||||||
|
INSIST(SPACE_OK(b, LWRES_STRING_LENGTH(req->real_name)));
|
||||||
|
lwres_buffer_putuint16(b, datalen);
|
||||||
|
lwres_buffer_putmem(b, req->real_name, datalen + 1);
|
||||||
|
|
||||||
|
/* encode the aliases */
|
||||||
|
for (x = 0 ; x < req->naliases ; x++) {
|
||||||
|
datalen = strlen(req->aliases[x]);
|
||||||
|
INSIST(SPACE_OK(b, LWRES_STRING_LENGTH(req->aliases[x])));
|
||||||
|
lwres_buffer_putuint16(b, datalen);
|
||||||
|
lwres_buffer_putmem(b, req->aliases[x], datalen + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
|
||||||
|
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_gnbarequest_t **structp)
|
lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gnbarequest_t **structp)
|
||||||
{
|
{
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
REQUIRE(structp != NULL && *structp == NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_gnbaresponse_t **structp)
|
lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_lwpacket_t *pkt,
|
||||||
|
lwres_buffer_t *b, lwres_gnbaresponse_t **structp)
|
||||||
{
|
{
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
|
REQUIRE(b != NULL);
|
||||||
|
REQUIRE(structp != NULL && *structp == NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lwres_gnbarequest_free(lwres_context_t *ctx, lwres_gnbarequest_t **structp)
|
lwres_gnbarequest_free(lwres_context_t *ctx, lwres_gnbarequest_t **structp)
|
||||||
{
|
{
|
||||||
|
lwres_gnbarequest_t *gnba;
|
||||||
|
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(structp != NULL && *structp != NULL);
|
||||||
|
|
||||||
|
gnba = *structp;
|
||||||
|
*structp = NULL;
|
||||||
|
|
||||||
|
CTXFREE(gnba, sizeof(lwres_gnbarequest_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lwres_gnbaresponse_free(lwres_context_t *ctx, lwres_gnbaresponse_t **structp)
|
lwres_gnbaresponse_free(lwres_context_t *ctx, lwres_gnbaresponse_t **structp)
|
||||||
{
|
{
|
||||||
|
lwres_gnbaresponse_t *gnba;
|
||||||
|
|
||||||
|
REQUIRE(ctx != NULL);
|
||||||
|
REQUIRE(structp != NULL && *structp != NULL);
|
||||||
|
|
||||||
|
gnba = *structp;
|
||||||
|
*structp = NULL;
|
||||||
|
|
||||||
|
CTXFREE(gnba, sizeof(lwres_gnbaresponse_t));
|
||||||
}
|
}
|
||||||
|
@@ -40,11 +40,12 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
|
|||||||
|
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
REQUIRE(req != NULL);
|
REQUIRE(req != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(b != NULL);
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
payload_length = sizeof(isc_uint16_t) + req->datalength;
|
payload_length = sizeof(isc_uint16_t) + req->datalength;
|
||||||
|
|
||||||
buflen = sizeof(lwres_lwpacket_t) + payload_length;
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
buf = CTXMALLOC(buflen);
|
buf = CTXMALLOC(buflen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@@ -54,7 +55,7 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
|
|||||||
|
|
||||||
pkt->length = buflen;
|
pkt->length = buflen;
|
||||||
pkt->version = LWRES_LWPACKETVERSION_0;
|
pkt->version = LWRES_LWPACKETVERSION_0;
|
||||||
pkt->flags = 0;
|
pkt->flags &= ~LWRES_LWPACKETFLAG_RESPONSE;
|
||||||
pkt->opcode = LWRES_OPCODE_NOOP;
|
pkt->opcode = LWRES_OPCODE_NOOP;
|
||||||
pkt->result = 0;
|
pkt->result = 0;
|
||||||
pkt->authtype = 0;
|
pkt->authtype = 0;
|
||||||
@@ -92,11 +93,12 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req,
|
|||||||
|
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
REQUIRE(req != NULL);
|
REQUIRE(req != NULL);
|
||||||
|
REQUIRE(pkt != NULL);
|
||||||
REQUIRE(b != NULL);
|
REQUIRE(b != NULL);
|
||||||
|
|
||||||
payload_length = sizeof(isc_uint16_t) + req->datalength;
|
payload_length = sizeof(isc_uint16_t) + req->datalength;
|
||||||
|
|
||||||
buflen = sizeof(lwres_lwpacket_t) + payload_length;
|
buflen = LWRES_LWPACKET_LENGTH + payload_length;
|
||||||
buf = CTXMALLOC(buflen);
|
buf = CTXMALLOC(buflen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
|
Reference in New Issue
Block a user