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 58extern 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 */ 66static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */ 67static int _rpcsvccount = 0; /* Number of requests being serviced */ 68mutex_t _svcstate_lock; /* lock for _rpcsvcstate, _rpcsvccount */ 69 70#if defined(RPC_MSGOUT) 71extern void RPC_MSGOUT(const char *, ...); 72#else /* defined(RPC_MSGOUT) */ 73static void 74RPC_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 */ 90int 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 99int 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 108int 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 121int 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 134int 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 143int 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 152int 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 161int 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 174int 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 183void 184idmap_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