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