rpc_svcout.c revision 1.1 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.1 glass static char sccsid[] = "@(#)rpc_svcout.c 1.6 87/06/24 (C) 1987 SMI";
32 1.1 glass #endif
33 1.1 glass
34 1.1 glass /*
35 1.1 glass * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
36 1.1 glass * Copyright (C) 1987, Sun Microsytsems, Inc.
37 1.1 glass */
38 1.1 glass #include <stdio.h>
39 1.1 glass #include <strings.h>
40 1.1 glass #include "rpc_parse.h"
41 1.1 glass #include "rpc_util.h"
42 1.1 glass
43 1.1 glass static char RQSTP[] = "rqstp";
44 1.1 glass static char TRANSP[] = "transp";
45 1.1 glass static char ARG[] = "argument";
46 1.1 glass static char RESULT[] = "result";
47 1.1 glass static char ROUTINE[] = "local";
48 1.1 glass
49 1.1 glass int write_program(), printerr(), printif();
50 1.1 glass /*
51 1.1 glass * write most of the service, that is, everything but the registrations.
52 1.1 glass */
53 1.1 glass void
54 1.1 glass write_most()
55 1.1 glass {
56 1.1 glass list *l;
57 1.1 glass definition *def;
58 1.1 glass version_list *vp;
59 1.1 glass
60 1.1 glass for (l = defined; l != NULL; l = l->next) {
61 1.1 glass def = (definition *) l->val;
62 1.1 glass if (def->def_kind == DEF_PROGRAM) {
63 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
64 1.1 glass f_print(fout, "\nstatic void ");
65 1.1 glass pvname(def->def_name, vp->vers_num);
66 1.1 glass f_print(fout, "();");
67 1.1 glass }
68 1.1 glass }
69 1.1 glass }
70 1.1 glass f_print(fout, "\n\n");
71 1.1 glass f_print(fout, "main()\n");
72 1.1 glass f_print(fout, "{\n");
73 1.1 glass f_print(fout, "\tSVCXPRT *%s;\n", TRANSP);
74 1.1 glass f_print(fout, "\n");
75 1.1 glass for (l = defined; l != NULL; l = l->next) {
76 1.1 glass def = (definition *) l->val;
77 1.1 glass if (def->def_kind != DEF_PROGRAM) {
78 1.1 glass continue;
79 1.1 glass }
80 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
81 1.1 glass f_print(fout, "\t(void)pmap_unset(%s, %s);\n", def->def_name, vp->vers_name);
82 1.1 glass }
83 1.1 glass }
84 1.1 glass }
85 1.1 glass
86 1.1 glass
87 1.1 glass /*
88 1.1 glass * write a registration for the given transport
89 1.1 glass */
90 1.1 glass void
91 1.1 glass write_register(transp)
92 1.1 glass char *transp;
93 1.1 glass {
94 1.1 glass list *l;
95 1.1 glass definition *def;
96 1.1 glass version_list *vp;
97 1.1 glass
98 1.1 glass f_print(fout, "\n");
99 1.1 glass f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp);
100 1.1 glass if (streq(transp, "tcp")) {
101 1.1 glass f_print(fout, ", 0, 0");
102 1.1 glass }
103 1.1 glass f_print(fout, ");\n");
104 1.1 glass f_print(fout, "\tif (%s == NULL) {\n", TRANSP);
105 1.1 glass f_print(fout, "\t\t(void)fprintf(stderr, \"cannot create %s service.\\n\");\n", transp);
106 1.1 glass f_print(fout, "\t\texit(1);\n");
107 1.1 glass f_print(fout, "\t}\n");
108 1.1 glass
109 1.1 glass for (l = defined; l != NULL; l = l->next) {
110 1.1 glass def = (definition *) l->val;
111 1.1 glass if (def->def_kind != DEF_PROGRAM) {
112 1.1 glass continue;
113 1.1 glass }
114 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
115 1.1 glass f_print(fout,
116 1.1 glass "\tif (!svc_register(%s, %s, %s, ",
117 1.1 glass TRANSP, def->def_name, vp->vers_name);
118 1.1 glass pvname(def->def_name, vp->vers_num);
119 1.1 glass f_print(fout, ", IPPROTO_%s)) {\n",
120 1.1 glass streq(transp, "udp") ? "UDP" : "TCP");
121 1.1 glass f_print(fout,
122 1.1 glass "\t\t(void)fprintf(stderr, \"unable to register (%s, %s, %s).\\n\");\n",
123 1.1 glass def->def_name, vp->vers_name, transp);
124 1.1 glass f_print(fout, "\t\texit(1);\n");
125 1.1 glass f_print(fout, "\t}\n");
126 1.1 glass }
127 1.1 glass }
128 1.1 glass }
129 1.1 glass
130 1.1 glass
131 1.1 glass /*
132 1.1 glass * write the rest of the service
133 1.1 glass */
134 1.1 glass void
135 1.1 glass write_rest()
136 1.1 glass {
137 1.1 glass f_print(fout, "\tsvc_run();\n");
138 1.1 glass f_print(fout, "\t(void)fprintf(stderr, \"svc_run returned\\n\");\n");
139 1.1 glass f_print(fout, "\texit(1);\n");
140 1.1 glass f_print(fout, "}\n");
141 1.1 glass }
142 1.1 glass
143 1.1 glass void
144 1.1 glass write_programs(storage)
145 1.1 glass char *storage;
146 1.1 glass {
147 1.1 glass list *l;
148 1.1 glass definition *def;
149 1.1 glass
150 1.1 glass for (l = defined; l != NULL; l = l->next) {
151 1.1 glass def = (definition *) l->val;
152 1.1 glass if (def->def_kind == DEF_PROGRAM) {
153 1.1 glass write_program(def, storage);
154 1.1 glass }
155 1.1 glass }
156 1.1 glass }
157 1.1 glass
158 1.1 glass
159 1.1 glass static
160 1.1 glass write_program(def, storage)
161 1.1 glass definition *def;
162 1.1 glass char *storage;
163 1.1 glass {
164 1.1 glass version_list *vp;
165 1.1 glass proc_list *proc;
166 1.1 glass int filled;
167 1.1 glass
168 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
169 1.1 glass f_print(fout, "\n");
170 1.1 glass if (storage != NULL) {
171 1.1 glass f_print(fout, "%s ", storage);
172 1.1 glass }
173 1.1 glass f_print(fout, "void\n");
174 1.1 glass pvname(def->def_name, vp->vers_num);
175 1.1 glass f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
176 1.1 glass f_print(fout, " struct svc_req *%s;\n", RQSTP);
177 1.1 glass f_print(fout, " SVCXPRT *%s;\n", TRANSP);
178 1.1 glass f_print(fout, "{\n");
179 1.1 glass
180 1.1 glass filled = 0;
181 1.1 glass f_print(fout, "\tunion {\n");
182 1.1 glass for (proc = vp->procs; proc != NULL; proc = proc->next) {
183 1.1 glass if (streq(proc->arg_type, "void")) {
184 1.1 glass continue;
185 1.1 glass }
186 1.1 glass filled = 1;
187 1.1 glass f_print(fout, "\t\t");
188 1.1 glass ptype(proc->arg_prefix, proc->arg_type, 0);
189 1.1 glass pvname(proc->proc_name, vp->vers_num);
190 1.1 glass f_print(fout, "_arg;\n");
191 1.1 glass }
192 1.1 glass if (!filled) {
193 1.1 glass f_print(fout, "\t\tint fill;\n");
194 1.1 glass }
195 1.1 glass f_print(fout, "\t} %s;\n", ARG);
196 1.1 glass f_print(fout, "\tchar *%s;\n", RESULT);
197 1.1 glass f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
198 1.1 glass f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
199 1.1 glass f_print(fout, "\n");
200 1.1 glass f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
201 1.1 glass
202 1.1 glass if (!nullproc(vp->procs)) {
203 1.1 glass f_print(fout, "\tcase NULLPROC:\n");
204 1.1 glass f_print(fout, "\t\t(void)svc_sendreply(%s, xdr_void, (char *)NULL);\n", TRANSP);
205 1.1 glass f_print(fout, "\t\treturn;\n\n");
206 1.1 glass }
207 1.1 glass for (proc = vp->procs; proc != NULL; proc = proc->next) {
208 1.1 glass f_print(fout, "\tcase %s:\n", proc->proc_name);
209 1.1 glass f_print(fout, "\t\txdr_%s = xdr_%s;\n", ARG,
210 1.1 glass stringfix(proc->arg_type));
211 1.1 glass f_print(fout, "\t\txdr_%s = xdr_%s;\n", RESULT,
212 1.1 glass stringfix(proc->res_type));
213 1.1 glass f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
214 1.1 glass pvname(proc->proc_name, vp->vers_num);
215 1.1 glass f_print(fout, ";\n");
216 1.1 glass f_print(fout, "\t\tbreak;\n\n");
217 1.1 glass }
218 1.1 glass f_print(fout, "\tdefault:\n");
219 1.1 glass printerr("noproc", TRANSP);
220 1.1 glass f_print(fout, "\t\treturn;\n");
221 1.1 glass f_print(fout, "\t}\n");
222 1.1 glass
223 1.1 glass f_print(fout, "\tbzero((char *)&%s, sizeof(%s));\n", ARG, ARG);
224 1.1 glass printif("getargs", TRANSP, "&", ARG);
225 1.1 glass printerr("decode", TRANSP);
226 1.1 glass f_print(fout, "\t\treturn;\n");
227 1.1 glass f_print(fout, "\t}\n");
228 1.1 glass
229 1.1 glass f_print(fout, "\t%s = (*%s)(&%s, %s);\n", RESULT, ROUTINE, ARG,
230 1.1 glass RQSTP);
231 1.1 glass f_print(fout,
232 1.1 glass "\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n",
233 1.1 glass RESULT, TRANSP, RESULT, RESULT);
234 1.1 glass printerr("systemerr", TRANSP);
235 1.1 glass f_print(fout, "\t}\n");
236 1.1 glass
237 1.1 glass printif("freeargs", TRANSP, "&", ARG);
238 1.1 glass f_print(fout, "\t\t(void)fprintf(stderr, \"unable to free arguments\\n\");\n");
239 1.1 glass f_print(fout, "\t\texit(1);\n");
240 1.1 glass f_print(fout, "\t}\n");
241 1.1 glass
242 1.1 glass f_print(fout, "}\n\n");
243 1.1 glass }
244 1.1 glass }
245 1.1 glass
246 1.1 glass static
247 1.1 glass printerr(err, transp)
248 1.1 glass char *err;
249 1.1 glass char *transp;
250 1.1 glass {
251 1.1 glass f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
252 1.1 glass }
253 1.1 glass
254 1.1 glass static
255 1.1 glass printif(proc, transp, prefix, arg)
256 1.1 glass char *proc;
257 1.1 glass char *transp;
258 1.1 glass char *prefix;
259 1.1 glass char *arg;
260 1.1 glass {
261 1.1 glass f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n",
262 1.1 glass proc, transp, arg, prefix, arg);
263 1.1 glass }
264 1.1 glass
265 1.1 glass
266 1.1 glass nullproc(proc)
267 1.1 glass proc_list *proc;
268 1.1 glass {
269 1.1 glass for (; proc != NULL; proc = proc->next) {
270 1.1 glass if (streq(proc->proc_num, "0")) {
271 1.1 glass return (1);
272 1.1 glass }
273 1.1 glass }
274 1.1 glass return (0);
275 1.1 glass }
276