144928Smckusick /*
244928Smckusick  * Copyright (c) 1989 Jan-Simon Pendry
344928Smckusick  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
4*61800Sbostic  * Copyright (c) 1989, 1993
5*61800Sbostic  *	The Regents of the University of California.  All rights reserved.
644928Smckusick  *
744928Smckusick  * This code is derived from software contributed to Berkeley by
844928Smckusick  * Jan-Simon Pendry at Imperial College, London.
944928Smckusick  *
1044928Smckusick  * %sccs.include.redist.c%
1144928Smckusick  *
12*61800Sbostic  *	@(#)nfs_prot_svc.c	8.1 (Berkeley) 06/06/93
1349685Spendry  *
1452457Spendry  * $Id: nfs_prot_svc.c,v 5.2.2.1 1992/02/09 15:09:30 jsp beta $
1549685Spendry  *
1644928Smckusick  */
1744928Smckusick 
1844928Smckusick #include "am.h"
1944928Smckusick 
nfs_program_2(rqstp,transp)2044928Smckusick void nfs_program_2(rqstp, transp)
2144928Smckusick struct svc_req *rqstp;
2244928Smckusick SVCXPRT *transp;
2344928Smckusick {
2444928Smckusick 	union {
2544928Smckusick 		nfs_fh nfsproc_getattr_2_arg;
2644928Smckusick 		sattrargs nfsproc_setattr_2_arg;
2744928Smckusick 		diropargs nfsproc_lookup_2_arg;
2844928Smckusick 		nfs_fh nfsproc_readlink_2_arg;
2944928Smckusick 		readargs nfsproc_read_2_arg;
3044928Smckusick 		writeargs nfsproc_write_2_arg;
3144928Smckusick 		createargs nfsproc_create_2_arg;
3244928Smckusick 		diropargs nfsproc_remove_2_arg;
3344928Smckusick 		renameargs nfsproc_rename_2_arg;
3444928Smckusick 		linkargs nfsproc_link_2_arg;
3544928Smckusick 		symlinkargs nfsproc_symlink_2_arg;
3644928Smckusick 		createargs nfsproc_mkdir_2_arg;
3744928Smckusick 		diropargs nfsproc_rmdir_2_arg;
3844928Smckusick 		readdirargs nfsproc_readdir_2_arg;
3944928Smckusick 		nfs_fh nfsproc_statfs_2_arg;
4044928Smckusick 	} argument;
4144928Smckusick 	char *result;
4244928Smckusick 	bool_t (*xdr_argument)(), (*xdr_result)();
4344928Smckusick 	char *(*local)();
4444928Smckusick 
4544928Smckusick 	switch (rqstp->rq_proc) {
4644928Smckusick 	case NFSPROC_NULL:
4744928Smckusick 		xdr_argument = xdr_void;
4844928Smckusick 		xdr_result = xdr_void;
4944928Smckusick 		local = (char *(*)()) nfsproc_null_2;
5044928Smckusick 		break;
5144928Smckusick 
5244928Smckusick 	case NFSPROC_GETATTR:
5344928Smckusick 		xdr_argument = xdr_nfs_fh;
5444928Smckusick 		xdr_result = xdr_attrstat;
5544928Smckusick 		local = (char *(*)()) nfsproc_getattr_2;
5644928Smckusick 		break;
5744928Smckusick 
5844928Smckusick 	case NFSPROC_SETATTR:
5944928Smckusick 		xdr_argument = xdr_sattrargs;
6044928Smckusick 		xdr_result = xdr_attrstat;
6144928Smckusick 		local = (char *(*)()) nfsproc_setattr_2;
6244928Smckusick 		break;
6344928Smckusick 
6444928Smckusick 	case NFSPROC_ROOT:
6544928Smckusick 		xdr_argument = xdr_void;
6644928Smckusick 		xdr_result = xdr_void;
6744928Smckusick 		local = (char *(*)()) nfsproc_root_2;
6844928Smckusick 		break;
6944928Smckusick 
7044928Smckusick 	case NFSPROC_LOOKUP:
7144928Smckusick 		xdr_argument = xdr_diropargs;
7244928Smckusick 		xdr_result = xdr_diropres;
7344928Smckusick 		local = (char *(*)()) nfsproc_lookup_2;
7444928Smckusick 		break;
7544928Smckusick 
7644928Smckusick 	case NFSPROC_READLINK:
7744928Smckusick 		xdr_argument = xdr_nfs_fh;
7844928Smckusick 		xdr_result = xdr_readlinkres;
7944928Smckusick 		local = (char *(*)()) nfsproc_readlink_2;
8044928Smckusick 		break;
8144928Smckusick 
8244928Smckusick 	case NFSPROC_READ:
8344928Smckusick 		xdr_argument = xdr_readargs;
8444928Smckusick 		xdr_result = xdr_readres;
8544928Smckusick 		local = (char *(*)()) nfsproc_read_2;
8644928Smckusick 		break;
8744928Smckusick 
8844928Smckusick 	case NFSPROC_WRITECACHE:
8944928Smckusick 		xdr_argument = xdr_void;
9044928Smckusick 		xdr_result = xdr_void;
9144928Smckusick 		local = (char *(*)()) nfsproc_writecache_2;
9244928Smckusick 		break;
9344928Smckusick 
9444928Smckusick 	case NFSPROC_WRITE:
9544928Smckusick 		xdr_argument = xdr_writeargs;
9644928Smckusick 		xdr_result = xdr_attrstat;
9744928Smckusick 		local = (char *(*)()) nfsproc_write_2;
9844928Smckusick 		break;
9944928Smckusick 
10044928Smckusick 	case NFSPROC_CREATE:
10144928Smckusick 		xdr_argument = xdr_createargs;
10244928Smckusick 		xdr_result = xdr_diropres;
10344928Smckusick 		local = (char *(*)()) nfsproc_create_2;
10444928Smckusick 		break;
10544928Smckusick 
10644928Smckusick 	case NFSPROC_REMOVE:
10744928Smckusick 		xdr_argument = xdr_diropargs;
10844928Smckusick 		xdr_result = xdr_nfsstat;
10944928Smckusick 		local = (char *(*)()) nfsproc_remove_2;
11044928Smckusick 		break;
11144928Smckusick 
11244928Smckusick 	case NFSPROC_RENAME:
11344928Smckusick 		xdr_argument = xdr_renameargs;
11444928Smckusick 		xdr_result = xdr_nfsstat;
11544928Smckusick 		local = (char *(*)()) nfsproc_rename_2;
11644928Smckusick 		break;
11744928Smckusick 
11844928Smckusick 	case NFSPROC_LINK:
11944928Smckusick 		xdr_argument = xdr_linkargs;
12044928Smckusick 		xdr_result = xdr_nfsstat;
12144928Smckusick 		local = (char *(*)()) nfsproc_link_2;
12244928Smckusick 		break;
12344928Smckusick 
12444928Smckusick 	case NFSPROC_SYMLINK:
12544928Smckusick 		xdr_argument = xdr_symlinkargs;
12644928Smckusick 		xdr_result = xdr_nfsstat;
12744928Smckusick 		local = (char *(*)()) nfsproc_symlink_2;
12844928Smckusick 		break;
12944928Smckusick 
13044928Smckusick 	case NFSPROC_MKDIR:
13144928Smckusick 		xdr_argument = xdr_createargs;
13244928Smckusick 		xdr_result = xdr_diropres;
13344928Smckusick 		local = (char *(*)()) nfsproc_mkdir_2;
13444928Smckusick 		break;
13544928Smckusick 
13644928Smckusick 	case NFSPROC_RMDIR:
13744928Smckusick 		xdr_argument = xdr_diropargs;
13844928Smckusick 		xdr_result = xdr_nfsstat;
13944928Smckusick 		local = (char *(*)()) nfsproc_rmdir_2;
14044928Smckusick 		break;
14144928Smckusick 
14244928Smckusick 	case NFSPROC_READDIR:
14344928Smckusick 		xdr_argument = xdr_readdirargs;
14444928Smckusick 		xdr_result = xdr_readdirres;
14544928Smckusick 		local = (char *(*)()) nfsproc_readdir_2;
14644928Smckusick 		break;
14744928Smckusick 
14844928Smckusick 	case NFSPROC_STATFS:
14944928Smckusick 		xdr_argument = xdr_nfs_fh;
15044928Smckusick 		xdr_result = xdr_statfsres;
15144928Smckusick 		local = (char *(*)()) nfsproc_statfs_2;
15244928Smckusick 		break;
15344928Smckusick 
15444928Smckusick 	default:
15544928Smckusick 		svcerr_noproc(transp);
15644928Smckusick 		return;
15744928Smckusick 	}
15844928Smckusick 	bzero((char *)&argument, sizeof(argument));
15944928Smckusick 	if (!svc_getargs(transp, xdr_argument, &argument)) {
16044928Smckusick 		svcerr_decode(transp);
16144928Smckusick 		return;
16244928Smckusick 	}
16344928Smckusick 	result = (*local)(&argument, rqstp);
16444928Smckusick 	if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
16544928Smckusick 		svcerr_systemerr(transp);
16644928Smckusick 	}
16744928Smckusick 	if (!svc_freeargs(transp, xdr_argument, &argument)) {
16844928Smckusick 		plog(XLOG_FATAL, "unable to free rpc arguments in nfs_program_1");
16944928Smckusick 		going_down(1);
17044928Smckusick 	}
17144928Smckusick }
17244928Smckusick 
173