Imported Upstream version 1.15.1
[platform/upstream/krb5.git] / src / lib / rpc / unit-test / rpc_test_svc.c
1 #include "rpc_test.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h> /* getenv, exit */
5 #include <sys/types.h>
6 #include <syslog.h>
7
8 /* States a server can be in wrt request */
9
10 #define _IDLE 0
11 #define _SERVED 1
12
13 static int _rpcsvcstate = _IDLE;        /* Set when a request is serviced */
14 static int _rpcsvccount = 0;            /* Number of requests being serviced */
15
16 void
17 rpc_test_prog_1_svc(rqstp, transp)
18         struct svc_req *rqstp;
19         register SVCXPRT *transp;
20 {
21         union {
22                 char *rpc_test_echo_1_arg;
23         } argument;
24         char *result;
25         bool_t (*xdr_argument)(), (*xdr_result)();
26         char *(*local)();
27
28         _rpcsvccount++;
29         switch (rqstp->rq_proc) {
30         case NULLPROC:
31                 (void) svc_sendreply(transp, xdr_void,
32                         (char *)NULL);
33                 _rpcsvccount--;
34                 _rpcsvcstate = _SERVED;
35                 return;
36
37         case RPC_TEST_ECHO:
38                 xdr_argument = xdr_wrapstring;
39                 xdr_result = xdr_wrapstring;
40                 local = (char *(*)()) rpc_test_echo_1_svc;
41                 break;
42
43         default:
44                 svcerr_noproc(transp);
45                 _rpcsvccount--;
46                 _rpcsvcstate = _SERVED;
47                 return;
48         }
49         (void) memset(&argument, 0, sizeof (argument));
50         if (!svc_getargs(transp, xdr_argument, &argument)) {
51                 svcerr_decode(transp);
52                 _rpcsvccount--;
53                 _rpcsvcstate = _SERVED;
54                 return;
55         }
56         result = (*local)(&argument, rqstp);
57         if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
58                 svcerr_systemerr(transp);
59         }
60         if (!svc_freeargs(transp, xdr_argument, &argument)) {
61                 syslog(LOG_ERR, "unable to free arguments");
62                 exit(1);
63         }
64         _rpcsvccount--;
65         _rpcsvcstate = _SERVED;
66         return;
67 }