rpc_clntout.c revision 1.1 1 1.1 glass /* @(#)rpc_clntout.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_clntout.c 1.2 87/06/24 (C) 1987 SMI";
32 1.1 glass #endif
33 1.1 glass
34 1.1 glass /*
35 1.1 glass * rpc_clntout.c, Client-stub 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 #define DEFAULT_TIMEOUT 25 /* in seconds */
44 1.1 glass
45 1.1 glass static int write_program(), printbody();
46 1.1 glass
47 1.1 glass
48 1.1 glass void
49 1.1 glass write_stubs()
50 1.1 glass {
51 1.1 glass list *l;
52 1.1 glass definition *def;
53 1.1 glass
54 1.1 glass f_print(fout,
55 1.1 glass "\n/* Default timeout can be changed using clnt_control() */\n");
56 1.1 glass f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
57 1.1 glass DEFAULT_TIMEOUT);
58 1.1 glass for (l = defined; l != NULL; l = l->next) {
59 1.1 glass def = (definition *) l->val;
60 1.1 glass if (def->def_kind == DEF_PROGRAM) {
61 1.1 glass write_program(def);
62 1.1 glass }
63 1.1 glass }
64 1.1 glass }
65 1.1 glass
66 1.1 glass
67 1.1 glass static
68 1.1 glass write_program(def)
69 1.1 glass definition *def;
70 1.1 glass {
71 1.1 glass version_list *vp;
72 1.1 glass proc_list *proc;
73 1.1 glass
74 1.1 glass for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
75 1.1 glass for (proc = vp->procs; proc != NULL; proc = proc->next) {
76 1.1 glass f_print(fout, "\n");
77 1.1 glass ptype(proc->res_prefix, proc->res_type, 1);
78 1.1 glass f_print(fout, "*\n");
79 1.1 glass pvname(proc->proc_name, vp->vers_num);
80 1.1 glass f_print(fout, "(argp, clnt)\n");
81 1.1 glass f_print(fout, "\t");
82 1.1 glass ptype(proc->arg_prefix, proc->arg_type, 1);
83 1.1 glass f_print(fout, "*argp;\n");
84 1.1 glass f_print(fout, "\tCLIENT *clnt;\n");
85 1.1 glass f_print(fout, "{\n");
86 1.1 glass printbody(proc);
87 1.1 glass f_print(fout, "}\n\n");
88 1.1 glass }
89 1.1 glass }
90 1.1 glass }
91 1.1 glass
92 1.1 glass static char *
93 1.1 glass ampr(type)
94 1.1 glass char *type;
95 1.1 glass {
96 1.1 glass if (isvectordef(type, REL_ALIAS)) {
97 1.1 glass return ("");
98 1.1 glass } else {
99 1.1 glass return ("&");
100 1.1 glass }
101 1.1 glass }
102 1.1 glass
103 1.1 glass static
104 1.1 glass printbody(proc)
105 1.1 glass proc_list *proc;
106 1.1 glass {
107 1.1 glass f_print(fout, "\tstatic ");
108 1.1 glass if (streq(proc->res_type, "void")) {
109 1.1 glass f_print(fout, "char ");
110 1.1 glass } else {
111 1.1 glass ptype(proc->res_prefix, proc->res_type, 0);
112 1.1 glass }
113 1.1 glass f_print(fout, "res;\n");
114 1.1 glass f_print(fout, "\n");
115 1.1 glass f_print(fout, "\tbzero((char *)%sres, sizeof(res));\n",
116 1.1 glass ampr(proc->res_type));
117 1.1 glass f_print(fout,
118 1.1 glass "\tif (clnt_call(clnt, %s, xdr_%s, argp, xdr_%s, %sres, TIMEOUT) != RPC_SUCCESS) {\n",
119 1.1 glass proc->proc_name, stringfix(proc->arg_type),
120 1.1 glass stringfix(proc->res_type), ampr(proc->res_type));
121 1.1 glass f_print(fout, "\t\treturn (NULL);\n");
122 1.1 glass f_print(fout, "\t}\n");
123 1.1 glass if (streq(proc->res_type, "void")) {
124 1.1 glass f_print(fout, "\treturn ((void *)%sres);\n",
125 1.1 glass ampr(proc->res_type));
126 1.1 glass } else {
127 1.1 glass f_print(fout, "\treturn (%sres);\n", ampr(proc->res_type));
128 1.1 glass }
129 1.1 glass }
130