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