xref: /onnv-gate/usr/src/cmd/idmap/idmapd/rpc_svc.c (revision 10122:96eda55bfd54)
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 /*
229565SJordan.Brown@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
234520Snw141292  * Use is subject to license terms.
244520Snw141292  */
254520Snw141292 
264520Snw141292 /*
27*10122SJordan.Brown@Sun.COM  * Please do not edit this file.
28*10122SJordan.Brown@Sun.COM  * It was generated using rpcgen.
29*10122SJordan.Brown@Sun.COM  * Edit idmap_prot.x and rebuild this file with
30*10122SJordan.Brown@Sun.COM  * rpcgen -CMNm -o idmap_prot_svc.c.new ../../../uts/common/rpcsvc/idmap_prot.x
31*10122SJordan.Brown@Sun.COM  * then merge as required.  A recent version of rpcgen is needed to
32*10122SJordan.Brown@Sun.COM  * produce this exact file; when the revised rpcgen is available in the
33*10122SJordan.Brown@Sun.COM  * build environment this file can be built automatically.
344520Snw141292  */
354520Snw141292 
36*10122SJordan.Brown@Sun.COM #include "../../../uts/common/rpcsvc/idmap_prot.h"
37*10122SJordan.Brown@Sun.COM #include <stdio.h>
38*10122SJordan.Brown@Sun.COM #include <stdlib.h> /* getenv, exit */
394520Snw141292 #include <signal.h>
40*10122SJordan.Brown@Sun.COM #include <rpc/pmap_clnt.h> /* for pmap_unset */
41*10122SJordan.Brown@Sun.COM #include <string.h> /* strcmp */
42*10122SJordan.Brown@Sun.COM #include <unistd.h> /* setsid */
43*10122SJordan.Brown@Sun.COM #include <sys/types.h>
44*10122SJordan.Brown@Sun.COM #include <memory.h>
45*10122SJordan.Brown@Sun.COM #include <stropts.h>
46*10122SJordan.Brown@Sun.COM #include <sys/resource.h> /* rlimit */
47*10122SJordan.Brown@Sun.COM #include <syslog.h>
48*10122SJordan.Brown@Sun.COM 
49*10122SJordan.Brown@Sun.COM #ifndef SIG_PF
50*10122SJordan.Brown@Sun.COM #define	SIG_PF void(*)(int)
51*10122SJordan.Brown@Sun.COM #endif
52*10122SJordan.Brown@Sun.COM 
53*10122SJordan.Brown@Sun.COM #ifdef DEBUG
54*10122SJordan.Brown@Sun.COM #define	RPC_SVC_FG
55*10122SJordan.Brown@Sun.COM #endif
56*10122SJordan.Brown@Sun.COM 
57*10122SJordan.Brown@Sun.COM #define	_RPCSVC_CLOSEDOWN 120
58*10122SJordan.Brown@Sun.COM extern int _rpcpmstart;		/* Started by a port monitor ? */
59*10122SJordan.Brown@Sun.COM 
60*10122SJordan.Brown@Sun.COM /* States a server can be in wrt request */
614520Snw141292 
62*10122SJordan.Brown@Sun.COM #define	_IDLE 0
63*10122SJordan.Brown@Sun.COM #define	_SERVED 1
64*10122SJordan.Brown@Sun.COM 
65*10122SJordan.Brown@Sun.COM /* LINTED static unused if no main */
66*10122SJordan.Brown@Sun.COM static int _rpcsvcstate = _IDLE;	/* Set when a request is serviced */
67*10122SJordan.Brown@Sun.COM static int _rpcsvccount = 0;		/* Number of requests being serviced */
68*10122SJordan.Brown@Sun.COM mutex_t _svcstate_lock;		/* lock for _rpcsvcstate, _rpcsvccount */
69*10122SJordan.Brown@Sun.COM 
70*10122SJordan.Brown@Sun.COM #if	defined(RPC_MSGOUT)
71*10122SJordan.Brown@Sun.COM extern void RPC_MSGOUT(const char *, ...);
72*10122SJordan.Brown@Sun.COM #else	/* defined(RPC_MSGOUT) */
73*10122SJordan.Brown@Sun.COM static void
74*10122SJordan.Brown@Sun.COM RPC_MSGOUT(const char *fmt, char *msg)
75*10122SJordan.Brown@Sun.COM {
76*10122SJordan.Brown@Sun.COM #ifdef RPC_SVC_FG
77*10122SJordan.Brown@Sun.COM 	if (_rpcpmstart)
78*10122SJordan.Brown@Sun.COM 		syslog(LOG_ERR, fmt, msg);
79*10122SJordan.Brown@Sun.COM 	else {
80*10122SJordan.Brown@Sun.COM 		(void) fprintf(stderr, fmt, msg);
81*10122SJordan.Brown@Sun.COM 		(void) putc('\n', stderr);
82*10122SJordan.Brown@Sun.COM 	}
83*10122SJordan.Brown@Sun.COM #else
84*10122SJordan.Brown@Sun.COM 	syslog(LOG_ERR, fmt, msg);
85*10122SJordan.Brown@Sun.COM #endif
86*10122SJordan.Brown@Sun.COM }
87*10122SJordan.Brown@Sun.COM #endif	/* defined(RPC_MSGOUT) */
884520Snw141292 
894520Snw141292 /* ARGSUSED */
904520Snw141292 int
91*10122SJordan.Brown@Sun.COM _idmap_null_1(
92*10122SJordan.Brown@Sun.COM     void  *argp,
93*10122SJordan.Brown@Sun.COM     void *result,
94*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
954520Snw141292 {
964520Snw141292 	return (idmap_null_1_svc(result, rqstp));
974520Snw141292 }
984520Snw141292 
994520Snw141292 int
100*10122SJordan.Brown@Sun.COM _idmap_get_mapped_ids_1(
101*10122SJordan.Brown@Sun.COM     idmap_mapping_batch  *argp,
102*10122SJordan.Brown@Sun.COM     idmap_ids_res *result,
103*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
1045696Snw141292 {
1054520Snw141292 	return (idmap_get_mapped_ids_1_svc(*argp, result, rqstp));
1064520Snw141292 }
1074520Snw141292 
1084520Snw141292 int
109*10122SJordan.Brown@Sun.COM _idmap_list_mappings_1(
110*10122SJordan.Brown@Sun.COM     idmap_list_mappings_1_argument *argp,
111*10122SJordan.Brown@Sun.COM     idmap_mappings_res *result,
112*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
1135696Snw141292 {
114*10122SJordan.Brown@Sun.COM 	return (idmap_list_mappings_1_svc(
115*10122SJordan.Brown@Sun.COM 	    argp->lastrowid,
116*10122SJordan.Brown@Sun.COM 	    argp->limit,
117*10122SJordan.Brown@Sun.COM 	    argp->flag,
118*10122SJordan.Brown@Sun.COM 	    result, rqstp));
1194520Snw141292 }
1204520Snw141292 
1214520Snw141292 int
122*10122SJordan.Brown@Sun.COM _idmap_list_namerules_1(
123*10122SJordan.Brown@Sun.COM     idmap_list_namerules_1_argument *argp,
124*10122SJordan.Brown@Sun.COM     idmap_namerules_res *result,
125*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
1265696Snw141292 {
127*10122SJordan.Brown@Sun.COM 	return (idmap_list_namerules_1_svc(
128*10122SJordan.Brown@Sun.COM 	    argp->rule,
129*10122SJordan.Brown@Sun.COM 	    argp->lastrowid,
130*10122SJordan.Brown@Sun.COM 	    argp->limit,
131*10122SJordan.Brown@Sun.COM 	    result, rqstp));
1324520Snw141292 }
1334520Snw141292 
1344520Snw141292 int
135*10122SJordan.Brown@Sun.COM _idmap_update_1(
136*10122SJordan.Brown@Sun.COM     idmap_update_batch  *argp,
137*10122SJordan.Brown@Sun.COM     idmap_update_res *result,
138*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
1395696Snw141292 {
140*10122SJordan.Brown@Sun.COM 	return (idmap_update_1_svc(*argp, result, rqstp));
1414520Snw141292 }
1424520Snw141292 
1434520Snw141292 int
144*10122SJordan.Brown@Sun.COM _idmap_get_mapped_id_by_name_1(
145*10122SJordan.Brown@Sun.COM     idmap_mapping  *argp,
146*10122SJordan.Brown@Sun.COM     idmap_mappings_res *result,
147*10122SJordan.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
153*10122SJordan.Brown@Sun.COM _idmap_get_prop_1(
154*10122SJordan.Brown@Sun.COM     idmap_prop_type  *argp,
155*10122SJordan.Brown@Sun.COM     idmap_prop_res *result,
156*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
1576616Sdm199847 {
1586616Sdm199847 	return (idmap_get_prop_1_svc(*argp, result, rqstp));
1596616Sdm199847 }
1606616Sdm199847 
161*10122SJordan.Brown@Sun.COM int
162*10122SJordan.Brown@Sun.COM _directory_get_common_1(
163*10122SJordan.Brown@Sun.COM     directory_get_common_1_argument *argp,
164*10122SJordan.Brown@Sun.COM     directory_results_rpc *result,
165*10122SJordan.Brown@Sun.COM     struct svc_req *rqstp)
166*10122SJordan.Brown@Sun.COM {
167*10122SJordan.Brown@Sun.COM 	return (directory_get_common_1_svc(
168*10122SJordan.Brown@Sun.COM 	    argp->ids,
169*10122SJordan.Brown@Sun.COM 	    argp->types,
170*10122SJordan.Brown@Sun.COM 	    argp->attrs,
171*10122SJordan.Brown@Sun.COM 	    result, rqstp));
172*10122SJordan.Brown@Sun.COM }
1734520Snw141292 
1744520Snw141292 void
1754520Snw141292 idmap_prog_1(struct svc_req *rqstp, register SVCXPRT *transp)
1764520Snw141292 {
1774520Snw141292 	union {
1784520Snw141292 		idmap_mapping_batch idmap_get_mapped_ids_1_arg;
1794520Snw141292 		idmap_list_mappings_1_argument idmap_list_mappings_1_arg;
1804520Snw141292 		idmap_list_namerules_1_argument idmap_list_namerules_1_arg;
1814520Snw141292 		idmap_update_batch idmap_update_1_arg;
1824520Snw141292 		idmap_mapping idmap_get_mapped_id_by_name_1_arg;
1836616Sdm199847 		idmap_prop_type idmap_get_prop_1_arg;
184*10122SJordan.Brown@Sun.COM 		directory_get_common_1_argument directory_get_common_1_arg;
1854520Snw141292 	} argument;
1864520Snw141292 	union {
1874520Snw141292 		idmap_ids_res idmap_get_mapped_ids_1_res;
1884520Snw141292 		idmap_mappings_res idmap_list_mappings_1_res;
1894520Snw141292 		idmap_namerules_res idmap_list_namerules_1_res;
1905064Sdm199847 		idmap_update_res idmap_update_1_res;
1914520Snw141292 		idmap_mappings_res idmap_get_mapped_id_by_name_1_res;
1926616Sdm199847 		idmap_prop_res idmap_get_prop_1_res;
193*10122SJordan.Brown@Sun.COM 		directory_results_rpc directory_get_common_1_res;
1944520Snw141292 	} result;
1954520Snw141292 	bool_t retval;
1964520Snw141292 	xdrproc_t _xdr_argument, _xdr_result;
1974520Snw141292 	bool_t (*local)(char *, void *, struct svc_req *);
1984520Snw141292 
1994520Snw141292 	(void) mutex_lock(&_svcstate_lock);
2004520Snw141292 	_rpcsvccount++;
2014520Snw141292 	(void) mutex_unlock(&_svcstate_lock);
2024520Snw141292 	switch (rqstp->rq_proc) {
2034520Snw141292 	case IDMAP_NULL:
204*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
205*10122SJordan.Brown@Sun.COM 		    xdr_void;
206*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
207*10122SJordan.Brown@Sun.COM 		    xdr_void;
2084520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2094520Snw141292 		    _idmap_null_1;
2104520Snw141292 		break;
2114520Snw141292 
2124520Snw141292 	case IDMAP_GET_MAPPED_IDS:
213*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
214*10122SJordan.Brown@Sun.COM 		    xdr_idmap_mapping_batch;
215*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
216*10122SJordan.Brown@Sun.COM 		    xdr_idmap_ids_res;
2174520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2184520Snw141292 		    _idmap_get_mapped_ids_1;
2194520Snw141292 		break;
2204520Snw141292 
2214520Snw141292 	case IDMAP_LIST_MAPPINGS:
222*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
223*10122SJordan.Brown@Sun.COM 		    xdr_idmap_list_mappings_1_argument;
224*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
225*10122SJordan.Brown@Sun.COM 		    xdr_idmap_mappings_res;
2264520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2274520Snw141292 		    _idmap_list_mappings_1;
2284520Snw141292 		break;
2294520Snw141292 
2304520Snw141292 	case IDMAP_LIST_NAMERULES:
231*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
232*10122SJordan.Brown@Sun.COM 		    xdr_idmap_list_namerules_1_argument;
233*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
234*10122SJordan.Brown@Sun.COM 		    xdr_idmap_namerules_res;
2354520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2364520Snw141292 		    _idmap_list_namerules_1;
2374520Snw141292 		break;
2384520Snw141292 
2394520Snw141292 	case IDMAP_UPDATE:
240*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
241*10122SJordan.Brown@Sun.COM 		    xdr_idmap_update_batch;
242*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
243*10122SJordan.Brown@Sun.COM 		    xdr_idmap_update_res;
2444520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2454520Snw141292 		    _idmap_update_1;
2464520Snw141292 		break;
2474520Snw141292 
2484520Snw141292 	case IDMAP_GET_MAPPED_ID_BY_NAME:
249*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
250*10122SJordan.Brown@Sun.COM 		    xdr_idmap_mapping;
251*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
252*10122SJordan.Brown@Sun.COM 		    xdr_idmap_mappings_res;
2534520Snw141292 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2544520Snw141292 		    _idmap_get_mapped_id_by_name_1;
2554520Snw141292 		break;
2564520Snw141292 
2576616Sdm199847 	case IDMAP_GET_PROP:
258*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
259*10122SJordan.Brown@Sun.COM 		    xdr_idmap_prop_type;
260*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
261*10122SJordan.Brown@Sun.COM 		    xdr_idmap_prop_res;
2626616Sdm199847 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
2636616Sdm199847 		    _idmap_get_prop_1;
2646616Sdm199847 		break;
2656616Sdm199847 
266*10122SJordan.Brown@Sun.COM 	case DIRECTORY_GET_COMMON:
267*10122SJordan.Brown@Sun.COM 		_xdr_argument = (xdrproc_t)
268*10122SJordan.Brown@Sun.COM 		    xdr_directory_get_common_1_argument;
269*10122SJordan.Brown@Sun.COM 		_xdr_result = (xdrproc_t)
270*10122SJordan.Brown@Sun.COM 		    xdr_directory_results_rpc;
271*10122SJordan.Brown@Sun.COM 		local = (bool_t (*) (char *,  void *,  struct svc_req *))
272*10122SJordan.Brown@Sun.COM 		    _directory_get_common_1;
273*10122SJordan.Brown@Sun.COM 		break;
274*10122SJordan.Brown@Sun.COM 
2754520Snw141292 	default:
2764520Snw141292 		svcerr_noproc(transp);
2774520Snw141292 		(void) mutex_lock(&_svcstate_lock);
2784520Snw141292 		_rpcsvccount--;
2794520Snw141292 		_rpcsvcstate = _SERVED;
2804520Snw141292 		(void) mutex_unlock(&_svcstate_lock);
281*10122SJordan.Brown@Sun.COM 		return; /* CSTYLED */
2824520Snw141292 	}
2834520Snw141292 	(void) memset((char *)&argument, 0, sizeof (argument));
2844520Snw141292 	if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) {
2854520Snw141292 		svcerr_decode(transp);
2864520Snw141292 		(void) mutex_lock(&_svcstate_lock);
2874520Snw141292 		_rpcsvccount--;
2884520Snw141292 		_rpcsvcstate = _SERVED;
2894520Snw141292 		(void) mutex_unlock(&_svcstate_lock);
290*10122SJordan.Brown@Sun.COM 		return; /* CSTYLED */
2914520Snw141292 	}
2924520Snw141292 	retval = (bool_t)(*local)((char *)&argument, (void *)&result, rqstp);
293*10122SJordan.Brown@Sun.COM 	if (_xdr_result && retval > 0 &&
294*10122SJordan.Brown@Sun.COM 	    !svc_sendreply(transp, _xdr_result, (char *)&result)) {
2954520Snw141292 		svcerr_systemerr(transp);
2964520Snw141292 	}
2974520Snw141292 	if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) {
298*10122SJordan.Brown@Sun.COM 		RPC_MSGOUT("%s",
299*10122SJordan.Brown@Sun.COM 		    "unable to free arguments");
3004520Snw141292 		exit(1);
3014520Snw141292 	}
3024520Snw141292 	if (_xdr_result != NULL) {
3034520Snw141292 		if (!idmap_prog_1_freeresult(transp, _xdr_result,
3044520Snw141292 		    (caddr_t)&result))
305*10122SJordan.Brown@Sun.COM 			RPC_MSGOUT("%s",
306*10122SJordan.Brown@Sun.COM 			    "unable to free results");
3074520Snw141292 
3084520Snw141292 	}
3094520Snw141292 	(void) mutex_lock(&_svcstate_lock);
3104520Snw141292 	_rpcsvccount--;
3114520Snw141292 	_rpcsvcstate = _SERVED;
3124520Snw141292 	(void) mutex_unlock(&_svcstate_lock);
313*10122SJordan.Brown@Sun.COM 	return; /* CSTYLED */
3144520Snw141292 }
315