xref: /csrg-svn/usr.sbin/amd/rpcx/amq_svc.c (revision 47532)
144928Smckusick /*
2*47532Spendry  * $Id: amq_svc.c,v 5.2.1.2 91/03/17 17:39:38 jsp Alpha $
344928Smckusick  *
444928Smckusick  * Copyright (c) 1990 Jan-Simon Pendry
544928Smckusick  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
644928Smckusick  * Copyright (c) 1990 The Regents of the University of California.
744928Smckusick  * All rights reserved.
844928Smckusick  *
944928Smckusick  * This code is derived from software contributed to Berkeley by
1044928Smckusick  * Jan-Simon Pendry at Imperial College, London.
1144928Smckusick  *
1244928Smckusick  * %sccs.include.redist.c%
1344928Smckusick  *
14*47532Spendry  *	@(#)amq_svc.c	5.2 (Berkeley) 03/17/91
1544928Smckusick  */
1644928Smckusick 
1744928Smckusick #include "am.h"
1844928Smckusick #include "amq.h"
1944928Smckusick extern bool_t xdr_amq_mount_info_qelem();
2044928Smckusick 
2144928Smckusick void
2244928Smckusick amq_program_1(rqstp, transp)
2344928Smckusick 	struct svc_req *rqstp;
2444928Smckusick 	SVCXPRT *transp;
2544928Smckusick {
2644928Smckusick 	union {
2744928Smckusick 		amq_string amqproc_mnttree_1_arg;
2844928Smckusick 		amq_string amqproc_umnt_1_arg;
2944928Smckusick 		amq_setopt amqproc_setopt_1_arg;
30*47532Spendry 		amq_string amqproc_mount_1_arg;
3144928Smckusick 	} argument;
3244928Smckusick 	char *result;
3344928Smckusick 	bool_t (*xdr_argument)(), (*xdr_result)();
3444928Smckusick 	char *(*local)();
3544928Smckusick 
3644928Smckusick 	switch (rqstp->rq_proc) {
3744928Smckusick 	case AMQPROC_NULL:
3844928Smckusick 		xdr_argument = xdr_void;
3944928Smckusick 		xdr_result = xdr_void;
4044928Smckusick 		local = (char *(*)()) amqproc_null_1;
4144928Smckusick 		break;
4244928Smckusick 
4344928Smckusick 	case AMQPROC_MNTTREE:
4444928Smckusick 		xdr_argument = xdr_amq_string;
4544928Smckusick 		xdr_result = xdr_amq_mount_tree_p;
4644928Smckusick 		local = (char *(*)()) amqproc_mnttree_1;
4744928Smckusick 		break;
4844928Smckusick 
4944928Smckusick 	case AMQPROC_UMNT:
5044928Smckusick 		xdr_argument = xdr_amq_string;
5144928Smckusick 		xdr_result = xdr_void;
5244928Smckusick 		local = (char *(*)()) amqproc_umnt_1;
5344928Smckusick 		break;
5444928Smckusick 
5544928Smckusick 	case AMQPROC_STATS:
5644928Smckusick 		xdr_argument = xdr_void;
5744928Smckusick 		xdr_result = xdr_amq_mount_stats;
5844928Smckusick 		local = (char *(*)()) amqproc_stats_1;
5944928Smckusick 		break;
6044928Smckusick 
6144928Smckusick 	case AMQPROC_EXPORT:
6244928Smckusick 		xdr_argument = xdr_void;
6344928Smckusick 		xdr_result = xdr_amq_mount_tree_list;
6444928Smckusick 		local = (char *(*)()) amqproc_export_1;
6544928Smckusick 		break;
6644928Smckusick 
6744928Smckusick 	case AMQPROC_SETOPT:
6844928Smckusick 		xdr_argument = xdr_amq_setopt;
6944928Smckusick 		xdr_result = xdr_int;
7044928Smckusick 		local = (char *(*)()) amqproc_setopt_1;
7144928Smckusick 		break;
7244928Smckusick 
7344928Smckusick 	case AMQPROC_GETMNTFS:
7444928Smckusick 		xdr_argument = xdr_void;
7544928Smckusick 		xdr_result = xdr_amq_mount_info_qelem;
7644928Smckusick 		local = (char *(*)()) amqproc_getmntfs_1;
7744928Smckusick 		break;
7844928Smckusick 
79*47532Spendry 	case AMQPROC_MOUNT:
80*47532Spendry 		xdr_argument = xdr_amq_string;
81*47532Spendry 		xdr_result = xdr_int;
82*47532Spendry 		local = (char *(*)()) amqproc_mount_1;
83*47532Spendry 		break;
84*47532Spendry 
85*47532Spendry 	case AMQPROC_GETVERS:
86*47532Spendry 		xdr_argument = xdr_void;
87*47532Spendry 		xdr_result = xdr_amq_string;
88*47532Spendry 		local = (char *(*)()) amqproc_getvers_1;
89*47532Spendry 		break;
90*47532Spendry 
9144928Smckusick 	default:
9244928Smckusick 		svcerr_noproc(transp);
9344928Smckusick 		return;
9444928Smckusick 	}
9544928Smckusick 	bzero((char *)&argument, sizeof(argument));
9644928Smckusick 	if (!svc_getargs(transp, xdr_argument, &argument)) {
9744928Smckusick 		svcerr_decode(transp);
9844928Smckusick 		return;
9944928Smckusick 	}
10044928Smckusick 	result = (*local)(&argument, rqstp);
10144928Smckusick 	if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
10244928Smckusick 		svcerr_systemerr(transp);
10344928Smckusick 	}
10444928Smckusick 	if (!svc_freeargs(transp, xdr_argument, &argument)) {
10544928Smckusick 		plog(XLOG_FATAL, "unable to free rpc arguments in amqprog_1");
10644928Smckusick 		going_down(1);
10744928Smckusick 	}
10844928Smckusick }
10944928Smckusick 
110