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