Update.
[platform/upstream/glibc.git] / sunrpc / svc_simple.c
1 /* @(#)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 !defined(lint) && defined(SCCSIDS)
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
41 #include <stdio.h>
42 #include <string.h>
43 #include <rpc/rpc.h>
44 #include <rpc/pmap_clnt.h>
45 #include <sys/socket.h>
46 #include <netdb.h>
47
48 #ifdef USE_IN_LIBIO
49 # include <libio/iolibio.h>
50 # define fputs(s, f) _IO_fputs (s, f)
51 #endif
52
53 static struct proglst
54   {
55     char *(*p_progname) (char *);
56     int p_prognum;
57     int p_procnum;
58     xdrproc_t p_inproc, p_outproc;
59     struct proglst *p_nxt;
60   }
61  *proglst;
62
63 static void universal (struct svc_req *rqstp, SVCXPRT *transp);
64 static SVCXPRT *transp;
65
66 int
67 registerrpc (u_long prognum, u_long versnum, u_long procnum,
68              char *(*progname) (char *), xdrproc_t inproc, xdrproc_t outproc)
69 {
70   struct proglst *pl;
71
72   if (procnum == NULLPROC)
73     {
74       (void) fprintf (stderr,
75                       _("can't reassign procedure number %d\n"), NULLPROC);
76       return -1;
77     }
78   if (transp == 0)
79     {
80       transp = svcudp_create (RPC_ANYSOCK);
81       if (transp == NULL)
82         {
83           (void) fputs (_("couldn't create an rpc server\n"), stderr);
84           return -1;
85         }
86     }
87   (void) pmap_unset ((u_long) prognum, (u_long) versnum);
88   if (!svc_register (transp, (u_long) prognum, (u_long) versnum,
89                      universal, IPPROTO_UDP))
90     {
91       (void) fprintf (stderr, _("couldn't register prog %d vers %d\n"),
92                       prognum, versnum);
93       return -1;
94     }
95   pl = (struct proglst *) malloc (sizeof (struct proglst));
96   if (pl == NULL)
97     {
98       (void) fprintf (stderr, _("registerrpc: out of memory\n"));
99       return -1;
100     }
101   pl->p_progname = progname;
102   pl->p_prognum = prognum;
103   pl->p_procnum = procnum;
104   pl->p_inproc = inproc;
105   pl->p_outproc = outproc;
106   pl->p_nxt = proglst;
107   proglst = pl;
108   return 0;
109 }
110
111 static void
112 universal (struct svc_req *rqstp, SVCXPRT *transp)
113 {
114   int prog, proc;
115   char *outdata;
116   char xdrbuf[UDPMSGSIZE];
117   struct proglst *pl;
118
119   /*
120    * enforce "procnum 0 is echo" convention
121    */
122   if (rqstp->rq_proc == NULLPROC)
123     {
124       if (svc_sendreply (transp, (xdrproc_t)xdr_void, (char *) NULL) == FALSE)
125         {
126           (void) fprintf (stderr, "xxx\n");
127           exit (1);
128         }
129       return;
130     }
131   prog = rqstp->rq_prog;
132   proc = rqstp->rq_proc;
133   for (pl = proglst; pl != NULL; pl = pl->p_nxt)
134     if (pl->p_prognum == prog && pl->p_procnum == proc)
135       {
136         /* decode arguments into a CLEAN buffer */
137         __bzero (xdrbuf, sizeof (xdrbuf));      /* required ! */
138         if (!svc_getargs (transp, pl->p_inproc, xdrbuf))
139           {
140             svcerr_decode (transp);
141             return;
142           }
143         outdata = (*(pl->p_progname)) (xdrbuf);
144         if (outdata == NULL && pl->p_outproc != (xdrproc_t)xdr_void)
145           /* there was an error */
146           return;
147         if (!svc_sendreply (transp, pl->p_outproc, outdata))
148           {
149             (void) fprintf (stderr,
150                             _ ("trouble replying to prog %d\n"),
151                             pl->p_prognum);
152             exit (1);
153           }
154         /* free the decoded arguments */
155         (void) svc_freeargs (transp, pl->p_inproc, xdrbuf);
156         return;
157       }
158   (void) fprintf (stderr, _ ("never registered prog %d\n"), prog);
159   exit (1);
160 }