Home | History | Annotate | Line # | Download | only in rpcgen
rpc_sample.c revision 1.12
      1  1.12  dholland /*	$NetBSD: rpc_sample.c,v 1.12 2013/08/11 08:03:10 dholland 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.12  dholland __RCSID("$NetBSD: rpc_sample.c,v 1.12 2013/08/11 08:03:10 dholland 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.12  dholland static void write_sample_client __P((const 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.12  dholland write_sample_svc(definition *def)
     63   1.1        pk {
     64   1.1        pk 
     65   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     66   1.5     lukem 		return;
     67   1.1        pk 	write_sample_server(def);
     68   1.1        pk }
     69   1.1        pk 
     70   1.1        pk 
     71   1.1        pk int
     72  1.12  dholland write_sample_clnt(definition *def)
     73   1.1        pk {
     74   1.5     lukem 	version_list *vp;
     75   1.5     lukem 	int     count = 0;
     76   1.1        pk 
     77   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     78   1.5     lukem 		return (0);
     79   1.1        pk 	/* generate sample code for each version */
     80   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
     81   1.5     lukem 		write_sample_client(def->def_name, vp);
     82   1.5     lukem 		++count;
     83   1.1        pk 	}
     84   1.5     lukem 	return (count);
     85   1.1        pk }
     86   1.1        pk 
     87   1.1        pk 
     88   1.4  christos static void
     89  1.12  dholland write_sample_client(const char *program_name, version_list *vp)
     90   1.1        pk {
     91   1.5     lukem 	proc_list *proc;
     92   1.5     lukem 	decl_list *l;
     93   1.5     lukem 
     94   1.5     lukem 	f_print(fout, "\n\nvoid\n");
     95   1.5     lukem 	pvname(program_name, vp->vers_num);
     96   1.5     lukem 	if (Cflag)
     97   1.6   mycroft 		f_print(fout, "(char *host)\n{\n");
     98   1.1        pk 	else
     99   1.6   mycroft 		f_print(fout, "(host)\n\tchar *host;\n{\n");
    100   1.5     lukem 	f_print(fout, "\tCLIENT *clnt;\n");
    101   1.5     lukem 
    102   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    103   1.5     lukem 		/* print out declarations for arguments */
    104   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    105   1.5     lukem 			f_print(fout, "\t");
    106   1.6   mycroft 			if (streq(proc->args.decls->decl.type, "void"))
    107   1.8   mycroft 				f_print(fout, "char ");	/* cannot have "void"
    108   1.6   mycroft 							 * type */
    109   1.6   mycroft 			else
    110   1.5     lukem 				ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
    111   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    112   1.5     lukem 			f_print(fout, "_arg;\n");
    113   1.6   mycroft 		} else {
    114   1.5     lukem 			if (!streq(proc->args.decls->decl.type, "void")) {
    115   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    116   1.5     lukem 					f_print(fout, "\t");
    117   1.5     lukem 					ptype(l->decl.prefix, l->decl.type, 1);
    118   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    119   1.5     lukem 					f_print(fout, "_%s;\n", l->decl.name);
    120   1.1        pk /*	  pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );*/
    121   1.5     lukem 				}
    122   1.5     lukem 			}
    123   1.6   mycroft 		}
    124   1.6   mycroft 		/* print out declarations for results */
    125   1.6   mycroft 		f_print(fout, "\t");
    126   1.6   mycroft 		if (streq(proc->res_type, "void"))
    127   1.6   mycroft 			f_print(fout, "char");	/* cannot have "void"
    128   1.6   mycroft 						 * type */
    129   1.6   mycroft 		else
    130   1.6   mycroft 			ptype(proc->res_prefix, proc->res_type, 1);
    131   1.6   mycroft 		if (!Mflag)
    132   1.6   mycroft 			f_print(fout, "*");
    133   1.6   mycroft 		pvname(proc->proc_name, vp->vers_num);
    134   1.6   mycroft 		f_print(fout, "_res;\n");
    135   1.1        pk 	}
    136   1.6   mycroft 	f_print(fout, "\n");
    137   1.1        pk 
    138   1.5     lukem 	/* generate creation of client handle */
    139   1.5     lukem 	f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
    140   1.5     lukem 	    program_name, vp->vers_name, tirpcflag ? "netpath" : "udp");
    141   1.5     lukem 	f_print(fout, "\tif (clnt == NULL) {\n");
    142   1.5     lukem 	f_print(fout, "\t\tclnt_pcreateerror(host);\n");
    143   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}\n");
    144   1.5     lukem 
    145   1.5     lukem 	/* generate calls to procedures */
    146   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    147   1.6   mycroft 		if (Mflag)
    148   1.6   mycroft 			f_print(fout, "\tif (");
    149   1.6   mycroft 		else {
    150   1.6   mycroft 			f_print(fout, "\t");
    151   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    152   1.6   mycroft 			f_print(fout, "_res = ");
    153   1.6   mycroft 		}
    154   1.5     lukem 		pvname(proc->proc_name, vp->vers_num);
    155   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    156   1.5     lukem 			f_print(fout, "(");
    157   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void"))	/* cast to void* */
    158   1.6   mycroft 				f_print(fout, "(void *)");
    159   1.5     lukem 			f_print(fout, "&");
    160   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    161   1.6   mycroft 			f_print(fout, "_arg, ");
    162   1.6   mycroft 		} else {
    163   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void")) {
    164   1.5     lukem 				f_print(fout, "(clnt);\n");
    165   1.5     lukem 			} else {
    166   1.5     lukem 				f_print(fout, "(");
    167   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    168   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    169   1.5     lukem 					f_print(fout, "_%s, ", l->decl.name);
    170   1.5     lukem 				}
    171   1.5     lukem 			}
    172   1.6   mycroft 		}
    173   1.6   mycroft 		if (Mflag) {
    174   1.6   mycroft 			f_print(fout, "&");
    175   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    176   1.6   mycroft 			f_print(fout, "_res, clnt) != RPC_SUCCESS)\n");
    177   1.6   mycroft 		} else {
    178   1.6   mycroft 			f_print(fout, "clnt);\n");
    179   1.6   mycroft 			f_print(fout, "\tif (");
    180   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    181   1.7   mycroft 			f_print(fout, "_res == NULL)\n");
    182   1.6   mycroft 		}
    183   1.8   mycroft 		f_print(fout, "\t\tclnt_perror(clnt, \"call failed\");\n");
    184   1.1        pk 	}
    185   1.1        pk 
    186   1.6   mycroft 	f_print(fout, "\tclnt_destroy(clnt);\n");
    187   1.5     lukem 	f_print(fout, "}\n");
    188   1.1        pk }
    189   1.1        pk 
    190   1.4  christos static void
    191  1.12  dholland write_sample_server(definition *def)
    192   1.1        pk {
    193   1.1        pk 	version_list *vp;
    194   1.1        pk 	proc_list *proc;
    195   1.1        pk 
    196   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    197   1.1        pk 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    198   1.1        pk 			f_print(fout, "\n");
    199   1.6   mycroft 			if (Mflag)
    200   1.6   mycroft 				f_print(fout, "bool_t\n");
    201   1.6   mycroft 			else {
    202   1.6   mycroft 				return_type(proc);
    203   1.6   mycroft 				f_print(fout, "*\n");
    204   1.6   mycroft 			}
    205  1.11   mycroft 			pvname_svc(proc->proc_name, vp->vers_num);
    206   1.6   mycroft 			printarglist(proc, "result", RQSTP, "struct svc_req *");
    207   1.1        pk 
    208   1.1        pk 			f_print(fout, "{\n");
    209   1.6   mycroft 			if (Mflag) {
    210   1.8   mycroft 				f_print(fout, "\tbool_t retval = TRUE;\n");
    211   1.6   mycroft 			} else {
    212   1.6   mycroft 				f_print(fout, "\tstatic ");
    213   1.6   mycroft 				if (streq(proc->res_type, "void"))
    214   1.8   mycroft 					f_print(fout, "char ");	/* cannot have void type */
    215   1.6   mycroft 				else
    216   1.6   mycroft 					return_type(proc);
    217   1.8   mycroft 				f_print(fout, "result;\n");
    218   1.6   mycroft 			}
    219   1.5     lukem 			f_print(fout,
    220   1.5     lukem 			    "\n\t/*\n\t * insert server code here\n\t */\n\n");
    221   1.6   mycroft 			if (Mflag) {
    222   1.6   mycroft 				f_print(fout, "\treturn (retval);\n");
    223   1.6   mycroft 			} else {
    224   1.6   mycroft 				if (streq(proc->res_type, "void"))
    225   1.6   mycroft 					f_print(fout, "\treturn ((void *)&result);\n");
    226   1.6   mycroft 				else
    227   1.6   mycroft 					f_print(fout, "\treturn (&result);\n");
    228   1.6   mycroft 			}
    229   1.6   mycroft 			f_print(fout, "}\n");
    230   1.5     lukem 		}
    231   1.1        pk 	}
    232   1.1        pk }
    233   1.1        pk 
    234   1.4  christos static void
    235  1.12  dholland return_type(proc_list *plist)
    236   1.1        pk {
    237   1.5     lukem 	ptype(plist->res_prefix, plist->res_type, 1);
    238   1.1        pk }
    239   1.1        pk 
    240   1.4  christos void
    241  1.12  dholland add_sample_msg(void)
    242   1.1        pk {
    243   1.1        pk 	f_print(fout, "/*\n");
    244   1.1        pk 	f_print(fout, " * This is sample code generated by rpcgen.\n");
    245   1.1        pk 	f_print(fout, " * These are only templates and you can use them\n");
    246   1.1        pk 	f_print(fout, " * as a guideline for developing your own functions.\n");
    247   1.1        pk 	f_print(fout, " */\n\n");
    248   1.1        pk }
    249   1.1        pk 
    250   1.1        pk void
    251  1.12  dholland write_sample_clnt_main(void)
    252   1.1        pk {
    253   1.5     lukem 	list   *l;
    254   1.5     lukem 	definition *def;
    255   1.5     lukem 	version_list *vp;
    256   1.1        pk 
    257   1.5     lukem 	f_print(fout, "\n\n");
    258   1.5     lukem 	if (Cflag)
    259   1.6   mycroft 		f_print(fout, "int\nmain(int argc, char *argv[])\n{\n");
    260   1.5     lukem 	else
    261   1.6   mycroft 		f_print(fout, "int\nmain(argc, argv)\n\tint argc;\n\tchar *argv[];\n{\n");
    262   1.5     lukem 
    263   1.5     lukem 	f_print(fout, "\tchar *host;");
    264   1.6   mycroft 	f_print(fout, "\n\n\tif (argc < 2) {");
    265   1.5     lukem 	f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
    266   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}");
    267   1.5     lukem 	f_print(fout, "\n\thost = argv[1];\n");
    268   1.5     lukem 
    269   1.5     lukem 	for (l = defined; l != NULL; l = l->next) {
    270   1.1        pk 		def = l->val;
    271   1.1        pk 		if (def->def_kind != DEF_PROGRAM) {
    272   1.1        pk 			continue;
    273   1.1        pk 		}
    274   1.1        pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    275   1.5     lukem 			f_print(fout, "\t");
    276   1.1        pk 			pvname(def->def_name, vp->vers_num);
    277   1.6   mycroft 			f_print(fout, "(host);\n");
    278   1.1        pk 		}
    279   1.5     lukem 	}
    280   1.6   mycroft 	f_print(fout, "\texit(0);\n");
    281   1.5     lukem 	f_print(fout, "}\n");
    282   1.1        pk }
    283