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