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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [librpc/] [src/] [rpc/] [svc_simple.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
3
 * unrestricted use provided that this legend is included on all tape
4
 * media and as a part of the software program in whole or part.  Users
5
 * may copy or modify Sun RPC without charge, but are not authorized
6
 * to license or distribute it to anyone else except as part of a product or
7
 * program developed by the user.
8
 *
9
 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
10
 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
11
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
12
 *
13
 * Sun RPC is provided with no support and without any obligation on the
14
 * part of Sun Microsystems, Inc. to assist in its use, correction,
15
 * modification or enhancement.
16
 *
17
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
18
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
19
 * OR ANY PART THEREOF.
20
 *
21
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
22
 * or profits or other special, indirect and consequential damages, even if
23
 * Sun has been advised of the possibility of such damages.
24
 *
25
 * Sun Microsystems, Inc.
26
 * 2550 Garcia Avenue
27
 * Mountain View, California  94043
28
 */
29
 
30
#if defined(LIBC_SCCS) && !defined(lint)
31
/*static char *sccsid = "from: @(#)svc_simple.c 1.18 87/08/11 Copyr 1984 Sun Micro";*/
32
/*static char *sccsid = "from: @(#)svc_simple.c 2.2 88/08/01 4.0 RPCSRC";*/
33
static char *rcsid = "$FreeBSD: src/lib/libc/rpc/svc_simple.c,v 1.9 1999/08/28 00:00:50 peter Exp $";
34
#endif
35
 
36
/*
37
 * svc_simple.c
38
 * Simplified front end to rpc.
39
 *
40
 * Copyright (C) 1984, Sun Microsystems, Inc.
41
 */
42
 
43
#include <stdio.h>
44
#include <stdlib.h>
45
#include <string.h>
46
#include <rpc/rpc.h>
47
#include <rpc/pmap_clnt.h>
48
#include <sys/socket.h>
49
#include <netdb.h>
50
 
51
struct prog_lst {
52
        char *(*p_progname)();
53
        int  p_prognum;
54
        int  p_procnum;
55
        xdrproc_t p_inproc, p_outproc;
56
        struct prog_lst *p_nxt;
57
};
58
static void universal();
59
#define proglst ((struct prog_lst *)((struct rtems_rpc_task_variables *)rtems_rpc_task_variables)->svc_simple_proglst)
60
#define pl ((struct prog_lst *)((struct rtems_rpc_task_variables *)rtems_rpc_task_variables)->svc_simple_pl)
61
#define transp ((SVCXPRT *)((struct rtems_rpc_task_variables *)rtems_rpc_task_variables)->svc_simple_transp)
62
 
63
int
64
registerrpc(prognum, versnum, procnum, progname, inproc, outproc)
65
        int prognum, versnum, procnum;
66
        char *(*progname)();
67
        xdrproc_t inproc, outproc;
68
{
69
 
70
        if (procnum == NULLPROC) {
71
                (void) fprintf(stderr,
72
                    "can't reassign procedure number %ld\n", NULLPROC);
73
                return (-1);
74
        }
75
        if (transp == 0) {
76
                transp = svcudp_create(RPC_ANYSOCK);
77
                if (transp == NULL) {
78
                        (void) fprintf(stderr, "couldn't create an rpc server\n");
79
                        return (-1);
80
                }
81
        }
82
        (void) pmap_unset((u_long)prognum, (u_long)versnum);
83
        if (!svc_register(transp, (u_long)prognum, (u_long)versnum,
84
            universal, IPPROTO_UDP)) {
85
                (void) fprintf(stderr, "couldn't register prog %d vers %d\n",
86
                    prognum, versnum);
87
                return (-1);
88
        }
89
        pl = (struct prog_lst *)malloc(sizeof(struct prog_lst));
90
        if (pl == NULL) {
91
                (void) fprintf(stderr, "registerrpc: out of memory\n");
92
                return (-1);
93
        }
94
        pl->p_progname = progname;
95
        pl->p_prognum = prognum;
96
        pl->p_procnum = procnum;
97
        pl->p_inproc = inproc;
98
        pl->p_outproc = outproc;
99
        pl->p_nxt = proglst;
100
        proglst = pl;
101
        return (0);
102
}
103
 
104
static void
105
universal(rqstp, atransp)
106
        struct svc_req *rqstp;
107
        SVCXPRT *atransp;
108
{
109
        int prog, proc;
110
        char *outdata;
111
        char xdrbuf[UDPMSGSIZE];
112
        struct prog_lst *lpl;
113
 
114
        /*
115
         * enforce "procnum 0 is echo" convention
116
         */
117
        if (rqstp->rq_proc == NULLPROC) {
118
                if (svc_sendreply(atransp, xdr_void, NULL) == FALSE) {
119
                        (void) fprintf(stderr, "xxx\n");
120
                        exit(1);
121
                }
122
                return;
123
        }
124
        prog = rqstp->rq_prog;
125
        proc = rqstp->rq_proc;
126
        for (lpl = proglst; lpl != NULL; lpl = lpl->p_nxt)
127
                if (lpl->p_prognum == prog && lpl->p_procnum == proc) {
128
                        /* decode arguments into a CLEAN buffer */
129
                        memset(xdrbuf, 0, sizeof(xdrbuf)); /* required ! */
130
                        if (!svc_getargs(atransp, lpl->p_inproc, xdrbuf)) {
131
                                svcerr_decode(atransp);
132
                                return;
133
                        }
134
                        outdata = (*(lpl->p_progname))(xdrbuf);
135
                        if (outdata == NULL && lpl->p_outproc != xdr_void)
136
                                /* there was an error */
137
                                return;
138
                        if (!svc_sendreply(atransp, lpl->p_outproc, outdata)) {
139
                                (void) fprintf(stderr,
140
                                    "trouble replying to prog %d\n",
141
                                    lpl->p_prognum);
142
                                exit(1);
143
                        }
144
                        /* free the decoded arguments */
145
                        (void)svc_freeargs(atransp, lpl->p_inproc, xdrbuf);
146
                        return;
147
                }
148
        (void) fprintf(stderr, "never registered prog %d\n", prog);
149
        exit(1);
150
}
151
 

powered by: WebSVN 2.1.0

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