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
));