1 /* 2 * Please do not edit this file. 3 * It was generated using rpcgen. 4 */ 5 6 #include "../common/fmd_rpc_api.h" 7 #include <stdio.h> 8 #include <stdlib.h> /* getenv, exit */ 9 #include <signal.h> 10 #include <rpc/pmap_clnt.h> /* for pmap_unset */ 11 #include <string.h> /* strcmp */ 12 #include <unistd.h> /* setsid */ 13 #include <sys/types.h> 14 #include <memory.h> 15 #include <stropts.h> 16 #include <sys/resource.h> /* rlimit */ 17 #include <syslog.h> 18 19 #ifndef SIG_PF 20 #define SIG_PF void(*)(int) 21 #endif 22 23 #ifdef DEBUG 24 #define RPC_SVC_FG 25 #endif 26 27 #define _RPCSVC_CLOSEDOWN 120 28 #pragma ident "%Z%%M% %I% %E% SMI" 29 extern void fmd_api_1(struct svc_req *, SVCXPRT *); 30 #undef RW_READ_HELD 31 #undef RW_WRITE_HELD 32 #undef RW_LOCK_HELD 33 #undef MUTEX_HELD 34 extern int _rpcpmstart; /* Started by a port monitor ? */ 35 36 /* States a server can be in wrt request */ 37 38 #define _IDLE 0 39 #define _SERVED 1 40 41 /* LINTED static unused if no main */ 42 static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */ 43 static int _rpcsvccount = 0; /* Number of requests being serviced */ 44 mutex_t _svcstate_lock; /* lock for _rpcsvcstate, _rpcsvccount */ 45 46 #if defined(RPC_MSGOUT) 47 extern void RPC_MSGOUT(const char *, ...); 48 #else /* defined(RPC_MSGOUT) */ 49 static void 50 RPC_MSGOUT(const char *fmt, char *msg) 51 { 52 #ifdef RPC_SVC_FG 53 if (_rpcpmstart) 54 syslog(LOG_ERR, fmt, msg); 55 else { 56 (void) fprintf(stderr, fmt, msg); 57 (void) putc('\n', stderr); 58 } 59 #else 60 syslog(LOG_ERR, fmt, msg); 61 #endif 62 } 63 #endif /* defined(RPC_MSGOUT) */ 64 65 int 66 _fmd_hdl_create_1( 67 int *argp, 68 void *result, 69 struct svc_req *rqstp) 70 { 71 return (fmd_hdl_create_1_svc(*argp, result, rqstp)); 72 } 73 74 void 75 fmd_api_1(struct svc_req *rqstp, register SVCXPRT *transp) 76 { 77 union { 78 int fmd_hdl_create_1_arg; 79 } argument; 80 union { 81 int fill; 82 } result; 83 bool_t retval; 84 xdrproc_t _xdr_argument, _xdr_result; 85 bool_t (*local)(char *, void *, struct svc_req *); 86 87 (void) mutex_lock(&_svcstate_lock); 88 _rpcsvccount++; 89 (void) mutex_unlock(&_svcstate_lock); 90 switch (rqstp->rq_proc) { 91 case NULLPROC: 92 (void) svc_sendreply(transp, 93 (xdrproc_t)xdr_void, NULL); 94 (void) mutex_lock(&_svcstate_lock); 95 _rpcsvccount--; 96 _rpcsvcstate = _SERVED; 97 (void) mutex_unlock(&_svcstate_lock); 98 return; /* CSTYLED */ 99 100 case FMD_HDL_CREATE: 101 _xdr_argument = (xdrproc_t) 102 xdr_int; 103 _xdr_result = (xdrproc_t) 104 xdr_void; 105 local = (bool_t (*) (char *, void *, struct svc_req *)) 106 _fmd_hdl_create_1; 107 break; 108 109 default: 110 svcerr_noproc(transp); 111 (void) mutex_lock(&_svcstate_lock); 112 _rpcsvccount--; 113 _rpcsvcstate = _SERVED; 114 (void) mutex_unlock(&_svcstate_lock); 115 return; /* CSTYLED */ 116 } 117 (void) memset((char *)&argument, 0, sizeof (argument)); 118 if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) { 119 svcerr_decode(transp); 120 (void) mutex_lock(&_svcstate_lock); 121 _rpcsvccount--; 122 _rpcsvcstate = _SERVED; 123 (void) mutex_unlock(&_svcstate_lock); 124 return; /* CSTYLED */ 125 } 126 retval = (bool_t)(*local)((char *)&argument, (void *)&result, rqstp); 127 if (_xdr_result && retval > 0 && 128 !svc_sendreply(transp, _xdr_result, (char *)&result)) { 129 svcerr_systemerr(transp); 130 } 131 if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) { 132 RPC_MSGOUT("%s", 133 "unable to free arguments"); 134 exit(1); 135 } 136 if (_xdr_result != NULL) { 137 if (!fmd_api_1_freeresult(transp, _xdr_result, 138 (caddr_t)&result)) 139 RPC_MSGOUT("%s", 140 "unable to free results"); 141 142 } 143 (void) mutex_lock(&_svcstate_lock); 144 _rpcsvccount--; 145 _rpcsvcstate = _SERVED; 146 (void) mutex_unlock(&_svcstate_lock); 147 return; /* CSTYLED */ 148 } 149