rpc_svcout.c revision 1.5 1 1.1 glass /* @(#)rpc_svcout.c 2.1 88/08/01 4.0 RPCSRC */
2 1.1 glass /*
3 1.1 glass * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4 1.1 glass * unrestricted use provided that this legend is included on all tape
5 1.1 glass * media and as a part of the software program in whole or part. Users
6 1.1 glass * may copy or modify Sun RPC without charge, but are not authorized
7 1.1 glass * to license or distribute it to anyone else except as part of a product or
8 1.1 glass * program developed by the user.
9 1.1 glass *
10 1.1 glass * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11 1.1 glass * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12 1.1 glass * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13 1.1 glass *
14 1.1 glass * Sun RPC is provided with no support and without any obligation on the
15 1.1 glass * part of Sun Microsystems, Inc. to assist in its use, correction,
16 1.1 glass * modification or enhancement.
17 1.1 glass *
18 1.1 glass * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19 1.1 glass * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20 1.1 glass * OR ANY PART THEREOF.
21 1.1 glass *
22 1.1 glass * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23 1.1 glass * or profits or other special, indirect and consequential damages, even if
24 1.1 glass * Sun has been advised of the possibility of such damages.
25 1.1 glass *
26 1.1 glass * Sun Microsystems, Inc.
27 1.1 glass * 2550 Garcia Avenue
28 1.1 glass * Mountain View, California 94043
29 1.1 glass */
30 1.1 glass #ifndef lint
31 1.3 mycroft /*static char sccsid[] = "from: @(#)rpc_svcout.c 1.6 87/06/24 (C) 1987 SMI";*/
32 1.5 cgd static char rcsid[] = "$Id: rpc_svcout.c,v 1.5 1995/03/06 04:59:27 cgd Exp $";
33 1.1 glass #endif
34 1.1 glass
35 1.1 glass /*
36 1.1 glass * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
37 1.1 glass * Copyright (C) 1987, Sun Microsytsems, Inc.
38 1.1 glass */
39 1.1 glass #include <stdio.h>
40 1.1 glass #include <strings.h>
41 1.1 glass #include "rpc_parse.h"
42 1.1 glass #include "rpc_util.h"
43 1.1 glass
44 1.1 glass static char RQSTP[] = "rqstp";
45 1.1 glass static char TRANSP[] = "transp";
46 1.1 glass static char ARG[] = "argument";
47 1.1 glass static char RESULT[] = "result";
48 1.1 glass static char ROUTINE[] = "local";
49 1.1 glass
50 1.2 mycroft static int write_program(), printerr(), printif();
51 1.1 glass /*
52 1.1 glass * write most of the service, that is, everything but the registrations.
53 1.1 glass */
54 1.1 glass void
55 1.1 glass write_most()
56 1.1 glass {
57 1.1 glass list *l;
58 1.1 glass definition *def;
59 1.1 glass version_list *vp;
60 1.1 glass
61 1.1 glass for (l = defined; l != NULL; l = l->next) {
62 1.1 glass def = (definition *) l->val;
63 1.1 glass if (def->def_kind == DEF_PROGRAM) {
64 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
65 1.1 glass f_print(fout, "\nstatic void ");
66 1.1 glass pvname(def->def_name, vp->vers_num);
67 1.1 glass f_print(fout, "();");
68 1.1 glass }
69 1.1 glass }
70 1.1 glass }
71 1.1 glass f_print(fout, "\n\n");
72 1.1 glass f_print(fout, "main()\n");
73 1.1 glass f_print(fout, "{\n");
74 1.1 glass f_print(fout, "\tSVCXPRT *%s;\n", TRANSP);
75 1.1 glass f_print(fout, "\n");
76 1.1 glass for (l = defined; l != NULL; l = l->next) {
77 1.1 glass def = (definition *) l->val;
78 1.1 glass if (def->def_kind != DEF_PROGRAM) {
79 1.1 glass continue;
80 1.1 glass }
81 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
82 1.1 glass f_print(fout, "\t(void)pmap_unset(%s, %s);\n", def->def_name, vp->vers_name);
83 1.1 glass }
84 1.1 glass }
85 1.1 glass }
86 1.1 glass
87 1.1 glass
88 1.1 glass /*
89 1.1 glass * write a registration for the given transport
90 1.1 glass */
91 1.1 glass void
92 1.1 glass write_register(transp)
93 1.1 glass char *transp;
94 1.1 glass {
95 1.1 glass list *l;
96 1.1 glass definition *def;
97 1.1 glass version_list *vp;
98 1.1 glass
99 1.1 glass f_print(fout, "\n");
100 1.1 glass f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp);
101 1.1 glass if (streq(transp, "tcp")) {
102 1.1 glass f_print(fout, ", 0, 0");
103 1.1 glass }
104 1.1 glass f_print(fout, ");\n");
105 1.1 glass f_print(fout, "\tif (%s == NULL) {\n", TRANSP);
106 1.1 glass f_print(fout, "\t\t(void)fprintf(stderr, \"cannot create %s service.\\n\");\n", transp);
107 1.1 glass f_print(fout, "\t\texit(1);\n");
108 1.1 glass f_print(fout, "\t}\n");
109 1.1 glass
110 1.1 glass for (l = defined; l != NULL; l = l->next) {
111 1.1 glass def = (definition *) l->val;
112 1.1 glass if (def->def_kind != DEF_PROGRAM) {
113 1.1 glass continue;
114 1.1 glass }
115 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
116 1.1 glass f_print(fout,
117 1.1 glass "\tif (!svc_register(%s, %s, %s, ",
118 1.1 glass TRANSP, def->def_name, vp->vers_name);
119 1.1 glass pvname(def->def_name, vp->vers_num);
120 1.1 glass f_print(fout, ", IPPROTO_%s)) {\n",
121 1.1 glass streq(transp, "udp") ? "UDP" : "TCP");
122 1.1 glass f_print(fout,
123 1.1 glass "\t\t(void)fprintf(stderr, \"unable to register (%s, %s, %s).\\n\");\n",
124 1.1 glass def->def_name, vp->vers_name, transp);
125 1.1 glass f_print(fout, "\t\texit(1);\n");
126 1.1 glass f_print(fout, "\t}\n");
127 1.1 glass }
128 1.1 glass }
129 1.1 glass }
130 1.1 glass
131 1.1 glass
132 1.1 glass /*
133 1.1 glass * write the rest of the service
134 1.1 glass */
135 1.1 glass void
136 1.1 glass write_rest()
137 1.1 glass {
138 1.1 glass f_print(fout, "\tsvc_run();\n");
139 1.1 glass f_print(fout, "\t(void)fprintf(stderr, \"svc_run returned\\n\");\n");
140 1.1 glass f_print(fout, "\texit(1);\n");
141 1.1 glass f_print(fout, "}\n");
142 1.1 glass }
143 1.1 glass
144 1.1 glass void
145 1.1 glass write_programs(storage)
146 1.1 glass char *storage;
147 1.1 glass {
148 1.1 glass list *l;
149 1.1 glass definition *def;
150 1.1 glass
151 1.1 glass for (l = defined; l != NULL; l = l->next) {
152 1.1 glass def = (definition *) l->val;
153 1.1 glass if (def->def_kind == DEF_PROGRAM) {
154 1.1 glass write_program(def, storage);
155 1.1 glass }
156 1.1 glass }
157 1.1 glass }
158 1.1 glass
159 1.1 glass
160 1.1 glass static
161 1.1 glass write_program(def, storage)
162 1.1 glass definition *def;
163 1.1 glass char *storage;
164 1.1 glass {
165 1.1 glass version_list *vp;
166 1.1 glass proc_list *proc;
167 1.1 glass int filled;
168 1.1 glass
169 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
170 1.1 glass f_print(fout, "\n");
171 1.1 glass if (storage != NULL) {
172 1.1 glass f_print(fout, "%s ", storage);
173 1.1 glass }
174 1.1 glass f_print(fout, "void\n");
175 1.1 glass pvname(def->def_name, vp->vers_num);
176 1.1 glass f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
177 1.1 glass f_print(fout, " struct svc_req *%s;\n", RQSTP);
178 1.1 glass f_print(fout, " SVCXPRT *%s;\n", TRANSP);
179 1.1 glass f_print(fout, "{\n");
180 1.1 glass
181 1.1 glass filled = 0;
182 1.1 glass f_print(fout, "\tunion {\n");
183 1.1 glass for (proc = vp->procs; proc != NULL; proc = proc->next) {
184 1.1 glass if (streq(proc->arg_type, "void")) {
185 1.1 glass continue;
186 1.1 glass }
187 1.1 glass filled = 1;
188 1.1 glass f_print(fout, "\t\t");
189 1.1 glass ptype(proc->arg_prefix, proc->arg_type, 0);
190 1.1 glass pvname(proc->proc_name, vp->vers_num);
191 1.1 glass f_print(fout, "_arg;\n");
192 1.1 glass }
193 1.1 glass if (!filled) {
194 1.1 glass f_print(fout, "\t\tint fill;\n");
195 1.1 glass }
196 1.1 glass f_print(fout, "\t} %s;\n", ARG);
197 1.1 glass f_print(fout, "\tchar *%s;\n", RESULT);
198 1.1 glass f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
199 1.1 glass f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
200 1.1 glass f_print(fout, "\n");
201 1.1 glass f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
202 1.1 glass
203 1.1 glass if (!nullproc(vp->procs)) {
204 1.1 glass f_print(fout, "\tcase NULLPROC:\n");
205 1.1 glass f_print(fout, "\t\t(void)svc_sendreply(%s, xdr_void, (char *)NULL);\n", TRANSP);
206 1.1 glass f_print(fout, "\t\treturn;\n\n");
207 1.1 glass }
208 1.1 glass for (proc = vp->procs; proc != NULL; proc = proc->next) {
209 1.1 glass f_print(fout, "\tcase %s:\n", proc->proc_name);
210 1.1 glass f_print(fout, "\t\txdr_%s = xdr_%s;\n", ARG,
211 1.1 glass stringfix(proc->arg_type));
212 1.1 glass f_print(fout, "\t\txdr_%s = xdr_%s;\n", RESULT,
213 1.1 glass stringfix(proc->res_type));
214 1.1 glass f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
215 1.1 glass pvname(proc->proc_name, vp->vers_num);
216 1.1 glass f_print(fout, ";\n");
217 1.1 glass f_print(fout, "\t\tbreak;\n\n");
218 1.1 glass }
219 1.1 glass f_print(fout, "\tdefault:\n");
220 1.1 glass printerr("noproc", TRANSP);
221 1.1 glass f_print(fout, "\t\treturn;\n");
222 1.1 glass f_print(fout, "\t}\n");
223 1.1 glass
224 1.5 cgd f_print(fout, "\tmemset((char *)&%s, 0, sizeof(%s));\n", ARG,
225 1.5 cgd ARG);
226 1.4 cgd printif("getargs", TRANSP, "(caddr_t)&", ARG);
227 1.1 glass printerr("decode", TRANSP);
228 1.1 glass f_print(fout, "\t\treturn;\n");
229 1.1 glass f_print(fout, "\t}\n");
230 1.1 glass
231 1.1 glass f_print(fout, "\t%s = (*%s)(&%s, %s);\n", RESULT, ROUTINE, ARG,
232 1.1 glass RQSTP);
233 1.1 glass f_print(fout,
234 1.1 glass "\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n",
235 1.1 glass RESULT, TRANSP, RESULT, RESULT);
236 1.1 glass printerr("systemerr", TRANSP);
237 1.1 glass f_print(fout, "\t}\n");
238 1.1 glass
239 1.4 cgd printif("freeargs", TRANSP, "(caddr_t)&", ARG);
240 1.1 glass f_print(fout, "\t\t(void)fprintf(stderr, \"unable to free arguments\\n\");\n");
241 1.1 glass f_print(fout, "\t\texit(1);\n");
242 1.1 glass f_print(fout, "\t}\n");
243 1.1 glass
244 1.1 glass f_print(fout, "}\n\n");
245 1.1 glass }
246 1.1 glass }
247 1.1 glass
248 1.1 glass static
249 1.1 glass printerr(err, transp)
250 1.1 glass char *err;
251 1.1 glass char *transp;
252 1.1 glass {
253 1.1 glass f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
254 1.1 glass }
255 1.1 glass
256 1.1 glass static
257 1.1 glass printif(proc, transp, prefix, arg)
258 1.1 glass char *proc;
259 1.1 glass char *transp;
260 1.1 glass char *prefix;
261 1.1 glass char *arg;
262 1.1 glass {
263 1.1 glass f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n",
264 1.1 glass proc, transp, arg, prefix, arg);
265 1.1 glass }
266 1.1 glass
267 1.1 glass
268 1.1 glass nullproc(proc)
269 1.1 glass proc_list *proc;
270 1.1 glass {
271 1.1 glass for (; proc != NULL; proc = proc->next) {
272 1.1 glass if (streq(proc->proc_num, "0")) {
273 1.1 glass return (1);
274 1.1 glass }
275 1.1 glass }
276 1.1 glass return (0);
277 1.1 glass }
278