2 * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2000, 2001 Internet Software Consortium.
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
18 /* $Id: lwres_noop.c,v 1.14.206.1 2004/03/06 08:15:33 marka Exp $ */
26 #include <lwres/lwbuffer.h>
27 #include <lwres/lwpacket.h>
28 #include <lwres/lwres.h>
29 #include <lwres/result.h>
31 #include "context_p.h"
35 lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req,
36 lwres_lwpacket_t *pkt, lwres_buffer_t *b)
41 size_t payload_length;
48 payload_length = sizeof(lwres_uint16_t) + req->datalength;
50 buflen = LWRES_LWPACKET_LENGTH + payload_length;
51 buf = CTXMALLOC(buflen);
53 return (LWRES_R_NOMEMORY);
54 lwres_buffer_init(b, buf, buflen);
57 pkt->version = LWRES_LWPACKETVERSION_0;
58 pkt->pktflags &= ~LWRES_LWPACKETFLAG_RESPONSE;
59 pkt->opcode = LWRES_OPCODE_NOOP;
64 ret = lwres_lwpacket_renderheader(b, pkt);
65 if (ret != LWRES_R_SUCCESS) {
66 lwres_buffer_invalidate(b);
71 INSIST(SPACE_OK(b, payload_length));
74 * Put the length and the data. We know this will fit because we
75 * just checked for it.
77 lwres_buffer_putuint16(b, req->datalength);
78 lwres_buffer_putmem(b, req->data, req->datalength);
80 INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
82 return (LWRES_R_SUCCESS);
86 lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req,
87 lwres_lwpacket_t *pkt, lwres_buffer_t *b)
92 size_t payload_length;
99 payload_length = sizeof(lwres_uint16_t) + req->datalength;
101 buflen = LWRES_LWPACKET_LENGTH + payload_length;
102 buf = CTXMALLOC(buflen);
104 return (LWRES_R_NOMEMORY);
105 lwres_buffer_init(b, buf, buflen);
107 pkt->length = buflen;
108 pkt->version = LWRES_LWPACKETVERSION_0;
109 pkt->pktflags |= LWRES_LWPACKETFLAG_RESPONSE;
110 pkt->opcode = LWRES_OPCODE_NOOP;
114 ret = lwres_lwpacket_renderheader(b, pkt);
115 if (ret != LWRES_R_SUCCESS) {
116 lwres_buffer_invalidate(b);
117 CTXFREE(buf, buflen);
121 INSIST(SPACE_OK(b, payload_length));
124 * Put the length and the data. We know this will fit because we
125 * just checked for it.
127 lwres_buffer_putuint16(b, req->datalength);
128 lwres_buffer_putmem(b, req->data, req->datalength);
130 INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0);
132 return (LWRES_R_SUCCESS);
136 lwres_nooprequest_parse(lwres_context_t *ctx, lwres_buffer_t *b,
137 lwres_lwpacket_t *pkt, lwres_nooprequest_t **structp)
140 lwres_nooprequest_t *req;
142 REQUIRE(ctx != NULL);
144 REQUIRE(pkt != NULL);
145 REQUIRE(structp != NULL && *structp == NULL);
147 if ((pkt->pktflags & LWRES_LWPACKETFLAG_RESPONSE) != 0)
148 return (LWRES_R_FAILURE);
150 req = CTXMALLOC(sizeof(lwres_nooprequest_t));
152 return (LWRES_R_NOMEMORY);
154 if (!SPACE_REMAINING(b, sizeof(lwres_uint16_t))) {
155 ret = LWRES_R_UNEXPECTEDEND;
158 req->datalength = lwres_buffer_getuint16(b);
160 if (!SPACE_REMAINING(b, req->datalength)) {
161 ret = LWRES_R_UNEXPECTEDEND;
164 req->data = b->base + b->current;
165 lwres_buffer_forward(b, req->datalength);
167 if (LWRES_BUFFER_REMAINING(b) != 0) {
168 ret = LWRES_R_TRAILINGDATA;
174 return (LWRES_R_SUCCESS);
178 CTXFREE(req, sizeof(lwres_nooprequest_t));
183 lwres_noopresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b,
184 lwres_lwpacket_t *pkt, lwres_noopresponse_t **structp)
187 lwres_noopresponse_t *req;
189 REQUIRE(ctx != NULL);
191 REQUIRE(pkt != NULL);
192 REQUIRE(structp != NULL && *structp == NULL);
194 if ((pkt->pktflags & LWRES_LWPACKETFLAG_RESPONSE) == 0)
195 return (LWRES_R_FAILURE);
197 req = CTXMALLOC(sizeof(lwres_noopresponse_t));
199 return (LWRES_R_NOMEMORY);
201 if (!SPACE_REMAINING(b, sizeof(lwres_uint16_t))) {
202 ret = LWRES_R_UNEXPECTEDEND;
205 req->datalength = lwres_buffer_getuint16(b);
207 if (!SPACE_REMAINING(b, req->datalength)) {
208 ret = LWRES_R_UNEXPECTEDEND;
211 req->data = b->base + b->current;
213 lwres_buffer_forward(b, req->datalength);
214 if (LWRES_BUFFER_REMAINING(b) != 0) {
215 ret = LWRES_R_TRAILINGDATA;
221 return (LWRES_R_SUCCESS);
225 CTXFREE(req, sizeof(lwres_noopresponse_t));
230 lwres_noopresponse_free(lwres_context_t *ctx, lwres_noopresponse_t **structp)
232 lwres_noopresponse_t *noop;
234 REQUIRE(ctx != NULL);
235 REQUIRE(structp != NULL && *structp != NULL);
240 CTXFREE(noop, sizeof(lwres_noopresponse_t));
244 lwres_nooprequest_free(lwres_context_t *ctx, lwres_nooprequest_t **structp)
246 lwres_nooprequest_t *noop;
248 REQUIRE(ctx != NULL);
249 REQUIRE(structp != NULL && *structp != NULL);
254 CTXFREE(noop, sizeof(lwres_nooprequest_t));