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 2009 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 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 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 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 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 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 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 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 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 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 void 175 idmap_prog_1(struct svc_req *rqstp, register SVCXPRT *transp) 176 { 177 union { 178 idmap_mapping_batch idmap_get_mapped_ids_1_arg; 179 idmap_list_mappings_1_argument idmap_list_mappings_1_arg; 180 idmap_list_namerules_1_argument idmap_list_namerules_1_arg; 181 idmap_update_batch idmap_update_1_arg; 182 idmap_mapping idmap_get_mapped_id_by_name_1_arg; 183 idmap_prop_type idmap_get_prop_1_arg; 184 directory_get_common_1_argument directory_get_common_1_arg; 185 } argument; 186 union { 187 idmap_ids_res idmap_get_mapped_ids_1_res; 188 idmap_mappings_res idmap_list_mappings_1_res; 189 idmap_namerules_res idmap_list_namerules_1_res; 190 idmap_update_res idmap_update_1_res; 191 idmap_mappings_res idmap_get_mapped_id_by_name_1_res; 192 idmap_prop_res idmap_get_prop_1_res; 193 directory_results_rpc directory_get_common_1_res; 194 } result; 195 bool_t retval; 196 xdrproc_t _xdr_argument, _xdr_result; 197 bool_t (*local)(char *, void *, struct svc_req *); 198 199 (void) mutex_lock(&_svcstate_lock); 200 _rpcsvccount++; 201 (void) mutex_unlock(&_svcstate_lock); 202 switch (rqstp->rq_proc) { 203 case IDMAP_NULL: 204 _xdr_argument = (xdrproc_t) 205 xdr_void; 206 _xdr_result = (xdrproc_t) 207 xdr_void; 208 local = (bool_t (*) (char *, void *, struct svc_req *)) 209 _idmap_null_1; 210 break; 211 212 case IDMAP_GET_MAPPED_IDS: 213 _xdr_argument = (xdrproc_t) 214 xdr_idmap_mapping_batch; 215 _xdr_result = (xdrproc_t) 216 xdr_idmap_ids_res; 217 local = (bool_t (*) (char *, void *, struct svc_req *)) 218 _idmap_get_mapped_ids_1; 219 break; 220 221 case IDMAP_LIST_MAPPINGS: 222 _xdr_argument = (xdrproc_t) 223 xdr_idmap_list_mappings_1_argument; 224 _xdr_result = (xdrproc_t) 225 xdr_idmap_mappings_res; 226 local = (bool_t (*) (char *, void *, struct svc_req *)) 227 _idmap_list_mappings_1; 228 break; 229 230 case IDMAP_LIST_NAMERULES: 231 _xdr_argument = (xdrproc_t) 232 xdr_idmap_list_namerules_1_argument; 233 _xdr_result = (xdrproc_t) 234 xdr_idmap_namerules_res; 235 local = (bool_t (*) (char *, void *, struct svc_req *)) 236 _idmap_list_namerules_1; 237 break; 238 239 case IDMAP_UPDATE: 240 _xdr_argument = (xdrproc_t) 241 xdr_idmap_update_batch; 242 _xdr_result = (xdrproc_t) 243 xdr_idmap_update_res; 244 local = (bool_t (*) (char *, void *, struct svc_req *)) 245 _idmap_update_1; 246 break; 247 248 case IDMAP_GET_MAPPED_ID_BY_NAME: 249 _xdr_argument = (xdrproc_t) 250 xdr_idmap_mapping; 251 _xdr_result = (xdrproc_t) 252 xdr_idmap_mappings_res; 253 local = (bool_t (*) (char *, void *, struct svc_req *)) 254 _idmap_get_mapped_id_by_name_1; 255 break; 256 257 case IDMAP_GET_PROP: 258 _xdr_argument = (xdrproc_t) 259 xdr_idmap_prop_type; 260 _xdr_result = (xdrproc_t) 261 xdr_idmap_prop_res; 262 local = (bool_t (*) (char *, void *, struct svc_req *)) 263 _idmap_get_prop_1; 264 break; 265 266 case DIRECTORY_GET_COMMON: 267 _xdr_argument = (xdrproc_t) 268 xdr_directory_get_common_1_argument; 269 _xdr_result = (xdrproc_t) 270 xdr_directory_results_rpc; 271 local = (bool_t (*) (char *, void *, struct svc_req *)) 272 _directory_get_common_1; 273 break; 274 275 default: 276 svcerr_noproc(transp); 277 (void) mutex_lock(&_svcstate_lock); 278 _rpcsvccount--; 279 _rpcsvcstate = _SERVED; 280 (void) mutex_unlock(&_svcstate_lock); 281 return; /* CSTYLED */ 282 } 283 (void) memset((char *)&argument, 0, sizeof (argument)); 284 if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) { 285 svcerr_decode(transp); 286 (void) mutex_lock(&_svcstate_lock); 287 _rpcsvccount--; 288 _rpcsvcstate = _SERVED; 289 (void) mutex_unlock(&_svcstate_lock); 290 return; /* CSTYLED */ 291 } 292 retval = (bool_t)(*local)((char *)&argument, (void *)&result, rqstp); 293 if (_xdr_result && retval > 0 && 294 !svc_sendreply(transp, _xdr_result, (char *)&result)) { 295 svcerr_systemerr(transp); 296 } 297 if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) { 298 RPC_MSGOUT("%s", 299 "unable to free arguments"); 300 exit(1); 301 } 302 if (_xdr_result != NULL) { 303 if (!idmap_prog_1_freeresult(transp, _xdr_result, 304 (caddr_t)&result)) 305 RPC_MSGOUT("%s", 306 "unable to free results"); 307 308 } 309 (void) mutex_lock(&_svcstate_lock); 310 _rpcsvccount--; 311 _rpcsvcstate = _SERVED; 312 (void) mutex_unlock(&_svcstate_lock); 313 return; /* CSTYLED */ 314 } 315