nlm_prot_server.c revision 177685
1177633Sdfr/*- 2177633Sdfr * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ 3177633Sdfr * Authors: Doug Rabson <dfr@rabson.org> 4177633Sdfr * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org> 5177633Sdfr * 6177633Sdfr * Redistribution and use in source and binary forms, with or without 7177633Sdfr * modification, are permitted provided that the following conditions 8177633Sdfr * are met: 9177633Sdfr * 1. Redistributions of source code must retain the above copyright 10177633Sdfr * notice, this list of conditions and the following disclaimer. 11177633Sdfr * 2. Redistributions in binary form must reproduce the above copyright 12177633Sdfr * notice, this list of conditions and the following disclaimer in the 13177633Sdfr * documentation and/or other materials provided with the distribution. 14177633Sdfr * 15177633Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16177633Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17177633Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18177633Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19177633Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20177633Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21177633Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22177633Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23177633Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24177633Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25177633Sdfr * SUCH DAMAGE. 26177633Sdfr */ 27177633Sdfr 28177633Sdfr#include <sys/cdefs.h> 29177633Sdfr#ifndef lint 30177633Sdfr/*static char sccsid[] = "from: @(#)nlm_prot.x 1.8 87/09/21 Copyr 1987 Sun Micro";*/ 31177633Sdfr/*static char sccsid[] = "from: * @(#)nlm_prot.x 2.1 88/08/01 4.0 RPCSRC";*/ 32177633Sdfr__RCSID("$NetBSD: nlm_prot.x,v 1.6 2000/06/07 14:30:15 bouyer Exp $"); 33177633Sdfr#endif /* not lint */ 34177633Sdfr__FBSDID("$FreeBSD: head/sys/nlm/nlm_prot_server.c 177685 2008-03-28 09:50:32Z dfr $"); 35177633Sdfr 36177633Sdfr#include <sys/param.h> 37177633Sdfr#include <sys/malloc.h> 38177633Sdfr#include <sys/systm.h> 39177633Sdfr 40177685Sdfr#include <nlm/nlm_prot.h> 41177685Sdfr#include <nlm/nlm.h> 42177633Sdfr 43177633Sdfr/**********************************************************************/ 44177633Sdfr 45177633Sdfr/* 46177633Sdfr * Convert between various versions of the protocol structures. 47177633Sdfr */ 48177633Sdfr 49177633Sdfrstatic void 50177633Sdfrnlm_convert_to_nlm4_lock(struct nlm4_lock *dst, struct nlm_lock *src) 51177633Sdfr{ 52177633Sdfr 53177633Sdfr dst->caller_name = src->caller_name; 54177633Sdfr dst->fh = src->fh; 55177633Sdfr dst->oh = src->oh; 56177633Sdfr dst->svid = src->svid; 57177633Sdfr dst->l_offset = src->l_offset; 58177633Sdfr dst->l_len = src->l_len; 59177633Sdfr} 60177633Sdfr 61177633Sdfrstatic void 62177633Sdfrnlm_convert_to_nlm4_share(struct nlm4_share *dst, struct nlm_share *src) 63177633Sdfr{ 64177633Sdfr 65177633Sdfr dst->caller_name = src->caller_name; 66177633Sdfr dst->fh = src->fh; 67177633Sdfr dst->oh = src->oh; 68177633Sdfr dst->mode = src->mode; 69177633Sdfr dst->access = src->access; 70177633Sdfr} 71177633Sdfr 72177633Sdfrstatic void 73177633Sdfrnlm_convert_to_nlm_holder(struct nlm_holder *dst, struct nlm4_holder *src) 74177633Sdfr{ 75177633Sdfr 76177633Sdfr dst->exclusive = src->exclusive; 77177633Sdfr dst->svid = src->svid; 78177633Sdfr dst->oh = src->oh; 79177633Sdfr dst->l_offset = src->l_offset; 80177633Sdfr dst->l_len = src->l_len; 81177633Sdfr} 82177633Sdfr 83177633Sdfrstatic void 84177633Sdfrnlm_convert_to_nlm4_holder(struct nlm4_holder *dst, struct nlm_holder *src) 85177633Sdfr{ 86177633Sdfr 87177633Sdfr dst->exclusive = src->exclusive; 88177633Sdfr dst->svid = src->svid; 89177633Sdfr dst->oh = src->oh; 90177633Sdfr dst->l_offset = src->l_offset; 91177633Sdfr dst->l_len = src->l_len; 92177633Sdfr} 93177633Sdfr 94177633Sdfrstatic enum nlm_stats 95177633Sdfrnlm_convert_to_nlm_stats(enum nlm4_stats src) 96177633Sdfr{ 97177633Sdfr if (src > nlm4_deadlck) 98177633Sdfr return nlm_denied; 99177633Sdfr return (enum nlm_stats) src; 100177633Sdfr} 101177633Sdfr 102177633Sdfrstatic void 103177633Sdfrnlm_convert_to_nlm_res(struct nlm_res *dst, struct nlm4_res *src) 104177633Sdfr{ 105177633Sdfr dst->cookie = src->cookie; 106177633Sdfr dst->stat.stat = nlm_convert_to_nlm_stats(src->stat.stat); 107177633Sdfr} 108177633Sdfr 109177633Sdfrstatic void 110177633Sdfrnlm_convert_to_nlm4_res(struct nlm4_res *dst, struct nlm_res *src) 111177633Sdfr{ 112177633Sdfr dst->cookie = src->cookie; 113177633Sdfr dst->stat.stat = (enum nlm4_stats) src->stat.stat; 114177633Sdfr} 115177633Sdfr 116177633Sdfr/**********************************************************************/ 117177633Sdfr 118177633Sdfr/* 119177633Sdfr * RPC server stubs. 120177633Sdfr */ 121177633Sdfr 122177633Sdfrbool_t 123177633Sdfrnlm_sm_notify_0_svc(struct nlm_sm_status *argp, void *result, struct svc_req *rqstp) 124177633Sdfr{ 125177633Sdfr nlm_sm_notify(argp); 126177633Sdfr 127177633Sdfr return (TRUE); 128177633Sdfr} 129177633Sdfr 130177633Sdfrbool_t 131177633Sdfrnlm_test_1_svc(struct nlm_testargs *argp, nlm_testres *result, struct svc_req *rqstp) 132177633Sdfr{ 133177633Sdfr bool_t retval; 134177633Sdfr nlm4_testargs args4; 135177633Sdfr nlm4_testres res4; 136177633Sdfr 137177633Sdfr args4.cookie = argp->cookie; 138177633Sdfr args4.exclusive = argp->exclusive; 139177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 140177633Sdfr 141177633Sdfr retval = nlm4_test_4_svc(&args4, &res4, rqstp); 142177633Sdfr if (retval) { 143177633Sdfr result->cookie = res4.cookie; 144177633Sdfr result->stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat); 145177633Sdfr if (result->stat.stat == nlm_denied) 146177633Sdfr nlm_convert_to_nlm_holder( 147177633Sdfr &result->stat.nlm_testrply_u.holder, 148177633Sdfr &res4.stat.nlm4_testrply_u.holder); 149177633Sdfr } 150177633Sdfr 151177633Sdfr return (retval); 152177633Sdfr} 153177633Sdfr 154177633Sdfrbool_t 155177633Sdfrnlm_lock_1_svc(struct nlm_lockargs *argp, nlm_res *result, struct svc_req *rqstp) 156177633Sdfr{ 157177633Sdfr bool_t retval; 158177633Sdfr nlm4_lockargs args4; 159177633Sdfr nlm4_res res4; 160177633Sdfr 161177633Sdfr args4.cookie = argp->cookie; 162177633Sdfr args4.block = argp->block; 163177633Sdfr args4.exclusive = argp->exclusive; 164177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 165177633Sdfr args4.reclaim = argp->reclaim; 166177633Sdfr args4.state = argp->state; 167177633Sdfr 168177633Sdfr retval = nlm4_lock_4_svc(&args4, &res4, rqstp); 169177633Sdfr if (retval) 170177633Sdfr nlm_convert_to_nlm_res(result, &res4); 171177633Sdfr 172177633Sdfr return (retval); 173177633Sdfr} 174177633Sdfr 175177633Sdfrbool_t 176177633Sdfrnlm_cancel_1_svc(struct nlm_cancargs *argp, nlm_res *result, struct svc_req *rqstp) 177177633Sdfr{ 178177633Sdfr bool_t retval; 179177633Sdfr nlm4_cancargs args4; 180177633Sdfr nlm4_res res4; 181177633Sdfr 182177633Sdfr args4.cookie = argp->cookie; 183177633Sdfr args4.block = argp->block; 184177633Sdfr args4.exclusive = argp->exclusive; 185177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 186177633Sdfr 187177633Sdfr retval = nlm4_cancel_4_svc(&args4, &res4, rqstp); 188177633Sdfr if (retval) 189177633Sdfr nlm_convert_to_nlm_res(result, &res4); 190177633Sdfr 191177633Sdfr return (retval); 192177633Sdfr} 193177633Sdfr 194177633Sdfrbool_t 195177633Sdfrnlm_unlock_1_svc(struct nlm_unlockargs *argp, nlm_res *result, struct svc_req *rqstp) 196177633Sdfr{ 197177633Sdfr bool_t retval; 198177633Sdfr nlm4_unlockargs args4; 199177633Sdfr nlm4_res res4; 200177633Sdfr 201177633Sdfr args4.cookie = argp->cookie; 202177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 203177633Sdfr 204177633Sdfr retval = nlm4_unlock_4_svc(&args4, &res4, rqstp); 205177633Sdfr if (retval) 206177633Sdfr nlm_convert_to_nlm_res(result, &res4); 207177633Sdfr 208177633Sdfr return (retval); 209177633Sdfr} 210177633Sdfr 211177633Sdfrbool_t 212177633Sdfrnlm_granted_1_svc(struct nlm_testargs *argp, nlm_res *result, struct svc_req *rqstp) 213177633Sdfr{ 214177633Sdfr bool_t retval; 215177633Sdfr nlm4_testargs args4; 216177633Sdfr nlm4_res res4; 217177633Sdfr 218177633Sdfr args4.cookie = argp->cookie; 219177633Sdfr args4.exclusive = argp->exclusive; 220177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 221177633Sdfr 222177633Sdfr retval = nlm4_granted_4_svc(&args4, &res4, rqstp); 223177633Sdfr if (retval) 224177633Sdfr nlm_convert_to_nlm_res(result, &res4); 225177633Sdfr 226177633Sdfr return (retval); 227177633Sdfr} 228177633Sdfr 229177633Sdfrbool_t 230177633Sdfrnlm_test_msg_1_svc(struct nlm_testargs *argp, void *result, struct svc_req *rqstp) 231177633Sdfr{ 232177633Sdfr nlm4_testargs args4; 233177633Sdfr nlm4_testres res4; 234177633Sdfr nlm_testres res; 235177633Sdfr struct nlm_host *host; 236177633Sdfr CLIENT *rpc; 237177633Sdfr char dummy; 238177633Sdfr 239177633Sdfr args4.cookie = argp->cookie; 240177633Sdfr args4.exclusive = argp->exclusive; 241177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 242177633Sdfr 243177633Sdfr host = nlm_do_test(&args4, &res4, rqstp); 244177633Sdfr 245177633Sdfr res.cookie = res4.cookie; 246177633Sdfr res.stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat); 247177633Sdfr if (res.stat.stat == nlm_denied) 248177633Sdfr nlm_convert_to_nlm_holder( 249177633Sdfr &res.stat.nlm_testrply_u.holder, 250177633Sdfr &res4.stat.nlm4_testrply_u.holder); 251177633Sdfr 252177633Sdfr rpc = nlm_host_get_rpc(host); 253177633Sdfr if (rpc) 254177633Sdfr nlm_test_res_1(&res, &dummy, rpc); 255177633Sdfr xdr_free((xdrproc_t) xdr_nlm_testres, &res); 256177633Sdfr 257177633Sdfr return (FALSE); 258177633Sdfr} 259177633Sdfr 260177633Sdfrbool_t 261177633Sdfrnlm_lock_msg_1_svc(struct nlm_lockargs *argp, void *result, struct svc_req *rqstp) 262177633Sdfr{ 263177633Sdfr nlm4_lockargs args4; 264177633Sdfr nlm4_res res4; 265177633Sdfr nlm_res res; 266177633Sdfr struct nlm_host *host; 267177633Sdfr CLIENT *rpc; 268177633Sdfr char dummy; 269177633Sdfr 270177633Sdfr args4.cookie = argp->cookie; 271177633Sdfr args4.block = argp->block; 272177633Sdfr args4.exclusive = argp->exclusive; 273177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 274177633Sdfr args4.reclaim = argp->reclaim; 275177633Sdfr args4.state = argp->state; 276177633Sdfr 277177633Sdfr host = nlm_do_lock(&args4, &res4, rqstp, TRUE); 278177633Sdfr 279177633Sdfr nlm_convert_to_nlm_res(&res, &res4); 280177633Sdfr 281177633Sdfr rpc = nlm_host_get_rpc(host); 282177633Sdfr if (rpc) 283177633Sdfr nlm_lock_res_1(&res, &dummy, rpc); 284177633Sdfr xdr_free((xdrproc_t) xdr_nlm_res, &res); 285177633Sdfr 286177633Sdfr return (FALSE); 287177633Sdfr} 288177633Sdfr 289177633Sdfrbool_t 290177633Sdfrnlm_cancel_msg_1_svc(struct nlm_cancargs *argp, void *result, struct svc_req *rqstp) 291177633Sdfr{ 292177633Sdfr nlm4_cancargs args4; 293177633Sdfr nlm4_res res4; 294177633Sdfr nlm_res res; 295177633Sdfr struct nlm_host *host; 296177633Sdfr CLIENT *rpc; 297177633Sdfr char dummy; 298177633Sdfr 299177633Sdfr args4.cookie = argp->cookie; 300177633Sdfr args4.block = argp->block; 301177633Sdfr args4.exclusive = argp->exclusive; 302177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 303177633Sdfr 304177633Sdfr host = nlm_do_cancel(&args4, &res4, rqstp); 305177633Sdfr 306177633Sdfr nlm_convert_to_nlm_res(&res, &res4); 307177633Sdfr 308177633Sdfr rpc = nlm_host_get_rpc(host); 309177633Sdfr if (rpc) 310177633Sdfr nlm_cancel_res_1(&res, &dummy, rpc); 311177633Sdfr xdr_free((xdrproc_t) xdr_nlm_res, &res); 312177633Sdfr 313177633Sdfr return (FALSE); 314177633Sdfr} 315177633Sdfr 316177633Sdfrbool_t 317177633Sdfrnlm_unlock_msg_1_svc(struct nlm_unlockargs *argp, void *result, struct svc_req *rqstp) 318177633Sdfr{ 319177633Sdfr nlm4_unlockargs args4; 320177633Sdfr nlm4_res res4; 321177633Sdfr nlm_res res; 322177633Sdfr struct nlm_host *host; 323177633Sdfr CLIENT *rpc; 324177633Sdfr char dummy; 325177633Sdfr 326177633Sdfr args4.cookie = argp->cookie; 327177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 328177633Sdfr 329177633Sdfr host = nlm_do_unlock(&args4, &res4, rqstp); 330177633Sdfr 331177633Sdfr nlm_convert_to_nlm_res(&res, &res4); 332177633Sdfr 333177633Sdfr rpc = nlm_host_get_rpc(host); 334177633Sdfr if (rpc) 335177633Sdfr nlm_unlock_res_1(&res, &dummy, rpc); 336177633Sdfr xdr_free((xdrproc_t) xdr_nlm_res, &res); 337177633Sdfr 338177633Sdfr return (FALSE); 339177633Sdfr} 340177633Sdfr 341177633Sdfrbool_t 342177633Sdfrnlm_granted_msg_1_svc(struct nlm_testargs *argp, void *result, struct svc_req *rqstp) 343177633Sdfr{ 344177633Sdfr nlm4_testargs args4; 345177633Sdfr nlm4_res res4; 346177633Sdfr nlm_res res; 347177633Sdfr struct nlm_host *host; 348177633Sdfr CLIENT *rpc; 349177633Sdfr char dummy; 350177633Sdfr 351177633Sdfr args4.cookie = argp->cookie; 352177633Sdfr args4.exclusive = argp->exclusive; 353177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 354177633Sdfr 355177633Sdfr /* 356177633Sdfr * We make a synchronous call to userland and send the reply 357177633Sdfr * back async. 358177633Sdfr */ 359177633Sdfr nlm4_granted_4_svc(&args4, &res4, rqstp); 360177633Sdfr 361177633Sdfr nlm_convert_to_nlm_res(&res, &res4); 362177633Sdfr 363177633Sdfr host = nlm_find_host_by_addr( 364177633Sdfr (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, 365177633Sdfr rqstp->rq_vers); 366177633Sdfr rpc = nlm_host_get_rpc(host); 367177633Sdfr if (rpc) 368177633Sdfr nlm_granted_res_1(&res, &dummy, rpc); 369177633Sdfr xdr_free((xdrproc_t) xdr_nlm_res, &res); 370177633Sdfr 371177633Sdfr return (FALSE); 372177633Sdfr} 373177633Sdfr 374177633Sdfrbool_t 375177633Sdfrnlm_test_res_1_svc(nlm_testres *argp, void *result, struct svc_req *rqstp) 376177633Sdfr{ 377177633Sdfr nlm4_testres args4; 378177633Sdfr 379177633Sdfr args4.cookie = argp->cookie; 380177633Sdfr if (argp->stat.stat == nlm_denied) 381177633Sdfr nlm_convert_to_nlm4_holder( 382177633Sdfr &args4.stat.nlm4_testrply_u.holder, 383177633Sdfr &argp->stat.nlm_testrply_u.holder); 384177633Sdfr 385177633Sdfr return (nlm4_test_res_4_svc(&args4, result, rqstp)); 386177633Sdfr} 387177633Sdfr 388177633Sdfrbool_t 389177633Sdfrnlm_lock_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp) 390177633Sdfr{ 391177633Sdfr nlm4_res arg4; 392177633Sdfr 393177633Sdfr nlm_convert_to_nlm4_res(&arg4, argp); 394177633Sdfr return (nlm4_lock_res_4_svc(&arg4, result, rqstp)); 395177633Sdfr} 396177633Sdfr 397177633Sdfrbool_t 398177633Sdfrnlm_cancel_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp) 399177633Sdfr{ 400177633Sdfr nlm4_res arg4; 401177633Sdfr 402177633Sdfr nlm_convert_to_nlm4_res(&arg4, argp); 403177633Sdfr return (nlm4_cancel_res_4_svc(&arg4, result, rqstp)); 404177633Sdfr} 405177633Sdfr 406177633Sdfrbool_t 407177633Sdfrnlm_unlock_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp) 408177633Sdfr{ 409177633Sdfr nlm4_res arg4; 410177633Sdfr 411177633Sdfr nlm_convert_to_nlm4_res(&arg4, argp); 412177633Sdfr return (nlm4_unlock_res_4_svc(&arg4, result, rqstp)); 413177633Sdfr} 414177633Sdfr 415177633Sdfrbool_t 416177633Sdfrnlm_granted_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp) 417177633Sdfr{ 418177633Sdfr nlm4_res arg4; 419177633Sdfr 420177633Sdfr nlm_convert_to_nlm4_res(&arg4, argp); 421177633Sdfr return (nlm4_granted_res_4_svc(&arg4, result, rqstp)); 422177633Sdfr} 423177633Sdfr 424177633Sdfrint 425177633Sdfrnlm_prog_1_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 426177633Sdfr{ 427177633Sdfr 428177633Sdfr (void) xdr_free(xdr_result, result); 429177633Sdfr return (TRUE); 430177633Sdfr} 431177633Sdfr 432177633Sdfrbool_t 433177633Sdfrnlm_share_3_svc(nlm_shareargs *argp, nlm_shareres *result, struct svc_req *rqstp) 434177633Sdfr{ 435177633Sdfr bool_t retval; 436177633Sdfr nlm4_shareargs args4; 437177633Sdfr nlm4_shareres res4; 438177633Sdfr 439177633Sdfr args4.cookie = argp->cookie; 440177633Sdfr nlm_convert_to_nlm4_share(&args4.share, &argp->share); 441177633Sdfr args4.reclaim = argp->reclaim; 442177633Sdfr 443177633Sdfr retval = nlm4_share_4_svc(&args4, &res4, rqstp); 444177633Sdfr if (retval) { 445177633Sdfr result->cookie = res4.cookie; 446177633Sdfr result->stat = nlm_convert_to_nlm_stats(res4.stat); 447177633Sdfr result->sequence = res4.sequence; 448177633Sdfr } 449177633Sdfr 450177633Sdfr return (retval); 451177633Sdfr} 452177633Sdfr 453177633Sdfrbool_t 454177633Sdfrnlm_unshare_3_svc(nlm_shareargs *argp, nlm_shareres *result, struct svc_req *rqstp) 455177633Sdfr{ 456177633Sdfr bool_t retval; 457177633Sdfr nlm4_shareargs args4; 458177633Sdfr nlm4_shareres res4; 459177633Sdfr 460177633Sdfr args4.cookie = argp->cookie; 461177633Sdfr nlm_convert_to_nlm4_share(&args4.share, &argp->share); 462177633Sdfr args4.reclaim = argp->reclaim; 463177633Sdfr 464177633Sdfr retval = nlm4_unshare_4_svc(&args4, &res4, rqstp); 465177633Sdfr if (retval) { 466177633Sdfr result->cookie = res4.cookie; 467177633Sdfr result->stat = nlm_convert_to_nlm_stats(res4.stat); 468177633Sdfr result->sequence = res4.sequence; 469177633Sdfr } 470177633Sdfr 471177633Sdfr return (retval); 472177633Sdfr} 473177633Sdfr 474177633Sdfrbool_t 475177633Sdfrnlm_nm_lock_3_svc(nlm_lockargs *argp, nlm_res *result, struct svc_req *rqstp) 476177633Sdfr{ 477177633Sdfr bool_t retval; 478177633Sdfr nlm4_lockargs args4; 479177633Sdfr nlm4_res res4; 480177633Sdfr 481177633Sdfr args4.cookie = argp->cookie; 482177633Sdfr args4.block = argp->block; 483177633Sdfr args4.exclusive = argp->exclusive; 484177633Sdfr nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); 485177633Sdfr args4.reclaim = argp->reclaim; 486177633Sdfr args4.state = argp->state; 487177633Sdfr 488177633Sdfr retval = nlm4_nm_lock_4_svc(&args4, &res4, rqstp); 489177633Sdfr if (retval) 490177633Sdfr nlm_convert_to_nlm_res(result, &res4); 491177633Sdfr 492177633Sdfr return (retval); 493177633Sdfr} 494177633Sdfr 495177633Sdfrbool_t 496177633Sdfrnlm_free_all_3_svc(nlm_notify *argp, void *result, struct svc_req *rqstp) 497177633Sdfr{ 498177633Sdfr struct nlm4_notify args4; 499177633Sdfr 500177633Sdfr args4.name = argp->name; 501177633Sdfr args4.state = argp->state; 502177633Sdfr 503177633Sdfr return (nlm4_free_all_4_svc(&args4, result, rqstp)); 504177633Sdfr} 505177633Sdfr 506177633Sdfrint 507177633Sdfrnlm_prog_3_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 508177633Sdfr{ 509177633Sdfr 510177633Sdfr (void) xdr_free(xdr_result, result); 511177633Sdfr return (TRUE); 512177633Sdfr} 513177633Sdfr 514177633Sdfrbool_t 515177633Sdfrnlm4_test_4_svc(nlm4_testargs *argp, nlm4_testres *result, struct svc_req *rqstp) 516177633Sdfr{ 517177633Sdfr 518177633Sdfr nlm_do_test(argp, result, rqstp); 519177633Sdfr return (TRUE); 520177633Sdfr} 521177633Sdfr 522177633Sdfrbool_t 523177633Sdfrnlm4_lock_4_svc(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp) 524177633Sdfr{ 525177633Sdfr 526177633Sdfr nlm_do_lock(argp, result, rqstp, TRUE); 527177633Sdfr return (TRUE); 528177633Sdfr} 529177633Sdfr 530177633Sdfrbool_t 531177633Sdfrnlm4_cancel_4_svc(nlm4_cancargs *argp, nlm4_res *result, struct svc_req *rqstp) 532177633Sdfr{ 533177633Sdfr 534177633Sdfr nlm_do_cancel(argp, result, rqstp); 535177633Sdfr return (TRUE); 536177633Sdfr} 537177633Sdfr 538177633Sdfrbool_t 539177633Sdfrnlm4_unlock_4_svc(nlm4_unlockargs *argp, nlm4_res *result, struct svc_req *rqstp) 540177633Sdfr{ 541177633Sdfr 542177633Sdfr nlm_do_unlock(argp, result, rqstp); 543177633Sdfr return (TRUE); 544177633Sdfr} 545177633Sdfr 546177633Sdfrbool_t 547177633Sdfrnlm4_granted_4_svc(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp) 548177633Sdfr{ 549177633Sdfr CLIENT* lockd; 550177633Sdfr struct timeval tv; 551177633Sdfr 552177633Sdfr memset(result, 0, sizeof(*result)); 553177633Sdfr nlm_copy_netobj(&result->cookie, &argp->cookie, M_RPC); 554177633Sdfr 555177633Sdfr /* 556177633Sdfr * Set a non-zero timeout to give the userland a chance to reply. 557177633Sdfr */ 558177633Sdfr lockd = nlm_user_lockd(); 559177633Sdfr if (!lockd) { 560177633Sdfr result->stat.stat = nlm4_failed; 561177633Sdfr return (TRUE); 562177633Sdfr } 563177633Sdfr tv.tv_sec = 20; 564177633Sdfr tv.tv_usec = 0; 565177633Sdfr CLNT_CONTROL(lockd, CLSET_TIMEOUT, &tv); 566177633Sdfr nlm4_granted_4(argp, result, lockd); 567177633Sdfr tv.tv_sec = 0; 568177633Sdfr tv.tv_usec = 0; 569177633Sdfr CLNT_CONTROL(lockd, CLSET_TIMEOUT, &tv); 570177633Sdfr 571177633Sdfr return (TRUE); 572177633Sdfr} 573177633Sdfr 574177633Sdfrbool_t 575177633Sdfrnlm4_test_msg_4_svc(nlm4_testargs *argp, void *result, struct svc_req *rqstp) 576177633Sdfr{ 577177633Sdfr nlm4_testres res4; 578177633Sdfr struct nlm_host *host; 579177633Sdfr CLIENT *rpc; 580177633Sdfr char dummy; 581177633Sdfr 582177633Sdfr host = nlm_do_test(argp, &res4, rqstp); 583177633Sdfr rpc = nlm_host_get_rpc(host); 584177633Sdfr if (rpc) 585177633Sdfr nlm4_test_res_4(&res4, &dummy, rpc); 586177633Sdfr xdr_free((xdrproc_t) xdr_nlm4_testres, &res4); 587177633Sdfr 588177633Sdfr return (FALSE); 589177633Sdfr} 590177633Sdfr 591177633Sdfrbool_t 592177633Sdfrnlm4_lock_msg_4_svc(nlm4_lockargs *argp, void *result, struct svc_req *rqstp) 593177633Sdfr{ 594177633Sdfr nlm4_res res4; 595177633Sdfr struct nlm_host *host; 596177633Sdfr CLIENT *rpc; 597177633Sdfr char dummy; 598177633Sdfr 599177633Sdfr host = nlm_do_lock(argp, &res4, rqstp, TRUE); 600177633Sdfr rpc = nlm_host_get_rpc(host); 601177633Sdfr if (rpc) 602177633Sdfr nlm4_lock_res_4(&res4, &dummy, rpc); 603177633Sdfr xdr_free((xdrproc_t) xdr_nlm4_res, &res4); 604177633Sdfr 605177633Sdfr return (FALSE); 606177633Sdfr} 607177633Sdfr 608177633Sdfrbool_t 609177633Sdfrnlm4_cancel_msg_4_svc(nlm4_cancargs *argp, void *result, struct svc_req *rqstp) 610177633Sdfr{ 611177633Sdfr nlm4_res res4; 612177633Sdfr struct nlm_host *host; 613177633Sdfr CLIENT *rpc; 614177633Sdfr char dummy; 615177633Sdfr 616177633Sdfr host = nlm_do_cancel(argp, &res4, rqstp); 617177633Sdfr rpc = nlm_host_get_rpc(host); 618177633Sdfr if (rpc) 619177633Sdfr nlm4_cancel_res_4(&res4, &dummy, rpc); 620177633Sdfr xdr_free((xdrproc_t) xdr_nlm4_res, &res4); 621177633Sdfr 622177633Sdfr return (FALSE); 623177633Sdfr} 624177633Sdfr 625177633Sdfrbool_t 626177633Sdfrnlm4_unlock_msg_4_svc(nlm4_unlockargs *argp, void *result, struct svc_req *rqstp) 627177633Sdfr{ 628177633Sdfr nlm4_res res4; 629177633Sdfr struct nlm_host *host; 630177633Sdfr CLIENT *rpc; 631177633Sdfr char dummy; 632177633Sdfr 633177633Sdfr host = nlm_do_unlock(argp, &res4, rqstp); 634177633Sdfr rpc = nlm_host_get_rpc(host); 635177633Sdfr if (rpc) 636177633Sdfr nlm4_unlock_res_4(&res4, &dummy, rpc); 637177633Sdfr xdr_free((xdrproc_t) xdr_nlm4_res, &res4); 638177633Sdfr 639177633Sdfr return (FALSE); 640177633Sdfr} 641177633Sdfr 642177633Sdfrbool_t 643177633Sdfrnlm4_granted_msg_4_svc(nlm4_testargs *argp, void *result, struct svc_req *rqstp) 644177633Sdfr{ 645177633Sdfr struct nlm_host *host; 646177633Sdfr CLIENT *rpc; 647177633Sdfr nlm4_res res4; 648177633Sdfr char dummy; 649177633Sdfr 650177633Sdfr /* 651177633Sdfr * We make a synchronous call to userland and send the reply 652177633Sdfr * back async. 653177633Sdfr */ 654177633Sdfr nlm4_granted_4_svc(argp, &res4, rqstp); 655177633Sdfr 656177633Sdfr host = nlm_find_host_by_addr( 657177633Sdfr (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, 658177633Sdfr rqstp->rq_vers); 659177633Sdfr rpc = nlm_host_get_rpc(host); 660177633Sdfr if (rpc) 661177633Sdfr nlm4_granted_res_4(&res4, &dummy, rpc); 662177633Sdfr xdr_free((xdrproc_t) xdr_nlm4_res, &res4); 663177633Sdfr 664177633Sdfr return (FALSE); 665177633Sdfr} 666177633Sdfr 667177633Sdfrbool_t 668177633Sdfrnlm4_test_res_4_svc(nlm4_testres *argp, void *result, struct svc_req *rqstp) 669177633Sdfr{ 670177633Sdfr CLIENT* lockd; 671177633Sdfr 672177633Sdfr lockd = nlm_user_lockd(); 673177633Sdfr if (lockd) 674177633Sdfr nlm4_test_res_4(argp, result, lockd); 675177633Sdfr 676177633Sdfr return (FALSE); 677177633Sdfr} 678177633Sdfr 679177633Sdfrbool_t 680177633Sdfrnlm4_lock_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp) 681177633Sdfr{ 682177633Sdfr CLIENT* lockd; 683177633Sdfr 684177633Sdfr lockd = nlm_user_lockd(); 685177633Sdfr if (lockd) 686177633Sdfr nlm4_lock_res_4(argp, result, lockd); 687177633Sdfr 688177633Sdfr return (FALSE); 689177633Sdfr} 690177633Sdfr 691177633Sdfrbool_t 692177633Sdfrnlm4_cancel_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp) 693177633Sdfr{ 694177633Sdfr CLIENT* lockd; 695177633Sdfr 696177633Sdfr lockd = nlm_user_lockd(); 697177633Sdfr if (lockd) 698177633Sdfr nlm4_cancel_res_4(argp, result, lockd); 699177633Sdfr 700177633Sdfr return (FALSE); 701177633Sdfr} 702177633Sdfr 703177633Sdfrbool_t 704177633Sdfrnlm4_unlock_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp) 705177633Sdfr{ 706177633Sdfr CLIENT* lockd; 707177633Sdfr 708177633Sdfr lockd = nlm_user_lockd(); 709177633Sdfr if (lockd) 710177633Sdfr nlm4_unlock_res_4(argp, result, lockd); 711177633Sdfr 712177633Sdfr return (FALSE); 713177633Sdfr} 714177633Sdfr 715177633Sdfrbool_t 716177633Sdfrnlm4_granted_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp) 717177633Sdfr{ 718177633Sdfr 719177633Sdfr return (FALSE); 720177633Sdfr} 721177633Sdfr 722177633Sdfrbool_t 723177633Sdfrnlm4_share_4_svc(nlm4_shareargs *argp, nlm4_shareres *result, struct svc_req *rqstp) 724177633Sdfr{ 725177633Sdfr 726177633Sdfr memset(result, 0, sizeof(*result)); 727177633Sdfr result->stat = nlm4_denied; 728177633Sdfr return (TRUE); 729177633Sdfr} 730177633Sdfr 731177633Sdfrbool_t 732177633Sdfrnlm4_unshare_4_svc(nlm4_shareargs *argp, nlm4_shareres *result, struct svc_req *rqstp) 733177633Sdfr{ 734177633Sdfr 735177633Sdfr memset(result, 0, sizeof(*result)); 736177633Sdfr result->stat = nlm4_denied; 737177633Sdfr return (TRUE); 738177633Sdfr} 739177633Sdfr 740177633Sdfrbool_t 741177633Sdfrnlm4_nm_lock_4_svc(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp) 742177633Sdfr{ 743177633Sdfr 744177633Sdfr nlm_do_lock(argp, result, rqstp, FALSE); 745177633Sdfr return (TRUE); 746177633Sdfr} 747177633Sdfr 748177633Sdfrbool_t 749177633Sdfrnlm4_free_all_4_svc(nlm4_notify *argp, void *result, struct svc_req *rqstp) 750177633Sdfr{ 751177633Sdfr 752177633Sdfr nlm_do_free_all(argp); 753177633Sdfr return (TRUE); 754177633Sdfr} 755177633Sdfr 756177633Sdfrint 757177633Sdfrnlm_prog_4_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 758177633Sdfr{ 759177633Sdfr 760177633Sdfr (void) xdr_free(xdr_result, result); 761177633Sdfr return (TRUE); 762177633Sdfr} 763