1
by Aurelien Jarno
Import upstream version 2.9 |
1 |
/*
|
2 |
* svc_simple.c
|
|
3 |
* Simplified front end to rpc.
|
|
4 |
*
|
|
108
by Matthias Klose
* Generate 2.13 tarball based on r12879/2.13 branch. |
5 |
* Copyright (c) 2010, Oracle America, Inc.
|
1.1.2
by Matthias Klose
Import upstream version 2.10.1 |
6 |
*
|
7 |
* Redistribution and use in source and binary forms, with or without
|
|
8 |
* modification, are permitted provided that the following conditions are
|
|
9 |
* met:
|
|
10 |
*
|
|
11 |
* * Redistributions of source code must retain the above copyright
|
|
12 |
* notice, this list of conditions and the following disclaimer.
|
|
13 |
* * Redistributions in binary form must reproduce the above
|
|
14 |
* copyright notice, this list of conditions and the following
|
|
15 |
* disclaimer in the documentation and/or other materials
|
|
16 |
* provided with the distribution.
|
|
108
by Matthias Klose
* Generate 2.13 tarball based on r12879/2.13 branch. |
17 |
* * Neither the name of the "Oracle America, Inc." nor the names of its
|
1.1.2
by Matthias Klose
Import upstream version 2.10.1 |
18 |
* contributors may be used to endorse or promote products derived
|
19 |
* from this software without specific prior written permission.
|
|
20 |
*
|
|
21 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
22 |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
23 |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
24 |
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
25 |
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
26 |
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
27 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
28 |
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
29 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
30 |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
31 |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
32 |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1
by Aurelien Jarno
Import upstream version 2.9 |
33 |
*/
|
34 |
||
35 |
#include <stdio.h> |
|
36 |
#include <string.h> |
|
37 |
#include <libintl.h> |
|
38 |
#include <unistd.h> |
|
39 |
#include <rpc/rpc.h> |
|
40 |
#include <rpc/pmap_clnt.h> |
|
41 |
#include <sys/socket.h> |
|
42 |
#include <netdb.h> |
|
43 |
||
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
44 |
#include <wchar.h> |
45 |
#include <libio/iolibio.h> |
|
1
by Aurelien Jarno
Import upstream version 2.9 |
46 |
|
47 |
struct proglst_ |
|
48 |
{
|
|
49 |
char *(*p_progname) (char *); |
|
50 |
int p_prognum; |
|
51 |
int p_procnum; |
|
52 |
xdrproc_t p_inproc, p_outproc; |
|
53 |
struct proglst_ *p_nxt; |
|
54 |
};
|
|
55 |
#ifdef _RPC_THREAD_SAFE_
|
|
56 |
#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s)
|
|
57 |
#else
|
|
58 |
static struct proglst_ *proglst; |
|
59 |
#endif
|
|
60 |
||
61 |
||
62 |
static void universal (struct svc_req *rqstp, SVCXPRT *transp_s); |
|
63 |
#ifdef _RPC_THREAD_SAFE_
|
|
64 |
#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s)
|
|
65 |
#else
|
|
66 |
static SVCXPRT *transp; |
|
67 |
#endif
|
|
68 |
||
69 |
int
|
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
70 |
__registerrpc (u_long prognum, u_long versnum, u_long procnum, |
71 |
char *(*progname) (char *), xdrproc_t inproc, xdrproc_t outproc) |
|
1
by Aurelien Jarno
Import upstream version 2.9 |
72 |
{
|
73 |
struct proglst_ *pl; |
|
74 |
char *buf; |
|
75 |
||
76 |
if (procnum == NULLPROC) |
|
77 |
{
|
|
78 |
||
79 |
if (__asprintf (&buf, _("can't reassign procedure number %ld\n"), |
|
80 |
NULLPROC) < 0) |
|
81 |
buf = NULL; |
|
82 |
goto err_out; |
|
83 |
}
|
|
84 |
if (transp == 0) |
|
85 |
{
|
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
86 |
transp = svcudp_create (RPC_ANYSOCK); |
1
by Aurelien Jarno
Import upstream version 2.9 |
87 |
if (transp == NULL) |
88 |
{
|
|
89 |
buf = strdup (_("couldn't create an rpc server\n")); |
|
90 |
goto err_out; |
|
91 |
}
|
|
92 |
}
|
|
93 |
(void) pmap_unset ((u_long) prognum, (u_long) versnum); |
|
94 |
if (!svc_register (transp, (u_long) prognum, (u_long) versnum, |
|
95 |
universal, IPPROTO_UDP)) |
|
96 |
{
|
|
97 |
if (__asprintf (&buf, _("couldn't register prog %ld vers %ld\n"), |
|
98 |
prognum, versnum) < 0) |
|
99 |
buf = NULL; |
|
100 |
goto err_out; |
|
101 |
}
|
|
102 |
pl = (struct proglst_ *) malloc (sizeof (struct proglst_)); |
|
103 |
if (pl == NULL) |
|
104 |
{
|
|
105 |
buf = strdup (_("registerrpc: out of memory\n")); |
|
106 |
goto err_out; |
|
107 |
}
|
|
108 |
pl->p_progname = progname; |
|
109 |
pl->p_prognum = prognum; |
|
110 |
pl->p_procnum = procnum; |
|
111 |
pl->p_inproc = inproc; |
|
112 |
pl->p_outproc = outproc; |
|
113 |
pl->p_nxt = proglst; |
|
114 |
proglst = pl; |
|
115 |
return 0; |
|
116 |
||
117 |
err_out: |
|
118 |
if (buf == NULL) |
|
119 |
return -1; |
|
120 |
(void) __fxprintf (NULL, "%s", buf); |
|
121 |
free (buf); |
|
122 |
return -1; |
|
123 |
}
|
|
1.5.3
by Matthias Klose
Import upstream version 2.15~pre6 |
124 |
compat_symbol (libc, __registerrpc, registerrpc, GLIBC_2_0); |
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
125 |
|
1
by Aurelien Jarno
Import upstream version 2.9 |
126 |
static void |
127 |
universal (struct svc_req *rqstp, SVCXPRT *transp_l) |
|
128 |
{
|
|
129 |
int prog, proc; |
|
130 |
char *outdata; |
|
131 |
char xdrbuf[UDPMSGSIZE]; |
|
132 |
struct proglst_ *pl; |
|
133 |
char *buf = NULL; |
|
134 |
||
135 |
/*
|
|
136 |
* enforce "procnum 0 is echo" convention
|
|
137 |
*/
|
|
138 |
if (rqstp->rq_proc == NULLPROC) |
|
139 |
{
|
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
140 |
if (svc_sendreply (transp_l, (xdrproc_t)xdr_void, |
141 |
(char *) NULL) == FALSE) |
|
1
by Aurelien Jarno
Import upstream version 2.9 |
142 |
{
|
143 |
__write (STDERR_FILENO, "xxx\n", 4); |
|
144 |
exit (1); |
|
145 |
}
|
|
146 |
return; |
|
147 |
}
|
|
148 |
prog = rqstp->rq_prog; |
|
149 |
proc = rqstp->rq_proc; |
|
150 |
for (pl = proglst; pl != NULL; pl = pl->p_nxt) |
|
151 |
if (pl->p_prognum == prog && pl->p_procnum == proc) |
|
152 |
{
|
|
153 |
/* decode arguments into a CLEAN buffer */
|
|
154 |
__bzero (xdrbuf, sizeof (xdrbuf)); /* required ! */ |
|
155 |
if (!svc_getargs (transp_l, pl->p_inproc, xdrbuf)) |
|
156 |
{
|
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
157 |
svcerr_decode (transp_l); |
1
by Aurelien Jarno
Import upstream version 2.9 |
158 |
return; |
159 |
}
|
|
160 |
outdata = (*(pl->p_progname)) (xdrbuf); |
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
161 |
if (outdata == NULL && pl->p_outproc != (xdrproc_t)xdr_void) |
1
by Aurelien Jarno
Import upstream version 2.9 |
162 |
/* there was an error */
|
163 |
return; |
|
1.4.2
by Aurelien Jarno
Import upstream version 2.16 |
164 |
if (!svc_sendreply (transp_l, pl->p_outproc, outdata)) |
1
by Aurelien Jarno
Import upstream version 2.9 |
165 |
{
|
166 |
if (__asprintf (&buf, _("trouble replying to prog %d\n"), |
|
167 |
pl->p_prognum) < 0) |
|
168 |
buf = NULL; |
|
169 |
goto err_out2; |
|
170 |
}
|
|
171 |
/* free the decoded arguments */
|
|
172 |
(void) svc_freeargs (transp_l, pl->p_inproc, xdrbuf); |
|
173 |
return; |
|
174 |
}
|
|
175 |
if (__asprintf (&buf, _("never registered prog %d\n"), prog) < 0) |
|
176 |
buf = NULL; |
|
177 |
err_out2: |
|
178 |
if (buf == NULL) |
|
179 |
exit (1); |
|
180 |
__fxprintf (NULL, "%s", buf); |
|
181 |
free (buf); |
|
182 |
exit (1); |
|
183 |
}
|