home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume13 / rpc3.9 / part07 / rpcgen / rpc_clntout.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-02-27  |  3.4 KB  |  124 lines

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