lockd.c revision 14123
114123Speter 214123Speter/* 314123Speter * Copyright (c) 1995 414123Speter * A.R. Gordon (andrew.gordon@net-tel.co.uk). All rights reserved. 514123Speter * 614123Speter * Redistribution and use in source and binary forms, with or without 714123Speter * modification, are permitted provided that the following conditions 814123Speter * are met: 914123Speter * 1. Redistributions of source code must retain the above copyright 1014123Speter * notice, this list of conditions and the following disclaimer. 1114123Speter * 2. Redistributions in binary form must reproduce the above copyright 1214123Speter * notice, this list of conditions and the following disclaimer in the 1314123Speter * documentation and/or other materials provided with the distribution. 1414123Speter * 3. All advertising materials mentioning features or use of this software 1514123Speter * must display the following acknowledgement: 1614123Speter * This product includes software developed for the FreeBSD project 1714123Speter * 4. Neither the name of the author nor the names of any co-contributors 1814123Speter * may be used to endorse or promote products derived from this software 1914123Speter * without specific prior written permission. 2014123Speter * 2114123Speter * THIS SOFTWARE IS PROVIDED BY ANDREW GORDON AND CONTRIBUTORS ``AS IS'' AND 2214123Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2314123Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2414123Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2514123Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2614123Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2714123Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2814123Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2914123Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3014123Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3114123Speter * SUCH DAMAGE. 3214123Speter * 3314123Speter */ 3414123Speter 3514123Speter 3614123Speter/* main() function for NFS lock daemon. Most of the code in this */ 3714123Speter/* file was generated by running rpcgen /usr/include/rpcsvc/nlm_prot.x */ 3814123Speter/* The actual program logic is in the file procs.c */ 3914123Speter 4014123Speter#include "lockd.h" 4114123Speter 4214123Speter 4314123Speterint debug_level = 0; /* Zero means no debugging syslog() calls */ 4414123Speter 4514123Speter 4614123Speterstatic void nlm_prog_1(); 4714123Speterstatic void nlm_prog_3(); 4814123Speter 4914123Spetermain(int argc, char **argv) 5014123Speter{ 5114123Speter SVCXPRT *transp; 5214123Speter 5314123Speter if (argc > 1) 5414123Speter { 5514123Speter if (strncmp(argv[1], "-d", 2)) 5614123Speter { 5714123Speter fprintf(stderr, "Usage: rpc.lockd [-d [<debuglevel>]]\n"); 5814123Speter exit(1); 5914123Speter } 6014123Speter if (argc > 2) debug_level = atoi(argv[2]); 6114123Speter else debug_level = atoi(argv[1] + 2); 6214123Speter /* Ensure at least some debug if -d with no specified level */ 6314123Speter if (!debug_level) debug_level = 1; 6414123Speter } 6514123Speter 6614123Speter (void)pmap_unset(NLM_PROG, NLM_VERS); 6714123Speter (void)pmap_unset(NLM_PROG, NLM_VERSX); 6814123Speter 6914123Speter transp = svcudp_create(RPC_ANYSOCK); 7014123Speter if (transp == NULL) 7114123Speter { 7214123Speter (void)fprintf(stderr, "cannot create udp service.\n"); 7314123Speter exit(1); 7414123Speter } 7514123Speter if (!svc_register(transp, NLM_PROG, NLM_VERS, nlm_prog_1, IPPROTO_UDP)) 7614123Speter { 7714123Speter (void)fprintf(stderr, "unable to register (NLM_PROG, NLM_VERS, udp).\n"); 7814123Speter exit(1); 7914123Speter } 8014123Speter if (!svc_register(transp, NLM_PROG, NLM_VERSX, nlm_prog_3, IPPROTO_UDP)) 8114123Speter { 8214123Speter (void)fprintf(stderr, "unable to register (NLM_PROG, NLM_VERSX, udp).\n"); 8314123Speter exit(1); 8414123Speter } 8514123Speter 8614123Speter transp = svctcp_create(RPC_ANYSOCK, 0, 0); 8714123Speter if (transp == NULL) 8814123Speter { 8914123Speter (void)fprintf(stderr, "cannot create tcp service.\n"); 9014123Speter exit(1); 9114123Speter } 9214123Speter if (!svc_register(transp, NLM_PROG, NLM_VERS, nlm_prog_1, IPPROTO_TCP)) 9314123Speter { 9414123Speter (void)fprintf(stderr, "unable to register (NLM_PROG, NLM_VERS, tcp).\n"); 9514123Speter exit(1); 9614123Speter } 9714123Speter if (!svc_register(transp, NLM_PROG, NLM_VERSX, nlm_prog_3, IPPROTO_TCP)) 9814123Speter { 9914123Speter (void)fprintf(stderr, "unable to register (NLM_PROG, NLM_VERSX, tcp).\n"); 10014123Speter exit(1); 10114123Speter } 10214123Speter 10314123Speter /* Note that it is NOT sensible to run this program from inetd - the */ 10414123Speter /* protocol assumes that it will run immediately at boot time. */ 10514123Speter daemon(0, 0); 10614123Speter 10714123Speter openlog("rpc.lockd", 0, LOG_DAEMON); 10814123Speter if (debug_level) syslog(LOG_INFO, "Starting, debug level %d", debug_level); 10914123Speter else syslog(LOG_INFO, "Starting"); 11014123Speter 11114123Speter svc_run(); /* Should never return */ 11214123Speter exit(1); 11314123Speter} 11414123Speter 11514123Speterstatic void 11614123Speternlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp) 11714123Speter{ 11814123Speter union 11914123Speter { 12014123Speter struct nlm_testargs nlm_test_1_arg; 12114123Speter struct nlm_lockargs nlm_lock_1_arg; 12214123Speter struct nlm_cancargs nlm_cancel_1_arg; 12314123Speter struct nlm_unlockargs nlm_unlock_1_arg; 12414123Speter struct nlm_testargs nlm_granted_1_arg; 12514123Speter struct nlm_testargs nlm_test_msg_1_arg; 12614123Speter struct nlm_lockargs nlm_lock_msg_1_arg; 12714123Speter struct nlm_cancargs nlm_cancel_msg_1_arg; 12814123Speter struct nlm_unlockargs nlm_unlock_msg_1_arg; 12914123Speter struct nlm_testargs nlm_granted_msg_1_arg; 13014123Speter nlm_testres nlm_test_res_1_arg; 13114123Speter nlm_res nlm_lock_res_1_arg; 13214123Speter nlm_res nlm_cancel_res_1_arg; 13314123Speter nlm_res nlm_unlock_res_1_arg; 13414123Speter nlm_res nlm_granted_res_1_arg; 13514123Speter } argument; 13614123Speter char *result; 13714123Speter bool_t (*xdr_argument)(), (*xdr_result)(); 13814123Speter char *(*local)(); 13914123Speter 14014123Speter switch (rqstp->rq_proc) 14114123Speter { 14214123Speter case NULLPROC: 14314123Speter (void)svc_sendreply(transp, xdr_void, (char *)NULL); 14414123Speter return; 14514123Speter 14614123Speter case NLM_TEST: 14714123Speter xdr_argument = xdr_nlm_testargs; 14814123Speter xdr_result = xdr_nlm_testres; 14914123Speter local = (char *(*)()) nlm_test_1; 15014123Speter break; 15114123Speter 15214123Speter case NLM_LOCK: 15314123Speter xdr_argument = xdr_nlm_lockargs; 15414123Speter xdr_result = xdr_nlm_res; 15514123Speter local = (char *(*)()) nlm_lock_1; 15614123Speter break; 15714123Speter 15814123Speter case NLM_CANCEL: 15914123Speter xdr_argument = xdr_nlm_cancargs; 16014123Speter xdr_result = xdr_nlm_res; 16114123Speter local = (char *(*)()) nlm_cancel_1; 16214123Speter break; 16314123Speter 16414123Speter case NLM_UNLOCK: 16514123Speter xdr_argument = xdr_nlm_unlockargs; 16614123Speter xdr_result = xdr_nlm_res; 16714123Speter local = (char *(*)()) nlm_unlock_1; 16814123Speter break; 16914123Speter 17014123Speter case NLM_GRANTED: 17114123Speter xdr_argument = xdr_nlm_testargs; 17214123Speter xdr_result = xdr_nlm_res; 17314123Speter local = (char *(*)()) nlm_granted_1; 17414123Speter break; 17514123Speter 17614123Speter case NLM_TEST_MSG: 17714123Speter xdr_argument = xdr_nlm_testargs; 17814123Speter xdr_result = xdr_void; 17914123Speter local = (char *(*)()) nlm_test_msg_1; 18014123Speter break; 18114123Speter 18214123Speter case NLM_LOCK_MSG: 18314123Speter xdr_argument = xdr_nlm_lockargs; 18414123Speter xdr_result = xdr_void; 18514123Speter local = (char *(*)()) nlm_lock_msg_1; 18614123Speter break; 18714123Speter 18814123Speter case NLM_CANCEL_MSG: 18914123Speter xdr_argument = xdr_nlm_cancargs; 19014123Speter xdr_result = xdr_void; 19114123Speter local = (char *(*)()) nlm_cancel_msg_1; 19214123Speter break; 19314123Speter 19414123Speter case NLM_UNLOCK_MSG: 19514123Speter xdr_argument = xdr_nlm_unlockargs; 19614123Speter xdr_result = xdr_void; 19714123Speter local = (char *(*)()) nlm_unlock_msg_1; 19814123Speter break; 19914123Speter 20014123Speter case NLM_GRANTED_MSG: 20114123Speter xdr_argument = xdr_nlm_testargs; 20214123Speter xdr_result = xdr_void; 20314123Speter local = (char *(*)()) nlm_granted_msg_1; 20414123Speter break; 20514123Speter 20614123Speter case NLM_TEST_RES: 20714123Speter xdr_argument = xdr_nlm_testres; 20814123Speter xdr_result = xdr_void; 20914123Speter local = (char *(*)()) nlm_test_res_1; 21014123Speter break; 21114123Speter 21214123Speter case NLM_LOCK_RES: 21314123Speter xdr_argument = xdr_nlm_res; 21414123Speter xdr_result = xdr_void; 21514123Speter local = (char *(*)()) nlm_lock_res_1; 21614123Speter break; 21714123Speter 21814123Speter case NLM_CANCEL_RES: 21914123Speter xdr_argument = xdr_nlm_res; 22014123Speter xdr_result = xdr_void; 22114123Speter local = (char *(*)()) nlm_cancel_res_1; 22214123Speter break; 22314123Speter 22414123Speter case NLM_UNLOCK_RES: 22514123Speter xdr_argument = xdr_nlm_res; 22614123Speter xdr_result = xdr_void; 22714123Speter local = (char *(*)()) nlm_unlock_res_1; 22814123Speter break; 22914123Speter 23014123Speter case NLM_GRANTED_RES: 23114123Speter xdr_argument = xdr_nlm_res; 23214123Speter xdr_result = xdr_void; 23314123Speter local = (char *(*)()) nlm_granted_res_1; 23414123Speter break; 23514123Speter 23614123Speter default: 23714123Speter svcerr_noproc(transp); 23814123Speter return; 23914123Speter } 24014123Speter bzero((char *)&argument, sizeof(argument)); 24114123Speter if (!svc_getargs(transp, xdr_argument, (caddr_t)&argument)) 24214123Speter { 24314123Speter syslog(LOG_ERR, "RPC received with invalid arguments"); 24414123Speter svcerr_decode(transp); 24514123Speter return; 24614123Speter } 24714123Speter result = (*local)(&argument, rqstp); 24814123Speter if (result != NULL && !svc_sendreply(transp, xdr_result, result)) 24914123Speter { 25014123Speter svcerr_systemerr(transp); 25114123Speter } 25214123Speter if (!svc_freeargs(transp, xdr_argument, (caddr_t)&argument)) 25314123Speter { 25414123Speter syslog(LOG_ERR, "unable to free arguments"); 25514123Speter } 25614123Speter 25714123Speter} 25814123Speter 25914123Speter 26014123Speterstatic void 26114123Speternlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp) 26214123Speter{ 26314123Speter union 26414123Speter { 26514123Speter nlm_shareargs nlm_share_3_arg; 26614123Speter nlm_shareargs nlm_unshare_3_arg; 26714123Speter nlm_lockargs nlm_nm_lock_3_arg; 26814123Speter nlm_notify nlm_free_all_3_arg; 26914123Speter } argument; 27014123Speter char *result; 27114123Speter bool_t (*xdr_argument)(), (*xdr_result)(); 27214123Speter char *(*local)(); 27314123Speter 27414123Speter switch (rqstp->rq_proc) 27514123Speter { 27614123Speter case NULLPROC: 27714123Speter (void)svc_sendreply(transp, xdr_void, (char *)NULL); 27814123Speter return; 27914123Speter 28014123Speter case NLM_SHARE: 28114123Speter xdr_argument = xdr_nlm_shareargs; 28214123Speter xdr_result = xdr_nlm_shareres; 28314123Speter local = (char *(*)()) nlm_share_3; 28414123Speter break; 28514123Speter 28614123Speter case NLM_UNSHARE: 28714123Speter xdr_argument = xdr_nlm_shareargs; 28814123Speter xdr_result = xdr_nlm_shareres; 28914123Speter local = (char *(*)()) nlm_unshare_3; 29014123Speter break; 29114123Speter 29214123Speter case NLM_NM_LOCK: 29314123Speter xdr_argument = xdr_nlm_lockargs; 29414123Speter xdr_result = xdr_nlm_res; 29514123Speter local = (char *(*)()) nlm_nm_lock_3; 29614123Speter break; 29714123Speter 29814123Speter case NLM_FREE_ALL: 29914123Speter xdr_argument = xdr_nlm_notify; 30014123Speter xdr_result = xdr_void; 30114123Speter local = (char *(*)()) nlm_free_all_3; 30214123Speter break; 30314123Speter 30414123Speter default: 30514123Speter svcerr_noproc(transp); 30614123Speter return; 30714123Speter } 30814123Speter bzero((char *)&argument, sizeof(argument)); 30914123Speter if (!svc_getargs(transp, xdr_argument, (caddr_t)&argument)) 31014123Speter { 31114123Speter syslog(LOG_ERR, "RPC received with invalid arguments"); 31214123Speter svcerr_decode(transp); 31314123Speter return; 31414123Speter } 31514123Speter result = (*local)(&argument, rqstp); 31614123Speter if (result != NULL && !svc_sendreply(transp, xdr_result, result)) 31714123Speter { 31814123Speter svcerr_systemerr(transp); 31914123Speter } 32014123Speter if (!svc_freeargs(transp, xdr_argument, (caddr_t)&argument)) 32114123Speter { 32214123Speter syslog(LOG_ERR, "unable to free arguments"); 32314123Speter } 32414123Speter} 32514123Speter 326