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