return LWRES_R_* result codes (all are negative values, otehr than success, which is 0)

This commit is contained in:
Michael Graff 2000-01-24 21:57:07 +00:00
parent 651a38a706
commit 8cd870e3f5
8 changed files with 177 additions and 153 deletions

View file

@ -19,7 +19,6 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -31,6 +30,7 @@
#include <lwres/context.h>
#include <lwres/lwres.h>
#include <lwres/result.h>
#include "context_p.h"
#include "assert_p.h"
@ -60,10 +60,8 @@ lwres_context_create(lwres_context_t **contextp, void *arg,
}
ctx = malloc_function(arg, sizeof(lwres_context_t));
if (ctx == NULL) {
errno = ENOMEM;
return (-1);
}
if (ctx == NULL)
return (LWRES_R_NOMEMORY);
/*
* Set up the context.
@ -79,7 +77,7 @@ lwres_context_create(lwres_context_t **contextp, void *arg,
(void)context_connect(ctx); /* XXXMLG */
*contextp = ctx;
return (0);
return (LWRES_R_SUCCESS);
}
void
@ -172,17 +170,17 @@ context_connect(lwres_context_t *ctx)
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s < 0)
return (-1);
return (LWRES_R_IOERROR);
ret = connect(s, (struct sockaddr *)&localhost, sizeof(localhost));
if (ret != 0) {
close(s);
return (-1);
return (LWRES_R_IOERROR);
}
ctx->sock = s;
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -198,17 +196,23 @@ lwres_context_sendrecv(lwres_context_t *ctx,
if (ret < 0)
return (ret);
if (ret != sendlen)
return (-1);
return (LWRES_R_IOERROR);
again:
fromlen = sizeof(sin);
ret = recvfrom(ctx->sock, recvbase, recvlen, 0,
(struct sockaddr *)&sin, &fromlen);
if (ret < 0)
return (-1);
return (LWRES_R_IOERROR);
/*
* If we got something other than what we expect, re-issue our
* recvfrom() call. This can happen if an old result comes in,
* or if someone is sending us random stuff.
*/
if (sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
|| sin.sin_port != htons(LWRES_UDP_PORT))
return (-1);
goto again;
return (ret);
}

View file

@ -20,7 +20,7 @@ top_srcdir = @top_srcdir@
#
# Only list headers that are to be installed!
#
HEADERS = lwbuffer.h lwpacket.h lwres.h
HEADERS = context.h lwbuffer.h lwpacket.h lwres.h netdb.h result.h
SUBDIRS =
TARGETS =

View file

@ -0,0 +1,31 @@
/*
* Copyright (C) 2000 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#ifndef LWRES_RESULT_H
#define LWRES_RESULT_H 1
#define LWRES_R_SUCCESS 0
#define LWRES_R_NOMEMORY -1
#define LWRES_R_TIMEDOUT -2
#define LWRES_R_NOTFOUND -3
#define LWRES_R_UNEXPECTEDEND -4 /* unexpected end of input */
#define LWRES_R_FAILURE -5 /* generic failure */
#define LWRES_R_IOERROR -6
#define LWRES_R_NOTIMPLEMENTED -7
#define LWRES_R_UNEXPECTED -8
#endif /* LWRES_RESULT_H */

View file

@ -18,12 +18,12 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <lwres/lwbuffer.h>
#include <lwres/lwpacket.h>
#include <lwres/result.h>
#include "assert_p.h"
@ -36,7 +36,7 @@ lwres_lwpacket_renderheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt)
REQUIRE(pkt != NULL);
if (!SPACE_OK(b, LWPACKET_LENGTH))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
lwres_buffer_putuint32(b, pkt->length);
lwres_buffer_putuint16(b, pkt->version);
@ -48,7 +48,7 @@ lwres_lwpacket_renderheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt)
lwres_buffer_putuint16(b, pkt->authtype);
lwres_buffer_putuint16(b, pkt->authlength);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -61,11 +61,11 @@ lwres_lwpacket_parseheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt)
space = LWRES_BUFFER_REMAINING(b);
if (space < LWPACKET_LENGTH)
return (-1);
return (LWRES_R_UNEXPECTEDEND);
pkt->length = lwres_buffer_getuint32(b);
if (pkt->length > space)
return (-1);
return (LWRES_R_UNEXPECTEDEND);
pkt->version = lwres_buffer_getuint16(b);
pkt->flags = lwres_buffer_getuint16(b);
pkt->serial = lwres_buffer_getuint32(b);
@ -75,5 +75,5 @@ lwres_lwpacket_parseheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt)
pkt->authtype = lwres_buffer_getuint16(b);
pkt->authlength = lwres_buffer_getuint16(b);
return (0);
return (LWRES_R_SUCCESS);
}

View file

@ -18,13 +18,13 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <lwres/lwbuffer.h>
#include <lwres/lwpacket.h>
#include <lwres/lwres.h>
#include <lwres/result.h>
#include "context_p.h"
#include "assert_p.h"
@ -51,10 +51,9 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -66,7 +65,7 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -88,7 +87,7 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -122,10 +121,8 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -136,7 +133,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -175,7 +172,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -194,10 +191,10 @@ lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b,
REQUIRE(structp != NULL && *structp == NULL);
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
return (-1);
return (LWRES_R_FAILURE);
if (!SPACE_REMAINING(b, 4))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
addrtypes = lwres_buffer_getuint32(b);
@ -205,22 +202,22 @@ lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b,
* Pull off the name itself
*/
ret = lwres_string_parse(b, &name, &namelen);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
return (ret);
if (LWRES_BUFFER_REMAINING(b) != 0)
return (-1);
return (LWRES_R_UNEXPECTEDEND);
gabn = CTXMALLOC(sizeof(lwres_gabnrequest_t));
if (gabn == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
gabn->addrtypes = addrtypes;
gabn->name = name;
gabn->namelen = namelen;
*structp = gabn;
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -241,19 +238,19 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
gabn = NULL;
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
return (-1);
return (LWRES_R_FAILURE);
/*
* Pull off the name itself
*/
if (!SPACE_REMAINING(b, sizeof(isc_uint16_t) * 2))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
naliases = lwres_buffer_getuint16(b);
naddrs = lwres_buffer_getuint16(b);
gabn = CTXMALLOC(sizeof(lwres_gabnresponse_t));
if (gabn == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
gabn->aliases = NULL;
gabn->aliaslen = NULL;
gabn->addrs = NULL;
@ -264,19 +261,19 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
gabn->aliases = CTXMALLOC(sizeof(char *) * naliases);
if (gabn->aliases == NULL) {
ret = -1;
ret = LWRES_R_NOMEMORY;
goto out;
}
gabn->aliaslen = CTXMALLOC(sizeof(isc_uint16_t) * naliases);
if (gabn->aliaslen == NULL) {
ret = -1;
ret = LWRES_R_NOMEMORY;
goto out;
}
gabn->addrs = CTXMALLOC(sizeof(lwres_addr_t) * naddrs);
if (gabn->addrs == NULL) {
ret = -1;
ret = LWRES_R_NOMEMORY;
goto out;
}
@ -284,7 +281,7 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
* Now, pull off the real name.
*/
ret = lwres_string_parse(b, &gabn->realname, &gabn->realnamelen);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
/*
@ -292,7 +289,7 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
*/
for (x = 0 ; x < gabn->naddrs ; x++) {
ret = lwres_addr_parse(b, &gabn->addrs[x]);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
}
@ -302,17 +299,17 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
for (x = 0 ; x < gabn->naliases ; x++) {
ret = lwres_string_parse(b, &gabn->aliases[x],
&gabn->aliaslen[x]);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
}
if (LWRES_BUFFER_REMAINING(b) != 0) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
*structp = gabn;
return (0);
return (LWRES_R_SUCCESS);
out:
if (gabn != NULL) {

View file

@ -18,13 +18,13 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <lwres/lwbuffer.h>
#include <lwres/lwpacket.h>
#include <lwres/lwres.h>
#include <lwres/result.h>
#include "context_p.h"
#include "assert_p.h"
@ -51,10 +51,8 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -66,7 +64,7 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -84,7 +82,7 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -113,10 +111,8 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -127,7 +123,7 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -153,7 +149,7 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -169,23 +165,23 @@ lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_buffer_t *b,
REQUIRE(structp != NULL && *structp == NULL);
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
return (-1);
return (LWRES_R_FAILURE);
gnba = CTXMALLOC(sizeof(lwres_gnbarequest_t));
if (gnba == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
ret = lwres_addr_parse(b, &gnba->addr);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
if (LWRES_BUFFER_REMAINING(b) != 0) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
*structp = gnba;
return (0);
return (LWRES_R_SUCCESS);
out:
if (gnba != NULL)
@ -211,18 +207,18 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
gnba = NULL;
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
return (-1);
return (LWRES_R_FAILURE);
/*
* Pull off the name itself
*/
if (!SPACE_REMAINING(b, sizeof(isc_uint16_t)))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
naliases = lwres_buffer_getuint16(b);
gnba = CTXMALLOC(sizeof(lwres_gnbaresponse_t));
if (gnba == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
gnba->base = NULL;
gnba->aliases = NULL;
gnba->aliaslen = NULL;
@ -245,7 +241,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
* Now, pull off the real name.
*/
ret = lwres_string_parse(b, &gnba->realname, &gnba->realnamelen);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
/*
@ -254,7 +250,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
for (x = 0 ; x < gnba->naliases ; x++) {
ret = lwres_string_parse(b, &gnba->aliases[x],
&gnba->aliaslen[x]);
if (ret != 0)
if (ret != LWRES_R_SUCCESS)
goto out;
}
@ -264,7 +260,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
}
*structp = gnba;
return (0);
return (LWRES_R_SUCCESS);
out:
if (gnba != NULL) {

View file

@ -18,13 +18,13 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <lwres/lwbuffer.h>
#include <lwres/lwpacket.h>
#include <lwres/lwres.h>
#include <lwres/result.h>
#include "context_p.h"
#include "assert_p.h"
@ -47,10 +47,8 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -62,7 +60,7 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -79,7 +77,7 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -100,10 +98,8 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req,
buflen = LWRES_LWPACKET_LENGTH + payload_length;
buf = CTXMALLOC(buflen);
if (buf == NULL) {
errno = ENOMEM;
return (-1);
}
if (buf == NULL)
return (LWRES_R_NOMEMORY);
lwres_buffer_init(b, buf, buflen);
pkt->length = buflen;
@ -114,7 +110,7 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req,
pkt->authlength = 0;
ret = lwres_lwpacket_renderheader(b, pkt);
if (ret != 0) {
if (ret != LWRES_R_SUCCESS) {
lwres_buffer_invalidate(b);
CTXFREE(buf, buflen);
return (ret);
@ -131,7 +127,7 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req,
INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -147,33 +143,33 @@ lwres_nooprequest_parse(lwres_context_t *ctx, lwres_buffer_t *b,
REQUIRE(structp != NULL && *structp == NULL);
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) != 0)
return (-1);
return (LWRES_R_FAILURE);
req = CTXMALLOC(sizeof(lwres_nooprequest_t));
if (req == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
req->datalength = lwres_buffer_getuint16(b);
if (!SPACE_REMAINING(b, req->datalength)) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
req->data = b->base + b->current;
lwres_buffer_forward(b, req->datalength);
if (LWRES_BUFFER_REMAINING(b) != 0) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
/* success! */
*structp = req;
return (0);
return (LWRES_R_SUCCESS);
/* Error return */
out:
@ -194,33 +190,33 @@ lwres_noopresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
REQUIRE(structp != NULL && *structp == NULL);
if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
return (-1);
return (LWRES_R_FAILURE);
req = CTXMALLOC(sizeof(lwres_noopresponse_t));
if (req == NULL)
return (-1);
return (LWRES_R_NOMEMORY);
if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
req->datalength = lwres_buffer_getuint16(b);
if (!SPACE_REMAINING(b, req->datalength)) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
req->data = b->base + b->current;
lwres_buffer_forward(b, req->datalength);
if (LWRES_BUFFER_REMAINING(b) != 0) {
ret = -1;
ret = LWRES_R_UNEXPECTEDEND;
goto out;
}
/* success! */
*structp = req;
return (0);
return (LWRES_R_SUCCESS);
/* Error return */
out:

View file

@ -18,7 +18,6 @@
#include <config.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -30,6 +29,7 @@
#include <lwres/lwbuffer.h>
#include <lwres/lwres.h>
#include <lwres/result.h>
#include "assert_p.h"
#include "context_p.h"
@ -58,11 +58,11 @@ lwres_string_parse(lwres_buffer_t *b, char **c, isc_uint16_t *len)
REQUIRE(b != NULL);
if (!SPACE_REMAINING(b, sizeof(isc_uint16_t)))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
datalen = lwres_buffer_getuint16(b);
datalen++;
if (!SPACE_REMAINING(b, datalen))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
string = b->base + b->current;
@ -73,7 +73,7 @@ lwres_string_parse(lwres_buffer_t *b, char **c, isc_uint16_t *len)
if (c != NULL)
*c = string;
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -82,15 +82,15 @@ lwres_addr_parse(lwres_buffer_t *b, lwres_addr_t *addr)
REQUIRE(addr != NULL);
if (!SPACE_REMAINING(b, sizeof(isc_uint32_t) + sizeof(isc_uint16_t)))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
addr->family = lwres_buffer_getuint32(b);
addr->length = lwres_buffer_getuint16(b);
if (!SPACE_REMAINING(b, addr->length))
return (-1);
return (LWRES_R_UNEXPECTEDEND);
addr->address = b->base + b->current;
lwres_buffer_forward(b, addr->length);
return (0);
return (LWRES_R_SUCCESS);
}
int
@ -100,8 +100,7 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
lwres_gabnrequest_t request;
lwres_gabnresponse_t *response;
int ret;
int free_b;
lwres_buffer_t b;
lwres_buffer_t b_in, b_out;
lwres_lwpacket_t pkt;
isc_uint32_t serial;
char *buffer;
@ -111,14 +110,15 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
REQUIRE(addrtypes != 0);
REQUIRE(structp != NULL && *structp == NULL);
b_in.base = NULL;
b_out.base = NULL;
response = NULL;
free_b = 0;
buffer = NULL;
serial = (isc_uint32_t)name;
buffer = CTXMALLOC(LWRES_RECVLENGTH);
if (buffer == NULL) {
ret = -1;
ret = LWRES_R_NOMEMORY;
goto out;
}
@ -132,44 +132,44 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
pkt.result = 0;
pkt.recvlength = LWRES_RECVLENGTH;
ret = lwres_gabnrequest_render(ctx, &request, &pkt, &b);
again:
ret = lwres_gabnrequest_render(ctx, &request, &pkt, &b_out);
if (ret != 0)
goto out;
free_b = 1;
ret = lwres_context_sendrecv(ctx, b.base, b.length, buffer,
ret = lwres_context_sendrecv(ctx, b_out.base, b_out.length, buffer,
LWRES_RECVLENGTH);
if (ret < 0)
goto out;
CTXFREE(b.base, b.length);
free_b = 0;
lwres_buffer_init(&b, buffer, ret);
lwres_buffer_init(&b_in, buffer, ret);
/*
* Parse the packet header.
*/
ret = lwres_lwpacket_parseheader(&b, &pkt);
ret = lwres_lwpacket_parseheader(&b_in, &pkt);
if (ret != 0)
goto out;
/*
* Sanity check.
*/
if (pkt.serial != serial) {
ret = -1;
goto out;
}
if (pkt.opcode != LWRES_OPCODE_GETADDRSBYNAME) {
ret = -1;
goto out;
}
if (pkt.serial != serial)
goto again;
if (pkt.opcode != LWRES_OPCODE_GETADDRSBYNAME)
goto again;
/*
* Free what we've transmitted
*/
CTXFREE(b_out.base, b_out.length);
b_out.base = NULL;
b_out.length = 0;
/*
* Parse the response.
*/
ret = lwres_gabnresponse_parse(ctx, &b, &pkt, &response);
ret = lwres_gabnresponse_parse(ctx, &b_in, &pkt, &response);
if (ret != 0)
goto out;
response->base = buffer;
@ -177,11 +177,11 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
buffer = NULL; /* don't free this below */
*structp = response;
return (0);
return (LWRES_R_SUCCESS);
out:
if (free_b != 0)
CTXFREE(b.base, b.length);
if (b_out.base != NULL)
CTXFREE(b_out.base, b_out.length);
if (buffer != NULL)
CTXFREE(buffer, LWRES_RECVLENGTH);
if (response != NULL)
@ -199,8 +199,7 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype,
lwres_gnbarequest_t request;
lwres_gnbaresponse_t *response;
int ret;
int free_b;
lwres_buffer_t b;
lwres_buffer_t b_in, b_out;
lwres_lwpacket_t pkt;
isc_uint32_t serial;
char *buffer;
@ -211,14 +210,15 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype,
REQUIRE(addr != NULL);
REQUIRE(structp != NULL && *structp == NULL);
b_in.base = NULL;
b_out.base = NULL;
response = NULL;
free_b = 0;
buffer = NULL;
serial = (isc_uint32_t)addr;
buffer = CTXMALLOC(LWRES_RECVLENGTH);
if (buffer == NULL) {
ret = -1;
ret = LWRES_R_NOMEMORY;
goto out;
}
@ -233,44 +233,44 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype,
pkt.result = 0;
pkt.recvlength = LWRES_RECVLENGTH;
ret = lwres_gnbarequest_render(ctx, &request, &pkt, &b);
again:
ret = lwres_gnbarequest_render(ctx, &request, &pkt, &b_out);
if (ret != 0)
goto out;
free_b = 1;
ret = lwres_context_sendrecv(ctx, b.base, b.length, buffer,
ret = lwres_context_sendrecv(ctx, b_out.base, b_out.length, buffer,
LWRES_RECVLENGTH);
if (ret < 0)
goto out;
CTXFREE(b.base, b.length);
free_b = 0;
lwres_buffer_init(&b, buffer, ret);
lwres_buffer_init(&b_in, buffer, ret);
/*
* Parse the packet header.
*/
ret = lwres_lwpacket_parseheader(&b, &pkt);
ret = lwres_lwpacket_parseheader(&b_in, &pkt);
if (ret != 0)
goto out;
/*
* Sanity check.
*/
if (pkt.serial != serial) {
ret = -1;
goto out;
}
if (pkt.opcode != LWRES_OPCODE_GETNAMEBYADDR) {
ret = -1;
goto out;
}
if (pkt.serial != serial)
goto again;
if (pkt.opcode != LWRES_OPCODE_GETNAMEBYADDR)
goto again;
/*
* Free what we've transmitted
*/
CTXFREE(b_out.base, b_out.length);
b_out.base = NULL;
b_out.length = 0;
/*
* Parse the response.
*/
ret = lwres_gnbaresponse_parse(ctx, &b, &pkt, &response);
ret = lwres_gnbaresponse_parse(ctx, &b_in, &pkt, &response);
if (ret != 0)
goto out;
response->base = buffer;
@ -278,11 +278,11 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype,
buffer = NULL; /* don't free this below */
*structp = response;
return (0);
return (LWRES_R_SUCCESS);
out:
if (free_b != 0)
CTXFREE(b.base, b.length);
if (b_out.base != NULL)
CTXFREE(b_out.base, b_out.length);
if (buffer != NULL)
CTXFREE(buffer, LWRES_RECVLENGTH);
if (response != NULL)