1*44928Smckusick /* 2*44928Smckusick * $Id: nfs_prot_svc.c,v 5.2 90/06/23 22:20:25 jsp Rel $ 3*44928Smckusick * 4*44928Smckusick * Copyright (c) 1989 Jan-Simon Pendry 5*44928Smckusick * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 6*44928Smckusick * Copyright (c) 1989 The Regents of the University of California. 7*44928Smckusick * All rights reserved. 8*44928Smckusick * 9*44928Smckusick * This code is derived from software contributed to Berkeley by 10*44928Smckusick * Jan-Simon Pendry at Imperial College, London. 11*44928Smckusick * 12*44928Smckusick * %sccs.include.redist.c% 13*44928Smckusick * 14*44928Smckusick * @(#)nfs_prot_svc.c 5.1 (Berkeley) 07/19/90 15*44928Smckusick */ 16*44928Smckusick 17*44928Smckusick #include "am.h" 18*44928Smckusick 19*44928Smckusick void nfs_program_2(rqstp, transp) 20*44928Smckusick struct svc_req *rqstp; 21*44928Smckusick SVCXPRT *transp; 22*44928Smckusick { 23*44928Smckusick union { 24*44928Smckusick nfs_fh nfsproc_getattr_2_arg; 25*44928Smckusick sattrargs nfsproc_setattr_2_arg; 26*44928Smckusick diropargs nfsproc_lookup_2_arg; 27*44928Smckusick nfs_fh nfsproc_readlink_2_arg; 28*44928Smckusick readargs nfsproc_read_2_arg; 29*44928Smckusick writeargs nfsproc_write_2_arg; 30*44928Smckusick createargs nfsproc_create_2_arg; 31*44928Smckusick diropargs nfsproc_remove_2_arg; 32*44928Smckusick renameargs nfsproc_rename_2_arg; 33*44928Smckusick linkargs nfsproc_link_2_arg; 34*44928Smckusick symlinkargs nfsproc_symlink_2_arg; 35*44928Smckusick createargs nfsproc_mkdir_2_arg; 36*44928Smckusick diropargs nfsproc_rmdir_2_arg; 37*44928Smckusick readdirargs nfsproc_readdir_2_arg; 38*44928Smckusick nfs_fh nfsproc_statfs_2_arg; 39*44928Smckusick } argument; 40*44928Smckusick char *result; 41*44928Smckusick bool_t (*xdr_argument)(), (*xdr_result)(); 42*44928Smckusick char *(*local)(); 43*44928Smckusick 44*44928Smckusick switch (rqstp->rq_proc) { 45*44928Smckusick case NFSPROC_NULL: 46*44928Smckusick xdr_argument = xdr_void; 47*44928Smckusick xdr_result = xdr_void; 48*44928Smckusick local = (char *(*)()) nfsproc_null_2; 49*44928Smckusick break; 50*44928Smckusick 51*44928Smckusick case NFSPROC_GETATTR: 52*44928Smckusick xdr_argument = xdr_nfs_fh; 53*44928Smckusick xdr_result = xdr_attrstat; 54*44928Smckusick local = (char *(*)()) nfsproc_getattr_2; 55*44928Smckusick break; 56*44928Smckusick 57*44928Smckusick case NFSPROC_SETATTR: 58*44928Smckusick xdr_argument = xdr_sattrargs; 59*44928Smckusick xdr_result = xdr_attrstat; 60*44928Smckusick local = (char *(*)()) nfsproc_setattr_2; 61*44928Smckusick break; 62*44928Smckusick 63*44928Smckusick case NFSPROC_ROOT: 64*44928Smckusick xdr_argument = xdr_void; 65*44928Smckusick xdr_result = xdr_void; 66*44928Smckusick local = (char *(*)()) nfsproc_root_2; 67*44928Smckusick break; 68*44928Smckusick 69*44928Smckusick case NFSPROC_LOOKUP: 70*44928Smckusick xdr_argument = xdr_diropargs; 71*44928Smckusick xdr_result = xdr_diropres; 72*44928Smckusick local = (char *(*)()) nfsproc_lookup_2; 73*44928Smckusick break; 74*44928Smckusick 75*44928Smckusick case NFSPROC_READLINK: 76*44928Smckusick xdr_argument = xdr_nfs_fh; 77*44928Smckusick xdr_result = xdr_readlinkres; 78*44928Smckusick local = (char *(*)()) nfsproc_readlink_2; 79*44928Smckusick break; 80*44928Smckusick 81*44928Smckusick case NFSPROC_READ: 82*44928Smckusick xdr_argument = xdr_readargs; 83*44928Smckusick xdr_result = xdr_readres; 84*44928Smckusick local = (char *(*)()) nfsproc_read_2; 85*44928Smckusick break; 86*44928Smckusick 87*44928Smckusick case NFSPROC_WRITECACHE: 88*44928Smckusick xdr_argument = xdr_void; 89*44928Smckusick xdr_result = xdr_void; 90*44928Smckusick local = (char *(*)()) nfsproc_writecache_2; 91*44928Smckusick break; 92*44928Smckusick 93*44928Smckusick case NFSPROC_WRITE: 94*44928Smckusick xdr_argument = xdr_writeargs; 95*44928Smckusick xdr_result = xdr_attrstat; 96*44928Smckusick local = (char *(*)()) nfsproc_write_2; 97*44928Smckusick break; 98*44928Smckusick 99*44928Smckusick case NFSPROC_CREATE: 100*44928Smckusick xdr_argument = xdr_createargs; 101*44928Smckusick xdr_result = xdr_diropres; 102*44928Smckusick local = (char *(*)()) nfsproc_create_2; 103*44928Smckusick break; 104*44928Smckusick 105*44928Smckusick case NFSPROC_REMOVE: 106*44928Smckusick xdr_argument = xdr_diropargs; 107*44928Smckusick xdr_result = xdr_nfsstat; 108*44928Smckusick local = (char *(*)()) nfsproc_remove_2; 109*44928Smckusick break; 110*44928Smckusick 111*44928Smckusick case NFSPROC_RENAME: 112*44928Smckusick xdr_argument = xdr_renameargs; 113*44928Smckusick xdr_result = xdr_nfsstat; 114*44928Smckusick local = (char *(*)()) nfsproc_rename_2; 115*44928Smckusick break; 116*44928Smckusick 117*44928Smckusick case NFSPROC_LINK: 118*44928Smckusick xdr_argument = xdr_linkargs; 119*44928Smckusick xdr_result = xdr_nfsstat; 120*44928Smckusick local = (char *(*)()) nfsproc_link_2; 121*44928Smckusick break; 122*44928Smckusick 123*44928Smckusick case NFSPROC_SYMLINK: 124*44928Smckusick xdr_argument = xdr_symlinkargs; 125*44928Smckusick xdr_result = xdr_nfsstat; 126*44928Smckusick local = (char *(*)()) nfsproc_symlink_2; 127*44928Smckusick break; 128*44928Smckusick 129*44928Smckusick case NFSPROC_MKDIR: 130*44928Smckusick xdr_argument = xdr_createargs; 131*44928Smckusick xdr_result = xdr_diropres; 132*44928Smckusick local = (char *(*)()) nfsproc_mkdir_2; 133*44928Smckusick break; 134*44928Smckusick 135*44928Smckusick case NFSPROC_RMDIR: 136*44928Smckusick xdr_argument = xdr_diropargs; 137*44928Smckusick xdr_result = xdr_nfsstat; 138*44928Smckusick local = (char *(*)()) nfsproc_rmdir_2; 139*44928Smckusick break; 140*44928Smckusick 141*44928Smckusick case NFSPROC_READDIR: 142*44928Smckusick xdr_argument = xdr_readdirargs; 143*44928Smckusick xdr_result = xdr_readdirres; 144*44928Smckusick local = (char *(*)()) nfsproc_readdir_2; 145*44928Smckusick break; 146*44928Smckusick 147*44928Smckusick case NFSPROC_STATFS: 148*44928Smckusick xdr_argument = xdr_nfs_fh; 149*44928Smckusick xdr_result = xdr_statfsres; 150*44928Smckusick local = (char *(*)()) nfsproc_statfs_2; 151*44928Smckusick break; 152*44928Smckusick 153*44928Smckusick default: 154*44928Smckusick svcerr_noproc(transp); 155*44928Smckusick return; 156*44928Smckusick } 157*44928Smckusick bzero((char *)&argument, sizeof(argument)); 158*44928Smckusick if (!svc_getargs(transp, xdr_argument, &argument)) { 159*44928Smckusick svcerr_decode(transp); 160*44928Smckusick return; 161*44928Smckusick } 162*44928Smckusick result = (*local)(&argument, rqstp); 163*44928Smckusick if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { 164*44928Smckusick svcerr_systemerr(transp); 165*44928Smckusick } 166*44928Smckusick if (!svc_freeargs(transp, xdr_argument, &argument)) { 167*44928Smckusick plog(XLOG_FATAL, "unable to free rpc arguments in nfs_program_1"); 168*44928Smckusick going_down(1); 169*44928Smckusick } 170*44928Smckusick } 171*44928Smckusick 172