nlm_prot_svc.c revision 177633
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_prot.h"
32#include "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: head/sys/nlm/nlm_prot_svc.c 177633 2008-03-26 15:23:12Z dfr $");
41
42void nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp);
43void nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp);
44void nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp);
45void nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp);
46
47void
48nlm_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
91void
92nlm_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
241void
242nlm_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
330void
331nlm_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