prot_pnlm.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 422 行

C
422
字号
# ifndef lintstatic char *sccsid = "@(#)prot_pnlm.c	4.1	(ULTRIX)	7/2/90";# endif not lint/**************************************************************** *								* *  Licensed to Digital Equipment Corporation, Maynard, MA	* *		Copyright 1985 Sun Microsystems, Inc.		* *			All rights reserved.			* *								* ****************************************************************//**//* *	Modification history: *	~~~~~~~~~~~~~~~~~~~~ * *	revision			comments *	--------	----------------------------------------------- * * *	01-Jun-89	Fred Glover *			Update for nfssrc4.0 * *	18-Jan-88	fries *			Added Header and Copyright notice. * *	 *//* prot_pnlm.c * consists of all procedures called by nlm_prog */#include <stdio.h>#include "prot_lock.h"extern int debug;extern reclock *call_q;	extern SVCXPRT *nlm_transp;extern msg_entry *search_msg();extern remote_result *local_lock(), *local_unlock(), *local_test(), *local_cancel(), *local_granted(), *local_granted_msg();extern remote_result *cont_test(), *cont_lock(), *cont_unlock(), *cont_cancel(), *cont_reclaim();proc_nlm_test(a)	reclock *a;{	remote_result *result;	if (debug)		printf("proc_nlm_test(%x) \n", a);	result = local_test(a);	nlm_reply(NLM_TEST, result, a);}proc_nlm_lock(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_lock(%x) \n", a);	result = local_lock(a);	nlm_reply(NLM_LOCK, result, a);}proc_nlm_cancel(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_cancel(%x) \n", a);	result = local_cancel(a);	nlm_reply(NLM_CANCEL, result, a);}proc_nlm_unlock(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_unlock(%x) \n", a);	result = local_unlock(a);	nlm_reply(NLM_UNLOCK, result, a);}proc_nlm_granted(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_granted(%x)\n", a);	result = local_granted(a, RPC);	if (result != NULL) {		nlm_reply(NLM_GRANTED, result, a);	}}proc_nlm_test_msg(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_test_msg(%x)\n", a);	result = local_test(a);	nlm_reply(NLM_TEST_MSG, result, a);}proc_nlm_lock_msg(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_lock_msg(%x)\n", a);	result = local_lock(a);	nlm_reply(NLM_LOCK_MSG, result, a);}proc_nlm_cancel_msg(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_cancel_msg(%x)\n", a);	result = local_cancel(a);	nlm_reply(NLM_CANCEL_MSG, result, a);}proc_nlm_unlock_msg(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_unlock_msg(%x)\n", a);	result = local_unlock(a);	nlm_reply(NLM_UNLOCK_MSG, result, a);}proc_nlm_granted_msg(a)	reclock *a;{	remote_result *result;	if (debug)		printf("enter proc_nlm_granted_msg(%x)\n", a);	result = local_granted(a, MSG);	if (result != NULL) 		nlm_reply(NLM_GRANTED_MSG, result, a);}/*  * return rpc calls; * if rpc calls, directly reply to the request; * if msg passing calls, initiates one way rpc call to reply! */nlm_reply(proc, reply, a)	int proc;	remote_result *reply;	reclock *a;{	bool_t (*xdr_reply)();	int act;	int nlmreply = 1;	int newcall = 2;	int rpc_err;	char *name;	int valid;	switch(proc) {	case NLM_TEST:		xdr_reply = xdr_nlm_testres;		act = nlmreply;		break;	case NLM_LOCK:	case NLM_CANCEL:	case NLM_UNLOCK:	case NLM_GRANTED:		xdr_reply = xdr_nlm_res;		act = nlmreply;		break;	case NLM_TEST_MSG:		xdr_reply = xdr_nlm_testres;		act = newcall;		proc = NLM_TEST_RES;		name = a->lck.clnt;		break;	case NLM_LOCK_MSG:		xdr_reply = xdr_nlm_res;		act = newcall;		proc = NLM_LOCK_RES;		name = a->lck.clnt;		break;	case NLM_CANCEL_MSG:		xdr_reply = xdr_nlm_res;		act = newcall;		proc = NLM_CANCEL_RES;		name = a->lck.clnt;		break;	case NLM_UNLOCK_MSG:		xdr_reply = xdr_nlm_res;		act = newcall;		proc = NLM_UNLOCK_RES;		name = a->lck.clnt;		break;	case NLM_GRANTED_MSG:		xdr_reply = xdr_nlm_res;		act = newcall;		proc = NLM_GRANTED_RES;		name = a->lck.svr;		break;	default:		printf("unknown nlm_reply proc vaule: %d\n", proc);		return;	}	if (act == nlmreply) { /* reply to nlm_transp */		if (debug)			printf("rpc nlm_reply %d: %d\n", proc, reply->lstat);		 if (!svc_sendreply(nlm_transp, xdr_reply, reply)) 			svcerr_systemerr(nlm_transp);		return;	}	else { /* issue a one way rpc call to reply */		if (debug)			printf("nlm_reply: (%s, %d), result = %d\n",			name, proc, reply->lstat);		reply->cookie_len = a->cookie_len;		reply->cookie_bytes = a->cookie_bytes;		valid = 1;		if ((rpc_err = call_udp(name, NLM_PROG, NLM_VERS, proc, xdr_reply, reply, xdr_void, NULL, valid, 0))		 != (int) RPC_TIMEDOUT && rpc_err != (int) RPC_SUCCESS) {			/* in case of error, print out error msg */			clnt_perrno(rpc_err);			fprintf(stderr, "\n");		}	}}proc_nlm_test_res(reply)	remote_result *reply;{	nlm_res_routine(reply,  cont_test);}proc_nlm_lock_res(reply)	remote_result *reply;{	nlm_res_routine(reply,  cont_lock);}proc_nlm_cancel_res(reply)	remote_result *reply;{	nlm_res_routine(reply,  cont_cancel);}proc_nlm_unlock_res(reply)	remote_result *reply;{	nlm_res_routine(reply,  cont_unlock);}/* * common routine shared by all nlm routines that expects replies from svr nlm:  * nlm_lock_res, nlm_test_res, nlm_unlock_res, nlm_cancel_res * private routine "cont" is called to continue local operation; * reply is match with msg in msg_queue according to cookie * and then attached to msg_queue; */nlm_res_routine(reply, cont)	remote_result *reply;	remote_result *(*cont)();{	msg_entry *msgp;	remote_result *resp;	if ((msgp = search_msg(reply)) != NULL) {	/* found */		if (msgp->reply != NULL) { /* reply already exists */			if (msgp->reply->lstat != reply->lstat) {				fprintf(stderr, "inconsistent  lock reply exists, ignored \n"); 				if (debug)					printf("inconsistent reply (%d, %d) exists for lock(%x)\n", msgp->reply->lstat, reply->lstat, msgp->req);			}			release_res(reply);			return;		}		/* continue process req according to remote reply */		if (debug) {			printf("nlm_res_routine(%x)\n", msgp->req);			(void) fflush(stdout);		}		if (msgp->proc == NLM_LOCK_RECLAIM) 			/* reclaim response */			resp = cont_reclaim(msgp->req, reply);		else 			/* normal response */			resp = cont(msgp-> req , reply);			add_reply(msgp, resp);	}	else		release_res(reply);			/* discard this resply */}proc_nlm_granted_res(reply)	remote_result *reply;{	msg_entry *msgp;	if (debug)		printf("enter nlm_granted_res\n");	if ((msgp = search_msg(reply)) != NULL)		dequeue(msgp);}/* * rpc msg passing calls to nlm msg procedure; * used by local_lock, local_test, local_cancel and local_unloc; * proc specifis the name of nlm procedures; * retransmit indicate whether this is retransmission; * rpc_call return -1 if rpc call is not successful, clnt_perrno is printed out; * rpc_call return 0 otherwise */nlm_call(proc, a, retransmit)	int proc;	reclock *a;	int retransmit;{	int rpc_err;	bool_t (*xdr_arg)();	char *name;	int func;	int valid;	func = proc;		/* this is necc for NLM_LOCK_RECLAIM */	if (retransmit == 0)		valid = 1;		/* use cache value for first time calls */	else		valid = 0;		/* invalidate cache */	switch(proc) {	case NLM_TEST_MSG:		xdr_arg = xdr_nlm_testargs;		name = a->lck.svr;		break;	case NLM_LOCK_MSG:		xdr_arg = xdr_nlm_lockargs;		name = a->lck.svr;		break;	case NLM_LOCK_RECLAIM:		xdr_arg = xdr_nlm_lockargs;		name = a->lck.svr;		func = NLM_LOCK_MSG;		valid = 0; 	/* turn off udp cache */		break;	case NLM_CANCEL_MSG:		xdr_arg = xdr_nlm_cancargs;		name = a->lck.svr;		break;	case NLM_UNLOCK_MSG:		xdr_arg = xdr_nlm_unlockargs;		name = a->lck.svr;		break;	case NLM_GRANTED_MSG:		xdr_arg = xdr_nlm_testargs;		name = a->lck.clnt;		a->lck.caller_name = a->lck.server_name; /* modify caller name */		break;	default:		printf("%d not supported in nlm_call\n", proc);		return(-1);	}	if (debug)		printf("nlm_call to (%s, %d) op=%d, (%d, %d); retran = %d, valid = %d\n",			name, proc, a->lck.op, a->lck.l_offset, a->lck.l_len, retransmit, valid);	/*  	 * call is a one way rpc call to simulate msg passing 	 * no timeout nor reply is specified; 	 */	if ((rpc_err = call_udp(name, NLM_PROG, NLM_VERS, func, xdr_arg, a, xdr_void, NULL, valid, 0)) == (int) RPC_TIMEDOUT ) {		/* if rpc call is successful, add msg to msg_queue */		if (retransmit == 0)	/* first time calls */			if (queue(a, proc) == NULL) {				return(-1);			}		return(0);	}	else {		if (debug) {			clnt_perrno(rpc_err);			fprintf(stderr, "\n");		}		return(-1);	}} call_back(){	reclock *nl;	if (call_q == NULL)		/* no need to call back */		return;	nl = call_q;	while ( nl!= NULL) {		if (debug)			printf("enter call_back(%d, %d), op =%d\n",			nl->lck.l_offset, nl->lck.l_len, nl->lck.op);		if (nlm_call(NLM_GRANTED_MSG, nl, 0) == -1)			abort();		nl = nl->nxt;	}	call_q = NULL;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?