xref: /freebsd/sys/nlm/nlm_prot_svc.c (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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 /*static char sccsid[] = "from: @(#)nlm_prot.x 1.8 87/09/21 Copyr 1987 Sun Micro";*/
39 /*static char sccsid[] = "from: * @(#)nlm_prot.x	2.1 88/08/01 4.0 RPCSRC";*/
40 __RCSID("$NetBSD: nlm_prot.x,v 1.6 2000/06/07 14:30:15 bouyer Exp $");
41 #endif /* not lint */
42 __FBSDID("$FreeBSD$");
43 
44 void nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp);
45 void nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp);
46 void nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp);
47 void nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp);
48 
49 void
50 nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp)
51 {
52 	union {
53 		struct nlm_sm_status nlm_sm_notify_0_arg;
54 	} argument;
55 	char result;
56 	bool_t retval;
57 	xdrproc_t xdr_argument, xdr_result;
58 	bool_t (*local)(char *, void *, struct svc_req *);
59 
60 	switch (rqstp->rq_proc) {
61 	case NULLPROC:
62 		(void) svc_sendreply(rqstp,
63 			(xdrproc_t) xdr_void, (char *)NULL);
64 		svc_freereq(rqstp);
65 		return;
66 
67 	case NLM_SM_NOTIFY:
68 		xdr_argument = (xdrproc_t) xdr_nlm_sm_status;
69 		xdr_result = (xdrproc_t) xdr_void;
70 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_sm_notify_0_svc;
71 		break;
72 
73 	default:
74 		svcerr_noproc(rqstp);
75 		svc_freereq(rqstp);
76 		return;
77 	}
78 	(void) memset((char *)&argument, 0, sizeof (argument));
79 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
80 		svcerr_decode(rqstp);
81 		svc_freereq(rqstp);
82 		return;
83 	}
84 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
85 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
86 		svcerr_systemerr(rqstp);
87 	}
88 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
89 		printf("unable to free arguments");
90 		//exit(1);
91 	}
92 	svc_freereq(rqstp);
93 
94 	return;
95 }
96 
97 void
98 nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp)
99 {
100 	union {
101 		struct nlm_testargs nlm_test_1_arg;
102 		struct nlm_lockargs nlm_lock_1_arg;
103 		struct nlm_cancargs nlm_cancel_1_arg;
104 		struct nlm_unlockargs nlm_unlock_1_arg;
105 		struct nlm_testargs nlm_granted_1_arg;
106 		struct nlm_testargs nlm_test_msg_1_arg;
107 		struct nlm_lockargs nlm_lock_msg_1_arg;
108 		struct nlm_cancargs nlm_cancel_msg_1_arg;
109 		struct nlm_unlockargs nlm_unlock_msg_1_arg;
110 		struct nlm_testargs nlm_granted_msg_1_arg;
111 		nlm_testres nlm_test_res_1_arg;
112 		nlm_res nlm_lock_res_1_arg;
113 		nlm_res nlm_cancel_res_1_arg;
114 		nlm_res nlm_unlock_res_1_arg;
115 		nlm_res nlm_granted_res_1_arg;
116 	} argument;
117 	union {
118 		nlm_testres nlm_test_1_res;
119 		nlm_res nlm_lock_1_res;
120 		nlm_res nlm_cancel_1_res;
121 		nlm_res nlm_unlock_1_res;
122 		nlm_res nlm_granted_1_res;
123 	} result;
124 	bool_t retval;
125 	xdrproc_t xdr_argument, xdr_result;
126 	bool_t (*local)(char *, void *, struct svc_req *);
127 
128 	switch (rqstp->rq_proc) {
129 	case NULLPROC:
130 		(void) svc_sendreply(rqstp,
131 			(xdrproc_t) xdr_void, (char *)NULL);
132 		svc_freereq(rqstp);
133 		return;
134 
135 	case NLM_TEST:
136 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
137 		xdr_result = (xdrproc_t) xdr_nlm_testres;
138 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_1_svc;
139 		break;
140 
141 	case NLM_LOCK:
142 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
143 		xdr_result = (xdrproc_t) xdr_nlm_res;
144 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_1_svc;
145 		break;
146 
147 	case NLM_CANCEL:
148 		xdr_argument = (xdrproc_t) xdr_nlm_cancargs;
149 		xdr_result = (xdrproc_t) xdr_nlm_res;
150 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_1_svc;
151 		break;
152 
153 	case NLM_UNLOCK:
154 		xdr_argument = (xdrproc_t) xdr_nlm_unlockargs;
155 		xdr_result = (xdrproc_t) xdr_nlm_res;
156 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_1_svc;
157 		break;
158 
159 	case NLM_GRANTED:
160 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
161 		xdr_result = (xdrproc_t) xdr_nlm_res;
162 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_1_svc;
163 		break;
164 
165 	case NLM_TEST_MSG:
166 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
167 		xdr_result = (xdrproc_t) xdr_void;
168 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_msg_1_svc;
169 		break;
170 
171 	case NLM_LOCK_MSG:
172 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
173 		xdr_result = (xdrproc_t) xdr_void;
174 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_msg_1_svc;
175 		break;
176 
177 	case NLM_CANCEL_MSG:
178 		xdr_argument = (xdrproc_t) xdr_nlm_cancargs;
179 		xdr_result = (xdrproc_t) xdr_void;
180 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_msg_1_svc;
181 		break;
182 
183 	case NLM_UNLOCK_MSG:
184 		xdr_argument = (xdrproc_t) xdr_nlm_unlockargs;
185 		xdr_result = (xdrproc_t) xdr_void;
186 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_msg_1_svc;
187 		break;
188 
189 	case NLM_GRANTED_MSG:
190 		xdr_argument = (xdrproc_t) xdr_nlm_testargs;
191 		xdr_result = (xdrproc_t) xdr_void;
192 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_msg_1_svc;
193 		break;
194 
195 	case NLM_TEST_RES:
196 		xdr_argument = (xdrproc_t) xdr_nlm_testres;
197 		xdr_result = (xdrproc_t) xdr_void;
198 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_test_res_1_svc;
199 		break;
200 
201 	case NLM_LOCK_RES:
202 		xdr_argument = (xdrproc_t) xdr_nlm_res;
203 		xdr_result = (xdrproc_t) xdr_void;
204 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_lock_res_1_svc;
205 		break;
206 
207 	case NLM_CANCEL_RES:
208 		xdr_argument = (xdrproc_t) xdr_nlm_res;
209 		xdr_result = (xdrproc_t) xdr_void;
210 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_cancel_res_1_svc;
211 		break;
212 
213 	case NLM_UNLOCK_RES:
214 		xdr_argument = (xdrproc_t) xdr_nlm_res;
215 		xdr_result = (xdrproc_t) xdr_void;
216 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unlock_res_1_svc;
217 		break;
218 
219 	case NLM_GRANTED_RES:
220 		xdr_argument = (xdrproc_t) xdr_nlm_res;
221 		xdr_result = (xdrproc_t) xdr_void;
222 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_granted_res_1_svc;
223 		break;
224 
225 	default:
226 		svcerr_noproc(rqstp);
227 		svc_freereq(rqstp);
228 		return;
229 	}
230 	(void) memset((char *)&argument, 0, sizeof (argument));
231 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
232 		svcerr_decode(rqstp);
233 		svc_freereq(rqstp);
234 		return;
235 	}
236 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
237 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
238 		svcerr_systemerr(rqstp);
239 	}
240 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
241 		printf("unable to free arguments");
242 		//exit(1);
243 	}
244 	svc_freereq(rqstp);
245 	if (!nlm_prog_1_freeresult(transp, xdr_result, (caddr_t) &result))
246 		printf("unable to free results");
247 
248 	return;
249 }
250 
251 void
252 nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp)
253 {
254 	union {
255 		nlm_shareargs nlm_share_3_arg;
256 		nlm_shareargs nlm_unshare_3_arg;
257 		nlm_lockargs nlm_nm_lock_3_arg;
258 		nlm_notify nlm_free_all_3_arg;
259 	} argument;
260 	union {
261 		nlm_shareres nlm_share_3_res;
262 		nlm_shareres nlm_unshare_3_res;
263 		nlm_res nlm_nm_lock_3_res;
264 	} result;
265 	bool_t retval;
266 	xdrproc_t xdr_argument, xdr_result;
267 	bool_t (*local)(char *, void *, struct svc_req *);
268 
269 	switch (rqstp->rq_proc) {
270 	case NULLPROC:
271 		(void) svc_sendreply(rqstp,
272 			(xdrproc_t) xdr_void, (char *)NULL);
273 		svc_freereq(rqstp);
274 		return;
275 
276 	case NLM_TEST:
277 	case NLM_LOCK:
278 	case NLM_CANCEL:
279 	case NLM_UNLOCK:
280 	case NLM_GRANTED:
281 	case NLM_TEST_MSG:
282 	case NLM_LOCK_MSG:
283 	case NLM_CANCEL_MSG:
284 	case NLM_UNLOCK_MSG:
285 	case NLM_GRANTED_MSG:
286 	case NLM_TEST_RES:
287 	case NLM_LOCK_RES:
288 	case NLM_CANCEL_RES:
289 	case NLM_UNLOCK_RES:
290 	case NLM_GRANTED_RES:
291 		nlm_prog_1(rqstp, transp);
292 		return;
293 
294 	case NLM_SHARE:
295 		xdr_argument = (xdrproc_t) xdr_nlm_shareargs;
296 		xdr_result = (xdrproc_t) xdr_nlm_shareres;
297 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_share_3_svc;
298 		break;
299 
300 	case NLM_UNSHARE:
301 		xdr_argument = (xdrproc_t) xdr_nlm_shareargs;
302 		xdr_result = (xdrproc_t) xdr_nlm_shareres;
303 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_unshare_3_svc;
304 		break;
305 
306 	case NLM_NM_LOCK:
307 		xdr_argument = (xdrproc_t) xdr_nlm_lockargs;
308 		xdr_result = (xdrproc_t) xdr_nlm_res;
309 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_nm_lock_3_svc;
310 		break;
311 
312 	case NLM_FREE_ALL:
313 		xdr_argument = (xdrproc_t) xdr_nlm_notify;
314 		xdr_result = (xdrproc_t) xdr_void;
315 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm_free_all_3_svc;
316 		break;
317 
318 	default:
319 		svcerr_noproc(rqstp);
320 		svc_freereq(rqstp);
321 		return;
322 	}
323 	(void) memset((char *)&argument, 0, sizeof (argument));
324 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
325 		svcerr_decode(rqstp);
326 		svc_freereq(rqstp);
327 		return;
328 	}
329 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
330 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
331 		svcerr_systemerr(rqstp);
332 	}
333 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
334 		printf("unable to free arguments");
335 		//exit(1);
336 	}
337 	svc_freereq(rqstp);
338 	if (!nlm_prog_3_freeresult(transp, xdr_result, (caddr_t) &result))
339 		printf("unable to free results");
340 
341 	return;
342 }
343 
344 void
345 nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp)
346 {
347 	union {
348 		nlm4_testargs nlm4_test_4_arg;
349 		nlm4_lockargs nlm4_lock_4_arg;
350 		nlm4_cancargs nlm4_cancel_4_arg;
351 		nlm4_unlockargs nlm4_unlock_4_arg;
352 		nlm4_testargs nlm4_granted_4_arg;
353 		nlm4_testargs nlm4_test_msg_4_arg;
354 		nlm4_lockargs nlm4_lock_msg_4_arg;
355 		nlm4_cancargs nlm4_cancel_msg_4_arg;
356 		nlm4_unlockargs nlm4_unlock_msg_4_arg;
357 		nlm4_testargs nlm4_granted_msg_4_arg;
358 		nlm4_testres nlm4_test_res_4_arg;
359 		nlm4_res nlm4_lock_res_4_arg;
360 		nlm4_res nlm4_cancel_res_4_arg;
361 		nlm4_res nlm4_unlock_res_4_arg;
362 		nlm4_res nlm4_granted_res_4_arg;
363 		nlm4_shareargs nlm4_share_4_arg;
364 		nlm4_shareargs nlm4_unshare_4_arg;
365 		nlm4_lockargs nlm4_nm_lock_4_arg;
366 		nlm4_notify nlm4_free_all_4_arg;
367 	} argument;
368 	union {
369 		nlm4_testres nlm4_test_4_res;
370 		nlm4_res nlm4_lock_4_res;
371 		nlm4_res nlm4_cancel_4_res;
372 		nlm4_res nlm4_unlock_4_res;
373 		nlm4_res nlm4_granted_4_res;
374 		nlm4_shareres nlm4_share_4_res;
375 		nlm4_shareres nlm4_unshare_4_res;
376 		nlm4_res nlm4_nm_lock_4_res;
377 	} result;
378 	bool_t retval;
379 	xdrproc_t xdr_argument, xdr_result;
380 	bool_t (*local)(char *, void *, struct svc_req *);
381 
382 	switch (rqstp->rq_proc) {
383 	case NULLPROC:
384 		(void) svc_sendreply(rqstp,
385 			(xdrproc_t) xdr_void, (char *)NULL);
386 		svc_freereq(rqstp);
387 		return;
388 
389 	case NLM4_TEST:
390 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
391 		xdr_result = (xdrproc_t) xdr_nlm4_testres;
392 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_4_svc;
393 		break;
394 
395 	case NLM4_LOCK:
396 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
397 		xdr_result = (xdrproc_t) xdr_nlm4_res;
398 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_4_svc;
399 		break;
400 
401 	case NLM4_CANCEL:
402 		xdr_argument = (xdrproc_t) xdr_nlm4_cancargs;
403 		xdr_result = (xdrproc_t) xdr_nlm4_res;
404 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_4_svc;
405 		break;
406 
407 	case NLM4_UNLOCK:
408 		xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs;
409 		xdr_result = (xdrproc_t) xdr_nlm4_res;
410 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_4_svc;
411 		break;
412 
413 	case NLM4_GRANTED:
414 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
415 		xdr_result = (xdrproc_t) xdr_nlm4_res;
416 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_4_svc;
417 		break;
418 
419 	case NLM4_TEST_MSG:
420 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
421 		xdr_result = (xdrproc_t) xdr_void;
422 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_msg_4_svc;
423 		break;
424 
425 	case NLM4_LOCK_MSG:
426 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
427 		xdr_result = (xdrproc_t) xdr_void;
428 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_msg_4_svc;
429 		break;
430 
431 	case NLM4_CANCEL_MSG:
432 		xdr_argument = (xdrproc_t) xdr_nlm4_cancargs;
433 		xdr_result = (xdrproc_t) xdr_void;
434 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_msg_4_svc;
435 		break;
436 
437 	case NLM4_UNLOCK_MSG:
438 		xdr_argument = (xdrproc_t) xdr_nlm4_unlockargs;
439 		xdr_result = (xdrproc_t) xdr_void;
440 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_msg_4_svc;
441 		break;
442 
443 	case NLM4_GRANTED_MSG:
444 		xdr_argument = (xdrproc_t) xdr_nlm4_testargs;
445 		xdr_result = (xdrproc_t) xdr_void;
446 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_msg_4_svc;
447 		break;
448 
449 	case NLM4_TEST_RES:
450 		xdr_argument = (xdrproc_t) xdr_nlm4_testres;
451 		xdr_result = (xdrproc_t) xdr_void;
452 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_test_res_4_svc;
453 		break;
454 
455 	case NLM4_LOCK_RES:
456 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
457 		xdr_result = (xdrproc_t) xdr_void;
458 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_lock_res_4_svc;
459 		break;
460 
461 	case NLM4_CANCEL_RES:
462 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
463 		xdr_result = (xdrproc_t) xdr_void;
464 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_cancel_res_4_svc;
465 		break;
466 
467 	case NLM4_UNLOCK_RES:
468 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
469 		xdr_result = (xdrproc_t) xdr_void;
470 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unlock_res_4_svc;
471 		break;
472 
473 	case NLM4_GRANTED_RES:
474 		xdr_argument = (xdrproc_t) xdr_nlm4_res;
475 		xdr_result = (xdrproc_t) xdr_void;
476 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_granted_res_4_svc;
477 		break;
478 
479 	case NLM4_SHARE:
480 		xdr_argument = (xdrproc_t) xdr_nlm4_shareargs;
481 		xdr_result = (xdrproc_t) xdr_nlm4_shareres;
482 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_share_4_svc;
483 		break;
484 
485 	case NLM4_UNSHARE:
486 		xdr_argument = (xdrproc_t) xdr_nlm4_shareargs;
487 		xdr_result = (xdrproc_t) xdr_nlm4_shareres;
488 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_unshare_4_svc;
489 		break;
490 
491 	case NLM4_NM_LOCK:
492 		xdr_argument = (xdrproc_t) xdr_nlm4_lockargs;
493 		xdr_result = (xdrproc_t) xdr_nlm4_res;
494 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_nm_lock_4_svc;
495 		break;
496 
497 	case NLM4_FREE_ALL:
498 		xdr_argument = (xdrproc_t) xdr_nlm4_notify;
499 		xdr_result = (xdrproc_t) xdr_void;
500 		local = (bool_t (*) (char *,  void *,  struct svc_req *))nlm4_free_all_4_svc;
501 		break;
502 
503 	default:
504 		svcerr_noproc(rqstp);
505 		svc_freereq(rqstp);
506 		return;
507 	}
508 	(void) memset((char *)&argument, 0, sizeof (argument));
509 	if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
510 		svcerr_decode(rqstp);
511 		svc_freereq(rqstp);
512 		return;
513 	}
514 	retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
515 	if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
516 		svcerr_systemerr(rqstp);
517 	}
518 	if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
519 		printf("unable to free arguments");
520 		//exit(1);
521 	}
522 	svc_freereq(rqstp);
523 	if (!nlm_prog_4_freeresult(transp, xdr_result, (caddr_t) &result))
524 		printf("unable to free results");
525 
526 	return;
527 }
528