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