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