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