]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/nscd/protocol.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / nscd / protocol.c
1 /*-
2  * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  */
27
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30
31 #include <assert.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include "debug.h"
36 #include "log.h"
37 #include "protocol.h"
38
39 /*
40  * Initializes the comm_element with any given type of data
41  */
42 void
43 init_comm_element(struct comm_element *element, enum comm_element_t type)
44 {
45
46         TRACE_IN(init_comm_element);
47         memset(element, 0, sizeof(struct comm_element));
48
49         switch (type) {
50         case CET_WRITE_REQUEST:
51                 init_cache_write_request(&element->c_write_request);
52                 break;
53         case CET_WRITE_RESPONSE:
54                 init_cache_write_response(&element->c_write_response);
55                 break;
56         case CET_READ_REQUEST:
57                 init_cache_read_request(&element->c_read_request);
58                 break;
59         case CET_READ_RESPONSE:
60                 init_cache_read_response(&element->c_read_response);
61                 break;
62         case CET_TRANSFORM_REQUEST:
63                 init_cache_transform_request(&element->c_transform_request);
64                 break;
65         case CET_TRANSFORM_RESPONSE:
66                 init_cache_transform_response(&element->c_transform_response);
67                 break;
68         case CET_MP_WRITE_SESSION_REQUEST:
69                 init_cache_mp_write_session_request(&element->c_mp_ws_request);
70                 break;
71         case CET_MP_WRITE_SESSION_RESPONSE:
72                 init_cache_mp_write_session_response(&element->c_mp_ws_response);
73                 break;
74         case CET_MP_WRITE_SESSION_WRITE_REQUEST:
75                 init_cache_mp_write_session_write_request(
76                         &element->c_mp_ws_write_request);
77                 break;
78         case CET_MP_WRITE_SESSION_WRITE_RESPONSE:
79                 init_cache_mp_write_session_write_response(
80                         &element->c_mp_ws_write_response);
81                 break;
82         case CET_MP_READ_SESSION_REQUEST:
83                 init_cache_mp_read_session_request(&element->c_mp_rs_request);
84                 break;
85         case CET_MP_READ_SESSION_RESPONSE:
86                 init_cache_mp_read_session_response(&element->c_mp_rs_response);
87                 break;
88         case CET_MP_READ_SESSION_READ_RESPONSE:
89                 init_cache_mp_read_session_read_response(
90                         &element->c_mp_rs_read_response);
91                 break;
92         case CET_UNDEFINED:
93                 break;
94         default:
95                 LOG_ERR_2("init_comm_element", "invalid communication element");
96                 TRACE_OUT(init_comm_element);
97         return;
98         }
99
100         element->type = type;
101         TRACE_OUT(init_comm_element);
102 }
103
104 void
105 finalize_comm_element(struct comm_element *element)
106 {
107
108         TRACE_IN(finalize_comm_element);
109         switch (element->type) {
110         case CET_WRITE_REQUEST:
111                 finalize_cache_write_request(&element->c_write_request);
112                 break;
113         case CET_WRITE_RESPONSE:
114                 finalize_cache_write_response(&element->c_write_response);
115                 break;
116         case CET_READ_REQUEST:
117                 finalize_cache_read_request(&element->c_read_request);
118                 break;
119         case CET_READ_RESPONSE:
120                 finalize_cache_read_response(&element->c_read_response);
121                 break;
122         case CET_TRANSFORM_REQUEST:
123                 finalize_cache_transform_request(&element->c_transform_request);
124                 break;
125         case CET_TRANSFORM_RESPONSE:
126                 finalize_cache_transform_response(
127                         &element->c_transform_response);
128                 break;
129         case CET_MP_WRITE_SESSION_REQUEST:
130                 finalize_cache_mp_write_session_request(
131                         &element->c_mp_ws_request);
132                 break;
133         case CET_MP_WRITE_SESSION_RESPONSE:
134                 finalize_cache_mp_write_session_response(
135                         &element->c_mp_ws_response);
136                 break;
137         case CET_MP_WRITE_SESSION_WRITE_REQUEST:
138                 finalize_cache_mp_write_session_write_request(
139                         &element->c_mp_ws_write_request);
140                 break;
141         case CET_MP_WRITE_SESSION_WRITE_RESPONSE:
142                 finalize_cache_mp_write_session_write_response(
143                         &element->c_mp_ws_write_response);
144                 break;
145         case CET_MP_READ_SESSION_REQUEST:
146                 finalize_cache_mp_read_session_request(
147                         &element->c_mp_rs_request);
148                 break;
149         case CET_MP_READ_SESSION_RESPONSE:
150                 finalize_cache_mp_read_session_response(
151                         &element->c_mp_rs_response);
152                 break;
153         case CET_MP_READ_SESSION_READ_RESPONSE:
154                 finalize_cache_mp_read_session_read_response(
155                         &element->c_mp_rs_read_response);
156                 break;
157         case CET_UNDEFINED:
158                 break;
159         default:
160         break;
161         }
162
163         element->type = CET_UNDEFINED;
164         TRACE_OUT(finalize_comm_element);
165 }
166
167 void
168 init_cache_write_request(struct cache_write_request *write_request)
169 {
170
171         TRACE_IN(init_cache_write_request);
172         memset(write_request, 0, sizeof(struct cache_write_request));
173         TRACE_OUT(init_cache_write_request);
174 }
175
176 void
177 finalize_cache_write_request(struct cache_write_request *write_request)
178 {
179
180         TRACE_IN(finalize_cache_write_request);
181         free(write_request->entry);
182         free(write_request->cache_key);
183         free(write_request->data);
184         TRACE_OUT(finalize_cache_write_request);
185 }
186
187 struct cache_write_request *
188 get_cache_write_request(struct comm_element *element)
189 {
190
191         TRACE_IN(get_cache_write_request);
192         assert(element->type == CET_WRITE_REQUEST);
193         TRACE_OUT(get_cache_write_request);
194         return (&element->c_write_request);
195 }
196
197 void
198 init_cache_write_response(struct cache_write_response *write_response)
199 {
200
201         TRACE_IN(init_cache_write_response);
202         memset(write_response, 0, sizeof(struct cache_write_response));
203         TRACE_OUT(init_cache_write_response);
204 }
205
206 void
207 finalize_cache_write_response(struct cache_write_response *write_response)
208 {
209
210         TRACE_IN(finalize_cache_write_response);
211         TRACE_OUT(finalize_cache_write_response);
212 }
213
214 struct cache_write_response *
215 get_cache_write_response(struct comm_element *element)
216 {
217
218         TRACE_IN(get_cache_write_response);
219         assert(element->type == CET_WRITE_RESPONSE);
220         TRACE_OUT(get_cache_write_response);
221         return (&element->c_write_response);
222 }
223
224 void
225 init_cache_read_request(struct cache_read_request *read_request)
226 {
227
228         TRACE_IN(init_cache_read_request);
229         memset(read_request, 0, sizeof(struct cache_read_request));
230         TRACE_OUT(init_cache_read_request);
231 }
232
233 void
234 finalize_cache_read_request(struct cache_read_request *read_request)
235 {
236
237         TRACE_IN(finalize_cache_read_request);
238         free(read_request->entry);
239         free(read_request->cache_key);
240         TRACE_OUT(finalize_cache_read_request);
241 }
242
243 struct cache_read_request *
244 get_cache_read_request(struct comm_element *element)
245 {
246
247         TRACE_IN(get_cache_read_request);
248         assert(element->type == CET_READ_REQUEST);
249         TRACE_OUT(get_cache_read_request);
250         return (&element->c_read_request);
251 }
252
253 void
254 init_cache_read_response(struct cache_read_response *read_response)
255 {
256
257         TRACE_IN(init_cache_read_response);
258         memset(read_response, 0, sizeof(struct cache_read_response));
259         TRACE_OUT(init_cache_read_response);
260 }
261
262 void
263 finalize_cache_read_response(struct cache_read_response *read_response)
264 {
265
266         TRACE_IN(finalize_cache_read_response);
267         free(read_response->data);
268         TRACE_OUT(finalize_cache_read_response);
269 }
270
271 struct cache_read_response *
272 get_cache_read_response(struct comm_element *element)
273 {
274
275         TRACE_IN(get_cache_read_response);
276         assert(element->type == CET_READ_RESPONSE);
277         TRACE_OUT(get_cache_read_response);
278         return (&element->c_read_response);
279 }
280
281 void
282 init_cache_transform_request(struct cache_transform_request *transform_request)
283 {
284
285         TRACE_IN(init_cache_transform_request);
286         memset(transform_request, 0, sizeof(struct cache_transform_request));
287         TRACE_OUT(init_cache_transform_request);
288 }
289
290 void
291 finalize_cache_transform_request(
292         struct cache_transform_request *transform_request)
293 {
294
295         TRACE_IN(finalize_cache_transform_request);
296         free(transform_request->entry);
297         TRACE_OUT(finalize_cache_transform_request);
298 }
299
300 struct cache_transform_request *
301 get_cache_transform_request(struct comm_element *element)
302 {
303
304         TRACE_IN(get_cache_transform_request);
305         assert(element->type == CET_TRANSFORM_REQUEST);
306         TRACE_OUT(get_cache_transform_request);
307         return (&element->c_transform_request);
308 }
309
310 void
311 init_cache_transform_response(
312         struct cache_transform_response *transform_response)
313 {
314
315         TRACE_IN(init_cache_transform_request);
316         memset(transform_response, 0, sizeof(struct cache_transform_response));
317         TRACE_OUT(init_cache_transform_request);
318 }
319
320 void
321 finalize_cache_transform_response(
322         struct cache_transform_response *transform_response)
323 {
324
325         TRACE_IN(finalize_cache_transform_response);
326         TRACE_OUT(finalize_cache_transform_response);
327 }
328
329 struct cache_transform_response *
330 get_cache_transform_response(struct comm_element *element)
331 {
332
333         TRACE_IN(get_cache_transform_response);
334         assert(element->type == CET_TRANSFORM_RESPONSE);
335         TRACE_OUT(get_cache_transform_response);
336         return (&element->c_transform_response);
337 }
338
339
340 void
341 init_cache_mp_write_session_request(
342         struct cache_mp_write_session_request *mp_ws_request)
343 {
344
345         TRACE_IN(init_cache_mp_write_session_request);
346         memset(mp_ws_request, 0,
347                 sizeof(struct cache_mp_write_session_request));
348         TRACE_OUT(init_cache_mp_write_session_request);
349 }
350
351 void
352 finalize_cache_mp_write_session_request(
353         struct cache_mp_write_session_request *mp_ws_request)
354 {
355
356         TRACE_IN(finalize_cache_mp_write_session_request);
357         free(mp_ws_request->entry);
358         TRACE_OUT(finalize_cache_mp_write_session_request);
359 }
360
361 struct cache_mp_write_session_request *
362 get_cache_mp_write_session_request(struct comm_element *element)
363 {
364
365         TRACE_IN(get_cache_mp_write_session_request);
366         assert(element->type == CET_MP_WRITE_SESSION_REQUEST);
367         TRACE_OUT(get_cache_mp_write_session_request);
368         return (&element->c_mp_ws_request);
369 }
370
371 void
372 init_cache_mp_write_session_response(
373         struct cache_mp_write_session_response *mp_ws_response)
374 {
375
376         TRACE_IN(init_cache_mp_write_session_response);
377         memset(mp_ws_response, 0,
378                 sizeof(struct cache_mp_write_session_response));
379         TRACE_OUT(init_cache_mp_write_session_response);
380 }
381
382 void
383 finalize_cache_mp_write_session_response(
384         struct cache_mp_write_session_response *mp_ws_response)
385 {
386
387         TRACE_IN(finalize_cache_mp_write_session_response);
388         TRACE_OUT(finalize_cache_mp_write_session_response);
389 }
390
391 struct cache_mp_write_session_response *
392 get_cache_mp_write_session_response(struct comm_element *element)
393 {
394
395         TRACE_IN(get_cache_mp_write_session_response);
396         assert(element->type == CET_MP_WRITE_SESSION_RESPONSE);
397         TRACE_OUT(get_cache_mp_write_session_response);
398         return (&element->c_mp_ws_response);
399 }
400
401 void
402 init_cache_mp_write_session_write_request(
403         struct cache_mp_write_session_write_request *mp_ws_write_request)
404 {
405
406         TRACE_IN(init_cache_mp_write_session_write_request);
407         memset(mp_ws_write_request, 0,
408                 sizeof(struct cache_mp_write_session_write_request));
409         TRACE_OUT(init_cache_mp_write_session_write_response);
410 }
411
412 void
413 finalize_cache_mp_write_session_write_request(
414         struct cache_mp_write_session_write_request *mp_ws_write_request)
415 {
416
417         TRACE_IN(finalize_cache_mp_write_session_write_request);
418         free(mp_ws_write_request->data);
419         TRACE_OUT(finalize_cache_mp_write_session_write_request);
420 }
421
422 struct cache_mp_write_session_write_request *
423 get_cache_mp_write_session_write_request(struct comm_element *element)
424 {
425
426         TRACE_IN(get_cache_mp_write_session_write_request);
427         assert(element->type == CET_MP_WRITE_SESSION_WRITE_REQUEST);
428         TRACE_OUT(get_cache_mp_write_session_write_request);
429         return (&element->c_mp_ws_write_request);
430 }
431
432 void
433 init_cache_mp_write_session_write_response(
434         struct cache_mp_write_session_write_response *mp_ws_write_response)
435 {
436
437         TRACE_IN(init_cache_mp_write_session_write_response);
438         memset(mp_ws_write_response, 0,
439                 sizeof(struct cache_mp_write_session_write_response));
440         TRACE_OUT(init_cache_mp_write_session_write_response);
441 }
442
443 void
444 finalize_cache_mp_write_session_write_response(
445         struct cache_mp_write_session_write_response *mp_ws_write_response)
446 {
447
448         TRACE_IN(finalize_cache_mp_write_session_write_response);
449         TRACE_OUT(finalize_cache_mp_write_session_write_response);
450 }
451
452 struct cache_mp_write_session_write_response *
453 get_cache_mp_write_session_write_response(struct comm_element *element)
454 {
455
456         TRACE_IN(get_cache_mp_write_session_write_response);
457         assert(element->type == CET_MP_WRITE_SESSION_WRITE_RESPONSE);
458         TRACE_OUT(get_cache_mp_write_session_write_response);
459         return (&element->c_mp_ws_write_response);
460 }
461
462 void
463 init_cache_mp_read_session_request(
464         struct cache_mp_read_session_request *mp_rs_request)
465 {
466
467         TRACE_IN(init_cache_mp_read_session_request);
468         memset(mp_rs_request, 0, sizeof(struct cache_mp_read_session_request));
469         TRACE_OUT(init_cache_mp_read_session_request);
470 }
471
472 void
473 finalize_cache_mp_read_session_request(
474         struct cache_mp_read_session_request *mp_rs_request)
475 {
476
477         TRACE_IN(finalize_cache_mp_read_session_request);
478         free(mp_rs_request->entry);
479         TRACE_OUT(finalize_cache_mp_read_session_request);
480 }
481
482 struct cache_mp_read_session_request *
483 get_cache_mp_read_session_request(struct comm_element *element)
484 {
485
486         TRACE_IN(get_cache_mp_read_session_request);
487         assert(element->type == CET_MP_READ_SESSION_REQUEST);
488         TRACE_OUT(get_cache_mp_read_session_request);
489         return (&element->c_mp_rs_request);
490 }
491
492 void
493 init_cache_mp_read_session_response(
494         struct cache_mp_read_session_response *mp_rs_response)
495 {
496
497         TRACE_IN(init_cache_mp_read_session_response);
498         memset(mp_rs_response, 0,
499                 sizeof(struct cache_mp_read_session_response));
500         TRACE_OUT(init_cache_mp_read_session_response);
501 }
502
503 void
504 finalize_cache_mp_read_session_response(
505         struct cache_mp_read_session_response *mp_rs_response)
506 {
507
508         TRACE_IN(finalize_cache_mp_read_session_response);
509         TRACE_OUT(finalize_cache_mp_read_session_response);
510 }
511
512 struct cache_mp_read_session_response *
513 get_cache_mp_read_session_response(struct comm_element *element)
514 {
515
516         TRACE_IN(get_cache_mp_read_session_response);
517         assert(element->type == CET_MP_READ_SESSION_RESPONSE);
518         TRACE_OUT(get_cache_mp_read_session_response);
519         return (&element->c_mp_rs_response);
520 }
521
522 void
523 init_cache_mp_read_session_read_response(
524         struct cache_mp_read_session_read_response *mp_ws_read_response)
525 {
526
527         TRACE_IN(init_cache_mp_read_session_read_response);
528         memset(mp_ws_read_response, 0,
529                 sizeof(struct cache_mp_read_session_read_response));
530         TRACE_OUT(init_cache_mp_read_session_read_response);
531 }
532
533 void
534 finalize_cache_mp_read_session_read_response(
535         struct cache_mp_read_session_read_response *mp_rs_read_response)
536 {
537
538         TRACE_IN(finalize_cache_mp_read_session_read_response);
539         free(mp_rs_read_response->data);
540         TRACE_OUT(finalize_cache_mp_read_session_read_response);
541 }
542
543 struct cache_mp_read_session_read_response *
544 get_cache_mp_read_session_read_response(struct comm_element *element)
545 {
546
547         TRACE_IN(get_cache_mp_read_session_read_response);
548         assert(element->type == CET_MP_READ_SESSION_READ_RESPONSE);
549         TRACE_OUT(get_cache_mp_read_session_read_response);
550         return (&element->c_mp_rs_read_response);
551 }