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