/* * Purpose: Test whether a specified lock would be granted if requested * Returns: nlm_granted (or error code) * Notes: */ nlm_testres * nlm_test_1_svc(nlm_testargs *arg, struct svc_req *rqstp) { static nlm_testres result; struct nlm4_lock arg4; struct nlm4_holder *holder; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_test", rqstp); holder = testlock(&arg4, 0); /* * Copy the cookie from the argument into the result. Note that this * is slightly hazardous, as the structure contains a pointer to a * malloc()ed buffer that will get freed by the caller. However, the * main function transmits the result before freeing the argument * so it is in fact safe. */ result.cookie = arg->cookie; if (holder == NULL) { result.stat.stat = nlm_granted; } else { result.stat.stat = nlm_denied; memcpy(&result.stat.nlm_testrply_u.holder, holder, sizeof(struct nlm_holder)); result.stat.nlm_testrply_u.holder.l_offset = (unsigned int)holder->l_offset; result.stat.nlm_testrply_u.holder.l_len = (unsigned int)holder->l_len; } return &result; }
void * nlm_test_msg_1_svc(nlm_testargs *arg, struct svc_req *rqstp) { nlm_testres result; static char dummy; struct sockaddr_in *addr; CLIENT *cli; int success; struct timeval timeo; struct nlm4_lock arg4; struct nlm4_holder *holder; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_test_msg", rqstp); holder = testlock(&arg4, 0); result.cookie = arg->cookie; if (holder == NULL) { result.stat.stat = nlm_granted; } else { result.stat.stat = nlm_denied; memcpy(&result.stat.nlm_testrply_u.holder, holder, sizeof(struct nlm_holder)); result.stat.nlm_testrply_u.holder.l_offset = (unsigned int)holder->l_offset; result.stat.nlm_testrply_u.holder.l_len = (unsigned int)holder->l_len; } /* * nlm_test has different result type to the other operations, so * can't use transmit_result() in this case */ addr = svc_getcaller(rqstp->rq_xprt); if ((cli = get_client(addr, NLM_VERS)) != NULL) { /* No timeout - not expecting response */ timerclear(&timeo); success = clnt_call(cli, NLM_TEST_RES, xdr_nlm_testres, &result, xdr_void, &dummy, timeo); if (debug_level > 2) syslog(LOG_DEBUG, "clnt_call returns %d", success); } return NULL; }
/* * Purpose: Release an existing lock * Returns: Always granted, unless during grace period * Notes: "no such lock" error condition is ignored, as the * protocol uses unreliable UDP datagrams, and may well * re-try an unlock that has already succeeded. */ nlm_res * nlm_unlock_1_svc(nlm_unlockargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lock arg4; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_unlock", rqstp); result.stat.stat = unlock(&arg4, 0); result.cookie = arg->cookie; return &result; }
void * nlm_unlock_msg_1_svc(nlm_unlockargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lock arg4; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_unlock_msg", rqstp); result.stat.stat = unlock(&arg4, 0); result.cookie = arg->cookie; transmit_result(NLM_UNLOCK_RES, &result, svc_getcaller(rqstp->rq_xprt)); return NULL; }
void * nlm_unlock_msg_1_svc(nlm_unlockargs *arg, struct svc_req *rqstp) { static nlm_res res; struct nlm4_lock arg4; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_unlock_msg", rqstp); res.stat.stat = unlock(&arg4, 0); res.cookie = arg->cookie; transmit_result(NLM_UNLOCK_RES, &res, getrpcaddr(rqstp)); return (NULL); }
void * nlm_cancel_msg_1_svc(nlm_cancargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lock arg4; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_cancel_msg", rqstp); result.cookie = arg->cookie; /* * Since at present we never return 'nlm_blocked', there can never be * a lock to cancel, so this call always fails. */ result.stat.stat = unlock(&arg4, LOCK_CANCEL); transmit_result(NLM_CANCEL_RES, &result, svc_getcaller(rqstp->rq_xprt)); return NULL; }
/* * Purpose: Cancel a blocked lock request * Returns: granted or denied * Notes: */ nlm_res * nlm_cancel_1_svc(nlm_cancargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lock arg4; nlmtonlm4(&arg->alock, &arg4); if (debug_level) log_from_addr("nlm_cancel", rqstp); /* copy cookie from arg to result. See comment in nlm_test_1() */ result.cookie = arg->cookie; /* * Since at present we never return 'nlm_blocked', there can never be * a lock to cancel, so this call always fails. */ result.stat.stat = unlock(&arg4, LOCK_CANCEL); return &result; }
/* * Purposes: Establish a lock * Returns: granted, denied or blocked * Notes: *** grace period support missing */ nlm_res * nlm_lock_1_svc(nlm_lockargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lockargs arg4; nlmtonlm4(&arg->alock, &arg4.alock); arg4.cookie = arg->cookie; arg4.block = arg->block; arg4.exclusive = arg->exclusive; arg4.reclaim = arg->reclaim; arg4.state = arg->state; if (debug_level) log_from_addr("nlm_lock", rqstp); /* copy cookie from arg to result. See comment in nlm_test_1() */ result.cookie = arg->cookie; result.stat.stat = getlock(&arg4, rqstp, LOCK_MON); return &result; }
void * nlm_lock_msg_1_svc(nlm_lockargs *arg, struct svc_req *rqstp) { static nlm_res result; struct nlm4_lockargs arg4; nlmtonlm4(&arg->alock, &arg4.alock); arg4.cookie = arg->cookie; arg4.block = arg->block; arg4.exclusive = arg->exclusive; arg4.reclaim = arg->reclaim; arg4.state = arg->state; if (debug_level) log_from_addr("nlm_lock_msg", rqstp); result.cookie = arg->cookie; result.stat.stat = getlock(&arg4, rqstp, LOCK_ASYNC | LOCK_MON); transmit_result(NLM_LOCK_RES, &result, svc_getcaller(rqstp->rq_xprt)); return NULL; }