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