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: releng/10.3/usr.sbin/nscd/protocol.c 194093 2009-06-13 00:43:56Z des $"); 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 */ 42void 43init_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 104void 105finalize_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 167void 168init_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 176void 177finalize_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 187struct cache_write_request * 188get_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 197void 198init_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 206void 207finalize_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 214struct cache_write_response * 215get_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 224void 225init_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 233void 234finalize_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 243struct cache_read_request * 244get_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 253void 254init_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 262void 263finalize_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 271struct cache_read_response * 272get_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 281void 282init_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 290void 291finalize_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 300struct cache_transform_request * 301get_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 310void 311init_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 320void 321finalize_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 329struct cache_transform_response * 330get_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 340void 341init_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 351void 352finalize_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 361struct cache_mp_write_session_request * 362get_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 371void 372init_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 382void 383finalize_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 391struct cache_mp_write_session_response * 392get_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 401void 402init_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 412void 413finalize_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 422struct cache_mp_write_session_write_request * 423get_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 432void 433init_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 443void 444finalize_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 452struct cache_mp_write_session_write_response * 453get_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 462void 463init_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 472void 473finalize_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 482struct cache_mp_read_session_request * 483get_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 492void 493init_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 503void 504finalize_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 512struct cache_mp_read_session_response * 513get_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 522void 523init_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 533void 534finalize_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 543struct cache_mp_read_session_read_response * 544get_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} 552