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