1 /* 2 * $Id: amq_svc.c,v 5.2 90/06/23 22:20:17 jsp Rel $ 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.1 (Berkeley) 07/19/90 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 } argument; 31 char *result; 32 bool_t (*xdr_argument)(), (*xdr_result)(); 33 char *(*local)(); 34 35 switch (rqstp->rq_proc) { 36 case AMQPROC_NULL: 37 xdr_argument = xdr_void; 38 xdr_result = xdr_void; 39 local = (char *(*)()) amqproc_null_1; 40 break; 41 42 case AMQPROC_MNTTREE: 43 xdr_argument = xdr_amq_string; 44 xdr_result = xdr_amq_mount_tree_p; 45 local = (char *(*)()) amqproc_mnttree_1; 46 break; 47 48 case AMQPROC_UMNT: 49 xdr_argument = xdr_amq_string; 50 xdr_result = xdr_void; 51 local = (char *(*)()) amqproc_umnt_1; 52 break; 53 54 case AMQPROC_STATS: 55 xdr_argument = xdr_void; 56 xdr_result = xdr_amq_mount_stats; 57 local = (char *(*)()) amqproc_stats_1; 58 break; 59 60 case AMQPROC_EXPORT: 61 xdr_argument = xdr_void; 62 xdr_result = xdr_amq_mount_tree_list; 63 local = (char *(*)()) amqproc_export_1; 64 break; 65 66 case AMQPROC_SETOPT: 67 xdr_argument = xdr_amq_setopt; 68 xdr_result = xdr_int; 69 local = (char *(*)()) amqproc_setopt_1; 70 break; 71 72 case AMQPROC_GETMNTFS: 73 xdr_argument = xdr_void; 74 xdr_result = xdr_amq_mount_info_qelem; 75 local = (char *(*)()) amqproc_getmntfs_1; 76 break; 77 78 default: 79 svcerr_noproc(transp); 80 return; 81 } 82 bzero((char *)&argument, sizeof(argument)); 83 if (!svc_getargs(transp, xdr_argument, &argument)) { 84 svcerr_decode(transp); 85 return; 86 } 87 result = (*local)(&argument, rqstp); 88 if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { 89 svcerr_systemerr(transp); 90 } 91 if (!svc_freeargs(transp, xdr_argument, &argument)) { 92 plog(XLOG_FATAL, "unable to free rpc arguments in amqprog_1"); 93 going_down(1); 94 } 95 } 96 97