Fix typo.
[kopensolaris-gnu/glibc.git] / sunrpc / rpc_sample.c
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 or with the express written consent of
8  * Sun Microsystems, Inc.
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
31 /*
32  * From: @(#)rpc_sample.c  1.1  90/08/30  (C) 1987 SMI
33  */
34 char sample_rcsid[] =
35   "$Id$";
36
37 /*
38  * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
39  */
40
41 #include <stdio.h>
42 #include <string.h>
43 #include "rpc_parse.h"
44 #include "rpc_util.h"
45 #include "proto.h"
46
47
48 static const char RQSTP[] = "rqstp";
49
50 static void write_sample_client (const char *program_name, version_list * vp);
51 static void write_sample_server (definition * def);
52 static void return_type (proc_list * plist);
53
54
55 void
56 write_sample_svc (definition * def)
57 {
58
59   if (def->def_kind != DEF_PROGRAM)
60     return;
61   write_sample_server (def);
62 }
63
64
65 int
66 write_sample_clnt (definition * def)
67 {
68   version_list *vp;
69   int count = 0;
70
71   if (def->def_kind != DEF_PROGRAM)
72     return (0);
73   /* generate sample code for each version */
74   for (vp = def->def.pr.versions; vp != NULL; vp = vp->next)
75     {
76       write_sample_client (def->def_name, vp);
77       ++count;
78     }
79   return (count);
80 }
81
82
83 static void
84 write_sample_client (const char *program_name, version_list * vp)
85 {
86   proc_list *proc;
87   int i;
88   decl_list *l;
89
90   f_print (fout, "\n\nvoid\n");
91   pvname (program_name, vp->vers_num);
92   if (Cflag)
93     f_print (fout, "( char* host )\n{\n");
94   else
95     f_print (fout, "(host)\nchar *host;\n{\n");
96   f_print (fout, "\tCLIENT *clnt;\n");
97
98   i = 0;
99   for (proc = vp->procs; proc != NULL; proc = proc->next)
100     {
101       f_print (fout, "\t");
102       ptype (proc->res_prefix, proc->res_type, 1);
103       f_print (fout, " *result_%d;\n", ++i);
104       /* print out declarations for arguments */
105       if (proc->arg_num < 2 && !newstyle)
106         {
107           f_print (fout, "\t");
108           if (!streq (proc->args.decls->decl.type, "void"))
109             ptype (proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
110           else
111             f_print (fout, "char* ");   /* cannot have "void" type */
112           f_print (fout, " ");
113           pvname (proc->proc_name, vp->vers_num);
114           f_print (fout, "_arg;\n");
115         }
116       else if (!streq (proc->args.decls->decl.type, "void"))
117         {
118           for (l = proc->args.decls; l != NULL; l = l->next)
119             {
120               f_print (fout, "\t");
121               ptype (l->decl.prefix, l->decl.type, 1);
122               f_print (fout, " ");
123               pvname (proc->proc_name, vp->vers_num);
124               f_print (fout, "_%s;\n", l->decl.name);
125 /*        pdeclaration(proc->args.argname, &l->decl, 1, ";\n" ); */
126             }
127         }
128     }
129
130   /* generate creation of client handle */
131   f_print (fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
132            program_name, vp->vers_name, tirpcflag ? "netpath" : "udp");
133   f_print (fout, "\tif (clnt == NULL) {\n");
134   f_print (fout, "\t\tclnt_pcreateerror(host);\n");
135   f_print (fout, "\t\texit(1);\n\t}\n");
136
137   /* generate calls to procedures */
138   i = 0;
139   for (proc = vp->procs; proc != NULL; proc = proc->next)
140     {
141       f_print (fout, "\tresult_%d = ", ++i);
142       pvname (proc->proc_name, vp->vers_num);
143       if (proc->arg_num < 2 && !newstyle)
144         {
145           f_print (fout, "(");
146           if (streq (proc->args.decls->decl.type, "void"))      /* cast to void* */
147             f_print (fout, "(void*)");
148           f_print (fout, "&");
149           pvname (proc->proc_name, vp->vers_num);
150           f_print (fout, "_arg, clnt);\n");
151         }
152       else if (streq (proc->args.decls->decl.type, "void"))
153         {
154           f_print (fout, "(clnt);\n");
155         }
156       else
157         {
158           f_print (fout, "(");
159           for (l = proc->args.decls; l != NULL; l = l->next)
160             {
161               pvname (proc->proc_name, vp->vers_num);
162               f_print (fout, "_%s, ", l->decl.name);
163             }
164           f_print (fout, "clnt);\n");
165         }
166       f_print (fout, "\tif (result_%d == NULL) {\n", i);
167       f_print (fout, "\t\tclnt_perror(clnt, \"call failed:\");\n");
168       f_print (fout, "\t}\n");
169     }
170
171   f_print (fout, "\tclnt_destroy( clnt );\n");
172   f_print (fout, "}\n");
173 }
174
175 static void
176 write_sample_server (definition * def)
177 {
178   version_list *vp;
179   proc_list *proc;
180
181   for (vp = def->def.pr.versions; vp != NULL; vp = vp->next)
182     {
183       for (proc = vp->procs; proc != NULL; proc = proc->next)
184         {
185           f_print (fout, "\n");
186 /*                      if( Cflag )
187    f_print( fout, "extern \"C\"{\n");
188  */
189           return_type (proc);
190           f_print (fout, "* \n");
191           if (Cflag)
192             pvname_svc (proc->proc_name, vp->vers_num);
193           else
194             pvname (proc->proc_name, vp->vers_num);
195           printarglist (proc, RQSTP, "struct svc_req *");
196
197           f_print (fout, "{\n");
198           f_print (fout, "\n\tstatic ");
199           if (!streq (proc->res_type, "void"))
200             return_type (proc);
201           else
202             f_print (fout, "char*");    /* cannot have void type */
203           f_print (fout, " result;\n" /*, proc->res_type *//*? */ );
204           f_print (fout,
205                    "\n\t/*\n\t * insert server code here\n\t */\n\n");
206           if (!streq (proc->res_type, "void"))
207             f_print (fout, "\treturn(&result);\n}\n");
208           else                  /* cast back to void * */
209             f_print (fout, "\treturn((void*) &result);\n}\n");
210 /*                      if( Cflag)
211    f_print( fout, "};\n");
212  */
213
214         }
215     }
216 }
217
218
219
220 static void
221 return_type (proc_list * plist)
222 {
223   ptype (plist->res_prefix, plist->res_type, 1);
224 }
225
226 void
227 add_sample_msg (void)
228 {
229   f_print (fout, "/*\n");
230   f_print (fout, " * This is sample code generated by rpcgen.\n");
231   f_print (fout, " * These are only templates and you can use them\n");
232   f_print (fout, " * as a guideline for developing your own functions.\n");
233   f_print (fout, " */\n\n");
234 }
235
236 void
237 write_sample_clnt_main (void)
238 {
239   list *l;
240   definition *def;
241   version_list *vp;
242
243   f_print (fout, "\n\n");
244   if (Cflag)
245     f_print (fout, "main( int argc, char* argv[] )\n{\n");
246   else
247     f_print (fout, "main(argc, argv)\nint argc;\nchar *argv[];\n{\n");
248
249   f_print (fout, "\tchar *host;");
250   f_print (fout, "\n\n\tif(argc < 2) {");
251   f_print (fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
252   f_print (fout, "\t\texit(1);\n\t}");
253   f_print (fout, "\n\thost = argv[1];\n");
254
255   for (l = defined; l != NULL; l = l->next)
256     {
257       def = l->val;
258       if (def->def_kind != DEF_PROGRAM)
259         {
260           continue;
261         }
262       for (vp = def->def.pr.versions; vp != NULL; vp = vp->next)
263         {
264           f_print (fout, "\t");
265           pvname (def->def_name, vp->vers_num);
266           f_print (fout, "( host );\n");
267         }
268     }
269   f_print (fout, "}\n");
270 }