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