1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 /*
27 * Please do not edit this file.
28 * It was generated using rpcgen.
29 * Edit idmap_prot.x and rebuild this file with
30 * rpcgen -CMNm -o idmap_prot_svc.c.new ../../../uts/common/rpcsvc/idmap_prot.x
31 * then merge as required. A recent version of rpcgen is needed to
32 * produce this exact file; when the revised rpcgen is available in the
33 * build environment this file can be built automatically.
34 */
35
36 #include "../../../uts/common/rpcsvc/idmap_prot.h"
37 #include <stdio.h>
38 #include <stdlib.h> /* getenv, exit */
39 #include <signal.h>
40 #include <rpc/pmap_clnt.h> /* for pmap_unset */
41 #include <string.h> /* strcmp */
42 #include <unistd.h> /* setsid */
43 #include <sys/types.h>
44 #include <memory.h>
45 #include <stropts.h>
46 #include <sys/resource.h> /* rlimit */
47 #include <syslog.h>
48
49 #ifndef SIG_PF
50 #define SIG_PF void(*)(int)
51 #endif
52
53 #ifdef DEBUG
54 #define RPC_SVC_FG
55 #endif
56
57 #define _RPCSVC_CLOSEDOWN 120
58 extern int _rpcpmstart; /* Started by a port monitor ? */
59
60 /* States a server can be in wrt request */
61
62 #define _IDLE 0
63 #define _SERVED 1
64
65 /* LINTED static unused if no main */
66 static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */
67 static int _rpcsvccount = 0; /* Number of requests being serviced */
68 mutex_t _svcstate_lock; /* lock for _rpcsvcstate, _rpcsvccount */
69
70 #if defined(RPC_MSGOUT)
71 extern void RPC_MSGOUT(const char *, ...);
72 #else /* defined(RPC_MSGOUT) */
73 static void
RPC_MSGOUT(const char * fmt,char * msg)74 RPC_MSGOUT(const char *fmt, char *msg)
75 {
76 #ifdef RPC_SVC_FG
77 if (_rpcpmstart)
78 syslog(LOG_ERR, fmt, msg);
79 else {
80 (void) fprintf(stderr, fmt, msg);
81 (void) putc('\n', stderr);
82 }
83 #else
84 syslog(LOG_ERR, fmt, msg);
85 #endif
86 }
87 #endif /* defined(RPC_MSGOUT) */
88
89 /* ARGSUSED */
90 int
_idmap_null_1(void * argp,void * result,struct svc_req * rqstp)91 _idmap_null_1(
92 void *argp,
93 void *result,
94 struct svc_req *rqstp)
95 {
96 return (idmap_null_1_svc(result, rqstp));
97 }
98
99 int
_idmap_get_mapped_ids_1(idmap_mapping_batch * argp,idmap_ids_res * result,struct svc_req * rqstp)100 _idmap_get_mapped_ids_1(
101 idmap_mapping_batch *argp,
102 idmap_ids_res *result,
103 struct svc_req *rqstp)
104 {
105 return (idmap_get_mapped_ids_1_svc(*argp, result, rqstp));
106 }
107
108 int
_idmap_list_mappings_1(idmap_list_mappings_1_argument * argp,idmap_mappings_res * result,struct svc_req * rqstp)109 _idmap_list_mappings_1(
110 idmap_list_mappings_1_argument *argp,
111 idmap_mappings_res *result,
112 struct svc_req *rqstp)
113 {
114 return (idmap_list_mappings_1_svc(
115 argp->lastrowid,
116 argp->limit,
117 argp->flag,
118 result, rqstp));
119 }
120
121 int
_idmap_list_namerules_1(idmap_list_namerules_1_argument * argp,idmap_namerules_res * result,struct svc_req * rqstp)122 _idmap_list_namerules_1(
123 idmap_list_namerules_1_argument *argp,
124 idmap_namerules_res *result,
125 struct svc_req *rqstp)
126 {
127 return (idmap_list_namerules_1_svc(
128 argp->rule,
129 argp->lastrowid,
130 argp->limit,
131 result, rqstp));
132 }
133
134 int
_idmap_update_1(idmap_update_batch * argp,idmap_update_res * result,struct svc_req * rqstp)135 _idmap_update_1(
136 idmap_update_batch *argp,
137 idmap_update_res *result,
138 struct svc_req *rqstp)
139 {
140 return (idmap_update_1_svc(*argp, result, rqstp));
141 }
142
143 int
_idmap_get_mapped_id_by_name_1(idmap_mapping * argp,idmap_mappings_res * result,struct svc_req * rqstp)144 _idmap_get_mapped_id_by_name_1(
145 idmap_mapping *argp,
146 idmap_mappings_res *result,
147 struct svc_req *rqstp)
148 {
149 return (idmap_get_mapped_id_by_name_1_svc(*argp, result, rqstp));
150 }
151
152 int
_idmap_get_prop_1(idmap_prop_type * argp,idmap_prop_res * result,struct svc_req * rqstp)153 _idmap_get_prop_1(
154 idmap_prop_type *argp,
155 idmap_prop_res *result,
156 struct svc_req *rqstp)
157 {
158 return (idmap_get_prop_1_svc(*argp, result, rqstp));
159 }
160
161 int
_directory_get_common_1(directory_get_common_1_argument * argp,directory_results_rpc * result,struct svc_req * rqstp)162 _directory_get_common_1(
163 directory_get_common_1_argument *argp,
164 directory_results_rpc *result,
165 struct svc_req *rqstp)
166 {
167 return (directory_get_common_1_svc(
168 argp->ids,
169 argp->types,
170 argp->attrs,
171 result, rqstp));
172 }
173
174 int
_idmap_flush_1(idmap_flush_op * argp,idmap_retcode * result,struct svc_req * rqstp)175 _idmap_flush_1(
176 idmap_flush_op *argp,
177 idmap_retcode *result,
178 struct svc_req *rqstp)
179 {
180 return (idmap_flush_1_svc(*argp, result, rqstp));
181 }
182
183 void
idmap_prog_1(struct svc_req * rqstp,register SVCXPRT * transp)184 idmap_prog_1(struct svc_req *rqstp, register SVCXPRT *transp)
185 {
186 union {
187 idmap_mapping_batch idmap_get_mapped_ids_1_arg;
188 idmap_list_mappings_1_argument idmap_list_mappings_1_arg;
189 idmap_list_namerules_1_argument idmap_list_namerules_1_arg;
190 idmap_update_batch idmap_update_1_arg;
191 idmap_mapping idmap_get_mapped_id_by_name_1_arg;
192 idmap_prop_type idmap_get_prop_1_arg;
193 directory_get_common_1_argument directory_get_common_1_arg;
194 idmap_flush_op idmap_flush_1_arg;
195 } argument;
196 union {
197 idmap_ids_res idmap_get_mapped_ids_1_res;
198 idmap_mappings_res idmap_list_mappings_1_res;
199 idmap_namerules_res idmap_list_namerules_1_res;
200 idmap_update_res idmap_update_1_res;
201 idmap_mappings_res idmap_get_mapped_id_by_name_1_res;
202 idmap_prop_res idmap_get_prop_1_res;
203 directory_results_rpc directory_get_common_1_res;
204 idmap_retcode idmap_flush_1_res;
205 } result;
206 bool_t retval;
207 xdrproc_t _xdr_argument, _xdr_result;
208 bool_t (*local)(char *, void *, struct svc_req *);
209
210 (void) mutex_lock(&_svcstate_lock);
211 _rpcsvccount++;
212 (void) mutex_unlock(&_svcstate_lock);
213 switch (rqstp->rq_proc) {
214 case IDMAP_NULL:
215 _xdr_argument = (xdrproc_t)
216 xdr_void;
217 _xdr_result = (xdrproc_t)
218 xdr_void;
219 local = (bool_t (*) (char *, void *, struct svc_req *))
220 _idmap_null_1;
221 break;
222
223 case IDMAP_GET_MAPPED_IDS:
224 _xdr_argument = (xdrproc_t)
225 xdr_idmap_mapping_batch;
226 _xdr_result = (xdrproc_t)
227 xdr_idmap_ids_res;
228 local = (bool_t (*) (char *, void *, struct svc_req *))
229 _idmap_get_mapped_ids_1;
230 break;
231
232 case IDMAP_LIST_MAPPINGS:
233 _xdr_argument = (xdrproc_t)
234 xdr_idmap_list_mappings_1_argument;
235 _xdr_result = (xdrproc_t)
236 xdr_idmap_mappings_res;
237 local = (bool_t (*) (char *, void *, struct svc_req *))
238 _idmap_list_mappings_1;
239 break;
240
241 case IDMAP_LIST_NAMERULES:
242 _xdr_argument = (xdrproc_t)
243 xdr_idmap_list_namerules_1_argument;
244 _xdr_result = (xdrproc_t)
245 xdr_idmap_namerules_res;
246 local = (bool_t (*) (char *, void *, struct svc_req *))
247 _idmap_list_namerules_1;
248 break;
249
250 case IDMAP_UPDATE:
251 _xdr_argument = (xdrproc_t)
252 xdr_idmap_update_batch;
253 _xdr_result = (xdrproc_t)
254 xdr_idmap_update_res;
255 local = (bool_t (*) (char *, void *, struct svc_req *))
256 _idmap_update_1;
257 break;
258
259 case IDMAP_GET_MAPPED_ID_BY_NAME:
260 _xdr_argument = (xdrproc_t)
261 xdr_idmap_mapping;
262 _xdr_result = (xdrproc_t)
263 xdr_idmap_mappings_res;
264 local = (bool_t (*) (char *, void *, struct svc_req *))
265 _idmap_get_mapped_id_by_name_1;
266 break;
267
268 case IDMAP_GET_PROP:
269 _xdr_argument = (xdrproc_t)
270 xdr_idmap_prop_type;
271 _xdr_result = (xdrproc_t)
272 xdr_idmap_prop_res;
273 local = (bool_t (*) (char *, void *, struct svc_req *))
274 _idmap_get_prop_1;
275 break;
276
277 case DIRECTORY_GET_COMMON:
278 _xdr_argument = (xdrproc_t)
279 xdr_directory_get_common_1_argument;
280 _xdr_result = (xdrproc_t)
281 xdr_directory_results_rpc;
282 local = (bool_t (*) (char *, void *, struct svc_req *))
283 _directory_get_common_1;
284 break;
285
286 case IDMAP_FLUSH:
287 _xdr_argument = (xdrproc_t)
288 xdr_idmap_flush_op;
289 _xdr_result = (xdrproc_t)
290 xdr_idmap_retcode;
291 local = (bool_t (*) (char *, void *, struct svc_req *))
292 _idmap_flush_1;
293 break;
294
295 default:
296 svcerr_noproc(transp);
297 (void) mutex_lock(&_svcstate_lock);
298 _rpcsvccount--;
299 _rpcsvcstate = _SERVED;
300 (void) mutex_unlock(&_svcstate_lock);
301 return; /* CSTYLED */
302 }
303 (void) memset((char *)&argument, 0, sizeof (argument));
304 if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) {
305 svcerr_decode(transp);
306 (void) mutex_lock(&_svcstate_lock);
307 _rpcsvccount--;
308 _rpcsvcstate = _SERVED;
309 (void) mutex_unlock(&_svcstate_lock);
310 return; /* CSTYLED */
311 }
312 retval = (bool_t)(*local)((char *)&argument, (void *)&result, rqstp);
313 if (_xdr_result && retval > 0 &&
314 !svc_sendreply(transp, _xdr_result, (char *)&result)) {
315 svcerr_systemerr(transp);
316 }
317 if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) {
318 RPC_MSGOUT("%s",
319 "unable to free arguments");
320 exit(1);
321 }
322 if (_xdr_result != NULL) {
323 if (!idmap_prog_1_freeresult(transp, _xdr_result,
324 (caddr_t)&result))
325 RPC_MSGOUT("%s",
326 "unable to free results");
327
328 }
329 (void) mutex_lock(&_svcstate_lock);
330 _rpcsvccount--;
331 _rpcsvcstate = _SERVED;
332 (void) mutex_unlock(&_svcstate_lock);
333 return; /* CSTYLED */
334 }
335