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