1 /* 2 * Please do not edit this file. 3 * It was generated using rpcgen. 4 */ 5 6 #include "gssd.h" 7 #include <stdio.h> 8 #include <stdlib.h> /* getenv, exit */ 9 #include <signal.h> 10 #include <sys/types.h> 11 #include <memory.h> 12 #include <stropts.h> 13 #include <sys/resource.h> /* rlimit */ 14 #include <syslog.h> 15 16 #ifdef DEBUG 17 #define RPC_SVC_FG 18 #endif 19 20 #define _RPCSVC_CLOSEDOWN 120 21 /* 22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * RPC protocol information for gssd, the usermode daemon that 28 * assists the kernel with gssapi. It is gssd that executes all 29 * gssapi calls except for some such as gss_sign(), and 30 * gss_verify(), which are executed in the kernel itself. 31 * 32 * File generated from gssd.x 33 */ 34 35 #define NO 0 36 #define YES 1 37 #define FOREVER 1 38 39 #include <sys/types.h> 40 #include <sys/time.h> 41 #include <rpc/auth_sys.h> 42 #ifndef _KERNEL 43 #include <locale.h> 44 #endif /* not _KERNEL */ 45 46 #ifdef _KERNEL 47 extern void killgssd_handle(CLIENT *); 48 extern CLIENT *getgssd_handle(void); 49 #endif /* _KERNEL */ 50 51 /* gss_indicate_mechs_arg is void. This appears in the rpc call def */ 52 extern int _rpcpmstart; /* Started by a port monitor ? */ 53 54 /* States a server can be in wrt request */ 55 56 #define _IDLE 0 57 #define _SERVED 1 58 59 /* LINTED static unused if no main */ 60 static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */ 61 static int _rpcsvccount = 0; /* Number of requests being serviced */ 62 mutex_t _svcstate_lock; /* lock for _rpcsvcstate, _rpcsvccount */ 63 64 #if defined(RPC_MSGOUT) 65 extern void RPC_MSGOUT(); 66 #else /* defined(RPC_MSGOUT) */ 67 static void 68 RPC_MSGOUT(fmt, msg) 69 char *fmt; 70 char *msg; 71 { 72 #ifdef RPC_SVC_FG 73 if (_rpcpmstart) 74 syslog(LOG_ERR, fmt, msg); 75 else { 76 (void) fprintf(stderr, fmt, msg); 77 (void) putc('\n', stderr); 78 } 79 #else 80 syslog(LOG_ERR, fmt, msg); 81 #endif 82 } 83 #endif /* defined(RPC_MSGOUT) */ 84 85 void 86 gssprog_1(rqstp, transp) 87 struct svc_req *rqstp; 88 register SVCXPRT *transp; 89 { 90 union { 91 gss_acquire_cred_arg gss_acquire_cred_1_arg; 92 gss_release_cred_arg gss_release_cred_1_arg; 93 gss_init_sec_context_arg gss_init_sec_context_1_arg; 94 gss_accept_sec_context_arg gss_accept_sec_context_1_arg; 95 gss_process_context_token_arg gss_process_context_token_1_arg; 96 gss_delete_sec_context_arg gss_delete_sec_context_1_arg; 97 gss_context_time_arg gss_context_time_1_arg; 98 gss_sign_arg gss_sign_1_arg; 99 gss_verify_arg gss_verify_1_arg; 100 gss_display_status_arg gss_display_status_1_arg; 101 gss_inquire_cred_arg gss_inquire_cred_1_arg; 102 gss_seal_arg gss_seal_1_arg; 103 gss_unseal_arg gss_unseal_1_arg; 104 gsscred_expname_to_unix_cred_arg gsscred_expname_to_unix_cred_1_arg; 105 gsscred_name_to_unix_cred_arg gsscred_name_to_unix_cred_1_arg; 106 gss_get_group_info_arg gss_get_group_info_1_arg; 107 gss_get_kmod_arg gss_get_kmod_1_arg; 108 gss_export_sec_context_arg gss_export_sec_context_1_arg; 109 gss_import_sec_context_arg gss_import_sec_context_1_arg; 110 gss_add_cred_arg gss_add_cred_1_arg; 111 gss_inquire_cred_by_mech_arg gss_inquire_cred_by_mech_1_arg; 112 } argument; 113 union { 114 gss_acquire_cred_res gss_acquire_cred_1_res; 115 gss_release_cred_res gss_release_cred_1_res; 116 gss_init_sec_context_res gss_init_sec_context_1_res; 117 gss_accept_sec_context_res gss_accept_sec_context_1_res; 118 gss_process_context_token_res gss_process_context_token_1_res; 119 gss_delete_sec_context_res gss_delete_sec_context_1_res; 120 gss_context_time_res gss_context_time_1_res; 121 gss_sign_res gss_sign_1_res; 122 gss_verify_res gss_verify_1_res; 123 gss_display_status_res gss_display_status_1_res; 124 gss_indicate_mechs_res gss_indicate_mechs_1_res; 125 gss_inquire_cred_res gss_inquire_cred_1_res; 126 gss_seal_res gss_seal_1_res; 127 gss_unseal_res gss_unseal_1_res; 128 gsscred_expname_to_unix_cred_res gsscred_expname_to_unix_cred_1_res; 129 gsscred_name_to_unix_cred_res gsscred_name_to_unix_cred_1_res; 130 gss_get_group_info_res gss_get_group_info_1_res; 131 gss_get_kmod_res gss_get_kmod_1_res; 132 gss_export_sec_context_res gss_export_sec_context_1_res; 133 gss_import_sec_context_res gss_import_sec_context_1_res; 134 gss_add_cred_res gss_add_cred_1_res; 135 gss_inquire_cred_by_mech_res gss_inquire_cred_by_mech_1_res; 136 } result; 137 bool_t retval; 138 bool_t (*_xdr_argument)(), (*_xdr_result)(); 139 bool_t (*local)(); 140 141 (void) mutex_lock(&_svcstate_lock); 142 _rpcsvccount++; 143 (void) mutex_unlock(&_svcstate_lock); 144 switch (rqstp->rq_proc) { 145 case NULLPROC: 146 (void) svc_sendreply(transp, xdr_void, 147 NULL); 148 (void) mutex_lock(&_svcstate_lock); 149 _rpcsvccount--; 150 _rpcsvcstate = _SERVED; 151 (void) mutex_unlock(&_svcstate_lock); 152 return; /* CSTYLED */ 153 154 case GSS_ACQUIRE_CRED: 155 _xdr_argument = xdr_gss_acquire_cred_arg; 156 _xdr_result = xdr_gss_acquire_cred_res; 157 local = (bool_t (*)()) 158 gss_acquire_cred_1_svc; 159 break; 160 161 case GSS_RELEASE_CRED: 162 _xdr_argument = xdr_gss_release_cred_arg; 163 _xdr_result = xdr_gss_release_cred_res; 164 local = (bool_t (*)()) 165 gss_release_cred_1_svc; 166 break; 167 168 case GSS_INIT_SEC_CONTEXT: 169 _xdr_argument = xdr_gss_init_sec_context_arg; 170 _xdr_result = xdr_gss_init_sec_context_res; 171 local = (bool_t (*)()) 172 gss_init_sec_context_1_svc; 173 break; 174 175 case GSS_ACCEPT_SEC_CONTEXT: 176 _xdr_argument = xdr_gss_accept_sec_context_arg; 177 _xdr_result = xdr_gss_accept_sec_context_res; 178 local = (bool_t (*)()) 179 gss_accept_sec_context_1_svc; 180 break; 181 182 case GSS_PROCESS_CONTEXT_TOKEN: 183 _xdr_argument = xdr_gss_process_context_token_arg; 184 _xdr_result = xdr_gss_process_context_token_res; 185 local = (bool_t (*)()) 186 gss_process_context_token_1_svc; 187 break; 188 189 case GSS_DELETE_SEC_CONTEXT: 190 _xdr_argument = xdr_gss_delete_sec_context_arg; 191 _xdr_result = xdr_gss_delete_sec_context_res; 192 local = (bool_t (*)()) 193 gss_delete_sec_context_1_svc; 194 break; 195 196 case GSS_CONTEXT_TIME: 197 _xdr_argument = xdr_gss_context_time_arg; 198 _xdr_result = xdr_gss_context_time_res; 199 local = (bool_t (*)()) 200 gss_context_time_1_svc; 201 break; 202 203 case GSS_SIGN: 204 _xdr_argument = xdr_gss_sign_arg; 205 _xdr_result = xdr_gss_sign_res; 206 local = (bool_t (*)()) 207 gss_sign_1_svc; 208 break; 209 210 case GSS_VERIFY: 211 _xdr_argument = xdr_gss_verify_arg; 212 _xdr_result = xdr_gss_verify_res; 213 local = (bool_t (*)()) 214 gss_verify_1_svc; 215 break; 216 217 case GSS_DISPLAY_STATUS: 218 _xdr_argument = xdr_gss_display_status_arg; 219 _xdr_result = xdr_gss_display_status_res; 220 local = (bool_t (*)()) 221 gss_display_status_1_svc; 222 break; 223 224 case GSS_INDICATE_MECHS: 225 _xdr_argument = xdr_void; 226 _xdr_result = xdr_gss_indicate_mechs_res; 227 local = (bool_t (*)()) 228 gss_indicate_mechs_1_svc; 229 break; 230 231 case GSS_INQUIRE_CRED: 232 _xdr_argument = xdr_gss_inquire_cred_arg; 233 _xdr_result = xdr_gss_inquire_cred_res; 234 local = (bool_t (*)()) 235 gss_inquire_cred_1_svc; 236 break; 237 238 case GSS_SEAL: 239 _xdr_argument = xdr_gss_seal_arg; 240 _xdr_result = xdr_gss_seal_res; 241 local = (bool_t (*)()) 242 gss_seal_1_svc; 243 break; 244 245 case GSS_UNSEAL: 246 _xdr_argument = xdr_gss_unseal_arg; 247 _xdr_result = xdr_gss_unseal_res; 248 local = (bool_t (*)()) 249 gss_unseal_1_svc; 250 break; 251 252 case GSSCRED_EXPNAME_TO_UNIX_CRED: 253 _xdr_argument = xdr_gsscred_expname_to_unix_cred_arg; 254 _xdr_result = xdr_gsscred_expname_to_unix_cred_res; 255 local = (bool_t (*)()) 256 gsscred_expname_to_unix_cred_1_svc; 257 break; 258 259 case GSSCRED_NAME_TO_UNIX_CRED: 260 _xdr_argument = xdr_gsscred_name_to_unix_cred_arg; 261 _xdr_result = xdr_gsscred_name_to_unix_cred_res; 262 local = (bool_t (*)()) 263 gsscred_name_to_unix_cred_1_svc; 264 break; 265 266 case GSS_GET_GROUP_INFO: 267 _xdr_argument = xdr_gss_get_group_info_arg; 268 _xdr_result = xdr_gss_get_group_info_res; 269 local = (bool_t (*)()) 270 gss_get_group_info_1_svc; 271 break; 272 273 case GSS_GET_KMOD: 274 _xdr_argument = xdr_gss_get_kmod_arg; 275 _xdr_result = xdr_gss_get_kmod_res; 276 local = (bool_t (*)()) 277 gss_get_kmod_1_svc; 278 break; 279 280 case GSS_EXPORT_SEC_CONTEXT: 281 _xdr_argument = xdr_gss_export_sec_context_arg; 282 _xdr_result = xdr_gss_export_sec_context_res; 283 local = (bool_t (*)()) 284 gss_export_sec_context_1_svc; 285 break; 286 287 case GSS_IMPORT_SEC_CONTEXT: 288 _xdr_argument = xdr_gss_import_sec_context_arg; 289 _xdr_result = xdr_gss_import_sec_context_res; 290 local = (bool_t (*)()) 291 gss_import_sec_context_1_svc; 292 break; 293 294 case GSS_ADD_CRED: 295 _xdr_argument = xdr_gss_add_cred_arg; 296 _xdr_result = xdr_gss_add_cred_res; 297 local = (bool_t (*)()) 298 gss_add_cred_1_svc; 299 break; 300 301 case GSS_INQUIRE_CRED_BY_MECH: 302 _xdr_argument = xdr_gss_inquire_cred_by_mech_arg; 303 _xdr_result = xdr_gss_inquire_cred_by_mech_res; 304 local = (bool_t (*)()) 305 gss_inquire_cred_by_mech_1_svc; 306 break; 307 308 default: 309 svcerr_noproc(transp); 310 (void) mutex_lock(&_svcstate_lock); 311 _rpcsvccount--; 312 _rpcsvcstate = _SERVED; 313 (void) mutex_unlock(&_svcstate_lock); 314 return; /* CSTYLED */ 315 } 316 (void) memset((char *)&argument, 0, sizeof (argument)); 317 if (!svc_getargs(transp, _xdr_argument, (caddr_t)&argument)) { 318 svcerr_decode(transp); 319 (void) mutex_lock(&_svcstate_lock); 320 _rpcsvccount--; 321 _rpcsvcstate = _SERVED; 322 (void) mutex_unlock(&_svcstate_lock); 323 return; /* CSTYLED */ 324 } 325 retval = (bool_t)(*local)(&argument, &result, rqstp); 326 if (_xdr_result && retval > 0 && 327 !svc_sendreply(transp, _xdr_result, (char *)&result)) { 328 svcerr_systemerr(transp); 329 } 330 if (!svc_freeargs(transp, _xdr_argument, (caddr_t)&argument)) { 331 RPC_MSGOUT("%s", 332 "unable to free arguments"); 333 exit(1); 334 } 335 if (_xdr_result != NULL) { 336 if (!gssprog_1_freeresult(transp, _xdr_result, 337 (caddr_t)&result)) 338 RPC_MSGOUT("%s", 339 "unable to free results"); 340 341 } 342 (void) mutex_lock(&_svcstate_lock); 343 _rpcsvccount--; 344 _rpcsvcstate = _SERVED; 345 (void) mutex_unlock(&_svcstate_lock); 346 return; /* CSTYLED */ 347 } 348