xref: /freebsd/sys/nlm/nlm_prot_svc.c (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
5  * Authors: Doug Rabson <dfr@rabson.org>
6  * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 
33 #include <nlm/nlm_prot.h>
34 #include <nlm/nlm.h>
35 
36 #include <sys/cdefs.h>
37 #ifndef lint
38 __RCSID("$NetBSD: nlm_prot.x,v 1.6 2000/06/07 14:30:15 bouyer Exp $");
39 #endif /* not lint */
40 void nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp);
41 void nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp);
42 void nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp);
43 void nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp);
44 
45 void
46 nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp)
47 {
48 	union {
49 		struct nlm_sm_status nlm_sm_notify_0_arg;
50 	} argument;
51 	char result;
52 	bool_t retval;
53 	xdrproc_t xdr_argument, xdr_result;
54 	bool_t (*local)(char *, void *, struct svc_req *);
55 
56 	switch (rqstp->rq_proc) {
57 	case NULLPROC:
58 		(void) svc_sendreply(rqstp,
59 			(xdrproc_t) xdr_void, (char *)NULL);
60 		svc_freereq(rqstp);
61 		return;
62 
63 	case NLM_SM_NOTIFY:
64 		xdr_argument = (xdrproc_t) xdr_nlm_sm_status;
65 		xdr_result = (xdrproc_t) xdr_void;
66 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_sm_notify_0_svc;
67 		break;
68 
69 	default:
70 		svcerr_noproc(rqstp);
71 		svc_freereq(rqstp);
72 		return;
73 	}
74 	(void) memset((char *)&argument, 0, sizeof (argument));
75 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
76 		svcerr_decode(rqstp);
77 		svc_freereq(rqstp);
78 		return;
79 	}
80 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
81 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
82 		svcerr_systemerr(rqstp);
83 	}
84 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
85 		printf("unable to free arguments");
86 		//exit(1);
87 	}
88 	svc_freereq(rqstp);
89 
90 	return;
91 }
92 
93 void
94 nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp)
95 {
96 	union {
97 		struct nlm_testargs nlm_test_1_arg;
98 		struct nlm_lockargs nlm_lock_1_arg;
99 		struct nlm_cancargs nlm_cancel_1_arg;
100 		struct nlm_unlockargs nlm_unlock_1_arg;
101 		struct nlm_testargs nlm_granted_1_arg;
102 		struct nlm_testargs nlm_test_msg_1_arg;
103 		struct nlm_lockargs nlm_lock_msg_1_arg;
104 		struct nlm_cancargs nlm_cancel_msg_1_arg;
105 		struct nlm_unlockargs nlm_unlock_msg_1_arg;
106 		struct nlm_testargs nlm_granted_msg_1_arg;
107 		nlm_testres nlm_test_res_1_arg;
108 		nlm_res nlm_lock_res_1_arg;
109 		nlm_res nlm_cancel_res_1_arg;
110 		nlm_res nlm_unlock_res_1_arg;
111 		nlm_res nlm_granted_res_1_arg;
112 	} argument;
113 	union {
114 		nlm_testres nlm_test_1_res;
115 		nlm_res nlm_lock_1_res;
116 		nlm_res nlm_cancel_1_res;
117 		nlm_res nlm_unlock_1_res;
118 		nlm_res nlm_granted_1_res;
119 	} result;
120 	bool_t retval;
121 	xdrproc_t xdr_argument, xdr_result;
122 	bool_t (*local)(char *, void *, struct svc_req *);
123 
124 	switch (rqstp->rq_proc) {
125 	case NULLPROC:
126 		(void) svc_sendreply(rqstp,
127 			(xdrproc_t) xdr_void, (char *)NULL);
128 		svc_freereq(rqstp);
129 		return;
130 
131 	case NLM_TEST:
132 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
133 		xdr_result = (xdrproc_t) xdr_nlm_testres;
134 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_1_svc;
135 		break;
136 
137 	case NLM_LOCK:
138 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
139 		xdr_result = (xdrproc_t) xdr_nlm_res;
140 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_1_svc;
141 		break;
142 
143 	case NLM_CANCEL:
144 		xdr_argument = (xdrproc_t) xdr_nlm_cancargs;
145 		xdr_result = (xdrproc_t) xdr_nlm_res;
146 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_1_svc;
147 		break;
148 
149 	case NLM_UNLOCK:
150 		xdr_argument = (xdrproc_t) xdr_nlm_unlockargs;
151 		xdr_result = (xdrproc_t) xdr_nlm_res;
152 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_1_svc;
153 		break;
154 
155 	case NLM_GRANTED:
156 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
157 		xdr_result = (xdrproc_t) xdr_nlm_res;
158 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_1_svc;
159 		break;
160 
161 	case NLM_TEST_MSG:
162 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
163 		xdr_result = (xdrproc_t) xdr_void;
164 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_msg_1_svc;
165 		break;
166 
167 	case NLM_LOCK_MSG:
168 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
169 		xdr_result = (xdrproc_t) xdr_void;
170 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_msg_1_svc;
171 		break;
172 
173 	case NLM_CANCEL_MSG:
174 		xdr_argument = (xdrproc_t) xdr_nlm_cancargs;
175 		xdr_result = (xdrproc_t) xdr_void;
176 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_msg_1_svc;
177 		break;
178 
179 	case NLM_UNLOCK_MSG:
180 		xdr_argument = (xdrproc_t) xdr_nlm_unlockargs;
181 		xdr_result = (xdrproc_t) xdr_void;
182 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_msg_1_svc;
183 		break;
184 
185 	case NLM_GRANTED_MSG:
186 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
187 		xdr_result = (xdrproc_t) xdr_void;
188 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_msg_1_svc;
189 		break;
190 
191 	case NLM_TEST_RES:
192 		xdr_argument = (xdrproc_t) xdr_nlm_testres;
193 		xdr_result = (xdrproc_t) xdr_void;
194 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_res_1_svc;
195 		break;
196 
197 	case NLM_LOCK_RES:
198 		xdr_argument = (xdrproc_t) xdr_nlm_res;
199 		xdr_result = (xdrproc_t) xdr_void;
200 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_res_1_svc;
201 		break;
202 
203 	case NLM_CANCEL_RES:
204 		xdr_argument = (xdrproc_t) xdr_nlm_res;
205 		xdr_result = (xdrproc_t) xdr_void;
206 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_res_1_svc;
207 		break;
208 
209 	case NLM_UNLOCK_RES:
210 		xdr_argument = (xdrproc_t) xdr_nlm_res;
211 		xdr_result = (xdrproc_t) xdr_void;
212 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_res_1_svc;
213 		break;
214 
215 	case NLM_GRANTED_RES:
216 		xdr_argument = (xdrproc_t) xdr_nlm_res;
217 		xdr_result = (xdrproc_t) xdr_void;
218 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_res_1_svc;
219 		break;
220 
221 	default:
222 		svcerr_noproc(rqstp);
223 		svc_freereq(rqstp);
224 		return;
225 	}
226 	(void) memset((char *)&argument, 0, sizeof (argument));
227 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
228 		svcerr_decode(rqstp);
229 		svc_freereq(rqstp);
230 		return;
231 	}
232 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
233 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
234 		svcerr_systemerr(rqstp);
235 	}
236 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
237 		printf("unable to free arguments");
238 		//exit(1);
239 	}
240 	svc_freereq(rqstp);
241 	if (!nlm_prog_1_freeresult(transp, xdr_result, (caddr_t) &result))
242 		printf("unable to free results");
243 
244 	return;
245 }
246 
247 void
248 nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp)
249 {
250 	union {
251 		nlm_shareargs nlm_share_3_arg;
252 		nlm_shareargs nlm_unshare_3_arg;
253 		nlm_lockargs nlm_nm_lock_3_arg;
254 		nlm_notify nlm_free_all_3_arg;
255 	} argument;
256 	union {
257 		nlm_shareres nlm_share_3_res;
258 		nlm_shareres nlm_unshare_3_res;
259 		nlm_res nlm_nm_lock_3_res;
260 	} result;
261 	bool_t retval;
262 	xdrproc_t xdr_argument, xdr_result;
263 	bool_t (*local)(char *, void *, struct svc_req *);
264 
265 	switch (rqstp->rq_proc) {
266 	case NULLPROC:
267 		(void) svc_sendreply(rqstp,
268 			(xdrproc_t) xdr_void, (char *)NULL);
269 		svc_freereq(rqstp);
270 		return;
271 
272 	case NLM_TEST:
273 	case NLM_LOCK:
274 	case NLM_CANCEL:
275 	case NLM_UNLOCK:
276 	case NLM_GRANTED:
277 	case NLM_TEST_MSG:
278 	case NLM_LOCK_MSG:
279 	case NLM_CANCEL_MSG:
280 	case NLM_UNLOCK_MSG:
281 	case NLM_GRANTED_MSG:
282 	case NLM_TEST_RES:
283 	case NLM_LOCK_RES:
284 	case NLM_CANCEL_RES:
285 	case NLM_UNLOCK_RES:
286 	case NLM_GRANTED_RES:
287 		nlm_prog_1(rqstp, transp);
288 		return;
289 
290 	case NLM_SHARE:
291 		xdr_argument = (xdrproc_t) xdr_nlm_shareargs;
292 		xdr_result = (xdrproc_t) xdr_nlm_shareres;
293 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_share_3_svc;
294 		break;
295 
296 	case NLM_UNSHARE:
297 		xdr_argument = (xdrproc_t) xdr_nlm_shareargs;
298 		xdr_result = (xdrproc_t) xdr_nlm_shareres;
299 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unshare_3_svc;
300 		break;
301 
302 	case NLM_NM_LOCK:
303 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
304 		xdr_result = (xdrproc_t) xdr_nlm_res;
305 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_nm_lock_3_svc;
306 		break;
307 
308 	case NLM_FREE_ALL:
309 		xdr_argument = (xdrproc_t) xdr_nlm_notify;
310 		xdr_result = (xdrproc_t) xdr_void;
311 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_free_all_3_svc;
312 		break;
313 
314 	default:
315 		svcerr_noproc(rqstp);
316 		svc_freereq(rqstp);
317 		return;
318 	}
319 	(void) memset((char *)&argument, 0, sizeof (argument));
320 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
321 		svcerr_decode(rqstp);
322 		svc_freereq(rqstp);
323 		return;
324 	}
325 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
326 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
327 		svcerr_systemerr(rqstp);
328 	}
329 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
330 		printf("unable to free arguments");
331 		//exit(1);
332 	}
333 	svc_freereq(rqstp);
334 	if (!nlm_prog_3_freeresult(transp, xdr_result, (caddr_t) &result))
335 		printf("unable to free results");
336 
337 	return;
338 }
339 
340 void
341 nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp)
342 {
343 	union {
344 		nlm4_testargs nlm4_test_4_arg;
345 		nlm4_lockargs nlm4_lock_4_arg;
346 		nlm4_cancargs nlm4_cancel_4_arg;
347 		nlm4_unlockargs nlm4_unlock_4_arg;
348 		nlm4_testargs nlm4_granted_4_arg;
349 		nlm4_testargs nlm4_test_msg_4_arg;
350 		nlm4_lockargs nlm4_lock_msg_4_arg;
351 		nlm4_cancargs nlm4_cancel_msg_4_arg;
352 		nlm4_unlockargs nlm4_unlock_msg_4_arg;
353 		nlm4_testargs nlm4_granted_msg_4_arg;
354 		nlm4_testres nlm4_test_res_4_arg;
355 		nlm4_res nlm4_lock_res_4_arg;
356 		nlm4_res nlm4_cancel_res_4_arg;
357 		nlm4_res nlm4_unlock_res_4_arg;
358 		nlm4_res nlm4_granted_res_4_arg;
359 		nlm4_shareargs nlm4_share_4_arg;
360 		nlm4_shareargs nlm4_unshare_4_arg;
361 		nlm4_lockargs nlm4_nm_lock_4_arg;
362 		nlm4_notify nlm4_free_all_4_arg;
363 	} argument;
364 	union {
365 		nlm4_testres nlm4_test_4_res;
366 		nlm4_res nlm4_lock_4_res;
367 		nlm4_res nlm4_cancel_4_res;
368 		nlm4_res nlm4_unlock_4_res;
369 		nlm4_res nlm4_granted_4_res;
370 		nlm4_shareres nlm4_share_4_res;
371 		nlm4_shareres nlm4_unshare_4_res;
372 		nlm4_res nlm4_nm_lock_4_res;
373 	} result;
374 	bool_t retval;
375 	xdrproc_t xdr_argument, xdr_result;
376 	bool_t (*local)(char *, void *, struct svc_req *);
377 
378 	switch (rqstp->rq_proc) {
379 	case NULLPROC:
380 		(void) svc_sendreply(rqstp,
381 			(xdrproc_t) xdr_void, (char *)NULL);
382 		svc_freereq(rqstp);
383 		return;
384 
385 	case NLM4_TEST:
386 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
387 		xdr_result = (xdrproc_t) xdr_nlm4_testres;
388 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_4_svc;
389 		break;
390 
391 	case NLM4_LOCK:
392 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
393 		xdr_result = (xdrproc_t) xdr_nlm4_res;
394 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_4_svc;
395 		break;
396 
397 	case NLM4_CANCEL:
398 		xdr_argument = (xdrproc_t) xdr_nlm4_cancargs;
399 		xdr_result = (xdrproc_t) xdr_nlm4_res;
400 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_4_svc;
401 		break;
402 
403 	case NLM4_UNLOCK:
404 		xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs;
405 		xdr_result = (xdrproc_t) xdr_nlm4_res;
406 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_4_svc;
407 		break;
408 
409 	case NLM4_GRANTED:
410 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
411 		xdr_result = (xdrproc_t) xdr_nlm4_res;
412 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_4_svc;
413 		break;
414 
415 	case NLM4_TEST_MSG:
416 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
417 		xdr_result = (xdrproc_t) xdr_void;
418 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_msg_4_svc;
419 		break;
420 
421 	case NLM4_LOCK_MSG:
422 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
423 		xdr_result = (xdrproc_t) xdr_void;
424 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_msg_4_svc;
425 		break;
426 
427 	case NLM4_CANCEL_MSG:
428 		xdr_argument = (xdrproc_t) xdr_nlm4_cancargs;
429 		xdr_result = (xdrproc_t) xdr_void;
430 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_msg_4_svc;
431 		break;
432 
433 	case NLM4_UNLOCK_MSG:
434 		xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs;
435 		xdr_result = (xdrproc_t) xdr_void;
436 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_msg_4_svc;
437 		break;
438 
439 	case NLM4_GRANTED_MSG:
440 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
441 		xdr_result = (xdrproc_t) xdr_void;
442 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_msg_4_svc;
443 		break;
444 
445 	case NLM4_TEST_RES:
446 		xdr_argument = (xdrproc_t) xdr_nlm4_testres;
447 		xdr_result = (xdrproc_t) xdr_void;
448 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_res_4_svc;
449 		break;
450 
451 	case NLM4_LOCK_RES:
452 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
453 		xdr_result = (xdrproc_t) xdr_void;
454 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_res_4_svc;
455 		break;
456 
457 	case NLM4_CANCEL_RES:
458 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
459 		xdr_result = (xdrproc_t) xdr_void;
460 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_res_4_svc;
461 		break;
462 
463 	case NLM4_UNLOCK_RES:
464 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
465 		xdr_result = (xdrproc_t) xdr_void;
466 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_res_4_svc;
467 		break;
468 
469 	case NLM4_GRANTED_RES:
470 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
471 		xdr_result = (xdrproc_t) xdr_void;
472 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_res_4_svc;
473 		break;
474 
475 	case NLM4_SHARE:
476 		xdr_argument = (xdrproc_t) xdr_nlm4_shareargs;
477 		xdr_result = (xdrproc_t) xdr_nlm4_shareres;
478 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_share_4_svc;
479 		break;
480 
481 	case NLM4_UNSHARE:
482 		xdr_argument = (xdrproc_t) xdr_nlm4_shareargs;
483 		xdr_result = (xdrproc_t) xdr_nlm4_shareres;
484 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unshare_4_svc;
485 		break;
486 
487 	case NLM4_NM_LOCK:
488 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
489 		xdr_result = (xdrproc_t) xdr_nlm4_res;
490 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_nm_lock_4_svc;
491 		break;
492 
493 	case NLM4_FREE_ALL:
494 		xdr_argument = (xdrproc_t) xdr_nlm4_notify;
495 		xdr_result = (xdrproc_t) xdr_void;
496 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_free_all_4_svc;
497 		break;
498 
499 	default:
500 		svcerr_noproc(rqstp);
501 		svc_freereq(rqstp);
502 		return;
503 	}
504 	(void) memset((char *)&argument, 0, sizeof (argument));
505 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
506 		svcerr_decode(rqstp);
507 		svc_freereq(rqstp);
508 		return;
509 	}
510 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
511 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
512 		svcerr_systemerr(rqstp);
513 	}
514 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
515 		printf("unable to free arguments");
516 		//exit(1);
517 	}
518 	svc_freereq(rqstp);
519 	if (!nlm_prog_4_freeresult(transp, xdr_result, (caddr_t) &result))
520 		printf("unable to free results");
521 
522 	return;
523 }
524