Home | History | Annotate | Line # | Download | only in rpcgen
rpc_sample.c revision 1.9.4.2
      1  1.9.4.1      tron /*	$NetBSD: rpc_sample.c,v 1.9.4.2 2004/07/10 12:34:59 tron 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.9.4.1      tron #if HAVE_NBTOOL_CONFIG_H
     33  1.9.4.1      tron #include "nbtool_config.h"
     34  1.9.4.1      tron #endif
     35  1.9.4.1      tron 
     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.9.4.1      tron __RCSID("$NetBSD: rpc_sample.c,v 1.9.4.2 2004/07/10 12:34:59 tron 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.9.4.2      tron 			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