Home | History | Annotate | Line # | Download | only in rpcgen
rpc_sample.c revision 1.9
      1  1.9        tv /*	$NetBSD: rpc_sample.c,v 1.9 2002/01/31 19:36:49 tv 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.4  christos #include <sys/cdefs.h>
     33  1.9        tv #if defined(__RCSID) && !defined(lint)
     34  1.4  christos #if 0
     35  1.1        pk static char sccsid[] = "@(#)rpc_sample.c  1.1  90/08/30  (C) 1987 SMI";
     36  1.4  christos #else
     37  1.9        tv __RCSID("$NetBSD: rpc_sample.c,v 1.9 2002/01/31 19:36:49 tv Exp $");
     38  1.4  christos #endif
     39  1.1        pk #endif
     40  1.1        pk 
     41  1.1        pk /*
     42  1.1        pk  * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
     43  1.1        pk  */
     44  1.1        pk 
     45  1.1        pk #include <stdio.h>
     46  1.1        pk #include <string.h>
     47  1.4  christos #include "rpc_scan.h"
     48  1.1        pk #include "rpc_parse.h"
     49  1.1        pk #include "rpc_util.h"
     50  1.1        pk 
     51  1.1        pk static char RQSTP[] = "rqstp";
     52  1.1        pk 
     53  1.4  christos static void write_sample_client __P((char *, version_list *));
     54  1.4  christos static void write_sample_server __P((definition *));
     55  1.4  christos static void return_type __P((proc_list *));
     56  1.1        pk 
     57  1.1        pk void
     58  1.1        pk write_sample_svc(def)
     59  1.5     lukem 	definition *def;
     60  1.1        pk {
     61  1.1        pk 
     62  1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     63  1.5     lukem 		return;
     64  1.1        pk 	write_sample_server(def);
     65  1.1        pk }
     66  1.1        pk 
     67  1.1        pk 
     68  1.1        pk int
     69  1.1        pk write_sample_clnt(def)
     70  1.5     lukem 	definition *def;
     71  1.1        pk {
     72  1.5     lukem 	version_list *vp;
     73  1.5     lukem 	int     count = 0;
     74  1.1        pk 
     75  1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     76  1.5     lukem 		return (0);
     77  1.1        pk 	/* generate sample code for each version */
     78  1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
     79  1.5     lukem 		write_sample_client(def->def_name, vp);
     80  1.5     lukem 		++count;
     81  1.1        pk 	}
     82  1.5     lukem 	return (count);
     83  1.1        pk }
     84  1.1        pk 
     85  1.1        pk 
     86  1.4  christos static void
     87  1.5     lukem write_sample_client(program_name, vp)
     88  1.5     lukem 	char   *program_name;
     89  1.5     lukem 	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.1        pk write_sample_server(def)
    192  1.1        pk 	definition *def;
    193  1.1        pk {
    194  1.1        pk 	version_list *vp;
    195  1.1        pk 	proc_list *proc;
    196  1.1        pk 
    197  1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    198  1.1        pk 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    199  1.1        pk 			f_print(fout, "\n");
    200  1.6   mycroft 			if (Mflag)
    201  1.6   mycroft 				f_print(fout, "bool_t\n");
    202  1.6   mycroft 			else {
    203  1.6   mycroft 				return_type(proc);
    204  1.6   mycroft 				f_print(fout, "*\n");
    205  1.6   mycroft 			}
    206  1.5     lukem 			if (Cflag)
    207  1.5     lukem 				pvname_svc(proc->proc_name, vp->vers_num);
    208  1.1        pk 			else
    209  1.5     lukem 				pvname(proc->proc_name, vp->vers_num);
    210  1.6   mycroft 			printarglist(proc, "result", RQSTP, "struct svc_req *");
    211  1.1        pk 
    212  1.1        pk 			f_print(fout, "{\n");
    213  1.6   mycroft 			if (Mflag) {
    214  1.8   mycroft 				f_print(fout, "\tbool_t retval = TRUE;\n");
    215  1.6   mycroft 			} else {
    216  1.6   mycroft 				f_print(fout, "\tstatic ");
    217  1.6   mycroft 				if (streq(proc->res_type, "void"))
    218  1.8   mycroft 					f_print(fout, "char ");	/* cannot have void type */
    219  1.6   mycroft 				else
    220  1.6   mycroft 					return_type(proc);
    221  1.8   mycroft 				f_print(fout, "result;\n");
    222  1.6   mycroft 			}
    223  1.5     lukem 			f_print(fout,
    224  1.5     lukem 			    "\n\t/*\n\t * insert server code here\n\t */\n\n");
    225  1.6   mycroft 			if (Mflag) {
    226  1.6   mycroft 				f_print(fout, "\treturn (retval);\n");
    227  1.6   mycroft 			} else {
    228  1.6   mycroft 				if (streq(proc->res_type, "void"))
    229  1.6   mycroft 					f_print(fout, "\treturn ((void *)&result);\n");
    230  1.6   mycroft 				else
    231  1.6   mycroft 					f_print(fout, "\treturn (&result);\n");
    232  1.6   mycroft 			}
    233  1.6   mycroft 			f_print(fout, "}\n");
    234  1.5     lukem 		}
    235  1.1        pk 	}
    236  1.1        pk }
    237  1.1        pk 
    238  1.4  christos static void
    239  1.1        pk return_type(plist)
    240  1.1        pk 	proc_list *plist;
    241  1.1        pk {
    242  1.5     lukem 	ptype(plist->res_prefix, plist->res_type, 1);
    243  1.1        pk }
    244  1.1        pk 
    245  1.4  christos void
    246  1.1        pk add_sample_msg()
    247  1.1        pk {
    248  1.1        pk 	f_print(fout, "/*\n");
    249  1.1        pk 	f_print(fout, " * This is sample code generated by rpcgen.\n");
    250  1.1        pk 	f_print(fout, " * These are only templates and you can use them\n");
    251  1.1        pk 	f_print(fout, " * as a guideline for developing your own functions.\n");
    252  1.1        pk 	f_print(fout, " */\n\n");
    253  1.1        pk }
    254  1.1        pk 
    255  1.1        pk void
    256  1.1        pk write_sample_clnt_main()
    257  1.1        pk {
    258  1.5     lukem 	list   *l;
    259  1.5     lukem 	definition *def;
    260  1.5     lukem 	version_list *vp;
    261  1.1        pk 
    262  1.5     lukem 	f_print(fout, "\n\n");
    263  1.5     lukem 	if (Cflag)
    264  1.6   mycroft 		f_print(fout, "int\nmain(int argc, char *argv[])\n{\n");
    265  1.5     lukem 	else
    266  1.6   mycroft 		f_print(fout, "int\nmain(argc, argv)\n\tint argc;\n\tchar *argv[];\n{\n");
    267  1.5     lukem 
    268  1.5     lukem 	f_print(fout, "\tchar *host;");
    269  1.6   mycroft 	f_print(fout, "\n\n\tif (argc < 2) {");
    270  1.5     lukem 	f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
    271  1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}");
    272  1.5     lukem 	f_print(fout, "\n\thost = argv[1];\n");
    273  1.5     lukem 
    274  1.5     lukem 	for (l = defined; l != NULL; l = l->next) {
    275  1.1        pk 		def = l->val;
    276  1.1        pk 		if (def->def_kind != DEF_PROGRAM) {
    277  1.1        pk 			continue;
    278  1.1        pk 		}
    279  1.1        pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    280  1.5     lukem 			f_print(fout, "\t");
    281  1.1        pk 			pvname(def->def_name, vp->vers_num);
    282  1.6   mycroft 			f_print(fout, "(host);\n");
    283  1.1        pk 		}
    284  1.5     lukem 	}
    285  1.6   mycroft 	f_print(fout, "\texit(0);\n");
    286  1.5     lukem 	f_print(fout, "}\n");
    287  1.1        pk }
    288