144928Smckusick /* 244928Smckusick * Copyright (c) 1989 Jan-Simon Pendry 344928Smckusick * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 444928Smckusick * Copyright (c) 1989 The Regents of the University of California. 544928Smckusick * 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*49685Spendry * @(#)nfs_prot_svc.c 5.3 (Berkeley) 05/12/91 13*49685Spendry * 14*49685Spendry * $Id: nfs_prot_svc.c,v 5.2.1.2 91/05/07 22:18:58 jsp Alpha $ 15*49685Spendry * 1644928Smckusick */ 1744928Smckusick 1844928Smckusick #include "am.h" 1944928Smckusick 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