Home | History | Annotate | Line # | Download | only in rpcgen
rpc_sample.c revision 1.11
      1  1.11   mycroft /*	$NetBSD: rpc_sample.c,v 1.11 2004/07/06 07:07:15 mycroft Exp $	*/
      2   1.1        pk /*
      3   1.1        pk  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      4   1.1        pk  * unrestricted use provided that this legend is included on all tape
      5   1.1        pk  * media and as a part of the software program in whole or part.  Users
      6   1.1        pk  * may copy or modify Sun RPC without charge, but are not authorized
      7   1.1        pk  * to license or distribute it to anyone else except as part of a product or
      8   1.1        pk  * program developed by the user or with the express written consent of
      9   1.1        pk  * Sun Microsystems, Inc.
     10   1.1        pk  *
     11   1.1        pk  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     12   1.1        pk  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     13   1.1        pk  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     14   1.1        pk  *
     15   1.1        pk  * Sun RPC is provided with no support and without any obligation on the
     16   1.1        pk  * part of Sun Microsystems, Inc. to assist in its use, correction,
     17   1.1        pk  * modification or enhancement.
     18   1.1        pk  *
     19   1.1        pk  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     20   1.1        pk  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     21   1.1        pk  * OR ANY PART THEREOF.
     22   1.1        pk  *
     23   1.1        pk  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     24   1.1        pk  * or profits or other special, indirect and consequential damages, even if
     25   1.1        pk  * Sun has been advised of the possibility of such damages.
     26   1.1        pk  *
     27   1.1        pk  * Sun Microsystems, Inc.
     28   1.1        pk  * 2550 Garcia Avenue
     29   1.1        pk  * Mountain View, California  94043
     30   1.1        pk  */
     31   1.1        pk 
     32  1.10       jmc #if HAVE_NBTOOL_CONFIG_H
     33  1.10       jmc #include "nbtool_config.h"
     34  1.10       jmc #endif
     35  1.10       jmc 
     36   1.4  christos #include <sys/cdefs.h>
     37   1.9        tv #if defined(__RCSID) && !defined(lint)
     38   1.4  christos #if 0
     39   1.1        pk static char sccsid[] = "@(#)rpc_sample.c  1.1  90/08/30  (C) 1987 SMI";
     40   1.4  christos #else
     41  1.11   mycroft __RCSID("$NetBSD: rpc_sample.c,v 1.11 2004/07/06 07:07:15 mycroft Exp $");
     42   1.4  christos #endif
     43   1.1        pk #endif
     44   1.1        pk 
     45   1.1        pk /*
     46   1.1        pk  * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
     47   1.1        pk  */
     48   1.1        pk 
     49   1.1        pk #include <stdio.h>
     50   1.1        pk #include <string.h>
     51   1.4  christos #include "rpc_scan.h"
     52   1.1        pk #include "rpc_parse.h"
     53   1.1        pk #include "rpc_util.h"
     54   1.1        pk 
     55   1.1        pk static char RQSTP[] = "rqstp";
     56   1.1        pk 
     57   1.4  christos static void write_sample_client __P((char *, version_list *));
     58   1.4  christos static void write_sample_server __P((definition *));
     59   1.4  christos static void return_type __P((proc_list *));
     60   1.1        pk 
     61   1.1        pk void
     62   1.1        pk write_sample_svc(def)
     63   1.5     lukem 	definition *def;
     64   1.1        pk {
     65   1.1        pk 
     66   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     67   1.5     lukem 		return;
     68   1.1        pk 	write_sample_server(def);
     69   1.1        pk }
     70   1.1        pk 
     71   1.1        pk 
     72   1.1        pk int
     73   1.1        pk write_sample_clnt(def)
     74   1.5     lukem 	definition *def;
     75   1.1        pk {
     76   1.5     lukem 	version_list *vp;
     77   1.5     lukem 	int     count = 0;
     78   1.1        pk 
     79   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     80   1.5     lukem 		return (0);
     81   1.1        pk 	/* generate sample code for each version */
     82   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
     83   1.5     lukem 		write_sample_client(def->def_name, vp);
     84   1.5     lukem 		++count;
     85   1.1        pk 	}
     86   1.5     lukem 	return (count);
     87   1.1        pk }
     88   1.1        pk 
     89   1.1        pk 
     90   1.4  christos static void
     91   1.5     lukem write_sample_client(program_name, vp)
     92   1.5     lukem 	char   *program_name;
     93   1.5     lukem 	version_list *vp;
     94   1.1        pk {
     95   1.5     lukem 	proc_list *proc;
     96   1.5     lukem 	decl_list *l;
     97   1.5     lukem 
     98   1.5     lukem 	f_print(fout, "\n\nvoid\n");
     99   1.5     lukem 	pvname(program_name, vp->vers_num);
    100   1.5     lukem 	if (Cflag)
    101   1.6   mycroft 		f_print(fout, "(char *host)\n{\n");
    102   1.1        pk 	else
    103   1.6   mycroft 		f_print(fout, "(host)\n\tchar *host;\n{\n");
    104   1.5     lukem 	f_print(fout, "\tCLIENT *clnt;\n");
    105   1.5     lukem 
    106   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    107   1.5     lukem 		/* print out declarations for arguments */
    108   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    109   1.5     lukem 			f_print(fout, "\t");
    110   1.6   mycroft 			if (streq(proc->args.decls->decl.type, "void"))
    111   1.8   mycroft 				f_print(fout, "char ");	/* cannot have "void"
    112   1.6   mycroft 							 * type */
    113   1.6   mycroft 			else
    114   1.5     lukem 				ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
    115   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    116   1.5     lukem 			f_print(fout, "_arg;\n");
    117   1.6   mycroft 		} else {
    118   1.5     lukem 			if (!streq(proc->args.decls->decl.type, "void")) {
    119   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    120   1.5     lukem 					f_print(fout, "\t");
    121   1.5     lukem 					ptype(l->decl.prefix, l->decl.type, 1);
    122   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    123   1.5     lukem 					f_print(fout, "_%s;\n", l->decl.name);
    124   1.1        pk /*	  pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );*/
    125   1.5     lukem 				}
    126   1.5     lukem 			}
    127   1.6   mycroft 		}
    128   1.6   mycroft 		/* print out declarations for results */
    129   1.6   mycroft 		f_print(fout, "\t");
    130   1.6   mycroft 		if (streq(proc->res_type, "void"))
    131   1.6   mycroft 			f_print(fout, "char");	/* cannot have "void"
    132   1.6   mycroft 						 * type */
    133   1.6   mycroft 		else
    134   1.6   mycroft 			ptype(proc->res_prefix, proc->res_type, 1);
    135   1.6   mycroft 		if (!Mflag)
    136   1.6   mycroft 			f_print(fout, "*");
    137   1.6   mycroft 		pvname(proc->proc_name, vp->vers_num);
    138   1.6   mycroft 		f_print(fout, "_res;\n");
    139   1.1        pk 	}
    140   1.6   mycroft 	f_print(fout, "\n");
    141   1.1        pk 
    142   1.5     lukem 	/* generate creation of client handle */
    143   1.5     lukem 	f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
    144   1.5     lukem 	    program_name, vp->vers_name, tirpcflag ? "netpath" : "udp");
    145   1.5     lukem 	f_print(fout, "\tif (clnt == NULL) {\n");
    146   1.5     lukem 	f_print(fout, "\t\tclnt_pcreateerror(host);\n");
    147   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}\n");
    148   1.5     lukem 
    149   1.5     lukem 	/* generate calls to procedures */
    150   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    151   1.6   mycroft 		if (Mflag)
    152   1.6   mycroft 			f_print(fout, "\tif (");
    153   1.6   mycroft 		else {
    154   1.6   mycroft 			f_print(fout, "\t");
    155   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    156   1.6   mycroft 			f_print(fout, "_res = ");
    157   1.6   mycroft 		}
    158   1.5     lukem 		pvname(proc->proc_name, vp->vers_num);
    159   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    160   1.5     lukem 			f_print(fout, "(");
    161   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void"))	/* cast to void* */
    162   1.6   mycroft 				f_print(fout, "(void *)");
    163   1.5     lukem 			f_print(fout, "&");
    164   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    165   1.6   mycroft 			f_print(fout, "_arg, ");
    166   1.6   mycroft 		} else {
    167   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void")) {
    168   1.5     lukem 				f_print(fout, "(clnt);\n");
    169   1.5     lukem 			} else {
    170   1.5     lukem 				f_print(fout, "(");
    171   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    172   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    173   1.5     lukem 					f_print(fout, "_%s, ", l->decl.name);
    174   1.5     lukem 				}
    175   1.5     lukem 			}
    176   1.6   mycroft 		}
    177   1.6   mycroft 		if (Mflag) {
    178   1.6   mycroft 			f_print(fout, "&");
    179   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    180   1.6   mycroft 			f_print(fout, "_res, clnt) != RPC_SUCCESS)\n");
    181   1.6   mycroft 		} else {
    182   1.6   mycroft 			f_print(fout, "clnt);\n");
    183   1.6   mycroft 			f_print(fout, "\tif (");
    184   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    185   1.7   mycroft 			f_print(fout, "_res == NULL)\n");
    186   1.6   mycroft 		}
    187   1.8   mycroft 		f_print(fout, "\t\tclnt_perror(clnt, \"call failed\");\n");
    188   1.1        pk 	}
    189   1.1        pk 
    190   1.6   mycroft 	f_print(fout, "\tclnt_destroy(clnt);\n");
    191   1.5     lukem 	f_print(fout, "}\n");
    192   1.1        pk }
    193   1.1        pk 
    194   1.4  christos static void
    195   1.1        pk write_sample_server(def)
    196   1.1        pk 	definition *def;
    197   1.1        pk {
    198   1.1        pk 	version_list *vp;
    199   1.1        pk 	proc_list *proc;
    200   1.1        pk 
    201   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    202   1.1        pk 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    203   1.1        pk 			f_print(fout, "\n");
    204   1.6   mycroft 			if (Mflag)
    205   1.6   mycroft 				f_print(fout, "bool_t\n");
    206   1.6   mycroft 			else {
    207   1.6   mycroft 				return_type(proc);
    208   1.6   mycroft 				f_print(fout, "*\n");
    209   1.6   mycroft 			}
    210  1.11   mycroft 			pvname_svc(proc->proc_name, vp->vers_num);
    211   1.6   mycroft 			printarglist(proc, "result", RQSTP, "struct svc_req *");
    212   1.1        pk 
    213   1.1        pk 			f_print(fout, "{\n");
    214   1.6   mycroft 			if (Mflag) {
    215   1.8   mycroft 				f_print(fout, "\tbool_t retval = TRUE;\n");
    216   1.6   mycroft 			} else {
    217   1.6   mycroft 				f_print(fout, "\tstatic ");
    218   1.6   mycroft 				if (streq(proc->res_type, "void"))
    219   1.8   mycroft 					f_print(fout, "char ");	/* cannot have void type */
    220   1.6   mycroft 				else
    221   1.6   mycroft 					return_type(proc);
    222   1.8   mycroft 				f_print(fout, "result;\n");
    223   1.6   mycroft 			}
    224   1.5     lukem 			f_print(fout,
    225   1.5     lukem 			    "\n\t/*\n\t * insert server code here\n\t */\n\n");
    226   1.6   mycroft 			if (Mflag) {
    227   1.6   mycroft 				f_print(fout, "\treturn (retval);\n");
    228   1.6   mycroft 			} else {
    229   1.6   mycroft 				if (streq(proc->res_type, "void"))
    230   1.6   mycroft 					f_print(fout, "\treturn ((void *)&result);\n");
    231   1.6   mycroft 				else
    232   1.6   mycroft 					f_print(fout, "\treturn (&result);\n");
    233   1.6   mycroft 			}
    234   1.6   mycroft 			f_print(fout, "}\n");
    235   1.5     lukem 		}
    236   1.1        pk 	}
    237   1.1        pk }
    238   1.1        pk 
    239   1.4  christos static void
    240   1.1        pk return_type(plist)
    241   1.1        pk 	proc_list *plist;
    242   1.1        pk {
    243   1.5     lukem 	ptype(plist->res_prefix, plist->res_type, 1);
    244   1.1        pk }
    245   1.1        pk 
    246   1.4  christos void
    247   1.1        pk add_sample_msg()
    248   1.1        pk {
    249   1.1        pk 	f_print(fout, "/*\n");
    250   1.1        pk 	f_print(fout, " * This is sample code generated by rpcgen.\n");
    251   1.1        pk 	f_print(fout, " * These are only templates and you can use them\n");
    252   1.1        pk 	f_print(fout, " * as a guideline for developing your own functions.\n");
    253   1.1        pk 	f_print(fout, " */\n\n");
    254   1.1        pk }
    255   1.1        pk 
    256   1.1        pk void
    257   1.1        pk write_sample_clnt_main()
    258   1.1        pk {
    259   1.5     lukem 	list   *l;
    260   1.5     lukem 	definition *def;
    261   1.5     lukem 	version_list *vp;
    262   1.1        pk 
    263   1.5     lukem 	f_print(fout, "\n\n");
    264   1.5     lukem 	if (Cflag)
    265   1.6   mycroft 		f_print(fout, "int\nmain(int argc, char *argv[])\n{\n");
    266   1.5     lukem 	else
    267   1.6   mycroft 		f_print(fout, "int\nmain(argc, argv)\n\tint argc;\n\tchar *argv[];\n{\n");
    268   1.5     lukem 
    269   1.5     lukem 	f_print(fout, "\tchar *host;");
    270   1.6   mycroft 	f_print(fout, "\n\n\tif (argc < 2) {");
    271   1.5     lukem 	f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
    272   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}");
    273   1.5     lukem 	f_print(fout, "\n\thost = argv[1];\n");
    274   1.5     lukem 
    275   1.5     lukem 	for (l = defined; l != NULL; l = l->next) {
    276   1.1        pk 		def = l->val;
    277   1.1        pk 		if (def->def_kind != DEF_PROGRAM) {
    278   1.1        pk 			continue;
    279   1.1        pk 		}
    280   1.1        pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    281   1.5     lukem 			f_print(fout, "\t");
    282   1.1        pk 			pvname(def->def_name, vp->vers_num);
    283   1.6   mycroft 			f_print(fout, "(host);\n");
    284   1.1        pk 		}
    285   1.5     lukem 	}
    286   1.6   mycroft 	f_print(fout, "\texit(0);\n");
    287   1.5     lukem 	f_print(fout, "}\n");
    288   1.1        pk }
    289