14520Snw141292 /*
24520Snw141292 * CDDL HEADER START
34520Snw141292 *
44520Snw141292 * The contents of this file are subject to the terms of the
54520Snw141292 * Common Development and Distribution License (the "License").
64520Snw141292 * You may not use this file except in compliance with the License.
74520Snw141292 *
84520Snw141292 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94520Snw141292 * or http://www.opensolaris.org/os/licensing.
104520Snw141292 * See the License for the specific language governing permissions
114520Snw141292 * and limitations under the License.
124520Snw141292 *
134520Snw141292 * When distributing Covered Code, include this CDDL HEADER in each
144520Snw141292 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154520Snw141292 * If applicable, add the following below this CDDL HEADER, with the
164520Snw141292 * fields enclosed by brackets "[]" replaced with your own identifying
174520Snw141292 * information: Portions Copyright [yyyy] [name of copyright owner]
184520Snw141292 *
194520Snw141292 * CDDL HEADER END
204520Snw141292 */
214520Snw141292 /*
22*11963SAfshin.Ardakani@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
234520Snw141292 * Use is subject to license terms.
244520Snw141292 */
254520Snw141292
264520Snw141292 /*
2710122SJordan.Brown@Sun.COM * Please do not edit this file.
2810122SJordan.Brown@Sun.COM * It was generated using rpcgen.
2910122SJordan.Brown@Sun.COM * Edit idmap_prot.x and rebuild this file with
3010122SJordan.Brown@Sun.COM * rpcgen -CMNm -o idmap_prot_svc.c.new ../../../uts/common/rpcsvc/idmap_prot.x
3110122SJordan.Brown@Sun.COM * then merge as required. A recent version of rpcgen is needed to
3210122SJordan.Brown@Sun.COM * produce this exact file; when the revised rpcgen is available in the
3310122SJordan.Brown@Sun.COM * build environment this file can be built automatically.
344520Snw141292 */
354520Snw141292
3610122SJordan.Brown@Sun.COM #include "../../../uts/common/rpcsvc/idmap_prot.h"
3710122SJordan.Brown@Sun.COM #include <stdio.h>
3810122SJordan.Brown@Sun.COM #include <stdlib.h> /* getenv, exit */
394520Snw141292 #include <signal.h>
4010122SJordan.Brown@Sun.COM #include <rpc/pmap_clnt.h> /* for pmap_unset */
4110122SJordan.Brown@Sun.COM #include <string.h> /* strcmp */
4210122SJordan.Brown@Sun.COM #include <unistd.h> /* setsid */
4310122SJordan.Brown@Sun.COM #include <sys/types.h>
4410122SJordan.Brown@Sun.COM #include <memory.h>
4510122SJordan.Brown@Sun.COM #include <stropts.h>
4610122SJordan.Brown@Sun.COM #include <sys/resource.h> /* rlimit */
4710122SJordan.Brown@Sun.COM #include <syslog.h>
4810122SJordan.Brown@Sun.COM
4910122SJordan.Brown@Sun.COM #ifndef SIG_PF
5010122SJordan.Brown@Sun.COM #define SIG_PF void(*)(int)
5110122SJordan.Brown@Sun.COM #endif
5210122SJordan.Brown@Sun.COM
5310122SJordan.Brown@Sun.COM #ifdef DEBUG
5410122SJordan.Brown@Sun.COM #define RPC_SVC_FG
5510122SJordan.Brown@Sun.COM #endif
5610122SJordan.Brown@Sun.COM
5710122SJordan.Brown@Sun.COM #define _RPCSVC_CLOSEDOWN 120
5810122SJordan.Brown@Sun.COM extern int _rpcpmstart; /* Started by a port monitor ? */
5910122SJordan.Brown@Sun.COM
6010122SJordan.Brown@Sun.COM /* States a server can be in wrt request */
614520Snw141292
6210122SJordan.Brown@Sun.COM #define _IDLE 0
6310122SJordan.Brown@Sun.COM #define _SERVED 1
6410122SJordan.Brown@Sun.COM
6510122SJordan.Brown@Sun.COM /* LINTED static unused if no main */
6610122SJordan.Brown@Sun.COM static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */
6710122SJordan.Brown@Sun.COM static int _rpcsvccount = 0; /* Number of requests being serviced */
6810122SJordan.Brown@Sun.COM mutex_t _svcstate_lock; /* lock for _rpcsvcstate, _rpcsvccount */
6910122SJordan.Brown@Sun.COM
7010122SJordan.Brown@Sun.COM #if defined(RPC_MSGOUT)
7110122SJordan.Brown@Sun.COM extern void RPC_MSGOUT(const char *, ...);
7210122SJordan.Brown@Sun.COM #else /* defined(RPC_MSGOUT) */
7310122SJordan.Brown@Sun.COM static void
RPC_MSGOUT(const char * fmt,char * msg)7410122SJordan.Brown@Sun.COM RPC_MSGOUT(const char *fmt, char *msg)
7510122SJordan.Brown@Sun.COM {
7610122SJordan.Brown@Sun.COM #ifdef RPC_SVC_FG
7710122SJordan.Brown@Sun.COM if (_rpcpmstart)
7810122SJordan.Brown@Sun.COM syslog(LOG_ERR, fmt, msg);
7910122SJordan.Brown@Sun.COM else {
8010122SJordan.Brown@Sun.COM (void) fprintf(stderr, fmt, msg);
8110122SJordan.Brown@Sun.COM (void) putc('\n', stderr);
8210122SJordan.Brown@Sun.COM }
8310122SJordan.Brown@Sun.COM #else
8410122SJordan.Brown@Sun.COM syslog(LOG_ERR, fmt, msg);
8510122SJordan.Brown@Sun.COM #endif
8610122SJordan.Brown@Sun.COM }
8710122SJordan.Brown@Sun.COM #endif /* defined(RPC_MSGOUT) */
884520Snw141292
894520Snw141292 /* ARGSUSED */
904520Snw141292 int
_idmap_null_1(void * argp,void * result,struct svc_req * rqstp)9110122SJordan.Brown@Sun.COM _idmap_null_1(
9210122SJordan.Brown@Sun.COM void *argp,
9310122SJordan.Brown@Sun.COM void *result,
9410122SJordan.Brown@Sun.COM struct svc_req *rqstp)
954520Snw141292 {
964520Snw141292 return (idmap_null_1_svc(result, rqstp));
974520Snw141292 }
984520Snw141292
994520Snw141292 int
_idmap_get_mapped_ids_1(idmap_mapping_batch * argp,idmap_ids_res * result,struct svc_req * rqstp)10010122SJordan.Brown@Sun.COM _idmap_get_mapped_ids_1(
10110122SJordan.Brown@Sun.COM idmap_mapping_batch *argp,
10210122SJordan.Brown@Sun.COM idmap_ids_res *result,
10310122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1045696Snw141292 {
1054520Snw141292 return (idmap_get_mapped_ids_1_svc(*argp, result, rqstp));
1064520Snw141292 }
1074520Snw141292
1084520Snw141292 int
_idmap_list_mappings_1(idmap_list_mappings_1_argument * argp,idmap_mappings_res * result,struct svc_req * rqstp)10910122SJordan.Brown@Sun.COM _idmap_list_mappings_1(
11010122SJordan.Brown@Sun.COM idmap_list_mappings_1_argument *argp,
11110122SJordan.Brown@Sun.COM idmap_mappings_res *result,
11210122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1135696Snw141292 {
11410122SJordan.Brown@Sun.COM return (idmap_list_mappings_1_svc(
11510122SJordan.Brown@Sun.COM argp->lastrowid,
11610122SJordan.Brown@Sun.COM argp->limit,
11710122SJordan.Brown@Sun.COM argp->flag,
11810122SJordan.Brown@Sun.COM result, rqstp));
1194520Snw141292 }
1204520Snw141292
1214520Snw141292 int
_idmap_list_namerules_1(idmap_list_namerules_1_argument * argp,idmap_namerules_res * result,struct svc_req * rqstp)12210122SJordan.Brown@Sun.COM _idmap_list_namerules_1(
12310122SJordan.Brown@Sun.COM idmap_list_namerules_1_argument *argp,
12410122SJordan.Brown@Sun.COM idmap_namerules_res *result,
12510122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1265696Snw141292 {
12710122SJordan.Brown@Sun.COM return (idmap_list_namerules_1_svc(
12810122SJordan.Brown@Sun.COM argp->rule,
12910122SJordan.Brown@Sun.COM argp->lastrowid,
13010122SJordan.Brown@Sun.COM argp->limit,
13110122SJordan.Brown@Sun.COM result, rqstp));
1324520Snw141292 }
1334520Snw141292
1344520Snw141292 int
_idmap_update_1(idmap_update_batch * argp,idmap_update_res * result,struct svc_req * rqstp)13510122SJordan.Brown@Sun.COM _idmap_update_1(
13610122SJordan.Brown@Sun.COM idmap_update_batch *argp,
13710122SJordan.Brown@Sun.COM idmap_update_res *result,
13810122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1395696Snw141292 {
14010122SJordan.Brown@Sun.COM return (idmap_update_1_svc(*argp, result, rqstp));
1414520Snw141292 }
1424520Snw141292
1434520Snw141292 int
_idmap_get_mapped_id_by_name_1(idmap_mapping * argp,idmap_mappings_res * result,struct svc_req * rqstp)14410122SJordan.Brown@Sun.COM _idmap_get_mapped_id_by_name_1(
14510122SJordan.Brown@Sun.COM idmap_mapping *argp,
14610122SJordan.Brown@Sun.COM idmap_mappings_res *result,
14710122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1485696Snw141292 {
1494520Snw141292 return (idmap_get_mapped_id_by_name_1_svc(*argp, result, rqstp));
1504520Snw141292 }
1514520Snw141292
1526616Sdm199847 int
_idmap_get_prop_1(idmap_prop_type * argp,idmap_prop_res * result,struct svc_req * rqstp)15310122SJordan.Brown@Sun.COM _idmap_get_prop_1(
15410122SJordan.Brown@Sun.COM idmap_prop_type *argp,
15510122SJordan.Brown@Sun.COM idmap_prop_res *result,
15610122SJordan.Brown@Sun.COM struct svc_req *rqstp)
1576616Sdm199847 {
1586616Sdm199847 return (idmap_get_prop_1_svc(*argp, result, rqstp));
1596616Sdm199847 }
1606616Sdm199847
16110122SJordan.Brown@Sun.COM int
_directory_get_common_1(directory_get_common_1_argument * argp,directory_results_rpc * result,struct svc_req * rqstp)16210122SJordan.Brown@Sun.COM _directory_get_common_1(
16310122SJordan.Brown@Sun.COM directory_get_common_1_argument *argp,
16410122SJordan.Brown@Sun.COM directory_results_rpc *result,
16510122SJordan.Brown@Sun.COM struct svc_req *rqstp)
16610122SJordan.Brown@Sun.COM {
16710122SJordan.Brown@Sun.COM return (directory_get_common_1_svc(
16810122SJordan.Brown@Sun.COM argp->ids,
16910122SJordan.Brown@Sun.COM argp->types,
17010122SJordan.Brown@Sun.COM argp->attrs,
17110122SJordan.Brown@Sun.COM result, rqstp));
17210122SJordan.Brown@Sun.COM }
1734520Snw141292
174*11963SAfshin.Ardakani@Sun.COM int
_idmap_flush_1(idmap_flush_op * argp,idmap_retcode * result,struct svc_req * rqstp)175*11963SAfshin.Ardakani@Sun.COM _idmap_flush_1(
176*11963SAfshin.Ardakani@Sun.COM idmap_flush_op *argp,
177*11963SAfshin.Ardakani@Sun.COM idmap_retcode *result,
178*11963SAfshin.Ardakani@Sun.COM struct svc_req *rqstp)
179*11963SAfshin.Ardakani@Sun.COM {
180*11963SAfshin.Ardakani@Sun.COM return (idmap_flush_1_svc(*argp, result, rqstp));
181*11963SAfshin.Ardakani@Sun.COM }
182*11963SAfshin.Ardakani@Sun.COM
1834520Snw141292 void
idmap_prog_1(struct svc_req * rqstp,register SVCXPRT * transp)1844520Snw141292 idmap_prog_1(struct svc_req *rqstp, register SVCXPRT *transp)
1854520Snw141292 {
1864520Snw141292 union {
1874520Snw141292 idmap_mapping_batch idmap_get_mapped_ids_1_arg;
1884520Snw141292 idmap_list_mappings_1_argument idmap_list_mappings_1_arg;
1894520Snw141292 idmap_list_namerules_1_argument idmap_list_namerules_1_arg;
1904520Snw141292 idmap_update_batch idmap_update_1_arg;
1914520Snw141292 idmap_mapping idmap_get_mapped_id_by_name_1_arg;
1926616Sdm199847 idmap_prop_type idmap_get_prop_1_arg;
19310122SJordan.Brown@Sun.COM directory_get_common_1_argument directory_get_common_1_arg;
194*11963SAfshin.Ardakani@Sun.COM idmap_flush_op idmap_flush_1_arg;
1954520Snw141292 } argument;
1964520Snw141292 union {
1974520Snw141292 idmap_ids_res idmap_get_mapped_ids_1_res;
1984520Snw141292 idmap_mappings_res idmap_list_mappings_1_res;
1994520Snw141292 idmap_namerules_res idmap_list_namerules_1_res;
2005064Sdm199847 idmap_update_res idmap_update_1_res;
2014520Snw141292 idmap_mappings_res idmap_get_mapped_id_by_name_1_res;
2026616Sdm199847 idmap_prop_res idmap_get_prop_1_res;
20310122SJordan.Brown@Sun.COM directory_results_rpc directory_get_common_1_res;
204*11963SAfshin.Ardakani@Sun.COM idmap_retcode idmap_flush_1_res;
2054520Snw141292 } result;
2064520Snw141292 bool_t retval;
2074520Snw141292 xdrproc_t _xdr_argument, _xdr_result;
2084520Snw141292 bool_t (*local)(char *, void *, struct svc_req *);
2094520Snw141292
2104520Snw141292 (void) mutex_lock(&_svcstate_lock);
2114520Snw141292 _rpcsvccount++;
2124520Snw141292 (void) mutex_unlock(&_svcstate_lock);
2134520Snw141292 switch (rqstp->rq_proc) {
2144520Snw141292 case IDMAP_NULL:
21510122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
21610122SJordan.Brown@Sun.COM xdr_void;
21710122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
21810122SJordan.Brown@Sun.COM xdr_void;
2194520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2204520Snw141292 _idmap_null_1;
2214520Snw141292 break;
2224520Snw141292
2234520Snw141292 case IDMAP_GET_MAPPED_IDS:
22410122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
22510122SJordan.Brown@Sun.COM xdr_idmap_mapping_batch;
22610122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
22710122SJordan.Brown@Sun.COM xdr_idmap_ids_res;
2284520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2294520Snw141292 _idmap_get_mapped_ids_1;
2304520Snw141292 break;
2314520Snw141292
2324520Snw141292 case IDMAP_LIST_MAPPINGS:
23310122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
23410122SJordan.Brown@Sun.COM xdr_idmap_list_mappings_1_argument;
23510122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
23610122SJordan.Brown@Sun.COM xdr_idmap_mappings_res;
2374520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2384520Snw141292 _idmap_list_mappings_1;
2394520Snw141292 break;
2404520Snw141292
2414520Snw141292 case IDMAP_LIST_NAMERULES:
24210122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
24310122SJordan.Brown@Sun.COM xdr_idmap_list_namerules_1_argument;
24410122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
24510122SJordan.Brown@Sun.COM xdr_idmap_namerules_res;
2464520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2474520Snw141292 _idmap_list_namerules_1;
2484520Snw141292 break;
2494520Snw141292
2504520Snw141292 case IDMAP_UPDATE:
25110122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
25210122SJordan.Brown@Sun.COM xdr_idmap_update_batch;
25310122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
25410122SJordan.Brown@Sun.COM xdr_idmap_update_res;
2554520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2564520Snw141292 _idmap_update_1;
2574520Snw141292 break;
2584520Snw141292
2594520Snw141292 case IDMAP_GET_MAPPED_ID_BY_NAME:
26010122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
26110122SJordan.Brown@Sun.COM xdr_idmap_mapping;
26210122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
26310122SJordan.Brown@Sun.COM xdr_idmap_mappings_res;
2644520Snw141292 local = (bool_t (*) (char *, void *, struct svc_req *))
2654520Snw141292 _idmap_get_mapped_id_by_name_1;
2664520Snw141292 break;
2674520Snw141292
2686616Sdm199847 case IDMAP_GET_PROP:
26910122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
27010122SJordan.Brown@Sun.COM xdr_idmap_prop_type;
27110122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
27210122SJordan.Brown@Sun.COM xdr_idmap_prop_res;
2736616Sdm199847 local = (bool_t (*) (char *, void *, struct svc_req *))
2746616Sdm199847 _idmap_get_prop_1;
2756616Sdm199847 break;
2766616Sdm199847
27710122SJordan.Brown@Sun.COM case DIRECTORY_GET_COMMON:
27810122SJordan.Brown@Sun.COM _xdr_argument = (xdrproc_t)
27910122SJordan.Brown@Sun.COM xdr_directory_get_common_1_argument;
28010122SJordan.Brown@Sun.COM _xdr_result = (xdrproc_t)
28110122SJordan.Brown@Sun.COM xdr_directory_results_rpc;
28210122SJordan.Brown@Sun.COM local = (bool_t (*) (char *, void *, struct svc_req *))
28310122SJordan.Brown@Sun.COM _directory_get_common_1;
28410122SJordan.Brown@Sun.COM break;
28510122SJordan.Brown@Sun.COM
286*11963SAfshin.Ardakani@Sun.COM case IDMAP_FLUSH:
287*11963SAfshin.Ardakani@Sun.COM _xdr_argument = (xdrproc_t)
288*11963SAfshin.Ardakani@Sun.COM xdr_idmap_flush_op;
289*11963SAfshin.Ardakani@Sun.COM _xdr_result = (xdrproc_t)
290*11963SAfshin.Ardakani@Sun.COM xdr_idmap_retcode;
291*11963SAfshin.Ardakani@Sun.COM local = (bool_t (*) (char *, void *, struct svc_req *))
292*11963SAfshin.Ardakani@Sun.COM _idmap_flush_1;
293*11963SAfshin.Ardakani@Sun.COM break;
294*11963SAfshin.Ardakani@Sun.COM
2954520Snw141292 default:
2964520Snw141292 svcerr_noproc(transp);
2974520Snw141292 (void) mutex_lock(&_svcstate_lock);
2984520Snw141292 _rpcsvccount--;
2994520Snw141292 _rpcsvcstate = _SERVED;
3004520Snw141292 (void) mutex_unlock(&_svcstate_lock);
30110122SJordan.Brown@Sun.COM return; /* CSTYLED */
3024520Snw141292 }
3034520Snw141292 (void) memset((char *)&argument, 0, sizeof (argument));
3044520Snw141292 if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) {
3054520Snw141292 svcerr_decode(transp);
3064520Snw141292 (void) mutex_lock(&_svcstate_lock);
3074520Snw141292 _rpcsvccount--;
3084520Snw141292 _rpcsvcstate = _SERVED;
3094520Snw141292 (void) mutex_unlock(&_svcstate_lock);
31010122SJordan.Brown@Sun.COM return; /* CSTYLED */
3114520Snw141292 }
3124520Snw141292 retval = (bool_t)(*local)((char *)&argument, (void *)&result, rqstp);
31310122SJordan.Brown@Sun.COM if (_xdr_result && retval > 0 &&
31410122SJordan.Brown@Sun.COM !svc_sendreply(transp, _xdr_result, (char *)&result)) {
3154520Snw141292 svcerr_systemerr(transp);
3164520Snw141292 }
3174520Snw141292 if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) {
31810122SJordan.Brown@Sun.COM RPC_MSGOUT("%s",
31910122SJordan.Brown@Sun.COM "unable to free arguments");
3204520Snw141292 exit(1);
3214520Snw141292 }
3224520Snw141292 if (_xdr_result != NULL) {
3234520Snw141292 if (!idmap_prog_1_freeresult(transp, _xdr_result,
3244520Snw141292 (caddr_t)&result))
32510122SJordan.Brown@Sun.COM RPC_MSGOUT("%s",
32610122SJordan.Brown@Sun.COM "unable to free results");
3274520Snw141292
3284520Snw141292 }
3294520Snw141292 (void) mutex_lock(&_svcstate_lock);
3304520Snw141292 _rpcsvccount--;
3314520Snw141292 _rpcsvcstate = _SERVED;
3324520Snw141292 (void) mutex_unlock(&_svcstate_lock);
33310122SJordan.Brown@Sun.COM return; /* CSTYLED */
3344520Snw141292 }
335