xref: /csrg-svn/usr.sbin/amd/rpcx/amq_svc.c (revision 44928)
1*44928Smckusick /*
2*44928Smckusick  * $Id: amq_svc.c,v 5.2 90/06/23 22:20:17 jsp Rel $
3*44928Smckusick  *
4*44928Smckusick  * Copyright (c) 1990 Jan-Simon Pendry
5*44928Smckusick  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
6*44928Smckusick  * Copyright (c) 1990 The Regents of the University of California.
7*44928Smckusick  * All rights reserved.
8*44928Smckusick  *
9*44928Smckusick  * This code is derived from software contributed to Berkeley by
10*44928Smckusick  * Jan-Simon Pendry at Imperial College, London.
11*44928Smckusick  *
12*44928Smckusick  * %sccs.include.redist.c%
13*44928Smckusick  *
14*44928Smckusick  *	@(#)amq_svc.c	5.1 (Berkeley) 07/19/90
15*44928Smckusick  */
16*44928Smckusick 
17*44928Smckusick #include "am.h"
18*44928Smckusick #include "amq.h"
19*44928Smckusick extern bool_t xdr_amq_mount_info_qelem();
20*44928Smckusick 
21*44928Smckusick void
22*44928Smckusick amq_program_1(rqstp, transp)
23*44928Smckusick 	struct svc_req *rqstp;
24*44928Smckusick 	SVCXPRT *transp;
25*44928Smckusick {
26*44928Smckusick 	union {
27*44928Smckusick 		amq_string amqproc_mnttree_1_arg;
28*44928Smckusick 		amq_string amqproc_umnt_1_arg;
29*44928Smckusick 		amq_setopt amqproc_setopt_1_arg;
30*44928Smckusick 	} argument;
31*44928Smckusick 	char *result;
32*44928Smckusick 	bool_t (*xdr_argument)(), (*xdr_result)();
33*44928Smckusick 	char *(*local)();
34*44928Smckusick 
35*44928Smckusick 	switch (rqstp->rq_proc) {
36*44928Smckusick 	case AMQPROC_NULL:
37*44928Smckusick 		xdr_argument = xdr_void;
38*44928Smckusick 		xdr_result = xdr_void;
39*44928Smckusick 		local = (char *(*)()) amqproc_null_1;
40*44928Smckusick 		break;
41*44928Smckusick 
42*44928Smckusick 	case AMQPROC_MNTTREE:
43*44928Smckusick 		xdr_argument = xdr_amq_string;
44*44928Smckusick 		xdr_result = xdr_amq_mount_tree_p;
45*44928Smckusick 		local = (char *(*)()) amqproc_mnttree_1;
46*44928Smckusick 		break;
47*44928Smckusick 
48*44928Smckusick 	case AMQPROC_UMNT:
49*44928Smckusick 		xdr_argument = xdr_amq_string;
50*44928Smckusick 		xdr_result = xdr_void;
51*44928Smckusick 		local = (char *(*)()) amqproc_umnt_1;
52*44928Smckusick 		break;
53*44928Smckusick 
54*44928Smckusick 	case AMQPROC_STATS:
55*44928Smckusick 		xdr_argument = xdr_void;
56*44928Smckusick 		xdr_result = xdr_amq_mount_stats;
57*44928Smckusick 		local = (char *(*)()) amqproc_stats_1;
58*44928Smckusick 		break;
59*44928Smckusick 
60*44928Smckusick 	case AMQPROC_EXPORT:
61*44928Smckusick 		xdr_argument = xdr_void;
62*44928Smckusick 		xdr_result = xdr_amq_mount_tree_list;
63*44928Smckusick 		local = (char *(*)()) amqproc_export_1;
64*44928Smckusick 		break;
65*44928Smckusick 
66*44928Smckusick 	case AMQPROC_SETOPT:
67*44928Smckusick 		xdr_argument = xdr_amq_setopt;
68*44928Smckusick 		xdr_result = xdr_int;
69*44928Smckusick 		local = (char *(*)()) amqproc_setopt_1;
70*44928Smckusick 		break;
71*44928Smckusick 
72*44928Smckusick 	case AMQPROC_GETMNTFS:
73*44928Smckusick 		xdr_argument = xdr_void;
74*44928Smckusick 		xdr_result = xdr_amq_mount_info_qelem;
75*44928Smckusick 		local = (char *(*)()) amqproc_getmntfs_1;
76*44928Smckusick 		break;
77*44928Smckusick 
78*44928Smckusick 	default:
79*44928Smckusick 		svcerr_noproc(transp);
80*44928Smckusick 		return;
81*44928Smckusick 	}
82*44928Smckusick 	bzero((char *)&argument, sizeof(argument));
83*44928Smckusick 	if (!svc_getargs(transp, xdr_argument, &argument)) {
84*44928Smckusick 		svcerr_decode(transp);
85*44928Smckusick 		return;
86*44928Smckusick 	}
87*44928Smckusick 	result = (*local)(&argument, rqstp);
88*44928Smckusick 	if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
89*44928Smckusick 		svcerr_systemerr(transp);
90*44928Smckusick 	}
91*44928Smckusick 	if (!svc_freeargs(transp, xdr_argument, &argument)) {
92*44928Smckusick 		plog(XLOG_FATAL, "unable to free rpc arguments in amqprog_1");
93*44928Smckusick 		going_down(1);
94*44928Smckusick 	}
95*44928Smckusick }
96*44928Smckusick 
97