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