|
|
1.1 root 1: /*
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: #ifndef lint
30: static char sccsid[] = "@(#)svc_simple.c 1.3 85/03/14 Copyr 1984 Sun Micro";
31: #endif
32:
33: /*
34: * svc_simple.c
35: * Simplified front end to rpc.
36: *
37: * Copyright (C) 1984, Sun Microsystems, Inc.
38: */
39:
40: #include <stdio.h>
41: #include <rpc/rpc.h>
42: #include <sys/socket.h>
43: #include <sys/time.h>
44: #include <netdb.h>
45:
46: static struct proglst {
47: char *(*p_progname)();
48: int p_prognum;
49: int p_procnum;
50: xdrproc_t p_inproc, p_outproc;
51: struct proglst *p_nxt;
52: } *proglst;
53: int universal();
54:
55: registerrpc(prognum, versnum, procnum, progname, inproc, outproc)
56: char *(*progname)();
57: xdrproc_t inproc, outproc;
58: {
59: static SVCXPRT *transp;
60: static madetransp = 0;
61: struct proglst *pl;
62:
63: if (procnum == NULLPROC) {
64: fprintf(stderr,
65: "can't reassign procedure number %d\n", NULLPROC);
66: return (-1);
67: }
68: if (!madetransp) {
69: madetransp = 1;
70: transp = svcudp_create(RPC_ANYSOCK);
71: if (transp == NULL) {
72: fprintf(stderr, "couldn't create an rpc server\n");
73: return (-1);
74: }
75: }
76: pmap_unset(prognum, versnum);
77: if (!svc_register(transp, prognum, versnum, universal, IPPROTO_UDP)) {
78: fprintf(stderr, "couldn't register prog %d vers %d\n",
79: prognum, versnum);
80: return (-1);
81: }
82: pl = (struct proglst *)malloc(sizeof(struct proglst));
83: if (pl == NULL) {
84: fprintf(stderr, "registerrpc: out of memory\n");
85: return (-1);
86: }
87: pl->p_progname = progname;
88: pl->p_prognum = prognum;
89: pl->p_procnum = procnum;
90: pl->p_inproc = inproc;
91: pl->p_outproc = outproc;
92: pl->p_nxt = proglst;
93: proglst = pl;
94: return (0);
95: }
96:
97: static
98: universal(rqstp, transp)
99: struct svc_req *rqstp;
100: SVCXPRT *transp;
101: {
102: int prog, proc, i;
103: char *outdata;
104: char xdrbuf[UDPMSGSIZE];
105: struct proglst *pl;
106:
107: /*
108: * enforce "procnum 0 is echo" convention
109: */
110: if (rqstp->rq_proc == NULLPROC) {
111: if (svc_sendreply(transp, xdr_void, 0) == FALSE) {
112: fprintf(stderr, "xxx\n");
113: exit(1);
114: }
115: return;
116: }
117: prog = rqstp->rq_prog;
118: proc = rqstp->rq_proc;
119: for (pl = proglst; pl != NULL; pl = pl->p_nxt)
120: if (pl->p_prognum == prog && pl->p_procnum == proc) {
121: /* decode arguments into a CLEAN buffer */
122: bzero(xdrbuf, sizeof(xdrbuf)); /* required ! */
123: if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) {
124: svcerr_decode(transp);
125: return;
126: }
127: outdata = (*(pl->p_progname))(xdrbuf);
128: if (outdata == NULL && pl->p_outproc != xdr_void)
129: /* there was an error */
130: return;
131: if (!svc_sendreply(transp, pl->p_outproc, outdata)) {
132: fprintf(stderr,
133: "trouble replying to prog %d\n",
134: pl->p_prognum);
135: exit(1);
136: /* free the decoded arguments */
137: (void)svc_freeargs(transp, pl->p_inproc, xdrbuf);
138: }
139: return;
140: }
141: fprintf(stderr, "never registered prog %d\n", prog);
142: exit(1);
143: }
144:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.