1 /* @(#)rpc_clntout.c 2.1 88/08/01 4.0 RPCSRC */ 2 /* 3 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 4 * unrestricted use provided that this legend is included on all tape 5 * media and as a part of the software program in whole or part. Users 6 * may copy or modify Sun RPC without charge, but are not authorized 7 * to license or distribute it to anyone else except as part of a product or 8 * program developed by the user. 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 #ifndef lint 31 static char sccsid[] = "@(#)rpc_clntout.c 1.2 87/06/24 (C) 1987 SMI"; 32 #endif 33 34 /* 35 * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler 36 * Copyright (C) 1987, Sun Microsytsems, Inc. 37 */ 38 #include <stdio.h> 39 #include <strings.h> 40 #include "rpc_parse.h" 41 #include "rpc_util.h" 42 43 #define DEFAULT_TIMEOUT 25 /* in seconds */ 44 45 static int write_program(), printbody(); 46 47 48 void 49 write_stubs() 50 { 51 list *l; 52 definition *def; 53 54 f_print(fout, 55 "\n/* Default timeout can be changed using clnt_control() */\n"); 56 f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n", 57 DEFAULT_TIMEOUT); 58 for (l = defined; l != NULL; l = l->next) { 59 def = (definition *) l->val; 60 if (def->def_kind == DEF_PROGRAM) { 61 write_program(def); 62 } 63 } 64 } 65 66 67 static 68 write_program(def) 69 definition *def; 70 { 71 version_list *vp; 72 proc_list *proc; 73 74 for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { 75 for (proc = vp->procs; proc != NULL; proc = proc->next) { 76 f_print(fout, "\n"); 77 ptype(proc->res_prefix, proc->res_type, 1); 78 f_print(fout, "*\n"); 79 pvname(proc->proc_name, vp->vers_num); 80 f_print(fout, "(argp, clnt)\n"); 81 f_print(fout, "\t"); 82 ptype(proc->arg_prefix, proc->arg_type, 1); 83 f_print(fout, "*argp;\n"); 84 f_print(fout, "\tCLIENT *clnt;\n"); 85 f_print(fout, "{\n"); 86 printbody(proc); 87 f_print(fout, "}\n\n"); 88 } 89 } 90 } 91 92 static char * 93 ampr(type) 94 char *type; 95 { 96 if (isvectordef(type, REL_ALIAS)) { 97 return (""); 98 } else { 99 return ("&"); 100 } 101 } 102 103 static 104 printbody(proc) 105 proc_list *proc; 106 { 107 f_print(fout, "\tstatic "); 108 if (streq(proc->res_type, "void")) { 109 f_print(fout, "char "); 110 } else { 111 ptype(proc->res_prefix, proc->res_type, 0); 112 } 113 f_print(fout, "res;\n"); 114 f_print(fout, "\n"); 115 f_print(fout, "\tbzero((char *)%sres, sizeof(res));\n", 116 ampr(proc->res_type)); 117 f_print(fout, 118 "\tif (clnt_call(clnt, %s, xdr_%s, argp, xdr_%s, %sres, TIMEOUT) != RPC_SUCCESS) {\n", 119 proc->proc_name, stringfix(proc->arg_type), 120 stringfix(proc->res_type), ampr(proc->res_type)); 121 f_print(fout, "\t\treturn (NULL);\n"); 122 f_print(fout, "\t}\n"); 123 if (streq(proc->res_type, "void")) { 124 f_print(fout, "\treturn ((void *)%sres);\n", 125 ampr(proc->res_type)); 126 } else { 127 f_print(fout, "\treturn (%sres);\n", ampr(proc->res_type)); 128 } 129 } 130