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