OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [inet/] [rpc/] [svc_simple.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/* @(#)svc_simple.c     2.2 88/08/01 4.0 RPCSRC */
2
/*
3
 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4
 * unrestricted use provided that this legend is included on all tape
5
 * media and as a part of the software program in whole or part.  Users
6
 * may copy or modify Sun RPC without charge, but are not authorized
7
 * to license or distribute it to anyone else except as part of a product or
8
 * program developed by the user.
9
 *
10
 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11
 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13
 *
14
 * Sun RPC is provided with no support and without any obligation on the
15
 * part of Sun Microsystems, Inc. to assist in its use, correction,
16
 * modification or enhancement.
17
 *
18
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20
 * OR ANY PART THEREOF.
21
 *
22
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23
 * or profits or other special, indirect and consequential damages, even if
24
 * Sun has been advised of the possibility of such damages.
25
 *
26
 * Sun Microsystems, Inc.
27
 * 2550 Garcia Avenue
28
 * Mountain View, California  94043
29
 */
30
#if 0
31
static char sccsid[] = "@(#)svc_simple.c 1.18 87/08/11 Copyr 1984 Sun Micro";
32
#endif
33
 
34
/*
35
 * svc_simple.c
36
 * Simplified front end to rpc.
37
 *
38
 * Copyright (C) 1984, Sun Microsystems, Inc.
39
 */
40
#define __FORCE_GLIBC
41
#define _GNU_SOURCE
42
#include <features.h>
43
 
44
#include <stdio.h>
45
#include <string.h>
46
#include <unistd.h>
47
#include "rpc_private.h"
48
#include <rpc/pmap_clnt.h>
49
#include <sys/socket.h>
50
#include <netdb.h>
51
 
52
#ifdef USE_IN_LIBIO
53
# include <wchar.h>
54
# include <libio/iolibio.h>
55
# define fputs(s, f) _IO_fputs (s, f)
56
#endif
57
 
58
struct proglst_
59
  {
60
    char *(*p_progname) (char *);
61
    int p_prognum;
62
    int p_procnum;
63
    xdrproc_t p_inproc, p_outproc;
64
    struct proglst_ *p_nxt;
65
  };
66
#ifdef __UCLIBC_HAS_THREADS__
67
#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s))
68
#else
69
static struct proglst_ *proglst;
70
#endif
71
 
72
 
73
static void universal (struct svc_req *rqstp, SVCXPRT *transp_s);
74
#ifdef __UCLIBC_HAS_THREADS__
75
#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s))
76
#else
77
static SVCXPRT *transp;
78
#endif
79
 
80
int
81
registerrpc (u_long prognum, u_long versnum, u_long procnum,
82
             char *(*progname) (char *), xdrproc_t inproc, xdrproc_t outproc)
83
{
84
  struct proglst_ *pl;
85
  char *buf;
86
 
87
  if (procnum == NULLPROC)
88
    {
89
 
90
      (void) asprintf (&buf, _("can't reassign procedure number %ld\n"),
91
                         NULLPROC);
92
      goto err_out;
93
    }
94
  if (transp == 0)
95
    {
96
      transp = svcudp_create (RPC_ANYSOCK);
97
      if (transp == NULL)
98
        {
99
          buf = strdup (_("couldn't create an rpc server\n"));
100
          goto err_out;
101
        }
102
    }
103
  (void) pmap_unset ((u_long) prognum, (u_long) versnum);
104
  if (!svc_register (transp, (u_long) prognum, (u_long) versnum,
105
                     universal, IPPROTO_UDP))
106
    {
107
      (void) asprintf (&buf, _("couldn't register prog %ld vers %ld\n"),
108
                         prognum, versnum);
109
      goto err_out;
110
    }
111
  pl = (struct proglst_ *) malloc (sizeof (struct proglst_));
112
  if (pl == NULL)
113
    {
114
      buf = strdup (_("registerrpc: out of memory\n"));
115
      goto err_out;
116
    }
117
  pl->p_progname = progname;
118
  pl->p_prognum = prognum;
119
  pl->p_procnum = procnum;
120
  pl->p_inproc = inproc;
121
  pl->p_outproc = outproc;
122
  pl->p_nxt = proglst;
123
  proglst = pl;
124
  return 0;
125
 
126
 err_out:
127
#ifdef USE_IN_LIBIO
128
  if (_IO_fwide (stderr, 0) > 0)
129
    (void) __fwprintf (stderr, L"%s", buf);
130
  else
131
#endif
132
    (void) fputs (buf, stderr);
133
  free (buf);
134
  return -1;
135
}
136
 
137
static void
138
universal (struct svc_req *rqstp, SVCXPRT *transp_l)
139
{
140
  int prog, proc;
141
  char *outdata;
142
  char xdrbuf[UDPMSGSIZE];
143
  struct proglst_ *pl;
144
  char *buf = NULL;
145
 
146
  /*
147
   * enforce "procnum 0 is echo" convention
148
   */
149
  if (rqstp->rq_proc == NULLPROC)
150
    {
151
      if (svc_sendreply (transp_l, (xdrproc_t)xdr_void, (char *) NULL) == FALSE)
152
        {
153
          write (STDERR_FILENO, "xxx\n", 4);
154
          exit (1);
155
        }
156
      return;
157
    }
158
  prog = rqstp->rq_prog;
159
  proc = rqstp->rq_proc;
160
  for (pl = proglst; pl != NULL; pl = pl->p_nxt)
161
    if (pl->p_prognum == prog && pl->p_procnum == proc)
162
      {
163
        /* decode arguments into a CLEAN buffer */
164
        bzero (xdrbuf, sizeof (xdrbuf));        /* required ! */
165
        if (!svc_getargs (transp_l, pl->p_inproc, xdrbuf))
166
          {
167
            svcerr_decode (transp_l);
168
            return;
169
          }
170
        outdata = (*(pl->p_progname)) (xdrbuf);
171
        if (outdata == NULL && pl->p_outproc != (xdrproc_t)xdr_void)
172
          /* there was an error */
173
          return;
174
        if (!svc_sendreply (transp_l, pl->p_outproc, outdata))
175
          {
176
            (void) asprintf (&buf,
177
                               _("trouble replying to prog %d\n"),
178
                               pl->p_prognum);
179
            exit (1);
180
          }
181
        /* free the decoded arguments */
182
        (void) svc_freeargs (transp_l, pl->p_inproc, xdrbuf);
183
        return;
184
      }
185
  (void) asprintf (&buf, _("never registered prog %d\n"), prog);
186
#ifdef USE_IN_LIBIO
187
  if (_IO_fwide (stderr, 0) > 0)
188
    __fwprintf (stderr, L"%s", buf);
189
  else
190
#endif
191
    fputs (buf, stderr);
192
  free (buf);
193
  exit (1);
194
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.