~ubuntu-branches/ubuntu/precise/eglibc/precise-201308281639

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
}