1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ 5 * Authors: Doug Rabson <dfr@rabson.org> 6 * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include <sys/param.h> 31 #include <sys/systm.h> 32 33 #include <nlm/nlm_prot.h> 34 #include <nlm/nlm.h> 35 36 #include <sys/cdefs.h> 37 #ifndef lint 38 __RCSID("$NetBSD: nlm_prot.x,v 1.6 2000/06/07 14:30:15 bouyer Exp $"); 39 #endif /* not lint */ 40 void nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp); 41 void nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp); 42 void nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp); 43 void nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp); 44 45 void 46 nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp) 47 { 48 union { 49 struct nlm_sm_status nlm_sm_notify_0_arg; 50 } argument; 51 char result; 52 bool_t retval; 53 xdrproc_t xdr_argument, xdr_result; 54 bool_t (*local)(char *, void *, struct svc_req *); 55 56 switch (rqstp->rq_proc) { 57 case NULLPROC: 58 (void) svc_sendreply(rqstp, 59 (xdrproc_t) xdr_void, (char *)NULL); 60 svc_freereq(rqstp); 61 return; 62 63 case NLM_SM_NOTIFY: 64 xdr_argument = (xdrproc_t) xdr_nlm_sm_status; 65 xdr_result = (xdrproc_t) xdr_void; 66 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_sm_notify_0_svc; 67 break; 68 69 default: 70 svcerr_noproc(rqstp); 71 svc_freereq(rqstp); 72 return; 73 } 74 (void) memset((char *)&argument, 0, sizeof (argument)); 75 if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 76 svcerr_decode(rqstp); 77 svc_freereq(rqstp); 78 return; 79 } 80 retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp); 81 if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) { 82 svcerr_systemerr(rqstp); 83 } 84 if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 85 printf("unable to free arguments"); 86 //exit(1); 87 } 88 svc_freereq(rqstp); 89 90 return; 91 } 92 93 void 94 nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp) 95 { 96 union { 97 struct nlm_testargs nlm_test_1_arg; 98 struct nlm_lockargs nlm_lock_1_arg; 99 struct nlm_cancargs nlm_cancel_1_arg; 100 struct nlm_unlockargs nlm_unlock_1_arg; 101 struct nlm_testargs nlm_granted_1_arg; 102 struct nlm_testargs nlm_test_msg_1_arg; 103 struct nlm_lockargs nlm_lock_msg_1_arg; 104 struct nlm_cancargs nlm_cancel_msg_1_arg; 105 struct nlm_unlockargs nlm_unlock_msg_1_arg; 106 struct nlm_testargs nlm_granted_msg_1_arg; 107 nlm_testres nlm_test_res_1_arg; 108 nlm_res nlm_lock_res_1_arg; 109 nlm_res nlm_cancel_res_1_arg; 110 nlm_res nlm_unlock_res_1_arg; 111 nlm_res nlm_granted_res_1_arg; 112 } argument; 113 union { 114 nlm_testres nlm_test_1_res; 115 nlm_res nlm_lock_1_res; 116 nlm_res nlm_cancel_1_res; 117 nlm_res nlm_unlock_1_res; 118 nlm_res nlm_granted_1_res; 119 } result; 120 bool_t retval; 121 xdrproc_t xdr_argument, xdr_result; 122 bool_t (*local)(char *, void *, struct svc_req *); 123 124 switch (rqstp->rq_proc) { 125 case NULLPROC: 126 (void) svc_sendreply(rqstp, 127 (xdrproc_t) xdr_void, (char *)NULL); 128 svc_freereq(rqstp); 129 return; 130 131 case NLM_TEST: 132 xdr_argument = (xdrproc_t) xdr_nlm_testargs; 133 xdr_result = (xdrproc_t) xdr_nlm_testres; 134 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_test_1_svc; 135 break; 136 137 case NLM_LOCK: 138 xdr_argument = (xdrproc_t) xdr_nlm_lockargs; 139 xdr_result = (xdrproc_t) xdr_nlm_res; 140 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_lock_1_svc; 141 break; 142 143 case NLM_CANCEL: 144 xdr_argument = (xdrproc_t) xdr_nlm_cancargs; 145 xdr_result = (xdrproc_t) xdr_nlm_res; 146 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_cancel_1_svc; 147 break; 148 149 case NLM_UNLOCK: 150 xdr_argument = (xdrproc_t) xdr_nlm_unlockargs; 151 xdr_result = (xdrproc_t) xdr_nlm_res; 152 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_unlock_1_svc; 153 break; 154 155 case NLM_GRANTED: 156 xdr_argument = (xdrproc_t) xdr_nlm_testargs; 157 xdr_result = (xdrproc_t) xdr_nlm_res; 158 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_granted_1_svc; 159 break; 160 161 case NLM_TEST_MSG: 162 xdr_argument = (xdrproc_t) xdr_nlm_testargs; 163 xdr_result = (xdrproc_t) xdr_void; 164 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_test_msg_1_svc; 165 break; 166 167 case NLM_LOCK_MSG: 168 xdr_argument = (xdrproc_t) xdr_nlm_lockargs; 169 xdr_result = (xdrproc_t) xdr_void; 170 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_lock_msg_1_svc; 171 break; 172 173 case NLM_CANCEL_MSG: 174 xdr_argument = (xdrproc_t) xdr_nlm_cancargs; 175 xdr_result = (xdrproc_t) xdr_void; 176 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_cancel_msg_1_svc; 177 break; 178 179 case NLM_UNLOCK_MSG: 180 xdr_argument = (xdrproc_t) xdr_nlm_unlockargs; 181 xdr_result = (xdrproc_t) xdr_void; 182 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_unlock_msg_1_svc; 183 break; 184 185 case NLM_GRANTED_MSG: 186 xdr_argument = (xdrproc_t) xdr_nlm_testargs; 187 xdr_result = (xdrproc_t) xdr_void; 188 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_granted_msg_1_svc; 189 break; 190 191 case NLM_TEST_RES: 192 xdr_argument = (xdrproc_t) xdr_nlm_testres; 193 xdr_result = (xdrproc_t) xdr_void; 194 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_test_res_1_svc; 195 break; 196 197 case NLM_LOCK_RES: 198 xdr_argument = (xdrproc_t) xdr_nlm_res; 199 xdr_result = (xdrproc_t) xdr_void; 200 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_lock_res_1_svc; 201 break; 202 203 case NLM_CANCEL_RES: 204 xdr_argument = (xdrproc_t) xdr_nlm_res; 205 xdr_result = (xdrproc_t) xdr_void; 206 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_cancel_res_1_svc; 207 break; 208 209 case NLM_UNLOCK_RES: 210 xdr_argument = (xdrproc_t) xdr_nlm_res; 211 xdr_result = (xdrproc_t) xdr_void; 212 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_unlock_res_1_svc; 213 break; 214 215 case NLM_GRANTED_RES: 216 xdr_argument = (xdrproc_t) xdr_nlm_res; 217 xdr_result = (xdrproc_t) xdr_void; 218 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_granted_res_1_svc; 219 break; 220 221 default: 222 svcerr_noproc(rqstp); 223 svc_freereq(rqstp); 224 return; 225 } 226 (void) memset((char *)&argument, 0, sizeof (argument)); 227 if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 228 svcerr_decode(rqstp); 229 svc_freereq(rqstp); 230 return; 231 } 232 retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp); 233 if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) { 234 svcerr_systemerr(rqstp); 235 } 236 if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 237 printf("unable to free arguments"); 238 //exit(1); 239 } 240 svc_freereq(rqstp); 241 if (!nlm_prog_1_freeresult(transp, xdr_result, (caddr_t) &result)) 242 printf("unable to free results"); 243 244 return; 245 } 246 247 void 248 nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp) 249 { 250 union { 251 nlm_shareargs nlm_share_3_arg; 252 nlm_shareargs nlm_unshare_3_arg; 253 nlm_lockargs nlm_nm_lock_3_arg; 254 nlm_notify nlm_free_all_3_arg; 255 } argument; 256 union { 257 nlm_shareres nlm_share_3_res; 258 nlm_shareres nlm_unshare_3_res; 259 nlm_res nlm_nm_lock_3_res; 260 } result; 261 bool_t retval; 262 xdrproc_t xdr_argument, xdr_result; 263 bool_t (*local)(char *, void *, struct svc_req *); 264 265 switch (rqstp->rq_proc) { 266 case NULLPROC: 267 (void) svc_sendreply(rqstp, 268 (xdrproc_t) xdr_void, (char *)NULL); 269 svc_freereq(rqstp); 270 return; 271 272 case NLM_TEST: 273 case NLM_LOCK: 274 case NLM_CANCEL: 275 case NLM_UNLOCK: 276 case NLM_GRANTED: 277 case NLM_TEST_MSG: 278 case NLM_LOCK_MSG: 279 case NLM_CANCEL_MSG: 280 case NLM_UNLOCK_MSG: 281 case NLM_GRANTED_MSG: 282 case NLM_TEST_RES: 283 case NLM_LOCK_RES: 284 case NLM_CANCEL_RES: 285 case NLM_UNLOCK_RES: 286 case NLM_GRANTED_RES: 287 nlm_prog_1(rqstp, transp); 288 return; 289 290 case NLM_SHARE: 291 xdr_argument = (xdrproc_t) xdr_nlm_shareargs; 292 xdr_result = (xdrproc_t) xdr_nlm_shareres; 293 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_share_3_svc; 294 break; 295 296 case NLM_UNSHARE: 297 xdr_argument = (xdrproc_t) xdr_nlm_shareargs; 298 xdr_result = (xdrproc_t) xdr_nlm_shareres; 299 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_unshare_3_svc; 300 break; 301 302 case NLM_NM_LOCK: 303 xdr_argument = (xdrproc_t) xdr_nlm_lockargs; 304 xdr_result = (xdrproc_t) xdr_nlm_res; 305 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_nm_lock_3_svc; 306 break; 307 308 case NLM_FREE_ALL: 309 xdr_argument = (xdrproc_t) xdr_nlm_notify; 310 xdr_result = (xdrproc_t) xdr_void; 311 local = (bool_t (*) (char *, void *, struct svc_req *))nlm_free_all_3_svc; 312 break; 313 314 default: 315 svcerr_noproc(rqstp); 316 svc_freereq(rqstp); 317 return; 318 } 319 (void) memset((char *)&argument, 0, sizeof (argument)); 320 if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 321 svcerr_decode(rqstp); 322 svc_freereq(rqstp); 323 return; 324 } 325 retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp); 326 if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) { 327 svcerr_systemerr(rqstp); 328 } 329 if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 330 printf("unable to free arguments"); 331 //exit(1); 332 } 333 svc_freereq(rqstp); 334 if (!nlm_prog_3_freeresult(transp, xdr_result, (caddr_t) &result)) 335 printf("unable to free results"); 336 337 return; 338 } 339 340 void 341 nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp) 342 { 343 union { 344 nlm4_testargs nlm4_test_4_arg; 345 nlm4_lockargs nlm4_lock_4_arg; 346 nlm4_cancargs nlm4_cancel_4_arg; 347 nlm4_unlockargs nlm4_unlock_4_arg; 348 nlm4_testargs nlm4_granted_4_arg; 349 nlm4_testargs nlm4_test_msg_4_arg; 350 nlm4_lockargs nlm4_lock_msg_4_arg; 351 nlm4_cancargs nlm4_cancel_msg_4_arg; 352 nlm4_unlockargs nlm4_unlock_msg_4_arg; 353 nlm4_testargs nlm4_granted_msg_4_arg; 354 nlm4_testres nlm4_test_res_4_arg; 355 nlm4_res nlm4_lock_res_4_arg; 356 nlm4_res nlm4_cancel_res_4_arg; 357 nlm4_res nlm4_unlock_res_4_arg; 358 nlm4_res nlm4_granted_res_4_arg; 359 nlm4_shareargs nlm4_share_4_arg; 360 nlm4_shareargs nlm4_unshare_4_arg; 361 nlm4_lockargs nlm4_nm_lock_4_arg; 362 nlm4_notify nlm4_free_all_4_arg; 363 } argument; 364 union { 365 nlm4_testres nlm4_test_4_res; 366 nlm4_res nlm4_lock_4_res; 367 nlm4_res nlm4_cancel_4_res; 368 nlm4_res nlm4_unlock_4_res; 369 nlm4_res nlm4_granted_4_res; 370 nlm4_shareres nlm4_share_4_res; 371 nlm4_shareres nlm4_unshare_4_res; 372 nlm4_res nlm4_nm_lock_4_res; 373 } result; 374 bool_t retval; 375 xdrproc_t xdr_argument, xdr_result; 376 bool_t (*local)(char *, void *, struct svc_req *); 377 378 switch (rqstp->rq_proc) { 379 case NULLPROC: 380 (void) svc_sendreply(rqstp, 381 (xdrproc_t) xdr_void, (char *)NULL); 382 svc_freereq(rqstp); 383 return; 384 385 case NLM4_TEST: 386 xdr_argument = (xdrproc_t) xdr_nlm4_testargs; 387 xdr_result = (xdrproc_t) xdr_nlm4_testres; 388 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_test_4_svc; 389 break; 390 391 case NLM4_LOCK: 392 xdr_argument = (xdrproc_t) xdr_nlm4_lockargs; 393 xdr_result = (xdrproc_t) xdr_nlm4_res; 394 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_lock_4_svc; 395 break; 396 397 case NLM4_CANCEL: 398 xdr_argument = (xdrproc_t) xdr_nlm4_cancargs; 399 xdr_result = (xdrproc_t) xdr_nlm4_res; 400 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_cancel_4_svc; 401 break; 402 403 case NLM4_UNLOCK: 404 xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs; 405 xdr_result = (xdrproc_t) xdr_nlm4_res; 406 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_unlock_4_svc; 407 break; 408 409 case NLM4_GRANTED: 410 xdr_argument = (xdrproc_t) xdr_nlm4_testargs; 411 xdr_result = (xdrproc_t) xdr_nlm4_res; 412 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_granted_4_svc; 413 break; 414 415 case NLM4_TEST_MSG: 416 xdr_argument = (xdrproc_t) xdr_nlm4_testargs; 417 xdr_result = (xdrproc_t) xdr_void; 418 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_test_msg_4_svc; 419 break; 420 421 case NLM4_LOCK_MSG: 422 xdr_argument = (xdrproc_t) xdr_nlm4_lockargs; 423 xdr_result = (xdrproc_t) xdr_void; 424 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_lock_msg_4_svc; 425 break; 426 427 case NLM4_CANCEL_MSG: 428 xdr_argument = (xdrproc_t) xdr_nlm4_cancargs; 429 xdr_result = (xdrproc_t) xdr_void; 430 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_cancel_msg_4_svc; 431 break; 432 433 case NLM4_UNLOCK_MSG: 434 xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs; 435 xdr_result = (xdrproc_t) xdr_void; 436 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_unlock_msg_4_svc; 437 break; 438 439 case NLM4_GRANTED_MSG: 440 xdr_argument = (xdrproc_t) xdr_nlm4_testargs; 441 xdr_result = (xdrproc_t) xdr_void; 442 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_granted_msg_4_svc; 443 break; 444 445 case NLM4_TEST_RES: 446 xdr_argument = (xdrproc_t) xdr_nlm4_testres; 447 xdr_result = (xdrproc_t) xdr_void; 448 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_test_res_4_svc; 449 break; 450 451 case NLM4_LOCK_RES: 452 xdr_argument = (xdrproc_t) xdr_nlm4_res; 453 xdr_result = (xdrproc_t) xdr_void; 454 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_lock_res_4_svc; 455 break; 456 457 case NLM4_CANCEL_RES: 458 xdr_argument = (xdrproc_t) xdr_nlm4_res; 459 xdr_result = (xdrproc_t) xdr_void; 460 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_cancel_res_4_svc; 461 break; 462 463 case NLM4_UNLOCK_RES: 464 xdr_argument = (xdrproc_t) xdr_nlm4_res; 465 xdr_result = (xdrproc_t) xdr_void; 466 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_unlock_res_4_svc; 467 break; 468 469 case NLM4_GRANTED_RES: 470 xdr_argument = (xdrproc_t) xdr_nlm4_res; 471 xdr_result = (xdrproc_t) xdr_void; 472 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_granted_res_4_svc; 473 break; 474 475 case NLM4_SHARE: 476 xdr_argument = (xdrproc_t) xdr_nlm4_shareargs; 477 xdr_result = (xdrproc_t) xdr_nlm4_shareres; 478 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_share_4_svc; 479 break; 480 481 case NLM4_UNSHARE: 482 xdr_argument = (xdrproc_t) xdr_nlm4_shareargs; 483 xdr_result = (xdrproc_t) xdr_nlm4_shareres; 484 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_unshare_4_svc; 485 break; 486 487 case NLM4_NM_LOCK: 488 xdr_argument = (xdrproc_t) xdr_nlm4_lockargs; 489 xdr_result = (xdrproc_t) xdr_nlm4_res; 490 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_nm_lock_4_svc; 491 break; 492 493 case NLM4_FREE_ALL: 494 xdr_argument = (xdrproc_t) xdr_nlm4_notify; 495 xdr_result = (xdrproc_t) xdr_void; 496 local = (bool_t (*) (char *, void *, struct svc_req *))nlm4_free_all_4_svc; 497 break; 498 499 default: 500 svcerr_noproc(rqstp); 501 svc_freereq(rqstp); 502 return; 503 } 504 (void) memset((char *)&argument, 0, sizeof (argument)); 505 if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 506 svcerr_decode(rqstp); 507 svc_freereq(rqstp); 508 return; 509 } 510 retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp); 511 if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) { 512 svcerr_systemerr(rqstp); 513 } 514 if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) { 515 printf("unable to free arguments"); 516 //exit(1); 517 } 518 svc_freereq(rqstp); 519 if (!nlm_prog_4_freeresult(transp, xdr_result, (caddr_t) &result)) 520 printf("unable to free results"); 521 522 return; 523 } 524